32 #include <type_traits> 36 #define alignmentof(type) (std::alignment_of<type>()) 57 assert((align & -align) == align);
60 assert(((align - 1) & u.i) == 0);
159 operator T const*()
const {
183 T const*
get()
const {
215 if (_ptr && _ptr != ptr) {
249 template<
class T,
class Impl>
297 _obj = Impl::null_value();
306 assign(Impl::null_value());
315 if (Impl::different(_obj, obj)) {
317 Impl::guard_action(_obj);
323 template<
typename T,
typename Impl>
334 operator T*()
const {
379 if (ptr && fclose(ptr)) {
381 "fclose failed in guard destructor");
394 if (fd >= 0 && close(fd))
void test_alignment(void const *ptr, int align)
Definition: guard.h:46
T * release()
Notifies this guard that its services are no longer needed because some other entity has assumed owne...
Definition: guard.h:195
pointer_guard_base_t(T *ptr)
Definition: guard.h:327
T const * operator->() const
Definition: guard.h:175
T & operator*()
Definition: guard.h:163
guard(T *ptr=nullptr)
Definition: guard.h:117
void assign(T *ptr)
Definition: guard.h:214
static void guard_action(T *ptr)
Definition: guard.h:366
T * aligned_cast(void const *ptr)
Definition: guard.h:64
void assign(T obj) const
Definition: guard.h:314
void done()
Notifies this guard that its action should be performed now rather than at destruct time...
Definition: guard.h:205
void action(T *ptr)
Definition: guard.h:101
~guard()
Definition: guard.h:209
guard & operator=(guard &other)
Definition: guard.h:145
static int null_value()
Definition: guard.h:398
A generic pointer guard base class. An action will be performed exactly once on the stored pointer...
Definition: guard.h:250
static T null_value()
Definition: guard.h:260
guard_base_t< T, Impl > Base
Definition: guard.h:255
static void guard_action(FILE *ptr)
Definition: guard.h:378
static void guard_action(T *ptr)
Definition: guard.h:352
Ensures that a file descriptor gets closed.
Definition: guard.h:389
file_guard_t(FILE *ptr=nullptr)
Definition: guard.h:375
guard & operator=(const guard &)
Ensures that an array allocated with a call to operator new() gets deleted.
Definition: guard.h:362
fd_guard_t(int fd)
Definition: guard.h:390
#define alignmentof(type)
Definition: guard.h:36
void done() const
Notifies this guard that its action should be performed now rather than at destruct time...
Definition: guard.h:305
T * _ptr
Definition: guard.h:96
Ensures that a file gets closed.
Definition: guard.h:374
guard_base_t & operator=(const guard_base_t &other)
Definition: guard.h:274
guard_base_t(T obj)
Definition: guard.h:268
guard_base_t< T *, Impl > Base
Definition: guard.h:325
T * operator->()
Definition: guard.h:171
pointer_guard_t(T *ptr=nullptr)
Definition: guard.h:349
static bool different(const T &a, const T &b)
Definition: guard.h:264
#define TRACE
Other modules in our program use this macro for reporting. We can use preprocessor macros like FILE a...
Definition: trace.h:91
static void guard_action(int fd)
Definition: guard.h:393
T * operator->() const
Definition: guard.h:338
array_guard_t(T *ptr=nullptr)
Definition: guard.h:363
T release() const
Notifies this guard that its services are no longer needed because some other entity has assumed owne...
Definition: guard.h:295
T const & operator*() const
Definition: guard.h:167
guard(guard &other)
Definition: guard.h:120
~guard_base_t()
Definition: guard.h:309
#define TRACE_ALWAYS
Definition: trace_types.h:41
T & operator*() const
Definition: guard.h:330
guard & operator=(T *ptr)
Definition: guard.h:150
A generic RAII guard class.
Definition: guard.h:94
guard_base_t(const guard_base_t &other)
Definition: guard.h:271
#define T
Definition: w_okvl_inl.h:45
Ensures that a pointer allocated with a call to operator new() gets deleted.
Definition: guard.h:348
T _obj
Definition: guard.h:252