Skip to content
This repository was archived by the owner on Mar 22, 2023. It is now read-only.

Commit fea239f

Browse files
Merge pull request #960 from igchor/merge_stable_1.11_into_master
Merge stable 1.11 into master
2 parents b2a520c + d69b888 commit fea239f

File tree

4 files changed

+161
-118
lines changed

4 files changed

+161
-118
lines changed

include/libpmemobj++/detail/template_helpers.hpp

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@
1111

1212
#include <type_traits>
1313

14-
#include <libpmemobj++/container/basic_string.hpp>
15-
#include <libpmemobj++/experimental/inline_string.hpp>
16-
1714
namespace pmem
1815
{
1916

@@ -47,31 +44,6 @@ using is_transparent = typename Compare::is_transparent;
4744
template <typename Compare>
4845
using has_is_transparent = detail::supports<Compare, is_transparent>;
4946

50-
/* Check if type is pmem::obj::basic_inline_string */
51-
template <typename>
52-
struct is_inline_string : std::false_type {
53-
};
54-
55-
template <typename CharT, typename Traits>
56-
struct is_inline_string<obj::experimental::basic_inline_string<CharT, Traits>>
57-
: std::true_type {
58-
};
59-
60-
/* Check if type is pmem::obj::basic_string or
61-
* pmem::obj::basic_inline_string */
62-
template <typename>
63-
struct is_string : std::false_type {
64-
};
65-
66-
template <typename CharT, typename Traits>
67-
struct is_string<obj::basic_string<CharT, Traits>> : std::true_type {
68-
};
69-
70-
template <typename CharT, typename Traits>
71-
struct is_string<obj::experimental::basic_inline_string<CharT, Traits>>
72-
: std::true_type {
73-
};
74-
7547
} /* namespace detail */
7648

7749
} /* namespace pmem */

include/libpmemobj++/experimental/inline_string.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,20 @@ struct total_sizeof<basic_inline_string<CharT, Traits>> {
433433
};
434434
} /* namespace experimental */
435435
} /* namespace obj */
436+
437+
namespace detail
438+
{
439+
/* Check if type is pmem::obj::basic_inline_string */
440+
template <typename>
441+
struct is_inline_string : std::false_type {
442+
};
443+
444+
template <typename CharT, typename Traits>
445+
struct is_inline_string<obj::experimental::basic_inline_string<CharT, Traits>>
446+
: std::true_type {
447+
};
448+
} /* namespace detail */
449+
436450
} /* namespace pmem */
437451

438452
#endif /* LIBPMEMOBJ_CPP_INLINE_STRING_HPP */

include/libpmemobj++/experimental/radix_tree.hpp

