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

Commit df53b56

Browse files
Merge pull request #918 from igchor/radix_tree_assing_val_fix
Radix tree assing val fix
2 parents 26da8fa + d58afc4 commit df53b56

File tree

5 files changed

+55
-21
lines changed

5 files changed

+55
-21
lines changed

include/libpmemobj++/detail/template_helpers.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ using is_transparent = typename Compare::is_transparent;
4747
template <typename Compare>
4848
using has_is_transparent = detail::supports<Compare, is_transparent>;
4949

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+
5060
/* Check if type is pmem::obj::basic_string or
5161
* pmem::obj::basic_inline_string */
5262
template <typename>

include/libpmemobj++/experimental/radix_tree.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -598,12 +598,14 @@ struct radix_tree<Key, Value, BytesView>::radix_tree_iterator {
598598

599599
template <typename V = Value,
600600
typename Enable = typename std::enable_if<
601-
std::is_same<V, inline_string>::value>::type>
602-
void assign_val(string_view rhs);
601+
detail::is_inline_string<V>::value>::type>
602+
void assign_val(basic_string_view<typename V::value_type,
603+
typename V::traits_type>
604+
rhs);
603605

604606
template <typename T, typename V = Value,
605607
typename Enable = typename std::enable_if<
606-
!std::is_same<V, inline_string>::value>::type>
608+
!detail::is_inline_string<V>::value>::type>
607609
void assign_val(T &&rhs);
608610

609611
radix_tree_iterator &operator++();
@@ -2777,7 +2779,7 @@ template <bool IsConst>
27772779
template <typename V, typename Enable>
27782780
void
27792781
radix_tree<Key, Value, BytesView>::radix_tree_iterator<IsConst>::assign_val(
2780-
string_view rhs)
2782+
basic_string_view<typename V::value_type, typename V::traits_type> rhs)
27812783
{
27822784
auto pop = pool_base(pmemobj_pool_by_ptr(leaf_));
27832785

tests/radix/radix.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ using container_int_string =
2525
nvobjex::radix_tree<unsigned, nvobjex::inline_string>;
2626

2727
using container_inline_s_wchart = nvobjex::radix_tree<nvobjex::basic_inline_string<wchar_t>, nvobj::p<unsigned>>;
28-
using container_inline_s_u8t = nvobjex::radix_tree<nvobjex::basic_inline_string<uint8_t>, nvobj::p<unsigned>>;
28+
using container_inline_s_wchart_wchart = nvobjex::radix_tree<nvobjex::basic_inline_string<wchar_t>, nvobjex::basic_inline_string<wchar_t>>;
29+
using container_inline_s_u8t = nvobjex::radix_tree<nvobjex::basic_inline_string<uint8_t>, nvobjex::basic_inline_string<uint8_t>>;
2930

3031
struct root {
3132
nvobj::persistent_ptr<container_int> radix_int;
@@ -35,6 +36,7 @@ struct root {
3536
nvobj::persistent_ptr<container_int_string> radix_int_str;
3637

3738
nvobj::persistent_ptr<container_inline_s_wchart> radix_inline_s_wchart;
39+
nvobj::persistent_ptr<container_inline_s_wchart_wchart> radix_inline_s_wchart_wchart;
3840
nvobj::persistent_ptr<container_inline_s_u8t> radix_inline_s_u8t;
3941
};
4042

@@ -60,7 +62,7 @@ value(unsigned v, int repeats = 1)
6062
auto s = std::basic_string<CharT>{};
6163
for (int i = 0; i < repeats; i++) {
6264
auto str = std::to_string(v);
63-
s += std::basic_string<CharT>(s.begin(), s.end());
65+
s += std::basic_string<CharT>(str.begin(), str.end());
6466
}
6567

6668
return s;
@@ -100,7 +102,7 @@ template <typename CharT, typename Traits>
100102
bool
101103
operator==(pmem::obj::experimental::basic_inline_string<CharT, Traits> &lhs, const std::basic_string<CharT, Traits> &rhs)
102104
{
103-
return pmem::obj::basic_string_view<CharT, Traits>(lhs.data()).compare(rhs) == 0;
105+
return pmem::obj::basic_string_view<CharT, Traits>(lhs.data(), lhs.size()).compare(rhs) == 0;
104106
}
105107

106108
template <typename Container, typename K, typename F>

tests/radix/radix_basic.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -809,31 +809,35 @@ test_inline_string_u8t_key(nvobj::pool<root> &pop)
809809

810810
for (unsigned i = 0; i < 10; i++) {
811811
auto key = std::basic_string<uint8_t>(i + 10, 99);
812-
auto ret = m.try_emplace(key, i);
812+
auto ret = m.try_emplace(
813+
key, std::basic_string<uint8_t>({uint8_t(i)}));
813814
UT_ASSERT(ret.second);
814815
UT_ASSERT(key.compare(ret.first->key().data()) == 0);
815-
UT_ASSERT(ret.first->value() == i);
816+
UT_ASSERT(ret.first->value() ==
817+
std::basic_string<uint8_t>({uint8_t(i)}));
816818
UT_ASSERT(m.size() == i + 1);
817819
}
818820

819821
for (unsigned i = 0; i < 10; i++) {
820822
auto key = std::basic_string<uint8_t>(i + 10, 99);
821-
auto ret = m.insert_or_assign(key, i + 1);
823+
auto ret = m.insert_or_assign(
824+
key, std::basic_string<uint8_t>({uint8_t(i + 1)}));
822825
UT_ASSERT(!ret.second);
823826
UT_ASSERT(key.compare(ret.first->key().data()) == 0);
824-
UT_ASSERT(ret.first->value() == i + 1);
827+
UT_ASSERT(ret.first->value() ==
828+
std::basic_string<uint8_t>({uint8_t(i + 1)}));
825829
UT_ASSERT(m.size() == 10);
826830
}
827831

828832
auto key = std::basic_string<uint8_t>(15, 99);
829833
auto it = m.find(key);
830834
UT_ASSERT(key.compare(it->key().data()) == 0);
831-
UT_ASSERT(it->value() == 6);
835+
UT_ASSERT(it->value() == std::basic_string<uint8_t>({uint8_t(6)}));
832836

833837
it = m.erase(it);
834838
UT_ASSERT(std::basic_string<uint8_t>(16, 99).compare(
835839
it->key().data()) == 0);
836-
UT_ASSERT(it->value() == 7);
840+
UT_ASSERT(it->value() == std::basic_string<uint8_t>({uint8_t(7)}));
837841

838842
nvobj::transaction::run(pop, [&] {
839843
nvobj::delete_persistent<container_inline_s_u8t>(

tests/radix/radix_tx_abort.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,8 @@ test_assign(nvobj::pool<root> &pop, nvobj::persistent_ptr<Container> &ptr)
247247

248248
/* Iterators and references for inline_string are not
249249
* stable. */
250-
if (std::is_same<typename Container::mapped_type,
251-
nvobjex::inline_string>::value) {
250+
if (pmem::detail::is_inline_string<
251+
typename Container::mapped_type>::value) {
252252
it = ptr->find(key<Container>(test_key));
253253
}
254254

@@ -303,8 +303,8 @@ test_assign_internal_leaf(nvobj::pool<root> &pop,
303303

304304
/* Iterators and references for inline_string are not
305305
* stable. */
306-
if (std::is_same<typename Container::mapped_type,
307-
nvobjex::inline_string>::value) {
306+
if (pmem::detail::is_inline_string<
307+
typename Container::mapped_type>::value) {
308308
it = ptr->find("");
309309
}
310310

@@ -322,8 +322,8 @@ test_assign_internal_leaf(nvobj::pool<root> &pop,
322322

323323
/* Iterators and references for inline_string are not
324324
* stable. */
325-
if (std::is_same<typename Container::mapped_type,
326-
nvobjex::inline_string>::value) {
325+
if (pmem::detail::is_inline_string<
326+
typename Container::mapped_type>::value) {
327327
it = ptr->find("aaa");
328328
}
329329

@@ -366,8 +366,8 @@ test_assign_root(nvobj::pool<root> &pop, nvobj::persistent_ptr<Container> &ptr)
366366

367367
/* Iterators and references for inline_string are not
368368
* stable. */
369-
if (std::is_same<typename Container::mapped_type,
370-
nvobjex::inline_string>::value) {
369+
if (pmem::detail::is_inline_string<
370+
typename Container::mapped_type>::value) {
371371
it = ptr->find(key<Container>(0));
372372
}
373373

@@ -562,6 +562,22 @@ test(int argc, char *argv[])
562562
test_try_emplace<container_inline_s_wchart, 1>(
563563
pop, pop.root()->radix_inline_s_wchart);
564564

565+
test_emplace(pop, pop.root()->radix_inline_s_wchart_wchart);
566+
test_assign<container_inline_s_wchart_wchart, 1>(
567+
pop, pop.root()->radix_inline_s_wchart_wchart);
568+
test_assign<container_inline_s_wchart_wchart, 1024>(
569+
pop, pop.root()->radix_inline_s_wchart_wchart);
570+
test_assign_root<container_inline_s_wchart_wchart, 1>(
571+
pop, pop.root()->radix_inline_s_wchart_wchart);
572+
test_assign_root<container_inline_s_wchart_wchart, 1024>(
573+
pop, pop.root()->radix_inline_s_wchart_wchart);
574+
test_erase<container_inline_s_wchart_wchart, 1024>(
575+
pop, pop.root()->radix_inline_s_wchart_wchart);
576+
test_insert_or_assign<container_inline_s_wchart_wchart, 1>(
577+
pop, pop.root()->radix_inline_s_wchart_wchart);
578+
test_try_emplace<container_inline_s_wchart_wchart, 1>(
579+
pop, pop.root()->radix_inline_s_wchart_wchart);
580+
565581
pop.close();
566582
}
567583

0 commit comments

Comments
 (0)