diff options
author | Evan Brown <ezb@google.com> | 2022-10-17 12:56:53 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2022-10-17 12:58:14 -0700 |
commit | bbf2ed7890615a587f0209c6d7e9b2c08781ee09 (patch) | |
tree | 3ae3ec73b24f430ff747dd3af7f0c0a5717f4d6d /absl/container/btree_test.cc | |
parent | 7ab917ec21efb6cdb3c3946fbecb9522ff2af100 (diff) | |
download | abseil-bbf2ed7890615a587f0209c6d7e9b2c08781ee09.tar.gz abseil-bbf2ed7890615a587f0209c6d7e9b2c08781ee09.tar.bz2 abseil-bbf2ed7890615a587f0209c6d7e9b2c08781ee09.zip |
Implement btree_iterator::operator-, which is faster than std::distance for btree iterators.
Note: btree_iterator::operator- is still O(N) because in the worst case (end()-begin()), we will have at least one operation per node in the tree, and there are at least N/M nodes, where M (a constant) is the maximum number of values per node.
PiperOrigin-RevId: 481716874
Change-Id: Ic0225b7509208ed96b75a2dc626d2aa4a24f4946
Diffstat (limited to 'absl/container/btree_test.cc')
-rw-r--r-- | absl/container/btree_test.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/absl/container/btree_test.cc b/absl/container/btree_test.cc index 9386a6b1..6a5351fe 100644 --- a/absl/container/btree_test.cc +++ b/absl/container/btree_test.cc @@ -31,6 +31,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/algorithm/container.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/macros.h" #include "absl/container/btree_map.h" @@ -40,6 +41,7 @@ #include "absl/flags/flag.h" #include "absl/hash/hash_testing.h" #include "absl/memory/memory.h" +#include "absl/random/random.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_split.h" #include "absl/strings/string_view.h" @@ -3320,6 +3322,24 @@ TEST(Btree, ReusePoisonMemory) { set.insert(0); } +TEST(Btree, IteratorSubtraction) { + absl::BitGen bitgen; + std::vector<int> vec; + // Randomize the set's insertion order so the nodes aren't all full. + for (int i = 0; i < 1000000; ++i) vec.push_back(i); + absl::c_shuffle(vec, bitgen); + + absl::btree_set<int> set; + for (int i : vec) set.insert(i); + + for (int i = 0; i < 1000; ++i) { + size_t begin = absl::Uniform(bitgen, 0u, set.size()); + size_t end = absl::Uniform(bitgen, begin, set.size()); + ASSERT_EQ(end - begin, set.find(end) - set.find(begin)) + << begin << " " << end; + } +} + } // namespace } // namespace container_internal ABSL_NAMESPACE_END |