Lines changed: 114 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -415,46 +415,46 @@ struct radix_tree<Key, Value, BytesView>::leaf {
415415
const Key &key() const;
416416
const Value &value() const;
417417

418-
private:
419-
friend class radix_tree<Key, Value, BytesView>;
420-
421-
leaf() = default;
422-
423-
template <typename... Args>
424-
static persistent_ptr<leaf> make(tagged_node_ptr parent,
425-
Args &&... args);
426-
427-
static persistent_ptr<leaf> make_internal();
418+
static persistent_ptr<leaf> make(tagged_node_ptr parent);
428419

429420
template <typename... Args1, typename... Args2>
430421
static persistent_ptr<leaf>
431-
make_internal(std::piecewise_construct_t pc,
432-
std::tuple<Args1...> first_args,
433-
std::tuple<Args2...> second_args);
434-
435-
template <typename K, typename V>
436-
static persistent_ptr<leaf> make_internal(K &&k, V &&v);
422+
make(tagged_node_ptr parent, std::piecewise_construct_t pc,
423+
std::tuple<Args1...> first_args, std::tuple<Args2...> second_args);
437424
template <typename K, typename V>
438-
static persistent_ptr<leaf> make_internal(const K &k, const V &v);
439-
425+
static persistent_ptr<leaf> make(tagged_node_ptr parent, K &&k, V &&v);
426+
static persistent_ptr<leaf> make(tagged_node_ptr parent, const Key &k,
427+
const Value &v);
428+
template <typename K, typename... Args>
429+
static persistent_ptr<leaf> make_key_args(tagged_node_ptr parent, K &&k,
430+
Args &&... args);
440431
template <typename K, typename V>
441-
static persistent_ptr<leaf> make_internal(detail::pair<K, V> &&p);
432+
static persistent_ptr<leaf> make(tagged_node_ptr parent,
433+
detail::pair<K, V> &&p);
442434
template <typename K, typename V>
443-
static persistent_ptr<leaf> make_internal(const detail::pair<K, V> &p);
444-
435+
static persistent_ptr<leaf> make(tagged_node_ptr parent,
436+
const detail::pair<K, V> &p);
445437
template <typename K, typename V>
446-
static persistent_ptr<leaf> make_internal(std::pair<K, V> &&p);
438+
static persistent_ptr<leaf> make(tagged_node_ptr parent,
439+
std::pair<K, V> &&p);
447440
template <typename K, typename V>
448-
static persistent_ptr<leaf> make_internal(const std::pair<K, V> &p);
441+
static persistent_ptr<leaf> make(tagged_node_ptr parent,
442+
const std::pair<K, V> &p);
443+
static persistent_ptr<leaf> make(tagged_node_ptr parent,
444+
const leaf &other);
445+
446+
private:
447+
friend class radix_tree<Key, Value, BytesView>;
448+
449+
leaf() = default;
449450

450451
template <typename... Args1, typename... Args2, size_t... I1,
451452
size_t... I2>
452-
static persistent_ptr<leaf> make_internal(
453-
std::piecewise_construct_t, std::tuple<Args1...> &first_args,
454-
std::tuple<Args2...> &second_args,
455-
detail::index_sequence<I1...>, detail::index_sequence<I2...>);
456-
457-
static persistent_ptr<leaf> make_internal(const leaf &other);
453+
static persistent_ptr<leaf>
454+
make(tagged_node_ptr parent, std::piecewise_construct_t,
455+
std::tuple<Args1...> &first_args,
456+
std::tuple<Args2...> &second_args, detail::index_sequence<I1...>,
457+
detail::index_sequence<I2...>);
458458

459459
tagged_node_ptr parent = nullptr;
460460
};
@@ -1298,7 +1298,8 @@ radix_tree<Key, Value, BytesView>::try_emplace(const key_type &k,
12981298
{
12991299
return internal_emplace(k, [&](tagged_node_ptr parent) {
13001300
size_++;
1301-
return leaf::make(parent, k, std::forward<Args>(args)...);
1301+
return leaf::make_key_args(parent, k,
1302+
std::forward<Args>(args)...);
13021303
});
13031304
}
13041305

@@ -1493,8 +1494,8 @@ radix_tree<Key, Value, BytesView>::try_emplace(key_type &&k, Args &&... args)
14931494
{
14941495
return internal_emplace(k, [&](tagged_node_ptr parent) {
14951496
size_++;
1496-
return leaf::make(parent, std::move(k),
1497-
std::forward<Args>(args)...);
1497+
return leaf::make_key_args(parent, std::move(k),
1498+
std::forward<Args>(args)...);
14981499
});
14991500
}
15001501

@@ -1542,8 +1543,8 @@ radix_tree<Key, Value, BytesView>::try_emplace(K &&k, Args &&... args) ->
15421543
{
15431544
return internal_emplace(k, [&](tagged_node_ptr parent) {
15441545
size_++;
1545-
return leaf::make(parent, std::forward<K>(k),
1546-
std::forward<Args>(args)...);
1546+
return leaf::make_key_args(parent, std::forward<K>(k),
1547+
std::forward<Args>(args)...);
15471548
});
15481549
}
15491550

@@ -2805,8 +2806,8 @@ radix_tree<Key, Value, BytesView>::radix_tree_iterator<IsConst>::assign_val(
28052806
auto old_leaf = leaf_;
28062807

28072808
transaction::run(pop, [&] {
2808-
*slot = leaf::make(old_leaf->parent, old_leaf->key(),
2809-
rhs);
2809+
*slot = leaf::make_key_args(old_leaf->parent,
2810+
old_leaf->key(), rhs);
28102811
delete_persistent<typename radix_tree::leaf>(old_leaf);
28112812
});
28122813

@@ -2979,18 +2980,6 @@ radix_tree<Key, Value, BytesView>::find_leaf(
29792980
std::abort();
29802981
}
29812982

2982-
template <typename Key, typename Value, typename BytesView>
2983-
template <typename... Args>
2984-
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
2985-
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent,
2986-
Args &&... args)
2987-
{
2988-
auto ptr = make_internal(std::forward<Args>(args)...);
2989-
ptr->parent = parent;
2990-
2991-
return ptr;
2992-
}
2993-
29942983
template <typename Key, typename Value, typename BytesView>
29952984
Key &
29962985
radix_tree<Key, Value, BytesView>::leaf::key()
@@ -3036,94 +3025,111 @@ radix_tree<Key, Value, BytesView>::leaf::~leaf()
30363025

30373026
template <typename Key, typename Value, typename BytesView>
30383027
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3039-
radix_tree<Key, Value, BytesView>::leaf::make_internal()
3028+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent)
30403029
{
30413030
auto t = std::make_tuple();
3042-
return make_internal(std::piecewise_construct, t, t,
3043-
typename detail::make_index_sequence<>::type{},
3044-
typename detail::make_index_sequence<>::type{});
3031+
return make(parent, std::piecewise_construct, t, t,
3032+
typename detail::make_index_sequence<>::type{},
3033+
typename detail::make_index_sequence<>::type{});
30453034
}
30463035

