btree_test.cc 94 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954
  1. // Copyright 2018 The Abseil Authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // https://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "absl/container/btree_test.h"
  15. #include <cstdint>
  16. #include <limits>
  17. #include <map>
  18. #include <memory>
  19. #include <stdexcept>
  20. #include <string>
  21. #include <type_traits>
  22. #include <utility>
  23. #include "gmock/gmock.h"
  24. #include "gtest/gtest.h"
  25. #include "absl/base/internal/raw_logging.h"
  26. #include "absl/base/macros.h"
  27. #include "absl/container/btree_map.h"
  28. #include "absl/container/btree_set.h"
  29. #include "absl/container/internal/counting_allocator.h"
  30. #include "absl/container/internal/test_instance_tracker.h"
  31. #include "absl/flags/flag.h"
  32. #include "absl/hash/hash_testing.h"
  33. #include "absl/memory/memory.h"
  34. #include "absl/meta/type_traits.h"
  35. #include "absl/strings/str_cat.h"
  36. #include "absl/strings/str_split.h"
  37. #include "absl/strings/string_view.h"
  38. #include "absl/types/compare.h"
  39. ABSL_FLAG(int, test_values, 10000, "The number of values to use for tests");
  40. namespace absl {
  41. ABSL_NAMESPACE_BEGIN
  42. namespace container_internal {
  43. namespace {
  44. using ::absl::test_internal::CopyableMovableInstance;
  45. using ::absl::test_internal::InstanceTracker;
  46. using ::absl::test_internal::MovableOnlyInstance;
  47. using ::testing::ElementsAre;
  48. using ::testing::ElementsAreArray;
  49. using ::testing::IsEmpty;
  50. using ::testing::IsNull;
  51. using ::testing::Pair;
  52. using ::testing::SizeIs;
  53. template <typename T, typename U>
  54. void CheckPairEquals(const T &x, const U &y) {
  55. ABSL_INTERNAL_CHECK(x == y, "Values are unequal.");
  56. }
  57. template <typename T, typename U, typename V, typename W>
  58. void CheckPairEquals(const std::pair<T, U> &x, const std::pair<V, W> &y) {
  59. CheckPairEquals(x.first, y.first);
  60. CheckPairEquals(x.second, y.second);
  61. }
  62. } // namespace
  63. // The base class for a sorted associative container checker. TreeType is the
  64. // container type to check and CheckerType is the container type to check
  65. // against. TreeType is expected to be btree_{set,map,multiset,multimap} and
  66. // CheckerType is expected to be {set,map,multiset,multimap}.
  67. template <typename TreeType, typename CheckerType>
  68. class base_checker {
  69. public:
  70. using key_type = typename TreeType::key_type;
  71. using value_type = typename TreeType::value_type;
  72. using key_compare = typename TreeType::key_compare;
  73. using pointer = typename TreeType::pointer;
  74. using const_pointer = typename TreeType::const_pointer;
  75. using reference = typename TreeType::reference;
  76. using const_reference = typename TreeType::const_reference;
  77. using size_type = typename TreeType::size_type;
  78. using difference_type = typename TreeType::difference_type;
  79. using iterator = typename TreeType::iterator;
  80. using const_iterator = typename TreeType::const_iterator;
  81. using reverse_iterator = typename TreeType::reverse_iterator;
  82. using const_reverse_iterator = typename TreeType::const_reverse_iterator;
  83. public:
  84. base_checker() : const_tree_(tree_) {}
  85. base_checker(const base_checker &other)
  86. : tree_(other.tree_), const_tree_(tree_), checker_(other.checker_) {}
  87. template <typename InputIterator>
  88. base_checker(InputIterator b, InputIterator e)
  89. : tree_(b, e), const_tree_(tree_), checker_(b, e) {}
  90. iterator begin() { return tree_.begin(); }
  91. const_iterator begin() const { return tree_.begin(); }
  92. iterator end() { return tree_.end(); }
  93. const_iterator end() const { return tree_.end(); }
  94. reverse_iterator rbegin() { return tree_.rbegin(); }
  95. const_reverse_iterator rbegin() const { return tree_.rbegin(); }
  96. reverse_iterator rend() { return tree_.rend(); }
  97. const_reverse_iterator rend() const { return tree_.rend(); }
  98. template <typename IterType, typename CheckerIterType>
  99. IterType iter_check(IterType tree_iter, CheckerIterType checker_iter) const {
  100. if (tree_iter == tree_.end()) {
  101. ABSL_INTERNAL_CHECK(checker_iter == checker_.end(),
  102. "Checker iterator not at end.");
  103. } else {
  104. CheckPairEquals(*tree_iter, *checker_iter);
  105. }
  106. return tree_iter;
  107. }
  108. template <typename IterType, typename CheckerIterType>
  109. IterType riter_check(IterType tree_iter, CheckerIterType checker_iter) const {
  110. if (tree_iter == tree_.rend()) {
  111. ABSL_INTERNAL_CHECK(checker_iter == checker_.rend(),
  112. "Checker iterator not at rend.");
  113. } else {
  114. CheckPairEquals(*tree_iter, *checker_iter);
  115. }
  116. return tree_iter;
  117. }
  118. void value_check(const value_type &v) {
  119. typename KeyOfValue<typename TreeType::key_type,
  120. typename TreeType::value_type>::type key_of_value;
  121. const key_type &key = key_of_value(v);
  122. CheckPairEquals(*find(key), v);
  123. lower_bound(key);
  124. upper_bound(key);
  125. equal_range(key);
  126. contains(key);
  127. count(key);
  128. }
  129. void erase_check(const key_type &key) {
  130. EXPECT_FALSE(tree_.contains(key));
  131. EXPECT_EQ(tree_.find(key), const_tree_.end());
  132. EXPECT_FALSE(const_tree_.contains(key));
  133. EXPECT_EQ(const_tree_.find(key), tree_.end());
  134. EXPECT_EQ(tree_.equal_range(key).first,
  135. const_tree_.equal_range(key).second);
  136. }
  137. iterator lower_bound(const key_type &key) {
  138. return iter_check(tree_.lower_bound(key), checker_.lower_bound(key));
  139. }
  140. const_iterator lower_bound(const key_type &key) const {
  141. return iter_check(tree_.lower_bound(key), checker_.lower_bound(key));
  142. }
  143. iterator upper_bound(const key_type &key) {
  144. return iter_check(tree_.upper_bound(key), checker_.upper_bound(key));
  145. }
  146. const_iterator upper_bound(const key_type &key) const {
  147. return iter_check(tree_.upper_bound(key), checker_.upper_bound(key));
  148. }
  149. std::pair<iterator, iterator> equal_range(const key_type &key) {
  150. std::pair<typename CheckerType::iterator, typename CheckerType::iterator>
  151. checker_res = checker_.equal_range(key);
  152. std::pair<iterator, iterator> tree_res = tree_.equal_range(key);
  153. iter_check(tree_res.first, checker_res.first);
  154. iter_check(tree_res.second, checker_res.second);
  155. return tree_res;
  156. }
  157. std::pair<const_iterator, const_iterator> equal_range(
  158. const key_type &key) const {
  159. std::pair<typename CheckerType::const_iterator,
  160. typename CheckerType::const_iterator>
  161. checker_res = checker_.equal_range(key);
  162. std::pair<const_iterator, const_iterator> tree_res = tree_.equal_range(key);
  163. iter_check(tree_res.first, checker_res.first);
  164. iter_check(tree_res.second, checker_res.second);
  165. return tree_res;
  166. }
  167. iterator find(const key_type &key) {
  168. return iter_check(tree_.find(key), checker_.find(key));
  169. }
  170. const_iterator find(const key_type &key) const {
  171. return iter_check(tree_.find(key), checker_.find(key));
  172. }
  173. bool contains(const key_type &key) const { return find(key) != end(); }
  174. size_type count(const key_type &key) const {
  175. size_type res = checker_.count(key);
  176. EXPECT_EQ(res, tree_.count(key));
  177. return res;
  178. }
  179. base_checker &operator=(const base_checker &other) {
  180. tree_ = other.tree_;
  181. checker_ = other.checker_;
  182. return *this;
  183. }
  184. int erase(const key_type &key) {
  185. int size = tree_.size();
  186. int res = checker_.erase(key);
  187. EXPECT_EQ(res, tree_.count(key));
  188. EXPECT_EQ(res, tree_.erase(key));
  189. EXPECT_EQ(tree_.count(key), 0);
  190. EXPECT_EQ(tree_.size(), size - res);
  191. erase_check(key);
  192. return res;
  193. }
  194. iterator erase(iterator iter) {
  195. key_type key = iter.key();
  196. int size = tree_.size();
  197. int count = tree_.count(key);
  198. auto checker_iter = checker_.lower_bound(key);
  199. for (iterator tmp(tree_.lower_bound(key)); tmp != iter; ++tmp) {
  200. ++checker_iter;
  201. }
  202. auto checker_next = checker_iter;
  203. ++checker_next;
  204. checker_.erase(checker_iter);
  205. iter = tree_.erase(iter);
  206. EXPECT_EQ(tree_.size(), checker_.size());
  207. EXPECT_EQ(tree_.size(), size - 1);
  208. EXPECT_EQ(tree_.count(key), count - 1);
  209. if (count == 1) {
  210. erase_check(key);
  211. }
  212. return iter_check(iter, checker_next);
  213. }
  214. void erase(iterator begin, iterator end) {
  215. int size = tree_.size();
  216. int count = std::distance(begin, end);
  217. auto checker_begin = checker_.lower_bound(begin.key());
  218. for (iterator tmp(tree_.lower_bound(begin.key())); tmp != begin; ++tmp) {
  219. ++checker_begin;
  220. }
  221. auto checker_end =
  222. end == tree_.end() ? checker_.end() : checker_.lower_bound(end.key());
  223. if (end != tree_.end()) {
  224. for (iterator tmp(tree_.lower_bound(end.key())); tmp != end; ++tmp) {
  225. ++checker_end;
  226. }
  227. }
  228. const auto checker_ret = checker_.erase(checker_begin, checker_end);
  229. const auto tree_ret = tree_.erase(begin, end);
  230. EXPECT_EQ(std::distance(checker_.begin(), checker_ret),
  231. std::distance(tree_.begin(), tree_ret));
  232. EXPECT_EQ(tree_.size(), checker_.size());
  233. EXPECT_EQ(tree_.size(), size - count);
  234. }
  235. void clear() {
  236. tree_.clear();
  237. checker_.clear();
  238. }
  239. void swap(base_checker &other) {
  240. tree_.swap(other.tree_);
  241. checker_.swap(other.checker_);
  242. }
  243. void verify() const {
  244. tree_.verify();
  245. EXPECT_EQ(tree_.size(), checker_.size());
  246. // Move through the forward iterators using increment.
  247. auto checker_iter = checker_.begin();
  248. const_iterator tree_iter(tree_.begin());
  249. for (; tree_iter != tree_.end(); ++tree_iter, ++checker_iter) {
  250. CheckPairEquals(*tree_iter, *checker_iter);
  251. }
  252. // Move through the forward iterators using decrement.
  253. for (int n = tree_.size() - 1; n >= 0; --n) {
  254. iter_check(tree_iter, checker_iter);
  255. --tree_iter;
  256. --checker_iter;
  257. }
  258. EXPECT_EQ(tree_iter, tree_.begin());
  259. EXPECT_EQ(checker_iter, checker_.begin());
  260. // Move through the reverse iterators using increment.
  261. auto checker_riter = checker_.rbegin();
  262. const_reverse_iterator tree_riter(tree_.rbegin());
  263. for (; tree_riter != tree_.rend(); ++tree_riter, ++checker_riter) {
  264. CheckPairEquals(*tree_riter, *checker_riter);
  265. }
  266. // Move through the reverse iterators using decrement.
  267. for (int n = tree_.size() - 1; n >= 0; --n) {
  268. riter_check(tree_riter, checker_riter);
  269. --tree_riter;
  270. --checker_riter;
  271. }
  272. EXPECT_EQ(tree_riter, tree_.rbegin());
  273. EXPECT_EQ(checker_riter, checker_.rbegin());
  274. }
  275. const TreeType &tree() const { return tree_; }
  276. size_type size() const {
  277. EXPECT_EQ(tree_.size(), checker_.size());
  278. return tree_.size();
  279. }
  280. size_type max_size() const { return tree_.max_size(); }
  281. bool empty() const {
  282. EXPECT_EQ(tree_.empty(), checker_.empty());
  283. return tree_.empty();
  284. }
  285. protected:
  286. TreeType tree_;
  287. const TreeType &const_tree_;
  288. CheckerType checker_;
  289. };
  290. namespace {
  291. // A checker for unique sorted associative containers. TreeType is expected to
  292. // be btree_{set,map} and CheckerType is expected to be {set,map}.
  293. template <typename TreeType, typename CheckerType>
  294. class unique_checker : public base_checker<TreeType, CheckerType> {
  295. using super_type = base_checker<TreeType, CheckerType>;
  296. public:
  297. using iterator = typename super_type::iterator;
  298. using value_type = typename super_type::value_type;
  299. public:
  300. unique_checker() : super_type() {}
  301. unique_checker(const unique_checker &other) : super_type(other) {}
  302. template <class InputIterator>
  303. unique_checker(InputIterator b, InputIterator e) : super_type(b, e) {}
  304. unique_checker &operator=(const unique_checker &) = default;
  305. // Insertion routines.
  306. std::pair<iterator, bool> insert(const value_type &v) {
  307. int size = this->tree_.size();
  308. std::pair<typename CheckerType::iterator, bool> checker_res =
  309. this->checker_.insert(v);
  310. std::pair<iterator, bool> tree_res = this->tree_.insert(v);
  311. CheckPairEquals(*tree_res.first, *checker_res.first);
  312. EXPECT_EQ(tree_res.second, checker_res.second);
  313. EXPECT_EQ(this->tree_.size(), this->checker_.size());
  314. EXPECT_EQ(this->tree_.size(), size + tree_res.second);
  315. return tree_res;
  316. }
  317. iterator insert(iterator position, const value_type &v) {
  318. int size = this->tree_.size();
  319. std::pair<typename CheckerType::iterator, bool> checker_res =
  320. this->checker_.insert(v);
  321. iterator tree_res = this->tree_.insert(position, v);
  322. CheckPairEquals(*tree_res, *checker_res.first);
  323. EXPECT_EQ(this->tree_.size(), this->checker_.size());
  324. EXPECT_EQ(this->tree_.size(), size + checker_res.second);
  325. return tree_res;
  326. }
  327. template <typename InputIterator>
  328. void insert(InputIterator b, InputIterator e) {
  329. for (; b != e; ++b) {
  330. insert(*b);
  331. }
  332. }
  333. };
  334. // A checker for multiple sorted associative containers. TreeType is expected
  335. // to be btree_{multiset,multimap} and CheckerType is expected to be
  336. // {multiset,multimap}.
  337. template <typename TreeType, typename CheckerType>
  338. class multi_checker : public base_checker<TreeType, CheckerType> {
  339. using super_type = base_checker<TreeType, CheckerType>;
  340. public:
  341. using iterator = typename super_type::iterator;
  342. using value_type = typename super_type::value_type;
  343. public:
  344. multi_checker() : super_type() {}
  345. multi_checker(const multi_checker &other) : super_type(other) {}
  346. template <class InputIterator>
  347. multi_checker(InputIterator b, InputIterator e) : super_type(b, e) {}
  348. multi_checker &operator=(const multi_checker &) = default;
  349. // Insertion routines.
  350. iterator insert(const value_type &v) {
  351. int size = this->tree_.size();
  352. auto checker_res = this->checker_.insert(v);
  353. iterator tree_res = this->tree_.insert(v);
  354. CheckPairEquals(*tree_res, *checker_res);
  355. EXPECT_EQ(this->tree_.size(), this->checker_.size());
  356. EXPECT_EQ(this->tree_.size(), size + 1);
  357. return tree_res;
  358. }
  359. iterator insert(iterator position, const value_type &v) {
  360. int size = this->tree_.size();
  361. auto checker_res = this->checker_.insert(v);
  362. iterator tree_res = this->tree_.insert(position, v);
  363. CheckPairEquals(*tree_res, *checker_res);
  364. EXPECT_EQ(this->tree_.size(), this->checker_.size());
  365. EXPECT_EQ(this->tree_.size(), size + 1);
  366. return tree_res;
  367. }
  368. template <typename InputIterator>
  369. void insert(InputIterator b, InputIterator e) {
  370. for (; b != e; ++b) {
  371. insert(*b);
  372. }
  373. }
  374. };
  375. template <typename T, typename V>
  376. void DoTest(const char *name, T *b, const std::vector<V> &values) {
  377. typename KeyOfValue<typename T::key_type, V>::type key_of_value;
  378. T &mutable_b = *b;
  379. const T &const_b = *b;
  380. // Test insert.
  381. for (int i = 0; i < values.size(); ++i) {
  382. mutable_b.insert(values[i]);
  383. mutable_b.value_check(values[i]);
  384. }
  385. ASSERT_EQ(mutable_b.size(), values.size());
  386. const_b.verify();
  387. // Test copy constructor.
  388. T b_copy(const_b);
  389. EXPECT_EQ(b_copy.size(), const_b.size());
  390. for (int i = 0; i < values.size(); ++i) {
  391. CheckPairEquals(*b_copy.find(key_of_value(values[i])), values[i]);
  392. }
  393. // Test range constructor.
  394. T b_range(const_b.begin(), const_b.end());
  395. EXPECT_EQ(b_range.size(), const_b.size());
  396. for (int i = 0; i < values.size(); ++i) {
  397. CheckPairEquals(*b_range.find(key_of_value(values[i])), values[i]);
  398. }
  399. // Test range insertion for values that already exist.
  400. b_range.insert(b_copy.begin(), b_copy.end());
  401. b_range.verify();
  402. // Test range insertion for new values.
  403. b_range.clear();
  404. b_range.insert(b_copy.begin(), b_copy.end());
  405. EXPECT_EQ(b_range.size(), b_copy.size());
  406. for (int i = 0; i < values.size(); ++i) {
  407. CheckPairEquals(*b_range.find(key_of_value(values[i])), values[i]);
  408. }
  409. // Test assignment to self. Nothing should change.
  410. b_range.operator=(b_range);
  411. EXPECT_EQ(b_range.size(), b_copy.size());
  412. // Test assignment of new values.
  413. b_range.clear();
  414. b_range = b_copy;
  415. EXPECT_EQ(b_range.size(), b_copy.size());
  416. // Test swap.
  417. b_range.clear();
  418. b_range.swap(b_copy);
  419. EXPECT_EQ(b_copy.size(), 0);
  420. EXPECT_EQ(b_range.size(), const_b.size());
  421. for (int i = 0; i < values.size(); ++i) {
  422. CheckPairEquals(*b_range.find(key_of_value(values[i])), values[i]);
  423. }
  424. b_range.swap(b_copy);
  425. // Test non-member function swap.
  426. swap(b_range, b_copy);
  427. EXPECT_EQ(b_copy.size(), 0);
  428. EXPECT_EQ(b_range.size(), const_b.size());
  429. for (int i = 0; i < values.size(); ++i) {
  430. CheckPairEquals(*b_range.find(key_of_value(values[i])), values[i]);
  431. }
  432. swap(b_range, b_copy);
  433. // Test erase via values.
  434. for (int i = 0; i < values.size(); ++i) {
  435. mutable_b.erase(key_of_value(values[i]));
  436. // Erasing a non-existent key should have no effect.
  437. ASSERT_EQ(mutable_b.erase(key_of_value(values[i])), 0);
  438. }
  439. const_b.verify();
  440. EXPECT_EQ(const_b.size(), 0);
  441. // Test erase via iterators.
  442. mutable_b = b_copy;
  443. for (int i = 0; i < values.size(); ++i) {
  444. mutable_b.erase(mutable_b.find(key_of_value(values[i])));
  445. }
  446. const_b.verify();
  447. EXPECT_EQ(const_b.size(), 0);
  448. // Test insert with hint.
  449. for (int i = 0; i < values.size(); i++) {
  450. mutable_b.insert(mutable_b.upper_bound(key_of_value(values[i])), values[i]);
  451. }
  452. const_b.verify();
  453. // Test range erase.
  454. mutable_b.erase(mutable_b.begin(), mutable_b.end());
  455. EXPECT_EQ(mutable_b.size(), 0);
  456. const_b.verify();
  457. // First half.
  458. mutable_b = b_copy;
  459. typename T::iterator mutable_iter_end = mutable_b.begin();
  460. for (int i = 0; i < values.size() / 2; ++i) ++mutable_iter_end;
  461. mutable_b.erase(mutable_b.begin(), mutable_iter_end);
  462. EXPECT_EQ(mutable_b.size(), values.size() - values.size() / 2);
  463. const_b.verify();
  464. // Second half.
  465. mutable_b = b_copy;
  466. typename T::iterator mutable_iter_begin = mutable_b.begin();
  467. for (int i = 0; i < values.size() / 2; ++i) ++mutable_iter_begin;
  468. mutable_b.erase(mutable_iter_begin, mutable_b.end());
  469. EXPECT_EQ(mutable_b.size(), values.size() / 2);
  470. const_b.verify();
  471. // Second quarter.
  472. mutable_b = b_copy;
  473. mutable_iter_begin = mutable_b.begin();
  474. for (int i = 0; i < values.size() / 4; ++i) ++mutable_iter_begin;
  475. mutable_iter_end = mutable_iter_begin;
  476. for (int i = 0; i < values.size() / 4; ++i) ++mutable_iter_end;
  477. mutable_b.erase(mutable_iter_begin, mutable_iter_end);
  478. EXPECT_EQ(mutable_b.size(), values.size() - values.size() / 4);
  479. const_b.verify();
  480. mutable_b.clear();
  481. }
  482. template <typename T>
  483. void ConstTest() {
  484. using value_type = typename T::value_type;
  485. typename KeyOfValue<typename T::key_type, value_type>::type key_of_value;
  486. T mutable_b;
  487. const T &const_b = mutable_b;
  488. // Insert a single value into the container and test looking it up.
  489. value_type value = Generator<value_type>(2)(2);
  490. mutable_b.insert(value);
  491. EXPECT_TRUE(mutable_b.contains(key_of_value(value)));
  492. EXPECT_NE(mutable_b.find(key_of_value(value)), const_b.end());
  493. EXPECT_TRUE(const_b.contains(key_of_value(value)));
  494. EXPECT_NE(const_b.find(key_of_value(value)), mutable_b.end());
  495. EXPECT_EQ(*const_b.lower_bound(key_of_value(value)), value);
  496. EXPECT_EQ(const_b.upper_bound(key_of_value(value)), const_b.end());
  497. EXPECT_EQ(*const_b.equal_range(key_of_value(value)).first, value);
  498. // We can only create a non-const iterator from a non-const container.
  499. typename T::iterator mutable_iter(mutable_b.begin());
  500. EXPECT_EQ(mutable_iter, const_b.begin());
  501. EXPECT_NE(mutable_iter, const_b.end());
  502. EXPECT_EQ(const_b.begin(), mutable_iter);
  503. EXPECT_NE(const_b.end(), mutable_iter);
  504. typename T::reverse_iterator mutable_riter(mutable_b.rbegin());
  505. EXPECT_EQ(mutable_riter, const_b.rbegin());
  506. EXPECT_NE(mutable_riter, const_b.rend());
  507. EXPECT_EQ(const_b.rbegin(), mutable_riter);
  508. EXPECT_NE(const_b.rend(), mutable_riter);
  509. // We can create a const iterator from a non-const iterator.
  510. typename T::const_iterator const_iter(mutable_iter);
  511. EXPECT_EQ(const_iter, mutable_b.begin());
  512. EXPECT_NE(const_iter, mutable_b.end());
  513. EXPECT_EQ(mutable_b.begin(), const_iter);
  514. EXPECT_NE(mutable_b.end(), const_iter);
  515. typename T::const_reverse_iterator const_riter(mutable_riter);
  516. EXPECT_EQ(const_riter, mutable_b.rbegin());
  517. EXPECT_NE(const_riter, mutable_b.rend());
  518. EXPECT_EQ(mutable_b.rbegin(), const_riter);
  519. EXPECT_NE(mutable_b.rend(), const_riter);
  520. // Make sure various methods can be invoked on a const container.
  521. const_b.verify();
  522. ASSERT_TRUE(!const_b.empty());
  523. EXPECT_EQ(const_b.size(), 1);
  524. EXPECT_GT(const_b.max_size(), 0);
  525. EXPECT_TRUE(const_b.contains(key_of_value(value)));
  526. EXPECT_EQ(const_b.count(key_of_value(value)), 1);
  527. }
  528. template <typename T, typename C>
  529. void BtreeTest() {
  530. ConstTest<T>();
  531. using V = typename remove_pair_const<typename T::value_type>::type;
  532. const std::vector<V> random_values = GenerateValuesWithSeed<V>(
  533. absl::GetFlag(FLAGS_test_values), 4 * absl::GetFlag(FLAGS_test_values),
  534. GTEST_FLAG_GET(random_seed));
  535. unique_checker<T, C> container;
  536. // Test key insertion/deletion in sorted order.
  537. std::vector<V> sorted_values(random_values);
  538. std::sort(sorted_values.begin(), sorted_values.end());
  539. DoTest("sorted: ", &container, sorted_values);
  540. // Test key insertion/deletion in reverse sorted order.
  541. std::reverse(sorted_values.begin(), sorted_values.end());
  542. DoTest("rsorted: ", &container, sorted_values);
  543. // Test key insertion/deletion in random order.
  544. DoTest("random: ", &container, random_values);
  545. }
  546. template <typename T, typename C>
  547. void BtreeMultiTest() {
  548. ConstTest<T>();
  549. using V = typename remove_pair_const<typename T::value_type>::type;
  550. const std::vector<V> random_values = GenerateValuesWithSeed<V>(
  551. absl::GetFlag(FLAGS_test_values), 4 * absl::GetFlag(FLAGS_test_values),
  552. GTEST_FLAG_GET(random_seed));
  553. multi_checker<T, C> container;
  554. // Test keys in sorted order.
  555. std::vector<V> sorted_values(random_values);
  556. std::sort(sorted_values.begin(), sorted_values.end());
  557. DoTest("sorted: ", &container, sorted_values);
  558. // Test keys in reverse sorted order.
  559. std::reverse(sorted_values.begin(), sorted_values.end());
  560. DoTest("rsorted: ", &container, sorted_values);
  561. // Test keys in random order.
  562. DoTest("random: ", &container, random_values);
  563. // Test keys in random order w/ duplicates.
  564. std::vector<V> duplicate_values(random_values);
  565. duplicate_values.insert(duplicate_values.end(), random_values.begin(),
  566. random_values.end());
  567. DoTest("duplicates:", &container, duplicate_values);
  568. // Test all identical keys.
  569. std::vector<V> identical_values(100);
  570. std::fill(identical_values.begin(), identical_values.end(),
  571. Generator<V>(2)(2));
  572. DoTest("identical: ", &container, identical_values);
  573. }
  574. template <typename T>
  575. struct PropagatingCountingAlloc : public CountingAllocator<T> {
  576. using propagate_on_container_copy_assignment = std::true_type;
  577. using propagate_on_container_move_assignment = std::true_type;
  578. using propagate_on_container_swap = std::true_type;
  579. using Base = CountingAllocator<T>;
  580. using Base::Base;
  581. template <typename U>
  582. explicit PropagatingCountingAlloc(const PropagatingCountingAlloc<U> &other)
  583. : Base(other.bytes_used_) {}
  584. template <typename U>
  585. struct rebind {
  586. using other = PropagatingCountingAlloc<U>;
  587. };
  588. };
  589. template <typename T>
  590. void BtreeAllocatorTest() {
  591. using value_type = typename T::value_type;
  592. int64_t bytes1 = 0, bytes2 = 0;
  593. PropagatingCountingAlloc<T> allocator1(&bytes1);
  594. PropagatingCountingAlloc<T> allocator2(&bytes2);
  595. Generator<value_type> generator(1000);
  596. // Test that we allocate properly aligned memory. If we don't, then Layout
  597. // will assert fail.
  598. auto unused1 = allocator1.allocate(1);
  599. auto unused2 = allocator2.allocate(1);
  600. // Test copy assignment
  601. {
  602. T b1(typename T::key_compare(), allocator1);
  603. T b2(typename T::key_compare(), allocator2);
  604. int64_t original_bytes1 = bytes1;
  605. b1.insert(generator(0));
  606. EXPECT_GT(bytes1, original_bytes1);
  607. // This should propagate the allocator.
  608. b1 = b2;
  609. EXPECT_EQ(b1.size(), 0);
  610. EXPECT_EQ(b2.size(), 0);
  611. EXPECT_EQ(bytes1, original_bytes1);
  612. for (int i = 1; i < 1000; i++) {
  613. b1.insert(generator(i));
  614. }
  615. // We should have allocated out of allocator2.
  616. EXPECT_GT(bytes2, bytes1);
  617. }
  618. // Test move assignment
  619. {
  620. T b1(typename T::key_compare(), allocator1);
  621. T b2(typename T::key_compare(), allocator2);
  622. int64_t original_bytes1 = bytes1;
  623. b1.insert(generator(0));
  624. EXPECT_GT(bytes1, original_bytes1);
  625. // This should propagate the allocator.
  626. b1 = std::move(b2);
  627. EXPECT_EQ(b1.size(), 0);
  628. EXPECT_EQ(bytes1, original_bytes1);
  629. for (int i = 1; i < 1000; i++) {
  630. b1.insert(generator(i));
  631. }
  632. // We should have allocated out of allocator2.
  633. EXPECT_GT(bytes2, bytes1);
  634. }
  635. // Test swap
  636. {
  637. T b1(typename T::key_compare(), allocator1);
  638. T b2(typename T::key_compare(), allocator2);
  639. int64_t original_bytes1 = bytes1;
  640. b1.insert(generator(0));
  641. EXPECT_GT(bytes1, original_bytes1);
  642. // This should swap the allocators.
  643. swap(b1, b2);
  644. EXPECT_EQ(b1.size(), 0);
  645. EXPECT_EQ(b2.size(), 1);
  646. EXPECT_GT(bytes1, original_bytes1);
  647. for (int i = 1; i < 1000; i++) {
  648. b1.insert(generator(i));
  649. }
  650. // We should have allocated out of allocator2.
  651. EXPECT_GT(bytes2, bytes1);
  652. }
  653. allocator1.deallocate(unused1, 1);
  654. allocator2.deallocate(unused2, 1);
  655. }
  656. template <typename T>
  657. void BtreeMapTest() {
  658. using value_type = typename T::value_type;
  659. using mapped_type = typename T::mapped_type;
  660. mapped_type m = Generator<mapped_type>(0)(0);
  661. (void)m;
  662. T b;
  663. // Verify we can insert using operator[].
  664. for (int i = 0; i < 1000; i++) {
  665. value_type v = Generator<value_type>(1000)(i);
  666. b[v.first] = v.second;
  667. }
  668. EXPECT_EQ(b.size(), 1000);
  669. // Test whether we can use the "->" operator on iterators and
  670. // reverse_iterators. This stresses the btree_map_params::pair_pointer
  671. // mechanism.
  672. EXPECT_EQ(b.begin()->first, Generator<value_type>(1000)(0).first);
  673. EXPECT_EQ(b.begin()->second, Generator<value_type>(1000)(0).second);
  674. EXPECT_EQ(b.rbegin()->first, Generator<value_type>(1000)(999).first);
  675. EXPECT_EQ(b.rbegin()->second, Generator<value_type>(1000)(999).second);
  676. }
  677. template <typename T>
  678. void BtreeMultiMapTest() {
  679. using mapped_type = typename T::mapped_type;
  680. mapped_type m = Generator<mapped_type>(0)(0);
  681. (void)m;
  682. }
  683. template <typename K, int N = 256>
  684. void SetTest() {
  685. EXPECT_EQ(
  686. sizeof(absl::btree_set<K>),
  687. 2 * sizeof(void *) + sizeof(typename absl::btree_set<K>::size_type));
  688. using BtreeSet = absl::btree_set<K>;
  689. using CountingBtreeSet =
  690. absl::btree_set<K, std::less<K>, PropagatingCountingAlloc<K>>;
  691. BtreeTest<BtreeSet, std::set<K>>();
  692. BtreeAllocatorTest<CountingBtreeSet>();
  693. }
  694. template <typename K, int N = 256>
  695. void MapTest() {
  696. EXPECT_EQ(
  697. sizeof(absl::btree_map<K, K>),
  698. 2 * sizeof(void *) + sizeof(typename absl::btree_map<K, K>::size_type));
  699. using BtreeMap = absl::btree_map<K, K>;
  700. using CountingBtreeMap =
  701. absl::btree_map<K, K, std::less<K>,
  702. PropagatingCountingAlloc<std::pair<const K, K>>>;
  703. BtreeTest<BtreeMap, std::map<K, K>>();
  704. BtreeAllocatorTest<CountingBtreeMap>();
  705. BtreeMapTest<BtreeMap>();
  706. }
  707. TEST(Btree, set_int32) { SetTest<int32_t>(); }
  708. TEST(Btree, set_int64) { SetTest<int64_t>(); }
  709. TEST(Btree, set_string) { SetTest<std::string>(); }
  710. TEST(Btree, set_cord) { SetTest<absl::Cord>(); }
  711. TEST(Btree, set_pair) { SetTest<std::pair<int, int>>(); }
  712. TEST(Btree, map_int32) { MapTest<int32_t>(); }
  713. TEST(Btree, map_int64) { MapTest<int64_t>(); }
  714. TEST(Btree, map_string) { MapTest<std::string>(); }
  715. TEST(Btree, map_cord) { MapTest<absl::Cord>(); }
  716. TEST(Btree, map_pair) { MapTest<std::pair<int, int>>(); }
  717. template <typename K, int N = 256>
  718. void MultiSetTest() {
  719. EXPECT_EQ(
  720. sizeof(absl::btree_multiset<K>),
  721. 2 * sizeof(void *) + sizeof(typename absl::btree_multiset<K>::size_type));
  722. using BtreeMSet = absl::btree_multiset<K>;
  723. using CountingBtreeMSet =
  724. absl::btree_multiset<K, std::less<K>, PropagatingCountingAlloc<K>>;
  725. BtreeMultiTest<BtreeMSet, std::multiset<K>>();
  726. BtreeAllocatorTest<CountingBtreeMSet>();
  727. }
  728. template <typename K, int N = 256>
  729. void MultiMapTest() {
  730. EXPECT_EQ(sizeof(absl::btree_multimap<K, K>),
  731. 2 * sizeof(void *) +
  732. sizeof(typename absl::btree_multimap<K, K>::size_type));
  733. using BtreeMMap = absl::btree_multimap<K, K>;
  734. using CountingBtreeMMap =
  735. absl::btree_multimap<K, K, std::less<K>,
  736. PropagatingCountingAlloc<std::pair<const K, K>>>;
  737. BtreeMultiTest<BtreeMMap, std::multimap<K, K>>();
  738. BtreeMultiMapTest<BtreeMMap>();
  739. BtreeAllocatorTest<CountingBtreeMMap>();
  740. }
  741. TEST(Btree, multiset_int32) { MultiSetTest<int32_t>(); }
  742. TEST(Btree, multiset_int64) { MultiSetTest<int64_t>(); }
  743. TEST(Btree, multiset_string) { MultiSetTest<std::string>(); }
  744. TEST(Btree, multiset_cord) { MultiSetTest<absl::Cord>(); }
  745. TEST(Btree, multiset_pair) { MultiSetTest<std::pair<int, int>>(); }
  746. TEST(Btree, multimap_int32) { MultiMapTest<int32_t>(); }
  747. TEST(Btree, multimap_int64) { MultiMapTest<int64_t>(); }
  748. TEST(Btree, multimap_string) { MultiMapTest<std::string>(); }
  749. TEST(Btree, multimap_cord) { MultiMapTest<absl::Cord>(); }
  750. TEST(Btree, multimap_pair) { MultiMapTest<std::pair<int, int>>(); }
  751. struct CompareIntToString {
  752. bool operator()(const std::string &a, const std::string &b) const {
  753. return a < b;
  754. }
  755. bool operator()(const std::string &a, int b) const {
  756. return a < absl::StrCat(b);
  757. }
  758. bool operator()(int a, const std::string &b) const {
  759. return absl::StrCat(a) < b;
  760. }
  761. using is_transparent = void;
  762. };
  763. struct NonTransparentCompare {
  764. template <typename T, typename U>
  765. bool operator()(const T &t, const U &u) const {
  766. // Treating all comparators as transparent can cause inefficiencies (see
  767. // N3657 C++ proposal). Test that for comparators without 'is_transparent'
  768. // alias (like this one), we do not attempt heterogeneous lookup.
  769. EXPECT_TRUE((std::is_same<T, U>()));
  770. return t < u;
  771. }
  772. };
  773. template <typename T>
  774. bool CanEraseWithEmptyBrace(T t, decltype(t.erase({})) *) {
  775. return true;
  776. }
  777. template <typename T>
  778. bool CanEraseWithEmptyBrace(T, ...) {
  779. return false;
  780. }
  781. template <typename T>
  782. void TestHeterogeneous(T table) {
  783. auto lb = table.lower_bound("3");
  784. EXPECT_EQ(lb, table.lower_bound(3));
  785. EXPECT_NE(lb, table.lower_bound(4));
  786. EXPECT_EQ(lb, table.lower_bound({"3"}));
  787. EXPECT_NE(lb, table.lower_bound({}));
  788. auto ub = table.upper_bound("3");
  789. EXPECT_EQ(ub, table.upper_bound(3));
  790. EXPECT_NE(ub, table.upper_bound(5));
  791. EXPECT_EQ(ub, table.upper_bound({"3"}));
  792. EXPECT_NE(ub, table.upper_bound({}));
  793. auto er = table.equal_range("3");
  794. EXPECT_EQ(er, table.equal_range(3));
  795. EXPECT_NE(er, table.equal_range(4));
  796. EXPECT_EQ(er, table.equal_range({"3"}));
  797. EXPECT_NE(er, table.equal_range({}));
  798. auto it = table.find("3");
  799. EXPECT_EQ(it, table.find(3));
  800. EXPECT_NE(it, table.find(4));
  801. EXPECT_EQ(it, table.find({"3"}));
  802. EXPECT_NE(it, table.find({}));
  803. EXPECT_TRUE(table.contains(3));
  804. EXPECT_FALSE(table.contains(4));
  805. EXPECT_TRUE(table.count({"3"}));
  806. EXPECT_FALSE(table.contains({}));
  807. EXPECT_EQ(1, table.count(3));
  808. EXPECT_EQ(0, table.count(4));
  809. EXPECT_EQ(1, table.count({"3"}));
  810. EXPECT_EQ(0, table.count({}));
  811. auto copy = table;
  812. copy.erase(3);
  813. EXPECT_EQ(table.size() - 1, copy.size());
  814. copy.erase(4);
  815. EXPECT_EQ(table.size() - 1, copy.size());
  816. copy.erase({"5"});
  817. EXPECT_EQ(table.size() - 2, copy.size());
  818. EXPECT_FALSE(CanEraseWithEmptyBrace(table, nullptr));
  819. // Also run it with const T&.
  820. if (std::is_class<T>()) TestHeterogeneous<const T &>(table);
  821. }
  822. TEST(Btree, HeterogeneousLookup) {
  823. TestHeterogeneous(btree_set<std::string, CompareIntToString>{"1", "3", "5"});
  824. TestHeterogeneous(btree_map<std::string, int, CompareIntToString>{
  825. {"1", 1}, {"3", 3}, {"5", 5}});
  826. TestHeterogeneous(
  827. btree_multiset<std::string, CompareIntToString>{"1", "3", "5"});
  828. TestHeterogeneous(btree_multimap<std::string, int, CompareIntToString>{
  829. {"1", 1}, {"3", 3}, {"5", 5}});
  830. // Only maps have .at()
  831. btree_map<std::string, int, CompareIntToString> map{
  832. {"", -1}, {"1", 1}, {"3", 3}, {"5", 5}};
  833. EXPECT_EQ(1, map.at(1));
  834. EXPECT_EQ(3, map.at({"3"}));
  835. EXPECT_EQ(-1, map.at({}));
  836. const auto &cmap = map;
  837. EXPECT_EQ(1, cmap.at(1));
  838. EXPECT_EQ(3, cmap.at({"3"}));
  839. EXPECT_EQ(-1, cmap.at({}));
  840. }
  841. TEST(Btree, NoHeterogeneousLookupWithoutAlias) {
  842. using StringSet = absl::btree_set<std::string, NonTransparentCompare>;
  843. StringSet s;
  844. ASSERT_TRUE(s.insert("hello").second);
  845. ASSERT_TRUE(s.insert("world").second);
  846. EXPECT_TRUE(s.end() == s.find("blah"));
  847. EXPECT_TRUE(s.begin() == s.lower_bound("hello"));
  848. EXPECT_EQ(1, s.count("world"));
  849. EXPECT_TRUE(s.contains("hello"));
  850. EXPECT_TRUE(s.contains("world"));
  851. EXPECT_FALSE(s.contains("blah"));
  852. using StringMultiSet =
  853. absl::btree_multiset<std::string, NonTransparentCompare>;
  854. StringMultiSet ms;
  855. ms.insert("hello");
  856. ms.insert("world");
  857. ms.insert("world");
  858. EXPECT_TRUE(ms.end() == ms.find("blah"));
  859. EXPECT_TRUE(ms.begin() == ms.lower_bound("hello"));
  860. EXPECT_EQ(2, ms.count("world"));
  861. EXPECT_TRUE(ms.contains("hello"));
  862. EXPECT_TRUE(ms.contains("world"));
  863. EXPECT_FALSE(ms.contains("blah"));
  864. }
  865. TEST(Btree, DefaultTransparent) {
  866. {
  867. // `int` does not have a default transparent comparator.
  868. // The input value is converted to key_type.
  869. btree_set<int> s = {1};
  870. double d = 1.1;
  871. EXPECT_EQ(s.begin(), s.find(d));
  872. EXPECT_TRUE(s.contains(d));
  873. }
  874. {
  875. // `std::string` has heterogeneous support.
  876. btree_set<std::string> s = {"A"};
  877. EXPECT_EQ(s.begin(), s.find(absl::string_view("A")));
  878. EXPECT_TRUE(s.contains(absl::string_view("A")));
  879. }
  880. }
  881. class StringLike {
  882. public:
  883. StringLike() = default;
  884. StringLike(const char *s) : s_(s) { // NOLINT
  885. ++constructor_calls_;
  886. }
  887. bool operator<(const StringLike &a) const { return s_ < a.s_; }
  888. static void clear_constructor_call_count() { constructor_calls_ = 0; }
  889. static int constructor_calls() { return constructor_calls_; }
  890. private:
  891. static int constructor_calls_;
  892. std::string s_;
  893. };
  894. int StringLike::constructor_calls_ = 0;
  895. TEST(Btree, HeterogeneousLookupDoesntDegradePerformance) {
  896. using StringSet = absl::btree_set<StringLike>;
  897. StringSet s;
  898. for (int i = 0; i < 100; ++i) {
  899. ASSERT_TRUE(s.insert(absl::StrCat(i).c_str()).second);
  900. }
  901. StringLike::clear_constructor_call_count();
  902. s.find("50");
  903. ASSERT_EQ(1, StringLike::constructor_calls());
  904. StringLike::clear_constructor_call_count();
  905. s.contains("50");
  906. ASSERT_EQ(1, StringLike::constructor_calls());
  907. StringLike::clear_constructor_call_count();
  908. s.count("50");
  909. ASSERT_EQ(1, StringLike::constructor_calls());
  910. StringLike::clear_constructor_call_count();
  911. s.lower_bound("50");
  912. ASSERT_EQ(1, StringLike::constructor_calls());
  913. StringLike::clear_constructor_call_count();
  914. s.upper_bound("50");
  915. ASSERT_EQ(1, StringLike::constructor_calls());
  916. StringLike::clear_constructor_call_count();
  917. s.equal_range("50");
  918. ASSERT_EQ(1, StringLike::constructor_calls());
  919. StringLike::clear_constructor_call_count();
  920. s.erase("50");
  921. ASSERT_EQ(1, StringLike::constructor_calls());
  922. }
  923. // Verify that swapping btrees swaps the key comparison functors and that we can
  924. // use non-default constructible comparators.
  925. struct SubstringLess {
  926. SubstringLess() = delete;
  927. explicit SubstringLess(int length) : n(length) {}
  928. bool operator()(const std::string &a, const std::string &b) const {
  929. return absl::string_view(a).substr(0, n) <
  930. absl::string_view(b).substr(0, n);
  931. }
  932. int n;
  933. };
  934. TEST(Btree, SwapKeyCompare) {
  935. using SubstringSet = absl::btree_set<std::string, SubstringLess>;
  936. SubstringSet s1(SubstringLess(1), SubstringSet::allocator_type());
  937. SubstringSet s2(SubstringLess(2), SubstringSet::allocator_type());
  938. ASSERT_TRUE(s1.insert("a").second);
  939. ASSERT_FALSE(s1.insert("aa").second);
  940. ASSERT_TRUE(s2.insert("a").second);
  941. ASSERT_TRUE(s2.insert("aa").second);
  942. ASSERT_FALSE(s2.insert("aaa").second);
  943. swap(s1, s2);
  944. ASSERT_TRUE(s1.insert("b").second);
  945. ASSERT_TRUE(s1.insert("bb").second);
  946. ASSERT_FALSE(s1.insert("bbb").second);
  947. ASSERT_TRUE(s2.insert("b").second);
  948. ASSERT_FALSE(s2.insert("bb").second);
  949. }
  950. TEST(Btree, UpperBoundRegression) {
  951. // Regress a bug where upper_bound would default-construct a new key_compare
  952. // instead of copying the existing one.
  953. using SubstringSet = absl::btree_set<std::string, SubstringLess>;
  954. SubstringSet my_set(SubstringLess(3));
  955. my_set.insert("aab");
  956. my_set.insert("abb");
  957. // We call upper_bound("aaa"). If this correctly uses the length 3
  958. // comparator, aaa < aab < abb, so we should get aab as the result.
  959. // If it instead uses the default-constructed length 2 comparator,
  960. // aa == aa < ab, so we'll get abb as our result.
  961. SubstringSet::iterator it = my_set.upper_bound("aaa");
  962. ASSERT_TRUE(it != my_set.end());
  963. EXPECT_EQ("aab", *it);
  964. }
  965. TEST(Btree, Comparison) {
  966. const int kSetSize = 1201;
  967. absl::btree_set<int64_t> my_set;
  968. for (int i = 0; i < kSetSize; ++i) {
  969. my_set.insert(i);
  970. }
  971. absl::btree_set<int64_t> my_set_copy(my_set);
  972. EXPECT_TRUE(my_set_copy == my_set);
  973. EXPECT_TRUE(my_set == my_set_copy);
  974. EXPECT_FALSE(my_set_copy != my_set);
  975. EXPECT_FALSE(my_set != my_set_copy);
  976. my_set.insert(kSetSize);
  977. EXPECT_FALSE(my_set_copy == my_set);
  978. EXPECT_FALSE(my_set == my_set_copy);
  979. EXPECT_TRUE(my_set_copy != my_set);
  980. EXPECT_TRUE(my_set != my_set_copy);
  981. my_set.erase(kSetSize - 1);
  982. EXPECT_FALSE(my_set_copy == my_set);
  983. EXPECT_FALSE(my_set == my_set_copy);
  984. EXPECT_TRUE(my_set_copy != my_set);
  985. EXPECT_TRUE(my_set != my_set_copy);
  986. absl::btree_map<std::string, int64_t> my_map;
  987. for (int i = 0; i < kSetSize; ++i) {
  988. my_map[std::string(i, 'a')] = i;
  989. }
  990. absl::btree_map<std::string, int64_t> my_map_copy(my_map);
  991. EXPECT_TRUE(my_map_copy == my_map);
  992. EXPECT_TRUE(my_map == my_map_copy);
  993. EXPECT_FALSE(my_map_copy != my_map);
  994. EXPECT_FALSE(my_map != my_map_copy);
  995. ++my_map_copy[std::string(7, 'a')];
  996. EXPECT_FALSE(my_map_copy == my_map);
  997. EXPECT_FALSE(my_map == my_map_copy);
  998. EXPECT_TRUE(my_map_copy != my_map);
  999. EXPECT_TRUE(my_map != my_map_copy);
  1000. my_map_copy = my_map;
  1001. my_map["hello"] = kSetSize;
  1002. EXPECT_FALSE(my_map_copy == my_map);
  1003. EXPECT_FALSE(my_map == my_map_copy);
  1004. EXPECT_TRUE(my_map_copy != my_map);
  1005. EXPECT_TRUE(my_map != my_map_copy);
  1006. my_map.erase(std::string(kSetSize - 1, 'a'));
  1007. EXPECT_FALSE(my_map_copy == my_map);
  1008. EXPECT_FALSE(my_map == my_map_copy);
  1009. EXPECT_TRUE(my_map_copy != my_map);
  1010. EXPECT_TRUE(my_map != my_map_copy);
  1011. }
  1012. TEST(Btree, RangeCtorSanity) {
  1013. std::vector<int> ivec;
  1014. ivec.push_back(1);
  1015. std::map<int, int> imap;
  1016. imap.insert(std::make_pair(1, 2));
  1017. absl::btree_multiset<int> tmset(ivec.begin(), ivec.end());
  1018. absl::btree_multimap<int, int> tmmap(imap.begin(), imap.end());
  1019. absl::btree_set<int> tset(ivec.begin(), ivec.end());
  1020. absl::btree_map<int, int> tmap(imap.begin(), imap.end());
  1021. EXPECT_EQ(1, tmset.size());
  1022. EXPECT_EQ(1, tmmap.size());
  1023. EXPECT_EQ(1, tset.size());
  1024. EXPECT_EQ(1, tmap.size());
  1025. }
  1026. } // namespace
  1027. class BtreeNodePeer {
  1028. public:
  1029. // Yields the size of a leaf node with a specific number of values.
  1030. template <typename ValueType>
  1031. constexpr static size_t GetTargetNodeSize(size_t target_values_per_node) {
  1032. return btree_node<
  1033. set_params<ValueType, std::less<ValueType>, std::allocator<ValueType>,
  1034. /*TargetNodeSize=*/256, // This parameter isn't used here.
  1035. /*Multi=*/false>>::SizeWithNSlots(target_values_per_node);
  1036. }
  1037. // Yields the number of slots in a (non-root) leaf node for this btree.
  1038. template <typename Btree>
  1039. constexpr static size_t GetNumSlotsPerNode() {
  1040. return btree_node<typename Btree::params_type>::kNodeSlots;
  1041. }
  1042. template <typename Btree>
  1043. constexpr static size_t GetMaxFieldType() {
  1044. return std::numeric_limits<
  1045. typename btree_node<typename Btree::params_type>::field_type>::max();
  1046. }
  1047. template <typename Btree>
  1048. constexpr static bool UsesLinearNodeSearch() {
  1049. return btree_node<typename Btree::params_type>::use_linear_search::value;
  1050. }
  1051. };
  1052. namespace {
  1053. class BtreeMapTest : public ::testing::Test {
  1054. public:
  1055. struct Key {};
  1056. struct Cmp {
  1057. template <typename T>
  1058. bool operator()(T, T) const {
  1059. return false;
  1060. }
  1061. };
  1062. struct KeyLin {
  1063. using absl_btree_prefer_linear_node_search = std::true_type;
  1064. };
  1065. struct CmpLin : Cmp {
  1066. using absl_btree_prefer_linear_node_search = std::true_type;
  1067. };
  1068. struct KeyBin {
  1069. using absl_btree_prefer_linear_node_search = std::false_type;
  1070. };
  1071. struct CmpBin : Cmp {
  1072. using absl_btree_prefer_linear_node_search = std::false_type;
  1073. };
  1074. template <typename K, typename C>
  1075. static bool IsLinear() {
  1076. return BtreeNodePeer::UsesLinearNodeSearch<absl::btree_map<K, int, C>>();
  1077. }
  1078. };
  1079. TEST_F(BtreeMapTest, TestLinearSearchPreferredForKeyLinearViaAlias) {
  1080. // Test requesting linear search by directly exporting an alias.
  1081. EXPECT_FALSE((IsLinear<Key, Cmp>()));
  1082. EXPECT_TRUE((IsLinear<KeyLin, Cmp>()));
  1083. EXPECT_TRUE((IsLinear<Key, CmpLin>()));
  1084. EXPECT_TRUE((IsLinear<KeyLin, CmpLin>()));
  1085. }
  1086. TEST_F(BtreeMapTest, LinearChoiceTree) {
  1087. // Cmp has precedence, and is forcing binary
  1088. EXPECT_FALSE((IsLinear<Key, CmpBin>()));
  1089. EXPECT_FALSE((IsLinear<KeyLin, CmpBin>()));
  1090. EXPECT_FALSE((IsLinear<KeyBin, CmpBin>()));
  1091. EXPECT_FALSE((IsLinear<int, CmpBin>()));
  1092. EXPECT_FALSE((IsLinear<std::string, CmpBin>()));
  1093. // Cmp has precedence, and is forcing linear
  1094. EXPECT_TRUE((IsLinear<Key, CmpLin>()));
  1095. EXPECT_TRUE((IsLinear<KeyLin, CmpLin>()));
  1096. EXPECT_TRUE((IsLinear<KeyBin, CmpLin>()));
  1097. EXPECT_TRUE((IsLinear<int, CmpLin>()));
  1098. EXPECT_TRUE((IsLinear<std::string, CmpLin>()));
  1099. // Cmp has no preference, Key determines linear vs binary.
  1100. EXPECT_FALSE((IsLinear<Key, Cmp>()));
  1101. EXPECT_TRUE((IsLinear<KeyLin, Cmp>()));
  1102. EXPECT_FALSE((IsLinear<KeyBin, Cmp>()));
  1103. // arithmetic key w/ std::less or std::greater: linear
  1104. EXPECT_TRUE((IsLinear<int, std::less<int>>()));
  1105. EXPECT_TRUE((IsLinear<double, std::greater<double>>()));
  1106. // arithmetic key w/ custom compare: binary
  1107. EXPECT_FALSE((IsLinear<int, Cmp>()));
  1108. // non-arithmetic key: binary
  1109. EXPECT_FALSE((IsLinear<std::string, std::less<std::string>>()));
  1110. }
  1111. TEST(Btree, BtreeMapCanHoldMoveOnlyTypes) {
  1112. absl::btree_map<std::string, std::unique_ptr<std::string>> m;
  1113. std::unique_ptr<std::string> &v = m["A"];
  1114. EXPECT_TRUE(v == nullptr);
  1115. v.reset(new std::string("X"));
  1116. auto iter = m.find("A");
  1117. EXPECT_EQ("X", *iter->second);
  1118. }
  1119. TEST(Btree, InitializerListConstructor) {
  1120. absl::btree_set<std::string> set({"a", "b"});
  1121. EXPECT_EQ(set.count("a"), 1);
  1122. EXPECT_EQ(set.count("b"), 1);
  1123. absl::btree_multiset<int> mset({1, 1, 4});
  1124. EXPECT_EQ(mset.count(1), 2);
  1125. EXPECT_EQ(mset.count(4), 1);
  1126. absl::btree_map<int, int> map({{1, 5}, {2, 10}});
  1127. EXPECT_EQ(map[1], 5);
  1128. EXPECT_EQ(map[2], 10);
  1129. absl::btree_multimap<int, int> mmap({{1, 5}, {1, 10}});
  1130. auto range = mmap.equal_range(1);
  1131. auto it = range.first;
  1132. ASSERT_NE(it, range.second);
  1133. EXPECT_EQ(it->second, 5);
  1134. ASSERT_NE(++it, range.second);
  1135. EXPECT_EQ(it->second, 10);
  1136. EXPECT_EQ(++it, range.second);
  1137. }
  1138. TEST(Btree, InitializerListInsert) {
  1139. absl::btree_set<std::string> set;
  1140. set.insert({"a", "b"});
  1141. EXPECT_EQ(set.count("a"), 1);
  1142. EXPECT_EQ(set.count("b"), 1);
  1143. absl::btree_multiset<int> mset;
  1144. mset.insert({1, 1, 4});
  1145. EXPECT_EQ(mset.count(1), 2);
  1146. EXPECT_EQ(mset.count(4), 1);
  1147. absl::btree_map<int, int> map;
  1148. map.insert({{1, 5}, {2, 10}});
  1149. // Test that inserting one element using an initializer list also works.
  1150. map.insert({3, 15});
  1151. EXPECT_EQ(map[1], 5);
  1152. EXPECT_EQ(map[2], 10);
  1153. EXPECT_EQ(map[3], 15);
  1154. absl::btree_multimap<int, int> mmap;
  1155. mmap.insert({{1, 5}, {1, 10}});
  1156. auto range = mmap.equal_range(1);
  1157. auto it = range.first;
  1158. ASSERT_NE(it, range.second);
  1159. EXPECT_EQ(it->second, 5);
  1160. ASSERT_NE(++it, range.second);
  1161. EXPECT_EQ(it->second, 10);
  1162. EXPECT_EQ(++it, range.second);
  1163. }
  1164. template <typename Compare, typename K>
  1165. void AssertKeyCompareToAdapted() {
  1166. using Adapted = typename key_compare_to_adapter<Compare>::type;
  1167. static_assert(!std::is_same<Adapted, Compare>::value,
  1168. "key_compare_to_adapter should have adapted this comparator.");
  1169. static_assert(
  1170. std::is_same<absl::weak_ordering,
  1171. absl::result_of_t<Adapted(const K &, const K &)>>::value,
  1172. "Adapted comparator should be a key-compare-to comparator.");
  1173. }
  1174. template <typename Compare, typename K>
  1175. void AssertKeyCompareToNotAdapted() {
  1176. using Unadapted = typename key_compare_to_adapter<Compare>::type;
  1177. static_assert(
  1178. std::is_same<Unadapted, Compare>::value,
  1179. "key_compare_to_adapter shouldn't have adapted this comparator.");
  1180. static_assert(
  1181. std::is_same<bool,
  1182. absl::result_of_t<Unadapted(const K &, const K &)>>::value,
  1183. "Un-adapted comparator should return bool.");
  1184. }
  1185. TEST(Btree, KeyCompareToAdapter) {
  1186. AssertKeyCompareToAdapted<std::less<std::string>, std::string>();
  1187. AssertKeyCompareToAdapted<std::greater<std::string>, std::string>();
  1188. AssertKeyCompareToAdapted<std::less<absl::string_view>, absl::string_view>();
  1189. AssertKeyCompareToAdapted<std::greater<absl::string_view>,
  1190. absl::string_view>();
  1191. AssertKeyCompareToAdapted<std::less<absl::Cord>, absl::Cord>();
  1192. AssertKeyCompareToAdapted<std::greater<absl::Cord>, absl::Cord>();
  1193. AssertKeyCompareToNotAdapted<std::less<int>, int>();
  1194. AssertKeyCompareToNotAdapted<std::greater<int>, int>();
  1195. }
  1196. TEST(Btree, RValueInsert) {
  1197. InstanceTracker tracker;
  1198. absl::btree_set<MovableOnlyInstance> set;
  1199. set.insert(MovableOnlyInstance(1));
  1200. set.insert(MovableOnlyInstance(3));
  1201. MovableOnlyInstance two(2);
  1202. set.insert(set.find(MovableOnlyInstance(3)), std::move(two));
  1203. auto it = set.find(MovableOnlyInstance(2));
  1204. ASSERT_NE(it, set.end());
  1205. ASSERT_NE(++it, set.end());
  1206. EXPECT_EQ(it->value(), 3);
  1207. absl::btree_multiset<MovableOnlyInstance> mset;
  1208. MovableOnlyInstance zero(0);
  1209. MovableOnlyInstance zero2(0);
  1210. mset.insert(std::move(zero));
  1211. mset.insert(mset.find(MovableOnlyInstance(0)), std::move(zero2));
  1212. EXPECT_EQ(mset.count(MovableOnlyInstance(0)), 2);
  1213. absl::btree_map<int, MovableOnlyInstance> map;
  1214. std::pair<const int, MovableOnlyInstance> p1 = {1, MovableOnlyInstance(5)};
  1215. std::pair<const int, MovableOnlyInstance> p2 = {2, MovableOnlyInstance(10)};
  1216. std::pair<const int, MovableOnlyInstance> p3 = {3, MovableOnlyInstance(15)};
  1217. map.insert(std::move(p1));
  1218. map.insert(std::move(p3));
  1219. map.insert(map.find(3), std::move(p2));
  1220. ASSERT_NE(map.find(2), map.end());
  1221. EXPECT_EQ(map.find(2)->second.value(), 10);
  1222. absl::btree_multimap<int, MovableOnlyInstance> mmap;
  1223. std::pair<const int, MovableOnlyInstance> p4 = {1, MovableOnlyInstance(5)};
  1224. std::pair<const int, MovableOnlyInstance> p5 = {1, MovableOnlyInstance(10)};
  1225. mmap.insert(std::move(p4));
  1226. mmap.insert(mmap.find(1), std::move(p5));
  1227. auto range = mmap.equal_range(1);
  1228. auto it1 = range.first;
  1229. ASSERT_NE(it1, range.second);
  1230. EXPECT_EQ(it1->second.value(), 10);
  1231. ASSERT_NE(++it1, range.second);
  1232. EXPECT_EQ(it1->second.value(), 5);
  1233. EXPECT_EQ(++it1, range.second);
  1234. EXPECT_EQ(tracker.copies(), 0);
  1235. EXPECT_EQ(tracker.swaps(), 0);
  1236. }
  1237. // A btree set with a specific number of values per node.
  1238. template <typename Key, int TargetValuesPerNode, typename Cmp = std::less<Key>>
  1239. class SizedBtreeSet
  1240. : public btree_set_container<btree<
  1241. set_params<Key, Cmp, std::allocator<Key>,
  1242. BtreeNodePeer::GetTargetNodeSize<Key>(TargetValuesPerNode),
  1243. /*Multi=*/false>>> {
  1244. using Base = typename SizedBtreeSet::btree_set_container;
  1245. public:
  1246. SizedBtreeSet() {}
  1247. using Base::Base;
  1248. };
  1249. template <typename Set>
  1250. void ExpectOperationCounts(const int expected_moves,
  1251. const int expected_comparisons,
  1252. const std::vector<int> &values,
  1253. InstanceTracker *tracker, Set *set) {
  1254. for (const int v : values) set->insert(MovableOnlyInstance(v));
  1255. set->clear();
  1256. EXPECT_EQ(tracker->moves(), expected_moves);
  1257. EXPECT_EQ(tracker->comparisons(), expected_comparisons);
  1258. EXPECT_EQ(tracker->copies(), 0);
  1259. EXPECT_EQ(tracker->swaps(), 0);
  1260. tracker->ResetCopiesMovesSwaps();
  1261. }
  1262. // Note: when the values in this test change, it is expected to have an impact
  1263. // on performance.
  1264. TEST(Btree, MovesComparisonsCopiesSwapsTracking) {
  1265. InstanceTracker tracker;
  1266. // Note: this is minimum number of values per node.
  1267. SizedBtreeSet<MovableOnlyInstance, /*TargetValuesPerNode=*/4> set4;
  1268. // Note: this is the default number of values per node for a set of int32s
  1269. // (with 64-bit pointers).
  1270. SizedBtreeSet<MovableOnlyInstance, /*TargetValuesPerNode=*/61> set61;
  1271. SizedBtreeSet<MovableOnlyInstance, /*TargetValuesPerNode=*/100> set100;
  1272. // Don't depend on flags for random values because then the expectations will
  1273. // fail if the flags change.
  1274. std::vector<int> values =
  1275. GenerateValuesWithSeed<int>(10000, 1 << 22, /*seed=*/23);
  1276. EXPECT_EQ(BtreeNodePeer::GetNumSlotsPerNode<decltype(set4)>(), 4);
  1277. EXPECT_EQ(BtreeNodePeer::GetNumSlotsPerNode<decltype(set61)>(), 61);
  1278. EXPECT_EQ(BtreeNodePeer::GetNumSlotsPerNode<decltype(set100)>(), 100);
  1279. if (sizeof(void *) == 8) {
  1280. EXPECT_EQ(BtreeNodePeer::GetNumSlotsPerNode<absl::btree_set<int32_t>>(),
  1281. BtreeNodePeer::GetNumSlotsPerNode<decltype(set61)>());
  1282. }
  1283. // Test key insertion/deletion in random order.
  1284. ExpectOperationCounts(56540, 134212, values, &tracker, &set4);
  1285. ExpectOperationCounts(386718, 129807, values, &tracker, &set61);
  1286. ExpectOperationCounts(586761, 130310, values, &tracker, &set100);
  1287. // Test key insertion/deletion in sorted order.
  1288. std::sort(values.begin(), values.end());
  1289. ExpectOperationCounts(24972, 85563, values, &tracker, &set4);
  1290. ExpectOperationCounts(20208, 87757, values, &tracker, &set61);
  1291. ExpectOperationCounts(20124, 96583, values, &tracker, &set100);
  1292. // Test key insertion/deletion in reverse sorted order.
  1293. std::reverse(values.begin(), values.end());
  1294. ExpectOperationCounts(54949, 127531, values, &tracker, &set4);
  1295. ExpectOperationCounts(338813, 118266, values, &tracker, &set61);
  1296. ExpectOperationCounts(534529, 125279, values, &tracker, &set100);
  1297. }
  1298. struct MovableOnlyInstanceThreeWayCompare {
  1299. absl::weak_ordering operator()(const MovableOnlyInstance &a,
  1300. const MovableOnlyInstance &b) const {
  1301. return a.compare(b);
  1302. }
  1303. };
  1304. // Note: when the values in this test change, it is expected to have an impact
  1305. // on performance.
  1306. TEST(Btree, MovesComparisonsCopiesSwapsTrackingThreeWayCompare) {
  1307. InstanceTracker tracker;
  1308. // Note: this is minimum number of values per node.
  1309. SizedBtreeSet<MovableOnlyInstance, /*TargetValuesPerNode=*/4,
  1310. MovableOnlyInstanceThreeWayCompare>
  1311. set4;
  1312. // Note: this is the default number of values per node for a set of int32s
  1313. // (with 64-bit pointers).
  1314. SizedBtreeSet<MovableOnlyInstance, /*TargetValuesPerNode=*/61,
  1315. MovableOnlyInstanceThreeWayCompare>
  1316. set61;
  1317. SizedBtreeSet<MovableOnlyInstance, /*TargetValuesPerNode=*/100,
  1318. MovableOnlyInstanceThreeWayCompare>
  1319. set100;
  1320. // Don't depend on flags for random values because then the expectations will
  1321. // fail if the flags change.
  1322. std::vector<int> values =
  1323. GenerateValuesWithSeed<int>(10000, 1 << 22, /*seed=*/23);
  1324. EXPECT_EQ(BtreeNodePeer::GetNumSlotsPerNode<decltype(set4)>(), 4);
  1325. EXPECT_EQ(BtreeNodePeer::GetNumSlotsPerNode<decltype(set61)>(), 61);
  1326. EXPECT_EQ(BtreeNodePeer::GetNumSlotsPerNode<decltype(set100)>(), 100);
  1327. if (sizeof(void *) == 8) {
  1328. EXPECT_EQ(BtreeNodePeer::GetNumSlotsPerNode<absl::btree_set<int32_t>>(),
  1329. BtreeNodePeer::GetNumSlotsPerNode<decltype(set61)>());
  1330. }
  1331. // Test key insertion/deletion in random order.
  1332. ExpectOperationCounts(56540, 124221, values, &tracker, &set4);
  1333. ExpectOperationCounts(386718, 119816, values, &tracker, &set61);
  1334. ExpectOperationCounts(586761, 120319, values, &tracker, &set100);
  1335. // Test key insertion/deletion in sorted order.
  1336. std::sort(values.begin(), values.end());
  1337. ExpectOperationCounts(24972, 85563, values, &tracker, &set4);
  1338. ExpectOperationCounts(20208, 87757, values, &tracker, &set61);
  1339. ExpectOperationCounts(20124, 96583, values, &tracker, &set100);
  1340. // Test key insertion/deletion in reverse sorted order.
  1341. std::reverse(values.begin(), values.end());
  1342. ExpectOperationCounts(54949, 117532, values, &tracker, &set4);
  1343. ExpectOperationCounts(338813, 108267, values, &tracker, &set61);
  1344. ExpectOperationCounts(534529, 115280, values, &tracker, &set100);
  1345. }
  1346. struct NoDefaultCtor {
  1347. int num;
  1348. explicit NoDefaultCtor(int i) : num(i) {}
  1349. friend bool operator<(const NoDefaultCtor &a, const NoDefaultCtor &b) {
  1350. return a.num < b.num;
  1351. }
  1352. };
  1353. TEST(Btree, BtreeMapCanHoldNoDefaultCtorTypes) {
  1354. absl::btree_map<NoDefaultCtor, NoDefaultCtor> m;
  1355. for (int i = 1; i <= 99; ++i) {
  1356. SCOPED_TRACE(i);
  1357. EXPECT_TRUE(m.emplace(NoDefaultCtor(i), NoDefaultCtor(100 - i)).second);
  1358. }
  1359. EXPECT_FALSE(m.emplace(NoDefaultCtor(78), NoDefaultCtor(0)).second);
  1360. auto iter99 = m.find(NoDefaultCtor(99));
  1361. ASSERT_NE(iter99, m.end());
  1362. EXPECT_EQ(iter99->second.num, 1);
  1363. auto iter1 = m.find(NoDefaultCtor(1));
  1364. ASSERT_NE(iter1, m.end());
  1365. EXPECT_EQ(iter1->second.num, 99);
  1366. auto iter50 = m.find(NoDefaultCtor(50));
  1367. ASSERT_NE(iter50, m.end());
  1368. EXPECT_EQ(iter50->second.num, 50);
  1369. auto iter25 = m.find(NoDefaultCtor(25));
  1370. ASSERT_NE(iter25, m.end());
  1371. EXPECT_EQ(iter25->second.num, 75);
  1372. }
  1373. TEST(Btree, BtreeMultimapCanHoldNoDefaultCtorTypes) {
  1374. absl::btree_multimap<NoDefaultCtor, NoDefaultCtor> m;
  1375. for (int i = 1; i <= 99; ++i) {
  1376. SCOPED_TRACE(i);
  1377. m.emplace(NoDefaultCtor(i), NoDefaultCtor(100 - i));
  1378. }
  1379. auto iter99 = m.find(NoDefaultCtor(99));
  1380. ASSERT_NE(iter99, m.end());
  1381. EXPECT_EQ(iter99->second.num, 1);
  1382. auto iter1 = m.find(NoDefaultCtor(1));
  1383. ASSERT_NE(iter1, m.end());
  1384. EXPECT_EQ(iter1->second.num, 99);
  1385. auto iter50 = m.find(NoDefaultCtor(50));
  1386. ASSERT_NE(iter50, m.end());
  1387. EXPECT_EQ(iter50->second.num, 50);
  1388. auto iter25 = m.find(NoDefaultCtor(25));
  1389. ASSERT_NE(iter25, m.end());
  1390. EXPECT_EQ(iter25->second.num, 75);
  1391. }
  1392. TEST(Btree, MapAt) {
  1393. absl::btree_map<int, int> map = {{1, 2}, {2, 4}};
  1394. EXPECT_EQ(map.at(1), 2);
  1395. EXPECT_EQ(map.at(2), 4);
  1396. map.at(2) = 8;
  1397. const absl::btree_map<int, int> &const_map = map;
  1398. EXPECT_EQ(const_map.at(1), 2);
  1399. EXPECT_EQ(const_map.at(2), 8);
  1400. #ifdef ABSL_HAVE_EXCEPTIONS
  1401. EXPECT_THROW(map.at(3), std::out_of_range);
  1402. #else
  1403. EXPECT_DEATH_IF_SUPPORTED(map.at(3), "absl::btree_map::at");
  1404. #endif
  1405. }
  1406. TEST(Btree, BtreeMultisetEmplace) {
  1407. const int value_to_insert = 123456;
  1408. absl::btree_multiset<int> s;
  1409. auto iter = s.emplace(value_to_insert);
  1410. ASSERT_NE(iter, s.end());
  1411. EXPECT_EQ(*iter, value_to_insert);
  1412. auto iter2 = s.emplace(value_to_insert);
  1413. EXPECT_NE(iter2, iter);
  1414. ASSERT_NE(iter2, s.end());
  1415. EXPECT_EQ(*iter2, value_to_insert);
  1416. auto result = s.equal_range(value_to_insert);
  1417. EXPECT_EQ(std::distance(result.first, result.second), 2);
  1418. }
  1419. TEST(Btree, BtreeMultisetEmplaceHint) {
  1420. const int value_to_insert = 123456;
  1421. absl::btree_multiset<int> s;
  1422. auto iter = s.emplace(value_to_insert);
  1423. ASSERT_NE(iter, s.end());
  1424. EXPECT_EQ(*iter, value_to_insert);
  1425. auto emplace_iter = s.emplace_hint(iter, value_to_insert);
  1426. EXPECT_NE(emplace_iter, iter);
  1427. ASSERT_NE(emplace_iter, s.end());
  1428. EXPECT_EQ(*emplace_iter, value_to_insert);
  1429. }
  1430. TEST(Btree, BtreeMultimapEmplace) {
  1431. const int key_to_insert = 123456;
  1432. const char value0[] = "a";
  1433. absl::btree_multimap<int, std::string> s;
  1434. auto iter = s.emplace(key_to_insert, value0);
  1435. ASSERT_NE(iter, s.end());
  1436. EXPECT_EQ(iter->first, key_to_insert);
  1437. EXPECT_EQ(iter->second, value0);
  1438. const char value1[] = "b";
  1439. auto iter2 = s.emplace(key_to_insert, value1);
  1440. EXPECT_NE(iter2, iter);
  1441. ASSERT_NE(iter2, s.end());
  1442. EXPECT_EQ(iter2->first, key_to_insert);
  1443. EXPECT_EQ(iter2->second, value1);
  1444. auto result = s.equal_range(key_to_insert);
  1445. EXPECT_EQ(std::distance(result.first, result.second), 2);
  1446. }
  1447. TEST(Btree, BtreeMultimapEmplaceHint) {
  1448. const int key_to_insert = 123456;
  1449. const char value0[] = "a";
  1450. absl::btree_multimap<int, std::string> s;
  1451. auto iter = s.emplace(key_to_insert, value0);
  1452. ASSERT_NE(iter, s.end());
  1453. EXPECT_EQ(iter->first, key_to_insert);
  1454. EXPECT_EQ(iter->second, value0);
  1455. const char value1[] = "b";
  1456. auto emplace_iter = s.emplace_hint(iter, key_to_insert, value1);
  1457. EXPECT_NE(emplace_iter, iter);
  1458. ASSERT_NE(emplace_iter, s.end());
  1459. EXPECT_EQ(emplace_iter->first, key_to_insert);
  1460. EXPECT_EQ(emplace_iter->second, value1);
  1461. }
  1462. TEST(Btree, ConstIteratorAccessors) {
  1463. absl::btree_set<int> set;
  1464. for (int i = 0; i < 100; ++i) {
  1465. set.insert(i);
  1466. }
  1467. auto it = set.cbegin();
  1468. auto r_it = set.crbegin();
  1469. for (int i = 0; i < 100; ++i, ++it, ++r_it) {
  1470. ASSERT_EQ(*it, i);
  1471. ASSERT_EQ(*r_it, 99 - i);
  1472. }
  1473. EXPECT_EQ(it, set.cend());
  1474. EXPECT_EQ(r_it, set.crend());
  1475. }
  1476. TEST(Btree, StrSplitCompatible) {
  1477. const absl::btree_set<std::string> split_set = absl::StrSplit("a,b,c", ',');
  1478. const absl::btree_set<std::string> expected_set = {"a", "b", "c"};
  1479. EXPECT_EQ(split_set, expected_set);
  1480. }
  1481. TEST(Btree, KeyComp) {
  1482. absl::btree_set<int> s;
  1483. EXPECT_TRUE(s.key_comp()(1, 2));
  1484. EXPECT_FALSE(s.key_comp()(2, 2));
  1485. EXPECT_FALSE(s.key_comp()(2, 1));
  1486. absl::btree_map<int, int> m1;
  1487. EXPECT_TRUE(m1.key_comp()(1, 2));
  1488. EXPECT_FALSE(m1.key_comp()(2, 2));
  1489. EXPECT_FALSE(m1.key_comp()(2, 1));
  1490. // Even though we internally adapt the comparator of `m2` to be three-way and
  1491. // heterogeneous, the comparator we expose through key_comp() is the original
  1492. // unadapted comparator.
  1493. absl::btree_map<std::string, int> m2;
  1494. EXPECT_TRUE(m2.key_comp()("a", "b"));
  1495. EXPECT_FALSE(m2.key_comp()("b", "b"));
  1496. EXPECT_FALSE(m2.key_comp()("b", "a"));
  1497. }
  1498. TEST(Btree, ValueComp) {
  1499. absl::btree_set<int> s;
  1500. EXPECT_TRUE(s.value_comp()(1, 2));
  1501. EXPECT_FALSE(s.value_comp()(2, 2));
  1502. EXPECT_FALSE(s.value_comp()(2, 1));
  1503. absl::btree_map<int, int> m1;
  1504. EXPECT_TRUE(m1.value_comp()(std::make_pair(1, 0), std::make_pair(2, 0)));
  1505. EXPECT_FALSE(m1.value_comp()(std::make_pair(2, 0), std::make_pair(2, 0)));
  1506. EXPECT_FALSE(m1.value_comp()(std::make_pair(2, 0), std::make_pair(1, 0)));
  1507. // Even though we internally adapt the comparator of `m2` to be three-way and
  1508. // heterogeneous, the comparator we expose through value_comp() is based on
  1509. // the original unadapted comparator.
  1510. absl::btree_map<std::string, int> m2;
  1511. EXPECT_TRUE(m2.value_comp()(std::make_pair("a", 0), std::make_pair("b", 0)));
  1512. EXPECT_FALSE(m2.value_comp()(std::make_pair("b", 0), std::make_pair("b", 0)));
  1513. EXPECT_FALSE(m2.value_comp()(std::make_pair("b", 0), std::make_pair("a", 0)));
  1514. }
  1515. TEST(Btree, DefaultConstruction) {
  1516. absl::btree_set<int> s;
  1517. absl::btree_map<int, int> m;
  1518. absl::btree_multiset<int> ms;
  1519. absl::btree_multimap<int, int> mm;
  1520. EXPECT_TRUE(s.empty());
  1521. EXPECT_TRUE(m.empty());
  1522. EXPECT_TRUE(ms.empty());
  1523. EXPECT_TRUE(mm.empty());
  1524. }
  1525. TEST(Btree, SwissTableHashable) {
  1526. static constexpr int kValues = 10000;
  1527. std::vector<int> values(kValues);
  1528. std::iota(values.begin(), values.end(), 0);
  1529. std::vector<std::pair<int, int>> map_values;
  1530. for (int v : values) map_values.emplace_back(v, -v);
  1531. using set = absl::btree_set<int>;
  1532. EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
  1533. set{},
  1534. set{1},
  1535. set{2},
  1536. set{1, 2},
  1537. set{2, 1},
  1538. set(values.begin(), values.end()),
  1539. set(values.rbegin(), values.rend()),
  1540. }));
  1541. using mset = absl::btree_multiset<int>;
  1542. EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
  1543. mset{},
  1544. mset{1},
  1545. mset{1, 1},
  1546. mset{2},
  1547. mset{2, 2},
  1548. mset{1, 2},
  1549. mset{1, 1, 2},
  1550. mset{1, 2, 2},
  1551. mset{1, 1, 2, 2},
  1552. mset(values.begin(), values.end()),
  1553. mset(values.rbegin(), values.rend()),
  1554. }));
  1555. using map = absl::btree_map<int, int>;
  1556. EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
  1557. map{},
  1558. map{{1, 0}},
  1559. map{{1, 1}},
  1560. map{{2, 0}},
  1561. map{{2, 2}},
  1562. map{{1, 0}, {2, 1}},
  1563. map(map_values.begin(), map_values.end()),
  1564. map(map_values.rbegin(), map_values.rend()),
  1565. }));
  1566. using mmap = absl::btree_multimap<int, int>;
  1567. EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
  1568. mmap{},
  1569. mmap{{1, 0}},
  1570. mmap{{1, 1}},
  1571. mmap{{1, 0}, {1, 1}},
  1572. mmap{{1, 1}, {1, 0}},
  1573. mmap{{2, 0}},
  1574. mmap{{2, 2}},
  1575. mmap{{1, 0}, {2, 1}},
  1576. mmap(map_values.begin(), map_values.end()),
  1577. mmap(map_values.rbegin(), map_values.rend()),
  1578. }));
  1579. }
  1580. TEST(Btree, ComparableSet) {
  1581. absl::btree_set<int> s1 = {1, 2};
  1582. absl::btree_set<int> s2 = {2, 3};
  1583. EXPECT_LT(s1, s2);
  1584. EXPECT_LE(s1, s2);
  1585. EXPECT_LE(s1, s1);
  1586. EXPECT_GT(s2, s1);
  1587. EXPECT_GE(s2, s1);
  1588. EXPECT_GE(s1, s1);
  1589. }
  1590. TEST(Btree, ComparableSetsDifferentLength) {
  1591. absl::btree_set<int> s1 = {1, 2};
  1592. absl::btree_set<int> s2 = {1, 2, 3};
  1593. EXPECT_LT(s1, s2);
  1594. EXPECT_LE(s1, s2);
  1595. EXPECT_GT(s2, s1);
  1596. EXPECT_GE(s2, s1);
  1597. }
  1598. TEST(Btree, ComparableMultiset) {
  1599. absl::btree_multiset<int> s1 = {1, 2};
  1600. absl::btree_multiset<int> s2 = {2, 3};
  1601. EXPECT_LT(s1, s2);
  1602. EXPECT_LE(s1, s2);
  1603. EXPECT_LE(s1, s1);
  1604. EXPECT_GT(s2, s1);
  1605. EXPECT_GE(s2, s1);
  1606. EXPECT_GE(s1, s1);
  1607. }
  1608. TEST(Btree, ComparableMap) {
  1609. absl::btree_map<int, int> s1 = {{1, 2}};
  1610. absl::btree_map<int, int> s2 = {{2, 3}};
  1611. EXPECT_LT(s1, s2);
  1612. EXPECT_LE(s1, s2);
  1613. EXPECT_LE(s1, s1);
  1614. EXPECT_GT(s2, s1);
  1615. EXPECT_GE(s2, s1);
  1616. EXPECT_GE(s1, s1);
  1617. }
  1618. TEST(Btree, ComparableMultimap) {
  1619. absl::btree_multimap<int, int> s1 = {{1, 2}};
  1620. absl::btree_multimap<int, int> s2 = {{2, 3}};
  1621. EXPECT_LT(s1, s2);
  1622. EXPECT_LE(s1, s2);
  1623. EXPECT_LE(s1, s1);
  1624. EXPECT_GT(s2, s1);
  1625. EXPECT_GE(s2, s1);
  1626. EXPECT_GE(s1, s1);
  1627. }
  1628. TEST(Btree, ComparableSetWithCustomComparator) {
  1629. // As specified by
  1630. // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf section
  1631. // [container.requirements.general].12, ordering associative containers always
  1632. // uses default '<' operator
  1633. // - even if otherwise the container uses custom functor.
  1634. absl::btree_set<int, std::greater<int>> s1 = {1, 2};
  1635. absl::btree_set<int, std::greater<int>> s2 = {2, 3};
  1636. EXPECT_LT(s1, s2);
  1637. EXPECT_LE(s1, s2);
  1638. EXPECT_LE(s1, s1);
  1639. EXPECT_GT(s2, s1);
  1640. EXPECT_GE(s2, s1);
  1641. EXPECT_GE(s1, s1);
  1642. }
  1643. TEST(Btree, EraseReturnsIterator) {
  1644. absl::btree_set<int> set = {1, 2, 3, 4, 5};
  1645. auto result_it = set.erase(set.begin(), set.find(3));
  1646. EXPECT_EQ(result_it, set.find(3));
  1647. result_it = set.erase(set.find(5));
  1648. EXPECT_EQ(result_it, set.end());
  1649. }
  1650. TEST(Btree, ExtractAndInsertNodeHandleSet) {
  1651. absl::btree_set<int> src1 = {1, 2, 3, 4, 5};
  1652. auto nh = src1.extract(src1.find(3));
  1653. EXPECT_THAT(src1, ElementsAre(1, 2, 4, 5));
  1654. absl::btree_set<int> other;
  1655. absl::btree_set<int>::insert_return_type res = other.insert(std::move(nh));
  1656. EXPECT_THAT(other, ElementsAre(3));
  1657. EXPECT_EQ(res.position, other.find(3));
  1658. EXPECT_TRUE(res.inserted);
  1659. EXPECT_TRUE(res.node.empty());
  1660. absl::btree_set<int> src2 = {3, 4};
  1661. nh = src2.extract(src2.find(3));
  1662. EXPECT_THAT(src2, ElementsAre(4));
  1663. res = other.insert(std::move(nh));
  1664. EXPECT_THAT(other, ElementsAre(3));
  1665. EXPECT_EQ(res.position, other.find(3));
  1666. EXPECT_FALSE(res.inserted);
  1667. ASSERT_FALSE(res.node.empty());
  1668. EXPECT_EQ(res.node.value(), 3);
  1669. }
  1670. template <typename Set>
  1671. void TestExtractWithTrackingForSet() {
  1672. InstanceTracker tracker;
  1673. {
  1674. Set s;
  1675. // Add enough elements to make sure we test internal nodes too.
  1676. const size_t kSize = 1000;
  1677. while (s.size() < kSize) {
  1678. s.insert(MovableOnlyInstance(s.size()));
  1679. }
  1680. for (int i = 0; i < kSize; ++i) {
  1681. // Extract with key
  1682. auto nh = s.extract(MovableOnlyInstance(i));
  1683. EXPECT_EQ(s.size(), kSize - 1);
  1684. EXPECT_EQ(nh.value().value(), i);
  1685. // Insert with node
  1686. s.insert(std::move(nh));
  1687. EXPECT_EQ(s.size(), kSize);
  1688. // Extract with iterator
  1689. auto it = s.find(MovableOnlyInstance(i));
  1690. nh = s.extract(it);
  1691. EXPECT_EQ(s.size(), kSize - 1);
  1692. EXPECT_EQ(nh.value().value(), i);
  1693. // Insert with node and hint
  1694. s.insert(s.begin(), std::move(nh));
  1695. EXPECT_EQ(s.size(), kSize);
  1696. }
  1697. }
  1698. EXPECT_EQ(0, tracker.instances());
  1699. }
  1700. template <typename Map>
  1701. void TestExtractWithTrackingForMap() {
  1702. InstanceTracker tracker;
  1703. {
  1704. Map m;
  1705. // Add enough elements to make sure we test internal nodes too.
  1706. const size_t kSize = 1000;
  1707. while (m.size() < kSize) {
  1708. m.insert(
  1709. {CopyableMovableInstance(m.size()), MovableOnlyInstance(m.size())});
  1710. }
  1711. for (int i = 0; i < kSize; ++i) {
  1712. // Extract with key
  1713. auto nh = m.extract(CopyableMovableInstance(i));
  1714. EXPECT_EQ(m.size(), kSize - 1);
  1715. EXPECT_EQ(nh.key().value(), i);
  1716. EXPECT_EQ(nh.mapped().value(), i);
  1717. // Insert with node
  1718. m.insert(std::move(nh));
  1719. EXPECT_EQ(m.size(), kSize);
  1720. // Extract with iterator
  1721. auto it = m.find(CopyableMovableInstance(i));
  1722. nh = m.extract(it);
  1723. EXPECT_EQ(m.size(), kSize - 1);
  1724. EXPECT_EQ(nh.key().value(), i);
  1725. EXPECT_EQ(nh.mapped().value(), i);
  1726. // Insert with node and hint
  1727. m.insert(m.begin(), std::move(nh));
  1728. EXPECT_EQ(m.size(), kSize);
  1729. }
  1730. }
  1731. EXPECT_EQ(0, tracker.instances());
  1732. }
  1733. TEST(Btree, ExtractTracking) {
  1734. TestExtractWithTrackingForSet<absl::btree_set<MovableOnlyInstance>>();
  1735. TestExtractWithTrackingForSet<absl::btree_multiset<MovableOnlyInstance>>();
  1736. TestExtractWithTrackingForMap<
  1737. absl::btree_map<CopyableMovableInstance, MovableOnlyInstance>>();
  1738. TestExtractWithTrackingForMap<
  1739. absl::btree_multimap<CopyableMovableInstance, MovableOnlyInstance>>();
  1740. }
  1741. TEST(Btree, ExtractAndInsertNodeHandleMultiSet) {
  1742. absl::btree_multiset<int> src1 = {1, 2, 3, 3, 4, 5};
  1743. auto nh = src1.extract(src1.find(3));
  1744. EXPECT_THAT(src1, ElementsAre(1, 2, 3, 4, 5));
  1745. absl::btree_multiset<int> other;
  1746. auto res = other.insert(std::move(nh));
  1747. EXPECT_THAT(other, ElementsAre(3));
  1748. EXPECT_EQ(res, other.find(3));
  1749. absl::btree_multiset<int> src2 = {3, 4};
  1750. nh = src2.extract(src2.find(3));
  1751. EXPECT_THAT(src2, ElementsAre(4));
  1752. res = other.insert(std::move(nh));
  1753. EXPECT_THAT(other, ElementsAre(3, 3));
  1754. EXPECT_EQ(res, ++other.find(3));
  1755. }
  1756. TEST(Btree, ExtractAndInsertNodeHandleMap) {
  1757. absl::btree_map<int, int> src1 = {{1, 2}, {3, 4}, {5, 6}};
  1758. auto nh = src1.extract(src1.find(3));
  1759. EXPECT_THAT(src1, ElementsAre(Pair(1, 2), Pair(5, 6)));
  1760. absl::btree_map<int, int> other;
  1761. absl::btree_map<int, int>::insert_return_type res =
  1762. other.insert(std::move(nh));
  1763. EXPECT_THAT(other, ElementsAre(Pair(3, 4)));
  1764. EXPECT_EQ(res.position, other.find(3));
  1765. EXPECT_TRUE(res.inserted);
  1766. EXPECT_TRUE(res.node.empty());
  1767. absl::btree_map<int, int> src2 = {{3, 6}};
  1768. nh = src2.extract(src2.find(3));
  1769. EXPECT_TRUE(src2.empty());
  1770. res = other.insert(std::move(nh));
  1771. EXPECT_THAT(other, ElementsAre(Pair(3, 4)));
  1772. EXPECT_EQ(res.position, other.find(3));
  1773. EXPECT_FALSE(res.inserted);
  1774. ASSERT_FALSE(res.node.empty());
  1775. EXPECT_EQ(res.node.key(), 3);
  1776. EXPECT_EQ(res.node.mapped(), 6);
  1777. }
  1778. TEST(Btree, ExtractAndInsertNodeHandleMultiMap) {
  1779. absl::btree_multimap<int, int> src1 = {{1, 2}, {3, 4}, {5, 6}};
  1780. auto nh = src1.extract(src1.find(3));
  1781. EXPECT_THAT(src1, ElementsAre(Pair(1, 2), Pair(5, 6)));
  1782. absl::btree_multimap<int, int> other;
  1783. auto res = other.insert(std::move(nh));
  1784. EXPECT_THAT(other, ElementsAre(Pair(3, 4)));
  1785. EXPECT_EQ(res, other.find(3));
  1786. absl::btree_multimap<int, int> src2 = {{3, 6}};
  1787. nh = src2.extract(src2.find(3));
  1788. EXPECT_TRUE(src2.empty());
  1789. res = other.insert(std::move(nh));
  1790. EXPECT_THAT(other, ElementsAre(Pair(3, 4), Pair(3, 6)));
  1791. EXPECT_EQ(res, ++other.begin());
  1792. }
  1793. TEST(Btree, ExtractMultiMapEquivalentKeys) {
  1794. // Note: using string keys means a three-way comparator.
  1795. absl::btree_multimap<std::string, int> map;
  1796. for (int i = 0; i < 100; ++i) {
  1797. for (int j = 0; j < 100; ++j) {
  1798. map.insert({absl::StrCat(i), j});
  1799. }
  1800. }
  1801. for (int i = 0; i < 100; ++i) {
  1802. const std::string key = absl::StrCat(i);
  1803. auto node_handle = map.extract(key);
  1804. EXPECT_EQ(node_handle.key(), key);
  1805. EXPECT_EQ(node_handle.mapped(), 0) << i;
  1806. }
  1807. for (int i = 0; i < 100; ++i) {
  1808. const std::string key = absl::StrCat(i);
  1809. auto node_handle = map.extract(key);
  1810. EXPECT_EQ(node_handle.key(), key);
  1811. EXPECT_EQ(node_handle.mapped(), 1) << i;
  1812. }
  1813. }
  1814. // For multisets, insert with hint also affects correctness because we need to
  1815. // insert immediately before the hint if possible.
  1816. struct InsertMultiHintData {
  1817. int key;
  1818. int not_key;
  1819. bool operator==(const InsertMultiHintData other) const {
  1820. return key == other.key && not_key == other.not_key;
  1821. }
  1822. };
  1823. struct InsertMultiHintDataKeyCompare {
  1824. using is_transparent = void;
  1825. bool operator()(const InsertMultiHintData a,
  1826. const InsertMultiHintData b) const {
  1827. return a.key < b.key;
  1828. }
  1829. bool operator()(const int a, const InsertMultiHintData b) const {
  1830. return a < b.key;
  1831. }
  1832. bool operator()(const InsertMultiHintData a, const int b) const {
  1833. return a.key < b;
  1834. }
  1835. };
  1836. TEST(Btree, InsertHintNodeHandle) {
  1837. // For unique sets, insert with hint is just a performance optimization.
  1838. // Test that insert works correctly when the hint is right or wrong.
  1839. {
  1840. absl::btree_set<int> src = {1, 2, 3, 4, 5};
  1841. auto nh = src.extract(src.find(3));
  1842. EXPECT_THAT(src, ElementsAre(1, 2, 4, 5));
  1843. absl::btree_set<int> other = {0, 100};
  1844. // Test a correct hint.
  1845. auto it = other.insert(other.lower_bound(3), std::move(nh));
  1846. EXPECT_THAT(other, ElementsAre(0, 3, 100));
  1847. EXPECT_EQ(it, other.find(3));
  1848. nh = src.extract(src.find(5));
  1849. // Test an incorrect hint.
  1850. it = other.insert(other.end(), std::move(nh));
  1851. EXPECT_THAT(other, ElementsAre(0, 3, 5, 100));
  1852. EXPECT_EQ(it, other.find(5));
  1853. }
  1854. absl::btree_multiset<InsertMultiHintData, InsertMultiHintDataKeyCompare> src =
  1855. {{1, 2}, {3, 4}, {3, 5}};
  1856. auto nh = src.extract(src.lower_bound(3));
  1857. EXPECT_EQ(nh.value(), (InsertMultiHintData{3, 4}));
  1858. absl::btree_multiset<InsertMultiHintData, InsertMultiHintDataKeyCompare>
  1859. other = {{3, 1}, {3, 2}, {3, 3}};
  1860. auto it = other.insert(--other.end(), std::move(nh));
  1861. EXPECT_THAT(
  1862. other, ElementsAre(InsertMultiHintData{3, 1}, InsertMultiHintData{3, 2},
  1863. InsertMultiHintData{3, 4}, InsertMultiHintData{3, 3}));
  1864. EXPECT_EQ(it, --(--other.end()));
  1865. nh = src.extract(src.find(3));
  1866. EXPECT_EQ(nh.value(), (InsertMultiHintData{3, 5}));
  1867. it = other.insert(other.begin(), std::move(nh));
  1868. EXPECT_THAT(other,
  1869. ElementsAre(InsertMultiHintData{3, 5}, InsertMultiHintData{3, 1},
  1870. InsertMultiHintData{3, 2}, InsertMultiHintData{3, 4},
  1871. InsertMultiHintData{3, 3}));
  1872. EXPECT_EQ(it, other.begin());
  1873. }
  1874. struct IntCompareToCmp {
  1875. absl::weak_ordering operator()(int a, int b) const {
  1876. if (a < b) return absl::weak_ordering::less;
  1877. if (a > b) return absl::weak_ordering::greater;
  1878. return absl::weak_ordering::equivalent;
  1879. }
  1880. };
  1881. TEST(Btree, MergeIntoUniqueContainers) {
  1882. absl::btree_set<int, IntCompareToCmp> src1 = {1, 2, 3};
  1883. absl::btree_multiset<int> src2 = {3, 4, 4, 5};
  1884. absl::btree_set<int> dst;
  1885. dst.merge(src1);
  1886. EXPECT_TRUE(src1.empty());
  1887. EXPECT_THAT(dst, ElementsAre(1, 2, 3));
  1888. dst.merge(src2);
  1889. EXPECT_THAT(src2, ElementsAre(3, 4));
  1890. EXPECT_THAT(dst, ElementsAre(1, 2, 3, 4, 5));
  1891. }
  1892. TEST(Btree, MergeIntoUniqueContainersWithCompareTo) {
  1893. absl::btree_set<int, IntCompareToCmp> src1 = {1, 2, 3};
  1894. absl::btree_multiset<int> src2 = {3, 4, 4, 5};
  1895. absl::btree_set<int, IntCompareToCmp> dst;
  1896. dst.merge(src1);
  1897. EXPECT_TRUE(src1.empty());
  1898. EXPECT_THAT(dst, ElementsAre(1, 2, 3));
  1899. dst.merge(src2);
  1900. EXPECT_THAT(src2, ElementsAre(3, 4));
  1901. EXPECT_THAT(dst, ElementsAre(1, 2, 3, 4, 5));
  1902. }
  1903. TEST(Btree, MergeIntoMultiContainers) {
  1904. absl::btree_set<int, IntCompareToCmp> src1 = {1, 2, 3};
  1905. absl::btree_multiset<int> src2 = {3, 4, 4, 5};
  1906. absl::btree_multiset<int> dst;
  1907. dst.merge(src1);
  1908. EXPECT_TRUE(src1.empty());
  1909. EXPECT_THAT(dst, ElementsAre(1, 2, 3));
  1910. dst.merge(src2);
  1911. EXPECT_TRUE(src2.empty());
  1912. EXPECT_THAT(dst, ElementsAre(1, 2, 3, 3, 4, 4, 5));
  1913. }
  1914. TEST(Btree, MergeIntoMultiContainersWithCompareTo) {
  1915. absl::btree_set<int, IntCompareToCmp> src1 = {1, 2, 3};
  1916. absl::btree_multiset<int> src2 = {3, 4, 4, 5};
  1917. absl::btree_multiset<int, IntCompareToCmp> dst;
  1918. dst.merge(src1);
  1919. EXPECT_TRUE(src1.empty());
  1920. EXPECT_THAT(dst, ElementsAre(1, 2, 3));
  1921. dst.merge(src2);
  1922. EXPECT_TRUE(src2.empty());
  1923. EXPECT_THAT(dst, ElementsAre(1, 2, 3, 3, 4, 4, 5));
  1924. }
  1925. TEST(Btree, MergeIntoMultiMapsWithDifferentComparators) {
  1926. absl::btree_map<int, int, IntCompareToCmp> src1 = {{1, 1}, {2, 2}, {3, 3}};
  1927. absl::btree_multimap<int, int, std::greater<int>> src2 = {
  1928. {5, 5}, {4, 1}, {4, 4}, {3, 2}};
  1929. absl::btree_multimap<int, int> dst;
  1930. dst.merge(src1);
  1931. EXPECT_TRUE(src1.empty());
  1932. EXPECT_THAT(dst, ElementsAre(Pair(1, 1), Pair(2, 2), Pair(3, 3)));
  1933. dst.merge(src2);
  1934. EXPECT_TRUE(src2.empty());
  1935. EXPECT_THAT(dst, ElementsAre(Pair(1, 1), Pair(2, 2), Pair(3, 3), Pair(3, 2),
  1936. Pair(4, 1), Pair(4, 4), Pair(5, 5)));
  1937. }
  1938. TEST(Btree, MergeIntoSetMovableOnly) {
  1939. absl::btree_set<MovableOnlyInstance> src;
  1940. src.insert(MovableOnlyInstance(1));
  1941. absl::btree_multiset<MovableOnlyInstance> dst1;
  1942. dst1.insert(MovableOnlyInstance(2));
  1943. absl::btree_set<MovableOnlyInstance> dst2;
  1944. // Test merge into multiset.
  1945. dst1.merge(src);
  1946. EXPECT_TRUE(src.empty());
  1947. // ElementsAre/ElementsAreArray don't work with move-only types.
  1948. ASSERT_THAT(dst1, SizeIs(2));
  1949. EXPECT_EQ(*dst1.begin(), MovableOnlyInstance(1));
  1950. EXPECT_EQ(*std::next(dst1.begin()), MovableOnlyInstance(2));
  1951. // Test merge into set.
  1952. dst2.merge(dst1);
  1953. EXPECT_TRUE(dst1.empty());
  1954. ASSERT_THAT(dst2, SizeIs(2));
  1955. EXPECT_EQ(*dst2.begin(), MovableOnlyInstance(1));
  1956. EXPECT_EQ(*std::next(dst2.begin()), MovableOnlyInstance(2));
  1957. }
  1958. struct KeyCompareToWeakOrdering {
  1959. template <typename T>
  1960. absl::weak_ordering operator()(const T &a, const T &b) const {
  1961. return a < b ? absl::weak_ordering::less
  1962. : a == b ? absl::weak_ordering::equivalent
  1963. : absl::weak_ordering::greater;
  1964. }
  1965. };
  1966. struct KeyCompareToStrongOrdering {
  1967. template <typename T>
  1968. absl::strong_ordering operator()(const T &a, const T &b) const {
  1969. return a < b ? absl::strong_ordering::less
  1970. : a == b ? absl::strong_ordering::equal
  1971. : absl::strong_ordering::greater;
  1972. }
  1973. };
  1974. TEST(Btree, UserProvidedKeyCompareToComparators) {
  1975. absl::btree_set<int, KeyCompareToWeakOrdering> weak_set = {1, 2, 3};
  1976. EXPECT_TRUE(weak_set.contains(2));
  1977. EXPECT_FALSE(weak_set.contains(4));
  1978. absl::btree_set<int, KeyCompareToStrongOrdering> strong_set = {1, 2, 3};
  1979. EXPECT_TRUE(strong_set.contains(2));
  1980. EXPECT_FALSE(strong_set.contains(4));
  1981. }
  1982. TEST(Btree, TryEmplaceBasicTest) {
  1983. absl::btree_map<int, std::string> m;
  1984. // Should construct a string from the literal.
  1985. m.try_emplace(1, "one");
  1986. EXPECT_EQ(1, m.size());
  1987. // Try other string constructors and const lvalue key.
  1988. const int key(42);
  1989. m.try_emplace(key, 3, 'a');
  1990. m.try_emplace(2, std::string("two"));
  1991. EXPECT_TRUE(std::is_sorted(m.begin(), m.end()));
  1992. EXPECT_THAT(m, ElementsAreArray(std::vector<std::pair<int, std::string>>{
  1993. {1, "one"}, {2, "two"}, {42, "aaa"}}));
  1994. }
  1995. TEST(Btree, TryEmplaceWithHintWorks) {
  1996. // Use a counting comparator here to verify that hint is used.
  1997. int calls = 0;
  1998. auto cmp = [&calls](int x, int y) {
  1999. ++calls;
  2000. return x < y;
  2001. };
  2002. using Cmp = decltype(cmp);
  2003. absl::btree_map<int, int, Cmp> m(cmp);
  2004. for (int i = 0; i < 128; ++i) {
  2005. m.emplace(i, i);
  2006. }
  2007. // Sanity check for the comparator
  2008. calls = 0;
  2009. m.emplace(127, 127);
  2010. EXPECT_GE(calls, 4);
  2011. // Try with begin hint:
  2012. calls = 0;
  2013. auto it = m.try_emplace(m.begin(), -1, -1);
  2014. EXPECT_EQ(129, m.size());
  2015. EXPECT_EQ(it, m.begin());
  2016. EXPECT_LE(calls, 2);
  2017. // Try with end hint:
  2018. calls = 0;
  2019. std::pair<int, int> pair1024 = {1024, 1024};
  2020. it = m.try_emplace(m.end(), pair1024.first, pair1024.second);
  2021. EXPECT_EQ(130, m.size());
  2022. EXPECT_EQ(it, --m.end());
  2023. EXPECT_LE(calls, 2);
  2024. // Try value already present, bad hint; ensure no duplicate added:
  2025. calls = 0;
  2026. it = m.try_emplace(m.end(), 16, 17);
  2027. EXPECT_EQ(130, m.size());
  2028. EXPECT_GE(calls, 4);
  2029. EXPECT_EQ(it, m.find(16));
  2030. // Try value already present, hint points directly to it:
  2031. calls = 0;
  2032. it = m.try_emplace(it, 16, 17);
  2033. EXPECT_EQ(130, m.size());
  2034. EXPECT_LE(calls, 2);
  2035. EXPECT_EQ(it, m.find(16));
  2036. m.erase(2);
  2037. EXPECT_EQ(129, m.size());
  2038. auto hint = m.find(3);
  2039. // Try emplace in the middle of two other elements.
  2040. calls = 0;
  2041. m.try_emplace(hint, 2, 2);
  2042. EXPECT_EQ(130, m.size());
  2043. EXPECT_LE(calls, 2);
  2044. EXPECT_TRUE(std::is_sorted(m.begin(), m.end()));
  2045. }
  2046. TEST(Btree, TryEmplaceWithBadHint) {
  2047. absl::btree_map<int, int> m = {{1, 1}, {9, 9}};
  2048. // Bad hint (too small), should still emplace:
  2049. auto it = m.try_emplace(m.begin(), 2, 2);
  2050. EXPECT_EQ(it, ++m.begin());
  2051. EXPECT_THAT(m, ElementsAreArray(
  2052. std::vector<std::pair<int, int>>{{1, 1}, {2, 2}, {9, 9}}));
  2053. // Bad hint, too large this time:
  2054. it = m.try_emplace(++(++m.begin()), 0, 0);
  2055. EXPECT_EQ(it, m.begin());
  2056. EXPECT_THAT(m, ElementsAreArray(std::vector<std::pair<int, int>>{
  2057. {0, 0}, {1, 1}, {2, 2}, {9, 9}}));
  2058. }
  2059. TEST(Btree, TryEmplaceMaintainsSortedOrder) {
  2060. absl::btree_map<int, std::string> m;
  2061. std::pair<int, std::string> pair5 = {5, "five"};
  2062. // Test both lvalue & rvalue emplace.
  2063. m.try_emplace(10, "ten");
  2064. m.try_emplace(pair5.first, pair5.second);
  2065. EXPECT_EQ(2, m.size());
  2066. EXPECT_TRUE(std::is_sorted(m.begin(), m.end()));
  2067. int int100{100};
  2068. m.try_emplace(int100, "hundred");
  2069. m.try_emplace(1, "one");
  2070. EXPECT_EQ(4, m.size());
  2071. EXPECT_TRUE(std::is_sorted(m.begin(), m.end()));
  2072. }
  2073. TEST(Btree, TryEmplaceWithHintAndNoValueArgsWorks) {
  2074. absl::btree_map<int, int> m;
  2075. m.try_emplace(m.end(), 1);
  2076. EXPECT_EQ(0, m[1]);
  2077. }
  2078. TEST(Btree, TryEmplaceWithHintAndMultipleValueArgsWorks) {
  2079. absl::btree_map<int, std::string> m;
  2080. m.try_emplace(m.end(), 1, 10, 'a');
  2081. EXPECT_EQ(std::string(10, 'a'), m[1]);
  2082. }
  2083. TEST(Btree, MoveAssignmentAllocatorPropagation) {
  2084. InstanceTracker tracker;
  2085. int64_t bytes1 = 0, bytes2 = 0;
  2086. PropagatingCountingAlloc<MovableOnlyInstance> allocator1(&bytes1);
  2087. PropagatingCountingAlloc<MovableOnlyInstance> allocator2(&bytes2);
  2088. std::less<MovableOnlyInstance> cmp;
  2089. // Test propagating allocator_type.
  2090. {
  2091. absl::btree_set<MovableOnlyInstance, std::less<MovableOnlyInstance>,
  2092. PropagatingCountingAlloc<MovableOnlyInstance>>
  2093. set1(cmp, allocator1), set2(cmp, allocator2);
  2094. for (int i = 0; i < 100; ++i) set1.insert(MovableOnlyInstance(i));
  2095. tracker.ResetCopiesMovesSwaps();
  2096. set2 = std::move(set1);
  2097. EXPECT_EQ(tracker.moves(), 0);
  2098. }
  2099. // Test non-propagating allocator_type with equal allocators.
  2100. {
  2101. absl::btree_set<MovableOnlyInstance, std::less<MovableOnlyInstance>,
  2102. CountingAllocator<MovableOnlyInstance>>
  2103. set1(cmp, allocator1), set2(cmp, allocator1);
  2104. for (int i = 0; i < 100; ++i) set1.insert(MovableOnlyInstance(i));
  2105. tracker.ResetCopiesMovesSwaps();
  2106. set2 = std::move(set1);
  2107. EXPECT_EQ(tracker.moves(), 0);
  2108. }
  2109. // Test non-propagating allocator_type with different allocators.
  2110. {
  2111. absl::btree_set<MovableOnlyInstance, std::less<MovableOnlyInstance>,
  2112. CountingAllocator<MovableOnlyInstance>>
  2113. set1(cmp, allocator1), set2(cmp, allocator2);
  2114. for (int i = 0; i < 100; ++i) set1.insert(MovableOnlyInstance(i));
  2115. tracker.ResetCopiesMovesSwaps();
  2116. set2 = std::move(set1);
  2117. EXPECT_GE(tracker.moves(), 100);
  2118. }
  2119. }
  2120. TEST(Btree, EmptyTree) {
  2121. absl::btree_set<int> s;
  2122. EXPECT_TRUE(s.empty());
  2123. EXPECT_EQ(s.size(), 0);
  2124. EXPECT_GT(s.max_size(), 0);
  2125. }
  2126. bool IsEven(int k) { return k % 2 == 0; }
  2127. TEST(Btree, EraseIf) {
  2128. // Test that erase_if works with all the container types and supports lambdas.
  2129. {
  2130. absl::btree_set<int> s = {1, 3, 5, 6, 100};
  2131. erase_if(s, [](int k) { return k > 3; });
  2132. EXPECT_THAT(s, ElementsAre(1, 3));
  2133. }
  2134. {
  2135. absl::btree_multiset<int> s = {1, 3, 3, 5, 6, 6, 100};
  2136. erase_if(s, [](int k) { return k <= 3; });
  2137. EXPECT_THAT(s, ElementsAre(5, 6, 6, 100));
  2138. }
  2139. {
  2140. absl::btree_map<int, int> m = {{1, 1}, {3, 3}, {6, 6}, {100, 100}};
  2141. erase_if(m, [](std::pair<const int, int> kv) { return kv.first > 3; });
  2142. EXPECT_THAT(m, ElementsAre(Pair(1, 1), Pair(3, 3)));
  2143. }
  2144. {
  2145. absl::btree_multimap<int, int> m = {{1, 1}, {3, 3}, {3, 6},
  2146. {6, 6}, {6, 7}, {100, 6}};
  2147. erase_if(m, [](std::pair<const int, int> kv) { return kv.second == 6; });
  2148. EXPECT_THAT(m, ElementsAre(Pair(1, 1), Pair(3, 3), Pair(6, 7)));
  2149. }
  2150. // Test that erasing all elements from a large set works and test support for
  2151. // function pointers.
  2152. {
  2153. absl::btree_set<int> s;
  2154. for (int i = 0; i < 1000; ++i) s.insert(2 * i);
  2155. erase_if(s, IsEven);
  2156. EXPECT_THAT(s, IsEmpty());
  2157. }
  2158. // Test that erase_if supports other format of function pointers.
  2159. {
  2160. absl::btree_set<int> s = {1, 3, 5, 6, 100};
  2161. erase_if(s, &IsEven);
  2162. EXPECT_THAT(s, ElementsAre(1, 3, 5));
  2163. }
  2164. }
  2165. TEST(Btree, InsertOrAssign) {
  2166. absl::btree_map<int, int> m = {{1, 1}, {3, 3}};
  2167. using value_type = typename decltype(m)::value_type;
  2168. auto ret = m.insert_or_assign(4, 4);
  2169. EXPECT_EQ(*ret.first, value_type(4, 4));
  2170. EXPECT_TRUE(ret.second);
  2171. ret = m.insert_or_assign(3, 100);
  2172. EXPECT_EQ(*ret.first, value_type(3, 100));
  2173. EXPECT_FALSE(ret.second);
  2174. auto hint_ret = m.insert_or_assign(ret.first, 3, 200);
  2175. EXPECT_EQ(*hint_ret, value_type(3, 200));
  2176. hint_ret = m.insert_or_assign(m.find(1), 0, 1);
  2177. EXPECT_EQ(*hint_ret, value_type(0, 1));
  2178. // Test with bad hint.
  2179. hint_ret = m.insert_or_assign(m.end(), -1, 1);
  2180. EXPECT_EQ(*hint_ret, value_type(-1, 1));
  2181. EXPECT_THAT(m, ElementsAre(Pair(-1, 1), Pair(0, 1), Pair(1, 1), Pair(3, 200),
  2182. Pair(4, 4)));
  2183. }
  2184. TEST(Btree, InsertOrAssignMovableOnly) {
  2185. absl::btree_map<int, MovableOnlyInstance> m;
  2186. using value_type = typename decltype(m)::value_type;
  2187. auto ret = m.insert_or_assign(4, MovableOnlyInstance(4));
  2188. EXPECT_EQ(*ret.first, value_type(4, MovableOnlyInstance(4)));
  2189. EXPECT_TRUE(ret.second);
  2190. ret = m.insert_or_assign(4, MovableOnlyInstance(100));
  2191. EXPECT_EQ(*ret.first, value_type(4, MovableOnlyInstance(100)));
  2192. EXPECT_FALSE(ret.second);
  2193. auto hint_ret = m.insert_or_assign(ret.first, 3, MovableOnlyInstance(200));
  2194. EXPECT_EQ(*hint_ret, value_type(3, MovableOnlyInstance(200)));
  2195. EXPECT_EQ(m.size(), 2);
  2196. }
  2197. TEST(Btree, BitfieldArgument) {
  2198. union {
  2199. int n : 1;
  2200. };
  2201. n = 0;
  2202. absl::btree_map<int, int> m;
  2203. m.erase(n);
  2204. m.count(n);
  2205. m.find(n);
  2206. m.contains(n);
  2207. m.equal_range(n);
  2208. m.insert_or_assign(n, n);
  2209. m.insert_or_assign(m.end(), n, n);
  2210. m.try_emplace(n);
  2211. m.try_emplace(m.end(), n);
  2212. m.at(n);
  2213. m[n];
  2214. }
  2215. TEST(Btree, SetRangeConstructorAndInsertSupportExplicitConversionComparable) {
  2216. const absl::string_view names[] = {"n1", "n2"};
  2217. absl::btree_set<std::string> name_set1{std::begin(names), std::end(names)};
  2218. EXPECT_THAT(name_set1, ElementsAreArray(names));
  2219. absl::btree_set<std::string> name_set2;
  2220. name_set2.insert(std::begin(names), std::end(names));
  2221. EXPECT_THAT(name_set2, ElementsAreArray(names));
  2222. }
  2223. // A type that is explicitly convertible from int and counts constructor calls.
  2224. struct ConstructorCounted {
  2225. explicit ConstructorCounted(int i) : i(i) { ++constructor_calls; }
  2226. bool operator==(int other) const { return i == other; }
  2227. int i;
  2228. static int constructor_calls;
  2229. };
  2230. int ConstructorCounted::constructor_calls = 0;
  2231. struct ConstructorCountedCompare {
  2232. bool operator()(int a, const ConstructorCounted &b) const { return a < b.i; }
  2233. bool operator()(const ConstructorCounted &a, int b) const { return a.i < b; }
  2234. bool operator()(const ConstructorCounted &a,
  2235. const ConstructorCounted &b) const {
  2236. return a.i < b.i;
  2237. }
  2238. using is_transparent = void;
  2239. };
  2240. TEST(Btree,
  2241. SetRangeConstructorAndInsertExplicitConvComparableLimitConstruction) {
  2242. const int i[] = {0, 1, 1};
  2243. ConstructorCounted::constructor_calls = 0;
  2244. absl::btree_set<ConstructorCounted, ConstructorCountedCompare> set{
  2245. std::begin(i), std::end(i)};
  2246. EXPECT_THAT(set, ElementsAre(0, 1));
  2247. EXPECT_EQ(ConstructorCounted::constructor_calls, 2);
  2248. set.insert(std::begin(i), std::end(i));
  2249. EXPECT_THAT(set, ElementsAre(0, 1));
  2250. EXPECT_EQ(ConstructorCounted::constructor_calls, 2);
  2251. }
  2252. TEST(Btree,
  2253. SetRangeConstructorAndInsertSupportExplicitConversionNonComparable) {
  2254. const int i[] = {0, 1};
  2255. absl::btree_set<std::vector<void *>> s1{std::begin(i), std::end(i)};
  2256. EXPECT_THAT(s1, ElementsAre(IsEmpty(), ElementsAre(IsNull())));
  2257. absl::btree_set<std::vector<void *>> s2;
  2258. s2.insert(std::begin(i), std::end(i));
  2259. EXPECT_THAT(s2, ElementsAre(IsEmpty(), ElementsAre(IsNull())));
  2260. }
  2261. // libstdc++ included with GCC 4.9 has a bug in the std::pair constructors that
  2262. // prevents explicit conversions between pair types.
  2263. // We only run this test for the libstdc++ from GCC 7 or newer because we can't
  2264. // reliably check the libstdc++ version prior to that release.
  2265. #if !defined(__GLIBCXX__) || \
  2266. (defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE >= 7)
  2267. TEST(Btree, MapRangeConstructorAndInsertSupportExplicitConversionComparable) {
  2268. const std::pair<absl::string_view, int> names[] = {{"n1", 1}, {"n2", 2}};
  2269. absl::btree_map<std::string, int> name_map1{std::begin(names),
  2270. std::end(names)};
  2271. EXPECT_THAT(name_map1, ElementsAre(Pair("n1", 1), Pair("n2", 2)));
  2272. absl::btree_map<std::string, int> name_map2;
  2273. name_map2.insert(std::begin(names), std::end(names));
  2274. EXPECT_THAT(name_map2, ElementsAre(Pair("n1", 1), Pair("n2", 2)));
  2275. }
  2276. TEST(Btree,
  2277. MapRangeConstructorAndInsertExplicitConvComparableLimitConstruction) {
  2278. const std::pair<int, int> i[] = {{0, 1}, {1, 2}, {1, 3}};
  2279. ConstructorCounted::constructor_calls = 0;
  2280. absl::btree_map<ConstructorCounted, int, ConstructorCountedCompare> map{
  2281. std::begin(i), std::end(i)};
  2282. EXPECT_THAT(map, ElementsAre(Pair(0, 1), Pair(1, 2)));
  2283. EXPECT_EQ(ConstructorCounted::constructor_calls, 2);
  2284. map.insert(std::begin(i), std::end(i));
  2285. EXPECT_THAT(map, ElementsAre(Pair(0, 1), Pair(1, 2)));
  2286. EXPECT_EQ(ConstructorCounted::constructor_calls, 2);
  2287. }
  2288. TEST(Btree,
  2289. MapRangeConstructorAndInsertSupportExplicitConversionNonComparable) {
  2290. const std::pair<int, int> i[] = {{0, 1}, {1, 2}};
  2291. absl::btree_map<std::vector<void *>, int> m1{std::begin(i), std::end(i)};
  2292. EXPECT_THAT(m1,
  2293. ElementsAre(Pair(IsEmpty(), 1), Pair(ElementsAre(IsNull()), 2)));
  2294. absl::btree_map<std::vector<void *>, int> m2;
  2295. m2.insert(std::begin(i), std::end(i));
  2296. EXPECT_THAT(m2,
  2297. ElementsAre(Pair(IsEmpty(), 1), Pair(ElementsAre(IsNull()), 2)));
  2298. }
  2299. TEST(Btree, HeterogeneousTryEmplace) {
  2300. absl::btree_map<std::string, int> m;
  2301. std::string s = "key";
  2302. absl::string_view sv = s;
  2303. m.try_emplace(sv, 1);
  2304. EXPECT_EQ(m[s], 1);
  2305. m.try_emplace(m.end(), sv, 2);
  2306. EXPECT_EQ(m[s], 1);
  2307. }
  2308. TEST(Btree, HeterogeneousOperatorMapped) {
  2309. absl::btree_map<std::string, int> m;
  2310. std::string s = "key";
  2311. absl::string_view sv = s;
  2312. m[sv] = 1;
  2313. EXPECT_EQ(m[s], 1);
  2314. m[sv] = 2;
  2315. EXPECT_EQ(m[s], 2);
  2316. }
  2317. TEST(Btree, HeterogeneousInsertOrAssign) {
  2318. absl::btree_map<std::string, int> m;
  2319. std::string s = "key";
  2320. absl::string_view sv = s;
  2321. m.insert_or_assign(sv, 1);
  2322. EXPECT_EQ(m[s], 1);
  2323. m.insert_or_assign(m.end(), sv, 2);
  2324. EXPECT_EQ(m[s], 2);
  2325. }
  2326. #endif
  2327. // This test requires std::launder for mutable key access in node handles.
  2328. #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606
  2329. TEST(Btree, NodeHandleMutableKeyAccess) {
  2330. {
  2331. absl::btree_map<std::string, std::string> map;
  2332. map["key1"] = "mapped";
  2333. auto nh = map.extract(map.begin());
  2334. nh.key().resize(3);
  2335. map.insert(std::move(nh));
  2336. EXPECT_THAT(map, ElementsAre(Pair("key", "mapped")));
  2337. }
  2338. // Also for multimap.
  2339. {
  2340. absl::btree_multimap<std::string, std::string> map;
  2341. map.emplace("key1", "mapped");
  2342. auto nh = map.extract(map.begin());
  2343. nh.key().resize(3);
  2344. map.insert(std::move(nh));
  2345. EXPECT_THAT(map, ElementsAre(Pair("key", "mapped")));
  2346. }
  2347. }
  2348. #endif
  2349. struct MultiKey {
  2350. int i1;
  2351. int i2;
  2352. };
  2353. bool operator==(const MultiKey a, const MultiKey b) {
  2354. return a.i1 == b.i1 && a.i2 == b.i2;
  2355. }
  2356. // A heterogeneous comparator that has different equivalence classes for
  2357. // different lookup types.
  2358. struct MultiKeyComp {
  2359. using is_transparent = void;
  2360. bool operator()(const MultiKey a, const MultiKey b) const {
  2361. if (a.i1 != b.i1) return a.i1 < b.i1;
  2362. return a.i2 < b.i2;
  2363. }
  2364. bool operator()(const int a, const MultiKey b) const { return a < b.i1; }
  2365. bool operator()(const MultiKey a, const int b) const { return a.i1 < b; }
  2366. };
  2367. // A heterogeneous, three-way comparator that has different equivalence classes
  2368. // for different lookup types.
  2369. struct MultiKeyThreeWayComp {
  2370. using is_transparent = void;
  2371. absl::weak_ordering operator()(const MultiKey a, const MultiKey b) const {
  2372. if (a.i1 < b.i1) return absl::weak_ordering::less;
  2373. if (a.i1 > b.i1) return absl::weak_ordering::greater;
  2374. if (a.i2 < b.i2) return absl::weak_ordering::less;
  2375. if (a.i2 > b.i2) return absl::weak_ordering::greater;
  2376. return absl::weak_ordering::equivalent;
  2377. }
  2378. absl::weak_ordering operator()(const int a, const MultiKey b) const {
  2379. if (a < b.i1) return absl::weak_ordering::less;
  2380. if (a > b.i1) return absl::weak_ordering::greater;
  2381. return absl::weak_ordering::equivalent;
  2382. }
  2383. absl::weak_ordering operator()(const MultiKey a, const int b) const {
  2384. if (a.i1 < b) return absl::weak_ordering::less;
  2385. if (a.i1 > b) return absl::weak_ordering::greater;
  2386. return absl::weak_ordering::equivalent;
  2387. }
  2388. };
  2389. template <typename Compare>
  2390. class BtreeMultiKeyTest : public ::testing::Test {};
  2391. using MultiKeyComps = ::testing::Types<MultiKeyComp, MultiKeyThreeWayComp>;
  2392. TYPED_TEST_SUITE(BtreeMultiKeyTest, MultiKeyComps);
  2393. TYPED_TEST(BtreeMultiKeyTest, EqualRange) {
  2394. absl::btree_set<MultiKey, TypeParam> set;
  2395. for (int i = 0; i < 100; ++i) {
  2396. for (int j = 0; j < 100; ++j) {
  2397. set.insert({i, j});
  2398. }
  2399. }
  2400. for (int i = 0; i < 100; ++i) {
  2401. auto equal_range = set.equal_range(i);
  2402. EXPECT_EQ(equal_range.first->i1, i);
  2403. EXPECT_EQ(equal_range.first->i2, 0) << i;
  2404. EXPECT_EQ(std::distance(equal_range.first, equal_range.second), 100) << i;
  2405. }
  2406. }
  2407. TYPED_TEST(BtreeMultiKeyTest, Extract) {
  2408. absl::btree_set<MultiKey, TypeParam> set;
  2409. for (int i = 0; i < 100; ++i) {
  2410. for (int j = 0; j < 100; ++j) {
  2411. set.insert({i, j});
  2412. }
  2413. }
  2414. for (int i = 0; i < 100; ++i) {
  2415. auto node_handle = set.extract(i);
  2416. EXPECT_EQ(node_handle.value().i1, i);
  2417. EXPECT_EQ(node_handle.value().i2, 0) << i;
  2418. }
  2419. for (int i = 0; i < 100; ++i) {
  2420. auto node_handle = set.extract(i);
  2421. EXPECT_EQ(node_handle.value().i1, i);
  2422. EXPECT_EQ(node_handle.value().i2, 1) << i;
  2423. }
  2424. }
  2425. TYPED_TEST(BtreeMultiKeyTest, Erase) {
  2426. absl::btree_set<MultiKey, TypeParam> set = {
  2427. {1, 1}, {2, 1}, {2, 2}, {3, 1}};
  2428. EXPECT_EQ(set.erase(2), 2);
  2429. EXPECT_THAT(set, ElementsAre(MultiKey{1, 1}, MultiKey{3, 1}));
  2430. }
  2431. TYPED_TEST(BtreeMultiKeyTest, Count) {
  2432. const absl::btree_set<MultiKey, TypeParam> set = {
  2433. {1, 1}, {2, 1}, {2, 2}, {3, 1}};
  2434. EXPECT_EQ(set.count(2), 2);
  2435. }
  2436. TEST(Btree, AllocConstructor) {
  2437. using Alloc = CountingAllocator<int>;
  2438. using Set = absl::btree_set<int, std::less<int>, Alloc>;
  2439. int64_t bytes_used = 0;
  2440. Alloc alloc(&bytes_used);
  2441. Set set(alloc);
  2442. set.insert({1, 2, 3});
  2443. EXPECT_THAT(set, ElementsAre(1, 2, 3));
  2444. EXPECT_GT(bytes_used, set.size() * sizeof(int));
  2445. }
  2446. TEST(Btree, AllocInitializerListConstructor) {
  2447. using Alloc = CountingAllocator<int>;
  2448. using Set = absl::btree_set<int, std::less<int>, Alloc>;
  2449. int64_t bytes_used = 0;
  2450. Alloc alloc(&bytes_used);
  2451. Set set({1, 2, 3}, alloc);
  2452. EXPECT_THAT(set, ElementsAre(1, 2, 3));
  2453. EXPECT_GT(bytes_used, set.size() * sizeof(int));
  2454. }
  2455. TEST(Btree, AllocRangeConstructor) {
  2456. using Alloc = CountingAllocator<int>;
  2457. using Set = absl::btree_set<int, std::less<int>, Alloc>;
  2458. int64_t bytes_used = 0;
  2459. Alloc alloc(&bytes_used);
  2460. std::vector<int> v = {1, 2, 3};
  2461. Set set(v.begin(), v.end(), alloc);
  2462. EXPECT_THAT(set, ElementsAre(1, 2, 3));
  2463. EXPECT_GT(bytes_used, set.size() * sizeof(int));
  2464. }
  2465. TEST(Btree, AllocCopyConstructor) {
  2466. using Alloc = CountingAllocator<int>;
  2467. using Set = absl::btree_set<int, std::less<int>, Alloc>;
  2468. int64_t bytes_used1 = 0;
  2469. Alloc alloc1(&bytes_used1);
  2470. Set set1(alloc1);
  2471. set1.insert({1, 2, 3});
  2472. int64_t bytes_used2 = 0;
  2473. Alloc alloc2(&bytes_used2);
  2474. Set set2(set1, alloc2);
  2475. EXPECT_THAT(set1, ElementsAre(1, 2, 3));
  2476. EXPECT_THAT(set2, ElementsAre(1, 2, 3));
  2477. EXPECT_GT(bytes_used1, set1.size() * sizeof(int));
  2478. EXPECT_EQ(bytes_used1, bytes_used2);
  2479. }
  2480. TEST(Btree, AllocMoveConstructor_SameAlloc) {
  2481. using Alloc = CountingAllocator<int>;
  2482. using Set = absl::btree_set<int, std::less<int>, Alloc>;
  2483. int64_t bytes_used = 0;
  2484. Alloc alloc(&bytes_used);
  2485. Set set1(alloc);
  2486. set1.insert({1, 2, 3});
  2487. const int64_t original_bytes_used = bytes_used;
  2488. EXPECT_GT(original_bytes_used, set1.size() * sizeof(int));
  2489. Set set2(std::move(set1), alloc);
  2490. EXPECT_THAT(set2, ElementsAre(1, 2, 3));
  2491. EXPECT_EQ(bytes_used, original_bytes_used);
  2492. }
  2493. TEST(Btree, AllocMoveConstructor_DifferentAlloc) {
  2494. using Alloc = CountingAllocator<int>;
  2495. using Set = absl::btree_set<int, std::less<int>, Alloc>;
  2496. int64_t bytes_used1 = 0;
  2497. Alloc alloc1(&bytes_used1);
  2498. Set set1(alloc1);
  2499. set1.insert({1, 2, 3});
  2500. const int64_t original_bytes_used = bytes_used1;
  2501. EXPECT_GT(original_bytes_used, set1.size() * sizeof(int));
  2502. int64_t bytes_used2 = 0;
  2503. Alloc alloc2(&bytes_used2);
  2504. Set set2(std::move(set1), alloc2);
  2505. EXPECT_THAT(set2, ElementsAre(1, 2, 3));
  2506. // We didn't free these bytes allocated by `set1` yet.
  2507. EXPECT_EQ(bytes_used1, original_bytes_used);
  2508. EXPECT_EQ(bytes_used2, original_bytes_used);
  2509. }
  2510. bool IntCmp(const int a, const int b) { return a < b; }
  2511. TEST(Btree, SupportsFunctionPtrComparator) {
  2512. absl::btree_set<int, decltype(IntCmp) *> set(IntCmp);
  2513. set.insert({1, 2, 3});
  2514. EXPECT_THAT(set, ElementsAre(1, 2, 3));
  2515. EXPECT_TRUE(set.key_comp()(1, 2));
  2516. EXPECT_TRUE(set.value_comp()(1, 2));
  2517. absl::btree_map<int, int, decltype(IntCmp) *> map(&IntCmp);
  2518. map[1] = 1;
  2519. EXPECT_THAT(map, ElementsAre(Pair(1, 1)));
  2520. EXPECT_TRUE(map.key_comp()(1, 2));
  2521. EXPECT_TRUE(map.value_comp()(std::make_pair(1, 1), std::make_pair(2, 2)));
  2522. }
  2523. template <typename Compare>
  2524. struct TransparentPassThroughComp {
  2525. using is_transparent = void;
  2526. // This will fail compilation if we attempt a comparison that Compare does not
  2527. // support, and the failure will happen inside the function implementation so
  2528. // it can't be avoided by using SFINAE on this comparator.
  2529. template <typename T, typename U>
  2530. bool operator()(const T &lhs, const U &rhs) const {
  2531. return Compare()(lhs, rhs);
  2532. }
  2533. };
  2534. TEST(Btree,
  2535. SupportsTransparentComparatorThatDoesNotImplementAllVisibleOperators) {
  2536. absl::btree_set<MultiKey, TransparentPassThroughComp<MultiKeyComp>> set;
  2537. set.insert(MultiKey{1, 2});
  2538. EXPECT_TRUE(set.contains(1));
  2539. }
  2540. TEST(Btree, ConstructImplicitlyWithUnadaptedComparator) {
  2541. absl::btree_set<MultiKey, MultiKeyComp> set = {{}, MultiKeyComp{}};
  2542. }
  2543. } // namespace
  2544. } // namespace container_internal
  2545. ABSL_NAMESPACE_END
  2546. } // namespace absl