16#include <system_error>
19#if defined(__has_feature)
20#if __has_feature(thread_sanitizer)
21#include <sanitizer/tsan_interface.h>
22#define tsan_acquire(addr) __tsan_acquire(addr)
23#define tsan_release(addr) __tsan_release(addr)
25#define tsan_acquire(addr) static_cast<void>(0)
26#define tsan_release(addr) static_cast<void>(0)
29#define tsan_acquire(addr) static_cast<void>(0)
30#define tsan_release(addr) static_cast<void>(0)
35class [[nodiscard]] Defer {
37 template <
typename Func>
38 Defer(Func &&func) : func_(std::forward<Func>(func)) {}
41 Defer(
const Defer &) =
delete;
42 Defer &operator=(
const Defer &) =
delete;
43 Defer(Defer &&) =
delete;
44 Defer &operator=(Defer &&) =
delete;
47 std::function<void()> func_;
56template <
typename Func> Defer
defer(Func &&func) {
57 return Defer(std::forward<Func>(func));
60template <
typename BaseMutex>
class MaybeMutex :
public BaseMutex {
62 using Base = BaseMutex;
65 void lock() noexcept {
71 void unlock() noexcept {
77 bool try_lock() noexcept {
79 return Base::try_lock();
84 void set_use_mutex(
bool use_mutex)
noexcept { use_mutex_ = use_mutex; }
87 bool use_mutex_ =
false;
90[[noreturn]]
inline void panic_on(
const char *msg)
noexcept {
91 std::cerr <<
"Panic: " << msg <<
'\n';
96 std::exit(EXIT_FAILURE);
100template <
typename T>
class RawStorage {
102 template <
typename... Args>
void construct(Args &&...args) {
103 new (&storage_) T(std::forward<Args>(args)...);
106 T &get() {
return *
reinterpret_cast<T *
>(&storage_); }
108 const T &get()
const {
return *
reinterpret_cast<const T *
>(&storage_); }
110 void destroy() { get().~T(); }
113 alignas(T)
unsigned char storage_[
sizeof(T)];
116template <
typename T,
size_t N>
class SmallArray {
118 SmallArray(
size_t capacity) : capacity_(capacity) {
120 large_ =
new T[capacity];
130 T &operator[](
size_t index) {
131 return is_small_() ? small_[index] : large_[index];
134 const T &operator[](
size_t index)
const {
135 return is_small_() ? small_[index] : large_[index];
138 size_t capacity()
const {
return capacity_; }
141 bool is_small_()
const {
return capacity_ <= N; }
151inline auto make_system_error(
const char *msg,
int ec) {
152 return std::system_error(ec, std::generic_category(), msg);
155template <
typename M,
typename T>
constexpr ptrdiff_t offset_of(M T::*member) {
156 constexpr T *dummy =
nullptr;
157 return reinterpret_cast<ptrdiff_t
>(&(dummy->*member));
160template <
typename M,
typename T> T *container_of(M T::*member, M *ptr) {
161 auto offset = offset_of(member);
163 return reinterpret_cast<T *
>(
reinterpret_cast<intptr_t
>(ptr) - offset);
The main namespace for the Condy library.
Definition condy.hpp:28
Defer defer(Func &&func)
Defer the execution of a function until the current scope ends.
Definition utils.hpp:56