Compare commits

...

545 Commits

Author SHA1 Message Date
6c24c30c42 Update test/CMakeLists.txt 2023-06-25 18:20:36 +03:00
0d2eaa0b21 Add explicit tests for rw_spinlock 2023-06-25 13:05:10 +03:00
6ee93f17e4 [skip ci] updated boost::unordered_(flat|node)_map benchmarks 2023-06-22 19:21:02 +02:00
7e41e08a57 updated boost::concurrent_flat_map benchmarks 2023-06-22 09:02:24 +02:00
7a6c8eca09 Merge pull request #194 from boostorg/fix/extra-semicolon
Remove extraneous semicolons
2023-06-21 15:35:05 -07:00
dce386068b Remove extraneous semicolons 2023-06-21 07:46:53 -07:00
7d39b68e46 Fix -Wsign-conversion issue 2023-06-20 21:36:25 +03:00
79a59bce72 Change the backoff algorithm of rw_spinlock 2023-06-20 21:36:25 +03:00
717048e868 Split Appveyor jobs to avoid timeouts 2023-06-20 17:49:15 +03:00
de8c2a5ad9 Merge pull request #193 from boostorg/feature/proxy-erase
Feature/proxy erase
2023-06-20 11:49:27 +02:00
678f8802f4 [skip ci] updated boost::unordered_[multi]set benchmarks 2023-06-20 09:53:25 +02:00
704b3c7a4b Update docs to describe the returned proxy type as "convertible to iterator" 2023-06-19 14:33:10 -07:00
671b68f4d1 Restart drone CI 2023-06-19 10:45:37 -07:00
b2a4b22c89 Remove erroneous asserts from the test suite
These asserts were erroneously being removed in release builds of the tests which is never the intention
2023-06-19 09:21:48 -07:00
2eebe157fd refactored proxy_erase to reduce template instantiations and strengthen misuse avoidance 2023-06-19 08:21:13 -07:00
2b6cfe4f3c documented proxy erase(iterator) 2023-06-19 08:21:13 -07:00
2f7bba0c21 Implement proxy erase(iterator) 2023-06-19 08:21:13 -07:00
d65d9a65b7 Merge pull request #188 from boostorg/feature/cfoa
Feature/cfoa
2023-06-17 17:25:56 +02:00
67913ed99a re-enabled CI on feature/* branches 2023-06-17 17:21:09 +02:00
0440cd3183 widened previous workaround 2023-06-17 09:37:17 +02:00
3a3148cc16 Add workaround for gcc-5.4 deficiencies in copy elision and new() construction 2023-06-16 14:16:26 -07:00
f51070ab21 Update free function erase_if() to support non-copyable predicates 2023-06-16 14:16:26 -07:00
ac5a99da31 Add max_size() impl 2023-06-15 22:15:57 -07:00
6fed6ea5ad Remove extraneous fwd.hpp include from public facing headers 2023-06-15 22:15:57 -07:00
c51c06492a Update iterator range insert to use emplace() vs insert() to avoid copies in certain cases 2023-06-15 22:15:57 -07:00
f604efe866 Add missing const reference qualifiers to allocator_type constructor parameters 2023-06-15 22:15:57 -07:00
e8ec858313 Refactor type policies used by containers into their own dedicated headers 2023-06-15 22:15:57 -07:00
bc8996559b Remove unnecessary backticks from static_assert() messages 2023-06-15 22:15:57 -07:00
449e1a30d3 Remove outdated reference to proposed synopsis 2023-06-15 22:15:57 -07:00
c2484f05f0 avoided old GCC/Clang hiccup with {} for aggregate copy construction 2023-06-09 21:31:30 +02:00
f7e2132bdb Merge branch 'feature/cfoa' of https://github.com/boostorg/unordered into feature/cfoa 2023-06-09 21:20:36 +02:00
07a8b2b14d stylistic 2023-06-09 08:55:25 -07:00
2eac49f0ed added copy ctor for cache_aligned_size_control 2023-06-09 08:55:25 -07:00
6a8d7857e2 fixed unqualified swap call 2023-06-09 08:55:25 -07:00
ef34ec5e87 added missing #include 2023-06-09 08:55:25 -07:00
518a5d2e1e refactored padding into a clean design 2023-06-09 08:55:25 -07:00
3ea8a768ca added padding between and around ml and size_ 2023-06-09 08:55:25 -07:00
4b877d363a updated concurrent_flat_map benchmarks 2023-06-09 08:55:25 -07:00
2395db7bb9 Cleanup docs 2023-06-09 08:55:25 -07:00
7327053eea updated concurrent_flat_map benchmarks 2023-06-08 09:34:05 +02:00
af19d99b70 Clean up CI to pre-debugging state 2023-06-07 10:05:19 -07:00
64f9370fff implemented cacheline alignment without extended alignas 2023-06-07 11:30:52 +02:00
ca193de243 added missing #include 2023-06-07 11:28:00 +02:00
2914925b4d Explicitly disable ccache in GHA runner file 2023-06-06 09:14:00 -07:00
bc37851725 Remove usage of ccache from problematic gcc-12 sanitizer actions 2023-06-06 08:51:59 -07:00
f89a31849c Fix workaround for cfoa_fwd_tests 2023-06-06 08:27:55 -07:00
ec945810eb Remove problematic test from clang-3.7 runner 2023-06-05 15:56:06 -07:00
68ddaba57a Update cfoa's fwd header to be in line with the others 2023-06-05 15:47:41 -07:00
c48c2afc56 Add gcc-13 and Ubuntu 23.04 to Drone CI 2023-06-05 14:24:38 -07:00
01a5dd0dd1 Add concurrent_flat_map to link tests for foa 2023-06-05 14:19:18 -07:00
300a8e61bd Add ubsan + asan jobs to gcc-12 2023-06-05 11:16:34 -07:00
1d2be664a0 added boost::concurrent_flat_map benchmarks 2023-06-05 20:08:32 +02:00
e6b1ef9e1e Add ubsan gcc-12 runners to drone 2023-06-05 09:32:11 -07:00
4efb55146a Update gcc used for code coverage collection 2023-06-02 15:08:29 -07:00
8877d21237 Replace dependency on SmartPtr with primitives in Core 2023-06-02 14:14:18 -07:00
44c50cd2ea Resolve potential ambiguities during insertion by introducing a member function template 2023-06-01 14:19:14 -07:00
e7c1e1a56e Clean up raii count checkers to avoid extraneous assertions 2023-06-01 14:18:54 -07:00
9a22f8fbee Add missing dependency on SmartPtr 2023-05-31 09:14:44 -07:00
51520de04b Add allocator using fancy pointers to insert_tests 2023-05-31 07:30:37 -07:00
6e0f76f4c2 Add missing FindThreads to CML 2023-05-30 14:52:45 -07:00
06aa4b5c19 Cleanup test CML 2023-05-30 13:24:21 -07:00
332540c857 Attempt to fix CMake tests 2023-05-30 12:05:10 -07:00
fdedb6c957 Add merge exceptions tests for cfoa 2023-05-30 09:19:50 -07:00
7aaa2e9452 polished BOOST_UNORDERED_PREFETCH[_ELEMENTS] 2023-05-28 19:09:14 +02:00
950e640fcf Update concurrent_table to use macro-based prefetching 2023-05-26 21:06:01 -07:00
7874625c08 Replace prefetch_elements() with macro so builtins aren't optimized away by DSE 2023-05-26 20:56:52 -07:00
2ab4225473 Add workaround for gcc-12 and above where the prefetch call is ignored 2023-05-26 08:16:02 -07:00
c5df4ec069 Remove unused test 2023-05-25 08:41:26 -07:00
55d79204be Add exceptions tests for cfoa assign ops 2023-05-24 15:23:09 -07:00
f5d5299b88 Flesh out constructor exception tests 2023-05-24 11:06:45 -07:00
253a9bccf6 fixed leak in throwing allocator-extended move ctor 2023-05-24 09:19:31 +02:00
61f11a58ee Push up failing test case for code review purposes 2023-05-23 15:28:14 -07:00
e78dc311e3 Clean up erase tests 2023-05-23 08:43:10 -07:00
a5748c2e8b Add initial container population to insert iterator range tests 2023-05-22 15:24:36 -07:00
146c5cb6be Clean up exception tests 2023-05-22 14:19:21 -07:00
c63a88032d Loosen restrictions on erase exceptions tests to accomodate runs where there are no successful erasures 2023-05-22 12:10:10 -07:00
3ad164267a Update duration of erase operations to trigger successful erasures when only 2 threads are available 2023-05-22 11:37:07 -07:00
a9203ed93c Clean up erase_tests 2023-05-22 10:17:36 -07:00
16550ded0c Add exceptional erase tests 2023-05-22 10:17:36 -07:00
b4c75abca9 typo 2023-05-22 09:49:00 +02:00
a696bdecf6 editorial 2023-05-21 13:10:46 +02:00
8865a940fc editorial 2023-05-21 12:55:23 +02:00
2a28698c8c editorial 2023-05-21 12:43:45 +02:00
96f5983f88 fixed initializer_list insert requirements 2023-05-21 12:39:02 +02:00
ddb1148a31 reformulated static member initialization to appease VS2015 2023-05-20 12:16:30 +02:00
ffcae204ee Add insert_exception_tests 2023-05-19 12:33:23 -07:00
f28527c4d8 removed double separating line 2023-05-19 11:28:08 +02:00
528f7d4b12 title cased some sections 2023-05-19 11:17:56 +02:00
a140de4254 typos/editorial 2023-05-19 10:51:00 +02:00
f1bc948be8 Update table formatting in intro to use monospaced font 2023-05-18 13:14:58 -07:00
3d640ac032 refactored to modernize and improve flow 2023-05-18 20:18:58 +02:00
ff10b287e2 Remove unreliable check from swap_tests 2023-05-17 13:36:56 -07:00
4a416501c8 Fix misuse of ctad macro 2023-05-17 10:14:45 -07:00
bf06fa97e3 Add deduction guides 2023-05-17 09:38:29 -07:00
fcf6fee0f6 Make usage of forceinline consistent with the underlying concurrent_table 2023-05-16 15:42:47 -07:00
8ddfc8ec7a Update execution policies to accept by forwarding reference 2023-05-16 14:33:41 -07:00
5f249bc681 Add fwd header 2023-05-16 13:31:35 -07:00
dbd1a929e6 Remove unnenecessary spinning 2023-05-16 12:34:50 -07:00
32ff2f145e Add initial draft of equality tests 2023-05-16 11:55:56 -07:00
63026fd320 Clean up tests to avoid needless yields and extraneous spurious wakeups 2023-05-16 09:19:43 -07:00
6295c7f0d4 Add free function erase_if() 2023-05-15 13:40:33 -07:00
c3879e238d Add free function swap() 2023-05-15 07:54:19 -07:00
9260bff8f8 editorial 2023-05-15 10:20:45 +02:00
f48fc70f4b typos/editorial 2023-05-14 11:13:48 +02:00
48f703132e added implementation description for cfoa 2023-05-13 19:29:41 +02:00
69ee0039e0 added implementation rationale for concurrent hashmap 2023-05-13 19:29:08 +02:00
add01e2dfd added compliance section for concurrent hashmap 2023-05-13 19:28:43 +02:00
4b4db3dfb3 fixed links 2023-05-13 10:00:35 +02:00
81480feeb4 fixed regression at unprotected_emplace 2023-05-12 12:45:31 +02:00
d615a08f76 made operator [==|!=] templated again to accommodate fwd declarations 2023-05-12 12:33:27 +02:00
dacc1c8234 made operator[==|!=] non-templated 2023-05-12 11:41:50 +02:00
511e2b3272 refactored to provide equality comparison from table_core 2023-05-12 11:24:20 +02:00
bcf5d0cf13 Attempt to disable extraneous runs on CI 2023-05-11 08:39:29 -07:00
80a1904d92 Fix call_count check in rehash_tests 2023-05-11 08:39:16 -07:00
21afc69894 Add initial tests for rehash(), reserve() 2023-05-10 13:22:02 -07:00
c90b72a643 Squelch gcc self-move warning for version 13 2023-05-09 14:00:14 -07:00
c2c34f96a3 Improve robustness of merge_tests to schedule merges without spurious wakeups and in a wider stride of insertions 2023-05-09 14:00:14 -07:00
69ba1c7c00 editorial 2023-05-09 19:53:56 +02:00
ba25041fc8 added tutorial on boost::concurrent_flat_map 2023-05-08 18:37:36 +02:00
02197674f4 prevented VS C4800 warning 2023-05-06 12:44:07 +02:00
f0fe62d6ab Add count(), contains() 2023-05-05 15:41:23 -07:00
53328766b9 Return size_type instead of size_t 2023-05-05 15:41:08 -07:00
5b775345ba Clean up concurrent_table's merge impl 2023-05-05 11:47:20 -07:00
99b0868283 Add initial impl of merge() 2023-05-05 10:20:52 -07:00
1c98a4a8f1 changed all titles to Title Casing 2023-05-05 18:56:33 +02:00
bf73366117 typo 2023-05-05 17:55:53 +02:00
719394c522 Split important info int separate paragraphs 2023-05-05 17:55:02 +02:00
03fccc1947 refined concurrency requirements and guarantees 2023-05-05 17:37:20 +02:00
814264082f fixed BNF syntax 2023-05-04 19:19:37 +02:00
70e3dc4628 Changed the return type of iterator/initializer_list insert[_or_[c]visit] and merge to size_type 2023-05-04 19:16:39 +02:00
b72dbef1a9 added equality comparison to reference 2023-05-04 18:51:03 +02:00
26924c73b9 fixed space reservation in concurrent_table::operator=(std::initializer_list) 2023-05-04 18:09:28 +02:00
23e720a968 Split up Drone jobs even further due to extended runtimes 2023-05-03 15:32:06 -07:00
4fb7751b55 Add missing #include 2023-05-03 11:37:32 -07:00
3c0fb0fa1b Attempt to fix flaky CI 2023-05-03 11:37:32 -07:00
3fe0807ae9 Add test that intermixes insertion and visitation
Attempt to test the happens-before and synchronizes-with relationship, looking for potential bugs on weakly-ordered models
2023-05-03 11:37:32 -07:00
dfb4f2a28a added reference for boost::concurrent_flat_map 2023-05-03 17:53:13 +02:00
cc4cfc7ef2 Fix bug in swap_test iteration logic that caused early termination of the swap loop 2023-05-02 15:57:16 -07:00
a9bf367d6e Test if being the kind of program that calls yield() pays dividends for flaky CI failures 2023-05-02 15:44:21 -07:00
2ea0dbf30e Add impl of member function swap() 2023-05-02 13:44:27 -07:00
40c4d456f3 Clean up for CI 2023-05-01 15:21:25 -07:00
011b7a5969 Add initial impl of clear 2023-05-01 11:58:58 -07:00
c52ad849ea Add policy check that excludes unsequenced policies
It's technically UB for the callable in an unsequenced policy to acquire a lock so we add static_assert()s to catch potential user error.
2023-05-01 11:58:58 -07:00
615ce1e9b6 refactored unprotected_rehash_if_full out 2023-04-29 11:35:11 +02:00
bee9a3cb1a Split Drone jobs to help with CI timeouts and load 2023-04-28 14:10:58 -07:00
081932221f Attempt to fix flaky assign_tests 2023-04-28 13:42:28 -07:00
135c9586af Add fuzzy test mixing copy-assignment with insertion 2023-04-27 15:23:21 -07:00
187fd3e71e Implement initializer_list assignment 2023-04-27 12:00:42 -07:00
0959df1896 Flesh out move assignment tests 2023-04-27 09:30:49 -07:00
7833a8359d Use Core's allocator access to handle allocator_traits not having uniform support in early C++11 compilers 2023-04-26 13:58:20 -07:00
212c6a1e4d Add prototype of move assignment 2023-04-26 12:54:04 -07:00
d7acb7e8b8 Fix capturing in latch_tests 2023-04-26 12:54:04 -07:00
0bc4f2c4b9 refactored foa::concurrent_table::merge internals 2023-04-26 13:39:38 +02:00
2b612ed120 Flesh out assign_tests 2023-04-25 13:14:08 -07:00
a7c15e86fc Update num_threads to use the concurrent hint from the stdlib 2023-04-25 12:18:15 -07:00
4c117ab20a made merge blocking 2023-04-25 15:53:18 +02:00
e9c6a0fef5 Add polyfill implementation of std::latch 2023-04-24 13:29:35 -07:00
ac216a93c8 Add tests back in 2023-04-24 13:29:07 -07:00
e49fef5f9a commented out all tests except those for cfoa 2023-04-23 17:27:50 +02:00
26ab9ff584 Add prototype copy assignment operator 2023-04-21 15:56:22 -07:00
1e92d9f545 Refactor stateful_allocator to test helpers 2023-04-21 13:33:18 -07:00
2cf72093b1 Update test to spin until the container is non-empty 2023-04-21 10:44:06 -07:00
88d4d64edf Add last remaining constructors 2023-04-21 10:33:21 -07:00
7f7e577e77 polished description 2023-04-21 09:13:28 +02:00
80d7203d78 Add more iterator constructor overloads 2023-04-20 15:35:04 -07:00
5dfed4deec Update thread_runner to block on hand-rolled barrier, add yield points to hash, key_equal 2023-04-20 14:34:01 -07:00
e08f9f11a1 Add more constructors 2023-04-20 12:58:29 -07:00
c304284773 Update tests to use condition variables for work synchronization instead of sleeps 2023-04-20 12:58:29 -07:00
0e8affcc07 [skip ci] editorial 2023-04-20 20:40:10 +02:00
ba00dbd65a Merge branch 'feature/cfoa' of https://github.com/boostorg/unordered into feature/cfoa 2023-04-20 18:50:29 +02:00
c214fb44a3 completed internal code documentation 2023-04-20 18:49:42 +02:00
c704788718 Fix flaky test by starting insertion thread earlier 2023-04-20 09:25:33 -07:00
a91efeb237 refactored size_/ml swap 2023-04-20 17:29:21 +02:00
7812b26d3a Add allocator aware move constructors 2023-04-19 15:18:53 -07:00
8bd07e17c3 Add forced inlining to keep msvc benchmarks on par with raw concurrent_table 2023-04-19 10:52:41 -07:00
b3c0368ab5 Clean up typedef names to avoid conflicts 2023-04-19 09:35:47 -07:00
37edc392a5 Add allocator-aware copy constructor 2023-04-19 09:35:38 -07:00
fb403bc233 Add explicit allocator constructor 2023-04-18 15:36:12 -07:00
910b8de697 Add iterator range + allocator constructor, continue to clean up constructor_tests 2023-04-18 15:11:53 -07:00
3aff995ae0 Clean up constructor_tests 2023-04-18 13:38:24 -07:00
68c018fda6 Clean up usage of decltype to help msvc-14.3 2023-04-18 12:30:34 -07:00
a9ad06139e Add move constructor 2023-04-18 12:00:08 -07:00
9a0e5e9ea8 dispensed with std::array 2023-04-15 12:13:40 +02:00
b1a52d0236 explicitly declared guards' copy ctors as it prevents VS from doing spurious copies (!) 2023-04-15 09:51:01 +02:00
1723358298 refactored to deICE Clang<=3.8 and for clarity 2023-04-14 10:48:26 +02:00
6bf0e93a41 Remove size check as the insertion thread may not have started by the time the check happens 2023-04-13 13:30:56 -07:00
0e5ef25a69 added workaround for GCC<=5 having problems with return {...} syntax 2023-04-13 19:31:20 +02:00
ab84a922cf added workaround for lack of std::is_trivially_copy_assignable in GCC<5.0 2023-04-13 13:00:29 +02:00
d8bc38f154 Clean up tag dispatch for group_type copy assignment 2023-04-12 14:41:36 -07:00
ecd4a82ed5 Add test for select_on_container_copy_construction Allocator requirement 2023-04-12 13:58:01 -07:00
0898219edc Test empty visitation 2023-04-12 12:23:16 -07:00
d9b62d24dc Begin work on constructors 2023-04-12 12:22:59 -07:00
b771278813 Fix copy assignment warning in gcc 2023-04-12 12:22:38 -07:00
2226a7238d adjusted arg constness in erase and erase_if 2023-04-11 16:32:47 +02:00
00c6a93a56 restored invocability static asserts 2023-04-10 11:03:11 +02:00
8ea1cbbd64 s/BOOST_ASSERT/BOOST_TEST to avoid unused var warnings 2023-04-10 10:17:05 +02:00
81a47ca88d updated more tests affected by change in position of f 2023-04-10 09:05:19 +02:00
c54151769f updated insert_or_assign impls to f-last interface 2023-04-09 21:56:12 +02:00
e73d5ecdd1 updated tests affected by change in position of f 2023-04-09 20:41:15 +02:00
8a4e987030 made f the last argument in all *_or_[c]visit functions 2023-04-09 20:20:55 +02:00
8544d9f3c8 Clean up test/Jamfile 2023-04-07 12:40:06 -07:00
ed80cb14e2 Add visit_all() 2023-04-07 12:39:39 -07:00
91eb2ddbd1 Fix sign comparison warning 2023-04-07 12:39:13 -07:00
3bd28dc3d7 Implement basic version of single element visitation 2023-04-06 13:42:57 -07:00
e4d2da40f2 Add missing static_assert()s 2023-04-06 09:36:08 -07:00
a004e71dd0 Implement emplace, emplace_or_[c]visit 2023-04-05 13:21:18 -07:00
ddcab1c171 Add impl of try_emplace, try_emplace_or_[c]visit 2023-04-04 15:16:52 -07:00
e3cbf03f47 Commit missing changes to erase_if() 2023-04-03 14:11:51 -07:00
f8fbbc3b76 Add ExecutionPolicy overload of erase_if 2023-04-03 13:15:15 -07:00
52bf2bf7a2 Add insert_or_cvisit() overloads 2023-04-03 08:14:21 -07:00
cf39fc4c38 Implement transparent erase_if, unary erase_if 2023-04-03 08:14:21 -07:00
1309361a02 Remove erroneous move() calls 2023-04-03 08:14:21 -07:00
946491489e added workaround for lack of std::is_trivially_constructible in GCC<5.0 2023-04-01 12:06:39 +02:00
19202d2a8d avoided memset-related GCC warning 2023-04-01 09:09:22 +02:00
3be466966d avoided copy elision for the initialization of an atomic 2023-03-31 19:46:59 +02:00
d22787c218 use memset for group array initialization only when permissible 2023-03-31 19:36:31 +02:00
b86dee9a18 removed BOOST_UNORDERED_EMBEDDED_GROUP_ACCESS support 2023-03-31 18:52:00 +02:00
863984a7c8 fixed erase_if(x,f) return value calculation 2023-03-31 17:28:21 +02:00
e9b3ad4a5f reverted 2023-03-31 13:07:02 +02:00
e00d700457 experiment with unaligned embedded group 2023-03-31 11:32:29 +02:00
53e20a2a1b Add transparent impl of erase() 2023-03-30 12:41:31 -07:00
af4cdf8fab Shorten "transparent" to "transp" 2023-03-30 12:41:18 -07:00
7003e91d44 Harden erase() tests 2023-03-30 11:43:12 -07:00
e86bb5cce2 stylistic 2023-03-30 14:50:19 +02:00
6a4728add0 removed implementation of scoped_bilock copy ctor 2023-03-30 12:39:10 +02:00
f02afbc815 simplified scoped_bilock impl 2023-03-30 12:13:58 +02:00
6399dfd1e4 made erase_if returned count exact 2023-03-30 10:08:38 +02:00
f468fb77e0 Hopefully fix sign-conversion warnings 2023-03-29 15:55:22 -07:00
5e316ebc88 Add initial draft of erase() 2023-03-29 15:00:54 -07:00
0c90585511 Refactor myriad test helpers into separate file 2023-03-29 15:00:32 -07:00
13b4fd7133 Fix sign-compare warnings 2023-03-29 12:16:09 -07:00
27b4c62bd2 fixed initialization of concurrent_table:🧵counter 2023-03-29 20:35:48 +02:00
846de7ca82 added cvisit overloads to concurrent_table 2023-03-29 19:17:57 +02:00
62cf58d1ca sprinkled some inlines 2023-03-29 18:29:15 +02:00
4482031329 made concurrent_table::thread_counter static 2023-03-29 16:45:15 +02:00
7b1af37b9c Update RAII counters to use unsigned integers instead of signed 2023-03-28 14:37:52 -07:00
1c48f665ea Add alias target for foa container tests 2023-03-28 14:30:29 -07:00
e4072747bb Implement insert_or_visit() 2023-03-28 14:28:42 -07:00
ce674c8007 Add transparent insert_or_assign 2023-03-27 15:06:28 -07:00
45ebc1e555 fixed call ambiguities in insert_or_visit 2023-03-27 13:39:14 +02:00
02c3bd4072 stylistic 2023-03-27 11:32:07 +02:00
5f4172c13f refactored visitation an const-protection of args to visitation functions 2023-03-27 10:17:25 +02:00
40c5c6907a fixed const-casting in erase_if(foa::table&,...) 2023-03-25 18:50:25 +01:00
8dbe380d6c changed predicate arg to an lvalue ref to avoid ADL ambiguities 2023-03-25 17:37:02 +01:00
37ff9de0db fixed remaining errors in erase_if(foa::table&,...) 2023-03-25 17:35:37 +01:00
ae9f35073b avoided sign conversion warning 2023-03-25 17:17:00 +01:00
a85df27d4c fixed previous commit 2023-03-25 12:47:19 +01:00
88c70b885d fixed previous commit 2023-03-25 12:37:10 +01:00
240f5f94b1 moved erase_if_impl from foa::table_core into foa::table 2023-03-25 12:31:49 +01:00
7415721f7d completed shared/exclusive visitation 2023-03-25 12:28:44 +01:00
8b5539756b Partially implement insert_or_assign() 2023-03-24 14:35:01 -07:00
49ac1035bb (partially) implemented shared/exclusive visitation 2023-03-24 19:49:59 +01:00
d085c40541 relaxed all ops of atomic_integral 2023-03-24 18:37:53 +01:00
99d5b9b1bb Avoid unsupported typedef on earlier compilers 2023-03-24 08:57:51 -07:00
ad86f9211b Flesh out tests for insertion 2023-03-23 10:59:50 -07:00
d9515fdc2f Add insert(initializer_list) 2023-03-23 10:59:50 -07:00
eedbc6bcf7 Add missing stdlib= to drone.sh 2023-03-23 10:59:50 -07:00
297fb2e8c4 abode by TSan on Neon 2023-03-23 09:41:36 +01:00
99eab2dfb1 Fix missing quotes in jsonnet file 2023-03-22 15:14:16 -07:00
1070c9b69e Attempt to add tsan to Drone CI 2023-03-22 15:11:55 -07:00
9e6b5a7e43 Add tsan OSX job 2023-03-22 15:07:36 -07:00
e1f11e840c update clang tsan job to use libc++ 2023-03-22 13:55:42 -07:00
f2d4f1968b Explicitly add B2_TARGETS to script invocation 2023-03-22 12:49:05 -07:00
4a7116b996 partially restored prior commit to nail down problem with Clang x86 2023-03-22 20:16:09 +01:00
41584e73d9 partially reverted prior commit to nail down problem with Clang x86 2023-03-22 20:09:53 +01:00
52453cb5a4 Merge branch 'feature/cfoa' of https://github.com/boostorg/unordered into feature/cfoa 2023-03-22 19:25:10 +01:00
44b918896d tried relaxing atomic operations 2023-03-22 19:24:46 +01:00
ff356ac083 Fix typo in GHA ci.yml 2023-03-22 11:20:03 -07:00
3064801a89 Attempt to add tsan to GHA 2023-03-22 11:19:13 -07:00
e9d9f19e76 Flesh out insert_tests 2023-03-22 10:47:01 -07:00
9b85c38e37 Add rehash, add missing move in insert() 2023-03-22 10:46:19 -07:00
0b2829c793 hardened TSan detection 2023-03-21 20:03:35 +01:00
a9c2d1daa5 abode by TSan on SSE2 2023-03-21 19:41:55 +01:00
d29815b3a8 group-synchronized earlier in unprotected_norehash_emplace_or_visit 2023-03-21 14:47:43 +01:00
7ed7878278 fixed 3df435d4d3 fix 2023-03-21 11:50:21 +01:00
4c927cd2f2 Implement myriad insert() overloads, get first threaded test working 2023-03-20 16:00:54 -07:00
2fae05ed31 made concurrent_table use table_core's automatic capacity growth formula 2023-03-20 12:43:57 -07:00
41abb96d83 avoided sign conversion warning 2023-03-20 12:43:57 -07:00
63f51e7c41 fixed concurrent_table_arrays::delete_ 2023-03-20 12:43:57 -07:00
ba4f321934 removed unused typedef 2023-03-20 12:43:57 -07:00
68563fab72 removed unused typedef 2023-03-20 12:43:57 -07:00
d8e9503869 made table_arrays non-aggregate for the benefit of older compilers 2023-03-20 12:43:57 -07:00
86e998cbc7 fixed UB in dummy_group_accesses 2023-03-20 12:43:57 -07:00
ce722e4d56 avoided shadowing 2023-03-20 12:43:57 -07:00
77eaab4803 provided concurrent_table_arrays ctor to satisfy older compilers 2023-03-20 12:43:57 -07:00
96562f4c3b hardened non-embedded group_access 2023-03-20 12:43:57 -07:00
d66ceaf7fe avoided std::atomic_* aliases 2023-03-20 12:43:57 -07:00
2e44769247 added preliminary version of non-embedded group_access 2023-03-20 12:43:57 -07:00
e64fd45760 removed inefficient group15::match_really_occupied 2023-03-20 12:43:57 -07:00
454fc7501e extended shutting down VS C4324 warning 2023-03-20 12:43:57 -07:00
a89c62728a removed unnecessary mutable 2023-03-20 12:43:57 -07:00
1d8c0f91f8 avoided name hiding 2023-03-20 12:43:57 -07:00
25ba8e4dfc shut down VS C4324 warning 2023-03-20 12:43:57 -07:00
fb4437219f fixed memory ordering in atomic_integral 2023-03-20 12:43:57 -07:00
0d1fdae84c implemented safe concurrent_table::load_factor 2023-03-20 12:43:57 -07:00
c5debf11cf added explicit disabling/enabling of parallel algorithms 2023-03-20 12:43:57 -07:00
9e4f89aa43 Continue fleshing out insert_tests 2023-03-20 12:43:57 -07:00
12935eb695 Add minimal prototype of concurrent_flat_map 2023-03-20 12:43:57 -07:00
2386188d69 Relocate macros needed by test suite into detail/fwd.hpp 2023-03-20 12:43:57 -07:00
e4b32f7f5e Update rw_spinlock impl to mirror github.com/pdimov's impl 2023-03-20 12:43:57 -07:00
3df435d4d3 Temporarily suppress warning about memset'ing non-trivial types by using a constructor loop 2023-03-20 12:43:57 -07:00
ed076facc4 Stabilize ABI of cacheline_protected by hardcoding its alignment to 64 2023-03-20 12:43:57 -07:00
b09c5bdcf0 Add missing <execution> header 2023-03-20 12:43:57 -07:00
6abb94bb68 Silence unused variable warnings in for_all_elements_exec 2023-03-20 12:43:57 -07:00
d2b1f095c8 Update atomic_uint nsdmi to eschew potentially deleted copy constructor 2023-03-20 12:43:57 -07:00
3d34571654 tried yest another variation for for_all_elements_while 2023-03-20 12:43:57 -07:00
d683b3ac3e disabled use of match_really_occupied in for_all_elements_while 2023-03-20 12:43:57 -07:00
e16a8737f4 shut down GCC Winterference-size 2023-03-20 12:43:57 -07:00
8f348aea26 temporarily disabled parallel algorithms 2023-03-20 12:43:57 -07:00
9a8ba2bdff re-enabled match_really_occupied in for_all_elements_while 2023-03-20 12:43:57 -07:00
3aaefdcc78 completed concurrent_table's API 2023-03-20 12:43:57 -07:00
ca59ed8c50 avoided usage of match_really_occupied on for_all_elements_while (used by rehash) 2023-03-20 12:43:57 -07:00
ff78ef25c0 removed unnecessary forwards and captures 2023-03-20 12:43:57 -07:00
ec487b5c6c stylistic 2023-03-20 12:43:57 -07:00
0a03ed8170 weakened atomic_integral ops, fixed some trivial bugs 2023-03-20 12:43:57 -07:00
5881dcc2b2 done reverse unlock in multimutex 2023-03-20 12:43:57 -07:00
2070cbe2cc fixed regression in table_core(table_core&&) 2023-03-20 12:43:57 -07:00
8198b9c57c dropped erroneous call to user-provided f 2023-03-20 12:43:57 -07:00
c35e9fc631 made slot setting on insertion exception safe 2023-03-20 12:43:57 -07:00
f244ba55de switched from available to size_ 2023-03-20 12:43:57 -07:00
5e225fe46c micro-optimized reserve_available 2023-03-20 12:43:57 -07:00
06535e518e uploaded first draft of foa::concurrent_table 2023-03-20 12:43:57 -07:00
81584c22cf swapped member order in alloc_cted_insert_type to suppress padding warnings 2023-03-20 12:43:57 -07:00
83040211e8 recovered warninng supression pragmas 2023-03-20 12:43:56 -07:00
4ed301df97 refactored insert_type creation in emplace 2023-03-20 12:43:56 -07:00
8010f506a6 added SizeImpl and fixed some size arithmetic bugs 2023-03-20 12:43:56 -07:00
840ea1ce5c refactored some more for future concurrent_table 2023-03-20 12:43:56 -07:00
447306bfb9 stylistic 2023-03-20 12:43:56 -07:00
4569c1bec0 changed type of N to std::size_t 2023-03-20 12:43:56 -07:00
37ad547e18 more fixed sign issues in Neon ops 2023-03-20 12:43:56 -07:00
e037ee8d82 fixed syntax error 2023-03-20 12:43:56 -07:00
9bbadfdb34 fixed sign issues in Neon ops 2023-03-20 12:43:56 -07:00
c1b63f68c8 added missing op to plain_integral 2023-03-20 12:43:56 -07:00
0590e3bf8c typo 2023-03-20 12:43:56 -07:00
8f17f5f548 fixed static_assert 2023-03-20 12:43:56 -07:00
3a8bea9e1d parameterized group15 and core 2023-03-20 12:43:56 -07:00
b33b354818 extended caae8eb9ac9a47dd224b81f22efe8ea34b084d54 to rest of "using typename"s 2023-03-20 12:43:56 -07:00
b08837b93e added missing template keyword 2023-03-20 12:43:56 -07:00
b3b840df30 extended Wshadow supression to foa::table 2023-03-20 12:43:56 -07:00
2ef47f0813 reformulated using to workaround VS problem 2023-03-20 12:43:56 -07:00
27f5513911 published max_load_factor 2023-03-20 12:43:56 -07:00
a5100a9d35 fixed incomplete porting of PR187 2023-03-20 12:43:56 -07:00
ccbc639677 made table_core protected interface public 2023-03-20 12:43:56 -07:00
18725a682d fixed previous fix 2023-03-20 12:43:56 -07:00
dac1135199 fixed usage syntax for destroy_on_exit 2023-03-20 12:43:56 -07:00
ead55a8938 s/noexcept(...)/noexcept(noexcept(...)) 2023-03-20 12:43:56 -07:00
8f39001ff0 fixed trivial syntax error 2023-03-20 12:43:56 -07:00
8b056b902e split foa::table in table and core in preparation for foa::concurrent_table 2023-03-20 12:43:56 -07:00
5724adbbe9 Merge pull request #187 from boostorg/feature/foa_fast_iteration
Feature/foa fast iteration
2023-03-20 12:43:29 -07:00
1c5640cfbe s/BOOST_UNORDERED_ASSUME/BOOST_ASSERT 2023-03-08 19:12:46 +01:00
4d982e133e added is-not-end assumption on table_iterator::increment 2023-03-08 18:29:55 +01:00
1bf193b8fc updated release notes 2023-03-06 21:46:42 +01:00
7faec20f26 Merge branch 'feature/foa_fast_iteration' of https://github.com/boostorg/unordered into feature/foa_fast_iteration 2023-03-06 21:44:55 +01:00
ced8b45add fixed UB with begin when using fast iteration 2023-03-06 12:44:10 -08:00
15c9bc40f7 added fast table_iterator::increment variant for regular-layout groups 2023-03-06 12:44:10 -08:00
9aedb95296 Merge pull request #185 from boostorg/fix/uses-allocator 2023-03-06 21:38:13 +01:00
e56cb4418c Remove extraneous information from TypePolicy's construct, destroy docs 2023-03-06 09:48:26 -08:00
1ae21c6d1a Remove extraneous typedef from destroy_on_exit 2023-03-06 09:47:33 -08:00
82acad3794 Increase GHA timeout to 180 minutes 2023-03-06 17:04:06 +02:00
c50461528c fixed UB with begin when using fast iteration 2023-03-06 13:50:25 +01:00
bd08e49255 added fast table_iterator::increment variant for regular-layout groups 2023-03-06 11:56:49 +01:00
dbba3cec7b Add C++03 deprecation notice 2023-03-06 09:43:45 +02:00
6c5b5b3186 Update comments on type policy to include changes to construct, destroy and move 2023-03-03 11:33:32 -08:00
47dd02a4b3 Add bugfix notes to release notes 2023-03-03 11:18:41 -08:00
8429d1a6aa Refactor node_handle to directly store element_type by modularizing and extending it 2023-03-03 11:17:38 -08:00
86d3f9f632 Refactor move(init_type&) to handle defects in C++20 versions of libstdc++ for gcc versions <=12 2023-03-03 11:17:38 -08:00
48e92afd92 Refactor drop_guard into destroy_on_exit 2023-03-03 11:17:38 -08:00
5a5c31de35 Rename storage to uninitialized_storage 2023-03-03 11:17:38 -08:00
088941dc7b Clean up usage of Allocators for flat containers 2023-03-03 11:17:38 -08:00
5f6f1691e5 Format node_map 2023-03-03 11:17:38 -08:00
45d6c07be6 Update emplace() to no longer needlessly rebind its allocator 2023-03-03 11:17:38 -08:00
5c63cd2bdb Update drone to run using the same branches as listed in GHA's ci.yml 2023-03-03 11:17:38 -08:00
86318c1e88 Update foa to construct stack-locals with the user's Allocator during emplace() 2023-03-03 11:17:38 -08:00
0ff1fa0f6e Add test that ensures proper uses-allocator construction is followed 2023-03-03 11:17:38 -08:00
d90bf0c438 Merge pull request #186 from boostorg/cxx03-deprecation
Update changelog to reflect planned C++03 deprecation
2023-03-01 09:53:24 -08:00
dc63438e22 Add missing end-of-list marker to compliance section 2023-03-01 09:37:49 -08:00
0a3ac26f00 Update changelog to reflect planned C++03 deprecation 2023-02-28 15:44:44 -08:00
c64ed1caa3 Feature/SIMD config (#184)
* added BOOST_UNORDERED_[ENABLE|DISABLE]_[SSE2|LITTLE_ENDIAN_NEON]
* renamed and refactored
* removed #undefs of SIMD usage macros
2023-02-26 16:39:50 +01:00
efc33b18be Merge pull request #182 from boostorg/feature/unordered_node_map_docs
Feature/unordered node map docs
2023-02-25 10:20:05 +01:00
c189d8d5e8 updated boost::unordered_(flat|node)_map benchmarks 2023-02-25 10:03:10 +01:00
886227db3b updated link to P2363 2023-02-24 09:58:51 +01:00
719eb90d03 fixed copy&paste error 2023-02-24 08:59:45 +01:00
fadb686bc5 added boost::unordered_node_map to benchmarks 2023-02-23 20:17:01 +01:00
aebefaef0d Merge pull request #183 from boostorg/unordered_node_map_rc
Node Map Release Candidate
2023-02-22 08:39:59 -08:00
63a564e8ff Update foa comments for changes in TypePolicy 2023-02-21 11:12:33 -08:00
16c1593368 Remove extraneous copy constructor from flat set's type policy 2023-02-21 07:53:09 -08:00
53580a3070 Fix bug in hint-based overload for node_type insertion where elements were erroneously reallocated 2023-02-19 21:26:06 -08:00
d26aeed68f Update node_handle tests to cover address stability for inserted nodes when using the hint-based overloads 2023-02-19 21:26:06 -08:00
73eefd2b5d Rename Node{X}Types to TypePolicy in node-based foa containers 2023-02-19 21:26:06 -08:00
3df600d069 Remove extraneous construct() overloads from the flat foa-based containers 2023-02-19 21:26:06 -08:00
a1adacdfe2 Refactor erase_on_exit to use a const_iterator so callsites can avoid a const cast 2023-02-19 21:26:06 -08:00
f405fa9118 Rename foa's emplace_dispatch to emplace_value 2023-02-19 21:26:06 -08:00
7b5d6e7c29 Fix typos in code comments in foa 2023-02-19 21:26:06 -08:00
7d0ba7178e Clean up naming in delete_ impl to use storage_traits for foa 2023-02-19 21:26:06 -08:00
df5e2c3aca Remove extraneous commented out code from foa 2023-02-19 21:26:06 -08:00
343e344582 Reify implementation of node_handle's swap 2023-02-19 21:26:06 -08:00
34ed463bea Reify implementation of node_handle's move assignment operator 2023-02-19 21:26:06 -08:00
5986f75d16 Refactor node_handle's clear() member function to reset() 2023-02-19 21:26:06 -08:00
b08810c0c4 Add missing copyright notice to foa.hpp 2023-02-19 21:26:06 -08:00
7c608ae7bc Include missing extract tests in transparent_tests 2023-02-19 21:25:25 -08:00
d51cee35d5 updated open-addressing benchmark info 2023-02-18 12:31:26 +01:00
d0289b4c7b editorial 2023-02-18 12:13:14 +01:00
bc7ba9cb3b Implement internal foa updates + node_handle for node-based containers 2023-02-14 10:55:35 -08:00
6b10c8a4d3 Update unordered_flat_map for new type traits 2023-02-14 10:55:35 -08:00
b9805c7309 Update unordered_flat_set for new type traits 2023-02-14 10:55:35 -08:00
844460fd22 Add unordered_node_map 2023-02-14 10:55:35 -08:00
a600278d27 Add unordered_node_set 2023-02-14 10:55:35 -08:00
4398ffe8c9 Add foa-based node containers to node_handle_tests 2023-02-14 10:55:35 -08:00
eed1eeedeb Add foa-based node containers to extract_tests 2023-02-14 10:55:35 -08:00
8c0c230f78 Add foa-based node containers to the exception tests 2023-02-14 10:55:35 -08:00
e96ec1e79a Add foa-based node containers to transparent_tests 2023-02-14 10:55:35 -08:00
be7dd51fab Add foa-based node containers to swap_tests 2023-02-14 10:55:35 -08:00
4dec95840b Add foa-based node containers to simple_tests 2023-02-14 10:55:35 -08:00
d44fb36581 Add foa-based node containers to scoped_allocator tests 2023-02-14 10:55:35 -08:00
9d3bbe27db Add foa-based node containers to scary_tests 2023-02-14 10:55:35 -08:00
13ed4afc95 Add foa-based node containers to reserve_tests 2023-02-14 10:55:35 -08:00
b3f54e74a7 Add foa-based node containers to rehash_tests 2023-02-14 10:55:35 -08:00
d6374e2718 Add foa-based node containers to post_move_tests 2023-02-14 10:55:35 -08:00
74156b6b06 Add foa-based node containers to noexcept_tests 2023-02-14 10:55:35 -08:00
965048d3e6 Add foa-based node containers to move_tests 2023-02-14 10:55:35 -08:00
36dfe6b98b Add foa-based node containers to merge_tests 2023-02-14 10:55:35 -08:00
e4e89bdbde Add foa-based node containers to max_load_tests 2023-02-14 10:55:35 -08:00
85a9d8d81d Add foa-based node containers to load_factor_tests 2023-02-14 10:55:35 -08:00
b21ad13bbb Add foa-based node containers to link tests 2023-02-14 10:55:35 -08:00
f0d10308e3 Add foa-based node containers to insert_tests 2023-02-14 10:55:35 -08:00
f240e587cb Add foa-based node containers to insert_hint_tests 2023-02-14 10:55:35 -08:00
2a7dc9e40e Add foa-based node containers to init_type_insert_tests 2023-02-14 10:55:35 -08:00
99b8d0063b Add foa-based node containers to incomplete_test 2023-02-14 10:55:35 -08:00
c6aff9278a Add foa-based node containers to fwd_set_test 2023-02-14 10:55:35 -08:00
129497133e Add foa-based node containers to fwd_map_test 2023-02-14 10:55:35 -08:00
eaa9ff0cec Add foa-based node containers to find_tests 2023-02-14 10:55:35 -08:00
fa735864a3 Add foa-based node containers to erase_tests 2023-02-14 10:55:35 -08:00
0ce180e19b Add foa-based node containers to erase_if tests 2023-02-14 10:55:35 -08:00
e578b7eee3 Add foa-based node containers to equivalent_keys_tests 2023-02-14 10:55:35 -08:00
1844695b0c Add foa-based node containers to equality_tests 2023-02-14 10:55:35 -08:00
54b9adbdbc Add foa-based node containers to emplace_tests 2023-02-14 10:55:35 -08:00
8b71656cd7 Add foa-based node containers to copy_tests 2023-02-14 10:55:35 -08:00
a858ef5688 Add foa-based node containers to contains_tests 2023-02-14 10:55:35 -08:00
18395c8d21 Add foa-based node containers to constructor_tests 2023-02-14 10:55:35 -08:00
e68ec5c9a9 Add foa-based node containers to compile_set tests 2023-02-14 10:55:35 -08:00
d3b264345d Add foa-based node containers to compile_map tests 2023-02-14 10:55:35 -08:00
f1e1733c06 Add foa-based node containers to at_tests 2023-02-14 10:55:35 -08:00
66ffbdb881 Add foa-based node containers to assign_tests 2023-02-14 10:55:35 -08:00
f7f5466ed2 Add necessary #include's and typedefs for test suite to use foa-based node containers 2023-02-14 10:55:35 -08:00
83410fcabe Add -Wunused-template to tests run with the clang-14 toolset 2023-02-14 10:55:35 -08:00
1ee91d494d Fix bug in impl of test::exception::less::operator() 2023-02-14 10:55:35 -08:00
e8fe550d6c Add less_tests to track bug in test::exception::less::operator() impl 2023-02-14 10:55:35 -08:00
5b0fe7f655 Update test::compare_range to use BOOST_TEST_ALL_WITH 2023-02-14 10:55:35 -08:00
ba439437bf Add osx 12 to gha ci matrix 2023-02-14 10:55:35 -08:00
aa6eef135e editorial 2023-02-13 18:40:36 +01:00
1dd085daaa added unordered_node_[map|set] containers to the tutorial 2023-02-13 13:29:52 +01:00
2a8f50bcb7 added reference for unordered_node_set 2023-02-12 18:32:26 +01:00
866c58a879 typo 2023-02-12 17:35:02 +01:00
c9a75a56c2 added reference for unordered_node_map 2023-02-11 13:23:34 +01:00
e1861aa3d9 updated copyright notes 2023-02-11 13:23:12 +01:00
242c7cb93a updated release notes 2023-02-11 13:22:55 +01:00
0597463902 Merge pull request #181 from boostorg/feature/mulx_docs
Documented the new mulx-based mixing algorithm
2023-02-09 09:06:51 +01:00
14d80725eb documented the new mulx-based mixing algorithm 2023-02-08 20:07:23 +01:00
a74962bc3c Revert reversion of 32 bit mulx multiplier 2023-01-30 20:03:01 +02:00
cafa1f2278 Revert "Update mulx multipliers"
This reverts commit 9bc471310e.
2023-01-30 10:17:12 +02:00
40d5097d99 fixed sign-conversion warning in Neon group15::match 2023-01-28 10:27:40 +01:00
958aea3a61 Merge branch 'develop' into feature/mulx 2023-01-27 22:03:03 +02:00
6846eb53fd Change architecture of macOS 12.4 job to arm64 2023-01-27 21:24:28 +02:00
3b3ba7d6f7 Avoid false -Warray-bounds positive under mingw32 gcc-12 2023-01-27 20:35:14 +02:00
22135bd845 Merge branch 'develop' into feature/mulx 2023-01-27 18:39:46 +02:00
141550f585 Update cmake_subdir_test 2023-01-27 18:39:06 +02:00
d750b39e1e Fix /RTCc failure in mulx32 2023-01-27 18:37:23 +02:00
055587acf4 Update cmake_subdir_test 2023-01-27 17:56:00 +02:00
0f8dd003a3 Switch default mixing policy from xmx to mulx 2023-01-27 08:15:37 +02:00
9bc471310e Update mulx multipliers 2023-01-27 08:00:40 +02:00
e56aac2e98 Merge branch 'develop' into feature/mulx 2023-01-27 07:58:45 +02:00
09a3275357 Add /doc/pdf/ to .gitignore 2023-01-12 01:35:35 +02:00
a3c1e643dc Merge pull request #177 from cmazakas/feature/p2363
Feature/p2363
2022-12-20 10:55:20 -08:00
955f94350b typo 2022-12-20 16:46:08 +01:00
1955e4f36a fixed constraint notes in transparent insert with hint 2022-12-20 11:35:15 +01:00
644295db3a added release notes for feature/p2363 2022-12-19 13:24:04 -08:00
0391b6dafc documented P2363 overloads for unordered_flat_set 2022-12-19 13:24:04 -08:00
c646f3e3ca documented P2363 overloads for unordered_flat_map 2022-12-19 13:24:04 -08:00
0e9523a0a4 documented P2363 overloads for unordered_multiset 2022-12-19 13:24:04 -08:00
24d8449831 documented P2363 overloads for unordered_set 2022-12-19 13:24:04 -08:00
59d0accce0 documented P2363 overloads for unordered/unordered_multimap 2022-12-19 12:46:46 -08:00
61aedca940 documented P2363 overloads for unordered_map 2022-12-19 12:46:46 -08:00
3fb516367f Add transparent try_emplace() docs to unordered_map 2022-12-19 12:46:46 -08:00
7d77f1d478 Add transparent insert() overloads to unordered_[flat]_set 2022-12-19 12:46:46 -08:00
7572de875c Add transparent insert tests for set containers 2022-12-19 12:46:46 -08:00
63d907cde7 Merge pull request #174 from boostorg/feature/pr165_refactor
feature/pr165 refactor
2022-12-15 10:45:10 -08:00
f0037d336d added narrow_cast 2022-12-14 10:39:32 -08:00
8b14b7cddc Add tests for narrow_cast 2022-12-14 10:39:32 -08:00
6c60524fb7 Implement transparent bucket() 2022-12-13 14:28:19 -08:00
8b1dcd3da3 Add tests for transparent bucket() 2022-12-13 14:28:19 -08:00
0e980577b0 Add transparent at() 2022-12-13 14:28:19 -08:00
1f4244ec27 Add tests for transparent at() 2022-12-13 14:28:19 -08:00
dfbff823a9 Add transparent subscript 2022-12-13 14:28:19 -08:00
b85e17085f Add tests for transparent subscript operator 2022-12-13 14:28:19 -08:00
0a879c1063 Implement transparent insert_or_assign() 2022-12-13 14:28:19 -08:00
01d508b6af Improve naming in insert_or_assign() 2022-12-13 14:28:19 -08:00
7709950111 Add transparent insert_or_assign() tests 2022-12-13 14:28:19 -08:00
1ede59e662 Improve naming in are_transparent 2022-12-13 14:28:19 -08:00
bf2b521789 Add transparent try_emplace() 2022-12-13 14:28:19 -08:00
ee1515189b Add transparent tests for unordered_map's try_emplace() 2022-12-13 14:28:19 -08:00
eb33ad3e3f Merge pull request #173 from cmazakas/fix/exception-guarantees
Exception Guarantees
2022-12-13 14:22:29 -08:00
0ad6ccb0b9 Update FOA noexcept docs for move assignment, swap 2022-12-13 13:53:29 -08:00
0ab4e12502 Update noexcept tests for new FOA requirements 2022-12-13 13:53:29 -08:00
c8910e8007 Update FOA move assignment operator to uphold the strong guarantee for Hash, KeyEqual 2022-12-13 13:53:29 -08:00
2043f98593 Add strong exception guarantees around Hash, KeyEqual for move_assign_exception_tests 2022-12-13 13:53:29 -08:00
260b573d8d Update FOA implementation to exhibit strong guarantee for Hash, KeyEqual in copy assignment 2022-12-13 13:53:29 -08:00
4ac3dcc90c Update assign_exception_tests to assert strong guarantee around Hash, KeyEqual pairing 2022-12-13 13:53:29 -08:00
75ea43823e Update test Hash, KeyEqual to be nothrow swappable 2022-12-13 13:53:29 -08:00
b1d43d3ca5 Update FOA containers to require nothrow swappability of Hash, KeyEqual members and ensure that throwing assertions uphold strong guarantee 2022-12-13 13:53:29 -08:00
534170a942 Remove foa-related macro used for relaxing invariant checking in check_equivalent_keys 2022-12-13 13:53:29 -08:00
7befee3bd6 Update swap_exception_tests to exclude FOA containers and add test for throwing asserts when comparing allocators 2022-12-13 13:53:29 -08:00
01deb2fd61 Merge pull request #176 from boostorg/feature/foa_fast_copy_fix
feature/foa fast copy fix
2022-12-13 13:52:59 -08:00
91eddbabe8 restricted memcpy to allocators known to not have fancy construct() 2022-12-13 09:35:28 -08:00
47e205487d Fix potential integer overflow in test::hash<int> 2022-12-13 09:35:28 -08:00
2c1c99407e Update copy_tests to test a trivially copyable value_type with an Allocator with defined construct() 2022-12-13 09:35:28 -08:00
6be2bf89b6 Merge pull request #175 from boostorg/feature/optimized_try_emplace
feature/optimized_try_emplace
2022-12-13 09:24:56 +01:00
5eda445db0 optimized try_emplace and extended it for future use in boost::unordered_flat_set heterogeneous insert 2022-12-11 18:49:21 +01:00
63f07daa88 Merge pull request #172 from boostorg/feature/foa_fast_copy
feature/foa fast copy
2022-12-09 10:05:54 -08:00
7040c57750 Add mulx_mix 2022-12-08 21:43:57 +02:00
9716731864 Disable benchmark/uint64.cpp under libstdc++ 32 bit 2022-12-03 15:37:22 +02:00
0bcd46a485 Use enwik8 instead of enwik9 in benchmarks under 32 bit 2022-12-03 15:32:04 +02:00
46a2cd109f Define _SILENCE_CXX20_CISO646_REMOVED_WARNING in benchmarks 2022-12-01 01:34:00 +02:00
808f8e659a Remove tsl maps from benchmarks 2022-12-01 01:30:54 +02:00
8ed05de91c Add ankerl::unordered_dense::map to benchmarks 2022-12-01 00:50:29 +02:00
1a02fca5c4 Add benchmark/.gitignore 2022-11-29 18:14:52 +02:00
d036994237 Merge pull request #165 from cmazakas/fix/msvc-rtc
Add msvc RTC to select test targets
2022-11-28 09:09:14 -08:00
8d4816eac7 Merge pull request #170 from boostorg/feature/foa_data_structure_docs
added data structure docs
2022-11-28 08:45:05 -08:00
46fc4f9f4d typos 2022-11-28 17:42:13 +01:00
725993ab95 typo 2022-11-28 17:37:13 +01:00
ffa5e6f805 typos 2022-11-27 19:39:07 +01:00
84206ebf8f Add test_contains, test_count to benchmark/word_count.cpp 2022-11-25 19:05:28 +02:00
0398afae9b Add BOOST_FORCEINLINE to unordered_flat_set::contains, unordered_flat_map::contains. Refs #168. 2022-11-25 18:01:39 +02:00
79dc3bb6d4 Add BOOST_FORCEINLINE to unordered_flat_set::count, unordered_flat_map::count 2022-11-25 17:57:06 +02:00
879de5fab8 Add BOOST_FORCEINLINE to unordered_flat_map::operator[] 2022-11-25 17:50:05 +02:00
89ccb49165 Add an iteration step to benchmark/word_size.cpp 2022-11-25 02:05:50 +02:00
70a980a980 Add word size count benchmark 2022-11-25 01:49:11 +02:00
c895dd7192 Add word count benchmark 2022-11-25 01:28:25 +02:00
ea71597053 Remove multi_index from benchmarks 2022-11-25 00:52:31 +02:00
324fa793fd expanded 1.81 release notes 2022-11-24 20:06:18 +01:00
39d53a0bfc added "Open Addressing Implementation" section 2022-11-24 20:06:05 +01:00
20ea4a77a7 Add RTC msvc jobs to GHA CI 2022-11-22 10:33:32 -08:00
53a897008a Add conditional masking to silence msvc RTC failures 2022-11-22 10:26:08 -08:00
1d99854979 worked around missing std::is_trivially_copy_constructible in GCC<=4.9 2022-11-07 17:41:47 +01:00
5a4071d4f0 silenced bogus CGG warning 2022-11-07 13:47:43 +01:00
c30e93544d implemented copy_elements_from with fast branch, introduced for_all_elements_while 2022-11-07 12:31:26 +01:00
270 changed files with 25514 additions and 3137 deletions

View File

@ -40,87 +40,152 @@ environment:
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
B2_TOOLSET: msvc-12.0,msvc-14.0
- FLAVOR: Visual Studio 2017
- FLAVOR: Visual Studio 2017, C++14
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
B2_CXXSTD: 14,17
B2_CXXSTD: 14
B2_TOOLSET: msvc-14.1
- FLAVOR: Visual Studio 2017
- FLAVOR: Visual Studio 2017, C++17
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
B2_CXXSTD: 17
B2_TOOLSET: msvc-14.1
- FLAVOR: Visual Studio 2017, C++latest
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
B2_CXXSTD: latest
B2_TOOLSET: msvc-14.1
- FLAVOR: cygwin (32-bit)
- FLAVOR: cygwin (32-bit, C++03,11)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
ADDPATH: C:\cygwin\bin;
B2_ADDRESS_MODEL: 32
B2_CXXSTD: 03,11,14,1z
B2_CXXSTD: 03,11
B2_TOOLSET: gcc
- FLAVOR: cygwin (64-bit)
- FLAVOR: cygwin (32-bit, C++14,1z)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
ADDPATH: C:\cygwin\bin;
B2_ADDRESS_MODEL: 32
B2_CXXSTD: 14,1z
B2_TOOLSET: gcc
- FLAVOR: cygwin (64-bit, C++03,11)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
ADDPATH: C:\cygwin64\bin;
B2_ADDRESS_MODEL: 64
B2_CXXSTD: 03,11,14,1z
B2_CXXSTD: 03,11
B2_TOOLSET: gcc
- FLAVOR: cygwin (64-bit, latest)
- FLAVOR: cygwin (64-bit, C++14,1z)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
ADDPATH: C:\cygwin64\bin;
B2_ADDRESS_MODEL: 64
B2_CXXSTD: 14,1z
B2_TOOLSET: gcc
- FLAVOR: cygwin (64-bit, latest, C++03)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
ADDPATH: C:\cygwin64\bin;
B2_ADDRESS_MODEL: 64
B2_CXXSTD: 03
B2_TOOLSET: gcc
B2_FLAGS: "include=libs/unordered/test/unordered include=libs/unordered/test/exception"
B2_VARIANT: release
- FLAVOR: cygwin (64-bit, latest)
- FLAVOR: cygwin (64-bit, latest, C++11)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
ADDPATH: C:\cygwin64\bin;
B2_ADDRESS_MODEL: 64
B2_CXXSTD: 11
B2_TOOLSET: gcc
B2_FLAGS: "include=libs/unordered/test/unordered include=libs/unordered/test/exception"
B2_VARIANT: release
- FLAVOR: cygwin (64-bit, latest)
- FLAVOR: cygwin (64-bit, latest, C++14)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
ADDPATH: C:\cygwin64\bin;
B2_ADDRESS_MODEL: 64
B2_CXXSTD: 14
B2_TOOLSET: gcc
B2_FLAGS: "include=libs/unordered/test/unordered include=libs/unordered/test/exception"
B2_VARIANT: release
- FLAVOR: cygwin (64-bit, latest)
- FLAVOR: cygwin (64-bit, latest, C++1z)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
ADDPATH: C:\cygwin64\bin;
B2_ADDRESS_MODEL: 64
B2_CXXSTD: 1z
B2_TOOLSET: gcc
B2_FLAGS: "include=libs/unordered/test/unordered include=libs/unordered/test/exception"
B2_VARIANT: release
- FLAVOR: mingw-w64, 32 bit
- FLAVOR: mingw-w64, 32 bit, C++03
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_CXXSTD: 03,11,14
B2_CXXSTD: 03
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: mingw-w64, 32 bit
- FLAVOR: mingw-w64, 32 bit, C++11
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_CXXSTD: 17,2a
B2_CXXSTD: 11
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: mingw-w64, 64 bit
- FLAVOR: mingw-w64, 32 bit, C++14
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_CXXSTD: 14
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: mingw-w64, 32 bit, C++17
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_CXXSTD: 17
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: mingw-w64, 32 bit, C++2a
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_CXXSTD: 2a
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: mingw-w64, 64 bit, C++03
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
B2_CXXSTD: 03,11,14
B2_CXXSTD: 03
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64
- FLAVOR: mingw-w64, 64 bit
- FLAVOR: mingw-w64, 64 bit, C++11
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
B2_CXXSTD: 17,2a
B2_CXXSTD: 11
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64
- FLAVOR: mingw-w64, 64 bit, C++14
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
B2_CXXSTD: 14
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64
- FLAVOR: mingw-w64, 64 bit, C++17
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
B2_CXXSTD: 17
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64
- FLAVOR: mingw-w64, 64 bit, C++2a
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
B2_CXXSTD: 2a
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64

View File

@ -6,11 +6,12 @@ local library = "unordered";
local triggers =
{
branch: [ "master", "develop", "feature/*", "bugfix/*" ]
branch: [ "master", "develop", "feature/*", "bugfix/*", "fix/*", "pr/*" ]
};
local ubsan = { UBSAN: '1', UBSAN_OPTIONS: 'print_stacktrace=1' };
local asan = { ASAN: '1' };
local tsan = { TSAN: '1' };
local linux_pipeline(name, image, environment, packages = "", sources = [], arch = "amd64") =
{
@ -157,16 +158,29 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
),
linux_pipeline(
"Linux 18.04 GCC 8 32/64",
"Linux 18.04 GCC 8 32/64 (03,11)",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-8', CXXSTD: '03,11,14,17', ADDRMD: '32,64' },
{ TOOLSET: 'gcc', COMPILER: 'g++-8', CXXSTD: '03,11', ADDRMD: '32,64' },
"g++-8-multilib",
),
linux_pipeline(
"Linux 20.04 GCC 9* 32/64",
"Linux 18.04 GCC 8 32/64 (14,17)",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-8', CXXSTD: '14,17', ADDRMD: '32,64' },
"g++-8-multilib",
),
linux_pipeline(
"Linux 20.04 GCC 9* 32/64 (03,11,14)",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a', ADDRMD: '32,64' },
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 20.04 GCC 9* 32/64 (17,2a)",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '17,2a', ADDRMD: '32,64' },
),
linux_pipeline(
@ -177,36 +191,77 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
),
linux_pipeline(
"Linux 20.04 GCC 9* S390x",
"Linux 20.04 GCC 9* S390x (03,11,14)",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a' },
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14' },
arch="s390x",
),
linux_pipeline(
"Linux 20.04 GCC 10 32/64",
"Linux 20.04 GCC 9* S390x (17,2a)",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '17,2a' },
arch="s390x",
),
linux_pipeline(
"Linux 20.04 GCC 10 32/64 (03,11,14)",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-10', CXXSTD: '03,11,14,17,20', ADDRMD: '32,64' },
{ TOOLSET: 'gcc', COMPILER: 'g++-10', CXXSTD: '03,11,14', ADDRMD: '32,64' },
"g++-10-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 11* 32/64",
"Linux 20.04 GCC 10 32/64 (17,20)",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-10', CXXSTD: '17,20', ADDRMD: '32,64' },
"g++-10-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 11* 32/64 (03,11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a', ADDRMD: '32,64' },
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 22.04 GCC 11* 32/64 (17,2a)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '17,2a', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (03,11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '03,11,14', ADDRMD: '32' } + asan,
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '03,11', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (17,20,2b)",
"Linux 22.04 GCC 12 32 ASAN (14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '17,20,2b', ADDRMD: '32' } + asan,
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '14', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (17)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '17', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (20)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '20', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (2b)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '2b', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
@ -218,12 +273,47 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN (17,20,2b)",
"Linux 22.04 GCC 12 64 ASAN (17)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '17,20,2b', ADDRMD: '64' } + asan,
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '17', ADDRMD: '64' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN (20)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '20', ADDRMD: '64' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN (2b)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '2b', ADDRMD: '64' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 TSAN (11,14,17,20,2b)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '11,14,17,20,2b', ADDRMD: '64', TARGET: 'libs/unordered/test//cfoa_tests' } + tsan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 23.04 GCC 13 32/64 (03,11,14)",
"cppalliance/droneubuntu2304:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '03,11,14', ADDRMD: '32,64' },
"g++-13 g++-13-multilib",
),
linux_pipeline(
"Linux 23.04 GCC 13 32/64 (17,20,2b)",
"cppalliance/droneubuntu2304:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '17,20,2b', ADDRMD: '32,64' },
"g++-13 g++-13-multilib",
),
linux_pipeline(
"Linux 16.04 Clang 3.5",
"cppalliance/droneubuntu1604:1",
@ -330,19 +420,40 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
),
linux_pipeline(
"Linux 22.04 Clang 14 UBSAN",
"Linux 22.04 Clang 14 UBSAN (03,11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14,17,20' } + ubsan,
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14' } + ubsan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 ASAN",
"Linux 22.04 Clang 14 UBSAN (17,20)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14,17,20' } + asan,
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '17,20' } + ubsan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 ASAN (03,11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14' } + asan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 ASAN (17,20)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '17,20' } + asan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 libc++ 64 TSAN",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', ADDRMD: '64', TARGET: 'libs/unordered/test//cfoa_tests', CXXSTD: '11,14,17,20', STDLIB: 'libc++' } + tsan,
"clang-14 libc++-14-dev libc++abi-14-dev",
),
linux_pipeline(
"Linux 22.04 Clang 15",
"cppalliance/droneubuntu2204:1",
@ -352,14 +463,30 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
),
macos_pipeline(
"MacOS 10.15 Xcode 12.2 UBSAN",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '03,11,14,1z' } + ubsan,
"MacOS 10.15 Xcode 12.2 UBSAN (03,11)",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '03,11' } + ubsan,
),
macos_pipeline(
"MacOS 10.15 Xcode 12.2 UBSAN (14)",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '14' } + ubsan,
),
macos_pipeline(
"MacOS 10.15 Xcode 12.2 UBSAN (1z)",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '1z' } + ubsan,
),
macos_pipeline(
"MacOS 12.4 Xcode 13.4.1 ASAN",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '03,11,14,1z' } + asan,
xcode_version = "13.4.1", osx_version = "monterey",
xcode_version = "13.4.1", osx_version = "monterey", arch = "arm64",
),
macos_pipeline(
"MacOS 12.4 Xcode 13.4.1 TSAN",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '11,14,1z', TARGET: 'libs/unordered/test//cfoa_tests' } + tsan,
xcode_version = "13.4.1", osx_version = "monterey", arch = "arm64",
),
windows_pipeline(

View File

@ -7,6 +7,8 @@
set -ex
export PATH=~/.local/bin:/usr/local/bin:$PATH
: ${TARGET:="libs/$LIBRARY/test"}
DRONE_BUILD_DIR=$(pwd)
BOOST_BRANCH=develop
@ -22,4 +24,4 @@ python tools/boostdep/depinst/depinst.py $LIBRARY
./b2 -d0 headers
echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
./b2 -j3 libs/$LIBRARY/test toolset=$TOOLSET cxxstd=$CXXSTD variant=debug,release ${ADDRMD:+address-model=$ADDRMD} ${UBSAN:+undefined-sanitizer=norecover debug-symbols=on} ${ASAN:+address-sanitizer=norecover debug-symbols=on} ${LINKFLAGS:+linkflags=$LINKFLAGS}
./b2 -j3 $TARGET toolset=$TOOLSET cxxstd=$CXXSTD variant=debug,release ${ADDRMD:+address-model=$ADDRMD} ${STDLIB:+stdlib=$STDLIB} ${UBSAN:+undefined-sanitizer=norecover debug-symbols=on} ${ASAN:+address-sanitizer=norecover debug-symbols=on} ${TSAN:+thread-sanitizer=norecover debug-symbols=on} ${LINKFLAGS:+linkflags=$LINKFLAGS}

View File

@ -52,7 +52,10 @@ jobs:
- { name: "gcc-12 w/ sanitizers (17,20,2b)", sanitize: yes,
compiler: gcc-12, cxxstd: '17,20,2b', os: ubuntu-22.04, ccache_key: "san2" }
- { name: Collect coverage, coverage: yes,
compiler: gcc-8, cxxstd: '03,11', os: ubuntu-20.04, install: 'g++-8-multilib', address-model: '32,64', ccache_key: "cov" }
compiler: gcc-12, cxxstd: '03,20', os: ubuntu-22.04, install: 'g++-12-multilib', address-model: '32,64', ccache_key: "cov" }
- { name: "cfoa tsan (gcc)", cxxstd: '11,14,17,20,2b', os: ubuntu-22.04, compiler: gcc-12,
targets: 'libs/unordered/test//cfoa_tests', thread-sanitize: yes }
# Linux, clang, libc++
- { compiler: clang-7, cxxstd: '03,11,14,17', os: ubuntu-20.04, stdlib: libc++, install: 'clang-7 libc++-7-dev libc++abi-7-dev' }
@ -65,16 +68,23 @@ jobs:
compiler: clang-12, cxxstd: '17,20,2b', os: ubuntu-20.04, stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev', ccache_key: "san2" }
- { compiler: clang-13, cxxstd: '03,11,14,17,20,2b', os: ubuntu-22.04, stdlib: libc++, install: 'clang-13 libc++-13-dev libc++abi-13-dev' }
- { compiler: clang-14, cxxstd: '03,11,14,17,20,2b', os: ubuntu-22.04, stdlib: libc++, install: 'clang-14 libc++-14-dev libc++abi-14-dev' }
# not using libc++ because of https://github.com/llvm/llvm-project/issues/52771
- { name: "clang-14 w/ sanitizers (03,11,14)", sanitize: yes,
compiler: clang-14, cxxstd: '03,11,14', os: ubuntu-22.04, ccache_key: "san1" }
- { name: "clang-14 w/ sanitizers (17,20,2b)", sanitize: yes,
compiler: clang-14, cxxstd: '17,20,2b', os: ubuntu-22.04, ccache_key: "san2" }
# OSX, clang
- { compiler: clang, cxxstd: '03,11,14,17,2a', os: macos-11, sanitize: yes }
- { name: "cfoa tsan (clang)", cxxstd: '11,14,17,20,2b', os: ubuntu-22.04, compiler: clang-14,
targets: 'libs/unordered/test//cfoa_tests', thread-sanitize: yes,
stdlib: libc++, install: 'clang-14 libc++-14-dev libc++abi-14-dev' }
timeout-minutes: 120
# OSX, clang
- { compiler: clang, cxxstd: '03,11,14,17,2a', os: macos-11, }
- { compiler: clang, cxxstd: '03,11,14,17,2a', os: macos-12, sanitize: yes }
- { compiler: clang, cxxstd: '11,14,17,2a', os: macos-12, thread-sanitize: yes, targets: 'libs/unordered/test//cfoa_tests' }
timeout-minutes: 180
runs-on: ${{matrix.os}}
container: ${{matrix.container}}
env: {B2_USE_CCACHE: 1}
@ -183,6 +193,8 @@ jobs:
B2_COMPILER: ${{matrix.compiler}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_SANITIZE: ${{matrix.sanitize}}
B2_TSAN: ${{matrix.thread-sanitize}}
B2_TARGETS: ${{matrix.targets}}
B2_STDLIB: ${{matrix.stdlib}}
# More entries can be added in the same way, see the B2_ARGS assignment in ci/enforce.sh for the possible keys.
# B2_DEFINES: ${{matrix.defines}}
@ -196,7 +208,7 @@ jobs:
- name: Run tests
if: '!matrix.coverity'
run: ci/build.sh
run: B2_TARGETS=${{matrix.targets}} ci/build.sh
- name: Upload coverage
if: matrix.coverage
@ -217,11 +229,13 @@ jobs:
fail-fast: false
matrix:
include:
- { toolset: msvc-14.0, cxxstd: '14,latest', addrmd: '32,64', os: windows-2019 }
- { toolset: msvc-14.2, cxxstd: '14,17,20,latest', addrmd: '32,64', os: windows-2019 }
- { toolset: msvc-14.3, cxxstd: '14,17,20,latest', addrmd: '32,64', os: windows-2022 }
- { toolset: clang-win, cxxstd: '14,17,latest', addrmd: '32,64', os: windows-2022 }
- { toolset: gcc, cxxstd: '03,11,14,17,2a', addrmd: '64', os: windows-2019 }
- { toolset: msvc-14.0, cxxstd: '14,latest', addrmd: '32,64', os: windows-2019, variant: 'debug,release' }
- { toolset: msvc-14.2, cxxstd: '14,17,20,latest', addrmd: '32,64', os: windows-2019, variant: 'debug,release' }
- { toolset: msvc-14.3, cxxstd: '14,17,20,latest', addrmd: '32,64', os: windows-2022, variant: 'debug,release' }
- { toolset: msvc-14.3, cxxstd: '14', addrmd: '64', os: windows-2022, variant: 'debug', defines: '_ALLOW_RTCc_IN_STL', cxxflags: '/RTCc' }
- { toolset: msvc-14.3, cxxstd: '14', addrmd: '32', os: windows-2022, variant: 'debug', defines: '_ALLOW_RTCc_IN_STL', cxxflags: '"/RTCc /arch:IA32"' }
- { toolset: clang-win, cxxstd: '14,17,latest', addrmd: '32,64', os: windows-2022, variant: 'debug,release' }
- { toolset: gcc, cxxstd: '03,11,14,17,2a', addrmd: '64', os: windows-2019, variant: 'debug,release' }
runs-on: ${{matrix.os}}
@ -250,6 +264,9 @@ jobs:
B2_TOOLSET: ${{matrix.toolset}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_ADDRESS_MODEL: ${{matrix.addrmd}}
B2_DEFINES: ${{matrix.defines}}
B2_VARIANT: ${{matrix.variant}}
B2_CXXFLAGS: ${{matrix.cxxflags}}
- name: Collect coverage
shell: powershell

1
.gitignore vendored
View File

@ -1 +1,2 @@
/doc/html/
/doc/pdf/

View File

@ -22,6 +22,7 @@ target_link_libraries(boost_unordered
Boost::mp11
Boost::predef
Boost::preprocessor
Boost::static_assert
Boost::throw_exception
Boost::tuple
Boost::type_traits

3
benchmark/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
enwik8
enwik9
*.exe

View File

@ -1,25 +1,22 @@
// Copyright 2021 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/core/detail/splitmix64.hpp>
#include <boost/config.hpp>
#ifdef HAVE_ABSEIL
# include "absl/container/node_hash_map.h"
# include "absl/container/flat_hash_map.h"
#endif
#ifdef HAVE_TSL_HOPSCOTCH
# include "tsl/hopscotch_map.h"
#endif
#ifdef HAVE_TSL_ROBIN
# include "tsl/robin_map.h"
#ifdef HAVE_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <vector>
@ -267,24 +264,6 @@ template<template<class...> class Map> BOOST_NOINLINE void test( char const* lab
times.push_back( rec );
}
// multi_index emulation of unordered_map
template<class K, class V> struct pair
{
K first;
mutable V second;
};
using namespace boost::multi_index;
template<class K, class V> using multi_index_map = multi_index_container<
pair<K, V>,
indexed_by<
hashed_unique< member<pair<K, V>, K, &pair<K, V>::first> >
>,
::allocator< pair<K, V> >
>;
// aliases using the counting allocator
template<class K, class V> using allocator_for = ::allocator< std::pair<K const, V> >;
@ -295,6 +274,9 @@ template<class K, class V> using std_unordered_map =
template<class K, class V> using boost_unordered_map =
boost::unordered_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
@ -308,23 +290,10 @@ template<class K, class V> using absl_flat_hash_map =
#endif
#ifdef HAVE_TSL_HOPSCOTCH
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using tsl_hopscotch_map =
tsl::hopscotch_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_hopscotch_pg_map =
tsl::hopscotch_pg_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
#ifdef HAVE_TSL_ROBIN
template<class K, class V> using tsl_robin_map =
tsl::robin_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_robin_pg_map =
tsl::robin_pg_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
@ -381,17 +350,12 @@ std::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_map_fnv1a =
boost::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map_fnv1a =
boost::unordered_node_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map_fnv1a =
boost::unordered_flat_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using multi_index_map_fnv1a = multi_index_container<
pair<K, V>,
indexed_by<
hashed_unique< member<pair<K, V>, K, &pair<K, V>::first>, fnv1a_hash >
>,
::allocator< pair<K, V> >
>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map_fnv1a =
@ -402,23 +366,10 @@ template<class K, class V> using absl_flat_hash_map_fnv1a =
#endif
#ifdef HAVE_TSL_HOPSCOTCH
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using tsl_hopscotch_map_fnv1a =
tsl::hopscotch_map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_hopscotch_pg_map_fnv1a =
tsl::hopscotch_pg_map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
#ifdef HAVE_TSL_ROBIN
template<class K, class V> using tsl_robin_map_fnv1a =
tsl::robin_map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_robin_pg_map_fnv1a =
tsl::robin_pg_map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using ankerl_unordered_dense_map_fnv1a =
ankerl::unordered_dense::map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
@ -428,67 +379,47 @@ int main()
{
init_indices();
#if 1
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map>( "ankerl::unordered_dense::map" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map>( "absl::node_hash_map" );
test<absl_flat_hash_map>( "absl::flat_hash_map" );
#endif
#ifdef HAVE_TSL_HOPSCOTCH
test<tsl_hopscotch_map>( "tsl::hopscotch_map" );
test<tsl_hopscotch_pg_map>( "tsl::hopscotch_pg_map" );
#endif
#ifdef HAVE_TSL_ROBIN
test<tsl_robin_map>( "tsl::robin_map" );
test<tsl_robin_pg_map>( "tsl::robin_pg_map" );
#endif
#endif
test<std_unordered_map_fnv1a>( "std::unordered_map, FNV-1a" );
test<boost_unordered_map_fnv1a>( "boost::unordered_map, FNV-1a" );
test<boost_unordered_node_map_fnv1a>( "boost::unordered_node_map, FNV-1a" );
test<boost_unordered_flat_map_fnv1a>( "boost::unordered_flat_map, FNV-1a" );
test<multi_index_map_fnv1a>( "multi_index_map, FNV-1a" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map_fnv1a>( "ankerl::unordered_dense::map, FNV-1a" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map_fnv1a>( "absl::node_hash_map, FNV-1a" );
test<absl_flat_hash_map_fnv1a>( "absl::flat_hash_map, FNV-1a" );
#endif
#ifdef HAVE_TSL_HOPSCOTCH
test<tsl_hopscotch_map_fnv1a>( "tsl::hopscotch_map, FNV-1a" );
test<tsl_hopscotch_pg_map_fnv1a>( "tsl::hopscotch_pg_map, FNV-1a" );
#endif
#ifdef HAVE_TSL_ROBIN
test<tsl_robin_map_fnv1a>( "tsl::robin_map, FNV-1a" );
test<tsl_robin_pg_map_fnv1a>( "tsl::robin_pg_map, FNV-1a" );
#endif
std::cout << "---\n\n";
for( auto const& x: times )
{
std::cout << std::setw( 35 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
std::cout << std::setw( 38 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}

View File

@ -1,25 +1,22 @@
// Copyright 2021 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/core/detail/splitmix64.hpp>
#include <boost/config.hpp>
#ifdef HAVE_ABSEIL
# include "absl/container/node_hash_map.h"
# include "absl/container/flat_hash_map.h"
#endif
#ifdef HAVE_TSL_HOPSCOTCH
# include "tsl/hopscotch_map.h"
#endif
#ifdef HAVE_TSL_ROBIN
# include "tsl/robin_map.h"
#ifdef HAVE_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <string_view>
@ -268,24 +265,6 @@ template<template<class...> class Map> BOOST_NOINLINE void test( char const* lab
times.push_back( rec );
}
// multi_index emulation of unordered_map
template<class K, class V> struct pair
{
K first;
mutable V second;
};
using namespace boost::multi_index;
template<class K, class V> using multi_index_map = multi_index_container<
pair<K, V>,
indexed_by<
hashed_unique< member<pair<K, V>, K, &pair<K, V>::first> >
>,
::allocator< pair<K, V> >
>;
// aliases using the counting allocator
template<class K, class V> using allocator_for = ::allocator< std::pair<K const, V> >;
@ -296,6 +275,9 @@ template<class K, class V> using std_unordered_map =
template<class K, class V> using boost_unordered_map =
boost::unordered_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
@ -309,23 +291,10 @@ template<class K, class V> using absl_flat_hash_map =
#endif
#ifdef HAVE_TSL_HOPSCOTCH
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using tsl_hopscotch_map =
tsl::hopscotch_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_hopscotch_pg_map =
tsl::hopscotch_pg_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
#ifdef HAVE_TSL_ROBIN
template<class K, class V> using tsl_robin_map =
tsl::robin_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_robin_pg_map =
tsl::robin_pg_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
@ -382,17 +351,12 @@ std::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_map_fnv1a =
boost::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map_fnv1a =
boost::unordered_node_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map_fnv1a =
boost::unordered_flat_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using multi_index_map_fnv1a = multi_index_container<
pair<K, V>,
indexed_by<
hashed_unique< member<pair<K, V>, K, &pair<K, V>::first>, fnv1a_hash >
>,
::allocator< pair<K, V> >
>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map_fnv1a =
@ -403,23 +367,10 @@ template<class K, class V> using absl_flat_hash_map_fnv1a =
#endif
#ifdef HAVE_TSL_HOPSCOTCH
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using tsl_hopscotch_map_fnv1a =
tsl::hopscotch_map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_hopscotch_pg_map_fnv1a =
tsl::hopscotch_pg_map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
#ifdef HAVE_TSL_ROBIN
template<class K, class V> using tsl_robin_map_fnv1a =
tsl::robin_map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_robin_pg_map_fnv1a =
tsl::robin_pg_map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using ankerl_unordered_dense_map_fnv1a =
ankerl::unordered_dense::map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
@ -429,67 +380,47 @@ int main()
{
init_indices();
#if 1
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map>( "ankerl::unordered_dense::map" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map>( "absl::node_hash_map" );
test<absl_flat_hash_map>( "absl::flat_hash_map" );
#endif
#ifdef HAVE_TSL_HOPSCOTCH
test<tsl_hopscotch_map>( "tsl::hopscotch_map" );
test<tsl_hopscotch_pg_map>( "tsl::hopscotch_pg_map" );
#endif
#ifdef HAVE_TSL_ROBIN
test<tsl_robin_map>( "tsl::robin_map" );
test<tsl_robin_pg_map>( "tsl::robin_pg_map" );
#endif
#endif
test<std_unordered_map_fnv1a>( "std::unordered_map, FNV-1a" );
test<boost_unordered_map_fnv1a>( "boost::unordered_map, FNV-1a" );
test<boost_unordered_node_map_fnv1a>( "boost::unordered_node_map, FNV-1a" );
test<boost_unordered_flat_map_fnv1a>( "boost::unordered_flat_map, FNV-1a" );
test<multi_index_map_fnv1a>( "multi_index_map, FNV-1a" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map_fnv1a>( "ankerl::unordered_dense::map, FNV-1a" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map_fnv1a>( "absl::node_hash_map, FNV-1a" );
test<absl_flat_hash_map_fnv1a>( "absl::flat_hash_map, FNV-1a" );
#endif
#ifdef HAVE_TSL_HOPSCOTCH
test<tsl_hopscotch_map_fnv1a>( "tsl::hopscotch_map, FNV-1a" );
test<tsl_hopscotch_pg_map_fnv1a>( "tsl::hopscotch_pg_map, FNV-1a" );
#endif
#ifdef HAVE_TSL_ROBIN
test<tsl_robin_map_fnv1a>( "tsl::robin_map, FNV-1a" );
test<tsl_robin_pg_map_fnv1a>( "tsl::robin_pg_map, FNV-1a" );
#endif
std::cout << "---\n\n";
for( auto const& x: times )
{
std::cout << std::setw( 35 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
std::cout << std::setw( 38 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}

View File

@ -1,14 +1,14 @@
// Copyright 2021 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/endian/conversion.hpp>
#include <boost/core/detail/splitmix64.hpp>
#include <boost/config.hpp>
@ -16,11 +16,8 @@
# include "absl/container/node_hash_map.h"
# include "absl/container/flat_hash_map.h"
#endif
#ifdef HAVE_TSL_HOPSCOTCH
# include "tsl/hopscotch_map.h"
#endif
#ifdef HAVE_TSL_ROBIN
# include "tsl/robin_map.h"
#ifdef HAVE_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <vector>
@ -284,24 +281,6 @@ template<template<class...> class Map> BOOST_NOINLINE void test( char const* lab
times.push_back( rec );
}
// multi_index emulation of unordered_map
template<class K, class V> struct pair
{
K first;
mutable V second;
};
using namespace boost::multi_index;
template<class K, class V> using multi_index_map = multi_index_container<
pair<K, V>,
indexed_by<
hashed_unique< member<pair<K, V>, K, &pair<K, V>::first> >
>,
::allocator< pair<K, V> >
>;
// aliases using the counting allocator
template<class K, class V> using allocator_for = ::allocator< std::pair<K const, V> >;
@ -312,6 +291,9 @@ template<class K, class V> using std_unordered_map =
template<class K, class V> using boost_unordered_map =
boost::unordered_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
@ -325,23 +307,10 @@ template<class K, class V> using absl_flat_hash_map =
#endif
#ifdef HAVE_TSL_HOPSCOTCH
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using tsl_hopscotch_map =
tsl::hopscotch_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_hopscotch_pg_map =
tsl::hopscotch_pg_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
#ifdef HAVE_TSL_ROBIN
template<class K, class V> using tsl_robin_map =
tsl::robin_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_robin_pg_map =
tsl::robin_pg_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
@ -351,35 +320,27 @@ int main()
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map>( "ankerl::unordered_dense::map" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map>( "absl::node_hash_map" );
test<absl_flat_hash_map>( "absl::flat_hash_map" );
#endif
#ifdef HAVE_TSL_HOPSCOTCH
test<tsl_hopscotch_map>( "tsl::hopscotch_map" );
test<tsl_hopscotch_pg_map>( "tsl::hopscotch_pg_map" );
#endif
#ifdef HAVE_TSL_ROBIN
test<tsl_robin_map>( "tsl::robin_map" );
test<tsl_robin_pg_map>( "tsl::robin_pg_map" );
#endif
std::cout << "---\n\n";
for( auto const& x: times )
{
std::cout << std::setw( 27 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
std::cout << std::setw( 30 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}

View File

@ -1,14 +1,14 @@
// Copyright 2021 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/endian/conversion.hpp>
#include <boost/core/detail/splitmix64.hpp>
#include <boost/config.hpp>
@ -16,11 +16,8 @@
# include "absl/container/node_hash_map.h"
# include "absl/container/flat_hash_map.h"
#endif
#ifdef HAVE_TSL_HOPSCOTCH
# include "tsl/hopscotch_map.h"
#endif
#ifdef HAVE_TSL_ROBIN
# include "tsl/robin_map.h"
#ifdef HAVE_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <vector>
@ -284,24 +281,6 @@ template<template<class...> class Map> BOOST_NOINLINE void test( char const* lab
times.push_back( rec );
}
// multi_index emulation of unordered_map
template<class K, class V> struct pair
{
K first;
mutable V second;
};
using namespace boost::multi_index;
template<class K, class V> using multi_index_map = multi_index_container<
pair<K, V>,
indexed_by<
hashed_unique< member<pair<K, V>, K, &pair<K, V>::first> >
>,
::allocator< pair<K, V> >
>;
// aliases using the counting allocator
template<class K, class V> using allocator_for = ::allocator< std::pair<K const, V> >;
@ -312,6 +291,9 @@ template<class K, class V> using std_unordered_map =
template<class K, class V> using boost_unordered_map =
boost::unordered_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
@ -325,23 +307,10 @@ template<class K, class V> using absl_flat_hash_map =
#endif
#ifdef HAVE_TSL_HOPSCOTCH
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using tsl_hopscotch_map =
tsl::hopscotch_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_hopscotch_pg_map =
tsl::hopscotch_pg_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
#ifdef HAVE_TSL_ROBIN
template<class K, class V> using tsl_robin_map =
tsl::robin_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using tsl_robin_pg_map =
tsl::robin_pg_map<K, V, std::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
@ -349,37 +318,39 @@ int main()
{
init_indices();
#if defined(BOOST_LIBSTDCXX_VERSION) && __SIZE_WIDTH__ == 32
// Pathological behavior:
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104945
#else
test<std_unordered_map>( "std::unordered_map" );
#endif
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map>( "ankerl::unordered_dense::map" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map>( "absl::node_hash_map" );
test<absl_flat_hash_map>( "absl::flat_hash_map" );
#endif
#ifdef HAVE_TSL_HOPSCOTCH
test<tsl_hopscotch_map>( "tsl::hopscotch_map" );
test<tsl_hopscotch_pg_map>( "tsl::hopscotch_pg_map" );
#endif
#ifdef HAVE_TSL_ROBIN
test<tsl_robin_map>( "tsl::robin_map" );
test<tsl_robin_pg_map>( "tsl::robin_pg_map" );
#endif
std::cout << "---\n\n";
for( auto const& x: times )
{
std::cout << std::setw( 27 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
std::cout << std::setw( 30 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}

View File

@ -1,14 +1,14 @@
// Copyright 2021, 2022 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/endian/conversion.hpp>
#include <boost/core/detail/splitmix64.hpp>
#include <boost/container_hash/hash.hpp>
@ -17,6 +17,9 @@
# include "absl/container/node_hash_map.h"
# include "absl/container/flat_hash_map.h"
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <vector>
#include <memory>
@ -329,24 +332,6 @@ template<template<class...> class Map> BOOST_NOINLINE void test( char const* lab
times.push_back( rec );
}
// multi_index emulation of unordered_map
template<class K, class V> struct pair
{
K first;
mutable V second;
};
using namespace boost::multi_index;
template<class K, class V> using multi_index_map = multi_index_container<
pair<K, V>,
indexed_by<
hashed_unique< member<pair<K, V>, K, &pair<K, V>::first> >
>,
::allocator< pair<K, V> >
>;
// aliases using the counting allocator
template<class K, class V> using allocator_for = ::allocator< std::pair<K const, V> >;
@ -357,6 +342,9 @@ template<class K, class V> using std_unordered_map =
template<class K, class V> using boost_unordered_map =
boost::unordered_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
@ -370,14 +358,27 @@ template<class K, class V> using absl_flat_hash_map =
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
int main()
{
init_indices();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map>( "ankerl::unordered_dense::map" );
#endif
#ifdef HAVE_ABSEIL
@ -390,7 +391,7 @@ int main()
for( auto const& x: times )
{
std::cout << std::setw( 27 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
std::cout << std::setw( 30 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}

386
benchmark/word_count.cpp Normal file
View File

@ -0,0 +1,386 @@
// Copyright 2021, 2022 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/regex.hpp>
#ifdef HAVE_ABSEIL
# include "absl/container/node_hash_map.h"
# include "absl/container/flat_hash_map.h"
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <vector>
#include <memory>
#include <cstdint>
#include <iostream>
#include <iomanip>
#include <chrono>
#include <fstream>
#include <string_view>
#include <string>
using namespace std::chrono_literals;
static void print_time( std::chrono::steady_clock::time_point & t1, char const* label, std::size_t s, std::size_t size )
{
auto t2 = std::chrono::steady_clock::now();
std::cout << label << ": " << ( t2 - t1 ) / 1ms << " ms (s=" << s << ", size=" << size << ")\n";
t1 = t2;
}
static std::vector<std::string> words;
static void init_words()
{
#if SIZE_MAX > UINT32_MAX
char const* fn = "enwik9"; // http://mattmahoney.net/dc/textdata
#else
char const* fn = "enwik8"; // ditto
#endif
auto t1 = std::chrono::steady_clock::now();
std::ifstream is( fn );
std::string in( std::istreambuf_iterator<char>( is ), std::istreambuf_iterator<char>{} );
boost::regex re( "[a-zA-Z]+");
boost::sregex_token_iterator it( in.begin(), in.end(), re, 0 ), end;
words.assign( it, end );
auto t2 = std::chrono::steady_clock::now();
std::cout << fn << ": " << words.size() << " words, " << ( t2 - t1 ) / 1ms << " ms\n\n";
}
template<class Map> BOOST_NOINLINE void test_word_count( Map& map, std::chrono::steady_clock::time_point & t1 )
{
std::size_t s = 0;
for( auto const& word: words )
{
++map[ word ];
++s;
}
print_time( t1, "Word count", s, map.size() );
std::cout << std::endl;
}
template<class Map> BOOST_NOINLINE void test_contains( Map& map, std::chrono::steady_clock::time_point & t1 )
{
std::size_t s = 0;
for( auto const& word: words )
{
std::string_view w2( word );
w2.remove_prefix( 1 );
s += map.contains( w2 );
}
print_time( t1, "Contains", s, map.size() );
std::cout << std::endl;
}
template<class Map> BOOST_NOINLINE void test_count( Map& map, std::chrono::steady_clock::time_point & t1 )
{
std::size_t s = 0;
for( auto const& word: words )
{
std::string_view w2( word );
w2.remove_prefix( 1 );
s += map.count( w2 );
}
print_time( t1, "Count", s, map.size() );
std::cout << std::endl;
}
template<class Map> BOOST_NOINLINE void test_iteration( Map& map, std::chrono::steady_clock::time_point & t1 )
{
std::size_t max = 0;
std::string_view word;
for( auto const& x: map )
{
if( x.second > max )
{
word = x.first;
max = x.second;
}
}
print_time( t1, "Iterate and find max element", max, map.size() );
std::cout << std::endl;
}
// counting allocator
static std::size_t s_alloc_bytes = 0;
static std::size_t s_alloc_count = 0;
template<class T> struct allocator
{
using value_type = T;
allocator() = default;
template<class U> allocator( allocator<U> const & ) noexcept
{
}
template<class U> bool operator==( allocator<U> const & ) const noexcept
{
return true;
}
template<class U> bool operator!=( allocator<U> const& ) const noexcept
{
return false;
}
T* allocate( std::size_t n ) const
{
s_alloc_bytes += n * sizeof(T);
s_alloc_count++;
return std::allocator<T>().allocate( n );
}
void deallocate( T* p, std::size_t n ) const noexcept
{
s_alloc_bytes -= n * sizeof(T);
s_alloc_count--;
std::allocator<T>().deallocate( p, n );
}
};
//
struct record
{
std::string label_;
long long time_;
std::size_t bytes_;
std::size_t count_;
};
static std::vector<record> times;
template<template<class...> class Map> BOOST_NOINLINE void test( char const* label )
{
std::cout << label << ":\n\n";
s_alloc_bytes = 0;
s_alloc_count = 0;
Map<std::string_view, std::size_t> map;
auto t0 = std::chrono::steady_clock::now();
auto t1 = t0;
test_word_count( map, t1 );
std::cout << "Memory: " << s_alloc_bytes << " bytes in " << s_alloc_count << " allocations\n\n";
record rec = { label, 0, s_alloc_bytes, s_alloc_count };
test_contains( map, t1 );
test_count( map, t1 );
test_iteration( map, t1 );
auto tN = std::chrono::steady_clock::now();
std::cout << "Total: " << ( tN - t0 ) / 1ms << " ms\n\n";
rec.time_ = ( tN - t0 ) / 1ms;
times.push_back( rec );
}
// aliases using the counting allocator
template<class K, class V> using allocator_for = ::allocator< std::pair<K const, V> >;
template<class K, class V> using std_unordered_map =
std::unordered_map<K, V, std::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_map =
boost::unordered_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map =
absl::node_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map =
absl::flat_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
// fnv1a_hash
template<int Bits> struct fnv1a_hash_impl;
template<> struct fnv1a_hash_impl<32>
{
std::size_t operator()( std::string_view const& s ) const
{
std::size_t h = 0x811C9DC5u;
char const * first = s.data();
char const * last = first + s.size();
for( ; first != last; ++first )
{
h ^= static_cast<unsigned char>( *first );
h *= 0x01000193ul;
}
return h;
}
};
template<> struct fnv1a_hash_impl<64>
{
std::size_t operator()( std::string_view const& s ) const
{
std::size_t h = 0xCBF29CE484222325ull;
char const * first = s.data();
char const * last = first + s.size();
for( ; first != last; ++first )
{
h ^= static_cast<unsigned char>( *first );
h *= 0x00000100000001B3ull;
}
return h;
}
};
struct fnv1a_hash: fnv1a_hash_impl< std::numeric_limits<std::size_t>::digits >
{
using is_avalanching = void;
};
template<class K, class V> using std_unordered_map_fnv1a =
std::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_map_fnv1a =
boost::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map_fnv1a =
boost::unordered_node_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map_fnv1a =
boost::unordered_flat_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map_fnv1a =
absl::node_hash_map<K, V, fnv1a_hash, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map_fnv1a =
absl::flat_hash_map<K, V, fnv1a_hash, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map_fnv1a =
ankerl::unordered_dense::map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
//
int main()
{
init_words();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map>( "ankerl::unordered_dense::map" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map>( "absl::node_hash_map" );
test<absl_flat_hash_map>( "absl::flat_hash_map" );
#endif
test<std_unordered_map_fnv1a>( "std::unordered_map, FNV-1a" );
test<boost_unordered_map_fnv1a>( "boost::unordered_map, FNV-1a" );
test<boost_unordered_node_map_fnv1a>( "boost::unordered_node_map, FNV-1a" );
test<boost_unordered_flat_map_fnv1a>( "boost::unordered_flat_map, FNV-1a" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map_fnv1a>( "ankerl::unordered_dense::map, FNV-1a" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map_fnv1a>( "absl::node_hash_map, FNV-1a" );
test<absl_flat_hash_map_fnv1a>( "absl::flat_hash_map, FNV-1a" );
#endif
std::cout << "---\n\n";
for( auto const& x: times )
{
std::cout << std::setw( 38 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}
#ifdef HAVE_ABSEIL
# include "absl/container/internal/raw_hash_set.cc"
# include "absl/hash/internal/hash.cc"
# include "absl/hash/internal/low_level_hash.cc"
# include "absl/hash/internal/city.cc"
#endif

244
benchmark/word_size.cpp Normal file
View File

@ -0,0 +1,244 @@
// Copyright 2021, 2022 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/regex.hpp>
#ifdef HAVE_ABSEIL
# include "absl/container/node_hash_map.h"
# include "absl/container/flat_hash_map.h"
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <vector>
#include <memory>
#include <cstdint>
#include <iostream>
#include <iomanip>
#include <chrono>
#include <fstream>
using namespace std::chrono_literals;
static void print_time( std::chrono::steady_clock::time_point & t1, char const* label, std::size_t s, std::size_t size )
{
auto t2 = std::chrono::steady_clock::now();
std::cout << label << ": " << ( t2 - t1 ) / 1ms << " ms (s=" << s << ", size=" << size << ")\n";
t1 = t2;
}
static std::vector<std::string> words;
static void init_words()
{
#if SIZE_MAX > UINT32_MAX
char const* fn = "enwik9"; // http://mattmahoney.net/dc/textdata
#else
char const* fn = "enwik8"; // ditto
#endif
auto t1 = std::chrono::steady_clock::now();
std::ifstream is( fn );
std::string in( std::istreambuf_iterator<char>( is ), std::istreambuf_iterator<char>{} );
boost::regex re( "[a-zA-Z]+");
boost::sregex_token_iterator it( in.begin(), in.end(), re, 0 ), end;
words.assign( it, end );
auto t2 = std::chrono::steady_clock::now();
std::cout << fn << ": " << words.size() << " words, " << ( t2 - t1 ) / 1ms << " ms\n\n";
}
template<class Map> BOOST_NOINLINE void test_word_size( Map& map, std::chrono::steady_clock::time_point & t1 )
{
for( auto const& word: words )
{
++map[ word.size() ];
}
print_time( t1, "Word size count", 0, map.size() );
std::cout << std::endl;
}
template<class Map> BOOST_NOINLINE void test_iteration( Map& map, std::chrono::steady_clock::time_point & t1 )
{
std::size_t s = 0;
for( auto const& x: map )
{
s += x.second;
}
print_time( t1, "Iterate and sum counts", s, map.size() );
std::cout << std::endl;
}
// counting allocator
static std::size_t s_alloc_bytes = 0;
static std::size_t s_alloc_count = 0;
template<class T> struct allocator
{
using value_type = T;
allocator() = default;
template<class U> allocator( allocator<U> const & ) noexcept
{
}
template<class U> bool operator==( allocator<U> const & ) const noexcept
{
return true;
}
template<class U> bool operator!=( allocator<U> const& ) const noexcept
{
return false;
}
T* allocate( std::size_t n ) const
{
s_alloc_bytes += n * sizeof(T);
s_alloc_count++;
return std::allocator<T>().allocate( n );
}
void deallocate( T* p, std::size_t n ) const noexcept
{
s_alloc_bytes -= n * sizeof(T);
s_alloc_count--;
std::allocator<T>().deallocate( p, n );
}
};
//
struct record
{
std::string label_;
long long time_;
std::size_t bytes_;
std::size_t count_;
};
static std::vector<record> times;
template<template<class...> class Map> BOOST_NOINLINE void test( char const* label )
{
std::cout << label << ":\n\n";
s_alloc_bytes = 0;
s_alloc_count = 0;
Map<std::size_t, std::size_t> map;
auto t0 = std::chrono::steady_clock::now();
auto t1 = t0;
test_word_size( map, t1 );
std::cout << "Memory: " << s_alloc_bytes << " bytes in " << s_alloc_count << " allocations\n\n";
record rec = { label, 0, s_alloc_bytes, s_alloc_count };
test_iteration( map, t1 );
auto tN = std::chrono::steady_clock::now();
std::cout << "Total: " << ( tN - t0 ) / 1ms << " ms\n\n";
rec.time_ = ( tN - t0 ) / 1ms;
times.push_back( rec );
}
// aliases using the counting allocator
template<class K, class V> using allocator_for = ::allocator< std::pair<K const, V> >;
template<class K, class V> using std_unordered_map =
std::unordered_map<K, V, std::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_map =
boost::unordered_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map =
absl::node_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map =
absl::flat_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
int main()
{
init_words();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map>( "ankerl::unordered_dense::map" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map>( "absl::node_hash_map" );
test<absl_flat_hash_map>( "absl::flat_hash_map" );
#endif
std::cout << "---\n\n";
for( auto const& x: times )
{
std::cout << std::setw( 30 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}
#ifdef HAVE_ABSEIL
# include "absl/container/internal/raw_hash_set.cc"
# include "absl/hash/internal/hash.cc"
# include "absl/hash/internal/low_level_hash.cc"
# include "absl/hash/internal/city.cc"
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Some files were not shown because too many files have changed in this diff Show More