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
107 template <
typename T>
108 class persistent_ptr;
117 namespace experimental
143 template <
typename T>
145 conditional_add_to_tx(
const T *that, std::size_t count = 1, uint64_t flags = 0)
150 if (pmemobj_tx_stage() != TX_STAGE_WORK)
154 if (!pmemobj_pool_by_ptr(that))
157 if (pmemobj_tx_xadd_range_direct(that,
sizeof(*that) * count, flags)) {
160 "Could not add object(s) to the transaction.")
161 .with_pmemobj_errormsg();
164 "Could not add object(s) to the transaction.")
165 .with_pmemobj_errormsg();
172 template <
typename T>
176 return typeid(T).hash_code();
217 _BitScanReverse64(&j, x);
218 return static_cast<int>(j);
220 #elif __GNUC__ || __clang__
225 return 8 * int(
sizeof(x)) - __builtin_clzll(x) - 1;
238 static const int table[64] = {
239 0, 58, 1, 59, 47, 53, 2, 60, 39, 48, 27, 54, 33, 42, 3, 61,
240 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, 14, 22, 4, 62,
241 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21, 56,
242 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5, 63};
244 return table[(x * 0x03f6eaf2cd271461) >> 58];