30473036
template <typename Key, typename Value, typename BytesView>
30483037
template <typename... Args1, typename... Args2>
30493038
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3050-
radix_tree<Key, Value, BytesView>::leaf::make_internal(
3051-
std::piecewise_construct_t pc, std::tuple<Args1...> first_args,
3052-
std::tuple<Args2...> second_args)
3039+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent,
3040+
std::piecewise_construct_t pc,
3041+
std::tuple<Args1...> first_args,
3042+
std::tuple<Args2...> second_args)
30533043
{
3054-
return make_internal(
3055-
pc, first_args, second_args,
3056-
typename detail::make_index_sequence<Args1...>::type{},
3057-
typename detail::make_index_sequence<Args2...>::type{});
3044+
return make(parent, pc, first_args, second_args,
3045+
typename detail::make_index_sequence<Args1...>::type{},
3046+
typename detail::make_index_sequence<Args2...>::type{});
30583047
}
30593048

30603049
template <typename Key, typename Value, typename BytesView>
3061-
template <typename K, typename V>
30623050
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3063-
radix_tree<Key, Value, BytesView>::leaf::make_internal(K &&k, V &&v)
3051+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent,
3052+
const Key &k, const Value &v)
30643053
{
3065-
return make_internal(std::piecewise_construct,
3066-
std::forward_as_tuple(std::forward<K>(k)),
3067-
std::forward_as_tuple(std::forward<V>(v)));
3054+
return make(parent, std::piecewise_construct, std::forward_as_tuple(k),
3055+
std::forward_as_tuple(v));
30683056
}
30693057

30703058
template <typename Key, typename Value, typename BytesView>
30713059
template <typename K, typename V>
30723060
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3073-
radix_tree<Key, Value, BytesView>::leaf::make_internal(const K &k, const V &v)
3061+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent, K &&k,
3062+
V &&v)
30743063
{
3075-
return make_internal(std::piecewise_construct, std::forward_as_tuple(k),
3076-
std::forward_as_tuple(v));
3064+
return make(parent, std::piecewise_construct,
3065+
std::forward_as_tuple(std::forward<K>(k)),
3066+
std::forward_as_tuple(std::forward<V>(v)));
3067+
}
3068+
3069+
template <typename Key, typename Value, typename BytesView>
3070+
template <typename K, typename... Args>
3071+
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3072+
radix_tree<Key, Value, BytesView>::leaf::make_key_args(tagged_node_ptr parent,
3073+
K &&k, Args &&... args)
3074+
{
3075+
return make(parent, std::piecewise_construct,
3076+
std::forward_as_tuple(std::forward<K>(k)),
3077+
std::forward_as_tuple(std::forward<Args>(args)...));
30773078
}
30783079

30793080
template <typename Key, typename Value, typename BytesView>
30803081
template <typename K, typename V>
30813082
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3082-
radix_tree<Key, Value, BytesView>::leaf::make_internal(detail::pair<K, V> &&p)
3083+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent,
3084+
detail::pair<K, V> &&p)
30833085
{
3084-
return make_internal(std::piecewise_construct,
3085-
std::forward_as_tuple(std::move(p.first)),
3086-
std::forward_as_tuple(std::move(p.second)));
3086+
return make(parent, std::piecewise_construct,
3087+
std::forward_as_tuple(std::move(p.first)),
3088+
std::forward_as_tuple(std::move(p.second)));
30873089
}
30883090

