diff options
Diffstat (limited to 'include/libHX/defs.h')
-rw-r--r-- | include/libHX/defs.h | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/include/libHX/defs.h b/include/libHX/defs.h index ba84b37..2ef5769 100644 --- a/include/libHX/defs.h +++ b/include/libHX/defs.h @@ -12,7 +12,16 @@ # ifndef containerof # include <cstddef> # include <type_traits> -# define containerof(var, T, member) reinterpret_cast<std::conditional<std::is_const<std::remove_pointer<decltype(var)>::type>::value, std::add_const<T>::type, T>::type *>(reinterpret_cast<std::conditional<std::is_const<std::remove_pointer<decltype(var)>::type>::value, const char, char>::type *>(var) - offsetof(T, member)) +namespace { +template<typename Dst, typename Src> static inline auto containerof_cxx(Src *var, size_t ofs) +{ + using K = typename std::is_const<typename std::remove_pointer<Src>::type>; + using Ch = typename std::conditional<K::value, const char, char>::type; + using D2 = typename std::conditional<K::value, const Dst, Dst>::type; + return reinterpret_cast<D2 *>(reinterpret_cast<Ch *>(var) + ofs); +} +} +# define containerof(var, D1, member) containerof_cxx<D1>(var, -offsetof(D1, member)) # endif #else # define HXsizeof_member(type, member) sizeof(((type *)NULL)->member) @@ -86,6 +95,7 @@ #define HXSIZEOF_Z32 sizeof("-4294967296") /* 2^64 and -2^63 have same length */ #define HXSIZEOF_Z64 sizeof("18446744073709551616") +#define HXSIZEOF_UNITSEC64 sizeof("584542046089y11months2weeks2d23h59min59s") #define __HX_STRINGIFY_EXPAND(s) #s #define HX_STRINGIFY(s) __HX_STRINGIFY_EXPAND(s) |