9 #ifndef LIBPMEMOBJ_CPP_COMMON_HPP
10 #define LIBPMEMOBJ_CPP_COMMON_HPP
13 #include <libpmemobj/tx_base.h>
22 #if defined(__GNUC__) || defined(__clang__)
23 #define POBJ_CPP_DEPRECATED __attribute__((deprecated))
24 #elif defined(_MSC_VER)
25 #define POBJ_CPP_DEPRECATED __declspec(deprecated)
27 #define POBJ_CPP_DEPRECATED
30 #if LIBPMEMOBJ_CPP_VG_ENABLED
31 #undef LIBPMEMOBJ_CPP_VG_PMEMCHECK_ENABLED
32 #undef LIBPMEMOBJ_CPP_VG_MEMCHECK_ENABLED
33 #undef LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED
34 #undef LIBPMEMOBJ_CPP_VG_DRD_ENABLED
36 #define LIBPMEMOBJ_CPP_VG_PMEMCHECK_ENABLED 1
37 #define LIBPMEMOBJ_CPP_VG_MEMCHECK_ENABLED 1
38 #define LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED 1
39 #define LIBPMEMOBJ_CPP_VG_DRD_ENABLED 1
42 #if LIBPMEMOBJ_CPP_VG_PMEMCHECK_ENABLED || \
43 LIBPMEMOBJ_CPP_VG_MEMCHECK_ENABLED || \
44 LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED || LIBPMEMOBJ_CPP_VG_DRD_ENABLED
45 #define LIBPMEMOBJ_CPP_ANY_VG_TOOL_ENABLED 1
48 #if LIBPMEMOBJ_CPP_ANY_VG_TOOL_ENABLED
52 #if LIBPMEMOBJ_CPP_VG_PMEMCHECK_ENABLED
53 #include <pmemcheck.h>
56 #if LIBPMEMOBJ_CPP_VG_MEMCHECK_ENABLED
60 #if LIBPMEMOBJ_CPP_VG_HELGRIND_ENABLED
64 #if LIBPMEMOBJ_CPP_VG_DRD_ENABLED
75 #if !defined(LIBPMEMOBJ_CPP_USE_HAS_TRIVIAL_COPY)
76 #if !defined(__clang__) && defined(__GNUG__) && __GNUC__ < 5
77 #define LIBPMEMOBJ_CPP_USE_HAS_TRIVIAL_COPY 1
79 #define LIBPMEMOBJ_CPP_USE_HAS_TRIVIAL_COPY 0
83 #if LIBPMEMOBJ_CPP_USE_HAS_TRIVIAL_COPY
84 #define LIBPMEMOBJ_CPP_IS_TRIVIALLY_COPYABLE(T) __has_trivial_copy(T)
86 #define LIBPMEMOBJ_CPP_IS_TRIVIALLY_COPYABLE(T) \
87 std::is_trivially_copyable<T>::value
106 template <
typename T>
107 class persistent_ptr;
116 namespace experimental
142 template <
typename T>
144 conditional_add_to_tx(
const T *that, std::size_t count = 1, uint64_t flags = 0)
149 if (pmemobj_tx_stage() != TX_STAGE_WORK)
153 if (!pmemobj_pool_by_ptr(that))
156 if (pmemobj_tx_xadd_range_direct(that,
sizeof(*that) * count, flags)) {
159 "Could not add object(s) to the transaction.")
160 .with_pmemobj_errormsg();
163 "Could not add object(s) to the transaction.")
164 .with_pmemobj_errormsg();
171 template <
typename T>
175 return typeid(T).hash_code();
216 _BitScanReverse64(&j, x);
217 return static_cast<int>(j);
219 #elif __GNUC__ || __clang__
224 return 8 * int(
sizeof(x)) - __builtin_clzll(x) - 1;
237 static const int table[64] = {
238 0, 58, 1, 59, 47, 53, 2, 60, 39, 48, 27, 54, 33, 42, 3, 61,
239 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, 14, 22, 4, 62,
240 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21, 56,
241 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5, 63};
243 return table[(x * 0x03f6eaf2cd271461) >> 58];
250 static inline uint8_t
251 mssb_index64(
unsigned long long value)
253 return ((uint8_t)(63 - __builtin_clzll(value)));
257 static inline uint8_t
258 mssb_index(
unsigned int value)
260 return ((uint8_t)(31 - __builtin_clz(value)));
265 static __inline uint8_t
266 mssb_index(
unsigned long value)
269 _BitScanReverse(&ret, value);
273 static __inline uint8_t
274 mssb_index64(uint64_t value)
277 _BitScanReverse64(&ret, value);