30893091
template <typename Key, typename Value, typename BytesView>
30903092
template <typename K, typename V>
30913093
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3092-
radix_tree<Key, Value, BytesView>::leaf::make_internal(
3093-
const detail::pair<K, V> &p)
3094+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent,
3095+
const detail::pair<K, V> &p)
30943096
{
3095-
return make_internal(std::piecewise_construct,
3096-
std::forward_as_tuple(p.first),
3097-
std::forward_as_tuple(p.second));
3097+
return make(parent, std::piecewise_construct,
3098+
std::forward_as_tuple(p.first),
3099+
std::forward_as_tuple(p.second));
30983100
}
30993101

31003102
template <typename Key, typename Value, typename BytesView>
31013103
template <typename K, typename V>
31023104
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3103-
radix_tree<Key, Value, BytesView>::leaf::make_internal(std::pair<K, V> &&p)
3105+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent,
3106+
std::pair<K, V> &&p)
31043107
{
3105-
return make_internal(std::piecewise_construct,
3106-
std::forward_as_tuple(std::move(p.first)),
3107-
std::forward_as_tuple(std::move(p.second)));
3108+
return make(parent, std::piecewise_construct,
3109+
std::forward_as_tuple(std::move(p.first)),
3110+
std::forward_as_tuple(std::move(p.second)));
31083111
}
31093112

31103113
template <typename Key, typename Value, typename BytesView>
31113114
template <typename K, typename V>
31123115
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3113-
radix_tree<Key, Value, BytesView>::leaf::make_internal(const std::pair<K, V> &p)
3116+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent,
3117+
const std::pair<K, V> &p)
31143118
{
3115-
return make_internal(std::piecewise_construct,
3116-
std::forward_as_tuple(p.first),
3117-
std::forward_as_tuple(p.second));
3119+
return make(parent, std::piecewise_construct,
3120+
std::forward_as_tuple(p.first),
3121+
std::forward_as_tuple(p.second));
31183122
}
31193123

31203124
template <typename Key, typename Value, typename BytesView>
31213125
template <typename... Args1, typename... Args2, size_t... I1, size_t... I2>
31223126
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3123-
radix_tree<Key, Value, BytesView>::leaf::make_internal(
3124-
std::piecewise_construct_t, std::tuple<Args1...> &first_args,
3125-
std::tuple<Args2...> &second_args, detail::index_sequence<I1...>,
3126-
detail::index_sequence<I2...>)
3127+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent,
3128+
std::piecewise_construct_t,
3129+
std::tuple<Args1...> &first_args,
3130+
std::tuple<Args2...> &second_args,
3131+
detail::index_sequence<I1...>,
3132+
detail::index_sequence<I2...>)
31273133
{
31283134
standard_alloc_policy<void> a;
31293135
auto key_size = total_sizeof<Key>::value(std::get<I1>(first_args)...);
@@ -3140,14 +3146,17 @@ radix_tree<Key, Value, BytesView>::leaf::make_internal(
31403146
new (key_dst) Key(std::forward<Args1>(std::get<I1>(first_args))...);
31413147
new (val_dst) Value(std::forward<Args2>(std::get<I2>(second_args))...);
31423148

3149+
ptr->parent = parent;
3150+
31433151
return ptr;
31443152
}
31453153

31463154
template <typename Key, typename Value, typename BytesView>
31473155
persistent_ptr<typename radix_tree<Key, Value, BytesView>::leaf>
3148-
radix_tree<Key, Value, BytesView>::leaf::make_internal(const leaf &other)
3156+
radix_tree<Key, Value, BytesView>::leaf::make(tagged_node_ptr parent,
3157+
const leaf &other)
31493158
{
3150-
return make_internal(other.key(), other.value());
3159+
return make(parent, other.key(), other.value());
31513160
}
31523161

31533162
/**
@@ -3196,6 +3205,21 @@ swap(radix_tree<Key, Value, BytesView> &lhs,
31963205

31973206
namespace detail
31983207
{
3208+
/* Check if type is pmem::obj::basic_string or
3209+
* pmem::obj::basic_inline_string */
3210+
template <typename>
3211+
struct is_string : std::false_type {
3212+
};
3213+
3214+
template <typename CharT, typename Traits>
3215+
struct is_string<obj::basic_string<CharT, Traits>> : std::true_type {
3216+
};
3217+
3218+
template <typename CharT, typename Traits>
3219+
struct is_string<obj::experimental::basic_inline_string<CharT, Traits>>
3220+
: std::true_type {
3221+
};
3222+
31993223
template <typename T>
32003224
struct bytes_view<T, typename std::enable_if<is_string<T>::value>::type> {
32013225
using CharT = typename T::value_type;

0 commit comments

Comments
 (0)