Compare commits

...

357 Commits

Author SHA1 Message Date
108d4535e0 Merge pull request #161 from cmazakas/fix/ctad
Complete deduction tests, implement guides for all containers
2022-11-08 15:27:27 +02:00
2102031b93 Implement deduction guides for unordered_flat_set 2022-11-07 15:55:29 -08:00
5b92827b68 Implement deduction guides for unordered_flat_map 2022-11-07 15:55:29 -08:00
e2f4303319 Add FOA-specific default bucket count for CTAD purposes 2022-11-07 15:55:29 -08:00
c37081b4a2 Add deduction tests for flat containers 2022-11-07 15:55:29 -08:00
fd48672fd1 Implement deduction guides for unordered_[multi]set 2022-11-07 15:55:29 -08:00
530437c21b Implement deduction guides for unordered_[multi]map 2022-11-07 15:55:29 -08:00
2949b37490 Flesh out deduction_tests to include unordered_[multi]set, update to use BOOST_TEST_TRAIT_SAME 2022-11-07 15:55:29 -08:00
867e60113b Add SFINAE helpers to type_traits.hpp 2022-11-07 15:55:29 -08:00
551456c0c5 typo in section name 2022-11-07 21:25:15 +02:00
7857582ea2 Merge branch 'develop' into feature/foa_rc_docs 2022-11-07 21:24:55 +02:00
e482947b20 Updated 1.81 documentation (#155)
* [skip CI] added first draft of unordered_flat_map.adoc

* added hash_traits.adoc, improved unordered/unordered_flat_map.adoc, added release notes

* uploaded current status

* uploaded current status

* updated boost::unordered_set benchmark images

* typos

* relinked boost_unordered_benchmarks

* editorial

* fixed max_load docs

* documented ctors added in #160
2022-11-07 17:11:15 +01:00
99bd9d9d31 Update ci.yml 2022-11-05 20:24:40 +02:00
4310809025 Implement missing constructors outlined by LWG issue 2713 (#160)
* Harden initializer_list constructor tests

* Add tests for constructors as specified in LWG issue 2713

* Add missing constructors to unordered_flat_map

* Add missing constructors to unordered_flat_set

* Add missing constructors to unordered_[multi]map

* Add missing constructors to unordered_[multi]set
2022-11-05 13:08:29 +01:00
0d8c02ba0e documented ctors added in #160 2022-11-05 12:38:03 +01:00
d3985f87b3 Improve the performance of hash_value and operator== in benchmark/uuid.cpp 2022-11-04 17:15:47 +02:00
3e4546465b fixed max_load docs 2022-11-04 13:18:09 +01:00
79379a4049 editorial 2022-11-03 19:07:24 +01:00
71b860d6ae Update ci.yml 2022-11-02 21:55:41 +02:00
7c0a826815 Merge branch 'feature/gha' into develop 2022-11-02 21:36:25 +02:00
a7156026b3 Fix typo, potential UB in overflow check and refactor to use BOOST_ASSERT_MSG() (#157) 2022-11-02 20:22:17 +02:00
787b1a9887 Update ci.yml 2022-11-02 19:06:55 +02:00
6e6ad354dd Merge branch 'develop' into feature/gha 2022-11-01 19:17:48 +02:00
4bbaa0f710 relinked boost_unordered_benchmarks 2022-11-01 17:27:24 +01:00
a3ef272a9e typos 2022-11-01 17:12:43 +01:00
189e551dc7 Add test proving max_load() invariants (#156) 2022-11-01 17:05:18 +01:00
fdd5fe3b40 Update ci.yml 2022-11-01 15:45:49 +02:00
a0652c2eda updated boost::unordered_set benchmark images 2022-11-01 10:45:00 +01:00
13e065466a Mark fnv1a_hash as avalanching 2022-11-01 06:16:30 +02:00
300f5554e5 uploaded current status 2022-10-31 19:27:35 +01:00
d3914d7101 Update hash_is_avalanching_test 2022-10-31 13:27:09 +02:00
3b592a3dd4 Merge branch 'feature/hash-is-avalanching-test-03' into develop 2022-10-30 21:13:29 +02:00
2068cf8d5b uploaded current status 2022-10-30 19:16:43 +01:00
097f4fac0b Merge branch 'feature/drone' into develop 2022-10-30 19:28:10 +02:00
5327fec080 Feature/foa anti drift (#153)
* added first draft of anti-drift

* stylistic

* adjusted hysteresis factor in unchecked_emplace_with_rehash

* added public max_load

* adjusted hysteresis factor
2022-10-30 17:06:03 +01:00
8f02e43ba4 Work around -Wconversion on GCC 5 2022-10-30 17:41:44 +02:00
d0fc14b8c5 Remove C++11 constructs from hash_traits.hpp 2022-10-30 13:40:20 +02:00
56b3700683 Add hash_is_avalanching_test.cpp 2022-10-30 12:58:57 +02:00
cf643fad2a Split GCC w/ sanitizers to avoid timeout 2022-10-29 19:28:58 +03:00
5386033e67 Update cmake_subdir_test 2022-10-29 18:23:59 +03:00
d1e565dbf3 Update .drone.jsonnet 2022-10-29 00:48:27 +03:00
acf8ddc4b7 Merge branch 'develop' into feature/drone 2022-10-29 00:45:56 +03:00
575e5eafb0 Merge pull request #152 from cmazakas/fix/rehash-allocation
Fix bug #147
2022-10-28 12:54:39 -07:00
bce031f42b Update .drone.jsonnet 2022-10-28 22:32:11 +03:00
5e5addd82d Update how the required number of buckets is calculated to nest the max call 2022-10-27 08:17:10 -07:00
0937f6443c Add rehash_stability() testing to catch erroneous behavior noted from bug #147 2022-10-27 08:17:10 -07:00
90f2f0f67d added hash_traits.adoc, improved unordered/unordered_flat_map.adoc, added release notes 2022-10-27 12:21:54 +02:00
772e1e7fa0 Fix low/high order 2022-10-26 21:49:10 +03:00
120fe90934 Add benchmark/uuid.cpp 2022-10-26 21:38:54 +03:00
1dc949b2b5 Add boost::unordered_flat_map to benchmarks 2022-10-26 21:08:51 +03:00
4593d733a2 Merge pull request #148 from boostorg/feature/foa_rc
Add unordered_flat_map, unordered_flat_set
2022-10-26 18:58:07 +02:00
5e639a97a4 passed BOOST_UNORDERED_ASSUME a true boolean 2022-10-26 10:39:34 +02:00
fb315252b3 added missing BOOST_FORCEINLINE 2022-10-25 19:53:18 +02:00
d12ed06c3d removed #ifdef'd out code 2022-10-25 19:53:03 +02:00
49fc08b934 refactored emplace_impl to improve inlining 2022-10-25 19:48:19 +02:00
4f0edf9013 Decorate containers with more BOOST_FORCEINLINE 2022-10-25 09:01:38 -07:00
2afd1c5c9a copied Neon group15::is_sentinel from foa_unordered_rc.hpp
(possible performance impact)
2022-10-25 14:45:38 +02:00
492df9c9c6 restored uint64.cpp 2022-10-25 14:33:07 +02:00
e29bf7a4a0 reverted 2022-10-25 14:31:27 +02:00
7db310f6d2 reverted 0b575dc983 (may affect performance) 2022-10-25 11:48:41 +02:00
1f781a407e Test cleanup 2022-10-24 15:05:49 -07:00
ef54c6bd14 Clean up u64 benchmarks 2022-10-24 15:04:24 -07:00
fb1b1dfe2d Add missing copyright updates 2022-10-24 11:31:25 -07:00
222f0a737d Split AppVeyor jobs to avoid timeouts 2022-10-24 11:17:37 -07:00
6c0d121e5b Update requirements for testing to include support for alignas(N) 2022-10-24 11:17:24 -07:00
955dab4637 Add missing init_type overloads for insert(hint) 2022-10-24 11:17:05 -07:00
375d7157b6 Add tests for missing typedefs in flat containers 2022-10-24 09:54:57 -07:00
01053738eb Rewrite test constraints in terms of config checks 2022-10-24 08:21:54 -07:00
b75cd48899 [skip CI] added first draft of unordered_flat_map.adoc 2022-10-23 17:51:28 +02:00
d8f226d429 reverted "Push up partial refactor for older msvc"
This reverts commit 627ffe4ed7.
2022-10-22 12:28:04 +02:00
627ffe4ed7 Push up partial refactor for older msvc 2022-10-21 15:38:19 -07:00
2adab2be61 Fix signed-unsigned comparison warning 2022-10-21 15:37:51 -07:00
e0b680ac29 Update insert(Iterator, Iterator) overloads to use emplace internally instead of insert()'ing 2022-10-21 11:24:34 -07:00
ad1e3a49a5 Update tracking counts to be unsigned in init_type_insert_tests 2022-10-21 11:23:46 -07:00
1d15067ef2 removed sign conversion warnings 2022-10-21 13:14:39 +02:00
8a3e5dd918 added workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56480 2022-10-21 11:13:13 +02:00
2aa62c63c1 stylistic 2022-10-21 10:46:22 +02:00
c9d1b6009e stylistic 2022-10-21 10:02:49 +02:00
1d553447a0 refactored insert overloads 2022-10-21 10:01:51 +02:00
703f8d1065 Delete boost-level headers as they're no longer considered idiomatic and update all tests to use the test/helpers/unorderd.hpp header where applicable 2022-10-20 15:25:40 -07:00
fe32f153a2 Add draft of insert(init_type&&) for unordered_flat_map 2022-10-20 14:59:33 -07:00
59f4da0a47 Add init_type public typedefs 2022-10-20 14:58:38 -07:00
99ad45ed77 removed spurious consts 2022-10-20 20:02:55 +02:00
d93875a65e refactored value_from and insert overloads 2022-10-20 19:48:17 +02:00
c1d5902911 Remove unnecessary value_type conversion by expanding overloads for value_from() 2022-10-20 08:43:42 -07:00
0ac4aeca50 Add swap_exception_tests for FOA, only testing weak exception guarantee 2022-10-19 11:05:09 -07:00
776935f24d Reintroduce strong guarantee checking 2022-10-19 11:04:38 -07:00
2f048ea6ac s/=/== 2022-10-19 17:50:21 +02:00
f3353c9be3 made sure source values are destroyed on copy-based rehash 2022-10-19 17:42:59 +02:00
3d07c33efe Merge branch 'feature/foa_rc' of https://github.com/boostorg/unordered into feature/foa_rc 2022-10-19 15:47:47 +02:00
8a1562cc78 implemented strong exception guarantee on rehash and single insert/emplace 2022-10-19 15:46:57 +02:00
4de1be8911 Add the rest of the exception tests sans swap 2022-10-18 15:54:02 -07:00
46065065be Temporarily disable strong checks for FOA 2022-10-18 15:54:02 -07:00
8e42367a62 stylistic 2022-10-18 19:33:52 +02:00
d13a9dcaaf stylistic 2022-10-18 18:35:41 +02:00
64cb43ce32 protected against hash throwing in nosize_transfer_element 2022-10-18 17:42:22 +02:00
c9340390b0 completed previous commit 2022-10-18 17:28:57 +02:00
c76f44a8b3 hardened unchecked_rehash against exceptions thrown in the middle of value move construction 2022-10-18 16:18:05 +02:00
2290375515 replaced try blocks with scope guards 2022-10-18 16:14:29 +02:00
a200af610f refactored table's allocator-extended copy tor 2022-10-18 15:41:33 +02:00
2cb1d2bdf0 removed duplicated call to destroy 2022-10-18 15:25:54 +02:00
ac2bc8d615 made group initialization more straightforward 2022-10-18 12:17:40 +02:00
0d6ebb4d2f Add copy_exception_tests for FOA 2022-10-17 13:27:36 -07:00
27c386d47b Revert "used regular method for group resetting in clear"
This reverts commit eb5351b2c6.
2022-10-17 13:20:01 -07:00
cf6f4023bb Make sure mask is properly cleared during rehash cleanup 2022-10-17 13:19:57 -07:00
aa41ab4195 Add constructor_exception tests for FOA 2022-10-17 13:19:29 -07:00
6e4e5ead03 made Neon group15 compatible with A32 2022-10-17 18:43:48 +02:00
eb5351b2c6 used regular method for group resetting in clear 2022-10-17 18:21:41 +02:00
599dee204f micro-optimized table destruction 2022-10-17 18:00:15 +02:00
6b1d2f13da made clear reset overflow bytes 2022-10-17 17:51:43 +02:00
b0f6bb128f micro-optimized group loops 2022-10-17 09:43:22 +02:00
0389e0bc16 reverted 2022-10-16 22:17:53 +02:00
9246c30178 activated alternative impl of nosize_unchecked_emplace_at 2022-10-16 21:33:40 +02:00
bb6b57d1a4 typo 2022-10-16 17:45:17 +02:00
4fa61b98eb made rehash work with exact capacities, refactored capacity calculations 2022-10-16 10:11:47 +02:00
5535faf3cc introduced internal noshrink_reserve 2022-10-15 18:56:46 +02:00
ec389cdecd kept adding design/implementation notes 2022-10-15 18:33:59 +02:00
7c5bad60c6 reordered #includes 2022-10-15 13:14:32 +02:00
cc75360f4c kept adding design/implementation notes 2022-10-15 12:38:39 +02:00
3a0b752363 reorganized function definitions 2022-10-15 11:17:51 +02:00
63eaed843f stylistic 2022-10-15 11:15:29 +02:00
0b575dc983 s/const/constexpr in simde_mm_movemask_epi8 2022-10-15 11:14:36 +02:00
b8d4df2b5c stylistic 2022-10-15 11:07:48 +02:00
3bf28d7b61 stylistic 2022-10-15 11:06:15 +02:00
acc7f0ce5c refactored table_arrays dummy groups handling 2022-10-15 11:05:51 +02:00
1532e301d1 micro-optimized non-SIMD group15::match_impl 2022-10-15 10:51:28 +02:00
e663812f24 editorial 2022-10-15 10:18:47 +02:00
9da61e9050 Add post_move_tests 2022-10-14 13:37:26 -07:00
1de8801c08 Add scary_tests 2022-10-14 13:37:26 -07:00
e16537d244 Add helper header to include map types based on FOA vs FCA 2022-10-14 13:37:26 -07:00
14c190223c Add scoped_allocator tests 2022-10-14 13:37:26 -07:00
e3c91ad812 Add erase_if tests 2022-10-14 13:37:26 -07:00
454cb24cc8 Ease test requiremets for erase_if, require copyability now of supplied predicate 2022-10-14 13:37:26 -07:00
5e24f6ef22 Add reserve_tests 2022-10-14 13:37:26 -07:00
d02d4094e6 Add merge_tests 2022-10-14 13:37:26 -07:00
9a03d1e904 added design and implementation notes 2022-10-14 20:00:24 +02:00
3683b43242 [skip CI] editorial 2022-10-14 13:52:37 +02:00
fc5c8c3669 removed unused typedef 2022-10-14 13:40:56 +02:00
df32d79e8a shut down VS warning 2022-10-14 13:30:49 +02:00
aefb5dd66a fixed unordered_flat_map::map_types::move 2022-10-14 10:40:07 +02:00
f85e04ef31 stylistic 2022-10-14 10:30:53 +02:00
8c58ffe546 made sure BOOST_[UN]LIKELY is passed a boolean everywhere 2022-10-14 10:16:47 +02:00
d538f6184c Add equivalent_keys_tests 2022-10-13 11:59:44 -07:00
7339f4264a Undo bad commits to Jamfile, gitignore 2022-10-13 11:58:20 -07:00
87674d000b Update map_types to strip const from key, value parameters so that init_type is more efficient and extract() returns a const reference unconditionally 2022-10-13 11:39:18 -07:00
6227ae49a7 Update find_impl() to ignore warnings about unsigned-signed casting when KeyEqual returns an unsinged integral type 2022-10-13 10:23:36 -07:00
c39ed8a5cf Add simple_tests 2022-10-12 15:19:11 -07:00
d4f7939aae Add incomplete_test 2022-10-12 14:30:07 -07:00
fc7b5573c1 Add link_test 2022-10-12 14:05:25 -07:00
1c14bc1215 Use explicit cast for when KeyEqual returns a size_t type 2022-10-12 13:39:43 -07:00
4399e8b360 Add noexcept tests 2022-10-12 13:39:23 -07:00
3f9bd00f01 Add compile_map tests 2022-10-12 13:37:12 -07:00
05b3025c0e Fix regression in how the table_iterator defines its reference type 2022-10-12 08:58:32 -07:00
becd166e66 implemented erase_if 2022-10-12 15:34:05 +02:00
006f62047b reverted 334dcb91ac 2022-10-12 12:46:47 +02:00
334dcb91ac removed unused typedef 2022-10-12 11:20:37 +02:00
df7792040c implemented merge 2022-10-12 11:18:05 +02:00
57ea45cb8f overloaded for_all_elements 2022-10-12 10:31:52 +02:00
4a8d687778 Add compile_set tests with stub for merge() 2022-10-11 15:21:10 -07:00
ccd40d0c44 Update fancy pointer's implementation of pointer_to to support all types by using boost::addressof() 2022-10-11 15:21:10 -07:00
35118b5a71 reverted 2022-10-11 20:35:59 +02:00
858737fd88 s/move/forward in brace-init insert 2022-10-11 17:55:55 +02:00
648fb7b99d reverted two prior 2022-10-11 17:30:23 +02:00
59c84cb744 dropped BOOST_FORCEINLINE in brace-init insert 2022-10-11 17:20:22 +02:00
becd6078b3 temporarily used value_type&& for brace-init insert 2022-10-11 17:10:39 +02:00
e163aa465c reverted c7836659d1 2022-10-11 11:51:16 +02:00
3b1f635926 reverted c4cc805063 2022-10-11 11:50:17 +02:00
7abd7bb36d reverted 2022-10-11 11:48:46 +02:00
545ad4f7ad temporarily s/init_type/value_type in brace-init insert 2022-10-11 10:54:01 +02:00
c42d86ac0d reverted 2022-10-11 10:52:51 +02:00
316eeea983 dropped BOOST_FORCEINLINE in insert 2022-10-11 10:46:07 +02:00
f2afbe9f85 silenced unused capture warning 2022-10-11 09:09:20 +02:00
e9a94cb62a Force inlining for find() member functions in the flat containers 2022-10-10 15:47:00 -07:00
91f5925c41 Replace naked throw statements with boost::throw_exception() 2022-10-10 15:43:38 -07:00
0bdfa3c39e Add forwarding tests 2022-10-10 14:18:11 -07:00
09f0b7c0a8 Add swap_tests 2022-10-10 14:18:11 -07:00
72bca09429 Remove extraneous usage of typename 2022-10-10 14:18:11 -07:00
58b78f8ff0 Add transparent_tests 2022-10-10 14:18:11 -07:00
1ff2dc4042 Add contains_tests 2022-10-10 14:18:11 -07:00
05f9668597 Refactor transparent type traits into their own header so they can be shared with FOA impl 2022-10-10 14:18:11 -07:00
c7836659d1 activated alt impl of nosize_unchecked_emplace_at 2022-10-10 21:45:53 +02:00
c4cc805063 embed xmx code directly into xmx_mix 2022-10-10 21:06:33 +02:00
9e2bf3681f embedded hash into mixing policies 2022-10-10 20:51:47 +02:00
77f265a678 reverted 2022-10-10 20:19:39 +02:00
6bda467942 temporarily disabled mix_policy 2022-10-10 19:52:14 +02:00
1fa2e84774 reverted 7caab66011 and f776ffa008 2022-10-10 19:24:14 +02:00
7caab66011 removed inline suggestion from hash_for 2022-10-10 19:01:55 +02:00
69aff6f776 restored 16f86b0770 2022-10-10 18:55:03 +02:00
505a08cf95 temporarily reverted 16f86b0770 2022-10-10 18:34:45 +02:00
f776ffa008 removed temporary const ref in emplace_impl 2022-10-10 18:02:57 +02:00
a4c38c02c8 fixed empty_value index 2022-10-10 11:13:32 +02:00
889a81f034 stylistic 2022-10-10 09:36:12 +02:00
ad96ea632e stylistic 2022-10-10 09:34:10 +02:00
2955a966cf shut down unavoidable VS warning 2022-10-10 09:29:41 +02:00
3fbaf21b8c dropped hash_traits in favor of individual traits 2022-10-09 11:23:15 +02:00
32a7ed74e8 added missing const qualifier 2022-10-08 12:39:36 +02:00
3913fce638 dropped foa_mixer in favor of internal mix policy governed by hash_traits 2022-10-08 11:47:00 +02:00
16f86b0770 relied on implicit conversion for second overload of value_from 2022-10-08 10:18:20 +02:00
2907083b73 Fixup implementation of equality operator 2022-10-07 15:31:16 -07:00
1fa823d815 Fix erroneous usage of boost::is_convertible instead of std::is_convertible 2022-10-07 14:59:15 -07:00
6e8e2112ba Rearrange SFINAE to appease msvc-14.0 in erase() member function template 2022-10-07 14:51:40 -07:00
9560d10771 Fix shadowing warning in early gcc 2022-10-07 14:19:32 -07:00
e543818e3e Add equality_tests 2022-10-07 14:15:32 -07:00
e0bb258b39 Add load_factor_tests 2022-10-07 10:56:47 -07:00
d3ef0b9a4f Add rehash tests 2022-10-07 10:56:35 -07:00
86d623a0f4 Pull mlf into detail::foa namespace for testing 2022-10-07 10:55:52 -07:00
b964fa777c Add at_tests 2022-10-07 10:16:57 -07:00
cde017f791 added missing typename 2022-10-07 19:02:25 +02:00
d1982a664b stylistic 2022-10-07 18:56:41 +02:00
7e479d62dc added foa_mixer.hpp 2022-10-07 18:56:16 +02:00
6be32f3ba4 reverted 74c2ae627a and explicitly silenced VS warning 2022-10-07 16:38:19 +02:00
049a1ec8f6 reverted b3754b10c8 and 5fc929b829 and s/{}/() in arrays initialization 2022-10-07 16:32:57 +02:00
b3754b10c8 extended 5fc929b829 to member arrays 2022-10-07 13:50:02 +02:00
7441be730e removed spurious #include 2022-10-07 13:47:54 +02:00
38f9cb750a s/value_type/init_type 2022-10-07 12:17:16 +02:00
8a9aab57c0 s/std::move/type_policy::move in a couple of places 2022-10-07 12:15:24 +02:00
b61ec3a65a removed moved_type import (not used explicitly) 2022-10-07 12:10:14 +02:00
74c2ae627a avoided VS constant conditional expression warning 2022-10-07 11:34:13 +02:00
74ca1e50f3 return one lambda expression back in place (related to f1eb5d2106) 2022-10-07 11:27:54 +02:00
5fc929b829 initialized ml at ctor body (GCC 4.8/4.9 complains otherwise) 2022-10-07 11:23:05 +02:00
3aaf895514 restricted erase generic arg as per C++23 requirements
(hopefully fixes test errors in VS2015)
2022-10-07 11:19:20 +02:00
2057ccaeb5 stylistic 2022-10-07 10:44:28 +02:00
dc7b8f3ff2 Remove extraneous overloads of key_from 2022-10-06 12:04:21 -07:00
2b7e9d826d Fix warning in msvc-14.3 with C++20 about multiple implicit conversions being applied 2022-10-06 12:03:59 -07:00
c57470e0d3 SFINAED out third key_from overload and fixed insert accepted arg types 2022-10-06 20:02:03 +02:00
6b1379a992 Update SFINAE to handle the case of the init_type and moved_type being the same 2022-10-06 10:45:49 -07:00
f1eb5d2106 Workaround visibility bug in gcc-6 by un-nesting lambdas 2022-10-06 09:56:12 -07:00
ad248ab76a Fix maybe-uninitialized warning in emplace_tests by explicitly initializing all data members of emplace_value 2022-10-06 09:55:26 -07:00
f4888c7940 Enable C++11 builds 2022-10-06 09:55:26 -07:00
d02b12c9a1 redesigned init_type/value_type machinery 2022-10-06 17:50:30 +02:00
2cf9d5ac4c Add extra value_type() construction in range-based iterator insertion so implicitly convertible types are supported, i.e. test::proxy 2022-10-05 14:56:49 -07:00
f3803fc071 Add emplace_tests 2022-10-05 13:31:10 -07:00
a3c6235f3a Add insert_hint_tests 2022-10-05 13:30:59 -07:00
7501eefd87 Updated unordered flat container to use declval instead of allocator_traits as old versions of clang don't have is_always_equal 2022-10-05 13:29:48 -07:00
2134116cbc Update test jamfile to use a build_foa command 2022-10-05 13:24:54 -07:00
b86143de46 made one overload of insert generic so that value_type is accepted 2022-10-05 20:38:51 +02:00
7c8045aab5 fixed init_type machinery 2022-10-05 18:46:38 +02:00
c15bd0092d introduced init_type/value_type 2022-10-05 18:09:57 +02:00
d233d83811 allow 100% fillup for small capacities 2022-10-05 14:49:42 +02:00
df0c375541 s/std::allocator_traits/boost::allocator_traits 2022-10-05 13:58:31 +02:00
886b1b4ded refactored table_arrays to solve alignment issues without an extra data member 2022-10-05 13:54:28 +02:00
48816135df refactored move assignment to silence warnings 2022-10-05 10:05:10 +02:00
4d0f698937 stylistic 2022-10-05 09:34:21 +02:00
fdbc79d2a8 Silence -Werror=terminate warning in move assignment 2022-10-04 14:52:38 -07:00
1a89b0aa14 Add missing size swap() call to move-assign operator for foa::table 2022-10-04 14:52:18 -07:00
8e9b7cf259 Add move semantics to FOA containers 2022-10-04 14:51:45 -07:00
bf6643844b Add foa_move_tests 2022-10-04 14:51:03 -07:00
e9c3ed1531 Remove unnecessary self-alias checks in copy-assignment operators 2022-10-04 14:49:40 -07:00
7dfcdc6da8 Split move_tests into post_move_tests so testing with the new FOA containers is feasible 2022-10-04 14:38:31 -07:00
9ad7096851 Add missing assign_test cases 2022-10-04 11:48:09 -07:00
4cdfb2537a Implement erase(), get erase_tests passing 2022-10-04 11:48:09 -07:00
9280e13697 Add erase_tests 2022-10-04 11:48:09 -07:00
21872edf83 Disable FOA tests for C++98 2022-10-04 11:48:09 -07:00
b7e021ffc6 silenced VS warning C4714 2022-10-04 18:47:23 +02:00
e69bb3aece unnamed unused parameters 2022-10-04 13:46:27 +02:00
06512a00e1 refactored bdfe294e61 and expanded to move assign and swap 2022-10-04 11:24:21 +02:00
bdfe294e61 Add temporary polyfill for foa table's assignment operator so that the definition of the allocator copy-assignment operator isn't required 2022-10-03 14:47:41 -07:00
ddb9f370af Update load_factor() impl to handle the case when capacity() is zero 2022-10-03 14:46:45 -07:00
b0c0384401 Fix small typo in increment() function to silence VS warnings 2022-10-03 14:46:19 -07:00
bf6e381ff2 Add expliicit destructors, copy assignment operators 2022-10-03 14:45:42 -07:00
d5fcc77579 Add assign_tests 2022-10-03 14:45:02 -07:00
b0097982af Remove config checks, just rotely disable tests for unsupported C++ versions 2022-10-03 12:17:46 -07:00
2e3a8a0fc0 avoided VS warning C4706 2022-10-03 21:05:48 +02:00
357eed44a1 replaced homegrown ebo_base with boost::empty_value 2022-10-03 19:36:53 +02:00
2ae70cd05c Merge branch 'feature/foa_rc' of https://github.com/boostorg/unordered into feature/foa_rc 2022-10-03 18:50:15 +02:00
d370ae1095 stopped relying on __STDCPP_DEFAULT_NEW_ALIGNMENT__ for now 2022-10-03 18:49:24 +02:00
5c48ad9a79 Update test Jamfile to use cxx14_constexpr as a requirement for targets so msvc gets run 2022-10-03 08:08:02 -07:00
621b5b4ec1 shut down bogus VS warning 2022-10-02 11:14:19 +02:00
4dbc83ccbf documented VS specific bit 2022-10-02 11:13:49 +02:00
398a64b5e0 shut down unavoidable GCC shadowing warnings 2022-10-02 11:13:04 +02:00
b926dbbbe9 eliminated shadowed declaration 2022-10-01 19:37:16 +02:00
b244b33402 EBO-optimized table 2022-10-01 19:34:33 +02:00
f2e4b25615 silenced conversion warning 2022-10-01 17:33:55 +02:00
29f2f1db2c added missing BOOST_RETHROWs 2022-10-01 12:58:37 +02:00
cec09e1c61 fixed alignment issues apparent 32bit builds 2022-10-01 12:44:33 +02:00
36a42116e8 supported unaligned metadata access where potentially happening,
plus fixed some superfluous alignas specifiers
2022-09-30 17:06:31 +02:00
d9dcaf8ba1 tried different formulation of prior 2022-09-30 16:17:40 +02:00
984cf13afd reintroduced 6110a0827c with a slightly different syntax
(prior caused ICEs on GCC11)
2022-09-30 16:15:11 +02:00
ac41bf6e86 temporarily reverted 6110a0827c 2022-09-30 16:09:14 +02:00
5f21e3964e temporarily omitted _mm_loadu_si128 2022-09-30 13:57:49 +02:00
364cd86191 temporarily omitted alignas specifier 2022-09-30 13:52:25 +02:00
b1449ca502 added unaligned load of __m128i 2022-09-30 12:27:10 +02:00
6110a0827c Fix default initialiation warning for clang-3.7, clang-3.8 2022-09-29 13:57:16 -07:00
71b64139da Add copy_tests 2022-09-29 13:46:03 -07:00
3582ac91d7 Silence conversion warning in foa 2022-09-29 13:45:51 -07:00
30997bd9ef Add constructor_tests 2022-09-29 12:50:56 -07:00
cb673135d2 Use static_cast to silence conversion warnings 2022-09-29 11:40:13 -07:00
6ac1cf1a5f Add find_tests 2022-09-29 11:19:17 -07:00
8f29a32a33 Simplify range-based insert() so it doesn't eagerly rehash so that insert_tests pass 2022-09-29 11:18:59 -07:00
ac3520791e Clean up insert_tests 2022-09-29 11:17:22 -07:00
faa6e91ed2 Fix conversion warning in reserve() 2022-09-29 11:16:58 -07:00
86956b0be1 added non-SIMD support 2022-09-29 19:24:15 +02:00
fdc39982f3 fixed trivial error in #ifdefd-out code 2022-09-29 10:49:27 +02:00
c37cfacb44 Finally get insert_tests passing for flat map/set 2022-09-28 13:49:38 -07:00
3af53a6598 Flesh out unordered_flat_map for insert_tests 2022-09-28 13:49:17 -07:00
19c500de27 Silence conversion warning in foa table's emplace_impl() 2022-09-28 13:48:49 -07:00
855d538ea3 Fix typo in foa table's empty() implementation 2022-09-28 13:48:21 -07:00
6b1ef16e38 Add unordered_flat_set 2022-09-28 13:47:51 -07:00
1577da25cc Add proper flat_map header + forwarding header 2022-09-28 13:47:00 -07:00
c44695eb37 reverted 2022-09-28 20:48:30 +02:00
63fdf67568 un-inlined pow2_quadratic_prober memfuns to see it impacts performance 2022-09-28 20:19:08 +02:00
80cb7281ba reverted 2022-09-28 20:08:41 +02:00
cefe5965be micro-optimized table_iterator ctor to see if it impacts performance 2022-09-28 19:52:22 +02:00
2a9f47ea2c reverted 2022-09-28 19:23:39 +02:00
85324f9a43 made microchange in find_impl to see if it impacts performance 2022-09-28 19:13:26 +02:00
2e776ad155 fixed clear 2022-09-28 17:53:58 +02:00
f6544f69ca fixed macro usage 2022-09-28 17:26:12 +02:00
c61222403e fixed using placement 2022-09-28 17:24:44 +02:00
c487f24611 honored select_on_container_copy_construction 2022-09-28 13:55:44 +02:00
8dcd40c8f3 harmonized adjust_hash interface 2022-09-28 13:46:25 +02:00
0ea2cb5a7a refactored dummy_groups to avoid explicit array initialization 2022-09-28 11:47:23 +02:00
5a4a2f3ffd added Neon support 2022-09-28 11:21:44 +02:00
5293b328b7 made emplace_impl rehashing more robust 2022-09-28 10:05:45 +02:00
2889aab226 made dependency on size_policy minimum size explicit 2022-09-28 09:54:44 +02:00
7a1a25991f removed unnecessary check in max_load 2022-09-28 09:45:55 +02:00
43f8e5e933 avoided being too smart in new_arrays's memory initialization 2022-09-28 09:42:37 +02:00
f4940d9344 avoided ugly casts in table_iterator::increment 2022-09-28 09:40:05 +02:00
701cdff982 refactored dummy_groups 2022-09-28 09:36:52 +02:00
450c915284 Get insert_tests passing under sanitizers 2022-09-27 14:25:57 -07:00
892e437428 Restructure insert_tests invocations 2022-09-27 10:34:04 -07:00
8905157c1e Update uint64 benchmarks to profile the new container, its internal table and the rc15 release candidate 2022-09-27 10:30:39 -07:00
2eb57995dd Add initial find() impl for benchmarks 2022-09-27 10:30:14 -07:00
b64b88eb65 Add intial erase() impl for benchmarks 2022-09-27 10:28:50 -07:00
3da4b6411c Add rvalue overload of insert() for flat_map 2022-09-27 10:28:10 -07:00
e115634812 Fix bug in equal_range() for unordered_flat_map 2022-09-27 10:27:41 -07:00
fc0f354df4 Switch from leading underscore to trailing underscore for shadowed variables 2022-09-27 08:19:01 -07:00
ba5cbd5ca6 Add simple initial draft of unordered_flat_map 2022-09-26 15:18:13 -07:00
505b060637 Update insert_tests to handle new open-addressing table implementation 2022-09-26 15:17:54 -07:00
12b9bd0a6d Fix warnings in internal foa table about float/size_t conversions 2022-09-26 15:17:21 -07:00
e8715ffb96 Update internal foa table implementation to use to_address when Allocators use fancy pointers 2022-09-26 15:16:52 -07:00
5d34b137a3 Fix shadowing warnings in foa.hpp 2022-09-26 11:40:47 -07:00
ad352a6703 Fix cast warning in mark_overflow() 2022-09-26 10:27:22 -07:00
7d69d18473 Initial commit of foa.hpp 2022-09-26 10:12:05 -07:00
668abe4b0a Merge pull request #146 from cmazakas/feature/rehash-doc-updates
Rehash Doc Updates
2022-09-15 19:33:54 +02:00
5dcccfda3b Update docs for rehash/reserve for unordered_multimap 2022-09-15 07:59:53 -07:00
56b271850a Update docs for rehash/reserve for unordered_multiset 2022-09-15 07:59:53 -07:00
d338e94267 Update docs for rehash/reserve for unordered_set 2022-09-15 07:59:53 -07:00
42abfe3c7d Update docs for rehash/reserve for unordered_map 2022-09-15 07:59:53 -07:00
6ef6540378 Merge pull request #144 from cmazakas/feature/rehashing-conformity
Rehashing Conformity
2022-09-13 23:53:15 +02:00
9a9b8e0a7b Update rehashing implementation to better reflect STL conformance 2022-09-13 12:33:21 -07:00
5ad86f559f Clean up implementation of recalculate_max_load() to avoid std::floor/std::ceil 2022-09-13 12:33:21 -07:00
a8b0e19a33 Update rehashing tests to better stress test them for conformity with libc++ and other STL implementations 2022-09-13 12:33:21 -07:00
2b61fbb8df Merge pull request #145 from cmazakas/bugfix/noexcept-move-assign
Fix move assign noexcept violation/perf regression
2022-09-13 20:46:38 +02:00
dea6ce164c Remove erroneous unconditional call to reserve() from move_assign() when pocma is false 2022-09-12 13:16:45 -07:00
9ebb705e75 Update noexcept_tests to cover both values of POCMA and to also test move-assigning into larger and smaller hash tables 2022-09-12 13:16:45 -07:00
010dfa52e3 Merge pull request #143 from cmazakas/feature/no-alloc-default-construction
Update internal table to no longer allocate on default constructions and when the bucket count is 0
2022-08-31 09:21:13 -07:00
db9d9d1f77 Update implementation to support a default-constructible table and grouped_bucket_array 2022-08-30 15:20:31 -07:00
6f342bf119 Set default_bucket_count to zero 2022-08-30 15:20:31 -07:00
48765e82e0 Update tests to account for a default-constructed container having no buckets 2022-08-30 15:20:31 -07:00
f141cd1dea Merge pull request #141 from cmazakas/fix/appveyor-timeout
Split 64-bit mingw appveyor job into two to help prevent timeouts
2022-08-20 11:21:40 +03:00
6258856d2b Split 64-bit mingw appveyor job into two to help prevent timeouts 2022-08-19 13:31:02 -07:00
c93ea188f7 Merge pull request #142 from sdarwin/droneconfig
drone.jsonnet update
2022-08-19 23:15:26 +03:00
329eb419f5 drone.jsonnet update 2022-08-19 10:58:56 -06:00
e83c42ca26 Merge pull request #140 from boostorg/bugfix/valid-post-move
Fix use-after-move segfault
2022-08-19 00:54:07 +03:00
f9eae4153f Update code to be valid when the internal buckets_ data member is moved-from 2022-08-18 09:04:53 -07:00
7b41f4783f Update value type used by test allocators in move_tests so that the STL containers can be swapped in 2022-08-17 14:12:29 -07:00
7227cfc68a Add post-move tests to verify the container is valid after a move 2022-08-17 14:12:29 -07:00
206 changed files with 11720 additions and 995 deletions

View File

@ -42,7 +42,12 @@ environment:
- FLAVOR: Visual Studio 2017
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
B2_CXXSTD: 14,17,latest
B2_CXXSTD: 14,17
B2_TOOLSET: msvc-14.1
- FLAVOR: Visual Studio 2017
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
B2_CXXSTD: latest
B2_TOOLSET: msvc-14.1
- FLAVOR: cygwin (32-bit)
@ -63,7 +68,7 @@ environment:
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
ADDPATH: C:\cygwin64\bin;
B2_ADDRESS_MODEL: 64
B2_CXXSTD: 03,11
B2_CXXSTD: 03
B2_TOOLSET: gcc
B2_FLAGS: "include=libs/unordered/test/unordered include=libs/unordered/test/exception"
@ -71,21 +76,51 @@ environment:
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
ADDPATH: C:\cygwin64\bin;
B2_ADDRESS_MODEL: 64
B2_CXXSTD: 14,1z
B2_CXXSTD: 11
B2_TOOLSET: gcc
B2_FLAGS: "include=libs/unordered/test/unordered include=libs/unordered/test/exception"
- FLAVOR: cygwin (64-bit, latest)
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"
- FLAVOR: cygwin (64-bit, latest)
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"
- FLAVOR: mingw-w64, 32 bit
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,17,2a
B2_CXXSTD: 03,11,14
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: mingw-w64, 32 bit
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_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: mingw-w64, 64 bit
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,17,2a
B2_CXXSTD: 03,11,14
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64
- FLAVOR: mingw-w64, 64 bit
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_TOOLSET: gcc
B2_ADDRESS_MODEL: 64

View File

@ -32,6 +32,7 @@ local linux_pipeline(name, image, environment, packages = "", sources = [], arch
commands:
[
'set -e',
'uname -a',
'wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -',
] +
(if sources != [] then [ ('apt-add-repository "' + source + '"') for source in sources ] else []) +
@ -63,6 +64,7 @@ local macos_pipeline(name, environment, xcode_version = "12.2", osx_version = "c
environment: environment + { "DEVELOPER_DIR": "/Applications/Xcode-" + xcode_version + ".app/Contents/Developer" },
commands:
[
'uname -a',
'export LIBRARY=' + library,
'./.drone/drone.sh',
]
@ -89,6 +91,7 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
environment: environment,
commands:
[
'echo $env:DRONE_STAGE_MACHINE',
'cmd /C .drone\\\\drone.bat ' + library,
]
}
@ -135,31 +138,217 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
),
linux_pipeline(
"Linux 20.04 GCC 9* ARM64 32",
"Linux 16.04 GCC 5* 32/64",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 18.04 GCC 6 32/64",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-6', CXXSTD: '03,11,14', ADDRMD: '32,64' },
"g++-6-multilib",
),
linux_pipeline(
"Linux 18.04 GCC 7* 32/64",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 18.04 GCC 8 32/64",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-8', CXXSTD: '03,11,14,17', ADDRMD: '32,64' },
"g++-8-multilib",
),
linux_pipeline(
"Linux 20.04 GCC 9* 32/64",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 20.04 GCC 9* ARM64",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a', ADDRMD: '32' },
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a' },
arch="arm64",
),
linux_pipeline(
"Linux 20.04 GCC 9* ARM64 64",
"Linux 20.04 GCC 9* S390x",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a', ADDRMD: '64' },
arch="arm64",
),
linux_pipeline(
"Linux 20.04 GCC 9* S390x 32",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a', ADDRMD: '32' },
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a' },
arch="s390x",
),
linux_pipeline(
"Linux 20.04 GCC 9* S390x 64",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a', ADDRMD: '64' },
arch="s390x",
"Linux 20.04 GCC 10 32/64",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-10', CXXSTD: '03,11,14,17,20', ADDRMD: '32,64' },
"g++-10-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 11* 32/64",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,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,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (17,20,2b)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '17,20,2b', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN (03,11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '03,11,14', ADDRMD: '64' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN (17,20,2b)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '17,20,2b', ADDRMD: '64' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 16.04 Clang 3.5",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.5', CXXSTD: '03,11' },
"clang-3.5",
),
linux_pipeline(
"Linux 16.04 Clang 3.6",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.6', CXXSTD: '03,11,14' },
"clang-3.6",
),
linux_pipeline(
"Linux 16.04 Clang 3.7",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.7', CXXSTD: '03,11,14' },
"clang-3.7",
),
linux_pipeline(
"Linux 16.04 Clang 3.8",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.8', CXXSTD: '03,11,14' },
"clang-3.8",
),
linux_pipeline(
"Linux 18.04 Clang 3.9",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.9', CXXSTD: '03,11,14' },
"clang-3.9",
),
linux_pipeline(
"Linux 18.04 Clang 4.0",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-4.0', CXXSTD: '03,11,14' },
"clang-4.0",
),
linux_pipeline(
"Linux 18.04 Clang 5.0",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-5.0', CXXSTD: '03,11,14,1z' },
"clang-5.0",
),
linux_pipeline(
"Linux 18.04 Clang 6.0",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-6.0', CXXSTD: '03,11,14,17' },
"clang-6.0",
),
linux_pipeline(
"Linux 20.04 Clang 7",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-7', CXXSTD: '03,11,14,17' },
"clang-7",
),
linux_pipeline(
"Linux 20.04 Clang 8",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-8', CXXSTD: '03,11,14,17' },
"clang-8",
),
linux_pipeline(
"Linux 20.04 Clang 9",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-9', CXXSTD: '03,11,14,17,2a' },
"clang-9",
),
linux_pipeline(
"Linux 20.04 Clang 10",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-10', CXXSTD: '03,11,14,17,2a' },
"clang-10",
),
linux_pipeline(
"Linux 20.04 Clang 11",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-11', CXXSTD: '03,11,14,17,2a' },
"clang-11",
),
linux_pipeline(
"Linux 20.04 Clang 12",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-12', CXXSTD: '03,11,14,17,2a' },
"clang-12",
),
linux_pipeline(
"Linux 22.04 Clang 13",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-13', CXXSTD: '03,11,14,17,20' },
"clang-13",
),
linux_pipeline(
"Linux 22.04 Clang 14 UBSAN",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14,17,20' } + ubsan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 ASAN",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14,17,20' } + asan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 15",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-15', CXXSTD: '03,11,14,17,20,2b' },
"clang-15",
["deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-15 main"],
),
macos_pipeline(
@ -168,8 +357,15 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
),
macos_pipeline(
"MacOS 10.15 Xcode 12.2 ASAN",
"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",
),
windows_pipeline(
"Windows VS2015 msvc-14.0",
"cppalliance/dronevs2015",
{ TOOLSET: 'msvc-14.0', CXXSTD: '14,latest' },
),
windows_pipeline(
@ -177,4 +373,16 @@ local windows_pipeline(name, image, environment, arch = "amd64") =
"cppalliance/dronevs2017",
{ TOOLSET: 'msvc-14.1', CXXSTD: '14,17,latest' },
),
windows_pipeline(
"Windows VS2019 msvc-14.2",
"cppalliance/dronevs2019",
{ TOOLSET: 'msvc-14.2', CXXSTD: '14,17,20,latest' },
),
windows_pipeline(
"Windows VS2022 msvc-14.3",
"cppalliance/dronevs2022:1",
{ TOOLSET: 'msvc-14.3', CXXSTD: '14,17,20,latest' },
),
]

View File

@ -5,6 +5,7 @@
# https://www.boost.org/LICENSE_1_0.txt
set -ex
export PATH=~/.local/bin:/usr/local/bin:$PATH
DRONE_BUILD_DIR=$(pwd)

View File

@ -42,45 +42,37 @@ jobs:
matrix:
include:
# Linux, gcc
- { compiler: gcc-4.8, cxxstd: '03,11', os: ubuntu-18.04, install: 'g++-4.8-multilib', address-model: '32,64' }
- { compiler: gcc-4.9, cxxstd: '03,11', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: gcc-5, cxxstd: '03,11,14,1z', os: ubuntu-18.04, install: 'g++-5-multilib', address-model: '32,64' }
- { compiler: gcc-6, cxxstd: '03,11,14,17', os: ubuntu-18.04, install: 'g++-6-multilib', address-model: '32,64' }
- { compiler: gcc-7, cxxstd: '03,11,14,17', os: ubuntu-18.04, install: 'g++-7-multilib', address-model: '32,64' }
- { compiler: gcc-8, cxxstd: '03,11,14,17,2a', os: ubuntu-18.04, install: 'g++-8-multilib', address-model: '32,64' }
- { compiler: gcc-9, cxxstd: '03,11,14,17,2a', os: ubuntu-18.04, install: 'g++-9-multilib', address-model: '32,64' }
- { compiler: gcc-10, cxxstd: '03,11,14,17,20', os: ubuntu-20.04, install: 'g++-10-multilib', address-model: '32,64' }
- { compiler: gcc-11, cxxstd: '03,11,14,17,20', os: ubuntu-20.04, install: 'g++-11-multilib', address-model: '32,64' }
- { compiler: gcc-12, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, install: 'g++-12-multilib', address-model: '32,64' }
- { name: GCC w/ sanitizers, sanitize: yes,
compiler: gcc-12, cxxstd: '03,11,14,17,20', os: ubuntu-22.04 }
- { compiler: gcc-7, cxxstd: '03,11,14,17', os: ubuntu-20.04, install: 'g++-7' }
- { compiler: gcc-8, cxxstd: '03,11,14,17', os: ubuntu-20.04, install: 'g++-8' }
- { compiler: gcc-9, cxxstd: '03,11,14,17', os: ubuntu-20.04, install: 'g++-9' }
- { compiler: gcc-10, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, install: 'g++-10' }
- { compiler: gcc-11, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, install: 'g++-11' }
- { name: "gcc-12 w/ sanitizers (03,11,14)", sanitize: yes,
compiler: gcc-12, cxxstd: '03,11,14', os: ubuntu-22.04, ccache_key: "san1" }
- { 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' }
compiler: gcc-8, cxxstd: '03,11', os: ubuntu-20.04, install: 'g++-8-multilib', address-model: '32,64', ccache_key: "cov" }
# Linux, clang
- { compiler: clang-3.7, cxxstd: '03,11,14', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: clang-3.8, cxxstd: '03,11,14', os: ubuntu-20.04, container: 'ubuntu:16.04' }
- { compiler: clang-3.9, cxxstd: '03,11,14', os: ubuntu-18.04 }
- { compiler: clang-4.0, cxxstd: '03,11,14', os: ubuntu-18.04 }
- { compiler: clang-5.0, cxxstd: '03,11,14,1z', os: ubuntu-18.04 }
- { compiler: clang-6.0, cxxstd: '03,11,14,17', os: ubuntu-18.04 }
- { compiler: clang-7, cxxstd: '03,11,14,17', os: ubuntu-18.04 }
- { compiler: clang-8, cxxstd: '03,11,14,17', os: ubuntu-18.04 }
- { compiler: clang-9, cxxstd: '03,11,14,17,2a', os: ubuntu-20.04 }
- { compiler: clang-10, cxxstd: '03,11,14,17,20', os: ubuntu-20.04 }
- { compiler: clang-11, cxxstd: '03,11,14,17,20', os: ubuntu-20.04 }
- { compiler: clang-12, cxxstd: '03,11,14,17,20', os: ubuntu-20.04 }
- { compiler: clang-13, cxxstd: '03,11,14,17,20', os: ubuntu-22.04 }
- { compiler: clang-14, cxxstd: '03,11,14,17,20', os: ubuntu-22.04 }
# libc++
- { compiler: clang-6.0, cxxstd: '03,11,14', os: ubuntu-18.04, stdlib: libc++, install: 'clang-6.0 libc++-dev libc++abi-dev' }
- { compiler: clang-12, cxxstd: '03,11,14,17,20', os: ubuntu-20.04, stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev' }
- { name: Clang w/ sanitizers, sanitize: yes,
compiler: clang-12, cxxstd: '03,11,14,17,20', os: ubuntu-20.04, stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev' }
# 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' }
- { compiler: clang-10, cxxstd: '03,11,14,17,20', os: ubuntu-20.04, stdlib: libc++, install: 'clang-10 libc++-10-dev libc++abi-10-dev' }
- { compiler: clang-11, cxxstd: '03,11,14,17,20', os: ubuntu-22.04, stdlib: libc++, install: 'clang-11 libc++-11-dev libc++abi-11-dev' }
# clang-12 doesn't work on ubuntu-22.04, the linker can't find -lunwind for some reason
- { name: "clang-12 w/ sanitizers (03,11,14)", sanitize: yes,
compiler: clang-12, cxxstd: '03,11,14', os: ubuntu-20.04, stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev', ccache_key: "san1" }
- { name: "clang-12 w/ sanitizers (17,20,2b)", sanitize: yes,
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 }
- { compiler: clang, cxxstd: '03,11,14,17,2a', os: macos-11, sanitize: yes }
timeout-minutes: 120
runs-on: ${{matrix.os}}
@ -119,8 +111,8 @@ jobs:
if: env.B2_USE_CCACHE
with:
path: ~/.ccache
key: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-${{github.sha}}
restore-keys: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-
key: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-${{matrix.ccache_key}}-${{github.sha}}
restore-keys: ${{matrix.os}}-${{matrix.container}}-${{matrix.compiler}}-${{matrix.ccache_key}}-
- name: Fetch Boost.CI
uses: actions/checkout@v3

View File

@ -5,6 +5,7 @@
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#include <boost/unordered_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>
@ -294,6 +295,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_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 =
@ -366,7 +370,10 @@ template<> struct fnv1a_hash_impl<64>
}
};
struct fnv1a_hash: fnv1a_hash_impl< std::numeric_limits<std::size_t>::digits > {};
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>>;
@ -374,6 +381,9 @@ 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_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<
@ -418,10 +428,11 @@ int main()
{
init_indices();
#if 0
#if 1
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#ifdef HAVE_ABSEIL
@ -449,6 +460,7 @@ int main()
test<std_unordered_map_fnv1a>( "std::unordered_map, FNV-1a" );
test<boost_unordered_map_fnv1a>( "boost::unordered_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_ABSEIL
@ -476,7 +488,7 @@ int main()
for( auto const& x: times )
{
std::cout << std::setw( 31 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
std::cout << std::setw( 35 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}

View File

@ -5,6 +5,7 @@
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#include <boost/unordered_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>
@ -295,6 +296,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_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 =
@ -367,7 +371,10 @@ template<> struct fnv1a_hash_impl<64>
}
};
struct fnv1a_hash: fnv1a_hash_impl< std::numeric_limits<std::size_t>::digits > {};
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>>;
@ -375,6 +382,9 @@ 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_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<
@ -419,10 +429,11 @@ int main()
{
init_indices();
#if 0
#if 1
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#ifdef HAVE_ABSEIL
@ -450,6 +461,7 @@ int main()
test<std_unordered_map_fnv1a>( "std::unordered_map, FNV-1a" );
test<boost_unordered_map_fnv1a>( "boost::unordered_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_ABSEIL
@ -477,7 +489,7 @@ int main()
for( auto const& x: times )
{
std::cout << std::setw( 31 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
std::cout << std::setw( 35 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}

View File

@ -5,6 +5,7 @@
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#include <boost/unordered_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>
@ -311,6 +312,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_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 =
@ -347,6 +351,7 @@ int main()
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#ifdef HAVE_ABSEIL
@ -374,7 +379,7 @@ int main()
for( auto const& x: times )
{
std::cout << std::setw( 25 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
std::cout << std::setw( 27 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}

View File

@ -5,6 +5,7 @@
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#include <boost/unordered_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>
@ -311,6 +312,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_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 =
@ -347,6 +351,7 @@ int main()
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#ifdef HAVE_ABSEIL
@ -374,7 +379,7 @@ int main()
for( auto const& x: times )
{
std::cout << std::setw( 25 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
std::cout << std::setw( 27 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}

402
benchmark/uuid.cpp Normal file
View File

@ -0,0 +1,402 @@
// Copyright 2021, 2022 Peter Dimov.
// 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
#include <boost/unordered_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>
#include <boost/config.hpp>
#ifdef HAVE_ABSEIL
# include "absl/container/node_hash_map.h"
# include "absl/container/flat_hash_map.h"
#endif
#include <unordered_map>
#include <vector>
#include <memory>
#include <cstdint>
#include <iostream>
#include <iomanip>
#include <chrono>
#include <cstring>
using namespace std::chrono_literals;
static void print_time( std::chrono::steady_clock::time_point & t1, char const* label, std::uint64_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;
}
constexpr unsigned N = 2'000'000;
constexpr int K = 10;
struct uuid
{
unsigned char data[ 16 ];
uuid(): data()
{
}
uuid( std::uint64_t low, std::uint64_t high ) noexcept
{
boost::endian::store_little_u64( data + 0, low );
boost::endian::store_little_u64( data + 8, high );
}
inline friend std::size_t hash_value( uuid const& u ) noexcept
{
std::uint64_t low = boost::endian::load_little_u64( u.data + 0 );
std::uint64_t high = boost::endian::load_little_u64( u.data + 8 );
std::size_t r = 0;
boost::hash_combine( r, low );
boost::hash_combine( r, high );
return r;
}
inline friend bool operator==( uuid const& u1, uuid const& u2 ) noexcept
{
return std::memcmp( u1.data, u2.data, 16 ) == 0;
}
};
namespace std
{
template<> struct hash< ::uuid >
{
std::size_t operator()( uuid const& u ) const noexcept
{
return hash_value( u );
}
};
} // namespace std
static std::vector< uuid > indices1, indices2, indices3;
static void init_indices()
{
indices1.push_back( {} );
for( unsigned i = 1; i <= N*2; ++i )
{
indices1.push_back( { i, 0 } );
}
indices2.push_back( {} );
{
boost::detail::splitmix64 rng;
for( unsigned i = 1; i <= N*2; ++i )
{
indices2.push_back( { rng(), rng() } );
}
}
indices3.push_back( {} );
for( unsigned i = 1; i <= N*2; ++i )
{
uuid k( i, 0 );
std::reverse( k.data + 0, k.data + 16 );
indices3.push_back( k );
}
}
template<class Map> BOOST_NOINLINE void test_insert( Map& map, std::chrono::steady_clock::time_point & t1 )
{
for( unsigned i = 1; i <= N; ++i )
{
map.insert( { indices1[ i ], i } );
}
print_time( t1, "Consecutive insert", 0, map.size() );
for( unsigned i = 1; i <= N; ++i )
{
map.insert( { indices2[ i ], i } );
}
print_time( t1, "Random insert", 0, map.size() );
for( unsigned i = 1; i <= N; ++i )
{
map.insert( { indices3[ i ], i } );
}
print_time( t1, "Consecutive reversed insert", 0, map.size() );
std::cout << std::endl;
}
template<class Map> BOOST_NOINLINE void test_lookup( Map& map, std::chrono::steady_clock::time_point & t1 )
{
std::uint64_t s;
s = 0;
for( int j = 0; j < K; ++j )
{
for( unsigned i = 1; i <= N * 2; ++i )
{
auto it = map.find( indices1[ i ] );
if( it != map.end() ) s += it->second;
}
}
print_time( t1, "Consecutive lookup", s, map.size() );
s = 0;
for( int j = 0; j < K; ++j )
{
for( unsigned i = 1; i <= N * 2; ++i )
{
auto it = map.find( indices2[ i ] );
if( it != map.end() ) s += it->second;
}
}
print_time( t1, "Random lookup", s, map.size() );
s = 0;
for( int j = 0; j < K; ++j )
{
for( unsigned i = 1; i <= N * 2; ++i )
{
auto it = map.find( indices3[ i ] );
if( it != map.end() ) s += it->second;
}
}
print_time( t1, "Consecutive reversed lookup", s, map.size() );
std::cout << std::endl;
}
template<class Map> BOOST_NOINLINE void test_iteration( Map& map, std::chrono::steady_clock::time_point & t1 )
{
auto it = map.begin();
while( it != map.end() )
{
if( it->second & 1 )
{
if constexpr( std::is_void_v< decltype( map.erase( it ) ) > )
{
map.erase( it++ );
}
else
{
it = map.erase( it );
}
}
else
{
++it;
}
}
print_time( t1, "Iterate and erase odd elements", 0, map.size() );
std::cout << std::endl;
}
template<class Map> BOOST_NOINLINE void test_erase( Map& map, std::chrono::steady_clock::time_point & t1 )
{
for( unsigned i = 1; i <= N; ++i )
{
map.erase( indices1[ i ] );
}
print_time( t1, "Consecutive erase", 0, map.size() );
for( unsigned i = 1; i <= N; ++i )
{
map.erase( indices2[ i ] );
}
print_time( t1, "Random erase", 0, map.size() );
for( unsigned i = 1; i <= N; ++i )
{
map.erase( indices3[ i ] );
}
print_time( t1, "Consecutive reversed erase", 0, 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<uuid, std::uint64_t> map;
auto t0 = std::chrono::steady_clock::now();
auto t1 = t0;
test_insert( 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_lookup( map, t1 );
test_iteration( map, t1 );
test_lookup( map, t1 );
test_erase( 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 );
}
// 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> >;
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_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
int main()
{
init_indices();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<multi_index_map>( "multi_index_map" );
#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( 27 ) << ( 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: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

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