@@ -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-
29942983template <typename Key, typename Value, typename BytesView>
29952984Key &
29962985radix_tree<Key, Value, BytesView>::leaf::key()
@@ -3036,94 +3025,111 @@ radix_tree<Key, Value, BytesView>::leaf::~leaf()
30363025
30373026template <typename Key, typename Value, typename BytesView>
30383027persistent_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
30473036template <typename Key, typename Value, typename BytesView>
30483037template <typename ... Args1, typename ... Args2>
30493038persistent_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
30603049template <typename Key, typename Value, typename BytesView>
3061- template <typename K, typename V>
30623050persistent_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
30703058template <typename Key, typename Value, typename BytesView>
30713059template <typename K, typename V>
30723060persistent_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
30793080template <typename Key, typename Value, typename BytesView>
30803081template <typename K, typename V>
30813082persistent_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
30893091template <typename Key, typename Value, typename BytesView>
30903092template <typename K, typename V>
30913093persistent_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
31003102template <typename Key, typename Value, typename BytesView>
31013103template <typename K, typename V>
31023104persistent_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
31103113template <typename Key, typename Value, typename BytesView>
31113114template <typename K, typename V>
31123115persistent_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
31203124template <typename Key, typename Value, typename BytesView>
31213125template <typename ... Args1, typename ... Args2, size_t ... I1, size_t ... I2>
31223126persistent_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
31463154template <typename Key, typename Value, typename BytesView>
31473155persistent_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
31973206namespace 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+
31993223template <typename T>
32003224struct bytes_view <T, typename std::enable_if<is_string<T>::value>::type> {
32013225 using CharT = typename T::value_type;
0 commit comments