summaryrefslogtreecommitdiff
path: root/include/libHX/defs.h
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2025-03-16 12:48:45 +0100
committerJörg Frings-Fürst <debian@jff-webhosting.net>2025-03-16 12:48:45 +0100
commitcec79a3f5578da4a9f9085282389482edf45c81b (patch)
tree5c45f5efee77f9f8d84c3a1c7e02b12b6725a2e3 /include/libHX/defs.h
parent677e5b0b948fe62d8017c198c57049275f6fe61a (diff)
New upstream version 4.26upstream/4.26upstream
Diffstat (limited to 'include/libHX/defs.h')
-rw-r--r--include/libHX/defs.h12
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)