Compare commits

..

966 Commits

Author SHA1 Message Date
Christian Mazakas 0c93fbc330 Make typedef private and rename it so older versions of msvc don't erroneously treat the typedef like it's in scope when doing template instantiation 2023-02-13 09:10:21 -08:00
Christian Mazakas b8ff76f4ab Manually implement node_handle_base's default constructor instead of defaulting it which can delete it on older toolchains 2023-02-10 15:16:59 -08:00
Christian Mazakas 5df80086ed Add foa-based node containers to extract tests in transparent_tests 2023-02-10 14:19:20 -08:00
Christian Mazakas f9c32e7f8c Clean up impl of node_handle 2023-02-10 14:19:01 -08:00
Christian Mazakas 21e673c697 Begin cleanup of node_handle implementation 2023-02-09 15:59:23 -08:00
Christian Mazakas b96dd2184f Add foa-based node containers to node_handle_tests 2023-02-08 15:08:51 -08:00
Christian Mazakas 9636875596 Fix incorrect placement new of allocator type by reifying ad hoc node handle implementations into a base class 2023-02-08 10:36:19 -08:00
Christian Mazakas bd6829220c Add extract/insert semantics to foa-based node set, add more tests 2023-02-07 15:17:25 -08:00
Christian Mazakas 71bf336c9d Add missing empty_ initialization to move constructor of node_type 2023-02-07 10:08:58 -08:00
Christian Mazakas b7c1e6a184 Remove print statements 2023-02-07 10:08:34 -08:00
Christian Mazakas 77edd24b4e Interim checkin of attempt at extract/insert node handles 2023-02-06 15:56:55 -08:00
Christian Mazakas b7032baaf4 fixup osx fix 2023-02-03 10:02:49 -08:00
Christian Mazakas 6580dc8d80 Add regression test for test::exception::less 2023-02-03 10:02:28 -08:00
Christian Mazakas 5384edd568 Attempt osx ci fix by fixing logic buf in less_impl for test::exception::less 2023-02-02 13:32:08 -08:00
Christian Mazakas 2a7a8f55e1 Revert OSX CI experiment as it breaks emplace_tests 2023-02-01 10:49:20 -08:00
Christian Mazakas 18a664c4a6 Experiment for failing OSX CI 2023-02-01 10:25:50 -08:00
Christian Mazakas e1b394d5b2 Disable immovable test for libstdc++ versions below 6.0 as their std::pair implementation doesn't support immovable types 2023-02-01 09:02:05 -08:00
Christian Mazakas dc548a1a9e Update compare_range() to skip size check and use direct comparison function 2023-01-31 15:59:29 -08:00
Christian Mazakas 2787717d78 Update compare_range to use BOOST_TEST_ALL_WITH in lieu of homegrown implementation 2023-01-31 13:55:06 -08:00
Christian Mazakas d6ba04ca4b Remove use of unevaluated function in init_type_insert_tests for older versions of gcc 2023-01-31 13:45:29 -08:00
Christian Mazakas 43add11970 Add macos-12 to GHA 2023-01-31 13:45:10 -08:00
Christian Mazakas 8e45197d4d Add -Wunused-template only to clang-14 builds 2023-01-31 13:44:57 -08:00
Christian Mazakas a46220986f Replace usage of rote try-catch with corresponding Boost versions 2023-01-31 10:32:06 -08:00
Christian Mazakas 16099478db Clean up implementation of emplace_dispatch(false_type) 2023-01-31 10:31:52 -08:00
Christian Mazakas e5320df017 Fix msvc warnings 2023-01-31 09:03:25 -08:00
Christian Mazakas b9fcfeb24e Update foa table to support immovable types in the case of the node-based maps 2023-01-30 13:55:50 -08:00
Christian Mazakas f1aeb3b099 Update init_type_insert_tests for node-based foa containers 2023-01-30 13:55:50 -08:00
Christian Mazakas 5b706bb7b5 Update node-based foa containers to default their element_type default constructor and delete the copy constructor to get the appropriate type-based optimizations 2023-01-30 13:55:50 -08:00
Christian Mazakas fd7d888832 Add missing test back in for non-foa runs 2023-01-30 13:55:50 -08:00
Christian Mazakas 827c69eb1a Conditionally exclude node_map from non-foa test runs 2023-01-30 13:55:50 -08:00
Christian Mazakas 9973b3f8a8 Comment tests back in 2023-01-30 13:55:50 -08:00
joaquintides e6f911e815 provide erase_on_exit ctor 2023-01-30 13:55:50 -08:00
joaquintides 53e4531295 fixed bug with dangling moved element on throwing rehash during merge 2023-01-30 13:55:50 -08:00
Christian Mazakas 8da44f4f46 Check in interim tests for easy debugging between team members 2023-01-30 13:55:50 -08:00
Christian Mazakas dddfbf8aa8 Add node-based foa containers to swap_exception_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas a66eedef58 Add node-based foa containers to insert_exception_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 202049ddc0 Add node-based foa containers to merge_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 000833d647 fixup insert_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas d84e6f7be2 fixup assign_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 8acfccdf6e fixup constructor_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas c85dd289f9 Add node-based foa containers to simple_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 8ac6019d30 Add node-based foa containers to incomplete_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 9602799710 Add node-based foa containers to link tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 217a171b33 Add node-based foa containers to noexcept_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas b372ab6641 Add node-based foa containers to compile_map 2023-01-30 13:55:50 -08:00
Christian Mazakas 140cb56e2b Add node-based foa containers to compile_set 2023-01-30 13:55:50 -08:00
Christian Mazakas 8b842c4640 fixup fwd_set_test 2023-01-30 13:55:50 -08:00
Christian Mazakas 9b2ecd6ec5 Add node-based foa containers to fwd_map_test 2023-01-30 13:55:50 -08:00
Christian Mazakas 351e5ae41a Add node-based foa containers to fwd_set_test 2023-01-30 13:55:50 -08:00
Christian Mazakas 1c5733ed15 Add node-based foa containers to exception tests 2023-01-30 13:55:50 -08:00
Christian Mazakas cd44e0ba08 Add node-based foa containers to max_load_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 3363261ad8 Add node-based foa containers to scary_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 58b8b00233 Add node-based foa containers to reserve_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 6474f3c8d3 Add node-based foa containers to transparent_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 63269d2115 Add node-based foa container to scoped_allocator tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 0925a99d98 Add node-based foa containers to swap_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 1b23d08941 Add node-based foa containers to equality_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 28142b6251 Add node-based foa container to at_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas b60f2ce22c Add rehash tests proving that elements are not relocated for node-based containers 2023-01-30 13:55:50 -08:00
Christian Mazakas 473ed9b88b Update check used to determine when to move during rehashing to accomodate node-based containers 2023-01-30 13:55:50 -08:00
Christian Mazakas c554c5b1c9 Add node-based foa containers to rehash_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas e244b35d23 fixup load_factor_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas f7bfb85d84 Add node-based foa containers to load_factor_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 5e0257cb08 Add node-based foa containers to erase_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 64721fa1ef Clean up insert tests to use more idiomatic UNORDERED_TEST macros 2023-01-30 13:55:50 -08:00
Christian Mazakas 5bfc77c3e4 Add node-based foa containers to emplace_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas aaf0e40247 Update unordered_node_map to be a proper copy of unordered_flat_map 2023-01-30 13:55:50 -08:00
Christian Mazakas 8e86a263fc Add node-based foa containers to insert_hint_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas a5a5b75dcc Add node-based foa containers to post_move_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas b57b51b036 Remove moved_value_from() in favor of overloading move() in container type traits 2023-01-30 13:55:50 -08:00
Christian Mazakas 91b3863c77 Add node-based foa containers to erase_if tests 2023-01-30 13:55:50 -08:00
Christian Mazakas b4a23a875c fixup copy_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas f0afa5aaef Add node-based foa containers to equivalent_keys_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 7ce7ef5050 Add moved_value_from() to container policies, enabling proper move semantics for node-based containers in the case of unequal allocators 2023-01-30 13:55:50 -08:00
Christian Mazakas a3d4a078de Add node-based foa containers to move_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 1e61423eac Prove relevance of strong typedef for node-based foa containers 2023-01-30 13:55:50 -08:00
Christian Mazakas 904e806b1e Update node containers to no longer memcpy their pointer arrays 2023-01-30 13:55:50 -08:00
Christian Mazakas 3201a014c4 Add node-based foa containers to copy_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 1a87580c58 Add node-based foa containers to contains_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas ab58b613c9 Remove multiset from set_tests2_impl call 2023-01-30 13:55:50 -08:00
Christian Mazakas bb57d91675 Update insert_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 7d1e64a3c6 Update node set to conditionally use strong vs weak typedef 2023-01-30 13:55:50 -08:00
Christian Mazakas ff956ad080 Update flat_set to eschew strong typedef 2023-01-30 13:55:50 -08:00
Christian Mazakas d9bf1e435c Revert perfect forwarding when hashing for transparent ops 2023-01-30 13:55:50 -08:00
Christian Mazakas eb6d0d1f66 remove print statements 2023-01-30 13:55:50 -08:00
Christian Mazakas bce898165c Add transparent insert, show we don't need a strong typedef 2023-01-30 13:55:50 -08:00
Christian Mazakas e3c66a5e82 Remove print statements 2023-01-30 13:55:50 -08:00
Christian Mazakas b167ab7d84 Update code to use strong typedefs 2023-01-30 13:55:50 -08:00
Christian Mazakas 71fd0c07ed Add new failing test case 2023-01-30 13:55:50 -08:00
Christian Mazakas 130b483123 Add node-based foa containers to assign_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 03ee5d135b Add node-based foa containers to constructor_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 72841102f6 Add node-based foa containers to find_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas cc6748e2b1 Flesh out insert_tests for node-based foa set 2023-01-30 13:55:50 -08:00
Christian Mazakas f99decc0ca Add unordered_node_set to the insert_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas ae10a1e0df Add unordered_node_set 2023-01-30 13:55:50 -08:00
Christian Mazakas b1e497cd1d Get test suite passing 2023-01-30 13:55:50 -08:00
Christian Mazakas cbe19722a3 interim commit 2023-01-30 13:55:50 -08:00
Christian Mazakas dcff2ac5b5 Pull type policies into detail namespace 2023-01-30 13:55:50 -08:00
Christian Mazakas cb4e636d78 Implement new type policy requirements for flat containers 2023-01-30 13:55:50 -08:00
Christian Mazakas 6e41418744 Reinstate insert_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 1d8d065113 Update interim prototype to eschew allocator wrapper and instead use extended map_types 2023-01-30 13:55:50 -08:00
Christian Mazakas a858517c49 Update clang to warn on unused static function templates 2023-01-30 13:55:50 -08:00
Christian Mazakas 2cdcbd24f5 Catch remaining places where value_type was used instead of storage_type 2023-01-30 13:55:50 -08:00
Christian Mazakas 721d8713cd Extend insert_tests to test unordered_node_map wherever unordered_flat_map is also tested 2023-01-30 13:55:50 -08:00
Christian Mazakas 62e1d3eafb Remove bad static_assert() from insert_tests 2023-01-30 13:55:50 -08:00
Christian Mazakas 3744bafa55 Update implementation to use storage_type when allocating arrays and constructing/destroying elements 2023-01-30 13:55:50 -08:00
Christian Mazakas f034e43b74 Get simple prototype of insert_tests working for unordered_node_map 2023-01-30 13:55:50 -08:00
Peter Dimov a74962bc3c Revert reversion of 32 bit mulx multiplier 2023-01-30 20:03:01 +02:00
Peter Dimov cafa1f2278 Revert "Update mulx multipliers"
This reverts commit 9bc471310e.
2023-01-30 10:17:12 +02:00
joaquintides 40d5097d99 fixed sign-conversion warning in Neon group15::match 2023-01-28 10:27:40 +01:00
Peter Dimov 958aea3a61 Merge branch 'develop' into feature/mulx 2023-01-27 22:03:03 +02:00
Peter Dimov 6846eb53fd Change architecture of macOS 12.4 job to arm64 2023-01-27 21:24:28 +02:00
Peter Dimov 3b3ba7d6f7 Avoid false -Warray-bounds positive under mingw32 gcc-12 2023-01-27 20:35:14 +02:00
Peter Dimov 22135bd845 Merge branch 'develop' into feature/mulx 2023-01-27 18:39:46 +02:00
Peter Dimov 141550f585 Update cmake_subdir_test 2023-01-27 18:39:06 +02:00
Peter Dimov d750b39e1e Fix /RTCc failure in mulx32 2023-01-27 18:37:23 +02:00
Peter Dimov 055587acf4 Update cmake_subdir_test 2023-01-27 17:56:00 +02:00
Peter Dimov 0f8dd003a3 Switch default mixing policy from xmx to mulx 2023-01-27 08:15:37 +02:00
Peter Dimov 9bc471310e Update mulx multipliers 2023-01-27 08:00:40 +02:00
Peter Dimov e56aac2e98 Merge branch 'develop' into feature/mulx 2023-01-27 07:58:45 +02:00
Peter Dimov 09a3275357 Add /doc/pdf/ to .gitignore 2023-01-12 01:35:35 +02:00
Christian Mazakas a3c1e643dc Merge pull request #177 from cmazakas/feature/p2363
Feature/p2363
2022-12-20 10:55:20 -08:00
joaquintides 955f94350b typo 2022-12-20 16:46:08 +01:00
joaquintides 1955e4f36a fixed constraint notes in transparent insert with hint 2022-12-20 11:35:15 +01:00
joaquintides 644295db3a added release notes for feature/p2363 2022-12-19 13:24:04 -08:00
joaquintides 0391b6dafc documented P2363 overloads for unordered_flat_set 2022-12-19 13:24:04 -08:00
joaquintides c646f3e3ca documented P2363 overloads for unordered_flat_map 2022-12-19 13:24:04 -08:00
joaquintides 0e9523a0a4 documented P2363 overloads for unordered_multiset 2022-12-19 13:24:04 -08:00
joaquintides 24d8449831 documented P2363 overloads for unordered_set 2022-12-19 13:24:04 -08:00
joaquintides 59d0accce0 documented P2363 overloads for unordered/unordered_multimap 2022-12-19 12:46:46 -08:00
joaquintides 61aedca940 documented P2363 overloads for unordered_map 2022-12-19 12:46:46 -08:00
Christian Mazakas 3fb516367f Add transparent try_emplace() docs to unordered_map 2022-12-19 12:46:46 -08:00
Christian Mazakas 7d77f1d478 Add transparent insert() overloads to unordered_[flat]_set 2022-12-19 12:46:46 -08:00
Christian Mazakas 7572de875c Add transparent insert tests for set containers 2022-12-19 12:46:46 -08:00
Christian Mazakas 63d907cde7 Merge pull request #174 from boostorg/feature/pr165_refactor
feature/pr165 refactor
2022-12-15 10:45:10 -08:00
joaquintides f0037d336d added narrow_cast 2022-12-14 10:39:32 -08:00
Christian Mazakas 8b14b7cddc Add tests for narrow_cast 2022-12-14 10:39:32 -08:00
Christian Mazakas 6c60524fb7 Implement transparent bucket() 2022-12-13 14:28:19 -08:00
Christian Mazakas 8b1dcd3da3 Add tests for transparent bucket() 2022-12-13 14:28:19 -08:00
Christian Mazakas 0e980577b0 Add transparent at() 2022-12-13 14:28:19 -08:00
Christian Mazakas 1f4244ec27 Add tests for transparent at() 2022-12-13 14:28:19 -08:00
Christian Mazakas dfbff823a9 Add transparent subscript 2022-12-13 14:28:19 -08:00
Christian Mazakas b85e17085f Add tests for transparent subscript operator 2022-12-13 14:28:19 -08:00
Christian Mazakas 0a879c1063 Implement transparent insert_or_assign() 2022-12-13 14:28:19 -08:00
Christian Mazakas 01d508b6af Improve naming in insert_or_assign() 2022-12-13 14:28:19 -08:00
Christian Mazakas 7709950111 Add transparent insert_or_assign() tests 2022-12-13 14:28:19 -08:00
Christian Mazakas 1ede59e662 Improve naming in are_transparent 2022-12-13 14:28:19 -08:00
Christian Mazakas bf2b521789 Add transparent try_emplace() 2022-12-13 14:28:19 -08:00
Christian Mazakas ee1515189b Add transparent tests for unordered_map's try_emplace() 2022-12-13 14:28:19 -08:00
Christian Mazakas eb33ad3e3f Merge pull request #173 from cmazakas/fix/exception-guarantees
Exception Guarantees
2022-12-13 14:22:29 -08:00
Christian Mazakas 0ad6ccb0b9 Update FOA noexcept docs for move assignment, swap 2022-12-13 13:53:29 -08:00
Christian Mazakas 0ab4e12502 Update noexcept tests for new FOA requirements 2022-12-13 13:53:29 -08:00
Christian Mazakas c8910e8007 Update FOA move assignment operator to uphold the strong guarantee for Hash, KeyEqual 2022-12-13 13:53:29 -08:00
Christian Mazakas 2043f98593 Add strong exception guarantees around Hash, KeyEqual for move_assign_exception_tests 2022-12-13 13:53:29 -08:00
Christian Mazakas 260b573d8d Update FOA implementation to exhibit strong guarantee for Hash, KeyEqual in copy assignment 2022-12-13 13:53:29 -08:00
Christian Mazakas 4ac3dcc90c Update assign_exception_tests to assert strong guarantee around Hash, KeyEqual pairing 2022-12-13 13:53:29 -08:00
Christian Mazakas 75ea43823e Update test Hash, KeyEqual to be nothrow swappable 2022-12-13 13:53:29 -08:00
Christian Mazakas 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
Christian Mazakas 534170a942 Remove foa-related macro used for relaxing invariant checking in check_equivalent_keys 2022-12-13 13:53:29 -08:00
Christian Mazakas 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
Christian Mazakas 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
joaquintides 91eddbabe8 restricted memcpy to allocators known to not have fancy construct() 2022-12-13 09:35:28 -08:00
Christian Mazakas 47e205487d Fix potential integer overflow in test::hash<int> 2022-12-13 09:35:28 -08:00
Christian Mazakas 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
joaquintides 6be2bf89b6 Merge pull request #175 from boostorg/feature/optimized_try_emplace
feature/optimized_try_emplace
2022-12-13 09:24:56 +01:00
joaquintides 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
Christian Mazakas 63f07daa88 Merge pull request #172 from boostorg/feature/foa_fast_copy
feature/foa fast copy
2022-12-09 10:05:54 -08:00
Peter Dimov 7040c57750 Add mulx_mix 2022-12-08 21:43:57 +02:00
Peter Dimov 9716731864 Disable benchmark/uint64.cpp under libstdc++ 32 bit 2022-12-03 15:37:22 +02:00
Peter Dimov 0bcd46a485 Use enwik8 instead of enwik9 in benchmarks under 32 bit 2022-12-03 15:32:04 +02:00
Peter Dimov 46a2cd109f Define _SILENCE_CXX20_CISO646_REMOVED_WARNING in benchmarks 2022-12-01 01:34:00 +02:00
Peter Dimov 808f8e659a Remove tsl maps from benchmarks 2022-12-01 01:30:54 +02:00
Peter Dimov 8ed05de91c Add ankerl::unordered_dense::map to benchmarks 2022-12-01 00:50:29 +02:00
Peter Dimov 1a02fca5c4 Add benchmark/.gitignore 2022-11-29 18:14:52 +02:00
Christian Mazakas 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
Christian Mazakas 8d4816eac7 Merge pull request #170 from boostorg/feature/foa_data_structure_docs
added data structure docs
2022-11-28 08:45:05 -08:00
joaquintides 46fc4f9f4d typos 2022-11-28 17:42:13 +01:00
joaquintides 725993ab95 typo 2022-11-28 17:37:13 +01:00
joaquintides ffa5e6f805 typos 2022-11-27 19:39:07 +01:00
Peter Dimov 84206ebf8f Add test_contains, test_count to benchmark/word_count.cpp 2022-11-25 19:05:28 +02:00
Peter Dimov 0398afae9b Add BOOST_FORCEINLINE to unordered_flat_set::contains, unordered_flat_map::contains. Refs #168. 2022-11-25 18:01:39 +02:00
Peter Dimov 79dc3bb6d4 Add BOOST_FORCEINLINE to unordered_flat_set::count, unordered_flat_map::count 2022-11-25 17:57:06 +02:00
Peter Dimov 879de5fab8 Add BOOST_FORCEINLINE to unordered_flat_map::operator[] 2022-11-25 17:50:05 +02:00
Peter Dimov 89ccb49165 Add an iteration step to benchmark/word_size.cpp 2022-11-25 02:05:50 +02:00
Peter Dimov 70a980a980 Add word size count benchmark 2022-11-25 01:49:11 +02:00
Peter Dimov c895dd7192 Add word count benchmark 2022-11-25 01:28:25 +02:00
Peter Dimov ea71597053 Remove multi_index from benchmarks 2022-11-25 00:52:31 +02:00
joaquintides 324fa793fd expanded 1.81 release notes 2022-11-24 20:06:18 +01:00
joaquintides 39d53a0bfc added "Open Addressing Implementation" section 2022-11-24 20:06:05 +01:00
Christian Mazakas 20ea4a77a7 Add RTC msvc jobs to GHA CI 2022-11-22 10:33:32 -08:00
Christian Mazakas 53a897008a Add conditional masking to silence msvc RTC failures 2022-11-22 10:26:08 -08:00
joaquintides ee8f2b991f added CTAD docs (#167)
* added CTAD docs for unordered_map

* added CTAD docs for unordered_multimap

* added CTAD docs for unordered_set

* s/Deduction guides/Deduction Guides

* added CTAD docs for unordered_multiset

* added CTAD docs for unordered_flat_map

* added CTAD docs for unordered_flat_set
2022-11-22 16:39:57 +01:00
Christian Mazakas 5aff5b943f Fix Missing CTAD (#169)
* Update deduction tests to include missing guides for set

* Add missing deduction guides for set
2022-11-22 16:39:39 +01:00
Peter Dimov 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
Christian Mazakas 2102031b93 Implement deduction guides for unordered_flat_set 2022-11-07 15:55:29 -08:00
Christian Mazakas 5b92827b68 Implement deduction guides for unordered_flat_map 2022-11-07 15:55:29 -08:00
Christian Mazakas e2f4303319 Add FOA-specific default bucket count for CTAD purposes 2022-11-07 15:55:29 -08:00
Christian Mazakas c37081b4a2 Add deduction tests for flat containers 2022-11-07 15:55:29 -08:00
Christian Mazakas fd48672fd1 Implement deduction guides for unordered_[multi]set 2022-11-07 15:55:29 -08:00
Christian Mazakas 530437c21b Implement deduction guides for unordered_[multi]map 2022-11-07 15:55:29 -08:00
Christian Mazakas 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
Christian Mazakas 867e60113b Add SFINAE helpers to type_traits.hpp 2022-11-07 15:55:29 -08:00
joaquintides 551456c0c5 typo in section name 2022-11-07 21:25:15 +02:00
Peter Dimov 7857582ea2 Merge branch 'develop' into feature/foa_rc_docs 2022-11-07 21:24:55 +02:00
joaquintides 1d99854979 worked around missing std::is_trivially_copy_constructible in GCC<=4.9 2022-11-07 17:41:47 +01:00
joaquintides 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
joaquintides 5a4071d4f0 silenced bogus CGG warning 2022-11-07 13:47:43 +01:00
joaquintides c30e93544d implemented copy_elements_from with fast branch, introduced for_all_elements_while 2022-11-07 12:31:26 +01:00
Peter Dimov 99bd9d9d31 Update ci.yml 2022-11-05 20:24:40 +02:00
Christian Mazakas 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
joaquintides 0d8c02ba0e documented ctors added in #160 2022-11-05 12:38:03 +01:00
Peter Dimov d3985f87b3 Improve the performance of hash_value and operator== in benchmark/uuid.cpp 2022-11-04 17:15:47 +02:00
joaquintides 3e4546465b fixed max_load docs 2022-11-04 13:18:09 +01:00
joaquintides 79379a4049 editorial 2022-11-03 19:07:24 +01:00
Peter Dimov 71b860d6ae Update ci.yml 2022-11-02 21:55:41 +02:00
Peter Dimov 7c0a826815 Merge branch 'feature/gha' into develop 2022-11-02 21:36:25 +02:00
Christian Mazakas a7156026b3 Fix typo, potential UB in overflow check and refactor to use BOOST_ASSERT_MSG() (#157) 2022-11-02 20:22:17 +02:00
Peter Dimov 787b1a9887 Update ci.yml 2022-11-02 19:06:55 +02:00
Peter Dimov 6e6ad354dd Merge branch 'develop' into feature/gha 2022-11-01 19:17:48 +02:00
joaquintides 4bbaa0f710 relinked boost_unordered_benchmarks 2022-11-01 17:27:24 +01:00
joaquintides a3ef272a9e typos 2022-11-01 17:12:43 +01:00
Christian Mazakas 189e551dc7 Add test proving max_load() invariants (#156) 2022-11-01 17:05:18 +01:00
Peter Dimov fdd5fe3b40 Update ci.yml 2022-11-01 15:45:49 +02:00
joaquintides a0652c2eda updated boost::unordered_set benchmark images 2022-11-01 10:45:00 +01:00
Peter Dimov 13e065466a Mark fnv1a_hash as avalanching 2022-11-01 06:16:30 +02:00
joaquintides 300f5554e5 uploaded current status 2022-10-31 19:27:35 +01:00
Peter Dimov d3914d7101 Update hash_is_avalanching_test 2022-10-31 13:27:09 +02:00
Peter Dimov 3b592a3dd4 Merge branch 'feature/hash-is-avalanching-test-03' into develop 2022-10-30 21:13:29 +02:00
joaquintides 2068cf8d5b uploaded current status 2022-10-30 19:16:43 +01:00
Peter Dimov 097f4fac0b Merge branch 'feature/drone' into develop 2022-10-30 19:28:10 +02:00
joaquintides 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
Peter Dimov 8f02e43ba4 Work around -Wconversion on GCC 5 2022-10-30 17:41:44 +02:00
Peter Dimov d0fc14b8c5 Remove C++11 constructs from hash_traits.hpp 2022-10-30 13:40:20 +02:00
Peter Dimov 56b3700683 Add hash_is_avalanching_test.cpp 2022-10-30 12:58:57 +02:00
Peter Dimov cf643fad2a Split GCC w/ sanitizers to avoid timeout 2022-10-29 19:28:58 +03:00
Peter Dimov 5386033e67 Update cmake_subdir_test 2022-10-29 18:23:59 +03:00
Peter Dimov d1e565dbf3 Update .drone.jsonnet 2022-10-29 00:48:27 +03:00
Peter Dimov acf8ddc4b7 Merge branch 'develop' into feature/drone 2022-10-29 00:45:56 +03:00
Christian Mazakas 575e5eafb0 Merge pull request #152 from cmazakas/fix/rehash-allocation
Fix bug #147
2022-10-28 12:54:39 -07:00
Peter Dimov bce031f42b Update .drone.jsonnet 2022-10-28 22:32:11 +03:00
Christian Mazakas 5e5addd82d Update how the required number of buckets is calculated to nest the max call 2022-10-27 08:17:10 -07:00
Christian Mazakas 0937f6443c Add rehash_stability() testing to catch erroneous behavior noted from bug #147 2022-10-27 08:17:10 -07:00
joaquintides 90f2f0f67d added hash_traits.adoc, improved unordered/unordered_flat_map.adoc, added release notes 2022-10-27 12:21:54 +02:00
Peter Dimov 772e1e7fa0 Fix low/high order 2022-10-26 21:49:10 +03:00
Peter Dimov 120fe90934 Add benchmark/uuid.cpp 2022-10-26 21:38:54 +03:00
Peter Dimov 1dc949b2b5 Add boost::unordered_flat_map to benchmarks 2022-10-26 21:08:51 +03:00
joaquintides 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
joaquintides 5e639a97a4 passed BOOST_UNORDERED_ASSUME a true boolean 2022-10-26 10:39:34 +02:00
joaquintides fb315252b3 added missing BOOST_FORCEINLINE 2022-10-25 19:53:18 +02:00
joaquintides d12ed06c3d removed #ifdef'd out code 2022-10-25 19:53:03 +02:00
joaquintides 49fc08b934 refactored emplace_impl to improve inlining 2022-10-25 19:48:19 +02:00
Christian Mazakas 4f0edf9013 Decorate containers with more BOOST_FORCEINLINE 2022-10-25 09:01:38 -07:00
joaquintides 2afd1c5c9a copied Neon group15::is_sentinel from foa_unordered_rc.hpp
(possible performance impact)
2022-10-25 14:45:38 +02:00
joaquintides 492df9c9c6 restored uint64.cpp 2022-10-25 14:33:07 +02:00
joaquintides e29bf7a4a0 reverted 2022-10-25 14:31:27 +02:00
joaquintides 7db310f6d2 reverted 0b575dc983 (may affect performance) 2022-10-25 11:48:41 +02:00
Christian Mazakas 1f781a407e Test cleanup 2022-10-24 15:05:49 -07:00
Christian Mazakas ef54c6bd14 Clean up u64 benchmarks 2022-10-24 15:04:24 -07:00
Christian Mazakas fb1b1dfe2d Add missing copyright updates 2022-10-24 11:31:25 -07:00
Christian Mazakas 222f0a737d Split AppVeyor jobs to avoid timeouts 2022-10-24 11:17:37 -07:00
Christian Mazakas 6c0d121e5b Update requirements for testing to include support for alignas(N) 2022-10-24 11:17:24 -07:00
Christian Mazakas 955dab4637 Add missing init_type overloads for insert(hint) 2022-10-24 11:17:05 -07:00
Christian Mazakas 375d7157b6 Add tests for missing typedefs in flat containers 2022-10-24 09:54:57 -07:00
Christian Mazakas 01053738eb Rewrite test constraints in terms of config checks 2022-10-24 08:21:54 -07:00
joaquintides b75cd48899 [skip CI] added first draft of unordered_flat_map.adoc 2022-10-23 17:51:28 +02:00
joaquintides d8f226d429 reverted "Push up partial refactor for older msvc"
This reverts commit 627ffe4ed7.
2022-10-22 12:28:04 +02:00
Christian Mazakas 627ffe4ed7 Push up partial refactor for older msvc 2022-10-21 15:38:19 -07:00
Christian Mazakas 2adab2be61 Fix signed-unsigned comparison warning 2022-10-21 15:37:51 -07:00
Christian Mazakas e0b680ac29 Update insert(Iterator, Iterator) overloads to use emplace internally instead of insert()'ing 2022-10-21 11:24:34 -07:00
Christian Mazakas ad1e3a49a5 Update tracking counts to be unsigned in init_type_insert_tests 2022-10-21 11:23:46 -07:00
joaquintides 1d15067ef2 removed sign conversion warnings 2022-10-21 13:14:39 +02:00
joaquintides 8a3e5dd918 added workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56480 2022-10-21 11:13:13 +02:00
joaquintides 2aa62c63c1 stylistic 2022-10-21 10:46:22 +02:00
joaquintides c9d1b6009e stylistic 2022-10-21 10:02:49 +02:00
joaquintides 1d553447a0 refactored insert overloads 2022-10-21 10:01:51 +02:00
Christian Mazakas 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
Christian Mazakas fe32f153a2 Add draft of insert(init_type&&) for unordered_flat_map 2022-10-20 14:59:33 -07:00
Christian Mazakas 59f4da0a47 Add init_type public typedefs 2022-10-20 14:58:38 -07:00
joaquintides 99ad45ed77 removed spurious consts 2022-10-20 20:02:55 +02:00
joaquintides d93875a65e refactored value_from and insert overloads 2022-10-20 19:48:17 +02:00
Christian Mazakas c1d5902911 Remove unnecessary value_type conversion by expanding overloads for value_from() 2022-10-20 08:43:42 -07:00
Christian Mazakas 0ac4aeca50 Add swap_exception_tests for FOA, only testing weak exception guarantee 2022-10-19 11:05:09 -07:00
Christian Mazakas 776935f24d Reintroduce strong guarantee checking 2022-10-19 11:04:38 -07:00
joaquintides 2f048ea6ac s/=/== 2022-10-19 17:50:21 +02:00
joaquintides f3353c9be3 made sure source values are destroyed on copy-based rehash 2022-10-19 17:42:59 +02:00
joaquintides 3d07c33efe Merge branch 'feature/foa_rc' of https://github.com/boostorg/unordered into feature/foa_rc 2022-10-19 15:47:47 +02:00
joaquintides 8a1562cc78 implemented strong exception guarantee on rehash and single insert/emplace 2022-10-19 15:46:57 +02:00
Christian Mazakas 4de1be8911 Add the rest of the exception tests sans swap 2022-10-18 15:54:02 -07:00
Christian Mazakas 46065065be Temporarily disable strong checks for FOA 2022-10-18 15:54:02 -07:00
joaquintides 8e42367a62 stylistic 2022-10-18 19:33:52 +02:00
joaquintides d13a9dcaaf stylistic 2022-10-18 18:35:41 +02:00
joaquintides 64cb43ce32 protected against hash throwing in nosize_transfer_element 2022-10-18 17:42:22 +02:00
joaquintides c9340390b0 completed previous commit 2022-10-18 17:28:57 +02:00
joaquintides c76f44a8b3 hardened unchecked_rehash against exceptions thrown in the middle of value move construction 2022-10-18 16:18:05 +02:00
joaquintides 2290375515 replaced try blocks with scope guards 2022-10-18 16:14:29 +02:00
joaquintides a200af610f refactored table's allocator-extended copy tor 2022-10-18 15:41:33 +02:00
joaquintides 2cb1d2bdf0 removed duplicated call to destroy 2022-10-18 15:25:54 +02:00
joaquintides ac2bc8d615 made group initialization more straightforward 2022-10-18 12:17:40 +02:00
Christian Mazakas 0d6ebb4d2f Add copy_exception_tests for FOA 2022-10-17 13:27:36 -07:00
Christian Mazakas 27c386d47b Revert "used regular method for group resetting in clear"
This reverts commit eb5351b2c6.
2022-10-17 13:20:01 -07:00
Christian Mazakas cf6f4023bb Make sure mask is properly cleared during rehash cleanup 2022-10-17 13:19:57 -07:00
Christian Mazakas aa41ab4195 Add constructor_exception tests for FOA 2022-10-17 13:19:29 -07:00
joaquintides 6e4e5ead03 made Neon group15 compatible with A32 2022-10-17 18:43:48 +02:00
joaquintides eb5351b2c6 used regular method for group resetting in clear 2022-10-17 18:21:41 +02:00
joaquintides 599dee204f micro-optimized table destruction 2022-10-17 18:00:15 +02:00
joaquintides 6b1d2f13da made clear reset overflow bytes 2022-10-17 17:51:43 +02:00
joaquintides b0f6bb128f micro-optimized group loops 2022-10-17 09:43:22 +02:00
joaquintides 0389e0bc16 reverted 2022-10-16 22:17:53 +02:00
joaquintides 9246c30178 activated alternative impl of nosize_unchecked_emplace_at 2022-10-16 21:33:40 +02:00
joaquintides bb6b57d1a4 typo 2022-10-16 17:45:17 +02:00
joaquintides 4fa61b98eb made rehash work with exact capacities, refactored capacity calculations 2022-10-16 10:11:47 +02:00
joaquintides 5535faf3cc introduced internal noshrink_reserve 2022-10-15 18:56:46 +02:00
joaquintides ec389cdecd kept adding design/implementation notes 2022-10-15 18:33:59 +02:00
joaquintides 7c5bad60c6 reordered #includes 2022-10-15 13:14:32 +02:00
joaquintides cc75360f4c kept adding design/implementation notes 2022-10-15 12:38:39 +02:00
joaquintides 3a0b752363 reorganized function definitions 2022-10-15 11:17:51 +02:00
joaquintides 63eaed843f stylistic 2022-10-15 11:15:29 +02:00
joaquintides 0b575dc983 s/const/constexpr in simde_mm_movemask_epi8 2022-10-15 11:14:36 +02:00
joaquintides b8d4df2b5c stylistic 2022-10-15 11:07:48 +02:00
joaquintides 3bf28d7b61 stylistic 2022-10-15 11:06:15 +02:00
joaquintides acc7f0ce5c refactored table_arrays dummy groups handling 2022-10-15 11:05:51 +02:00
joaquintides 1532e301d1 micro-optimized non-SIMD group15::match_impl 2022-10-15 10:51:28 +02:00
joaquintides e663812f24 editorial 2022-10-15 10:18:47 +02:00
Christian Mazakas 9da61e9050 Add post_move_tests 2022-10-14 13:37:26 -07:00
Christian Mazakas 1de8801c08 Add scary_tests 2022-10-14 13:37:26 -07:00
Christian Mazakas e16537d244 Add helper header to include map types based on FOA vs FCA 2022-10-14 13:37:26 -07:00
Christian Mazakas 14c190223c Add scoped_allocator tests 2022-10-14 13:37:26 -07:00
Christian Mazakas e3c91ad812 Add erase_if tests 2022-10-14 13:37:26 -07:00
Christian Mazakas 454cb24cc8 Ease test requiremets for erase_if, require copyability now of supplied predicate 2022-10-14 13:37:26 -07:00
Christian Mazakas 5e24f6ef22 Add reserve_tests 2022-10-14 13:37:26 -07:00
Christian Mazakas d02d4094e6 Add merge_tests 2022-10-14 13:37:26 -07:00
joaquintides 9a03d1e904 added design and implementation notes 2022-10-14 20:00:24 +02:00
joaquintides 3683b43242 [skip CI] editorial 2022-10-14 13:52:37 +02:00
joaquintides fc5c8c3669 removed unused typedef 2022-10-14 13:40:56 +02:00
joaquintides df32d79e8a shut down VS warning 2022-10-14 13:30:49 +02:00
joaquintides aefb5dd66a fixed unordered_flat_map::map_types::move 2022-10-14 10:40:07 +02:00
joaquintides f85e04ef31 stylistic 2022-10-14 10:30:53 +02:00
joaquintides 8c58ffe546 made sure BOOST_[UN]LIKELY is passed a boolean everywhere 2022-10-14 10:16:47 +02:00
Christian Mazakas d538f6184c Add equivalent_keys_tests 2022-10-13 11:59:44 -07:00
Christian Mazakas 7339f4264a Undo bad commits to Jamfile, gitignore 2022-10-13 11:58:20 -07:00
Christian Mazakas 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
Christian Mazakas 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
Christian Mazakas c39ed8a5cf Add simple_tests 2022-10-12 15:19:11 -07:00
Christian Mazakas d4f7939aae Add incomplete_test 2022-10-12 14:30:07 -07:00
Christian Mazakas fc7b5573c1 Add link_test 2022-10-12 14:05:25 -07:00
Christian Mazakas 1c14bc1215 Use explicit cast for when KeyEqual returns a size_t type 2022-10-12 13:39:43 -07:00
Christian Mazakas 4399e8b360 Add noexcept tests 2022-10-12 13:39:23 -07:00
Christian Mazakas 3f9bd00f01 Add compile_map tests 2022-10-12 13:37:12 -07:00
Christian Mazakas 05b3025c0e Fix regression in how the table_iterator defines its reference type 2022-10-12 08:58:32 -07:00
joaquintides becd166e66 implemented erase_if 2022-10-12 15:34:05 +02:00
joaquintides 006f62047b reverted 334dcb91ac 2022-10-12 12:46:47 +02:00
joaquintides 334dcb91ac removed unused typedef 2022-10-12 11:20:37 +02:00
joaquintides df7792040c implemented merge 2022-10-12 11:18:05 +02:00
joaquintides 57ea45cb8f overloaded for_all_elements 2022-10-12 10:31:52 +02:00
Christian Mazakas 4a8d687778 Add compile_set tests with stub for merge() 2022-10-11 15:21:10 -07:00
Christian Mazakas 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
joaquintides 35118b5a71 reverted 2022-10-11 20:35:59 +02:00
joaquintides 858737fd88 s/move/forward in brace-init insert 2022-10-11 17:55:55 +02:00
joaquintides 648fb7b99d reverted two prior 2022-10-11 17:30:23 +02:00
joaquintides 59c84cb744 dropped BOOST_FORCEINLINE in brace-init insert 2022-10-11 17:20:22 +02:00
joaquintides becd6078b3 temporarily used value_type&& for brace-init insert 2022-10-11 17:10:39 +02:00
joaquintides e163aa465c reverted c7836659d1 2022-10-11 11:51:16 +02:00
joaquintides 3b1f635926 reverted c4cc805063 2022-10-11 11:50:17 +02:00
joaquintides 7abd7bb36d reverted 2022-10-11 11:48:46 +02:00
joaquintides 545ad4f7ad temporarily s/init_type/value_type in brace-init insert 2022-10-11 10:54:01 +02:00
joaquintides c42d86ac0d reverted 2022-10-11 10:52:51 +02:00
joaquintides 316eeea983 dropped BOOST_FORCEINLINE in insert 2022-10-11 10:46:07 +02:00
joaquintides f2afbe9f85 silenced unused capture warning 2022-10-11 09:09:20 +02:00
Christian Mazakas e9a94cb62a Force inlining for find() member functions in the flat containers 2022-10-10 15:47:00 -07:00
Christian Mazakas 91f5925c41 Replace naked throw statements with boost::throw_exception() 2022-10-10 15:43:38 -07:00
Christian Mazakas 0bdfa3c39e Add forwarding tests 2022-10-10 14:18:11 -07:00
Christian Mazakas 09f0b7c0a8 Add swap_tests 2022-10-10 14:18:11 -07:00
Christian Mazakas 72bca09429 Remove extraneous usage of typename 2022-10-10 14:18:11 -07:00
Christian Mazakas 58b78f8ff0 Add transparent_tests 2022-10-10 14:18:11 -07:00
Christian Mazakas 1ff2dc4042 Add contains_tests 2022-10-10 14:18:11 -07:00
Christian Mazakas 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
joaquintides c7836659d1 activated alt impl of nosize_unchecked_emplace_at 2022-10-10 21:45:53 +02:00
joaquintides c4cc805063 embed xmx code directly into xmx_mix 2022-10-10 21:06:33 +02:00
joaquintides 9e2bf3681f embedded hash into mixing policies 2022-10-10 20:51:47 +02:00
joaquintides 77f265a678 reverted 2022-10-10 20:19:39 +02:00
joaquintides 6bda467942 temporarily disabled mix_policy 2022-10-10 19:52:14 +02:00
joaquintides 1fa2e84774 reverted 7caab66011 and f776ffa008 2022-10-10 19:24:14 +02:00
joaquintides 7caab66011 removed inline suggestion from hash_for 2022-10-10 19:01:55 +02:00
joaquintides 69aff6f776 restored 16f86b0770 2022-10-10 18:55:03 +02:00
joaquintides 505a08cf95 temporarily reverted 16f86b0770 2022-10-10 18:34:45 +02:00
joaquintides f776ffa008 removed temporary const ref in emplace_impl 2022-10-10 18:02:57 +02:00
joaquintides a4c38c02c8 fixed empty_value index 2022-10-10 11:13:32 +02:00
joaquintides 889a81f034 stylistic 2022-10-10 09:36:12 +02:00
joaquintides ad96ea632e stylistic 2022-10-10 09:34:10 +02:00
joaquintides 2955a966cf shut down unavoidable VS warning 2022-10-10 09:29:41 +02:00
joaquintides 3fbaf21b8c dropped hash_traits in favor of individual traits 2022-10-09 11:23:15 +02:00
joaquintides 32a7ed74e8 added missing const qualifier 2022-10-08 12:39:36 +02:00
joaquintides 3913fce638 dropped foa_mixer in favor of internal mix policy governed by hash_traits 2022-10-08 11:47:00 +02:00
joaquintides 16f86b0770 relied on implicit conversion for second overload of value_from 2022-10-08 10:18:20 +02:00
Christian Mazakas 2907083b73 Fixup implementation of equality operator 2022-10-07 15:31:16 -07:00
Christian Mazakas 1fa823d815 Fix erroneous usage of boost::is_convertible instead of std::is_convertible 2022-10-07 14:59:15 -07:00
Christian Mazakas 6e8e2112ba Rearrange SFINAE to appease msvc-14.0 in erase() member function template 2022-10-07 14:51:40 -07:00
Christian Mazakas 9560d10771 Fix shadowing warning in early gcc 2022-10-07 14:19:32 -07:00
Christian Mazakas e543818e3e Add equality_tests 2022-10-07 14:15:32 -07:00
Christian Mazakas e0bb258b39 Add load_factor_tests 2022-10-07 10:56:47 -07:00
Christian Mazakas d3ef0b9a4f Add rehash tests 2022-10-07 10:56:35 -07:00
Christian Mazakas 86d623a0f4 Pull mlf into detail::foa namespace for testing 2022-10-07 10:55:52 -07:00
Christian Mazakas b964fa777c Add at_tests 2022-10-07 10:16:57 -07:00
joaquintides cde017f791 added missing typename 2022-10-07 19:02:25 +02:00
joaquintides d1982a664b stylistic 2022-10-07 18:56:41 +02:00
joaquintides 7e479d62dc added foa_mixer.hpp 2022-10-07 18:56:16 +02:00
joaquintides 6be32f3ba4 reverted 74c2ae627a and explicitly silenced VS warning 2022-10-07 16:38:19 +02:00
joaquintides 049a1ec8f6 reverted b3754b10c8 and 5fc929b829 and s/{}/() in arrays initialization 2022-10-07 16:32:57 +02:00
joaquintides b3754b10c8 extended 5fc929b829 to member arrays 2022-10-07 13:50:02 +02:00
joaquintides 7441be730e removed spurious #include 2022-10-07 13:47:54 +02:00
joaquintides 38f9cb750a s/value_type/init_type 2022-10-07 12:17:16 +02:00
joaquintides 8a9aab57c0 s/std::move/type_policy::move in a couple of places 2022-10-07 12:15:24 +02:00
joaquintides b61ec3a65a removed moved_type import (not used explicitly) 2022-10-07 12:10:14 +02:00
joaquintides 74c2ae627a avoided VS constant conditional expression warning 2022-10-07 11:34:13 +02:00
joaquintides 74ca1e50f3 return one lambda expression back in place (related to f1eb5d2106) 2022-10-07 11:27:54 +02:00
joaquintides 5fc929b829 initialized ml at ctor body (GCC 4.8/4.9 complains otherwise) 2022-10-07 11:23:05 +02:00
joaquintides 3aaf895514 restricted erase generic arg as per C++23 requirements
(hopefully fixes test errors in VS2015)
2022-10-07 11:19:20 +02:00
joaquintides 2057ccaeb5 stylistic 2022-10-07 10:44:28 +02:00
Christian Mazakas dc7b8f3ff2 Remove extraneous overloads of key_from 2022-10-06 12:04:21 -07:00
Christian Mazakas 2b7e9d826d Fix warning in msvc-14.3 with C++20 about multiple implicit conversions being applied 2022-10-06 12:03:59 -07:00
joaquintides c57470e0d3 SFINAED out third key_from overload and fixed insert accepted arg types 2022-10-06 20:02:03 +02:00
Christian Mazakas 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
Christian Mazakas f1eb5d2106 Workaround visibility bug in gcc-6 by un-nesting lambdas 2022-10-06 09:56:12 -07:00
Christian Mazakas 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
Christian Mazakas f4888c7940 Enable C++11 builds 2022-10-06 09:55:26 -07:00
joaquintides d02b12c9a1 redesigned init_type/value_type machinery 2022-10-06 17:50:30 +02:00
Christian Mazakas 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
Christian Mazakas f3803fc071 Add emplace_tests 2022-10-05 13:31:10 -07:00
Christian Mazakas a3c6235f3a Add insert_hint_tests 2022-10-05 13:30:59 -07:00
Christian Mazakas 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
Christian Mazakas 2134116cbc Update test jamfile to use a build_foa command 2022-10-05 13:24:54 -07:00
joaquintides b86143de46 made one overload of insert generic so that value_type is accepted 2022-10-05 20:38:51 +02:00
joaquintides 7c8045aab5 fixed init_type machinery 2022-10-05 18:46:38 +02:00
joaquintides c15bd0092d introduced init_type/value_type 2022-10-05 18:09:57 +02:00
joaquintides d233d83811 allow 100% fillup for small capacities 2022-10-05 14:49:42 +02:00
joaquintides df0c375541 s/std::allocator_traits/boost::allocator_traits 2022-10-05 13:58:31 +02:00
joaquintides 886b1b4ded refactored table_arrays to solve alignment issues without an extra data member 2022-10-05 13:54:28 +02:00
joaquintides 48816135df refactored move assignment to silence warnings 2022-10-05 10:05:10 +02:00
joaquintides 4d0f698937 stylistic 2022-10-05 09:34:21 +02:00
Christian Mazakas fdbc79d2a8 Silence -Werror=terminate warning in move assignment 2022-10-04 14:52:38 -07:00
Christian Mazakas 1a89b0aa14 Add missing size swap() call to move-assign operator for foa::table 2022-10-04 14:52:18 -07:00
Christian Mazakas 8e9b7cf259 Add move semantics to FOA containers 2022-10-04 14:51:45 -07:00
Christian Mazakas bf6643844b Add foa_move_tests 2022-10-04 14:51:03 -07:00
Christian Mazakas e9c3ed1531 Remove unnecessary self-alias checks in copy-assignment operators 2022-10-04 14:49:40 -07:00
Christian Mazakas 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
Christian Mazakas 9ad7096851 Add missing assign_test cases 2022-10-04 11:48:09 -07:00
Christian Mazakas 4cdfb2537a Implement erase(), get erase_tests passing 2022-10-04 11:48:09 -07:00
Christian Mazakas 9280e13697 Add erase_tests 2022-10-04 11:48:09 -07:00
Christian Mazakas 21872edf83 Disable FOA tests for C++98 2022-10-04 11:48:09 -07:00
joaquintides b7e021ffc6 silenced VS warning C4714 2022-10-04 18:47:23 +02:00
joaquintides e69bb3aece unnamed unused parameters 2022-10-04 13:46:27 +02:00
joaquintides 06512a00e1 refactored bdfe294e61 and expanded to move assign and swap 2022-10-04 11:24:21 +02:00
Christian Mazakas 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
Christian Mazakas ddb9f370af Update load_factor() impl to handle the case when capacity() is zero 2022-10-03 14:46:45 -07:00
Christian Mazakas b0c0384401 Fix small typo in increment() function to silence VS warnings 2022-10-03 14:46:19 -07:00
Christian Mazakas bf6e381ff2 Add expliicit destructors, copy assignment operators 2022-10-03 14:45:42 -07:00
Christian Mazakas d5fcc77579 Add assign_tests 2022-10-03 14:45:02 -07:00
Christian Mazakas b0097982af Remove config checks, just rotely disable tests for unsupported C++ versions 2022-10-03 12:17:46 -07:00
joaquintides 2e3a8a0fc0 avoided VS warning C4706 2022-10-03 21:05:48 +02:00
joaquintides 357eed44a1 replaced homegrown ebo_base with boost::empty_value 2022-10-03 19:36:53 +02:00
joaquintides 2ae70cd05c Merge branch 'feature/foa_rc' of https://github.com/boostorg/unordered into feature/foa_rc 2022-10-03 18:50:15 +02:00
joaquintides d370ae1095 stopped relying on __STDCPP_DEFAULT_NEW_ALIGNMENT__ for now 2022-10-03 18:49:24 +02:00
Christian Mazakas 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
joaquintides 621b5b4ec1 shut down bogus VS warning 2022-10-02 11:14:19 +02:00
joaquintides 4dbc83ccbf documented VS specific bit 2022-10-02 11:13:49 +02:00
joaquintides 398a64b5e0 shut down unavoidable GCC shadowing warnings 2022-10-02 11:13:04 +02:00
joaquintides b926dbbbe9 eliminated shadowed declaration 2022-10-01 19:37:16 +02:00
joaquintides b244b33402 EBO-optimized table 2022-10-01 19:34:33 +02:00
joaquintides f2e4b25615 silenced conversion warning 2022-10-01 17:33:55 +02:00
joaquintides 29f2f1db2c added missing BOOST_RETHROWs 2022-10-01 12:58:37 +02:00
joaquintides cec09e1c61 fixed alignment issues apparent 32bit builds 2022-10-01 12:44:33 +02:00
joaquintides 36a42116e8 supported unaligned metadata access where potentially happening,
plus fixed some superfluous alignas specifiers
2022-09-30 17:06:31 +02:00
joaquintides d9dcaf8ba1 tried different formulation of prior 2022-09-30 16:17:40 +02:00
joaquintides 984cf13afd reintroduced 6110a0827c with a slightly different syntax
(prior caused ICEs on GCC11)
2022-09-30 16:15:11 +02:00
joaquintides ac41bf6e86 temporarily reverted 6110a0827c 2022-09-30 16:09:14 +02:00
joaquintides 5f21e3964e temporarily omitted _mm_loadu_si128 2022-09-30 13:57:49 +02:00
joaquintides 364cd86191 temporarily omitted alignas specifier 2022-09-30 13:52:25 +02:00
joaquintides b1449ca502 added unaligned load of __m128i 2022-09-30 12:27:10 +02:00
Christian Mazakas 6110a0827c Fix default initialiation warning for clang-3.7, clang-3.8 2022-09-29 13:57:16 -07:00
Christian Mazakas 71b64139da Add copy_tests 2022-09-29 13:46:03 -07:00
Christian Mazakas 3582ac91d7 Silence conversion warning in foa 2022-09-29 13:45:51 -07:00
Christian Mazakas 30997bd9ef Add constructor_tests 2022-09-29 12:50:56 -07:00
Christian Mazakas cb673135d2 Use static_cast to silence conversion warnings 2022-09-29 11:40:13 -07:00
Christian Mazakas 6ac1cf1a5f Add find_tests 2022-09-29 11:19:17 -07:00
Christian Mazakas 8f29a32a33 Simplify range-based insert() so it doesn't eagerly rehash so that insert_tests pass 2022-09-29 11:18:59 -07:00
Christian Mazakas ac3520791e Clean up insert_tests 2022-09-29 11:17:22 -07:00
Christian Mazakas faa6e91ed2 Fix conversion warning in reserve() 2022-09-29 11:16:58 -07:00
joaquintides 86956b0be1 added non-SIMD support 2022-09-29 19:24:15 +02:00
joaquintides fdc39982f3 fixed trivial error in #ifdefd-out code 2022-09-29 10:49:27 +02:00
Christian Mazakas c37cfacb44 Finally get insert_tests passing for flat map/set 2022-09-28 13:49:38 -07:00
Christian Mazakas 3af53a6598 Flesh out unordered_flat_map for insert_tests 2022-09-28 13:49:17 -07:00
Christian Mazakas 19c500de27 Silence conversion warning in foa table's emplace_impl() 2022-09-28 13:48:49 -07:00
Christian Mazakas 855d538ea3 Fix typo in foa table's empty() implementation 2022-09-28 13:48:21 -07:00
Christian Mazakas 6b1ef16e38 Add unordered_flat_set 2022-09-28 13:47:51 -07:00
Christian Mazakas 1577da25cc Add proper flat_map header + forwarding header 2022-09-28 13:47:00 -07:00
joaquintides c44695eb37 reverted 2022-09-28 20:48:30 +02:00
joaquintides 63fdf67568 un-inlined pow2_quadratic_prober memfuns to see it impacts performance 2022-09-28 20:19:08 +02:00
joaquintides 80cb7281ba reverted 2022-09-28 20:08:41 +02:00
joaquintides cefe5965be micro-optimized table_iterator ctor to see if it impacts performance 2022-09-28 19:52:22 +02:00
joaquintides 2a9f47ea2c reverted 2022-09-28 19:23:39 +02:00
joaquintides 85324f9a43 made microchange in find_impl to see if it impacts performance 2022-09-28 19:13:26 +02:00
joaquintides 2e776ad155 fixed clear 2022-09-28 17:53:58 +02:00
joaquintides f6544f69ca fixed macro usage 2022-09-28 17:26:12 +02:00
joaquintides c61222403e fixed using placement 2022-09-28 17:24:44 +02:00
joaquintides c487f24611 honored select_on_container_copy_construction 2022-09-28 13:55:44 +02:00
joaquintides 8dcd40c8f3 harmonized adjust_hash interface 2022-09-28 13:46:25 +02:00
joaquintides 0ea2cb5a7a refactored dummy_groups to avoid explicit array initialization 2022-09-28 11:47:23 +02:00
joaquintides 5a4a2f3ffd added Neon support 2022-09-28 11:21:44 +02:00
joaquintides 5293b328b7 made emplace_impl rehashing more robust 2022-09-28 10:05:45 +02:00
joaquintides 2889aab226 made dependency on size_policy minimum size explicit 2022-09-28 09:54:44 +02:00
joaquintides 7a1a25991f removed unnecessary check in max_load 2022-09-28 09:45:55 +02:00
joaquintides 43f8e5e933 avoided being too smart in new_arrays's memory initialization 2022-09-28 09:42:37 +02:00
joaquintides f4940d9344 avoided ugly casts in table_iterator::increment 2022-09-28 09:40:05 +02:00
joaquintides 701cdff982 refactored dummy_groups 2022-09-28 09:36:52 +02:00
Christian Mazakas 450c915284 Get insert_tests passing under sanitizers 2022-09-27 14:25:57 -07:00
Christian Mazakas 892e437428 Restructure insert_tests invocations 2022-09-27 10:34:04 -07:00
Christian Mazakas 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
Christian Mazakas 2eb57995dd Add initial find() impl for benchmarks 2022-09-27 10:30:14 -07:00
Christian Mazakas b64b88eb65 Add intial erase() impl for benchmarks 2022-09-27 10:28:50 -07:00
Christian Mazakas 3da4b6411c Add rvalue overload of insert() for flat_map 2022-09-27 10:28:10 -07:00
Christian Mazakas e115634812 Fix bug in equal_range() for unordered_flat_map 2022-09-27 10:27:41 -07:00
Christian Mazakas fc0f354df4 Switch from leading underscore to trailing underscore for shadowed variables 2022-09-27 08:19:01 -07:00
Christian Mazakas ba5cbd5ca6 Add simple initial draft of unordered_flat_map 2022-09-26 15:18:13 -07:00
Christian Mazakas 505b060637 Update insert_tests to handle new open-addressing table implementation 2022-09-26 15:17:54 -07:00
Christian Mazakas 12b9bd0a6d Fix warnings in internal foa table about float/size_t conversions 2022-09-26 15:17:21 -07:00
Christian Mazakas e8715ffb96 Update internal foa table implementation to use to_address when Allocators use fancy pointers 2022-09-26 15:16:52 -07:00
Christian Mazakas 5d34b137a3 Fix shadowing warnings in foa.hpp 2022-09-26 11:40:47 -07:00
Christian Mazakas ad352a6703 Fix cast warning in mark_overflow() 2022-09-26 10:27:22 -07:00
Christian Mazakas 7d69d18473 Initial commit of foa.hpp 2022-09-26 10:12:05 -07:00
joaquintides 668abe4b0a Merge pull request #146 from cmazakas/feature/rehash-doc-updates
Rehash Doc Updates
2022-09-15 19:33:54 +02:00
Christian Mazakas 5dcccfda3b Update docs for rehash/reserve for unordered_multimap 2022-09-15 07:59:53 -07:00
Christian Mazakas 56b271850a Update docs for rehash/reserve for unordered_multiset 2022-09-15 07:59:53 -07:00
Christian Mazakas d338e94267 Update docs for rehash/reserve for unordered_set 2022-09-15 07:59:53 -07:00
Christian Mazakas 42abfe3c7d Update docs for rehash/reserve for unordered_map 2022-09-15 07:59:53 -07:00
joaquintides 6ef6540378 Merge pull request #144 from cmazakas/feature/rehashing-conformity
Rehashing Conformity
2022-09-13 23:53:15 +02:00
Christian Mazakas 9a9b8e0a7b Update rehashing implementation to better reflect STL conformance 2022-09-13 12:33:21 -07:00
Christian Mazakas 5ad86f559f Clean up implementation of recalculate_max_load() to avoid std::floor/std::ceil 2022-09-13 12:33:21 -07:00
Christian Mazakas 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
joaquintides 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
Christian Mazakas dea6ce164c Remove erroneous unconditional call to reserve() from move_assign() when pocma is false 2022-09-12 13:16:45 -07:00
Christian Mazakas 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
Christian Mazakas 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
Christian Mazakas db9d9d1f77 Update implementation to support a default-constructible table and grouped_bucket_array 2022-08-30 15:20:31 -07:00
Christian Mazakas 6f342bf119 Set default_bucket_count to zero 2022-08-30 15:20:31 -07:00
Christian Mazakas 48765e82e0 Update tests to account for a default-constructed container having no buckets 2022-08-30 15:20:31 -07:00
Peter Dimov 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
Christian Mazakas 6258856d2b Split 64-bit mingw appveyor job into two to help prevent timeouts 2022-08-19 13:31:02 -07:00
Peter Dimov c93ea188f7 Merge pull request #142 from sdarwin/droneconfig
drone.jsonnet update
2022-08-19 23:15:26 +03:00
sdarwin 329eb419f5 drone.jsonnet update 2022-08-19 10:58:56 -06:00
Peter Dimov e83c42ca26 Merge pull request #140 from boostorg/bugfix/valid-post-move
Fix use-after-move segfault
2022-08-19 00:54:07 +03:00
Christian Mazakas f9eae4153f Update code to be valid when the internal buckets_ data member is moved-from 2022-08-18 09:04:53 -07:00
Christian Mazakas 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
Christian Mazakas 7227cfc68a Add post-move tests to verify the container is valid after a move 2022-08-17 14:12:29 -07:00
Christian Mazakas 6b87a43162 Update benchmarking diagrams based on new erase(iterator) implementation 2022-07-27 08:29:03 -07:00
Peter Dimov a4c6bf90aa Merge pull request #138 from cmazakas/feature/erase-perf
erase(iterator) perf
2022-07-27 14:41:07 +03:00
Christian Mazakas a31e894411 Update implementation to use erase_node() where applicable 2022-07-25 11:35:38 -07:00
Christian Mazakas 91e78fd746 Add erase_node() function to table, creating an optimizer-friendly function 2022-07-25 11:35:23 -07:00
Peter Dimov 3abe5de533 Switch from macos-10.15 (deprecated) to macos-11 2022-07-22 20:44:54 +03:00
Peter Dimov dfa3c7311f Remove unnecessary RNG 2022-07-22 19:12:39 +03:00
Peter Dimov 2c5b8577aa Add tsl::robin_map to string.cpp 2022-07-22 19:10:50 +03:00
Peter Dimov 4e804a9d4d Add tsl::robin_map to uint64.cpp, string_view.cpp 2022-07-22 18:52:47 +03:00
Peter Dimov 0ca8c5f56f Add tsl::robin_map to uint32.cpp 2022-07-22 18:36:50 +03:00
Peter Dimov 912798e5cb Change uint64.cpp to use byteswapped indices instead of shifted indices 2022-07-22 18:22:34 +03:00
Peter Dimov 5bcdd7fdf0 Change uint32.cpp to use byteswapped indices instead of shifted indices 2022-07-22 18:18:35 +03:00
Peter Dimov 78ffc4c192 Fix tsl allocator 2022-07-01 19:32:19 +03:00
Peter Dimov 966b76182f Add tsl::hopscotch_map to string_view.cpp 2022-07-01 19:28:57 +03:00
Peter Dimov b7101494f2 Add tsl::hopscotch_map to string.cpp 2022-07-01 19:15:28 +03:00
Peter Dimov be467b3dc4 Add tsl::hopscotch_map to uint64.cpp 2022-07-01 19:03:52 +03:00
Peter Dimov ee70d96c75 Add tsl::hopscotch_map to uint32.cpp 2022-07-01 18:48:10 +03:00
Peter Dimov 8fbd380879 Merge pull request #136 from cmazakas/feature/prime-fmod-cleanup
`prime_fmod_size` cleanup
2022-07-01 17:58:38 +03:00
Christian Mazakas 7746518c0a Remove conditional usage of #pragma once from fca.hpp and prime_fmod.hpp, reorder config.hpp inclusion to come last 2022-06-30 13:07:11 -07:00
Christian Mazakas c8a98e27e0 Add boost:: namespace qualification to uint64_t and uint32_t for prime_fmod.hpp 2022-06-30 13:07:11 -07:00
Christian Mazakas 3df902af23 Pull prime_fmod_size into its own dedicated header, update #include list for fca.hpp and prime_fmod_test.hpp 2022-06-30 13:07:11 -07:00
Peter Dimov 45542e26cb Update ci.yml 2022-06-30 12:29:47 +03:00
Peter Dimov 49f73b118c Update .appveyor.yml 2022-06-30 05:23:44 +03:00
Peter Dimov 6e3dcfddb0 Merge branch 'feature/gha' into develop 2022-06-28 14:19:00 +03:00
joaquintides 09088045ac Merge pull request #135 from boostorg/bugfix/gcc-4-6-is_nothrow_swappable
bypassed check in GCC<=4.6 (boost::is_nothrow_swappable not properly …
2022-06-28 10:09:02 +02:00
joaquintides e466232757 bypassed check in GCC<=4.6 (boost::is_nothrow_swappable not properly supported) 2022-06-28 09:27:15 +02:00
Peter Dimov 2ccd6654c1 Update ci.yml 2022-06-28 03:29:35 +03:00
joaquintides 7d7a6b881e Merge pull request #134 from boostorg/bugfix/gcc-4-7
Bugfix/gcc 4 7
2022-06-27 21:48:25 +02:00
joaquintides 9661227d00 Merge remote-tracking branch 'remotes/origin/bugfix/gcc-4-7-scoped_allocator' into bugfix/gcc-4-7 2022-06-27 20:39:07 +02:00
joaquintides 5855c67d4d added Drone support to this branch 2022-06-27 20:35:59 +02:00
joaquintides 3edfe2b76f Merge branch 'develop' into bugfix/gcc-4-7-scoped_allocator 2022-06-27 20:35:27 +02:00
joaquintides f36bfe24f6 added Drone support to this branch 2022-06-27 20:35:01 +02:00
joaquintides 9da4b3a45a Merge branch 'develop' into bugfix/gcc-4-7-ref-qualified_memfuns 2022-06-27 20:34:06 +02:00
joaquintides 95524a6af4 bypassed scoped_allocator test for GCC 4.7 and prior 2022-06-27 19:58:22 +02:00
joaquintides d4b61541b5 used proper Boost.Config macro 2022-06-27 19:31:47 +02:00
Peter Dimov 143c378ba6 Update test/Jamfile 2022-06-27 20:24:25 +03:00
joaquintides dfac93aebb workaround for lack of ref-qualified memfun support in GCC<=4.7 2022-06-27 19:21:34 +02:00
Peter Dimov b6daca37d5 Update test/Jamfile 2022-06-27 19:56:22 +03:00
Peter Dimov 4937619ea0 Update .drone.jsonnet 2022-06-27 19:55:23 +03:00
Peter Dimov 6d34532301 Add Drone support 2022-06-27 18:53:36 +03:00
joaquintides fb733483c6 made fast_modulo universally available in 64 bits and never used in 32 bits 2022-06-26 19:13:54 +02:00
joaquintides 2670bb149d added Peter Dimov's portable implementation of get_remainder 2022-06-25 17:35:43 +02:00
Peter Dimov d49eda63f8 Merge branch 'feature/prime-fmod-tests' into develop 2022-06-25 04:21:20 +03:00
Peter Dimov 08e0fee141 Enable fastmod on clang-cl and other pretenders such as Intel 2022-06-25 01:44:14 +03:00
Peter Dimov d204b9b408 Remove unnecessary include 2022-06-25 01:17:50 +03:00
Peter Dimov c53e0228c5 Check BOOST_UNORDERED_FCA_HAS_64B_SIZE_T in the 32 bit case as well 2022-06-25 01:16:32 +03:00
Peter Dimov 31cffd8412 Fix reversed condition 2022-06-25 01:06:15 +03:00
Peter Dimov 0f71fe28a2 Fix typos; do not undefine macros needed for tests 2022-06-25 01:04:22 +03:00
Christian Mazakas f00a29d3df Add tests for the internal prime_fmod_size policy 2022-06-24 11:09:38 -07:00
Peter Dimov e111389d6c Update .appveyor.yml 2022-06-24 01:03:53 +03:00
Peter Dimov 7079341416 Merge pull request #130 from cmazakas/bugfix/cmake-subdir-dependencies
Update the list of required dependencies for the subdir CML test
2022-06-23 03:53:02 +03:00
Christian Mazakas 7fdbfc0c1a Update the list of required dependencies in for the CMake subdirectory test 2022-06-22 14:42:09 -07:00
Peter Dimov e1dff1c931 Merge pull request #128 from cmazakas/feature/iterator-independence
Remove dependencies on Iterator, Detail
2022-06-21 21:45:12 +03:00
Christian Mazakas 90b2536a99 Relace usage of BOOST_FORCEINLINE with plain inline to prevent warnings from certain versions of msvc 2022-06-21 08:42:52 -07:00
Christian Mazakas 97f54318e3 Add Boost::concept_check to CMake test suite dependencies 2022-06-21 08:42:52 -07:00
Christian Mazakas f1481f0deb Remove dependency on Boost.Detail 2022-06-21 08:42:52 -07:00
Christian Mazakas b1a9cde690 Remove dependency on Boost.Iterator 2022-06-21 08:42:52 -07:00
Christian Mazakas 1ed2a0a0f1 Merge pull request #127 from cmazakas/doc-updates
1.80 Doc Updates
2022-06-16 12:46:33 -07:00
Christian Mazakas 759645cab6 Merge pull request #126 from cmazakas/img-link-fixes
Fix broken image links for VS benchmarks (successful lookup)
2022-06-16 08:57:49 -07:00
Christian Mazakas 3203251539 Update changelog for 1.80 release 2022-06-16 07:52:37 -07:00
Christian Mazakas b84b94b4db Update copyright notice for documentation 2022-06-16 07:52:27 -07:00
Christian Mazakas 3dd77edd16 Pull benchmarks into their own file 2022-06-14 08:50:28 -07:00
Christian Mazakas a24165083f Fix link paths for VS successful lookup benchmarks 2022-06-14 08:16:39 -07:00
Christian Mazakas 8878482ca1 Merge pull request #125 from cmazakas/develop-build-instructions
Add PREVIEW markdown file
2022-06-10 09:06:59 -07:00
Christian Mazakas 19c7bbf97d Add PREVIEW markdown file containing instructions for how to quickly build Boost from the tip of develop 2022-06-10 09:03:18 -07:00
Christian Mazakas 23f15947d3 Merge pull request #122 from Flamefire/readme
Add LICENSE and README
2022-06-09 13:50:20 -07:00
Christian Mazakas 152129bf70 Merge pull request #121 from Flamefire/appveyor_ci
Update Appveyor from Boost.CI
2022-06-09 11:02:38 -07:00
Christian Mazakas 20ac32c34c Merge pull request #114 from Flamefire/ci
Update GithubActions CI from boost-ci
2022-06-09 11:02:32 -07:00
Alexander Grund 707b40e8c2 Workaround Segfault of Clang 3.8
Clang 3.8 segfaults during name mangling of `make_index_seq`.
Hence replace it by using type aliases.
2022-06-09 11:04:20 +02:00
Alexander Grund 0d1d9f4634 CI: Test only default (shared) linkage on GHA
As there is no actual compiled library there is no need to test shared
and static linking. This effectively halfes the number of compile jobs.
2022-06-09 11:04:20 +02:00
Alexander Grund 5a64ca48ad Update CI from boost-ci
Sync with upstream adding improved CMake builds and coverage collection
2022-06-09 11:04:20 +02:00
Alexander Grund f4ddf18124 Add LICENSE and README
Show project description and CI badges on the repo site.
2022-06-09 10:40:52 +02:00
Alexander Grund 657cf68e55 Remove unused download-boost-snapshot.py file
Boost.CI is now used.
2022-06-09 10:19:23 +02:00
Alexander Grund f0013a4d65 Split jobs which take over 1h to complete and timeout
See #120
2022-06-08 21:26:15 +02:00
Alexander Grund 83fe0249b3 Allow MinGW32 and Cygwin-latest jobs to fail
Needs some more work
2022-06-08 21:26:15 +02:00
Alexander Grund 3701199cfa Update Appveyor from Boost.CI
Adds MinGW, Cygwin and newer compilers
2022-06-08 21:26:15 +02:00
Peter Dimov 4b56bfac05 Merge pull request #119 from cmazakas/laundry
Fix `-Wmaybe-unitialized` warning in gcc-12
2022-06-07 20:55:32 +03:00
Christian Mazakas 613a997694 Fix -Wmaybe-unitialized warning in gcc-12 by laundering the result of reinterpret_cast<> in functions helper 2022-06-07 09:03:48 -07:00
Peter Dimov e690e8910c Merge branch 'feature/gha-gcc12-nosan' into develop 2022-06-03 22:54:39 +03:00
joaquintides 34b9a8d21f Merge pull request #118 from cmazakas/fastmod-cleanup
Rename functions used to efficiently calculate modulo
2022-06-03 20:02:42 +02:00
Christian Mazakas 0106ed3d91 Rename functions used to efficiently calculate modulo, update associated comments 2022-06-03 09:28:17 -07:00
Peter Dimov f8342e4b04 Add a GCC 12 job without sanitization 2022-06-03 17:08:51 +03:00
Peter Dimov 8a74b192b0 Merge pull request #117 from Flamefire/clang3_8_compat
Fix compilation on Clang < 3.8
2022-06-03 16:49:43 +03:00
Flamefire d0ac539d09 Fix compilation on Clang < 3.8
`val_alloc` is used in the other branch of the #ifdef too.
2022-06-03 11:07:49 +02:00
Peter Dimov 0be4856144 Add GCC 12, Clang 13, 14 to ci.yml 2022-06-03 05:41:53 +03:00
Peter Dimov 7503b85f6a Add posix-cmake-subdir, posix-cmake-install jobs to ci.yml 2022-06-03 01:36:57 +03:00
Peter Dimov 4a9abf20b3 Add test/cmake_install_test, test/cmake_subdir_test 2022-06-03 01:35:32 +03:00
Peter Dimov 2836bb5c41 Merge branch 'feature/quick-test' into feature/gha-cmake 2022-06-03 01:29:56 +03:00
Peter Dimov e2925ba01b Add test/quick.cpp 2022-06-02 22:53:12 +03:00
Peter Dimov f2724b745b Regenerate CMakeLists.txt 2022-06-02 21:46:56 +03:00
Peter Dimov 712d20079a Fix alignment_of include 2022-06-02 21:46:07 +03:00
Peter Dimov 99a5409b39 Merge branch 'develop' into feature/gha-cmake 2022-06-02 21:41:51 +03:00
Peter Dimov 72fe06aa00 Remove unused include, removes dependency on Detail 2022-06-02 19:15:12 +03:00
Peter Dimov 8081a3f9ff Add CMake tests to ci.yml 2022-06-02 18:43:12 +03:00
Peter Dimov f218f9b5a2 Add test/CMakeLists.txt 2022-06-02 18:41:31 +03:00
Peter Dimov 4e38751187 Update test/Jamfile.v2 2022-06-02 18:41:14 +03:00
Christian Mazakas e36e3bcf96 Merge pull request #112 from boostorg/feature/fca-unordered
Update internal implementation to use FCA
2022-06-01 15:44:05 -07:00
Christian Mazakas 18503e5eb8 Update documentation for new FCA implementation 2022-06-01 11:49:09 -07:00
Christian Mazakas 110c5dcf10 Remove unnecessary test files due to FCA refactor 2022-06-01 11:49:09 -07:00
Christian Mazakas 37f5a462e4 Update reserve_tests to handle the space requirements for new FCA implementation 2022-06-01 11:49:09 -07:00
Christian Mazakas a1fb756831 Fix bug in rebind semantics for test allocator in reserve_tests 2022-06-01 11:49:09 -07:00
Christian Mazakas 5a456eb295 Refactor internal implementation to use "fast closed-addressing" aka fca 2022-06-01 11:49:09 -07:00
Christian Mazakas ad639ffb61 Lower version of dinkumware check as msvc-12.0 supports piecewise construction 2022-06-01 11:49:09 -07:00
Christian Mazakas 2ae686c366 Add tests for testing the SCARY-ness of iterators 2022-06-01 11:49:09 -07:00
Christian Mazakas 641c9fba9c Update operator() implementations for predicate classes to properly return a bool 2022-06-01 11:49:09 -07:00
Christian Mazakas 8473d8120f Mark test Hasher and KeyEqual as final to extend test coverage 2022-06-01 11:49:09 -07:00
Christian Mazakas 954db4e246 Extend fancy pointer types used by test allocators to support a wider array of semantic operations 2022-06-01 11:49:09 -07:00
Christian Mazakas 4f43bc5ec7 Add missing #include for usage of BOOST_TEST macro 2022-06-01 11:49:09 -07:00
Christian Mazakas 0bcc79baab Update test allocators to be C++11 compliant by making them templates on the pointer type 2022-06-01 11:49:09 -07:00
Christian Mazakas e7d34a5ab1 Remove unsupported Windows image from GHA CI 2022-05-20 13:53:40 -07:00
Peter Dimov 33f81fd490 Add benchmark/string_view.cpp 2022-03-08 02:44:30 +02:00
Peter Dimov a1c156cec1 Rearrange and comment out the non-FNV-1a tests in string.cpp 2022-03-08 02:37:13 +02:00
Peter Dimov 3d62482fe9 Add missing multiplication by sizeof(T) 2022-03-08 02:06:21 +02:00
Peter Dimov 470c9ffed0 Add memory measurements to string.cpp 2022-03-08 01:31:59 +02:00
Peter Dimov 49c70046e4 Add memory measurements to uint32.cpp 2022-03-08 01:06:04 +02:00
Peter Dimov ff1b01bd10 Add memory measurements to uint64.cpp 2022-03-07 22:14:58 +02:00
Peter Dimov 5bcb07dc7f Add BOOST_NOINLINE to benchmark test functions 2022-03-07 21:43:36 +02:00
Peter Dimov 35475a260f Merge pull request #111 from cmazakas/missing-initializer-list-constructors-fixes
Add missing `initializer_list` constructors to reference docs
2022-03-04 08:16:11 +02:00
Christian Mazakas 3d377ec0f3 Add missing initializer_list constructors to reference docs 2022-03-02 15:45:38 -08:00
Peter Dimov bca33372c2 Merge pull request #110 from cmazakas/equal-range-reference-docs-fixes
Add missing `std::` qualification to usages of `pair` in the reference
2022-03-02 21:10:38 +02:00
Peter Dimov 96696b33c4 Merge pull request #109 from cmazakas/unordered-map-reference-doc-fixes
`unordered_map` reference doc fixes
2022-03-02 20:35:55 +02:00
Christian Mazakas 5772941057 Add missing std:: qualification to initializer_list 2022-03-01 11:08:07 -08:00
Christian Mazakas d676ad814b Add missing std:: qualification to usages of pair in the reference docs 2022-03-01 07:50:29 -08:00
Christian Mazakas 5f9fdb0b15 Add reference docs for map's insert_or_assign 2022-02-28 14:37:57 -08:00
Christian Mazakas 0f44fd0064 Add reference docs for map's try_emplace() 2022-02-28 14:37:57 -08:00
Peter Dimov ceba60831c Merge pull request #108 from cmazakas/insert-doc-fixes
`insert()`/`extract()` doc fixes + test improvements
2022-02-26 04:01:30 +02:00
Peter Dimov fd90df5d54 Merge pull request #107 from cmazakas/merge-doc-updates
Correct reference docs for `merge()`
2022-02-26 04:00:56 +02:00
Christian Mazakas 3fe2c29204 Update documentation on extract/insert to no longer say that transferring nodes between the corresponding multi- container is not supported 2022-02-25 13:59:00 -08:00
Christian Mazakas 55d4aaeef5 Update node_handle_tests to prove that nodes can be safely transferred between plain maps/sets and their multi- versions 2022-02-25 13:58:09 -08:00
Christian Mazakas 71d3b77668 Correct reference docs for merge() 2022-02-24 14:54:28 -08:00
Peter Dimov 0d3ece98c1 Merge pull request #106 from cmazakas/missing-nodiscard
Add missing `[[nodiscard]]` qualifiers as outlined by C++20
2022-02-24 18:00:00 +02:00
Peter Dimov 3dc83e4075 Merge pull request #105 from cmazakas/feature/erase_if
Implement `erase_if`
2022-02-24 17:55:30 +02:00
Christian Mazakas b57ac04728 Update reference docs to include [[nodiscard]] annotations 2022-02-23 14:43:28 -08:00
Christian Mazakas 3d952d3c0f Add missing [[nodiscard]] qualifiers as outlined by C++20 2022-02-23 14:26:28 -08:00
Christian Mazakas 0897423e69 Update Change Log for erase_if() 2022-02-23 11:56:19 -08:00
Christian Mazakas b994ddf894 Add reference docs for erase_if() 2022-02-23 11:56:08 -08:00
Christian Mazakas c322cc5621 Implement erase_if() for Unordered via function template in detail namespace 2022-02-23 11:36:48 -08:00
Christian Mazakas d943283f80 Add test case for erase_if() 2022-02-23 11:36:48 -08:00
Peter Dimov 995707a43e Add Abseil+FNV-1a to benchmark/string.cpp 2022-02-20 20:08:27 +02:00
Peter Dimov 107b5e6ab9 Merge pull request #104 from cmazakas/reference-refactor
Clean Up Reference
2022-02-18 22:11:29 +02:00
Christian Mazakas 2e0fdf7eb4 Update description lists for unordered_multiset 2022-02-18 10:41:46 -08:00
Christian Mazakas 14ecf54d8a Update unordered_multiset refernce to follow new synopsis 2022-02-18 10:41:46 -08:00
Christian Mazakas c6bdeae570 Update unordered_multiset synopsis to be modelled after the standard 2022-02-18 10:41:46 -08:00
Christian Mazakas 2d539a9b8f Clean up formatting of description lists for unordered_set 2022-02-18 10:41:46 -08:00
Christian Mazakas 8e1f05082e Update unordered_set reference to follow its new synopsis 2022-02-18 10:41:46 -08:00
Christian Mazakas 170d86be9a Update unordered_set synopsis to be consistent with the standard 2022-02-18 10:41:46 -08:00
Christian Mazakas d810b2d073 Clean up formatting of description lists for unordered_multimap 2022-02-18 10:41:46 -08:00
Christian Mazakas e948bab4d9 Update unordered_multimap reference to be consistent with new synopsis 2022-02-18 10:41:46 -08:00
Christian Mazakas 7bed1417b9 Update unordered_multimap synopsis to be modelled after the standard 2022-02-18 10:41:46 -08:00
Christian Mazakas f7eea71b0b Add colons to text in description lists in unordered_map reference 2022-02-18 10:22:14 -08:00
Christian Mazakas a0eee06c16 Add whitespace to description lists for unordered_map 2022-02-18 10:22:14 -08:00
Christian Mazakas b7c013c1e8 Update unordered_map descriptions lists to use [horizontal] formatting 2022-02-18 10:22:14 -08:00
Christian Mazakas 1ee2eaf5e9 Reorder unordered_map reference docs to match the order found in the synopsis 2022-02-18 10:22:14 -08:00
Christian Mazakas fe55012007 Refactor unordered_map synopsis to follow the layout of the standard 2022-02-18 10:22:14 -08:00
Peter Dimov 42eb31e7e1 Merge pull request #98 from cmazakas/insert-api-doc-fixes
Fix API docs to show the correct return type for emplace/insert
2022-02-14 22:41:02 +02:00
Christian Mazakas 83423adc05 Fix API docs to show the correct return type for emplace/insert for multimap and multiset 2022-02-14 12:30:31 -08:00
Peter Dimov b019f17590 Merge pull request #97 from cmazakas/missing-insert-docs
Add missing reference docs for member function template `insert`
2022-02-14 18:42:01 +02:00
Christian Mazakas e58ba2e044 Add missing reference docs for member function template insert for unordered_map/multimap 2022-02-14 08:27:13 -08:00
Peter Dimov 79ca8e968c Reenable warnings-as-errors 2022-02-12 03:35:29 +02:00
Peter Dimov 5a095c3771 Merge pull request #96 from cmazakas/unknown-warning-fix
Refactor tests to disable `-Wself-assign-overloaded` themselves
2022-02-12 03:34:39 +02:00
Peter Dimov 65094532eb Merge pull request #95 from cmazakas/unitialized-warning-fix
Fix asan unitialized warning
2022-02-12 02:08:27 +02:00
Peter Dimov 13caa6691c Merge pull request #94 from cmazakas/transparent-test-warning-fixes
Fix signed/unsigned comparison warnings in the transparent test suite
2022-02-12 01:53:44 +02:00
Peter Dimov bcd1770a46 Merge pull request #93 from cmazakas/key_eq-shadowing-fix
Fix shadowing warning in early versions of gcc
2022-02-12 01:53:24 +02:00
Christian Mazakas aa96d87502 Fix shadowing warning in early versions of gcc 2022-02-11 11:33:46 -08:00
Christian Mazakas d20be2aaf8 Refactor tests to disable -Wself-assign-overloaded themselves instead of in the Jamfile as not all clang versions support the warning 2022-02-11 11:33:11 -08:00
Christian Mazakas d2ded394f6 Fix asan unitialized warning when default-initialized int is copied as a return type 2022-02-11 11:30:47 -08:00
Christian Mazakas 2b8f458a38 Fix signed/unsigned comparison warnings in the transparent test suite 2022-02-11 11:29:31 -08:00
Peter Dimov e3a7ec6aed Merge pull request #92 from cmazakas/reserve-tests-signed-comparison-fixes
Fix signed/unsigned comparison warning in reserve tests
2022-02-11 08:23:24 +02:00
Peter Dimov 93f9fd7206 Merge pull request #91 from cmazakas/self-assign-warning-fixes
Disable clang-specific warning about self-assignment
2022-02-11 08:10:40 +02:00
Christian Mazakas 28915fdce0 Fix signed/unsigned comparison warning in reserve tests 2022-02-10 14:57:22 -08:00
Christian Mazakas 497455d281 Disable clang-specific warning about self-assignment in tests that explicitly aim to test self-assigment 2022-02-10 12:37:39 -08:00
Peter Dimov c758cbda5e Temporarily disable warnings-as-errors 2022-02-10 22:30:22 +02:00
Peter Dimov 4655133843 Merge branch 'feature/warnings-as-errors' into develop 2022-02-10 22:29:07 +02:00
Peter Dimov 672a97cb34 Merge pull request #90 from cmazakas/contains-c4800-warning-fixes
Fix C4800 warnings in msvc by manually comparing pointers to 0
2022-02-10 22:28:37 +02:00
Peter Dimov 0f8cc79c00 Enable warnings-as-errors for clang and msvc 2022-02-10 20:55:47 +02:00
Christian Mazakas e2b6865938 Fix C4800 warnings in msvc by manually comparing pointers to 0 2022-02-10 08:37:53 -08:00
Peter Dimov bf0bc6468a Avoid -Wsign-conversion warning in mix_policy.cpp 2022-02-10 18:22:52 +02:00
Peter Dimov 526bf15c3c Update test/Jamfile 2022-02-10 03:58:40 +02:00
Peter Dimov bdfb0e3e25 Update ci.yml 2022-02-10 01:27:59 +02:00
Peter Dimov 2d6ebf16d8 Merge pull request #87 from cmazakas/docs-cleanup
Docs Cleanup
2022-02-10 01:20:52 +02:00
Peter Dimov 13c62043eb Merge pull request #89 from cmazakas/nonnull-warnings-fix
Use `boost::declval` in test metafunctions to avoid `-Wnonnull` warnings
2022-02-10 01:19:14 +02:00
Christian Mazakas 39d60cd91d Update test metafunction to use boost::declval instead of using null pointers 2022-02-09 11:51:23 -08:00
Peter Dimov aaf79c5202 Merge pull request #88 from cmazakas/scoped-allocator-test-fixes
Refactor scoped allocator test to use a custom Allocator
2022-02-09 21:29:29 +02:00
Christian Mazakas 884c790009 Disable scoped_allocator test for msvc-14.0 as a stdlib defect in its scoped_allocator_adaptor requires DefaultConstructible for Allocators 2022-02-09 09:53:07 -08:00
Christian Mazakas 5e5dbf5984 Refactor scoped allocator test to use a custom non-default-constructible Allocator instead of Intrerprocess which required a dep on Filesystem 2022-02-09 09:52:56 -08:00
Peter Dimov 0794cfec9e Avoid -Wlong-long in mix64_policy 2022-02-09 07:13:27 +02:00
Peter Dimov a878374d28 Disable warnings when building boost_filesystem 2022-02-09 07:12:54 +02:00
Christian Mazakas 120861bf55 Add change log note about AsciiDoc conversion 2022-02-07 12:51:19 -08:00
Christian Mazakas b7514e1e04 Clean up wording on Iterator Invalidation to recommend using reserve() 2022-02-07 12:33:56 -08:00
Christian Mazakas da390e3959 Shorten Change Log section titles to "Release <version>" 2022-02-07 09:29:42 -08:00
Christian Mazakas 3062759ca8 Update docs to refer to the "draft standard" simply as the "standard" 2022-02-07 09:15:01 -08:00
Peter Dimov cb4b417f76 Merge pull request #86 from cmazakas/qbk-cleanup
Remove obsoleted documentation files
2022-02-07 17:56:45 +02:00
Christian Mazakas ef951094b3 Remove obsoleted documentation files 2022-02-07 07:45:28 -08:00
Peter Dimov b14aefa1d3 Update index.html 2022-02-01 02:35:29 +02:00
Peter Dimov aa7c11a873 Document switch to Fibonacci hashing 2022-02-01 02:29:58 +02:00
Peter Dimov b871699103 Merge pull request #84 from boostorg/feature/asciidoc
Convert Docs to AsciiDoc
2022-02-01 02:10:30 +02:00
Christian Mazakas 8b946ec36d Add reference docs for unordered_multiset 2022-01-31 11:38:51 -08:00
Christian Mazakas da73e1eda9 Add reference docs for unordered_multimap 2022-01-31 11:38:51 -08:00
Christian Mazakas cd8716400b Add ref docs for unordered_set 2022-01-31 11:38:51 -08:00
Christian Mazakas 854ab0b151 Add reference docs for unordered_map 2022-01-31 11:38:51 -08:00
Christian Mazakas c1c98e16d3 Add Copyright section to AsciiDoc 2022-01-31 11:38:51 -08:00
Christian Mazakas 1ee99268f1 Add Bibliography section to AsciiDoc 2022-01-31 11:38:51 -08:00
Christian Mazakas 403ed3abaf Add Rationale section to AsciiDoc 2022-01-31 11:38:51 -08:00
Christian Mazakas de2ae678a9 Add Comparison section to AsciiDoc 2022-01-31 11:38:51 -08:00
Christian Mazakas 45c92568a1 Add section on Pred/Hasher to AsciiDoc 2022-01-31 11:38:51 -08:00
Christian Mazakas 2f455409e2 Add Buckets section to AsciiDoc 2022-01-31 11:38:51 -08:00
Christian Mazakas 55bdde560a Convert intro to AsciiDoc 2022-01-28 14:31:31 -08:00
Christian Mazakas 4e249125eb Update compliance section to AsciiDoc 2022-01-28 14:31:31 -08:00
Christian Mazakas 1f0ba0198b Convert Change Log to AsciiDoc 2022-01-28 14:31:31 -08:00
Christian Mazakas 145ccc77d6 Update Jamfile to build AsciiDoc and add corresponding file stubs 2022-01-28 14:31:31 -08:00
Peter Dimov 1cb0908961 Change random indices in string.cpp to differ in size; remove shifted consecutive there as not representative 2022-01-20 02:06:00 +02:00
Peter Dimov 1db7fbad66 Add FNV-1a cases for std::unordered_map, multi_index_map to benchmark/string.cpp 2022-01-19 19:33:34 +02:00
Peter Dimov 7d79b35f93 Avoid warnings in tests 2022-01-19 18:57:28 +02:00
Peter Dimov 2f331b7a8b Update mix64_policy to use Fibonacci hashing 2022-01-19 04:11:08 +02:00
Peter Dimov d96d5335b4 Update mix32_policy to use Fibonacci hashing 2022-01-19 04:01:46 +02:00
Peter Dimov 4c2150fb3d Minor updates to benchmark/string.cpp 2022-01-19 03:50:39 +02:00
Peter Dimov 2751b3515b Add bcount_log2_ to table, pass it to the policy 2022-01-19 02:33:37 +02:00
Peter Dimov 76b36a81ca Merge branch 'develop' into feature/mix_policy 2022-01-19 02:11:21 +02:00
Peter Dimov 3eb244898f Add an FNV-1a case to benchmark/string.cpp 2022-01-19 02:10:23 +02:00
Peter Dimov 7aacf9836c Merge branch 'develop' into feature/mix_policy 2022-01-19 01:42:05 +02:00
Peter Dimov 24eeb67275 Update reserve_tests to pass for power of two resize policy 2022-01-18 22:12:57 +02:00
Peter Dimov bf86730a62 Add mix32_policy 2022-01-18 21:31:53 +02:00
Peter Dimov 98494420c5 Add a BOOST_ASSERT to mix64_policy to check that the bucket_count is a power of two 2022-01-18 20:52:05 +02:00
Peter Dimov 7717ff01a1 Use bit_ceil and bit_floor in mix64_policy 2022-01-18 20:40:23 +02:00
Peter Dimov 5c3576c7c6 Add test/unordered/mix_policy.cpp 2022-01-18 20:17:31 +02:00
Peter Dimov d6576ed2f1 Remove the special case in pick_policy for integral types (refs #50) 2022-01-18 19:25:32 +02:00
Peter Dimov 9a61c8f8dd Add benchmark/string.cpp 2022-01-15 02:58:28 +02:00
Peter Dimov d192ec8fae Add benchmark/uint32.cpp 2022-01-15 02:46:47 +02:00
Peter Dimov fe913577f6 Merge pull request #83 from cmazakas/contains-doc-updates
`contains()` Doc Updates
2022-01-14 23:56:22 +02:00
Christian Mazakas 312d00cc33 Update reference docs to include contains() 2022-01-14 13:51:47 -08:00
Christian Mazakas c3ac504c10 Update changelog to include notes on contains() 2022-01-14 10:38:30 -08:00
Peter Dimov 5d94f0eea6 Merge pull request #82 from cmazakas/multiset-contains
Implement `unordered_multiset::contains()`
2022-01-14 05:34:04 +02:00
Christian Mazakas 97734fd895 Implement unordered_multiset::contains() 2022-01-13 12:51:50 -08:00
Christian Mazakas 596e1ce135 Add tests for unordered_multiset::contains() 2022-01-13 12:51:50 -08:00
Peter Dimov e1c58b4584 Merge pull request #81 from cmazakas/set-contains
Implement `unordered_set::contains()`
2022-01-13 21:27:22 +02:00
Christian Mazakas f5d470c531 Implement unordered_set::contains() 2022-01-13 08:03:54 -08:00
Christian Mazakas a87277c6e8 Add tests for unordered_set::contains() 2022-01-13 08:03:54 -08:00
Peter Dimov 6700ecaf43 Merge pull request #80 from cmazakas/multimap-contains
Implement `unordered_multimap::contains()`
2022-01-13 07:29:19 +02:00
Christian Mazakas ad8a11bb49 Implement unordered_multimap::contains() 2022-01-12 12:57:27 -08:00
Christian Mazakas ce2051ed39 Add tests for unordered_multimap::contains() 2022-01-12 12:57:27 -08:00
Peter Dimov d16989ce55 Merge pull request #79 from cmazakas/map-contains
Implement `unordered_map::contains()`
2022-01-12 22:43:05 +02:00
Christian Mazakas a26e1c0f41 Implement unordered_map::contains() 2022-01-12 10:36:40 -08:00
Christian Mazakas 510267f6e9 Add tests for unordered_map::contains() 2022-01-12 10:36:36 -08:00
Peter Dimov 8e6a5e19c2 Merge pull request #78 from cmazakas/feature/test-suite-ub-fixes
Fix integer overflow UB in test suite
2022-01-11 21:11:08 +02:00
Christian Mazakas 21244ab832 Fix UB caused by integer overflow in hash functions by casting int to unsigned 2022-01-11 09:53:38 -08:00
Christian Mazakas 7a64f1634f Update CI to run sanitizers on the latest compilers for posix systems 2022-01-10 13:55:14 -08:00
Peter Dimov 2d8268d3d0 Merge pull request #77 from cmazakas/changelog-fixes
Revert usage of sub-`[section]`s with `[heading]`s
2022-01-10 21:51:50 +02:00
Christian Mazakas f6b96e4984 Revert usage of sub-[section]s with [heading]s 2022-01-10 11:49:40 -08:00
Peter Dimov 7fd972d669 Merge pull request #75 from cmazakas/release-notes-1.79
Release Notes 1.79
2022-01-07 21:07:07 +02:00
Christian Mazakas 42190df874 Update ref.xml 2022-01-07 08:30:34 -08:00
Christian Mazakas 19673e3b1c Update reference docs for erase() to include heterogeneous overloads 2022-01-07 08:30:34 -08:00
Christian Mazakas b6b334dd16 Update reference docs for extract() to include heterogeneous overload 2022-01-07 08:30:34 -08:00
Christian Mazakas a8443abe80 Update docs for equal_range() to include heterogeneous overloads 2022-01-07 08:30:34 -08:00
Christian Mazakas 49b630c2d4 Update reference docs for count() to include heterogeneous overloads 2022-01-07 08:30:34 -08:00
Christian Mazakas cd56cae032 Update reference docs for find() to include heterogeneous overloads 2022-01-07 08:30:34 -08:00
Christian Mazakas 6c74aa0289 Add changelist for 1.79.0 release 2022-01-07 08:30:34 -08:00
Christian Mazakas 8ce147dcbd Update change list to use separate sections for each changelist 2022-01-07 08:30:28 -08:00
Christian Mazakas 7f51c8dba4 Rearrange contents of the changelog so that notes for newer release precede notes for older ones 2022-01-05 12:31:33 -08:00
Peter Dimov 7c2ba681e9 Merge pull request #74 from cmazakas/multiset-heterogeneous-extract
Multiset Heterogeneous `extract()`
2022-01-05 20:47:51 +02:00
Christian Mazakas 1c459e6ee6 Implement heterogeneous extract() for multiset 2022-01-05 08:14:58 -08:00
Christian Mazakas f6a077e102 Add transparent test support for multiset's extract() 2022-01-05 08:14:58 -08:00
Peter Dimov b797862a91 Merge pull request #73 from cmazakas/set-heterogeneous-extract
Set Heterogeneous `extract()`
2022-01-05 01:53:29 +02:00
Christian Mazakas abc7327116 Implement heterogeneous extract() for set 2022-01-04 11:50:20 -08:00
Christian Mazakas 7c58a8247c Add transparent test support for set's extract() 2022-01-04 11:50:20 -08:00
Christian Mazakas 263150e599 Rename transparent extract tests to include map in their name 2022-01-04 11:50:20 -08:00
Peter Dimov 7a177d6ac0 Merge pull request #72 from cmazakas/multiset-heterogeneous-count
Multiset Heterogeneous `count()`
2022-01-04 21:40:31 +02:00
Christian Mazakas d5e5c08b87 Implement heterogeneous count() for multiset 2022-01-04 09:05:17 -08:00
Christian Mazakas c485bc975a Add transparent test support for multiset's count() 2022-01-04 09:05:17 -08:00
Peter Dimov 2dfdaca3eb Merge pull request #71 from cmazakas/set-heterogeneous-count
Set Heterogeneous `count()`
2022-01-04 18:32:29 +02:00
Christian Mazakas 56f11f94d8 Implement heterogeneous count() for set 2022-01-03 15:48:51 -08:00
Christian Mazakas ccbe691cc8 Add transparent test support for set's count() 2022-01-03 15:48:51 -08:00
Christian Mazakas f8b53c1cf7 Rename transparent count tests to include map in their name 2022-01-03 15:48:51 -08:00
Peter Dimov c920354423 Merge pull request #70 from cmazakas/multiset-heterogeneous-erase
Multiset Heterogeneous `erase()`
2022-01-04 01:40:41 +02:00
Christian Mazakas 1ab8cc4c0f Implement heterogeneous erase() for multiset 2022-01-03 13:54:06 -08:00
Christian Mazakas 3aa62a821a Add transparent test support for multiset's erase() 2022-01-03 13:54:06 -08:00
Christian Mazakas ecf76830a5 Update transparent erase() tests to delete single elements for the multi-containers 2022-01-03 13:53:55 -08:00
Peter Dimov ce6ca0cf9d Merge pull request #69 from cmazakas/multiset-heterogeneous-find
Multiset Heterogeneous `find()`
2022-01-03 19:52:07 +02:00
Christian Mazakas 202a438044 Implement heterogeneous find() for multiset 2022-01-03 07:59:36 -08:00
Christian Mazakas d7ffd48c67 Add transparent test support for multiset's find() 2022-01-03 07:59:36 -08:00
Peter Dimov 7440e7f789 Merge pull request #68 from cmazakas/multiset-heterogeneous-equal-range
Multiset Heterogeneous `equal_range()`
2022-01-01 07:23:31 +02:00
Christian Mazakas f813bbdf86 Implement heterogeneous equal_range() for multiset 2021-12-29 10:36:23 -08:00
Christian Mazakas 2656bfbcac Add transparent test support for multiset's equal_range() 2021-12-29 10:36:23 -08:00
Christian Mazakas dc95efea1a Update transparent equal_range() tests to check for ranges of length 1 for multi-containers 2021-12-29 10:36:17 -08:00
Peter Dimov 81e7e4dd81 Merge pull request #67 from cmazakas/set-heterogeneous-equal-range
Set Heterogeneous `equal_range()`
2021-12-29 01:42:39 +02:00
Christian Mazakas 57a2b65488 Implement heterogeneous equal_range() for set 2021-12-27 12:20:52 -08:00
Christian Mazakas b23e47c478 Add transparent test support for set's equal_range() 2021-12-27 12:20:47 -08:00
Christian Mazakas ff4ca3098b Rename transparent equal_range() tests to include map in their name 2021-12-27 09:01:07 -08:00
Peter Dimov b6f8363023 Merge pull request #66 from cmazakas/set-heterogeneous-erase
Set Heterogeneous `erase()`
2021-12-24 02:28:40 +02:00
Christian Mazakas 9c07cf60a6 Deprecate table::erase_key_unique() 2021-12-23 13:12:52 -08:00
Christian Mazakas 36324af017 Implement heterogeneous erase() for set 2021-12-23 13:03:08 -08:00
Christian Mazakas 31392ce1aa Add transparent test support for set's erase() 2021-12-23 13:03:08 -08:00
Christian Mazakas 6cf039eecc Rename transaparent erase tests to include map in their name 2021-12-23 13:03:07 -08:00
Peter Dimov 79ab9800c0 Merge pull request #65 from cmazakas/set-heterogeneous-find
Set Heterogeneous `find()`
2021-12-23 21:39:53 +02:00
Christian Mazakas 05373cbb6b Implement heterogeneous find() for set 2021-12-23 09:54:12 -08:00
Christian Mazakas 1b009da4d0 Add transparent test support for set's find() 2021-12-23 09:45:39 -08:00
Christian Mazakas b39b6b7635 Rename transparent find tests to specify that they're for maps specifically 2021-12-23 09:45:26 -08:00
Christian Mazakas c2d3713f40 Update key type in transparent tests to be comparable with plain ints 2021-12-23 09:45:17 -08:00
Christian Mazakas c4345c809e Add ostream support for key type used in transparent tests 2021-12-23 09:39:13 -08:00
Peter Dimov c761934868 Merge pull request #64 from cmazakas/multimap-heterogeneous-count
Multimap Heterogeneous `count()`
2021-12-23 01:26:26 +02:00
Christian Mazakas 77c4a09a9b Implement heterogeneous count() for multimap 2021-12-22 12:59:52 -08:00
Christian Mazakas 58326b8fff Add transparent test support for multimap's count() 2021-12-22 12:59:45 -08:00
Christian Mazakas ee5d4b9e73 Remove unnecessary was_called_ statics from transparent test's key comparators 2021-12-22 11:23:57 -08:00
Peter Dimov e667e6dbd9 Merge pull request #63 from cmazakas/multimap-heterogeneous-extract
Multimap Heterogeneous `extract()`
2021-12-22 01:29:48 +02:00
Christian Mazakas ec288246d0 Implement heterogeneous extract() for multimap 2021-12-21 13:22:18 -08:00
Christian Mazakas 71c332803a Add transparent test support for multimap's extract() 2021-12-21 13:22:18 -08:00
Peter Dimov 5e30830cb9 Merge pull request #62 from cmazakas/multimap-heterogeneous-erase
Multimap Heterogeneous `erase()`
2021-12-21 20:41:12 +02:00
Christian Mazakas 57054f7451 Implement heterogeneous erase() for multimap 2021-12-21 09:27:00 -08:00
Christian Mazakas 1c6c085127 Update unordered_map to use singular type trait for erase() / extract() SFINAE 2021-12-21 09:27:00 -08:00
Christian Mazakas ff4d25d454 Add transparent_non_iterable type trait for usage in erase() / extract() SFINAE 2021-12-21 09:27:00 -08:00
Christian Mazakas 85cb09ae6d Add erase_key_equiv_impl() member function 2021-12-21 09:27:00 -08:00
Christian Mazakas 854a5aa3c3 Add transparent test support for multimap's erase() 2021-12-21 09:27:00 -08:00
Peter Dimov bde33a1d6a Merge branch 'feature/appveyor' into develop 2021-12-21 01:44:55 +02:00
Peter Dimov 8d98d8752b Remove msvc-14.2 from Appveyor (in GHA); split clang-win to avoid timeout 2021-12-21 00:47:54 +02:00
Peter Dimov cebeb4ea5f Update test/Jamfile 2021-12-21 00:46:45 +02:00
Peter Dimov a3a27a9a6c Merge branch 'feature/appveyor' into develop 2021-12-20 22:31:55 +02:00
Peter Dimov 973c72bdf0 Merge pull request #61 from cmazakas/multimap-heterogeneous-equal-range
Multimap Heterogeneous `equal_range()`
2021-12-20 22:15:56 +02:00
Peter Dimov 7bdd180c30 Use clang-win from VS2019 on Appveyor 2021-12-20 21:31:28 +02:00
Christian Mazakas 19d2fe8738 Implement heterogeneous equal_range() for multimap 2021-12-20 09:28:04 -08:00
Christian Mazakas 3d5a2d26d1 Add test support for multimap's equal_range() 2021-12-20 09:26:17 -08:00
Christian Mazakas 4e37a14bf8 Update transparent equal_range() tests to use BOOST_TEST_EQ where applicable 2021-12-20 08:41:06 -08:00
Peter Dimov 91500344d4 Merge pull request #60 from cmazakas/multimap-heterogeneous-find
Multimap heterogeneous `find()`
2021-12-17 21:06:16 +02:00
Christian Mazakas d8fe1a17cc Replace usage of compound is_transparent type trait with singular usage of are_transparent 2021-12-17 09:53:16 -08:00
Christian Mazakas 9945ce7583 Implement heterogeneous find() for multimap 2021-12-17 09:53:16 -08:00
Christian Mazakas 54d36f89ea Add find() test support for multimap 2021-12-17 09:53:04 -08:00
Christian Mazakas 193cf30780 Update find() tests to use BOOST_TEST_EQ 2021-12-15 14:14:26 -08:00
Peter Dimov ab8c09fcb9 Merge pull request #59 from cmazakas/reserve-fixes
Fix behavior of `reserve()` to match the STL implementations
2021-12-15 21:23:32 +02:00
Christian Mazakas 1db53ba155 Update internal table to allocate on construction and when rehashing 2021-12-15 09:42:44 -08:00
Christian Mazakas b41bb5c595 Add failing test case for issue #12 2021-12-15 09:42:33 -08:00
Peter Dimov c7676755ab Merge pull request #58 from cmazakas/deprecate-allocator-traits-macro
Remove unnecessary `allocator_traits` macro
2021-12-09 07:16:04 +02:00
LeonineKing1199 4f88b3865f Remove unnecessary test 2021-12-08 14:15:22 -08:00
LeonineKing1199 089d2db104 Remove traits detection mechanism 2021-12-08 14:04:04 -08:00
LeonineKing1199 fefb6ad4c4 Remove unnecessary expression test mechanisms 2021-12-08 13:59:11 -08:00
LeonineKing1199 05b795bc14 Remove unnecessary macro for determining which allocator_traits implementation is being used 2021-12-08 10:06:01 -08:00
Peter Dimov ff3f5067c8 Merge pull request #56 from LeonineKing1199/feature/allocator-traits
Replace internal implementation of `allocation_traits` with Core's
2021-12-08 01:23:02 +02:00
Peter Dimov 0c54f60e17 Merge pull request #55 from LeonineKing1199/heterogeneous-extract
Heterogeneous Extract
2021-12-08 00:56:26 +02:00
LeonineKing1199 82b33708ba Update allocator_traits test to only check for inherited SOCCC when the C++11 allocator is present 2021-12-07 11:21:43 -08:00
LeonineKing1199 5b8289c05a Remove extraneous include of Boost.Container's allocator_traits 2021-12-07 10:49:39 -08:00
LeonineKing1199 ea5cabb27f Update test to use two implicitly convertible types (const and non-const iterators) and the associated compile-time tests 2021-12-07 10:48:09 -08:00
LeonineKing1199 a6b9fb285c Replace internal implementation of allocation_traits with Core's 2021-12-07 08:35:56 -08:00
LeonineKing1199 4041d06e95 Clean up tests 2021-12-06 15:04:40 -08:00
LeonineKing1199 13cd5aa4ce Implement initial draft of heterogeneous extract() 2021-12-06 13:06:05 -08:00
Peter Dimov 00b504ebc5 Merge pull request #54 from LeonineKing1199/heterogeneous-erase
Heterogeneous erase
2021-12-06 22:10:06 +02:00
LeonineKing1199 afb83a6cb9 Refactor erase() tests to use BOOST_TEST_EQ where applicable 2021-12-06 08:52:02 -08:00
LeonineKing1199 f5b03fb2e8 Pull out expressions with side-effects from the testing assertions 2021-12-06 08:30:57 -08:00
LeonineKing1199 b8d3aa2a68 Light cleanup of test 2021-12-03 11:19:58 -08:00
LeonineKing1199 52f154ec02 Flesh out test suite for heterogeneous erase() 2021-12-03 10:17:50 -08:00
LeonineKing1199 e4d0693eb9 Fix erroneous placement of heterogeneous erase() from multimap to map 2021-12-03 10:08:30 -08:00
LeonineKing1199 4a42c93897 Fix erroneous usage of table::hash() impl which implicitly copy-constructs the const_key_type 2021-12-03 10:07:57 -08:00
LeonineKing1199 8b438dea76 Use erase_key_unique_impl() directly so that eventually erase_unique() can be deprecated 2021-12-03 08:48:20 -08:00
LeonineKing1199 12977a50bc Add hopefully helpful comment to the source 2021-12-03 08:41:42 -08:00
LeonineKing1199 33f84624ec Add initial draft of heterogeneous erase() 2021-12-02 15:59:12 -08:00
LeonineKing1199 f252480bee Add missing formatting 2021-12-02 15:44:02 -08:00
LeonineKing1199 c9df887c4c Add member function template erase_key_unique_impl for usage in heterogeneous lookups 2021-12-02 15:38:07 -08:00
LeonineKing1199 03edf7f4a8 Add member function template find_previous_node_impl so it can be used in heterogenous contexts 2021-12-02 15:30:17 -08:00
Peter Dimov a98a719546 Merge pull request #53 from LeonineKing1199/heterogeneous-equal-range
Implement heterogeneous `equal_range()` for `unordered_map`
2021-12-02 21:19:28 +02:00
LeonineKing1199 a97483b928 Add test cases for empty UnorderedMaps for equal_range() 2021-12-02 09:42:30 -08:00
LeonineKing1199 9955886ef5 Improve heterogeneous equal_range() test suite to check iterator distance and that the correct key was pulled, including when the map contains multiple keys 2021-12-02 09:18:24 -08:00
Peter Dimov 3646a7143e Add msvc-14.0, msvc-14.3 2021-12-02 18:32:30 +02:00
LeonineKing1199 13f40e4333 Implement heterogeneous equal_range() for unordered_map 2021-12-01 09:39:07 -08:00
Peter Dimov 6249660e1f Merge pull request #51 from LeonineKing1199/heterogeneous-find
Heterogeneous `find()`
2021-11-30 18:32:24 +02:00
LeonineKing1199 3eb2d3c4b3 Add comments about nature of test 2021-11-29 14:55:18 -08:00
LeonineKing1199 8f1fc75fdf Implement heterogeneous find() 2021-11-29 14:37:04 -08:00
Peter Dimov d3c37344f0 Vary top 24 bits of shifted indices instead of top 32 bits 2021-11-29 17:37:26 +02:00
Peter Dimov 5e8b6a9e55 Add comment describing the origin of mix64_policy::apply_hash 2021-11-29 06:14:20 +02:00
Peter Dimov bbd0eedb5f Precompute indices to avoid clever optimizations 2021-11-29 04:54:47 +02:00
Peter Dimov ad51b34438 Add benchmark/uint64.cpp 2021-11-29 02:49:12 +02:00
Peter Dimov 0d4b753409 Merge pull request #45 from LeonineKing1199/transparent-count-unordered_map
Transparent count unordered map
2021-11-24 01:50:28 +02:00
LeonineKing1199 6f5727cbdb Clean up tests by pulling transparent tests into a named function 2021-11-23 14:14:26 -08:00
Peter Dimov 10e88d07af Merge pull request #41 from LeonineKing1199/deprecated-copy
Fix `-Wdeprecated-copy` warnings in test allocator
2021-11-23 22:34:08 +02:00
LeonineKing1199 3f1e4a703a Clean up tests to be a bit more readable 2021-11-23 12:15:53 -08:00
LeonineKing1199 bc9eca70d0 Remove unnecessary assignment operator for test key 2021-11-23 12:04:00 -08:00
LeonineKing1199 69b882a14b Add defaulted copy assignment operators when supported 2021-11-23 11:10:03 -08:00
LeonineKing1199 6984e6a4f2 Remove unnecessary move support 2021-11-23 10:57:26 -08:00
LeonineKing1199 fd0cab2ab8 Remove out-of-line defintion for transparent count() to hopefully appease msvc-9.0 2021-11-22 15:43:28 -08:00
LeonineKing1199 93216374ef Flesh out test suite to cover all permutations of transparent/non-transparent Hash & KeyEqual pairs 2021-11-22 13:30:10 -08:00
LeonineKing1199 8ba710637a Remove detail::make_dependent in favor of an extra template parameter in is_transparetn 2021-11-22 13:29:41 -08:00
LeonineKing1199 937c3484cf Flesh out test case 2021-11-22 12:27:29 -08:00
LeonineKing1199 59db6cf788 Add SFINAE to transparent count() overload in unordered_map 2021-11-22 11:16:04 -08:00
LeonineKing1199 f41b3e8295 Get initial prototype of transparent count() working 2021-11-19 15:29:57 -08:00
LeonineKing1199 fe439890e8 Remove unneeded macro as Config defines BOOST_NOEXCEPT 2021-11-19 10:10:52 -08:00
LeonineKing1199 e29f762116 Fix warning about using implicitly defined copy constructor/assignment by completing the Rule of 5 for test allocator 2021-11-19 10:10:52 -08:00
Peter Dimov c8abaf32ee Merge pull request #40 from LeonineKing1199/sfinae-updates
Update SFINAE expressions to be in the return type
2021-11-19 04:32:06 +02:00
Peter Dimov c0a9f638ce Merge pull request #37 from LeonineKing1199/memory-tracker-fixes
Replace `BOOST_TEST` call with `BOOST_ASSERT` to resolve testing woes
2021-11-19 04:26:33 +02:00
Peter Dimov 4a90ae5b0f Merge pull request #38 from LeonineKing1199/ambiguous-reversed-operator
Ambiguous reversed operator fixes
2021-11-19 04:25:45 +02:00
LeonineKing1199 7ccd62ba98 Update SFINAE expressions to be in the return type instead of a defaulted function parameter 2021-11-18 12:54:17 -08:00
LeonineKing1199 2e1ef850e3 Add const qualification to auto-generated allocator methods in test suite 2021-11-18 10:25:44 -08:00
LeonineKing1199 dbba786a35 Add missing const-qualification for operator== member functions 2021-11-18 10:24:57 -08:00
LeonineKing1199 d0d4be9e35 Add missing operator== overloads for direct list_iterator comparisons 2021-11-18 10:19:46 -08:00
LeonineKing1199 2d69c7a5ca Add missing const-qualification of operator== for internal optional implementation 2021-11-18 10:19:20 -08:00
LeonineKing1199 24a38922bd Replace BOOST_TEST call with BOOST_ASSERT to resolve https://github.com/boostorg/unordered/issues/36 2021-11-18 09:36:04 -08:00
LeonineKing1199 1e553df5b6 Add explicit tests around use of scoped_allocator_adaptor to emulat… (#31)
* Add explicit tests around use of `scoped_allocator_adaptor` to emulate issue https://github.com/boostorg/unordered/issues/22

* Refine test to only run in C++11 mode and later with possibility of re-introducing C++03 support later

* Update test to use `<boost/cstdint.hpp>`

* Refactor test to use `UNORDERED_AUTO_TEST`

* Cleanup how the scoped allocator test is conditionally compiled

* Update test to generate a UUID for the name of the shared memory segment so tests can run safely in parallel

* Update test jamfile to relocate the Filesystem link dependency directly to the test that requires it
2021-11-15 21:22:40 +02:00
Peter Dimov 0f37f774f1 Merge branch 'develop' of https://github.com/yutakasi634/unordered into feature/pr-14 2021-09-01 04:15:55 +03:00
Peter Dimov 34c07ea148 Merge branch 'gcc-9-rvalue-ref-try-emplace' of https://github.com/LeonineKing1199/unordered into feature/pr-29 2021-08-31 22:02:10 +03:00
Peter Dimov 70fca4483e std::equal_to has no first_argument_type in C++20 2021-08-31 21:16:09 +03:00
Peter Dimov b2b017accb Disable -Wfloat-equal for clang-cl as well 2021-08-31 21:10:52 +03:00
LeonineKing1199 a97160cf57 Fix bug in has_construct by using std::declval 2021-08-29 12:13:56 -07:00
Peter Dimov 1d42f5b7b1 Merge pull request #20 from eldiener/develop
[skip ci] Add "cxxstd" json field
2021-08-29 14:50:13 +03:00
Peter Dimov 70ac0509df Update .appveyor.yml 2021-08-29 02:22:34 +03:00
Peter Dimov f1678399af Remove cxxstd=2a from clang-9, 10 2021-08-28 17:00:31 +03:00
Peter Dimov bae1f8ca82 Switch 16.04 jobs to 18.04 2021-08-28 16:53:45 +03:00
Peter Dimov 790c33d6a7 Re-add gcc-9 on 18.04 for contrast 2021-08-21 22:17:34 +03:00
Peter Dimov a9f5da7799 Use 20.04 for gcc-9 and above 2021-08-21 21:03:48 +03:00
Peter Dimov 6a59e6db39 Disable variadic macro warnings from Boost.PP for gcc 2021-08-21 19:15:23 +03:00
Peter Dimov 76a44cff09 Disable cxxstd=2a for clang-8 2021-08-21 19:09:17 +03:00
Peter Dimov e36dce52ba Disable variadic macro warnings from Boost.PP for clang 2021-08-21 19:08:40 +03:00
Peter Dimov c31ace5fc8 Add .github/workflows 2021-08-21 19:03:57 +03:00
Peter Dimov c494b3db58 Merge branch 'master' into develop 2021-05-29 05:28:09 +03:00
Peter Dimov bf0c3c188e Add CMakeLists.txt 2021-03-18 17:29:38 +02:00
Edward Diener 0f9f3eba72 [skip ci] Add "cxxstd" json field. The "cxxstd" json field is being added to each Boost library's meta json information for libraries in order to specify the minumum C++ standard compilation level. The value of this field matches one of the values for 'cxxstd' in Boost.Build. The purpose of doing this is to provide information for the Boost website documentation for each library which will specify the minimum C++ standard compilation that an end-user must employ in order to use the particular library. This will aid end-users who want to know if they can successfully use a Boost library based on their C++ compiler's compilation level, without having to search the library's documentation to find this out. 2021-01-20 02:52:08 -05:00
Glen Fernandes 0960f885d5 Merge branch 'develop' 2020-11-01 08:21:59 -05:00
Peter Dimov 33b28a514e Update .appveyor.yml 2020-08-24 12:41:56 +03:00
Peter Dimov 2497d663b7 Merge pull request #16 from eldiener/develop
Changes for Embarcadero C++ clang-based compilers, targeting Boost 1.74. Change __BORLANDC__ to BOOST_BORLANDC and __CODEGEARC__ to BOOST_CODE…
2020-08-24 12:39:36 +03:00
Edward Diener 887f1dc07c Change __BORLANDC__ to BOOST_BORLANDC and __CODEGEARC__ to BOOST_CODEGEARC, which are3defined in Boost config for the Embarcadero non-clang-based compilers. 2020-03-31 22:47:48 -04:00
yutaka 0d033679d4 Fix typo 2020-02-03 20:48:35 +09:00
234 changed files with 34978 additions and 13487 deletions
+135 -18
View File
@@ -1,4 +1,6 @@
# Copyright 2017 Daniel James
# Copyright 2016, 2017 Peter Dimov
# Copyright 2017 - 2019 James E. King III
# Copyright 2019 - 2021 Alexander Grund
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
@@ -6,27 +8,142 @@ version: 1.0.{build}-{branch}
shallow_clone: true
branches:
only:
- master
- develop
- /bugfix\/.*/
- /feature\/.*/
- /fix\/.*/
- /pr\/.*/
matrix:
fast_finish: false
# Adding MAYFAIL to any matrix job allows it to fail but the build stays green:
allow_failures:
- MAYFAIL: true
environment:
global:
B2_CI_VERSION: 1
GIT_FETCH_JOBS: 4
B2_ADDRESS_MODEL: 32,64
B2_VARIANT: debug,release
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
TOOLSET: msvc-10.0,msvc-11.0,msvc-12.0
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
TOOLSET: msvc-14.0
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
TOOLSET: msvc-14.1
- FLAVOR: Visual Studio 2008, 2010, 2012
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
B2_TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0
B2_ADDRESS_MODEL: 32 # No 64bit support
- FLAVOR: Visual Studio 2013, 2015
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
B2_TOOLSET: msvc-12.0,msvc-14.0
- FLAVOR: Visual Studio 2017
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
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)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
ADDPATH: C:\cygwin\bin;
B2_ADDRESS_MODEL: 32
B2_CXXSTD: 03,11,14,1z
B2_TOOLSET: gcc
- FLAVOR: cygwin (64-bit)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
ADDPATH: C:\cygwin64\bin;
B2_ADDRESS_MODEL: 64
B2_CXXSTD: 03,11,14,1z
B2_TOOLSET: gcc
- FLAVOR: cygwin (64-bit, latest)
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"
- FLAVOR: cygwin (64-bit, latest)
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"
- 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
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
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
#- FLAVOR: CodeCov (VS 2019)
# APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
# B2_CXXFLAGS: -permissive-
# B2_CXXSTD: 14
# B2_TOOLSET: msvc-14.2
# COVERAGE: true
install:
- set BOOST_ROOT=c:\projects\boost
- cd c:\projects\
- python %APPVEYOR_BUILD_FOLDER%\ci\download-boost-snapshot.py master
- rd /s /q %BOOST_ROOT%\boost\unordered
- cd %BOOST_ROOT%\tools\build
- cmd /c bootstrap
- cd %APPVEYOR_BUILD_FOLDER%
- echo. 2>Jamroot.jam
- git clone --depth 1 https://github.com/boostorg/boost-ci.git C:\boost-ci-cloned
# Copy ci folder if not testing Boost.CI
- if NOT "%APPVEYOR_PROJECT_NAME%" == "boost-ci" xcopy /s /e /q /i /y C:\boost-ci-cloned\ci .\ci
- rmdir /s /q C:\boost-ci-cloned
- ci\appveyor\install.bat
build: off
test_script:
- cd %APPVEYOR_BUILD_FOLDER%\test
- cmd /c %BOOST_ROOT%\tools\build\b2 -j 3 toolset=%TOOLSET% include=%APPVEYOR_BUILD_FOLDER%\include include=%BOOST_ROOT%
test_script: ci\build.bat
for:
# CodeCov coverage build
- matrix:
only: [COVERAGE: true]
test_script: [ps: ci\codecov.ps1]
+23
View File
@@ -0,0 +1,23 @@
# Copyright 2019 - 2021 Alexander Grund
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
#
# Sample codecov configuration file. Edit as required
codecov:
max_report_age: off
require_ci_to_pass: yes
notify:
# Increase this if you have multiple coverage collection jobs
after_n_builds: 1
wait_for_ci: yes
# Change how pull request comments look
comment:
layout: "reach,diff,flags,files,footer"
# Ignore specific files or folders. Glob patterns are supported.
# See https://docs.codecov.com/docs/ignoring-paths
ignore:
- extra/**/*
# - test/**/*
+388
View File
@@ -0,0 +1,388 @@
# Copyright 2022 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt
local library = "unordered";
local triggers =
{
branch: [ "master", "develop", "feature/*", "bugfix/*" ]
};
local ubsan = { UBSAN: '1', UBSAN_OPTIONS: 'print_stacktrace=1' };
local asan = { ASAN: '1' };
local linux_pipeline(name, image, environment, packages = "", sources = [], arch = "amd64") =
{
name: name,
kind: "pipeline",
type: "docker",
trigger: triggers,
platform:
{
os: "linux",
arch: arch
},
steps:
[
{
name: "everything",
image: image,
environment: environment,
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 []) +
(if packages != "" then [ 'apt-get update', 'apt-get -y install ' + packages ] else []) +
[
'export LIBRARY=' + library,
'./.drone/drone.sh',
]
}
]
};
local macos_pipeline(name, environment, xcode_version = "12.2", osx_version = "catalina", arch = "amd64") =
{
name: name,
kind: "pipeline",
type: "exec",
trigger: triggers,
platform: {
"os": "darwin",
"arch": arch
},
node: {
"os": osx_version
},
steps: [
{
name: "everything",
environment: environment + { "DEVELOPER_DIR": "/Applications/Xcode-" + xcode_version + ".app/Contents/Developer" },
commands:
[
'uname -a',
'export LIBRARY=' + library,
'./.drone/drone.sh',
]
}
]
};
local windows_pipeline(name, image, environment, arch = "amd64") =
{
name: name,
kind: "pipeline",
type: "docker",
trigger: triggers,
platform:
{
os: "windows",
arch: arch
},
"steps":
[
{
name: "everything",
image: image,
environment: environment,
commands:
[
'echo $env:DRONE_STAGE_MACHINE',
'cmd /C .drone\\\\drone.bat ' + library,
]
}
]
};
[
linux_pipeline(
"Linux 14.04 GCC 4.4 32/64",
"cppalliance/droneubuntu1404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.4', CXXSTD: '98,0x', ADDRMD: '32,64' },
"g++-4.4-multilib",
[ "ppa:ubuntu-toolchain-r/test" ],
),
linux_pipeline(
"Linux 14.04 GCC 4.6 32/64",
"cppalliance/droneubuntu1404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.6', CXXSTD: '98,0x', ADDRMD: '32,64' },
"g++-4.6-multilib",
[ "ppa:ubuntu-toolchain-r/test" ],
),
linux_pipeline(
"Linux 14.04 GCC 4.7 32/64",
"cppalliance/droneubuntu1404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.7', CXXSTD: '98,0x', ADDRMD: '32,64' },
"g++-4.7-multilib",
[ "ppa:ubuntu-toolchain-r/test" ],
),
linux_pipeline(
"Linux 14.04 GCC 4.8* 32/64",
"cppalliance/droneubuntu1404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 14.04 GCC 4.9 32/64",
"cppalliance/droneubuntu1404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.9', CXXSTD: '03,11', ADDRMD: '32,64' },
"g++-4.9-multilib",
[ "ppa:ubuntu-toolchain-r/test" ],
),
linux_pipeline(
"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' },
arch="arm64",
),
linux_pipeline(
"Linux 20.04 GCC 9* S390x",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a' },
arch="s390x",
),
linux_pipeline(
"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(
"MacOS 10.15 Xcode 12.2 UBSAN",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '03,11,14,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", arch = "arm64",
),
windows_pipeline(
"Windows VS2015 msvc-14.0",
"cppalliance/dronevs2015",
{ TOOLSET: 'msvc-14.0', CXXSTD: '14,latest' },
),
windows_pipeline(
"Windows VS2017 msvc-14.1",
"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' },
),
]
+23
View File
@@ -0,0 +1,23 @@
@REM Copyright 2022 Peter Dimov
@REM Distributed under the Boost Software License, Version 1.0.
@REM https://www.boost.org/LICENSE_1_0.txt
@ECHO ON
set LIBRARY=%1
set DRONE_BUILD_DIR=%CD%
set BOOST_BRANCH=develop
if "%DRONE_BRANCH%" == "master" set BOOST_BRANCH=master
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
git submodule update --init tools/boostdep
xcopy /s /e /q %DRONE_BUILD_DIR% libs\%LIBRARY%\
python tools/boostdep/depinst/depinst.py %LIBRARY%
cmd /c bootstrap
b2 -d0 headers
if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD%
if not "%ADDRMD%" == "" set ADDRMD=address-model=%ADDRMD%
b2 -j3 libs/%LIBRARY%/test toolset=%TOOLSET% %CXXSTD% %ADDRMD% variant=debug,release embed-manifest-via=linker
+25
View File
@@ -0,0 +1,25 @@
#!/bin/bash
# Copyright 2022 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt
set -ex
export PATH=~/.local/bin:/usr/local/bin:$PATH
DRONE_BUILD_DIR=$(pwd)
BOOST_BRANCH=develop
if [ "$DRONE_BRANCH" = "master" ]; then BOOST_BRANCH=master; fi
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
git submodule update --init tools/boostdep
cp -r $DRONE_BUILD_DIR/* libs/$LIBRARY
python tools/boostdep/depinst/depinst.py $LIBRARY
./bootstrap.sh
./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}
+395
View File
@@ -0,0 +1,395 @@
# Copyright 2020-2021 Peter Dimov
# Copyright 2021 Andrey Semashev
# Copyright 2021 Alexander Grund
# Copyright 2022 James E. King III
#
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
---
name: CI
on:
pull_request:
push:
branches:
- master
- develop
- bugfix/**
- feature/**
- fix/**
- pr/**
concurrency:
group: ${{format('{0}:{1}', github.repository, github.ref)}}
cancel-in-progress: true
env:
GIT_FETCH_JOBS: 8
NET_RETRY_COUNT: 5
B2_CI_VERSION: 1
B2_VARIANT: debug,release
LCOV_BRANCH_COVERAGE: 0
CODECOV_NAME: Github Actions
jobs:
posix:
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
include:
# Linux, gcc
- { 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', ccache_key: "cov" }
# 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, }
- { compiler: clang, cxxstd: '03,11,14,17,2a', os: macos-12, sanitize: yes }
timeout-minutes: 120
runs-on: ${{matrix.os}}
container: ${{matrix.container}}
env: {B2_USE_CCACHE: 1}
steps:
- name: Setup environment
run: |
if [ -f "/etc/debian_version" ]; then
echo "DEBIAN_FRONTEND=noninteractive" >> $GITHUB_ENV
export DEBIAN_FRONTEND=noninteractive
fi
if [ -n "${{matrix.container}}" ] && [ -f "/etc/debian_version" ]; then
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common
# Need (newer) git, and the older Ubuntu container may require requesting the key manually using port 80
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E1DD270288B4E6030699E45FA1715D88E1DF1F24
for i in {1..${NET_RETRY_COUNT:-3}}; do sudo -E add-apt-repository -y ppa:git-core/ppa && break || sleep 10; done
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y g++ python libpython-dev git
fi
# For jobs not compatible with ccache, use "ccache: no" in the matrix
if [[ "${{ matrix.ccache }}" == "no" ]]; then
echo "B2_USE_CCACHE=0" >> $GITHUB_ENV
fi
git config --global pack.threads 0
- uses: actions/checkout@v3
with:
# For coverage builds fetch the whole history, else only 1 commit using a 'fake ternary'
fetch-depth: ${{ matrix.coverage && '0' || '1' }}
- name: Cache ccache
uses: actions/cache@v3
if: env.B2_USE_CCACHE
with:
path: ~/.ccache
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
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
# Copy ci folder if not testing Boost.CI
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Install packages
if: startsWith(matrix.os, 'ubuntu')
run: |
SOURCE_KEYS=(${{join(matrix.source_keys, ' ')}})
SOURCES=(${{join(matrix.sources, ' ')}})
# Add this by default
SOURCES+=(ppa:ubuntu-toolchain-r/test)
for key in "${SOURCE_KEYS[@]}"; do
for i in {1..$NET_RETRY_COUNT}; do
wget -O - "$key" | sudo apt-key add - && break || sleep 10
done
done
for source in "${SOURCES[@]}"; do
for i in {1..$NET_RETRY_COUNT}; do
sudo add-apt-repository $source && break || sleep 10
done
done
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
if [[ -z "${{matrix.install}}" ]]; then
pkgs="${{matrix.compiler}}"
pkgs="${pkgs/gcc-/g++-}"
else
pkgs="${{matrix.install}}"
fi
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y $pkgs
- name: Setup GCC Toolchain
if: matrix.gcc_toolchain
run: |
GCC_TOOLCHAIN_ROOT="$HOME/gcc-toolchain"
echo "GCC_TOOLCHAIN_ROOT=$GCC_TOOLCHAIN_ROOT" >> $GITHUB_ENV
MULTIARCH_TRIPLET="$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
mkdir -p "$GCC_TOOLCHAIN_ROOT"
ln -s /usr/include "$GCC_TOOLCHAIN_ROOT/include"
ln -s /usr/bin "$GCC_TOOLCHAIN_ROOT/bin"
mkdir -p "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET"
ln -s "/usr/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}" "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}"
- name: Setup multiarch
if: matrix.multiarch
run: |
sudo apt-get install --no-install-recommends -y binfmt-support qemu-user-static
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
git clone https://github.com/jeking3/bdde.git
echo "$(pwd)/bdde/bin/linux" >> ${GITHUB_PATH}
echo "BDDE_DISTRO=${{ matrix.distro }}" >> ${GITHUB_ENV}
echo "BDDE_EDITION=${{ matrix.edition }}" >> ${GITHUB_ENV}
echo "BDDE_ARCH=${{ matrix.arch }}" >> ${GITHUB_ENV}
echo "B2_WRAPPER=bdde" >> ${GITHUB_ENV}
- name: Setup Boost
env:
B2_ADDRESS_MODEL: ${{matrix.address-model}}
B2_COMPILER: ${{matrix.compiler}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_SANITIZE: ${{matrix.sanitize}}
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}}
# Variables set here (to non-empty) will override the top-level environment variables, e.g.
# B2_VARIANT: ${{matrix.variant}}
run: source ci/github/install.sh
- name: Setup coverage collection
if: matrix.coverage
run: ci/github/codecov.sh "setup"
- name: Run tests
if: '!matrix.coverity'
run: ci/build.sh
- name: Upload coverage
if: matrix.coverage
run: ci/codecov.sh "upload"
- name: Run coverity
if: matrix.coverity && github.event_name == 'push' && (github.ref_name == 'develop' || github.ref_name == 'master')
run: ci/github/coverity.sh
env:
COVERITY_SCAN_NOTIFICATION_EMAIL: ${{ secrets.COVERITY_SCAN_NOTIFICATION_EMAIL }}
COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
windows:
defaults:
run:
shell: cmd
strategy:
fail-fast: false
matrix:
include:
- { 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}}
steps:
- uses: actions/checkout@v3
- name: Fetch Boost.CI
uses: actions/checkout@v3
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
REM Copy ci folder if not testing Boost.CI
if "%GITHUB_REPOSITORY%" == "%GITHUB_REPOSITORY:boost-ci=%" xcopy /s /e /q /i /y boost-ci-cloned\ci .\ci
rmdir /s /q boost-ci-cloned
- name: Setup Boost
run: ci\github\install.bat
- name: Run tests
if: '!matrix.coverage'
run: ci\build.bat
env:
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
if: matrix.coverage
run: ci\opencppcoverage.ps1
env:
B2_TOOLSET: ${{matrix.toolset}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_ADDRESS_MODEL: ${{matrix.addrmd}}
- name: Upload coverage
if: matrix.coverage
uses: codecov/codecov-action@v2
with:
files: __out/cobertura.xml
MSYS2:
defaults:
run:
shell: msys2 {0}
strategy:
fail-fast: false
matrix:
include:
- { sys: MINGW32, compiler: gcc, cxxstd: '03,11,17,20' }
- { sys: MINGW64, compiler: gcc, cxxstd: '03,11,17,20' }
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Setup MSYS2 environment
uses: msys2/setup-msys2@v2
with:
msystem: ${{matrix.sys}}
update: true
install: git python
pacboy: gcc:p cmake:p ninja:p
- name: Fetch Boost.CI
uses: actions/checkout@v3
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
# Copy ci folder if not testing Boost.CI
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Setup Boost
env:
B2_COMPILER: ${{matrix.compiler}}
B2_CXXSTD: ${{matrix.cxxstd}}
B2_SANITIZE: ${{matrix.sanitize}}
B2_STDLIB: ${{matrix.stdlib}}
run: ci/github/install.sh
- name: Run tests
run: ci/build.sh
# Run also the CMake tests to avoid having to setup another matrix for CMake on MSYS
- name: Run CMake tests
run: |
cd "$BOOST_ROOT"
mkdir __build_cmake_test__ && cd __build_cmake_test__
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=ON -DBoost_VERBOSE=ON ..
cmake --build . --target tests --config Debug -j$B2_JOBS
ctest --output-on-failure --build-config Debug
CMake:
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
include:
- { os: ubuntu-20.04, build_shared: ON, build_type: Debug, generator: 'Unix Makefiles' }
- { os: windows-2019, build_shared: ON, build_type: Debug, generator: 'Visual Studio 16 2019' }
timeout-minutes: 120
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v3
- name: Fetch Boost.CI
uses: actions/checkout@v3
with:
repository: boostorg/boost-ci
ref: master
path: boost-ci-cloned
- name: Get CI scripts folder
run: |
# Copy ci folder if not testing Boost.CI
[[ "$GITHUB_REPOSITORY" =~ "boost-ci" ]] || cp -r boost-ci-cloned/ci .
rm -rf boost-ci-cloned
- name: Setup Boost
env: {B2_DONT_BOOTSTRAP: 1}
run: source ci/github/install.sh
- name: Run CMake tests
run: |
cd "$BOOST_ROOT"
mkdir __build_cmake_test__ && cd __build_cmake_test__
cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DBUILD_TESTING=ON -DBoost_VERBOSE=ON ..
cmake --build . --target tests --config ${{matrix.build_type}} -j$B2_JOBS
ctest --output-on-failure --build-config ${{matrix.build_type}}
- name: Run CMake subdir tests
run: |
cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test" # New unified folder
[ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_subdir_test"
cd "$cmake_test_folder"
mkdir __build_cmake_subdir_test__ && cd __build_cmake_subdir_test__
cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=OFF -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} ..
cmake --build . --config ${{matrix.build_type}} -j$B2_JOBS
ctest --output-on-failure --build-config ${{matrix.build_type}}
- name: Install Library
run: |
cd "$BOOST_ROOT"
mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_INSTALL_PREFIX=~/.local -DBoost_VERBOSE=ON -DBoost_DEBUG=ON ..
cmake --build . --target install --config ${{matrix.build_type}} -j$B2_JOBS
- name: Run CMake install tests
run: |
cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_test" # New unified folder
[ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_install_test"
cd "$cmake_test_folder"
mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_PREFIX_PATH=~/.local ..
cmake --build . --config ${{matrix.build_type}} -j$B2_JOBS
ctest --output-on-failure --build-config ${{matrix.build_type}}
+1
View File
@@ -1 +1,2 @@
/doc/html/
/doc/pdf/
+34
View File
@@ -0,0 +1,34 @@
# Generated by `boostdep --cmake unordered`
# Copyright 2020, 2021 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt
cmake_minimum_required(VERSION 3.5...3.20)
project(boost_unordered VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
add_library(boost_unordered INTERFACE)
add_library(Boost::unordered ALIAS boost_unordered)
target_include_directories(boost_unordered INTERFACE include)
target_link_libraries(boost_unordered
INTERFACE
Boost::assert
Boost::config
Boost::container_hash
Boost::core
Boost::move
Boost::mp11
Boost::predef
Boost::preprocessor
Boost::throw_exception
Boost::tuple
Boost::type_traits
)
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
add_subdirectory(test)
endif()
+23
View File
@@ -0,0 +1,23 @@
Boost Software License - Version 1.0 - August 17th, 2003
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
+49
View File
@@ -0,0 +1,49 @@
# Boost.Unordered
Part of collection of the [Boost C++ Libraries](http://github.com/boostorg).
For accessing data based on key lookup, the C++ standard library offers `std::set`, `std::map`, `std::multiset` and `std::multimap`.
These are generally implemented using balanced binary trees so that lookup time has logarithmic complexity.
That is generally okay, but in many cases a hash table can perform better, as accessing data has constant complexity, on average.
The worst case complexity is linear, but that occurs rarely and with some care, can be avoided.
Also, the existing containers require a 'less than' comparison object to order their elements.
For some data types this is impossible to implement or isnt practical.
In contrast, a hash table only needs an equality function and a hash function for the key.
With this in mind, unordered associative containers were added to the C++ standard.
This is an implementation of the containers described in C++11, with some deviations from the standard in order to work with non-C++11 compilers and libraries.
### License
Distributed under the [Boost Software License, Version 1.0](http://www.boost.org/LICENSE_1_0.txt).
### Properties
* C++03
* Header-Only
### Build Status
Branch | GH Actions | Appveyor | codecov.io | Deps | Docs | Tests |
:-------------: | ---------- | -------- | ---------- | ---- | ---- | ----- |
[`master`](https://github.com/boostorg/unordered/tree/master) | [![CI](https://github.com/boostorg/unordered/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/boostorg/unordered/actions/workflows/ci.yml) | [![Build status](https://ci.appveyor.com/api/projects/status/github/boostorg/unordered?branch=master&svg=true)](https://ci.appveyor.com/project/danieljames/unordered-qtwe6/branch/master) | [![codecov](https://codecov.io/gh/boostorg/unordered/branch/master/graph/badge.svg)](https://codecov.io/gh/boostorg/unordered/branch/master) | [![Deps](https://img.shields.io/badge/deps-master-brightgreen.svg)](https://pdimov.github.io/boostdep-report/master/unordered.html) | [![Documentation](https://img.shields.io/badge/docs-master-brightgreen.svg)](https://www.boost.org/doc/libs/master/libs/unordered/doc/html/unordered.html) | [![Enter the Matrix](https://img.shields.io/badge/matrix-master-brightgreen.svg)](http://www.boost.org/development/tests/master/developer/unordered.html)
[`develop`](https://github.com/boostorg/unordered/tree/develop) | [![CI](https://github.com/boostorg/unordered/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/boostorg/unordered/actions/workflows/ci.yml) | [![Build status](https://ci.appveyor.com/api/projects/status/github/boostorg/unordered?branch=develop&svg=true)](https://ci.appveyor.com/project/danieljames/unordered-qtwe6/branch/develop) | [![codecov](https://codecov.io/gh/boostorg/unordered/branch/develop/graph/badge.svg)](https://codecov.io/gh/boostorg/unordered/branch/develop) | [![Deps](https://img.shields.io/badge/deps-develop-brightgreen.svg)](https://pdimov.github.io/boostdep-report/develop/unordered.html) | [![Documentation](https://img.shields.io/badge/docs-develop-brightgreen.svg)](https://www.boost.org/doc/libs/develop/libs/unordered/doc/html/unordered.html) | [![Enter the Matrix](https://img.shields.io/badge/matrix-develop-brightgreen.svg)](http://www.boost.org/development/tests/develop/developer/unordered.html)
### Directories
| Name | Purpose |
| ----------- | ------------------------------ |
| `doc` | documentation |
| `example` | examples |
| `include` | headers |
| `test` | unit tests |
### More information
* [Ask questions](http://stackoverflow.com/questions/ask?tags=c%2B%2B,boost,boost-unordered)
* [Report bugs](https://github.com/boostorg/unordered/issues): Be sure to mention Boost version, platform and compiler you're using. A small compilable code sample to reproduce the problem is always good as well.
* Submit your patches as pull requests against **develop** branch. Note that by submitting patches you agree to license your modifications under the [Boost Software License, Version 1.0](http://www.boost.org/LICENSE_1_0.txt).
* Discussions about the library are held on the [Boost developers mailing list](http://www.boost.org/community/groups.html#main). Be sure to read the [discussion policy](http://www.boost.org/community/policy.html) before posting and add the `[unordered]` tag at the beginning of the subject line.
+3
View File
@@ -0,0 +1,3 @@
enwik8
enwik9
*.exe
+421
View File
@@ -0,0 +1,421 @@
// Copyright 2021 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
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_flat_map.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_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <vector>
#include <memory>
#include <cstdint>
#include <iostream>
#include <iomanip>
#include <chrono>
using namespace std::chrono_literals;
static void print_time( std::chrono::steady_clock::time_point & t1, char const* label, std::uint32_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;
static std::vector<std::string> indices1, indices2;
static std::string make_index( unsigned x )
{
char buffer[ 64 ];
std::snprintf( buffer, sizeof(buffer), "pfx_%u_sfx", x );
return buffer;
}
static std::string make_random_index( unsigned x )
{
char buffer[ 64 ];
std::snprintf( buffer, sizeof(buffer), "pfx_%0*d_%u_sfx", x % 8 + 1, 0, x );
return buffer;
}
static void init_indices()
{
indices1.reserve( N*2+1 );
indices1.push_back( make_index( 0 ) );
for( unsigned i = 1; i <= N*2; ++i )
{
indices1.push_back( make_index( i ) );
}
indices2.reserve( N*2+1 );
indices2.push_back( make_index( 0 ) );
{
boost::detail::splitmix64 rng;
for( unsigned i = 1; i <= N*2; ++i )
{
indices2.push_back( make_random_index( static_cast<std::uint32_t>( rng() ) ) );
}
}
}
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() );
std::cout << std::endl;
}
template<class Map> BOOST_NOINLINE void test_lookup( Map& map, std::chrono::steady_clock::time_point & t1 )
{
std::uint32_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() );
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() );
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, std::uint32_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 );
}
// 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
#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 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 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_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_indices();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_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_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
+422
View File
@@ -0,0 +1,422 @@
// Copyright 2021 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
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_flat_map.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_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <string_view>
#include <vector>
#include <memory>
#include <cstdint>
#include <iostream>
#include <iomanip>
#include <chrono>
using namespace std::chrono_literals;
static void print_time( std::chrono::steady_clock::time_point & t1, char const* label, std::uint32_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;
static std::vector<std::string> indices1, indices2;
static std::string make_index( unsigned x )
{
char buffer[ 64 ];
std::snprintf( buffer, sizeof(buffer), "pfx_%u_sfx", x );
return buffer;
}
static std::string make_random_index( unsigned x )
{
char buffer[ 64 ];
std::snprintf( buffer, sizeof(buffer), "pfx_%0*d_%u_sfx", x % 8 + 1, 0, x );
return buffer;
}
static void init_indices()
{
indices1.reserve( N*2+1 );
indices1.push_back( make_index( 0 ) );
for( unsigned i = 1; i <= N*2; ++i )
{
indices1.push_back( make_index( i ) );
}
indices2.reserve( N*2+1 );
indices2.push_back( make_index( 0 ) );
{
boost::detail::splitmix64 rng;
for( unsigned i = 1; i <= N*2; ++i )
{
indices2.push_back( make_random_index( static_cast<std::uint32_t>( rng() ) ) );
}
}
}
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() );
std::cout << std::endl;
}
template<class Map> BOOST_NOINLINE void test_lookup( Map& map, std::chrono::steady_clock::time_point & t1 )
{
std::uint32_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() );
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() );
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::uint32_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 );
}
// 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
#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_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_indices();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_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_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
+346
View File
@@ -0,0 +1,346 @@
// Copyright 2021 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
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/endian/conversion.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_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <vector>
#include <memory>
#include <cstdint>
#include <iostream>
#include <iomanip>
#include <chrono>
using namespace std::chrono_literals;
static void print_time( std::chrono::steady_clock::time_point & t1, char const* label, std::uint32_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;
static std::vector< std::uint32_t > indices1, indices2, indices3;
static void init_indices()
{
indices1.push_back( 0 );
for( unsigned i = 1; i <= N*2; ++i )
{
indices1.push_back( i );
}
indices2.push_back( 0 );
{
boost::detail::splitmix64 rng;
for( unsigned i = 1; i <= N*2; ++i )
{
indices2.push_back( static_cast<std::uint32_t>( rng() ) );
}
}
indices3.push_back( 0 );
for( unsigned i = 1; i <= N*2; ++i )
{
indices3.push_back( boost::endian::endian_reverse( static_cast<std::uint32_t>( i ) ) );
}
}
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::uint32_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<std::uint32_t, std::uint32_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 );
}
// 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
#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_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
+356
View File
@@ -0,0 +1,356 @@
// Copyright 2021 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
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/endian/conversion.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_ANKERL_UNORDERED_DENSE
# include "ankerl/unordered_dense.h"
#endif
#include <unordered_map>
#include <vector>
#include <memory>
#include <cstdint>
#include <iostream>
#include <iomanip>
#include <chrono>
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;
static std::vector< std::uint64_t > indices1, indices2, indices3;
static void init_indices()
{
indices1.push_back( 0 );
for( unsigned i = 1; i <= N*2; ++i )
{
indices1.push_back( i );
}
indices2.push_back( 0 );
{
boost::detail::splitmix64 rng;
for( unsigned i = 1; i <= N*2; ++i )
{
indices2.push_back( rng() );
}
}
indices3.push_back( 0 );
for( unsigned i = 1; i <= N*2; ++i )
{
indices3.push_back( boost::endian::endian_reverse( static_cast<std::uint64_t>( i ) ) );
}
}
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<std::uint64_t, 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 );
}
// 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
#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();
#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_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
+397
View File
@@ -0,0 +1,397 @@
// 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
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_flat_map.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
#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 <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 );
}
// 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
#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_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
+376
View File
@@ -0,0 +1,376 @@
// 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
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_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_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_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_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_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
+238
View File
@@ -0,0 +1,238 @@
// 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
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_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_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_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
-66
View File
@@ -1,66 +0,0 @@
#!/usr/bin/env python
import urllib, os, os.path, sys, json, tarfile, zipfile, tempfile
def download(snapshot):
if snapshot == 'stable':
# TODO: Default version/filename if not available?
downloads = [
"https://sourceforge.net/projects/boost/files/boost/%s/%s.tar.bz2/download" %
(os.environ['BOOST_VERSION'], os.environ['BOOST_FILENAME'])]
else:
json_response = urllib.urlopen('https://api.bintray.com/packages/boostorg/%s/snapshot/files' % (snapshot))
x = json.load(json_response)
extension_priorities = { '.bz2': 2, '.gz': 1, '.zip': 0 }
file_list = []
version_dates = {}
for file in x:
file_extension = os.path.splitext(file['path'])[1]
if (file_extension in extension_priorities):
file['priority'] = extension_priorities[file_extension]
file_list.append(file)
if not file['version'] in version_dates or file['created'] < version_dates[file['version']]:
version_dates[file['version']] = file['created']
file_list.sort(key=lambda x: (version_dates[x['version']], x['priority']), reverse=True)
downloads = ['http://dl.bintray.com/boostorg/%s/%s' % (snapshot, file['path']) for file in file_list]
filename = ''
for download_url in downloads:
try:
print "Downloading: " + download_url
(filename, headers) = urllib.urlretrieve(download_url)
print "Extracting: " + filename
dir = tempfile.mkdtemp()
extract(filename, dir)
os.remove(filename)
files = os.listdir(dir)
assert(len(files) == 1)
os.rename(os.path.join(dir, files[0]), 'boost')
return
except IOError:
print "Error opening URL: " + download_url
def extract(filename, path = '.'):
if (filename.endswith(".gz")):
tar = tarfile.open(filename, "r:gz")
tar.extractall(path)
tar.close
elif (filename.endswith(".bz2")):
tar = tarfile.open(filename, "r:bz2")
tar.extractall(path)
tar.close
elif (filename.endswith(".zip")):
zip = zipfile.ZipFile(filename, "r")
zip.extractall(path)
zip.close
else:
assert False
if len(sys.argv) == 1:
download('stable')
elif len(sys.argv) == 2:
download(sys.argv[1])
else:
print "Usage: %s [stable|branch-name]" % (sys.argv[0])
+9 -60
View File
@@ -1,72 +1,21 @@
# Copyright 2005 Daniel James.
# Distributed under the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
using boostbook ;
using quickbook ;
import asciidoctor ;
path-constant images_location : ../ ;
path-constant admonishment_location : ../../../../doc/src/images ;
html unordered.html : unordered.adoc ;
xml unordered : unordered.qbk :
<xsl:param>generate.consistent.ids=1 ;
install html_ : unordered.html : <location>html ;
boostbook standalone : unordered :
<xsl:param>chunk.first.sections=1
<xsl:param>chunk.section.depth=2
<xsl:param>generate.section.toc.level=2
<xsl:param>toc.section.depth=1
<xsl:param>toc.max.depth=1
pdf unordered.pdf : unordered.adoc ;
explicit unordered.pdf ;
<xsl:param>boost.compact.typedef=0
<xsl:param>boost.compact.function=0
<xsl:param>boost.compact.enum=0
<xsl:param>generate.consistent.ids=1
# HTML Options:
<format>html:<xsl:param>boost.root=../../../..
<format>html:<xsl:param>img.src.path=../../../../doc/html/
<format>xhtml:<xsl:param>boost.root=../../../..
<format>xhtml:<xsl:param>img.src.path=../../../../doc/html/
# PDF Options:
# TOC Generation: this is needed for FOP-0.9 and later:
<xsl:param>fop1.extensions=0
<format>pdf:<xsl:param>xep.extensions=1
# TOC generation: this is needed for FOP 0.2, but must not be set to zero for FOP-0.9!
<format>pdf:<xsl:param>fop.extensions=0
# No indent on body text:
<format>pdf:<xsl:param>body.start.indent=0pt
# Margin size:
<format>pdf:<xsl:param>page.margin.inner=0.5in
# Margin size:
<format>pdf:<xsl:param>page.margin.outer=0.5in
# Paper type = A4
<format>pdf:<xsl:param>paper.type=A4
# Yes, we want graphics for admonishments:
<xsl:param>admon.graphics=1
# Set this one for PDF generation *only*:
# default png graphics are awful in PDF form,
# better use SVG's instead:
<format>pdf:<xsl:param>admon.graphics.extension=".svg"
<format>pdf:<xsl:param>use.role.for.mediaobject=1
<format>pdf:<xsl:param>preferred.mediaobject.role=print
<format>pdf:<xsl:param>img.src.path=$(images_location)/
#<format>pdf:<xsl:param>admon.graphics.path=$(admonishment_location)
<format>pdf:<xsl:param>draft.mode="no"
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/unordered/doc/html
;
install pdf_ : unordered.pdf : <location>pdf ;
explicit pdf_ ;
###############################################################################
alias boostdoc
: unordered
:
:
: ;
alias boostdoc ;
explicit boostdoc ;
alias boostrelease ;
alias boostrelease : html_ ;
explicit boostrelease ;
-26
View File
@@ -1,26 +0,0 @@
<!--
Copyright Daniel James 2008-2009
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-->
<section id="unordered.bibliography">
<title>Bibliography</title>
<bibliography>
<biblioentry>
<biblioset relation="journal">
<title>C/C++ Users Journal</title>
<date>February, 2006</date>
</biblioset>
<biblioset relation="article">
<authorgroup>
<author>
<firstname>Pete</firstname>
<surname>Becker</surname>
</author>
</authorgroup>
<title><ulink url="http://www.ddj.com/cpp/184402066">STL and TR1: Part III - Unordered containers</ulink></title>
</biblioset>
<para>An introducation to the standard unordered containers.</para>
</biblioentry>
</bibliography>
</section>
-168
View File
@@ -1,168 +0,0 @@
[/ Copyright 2006-2008 Daniel James.
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
[section:buckets The Data Structure]
The containers are made up of a number of 'buckets', each of which can contain
any number of elements. For example, the following diagram shows an [classref
boost::unordered_set unordered_set] with 7 buckets containing 5 elements, `A`,
`B`, `C`, `D` and `E` (this is just for illustration, containers will typically
have more buckets).
[diagram buckets]
In order to decide which bucket to place an element in, the container applies
the hash function, `Hash`, to the element's key (for `unordered_set` and
`unordered_multiset` the key is the whole element, but is referred to as the key
so that the same terminology can be used for sets and maps). This returns a
value of type `std::size_t`. `std::size_t` has a much greater range of values
then the number of buckets, so the container applies another transformation to
that value to choose a bucket to place the element in.
Retrieving the elements for a given key is simple. The same process is applied
to the key to find the correct bucket. Then the key is compared with the
elements in the bucket to find any elements that match (using the equality
predicate `Pred`). If the hash function has worked well the elements will be
evenly distributed amongst the buckets so only a small number of elements will
need to be examined.
There is [link unordered.hash_equality more information on hash functions and
equality predicates in the next section].
You can see in the diagram that `A` & `D` have been placed in the same bucket.
When looking for elements in this bucket up to 2 comparisons are made, making
the search slower. This is known as a collision. To keep things fast we try to
keep collisions to a minimum.
'''
<table frame="all"><title>Methods for Accessing Buckets</title>
<tgroup cols="2">
<thead><row>
<entry><para>Method</para></entry>
<entry><para>Description</para></entry>
</row></thead>
<tbody>
<row>
<entry>'''`size_type bucket_count() const`'''</entry>
<entry>'''The number of buckets.'''</entry>
</row>
<row>
<entry>'''`size_type max_bucket_count() const`'''</entry>
<entry>'''An upper bound on the number of buckets.'''</entry>
</row>
<row>
<entry>'''`size_type bucket_size(size_type n) const`'''</entry>
<entry>'''The number of elements in bucket `n`.'''</entry>
</row>
<row>
<entry>'''`size_type bucket(key_type const& k) const`'''</entry>
<entry>'''Returns the index of the bucket which would contain `k`.'''</entry>
</row>
<row>
<entry>'''`local_iterator begin(size_type n);`'''</entry>
<entry morerows='5'>'''Return begin and end iterators for bucket `n`.'''</entry>
</row>
<row>
<entry>'''`local_iterator end(size_type n);`'''</entry>
</row>
<row>
<entry>'''`const_local_iterator begin(size_type n) const;`'''</entry>
</row>
<row>
<entry>'''`const_local_iterator end(size_type n) const;`'''</entry>
</row>
<row>
<entry>'''`const_local_iterator cbegin(size_type n) const;`'''</entry>
</row>
<row>
<entry>'''`const_local_iterator cend(size_type n) const;`'''</entry>
</row>
</tbody>
</tgroup>
</table>
'''
[h2 Controlling the number of buckets]
As more elements are added to an unordered associative container, the number
of elements in the buckets will increase causing performance to degrade.
To combat this the containers increase the bucket count as elements are inserted.
You can also tell the container to change the bucket count (if required) by
calling `rehash`.
The standard leaves a lot of freedom to the implementer to decide how the
number of buckets is chosen, but it does make some requirements based on the
container's 'load factor', the average number of elements per bucket.
Containers also have a 'maximum load factor' which they should try to keep the
load factor below.
You can't control the bucket count directly but there are two ways to
influence it:
* Specify the minimum number of buckets when constructing a container or
when calling `rehash`.
* Suggest a maximum load factor by calling `max_load_factor`.
`max_load_factor` doesn't let you set the maximum load factor yourself, it just
lets you give a /hint/. And even then, the draft standard doesn't actually
require the container to pay much attention to this value. The only time the
load factor is /required/ to be less than the maximum is following a call to
`rehash`. But most implementations will try to keep the number of elements
below the max load factor, and set the maximum load factor to be the same as
or close to the hint - unless your hint is unreasonably small or large.
[table:bucket_size Methods for Controlling Bucket Size
[[Method] [Description]]
[
[`X(size_type n)`]
[Construct an empty container with at least `n` buckets (`X` is the container type).]
]
[
[`X(InputIterator i, InputIterator j, size_type n)`]
[Construct an empty container with at least `n` buckets and insert elements
from the range \[`i`, `j`) (`X` is the container type).]
]
[
[`float load_factor() const`]
[The average number of elements per bucket.]
]
[
[`float max_load_factor() const`]
[Returns the current maximum load factor.]
]
[
[`float max_load_factor(float z)`]
[Changes the container's maximum load factor, using `z` as a hint.]
]
[
[`void rehash(size_type n)`]
[Changes the number of buckets so that there at least `n` buckets, and
so that the load factor is less than the maximum load factor.]
]
]
[h2 Iterator Invalidation]
It is not specified how member functions other than `rehash` affect
the bucket count, although `insert` is only allowed to invalidate iterators
when the insertion causes the load factor to be greater than or equal to the
maximum load factor. For most implementations this means that `insert` will only
change the number of buckets when this happens. While iterators can be
invalidated by calls to `insert` and `rehash`, pointers and references to the
container's elements are never invalidated.
In a similar manner to using `reserve` for `vector`s, it can be a good idea
to call `rehash` before inserting a large number of elements. This will get
the expensive rehashing out of the way and let you store iterators, safe in
the knowledge that they won't be invalidated. If you are inserting `n`
elements into container `x`, you could first call:
x.rehash((x.size() + n) / x.max_load_factor());
[blurb Note: `rehash`'s argument is the minimum number of buckets, not the
number of elements, which is why the new size is divided by the maximum load factor.]
[endsect]
-161
View File
@@ -1,161 +0,0 @@
[/ Copyright 2006-2011 Daniel James.
/ Distributed under the Boost Software License, Version 1.0. (See accompanying
/ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ]
[section:comparison Comparison with Associative Containers]
[table:interface_differences Interface differences.
[[Associative Containers] [Unordered Associative Containers]]
[
[Parameterized by an ordering relation `Compare`]
[Parameterized by a function object `Hash` and an equivalence relation
`Pred`]
]
[
[Keys can be compared using `key_compare` which is accessed by member function `key_comp()`,
values can be compared using `value_compare` which is accessed by member function `value_comp()`.]
[Keys can be hashed using `hasher` which is accessed by member function `hash_function()`,
and checked for equality using `key_equal` which is accessed by member function `key_eq()`.
There is no function object for compared or hashing values.]
]
[
[Constructors have optional extra parameters for the comparison object.]
[Constructors have optional extra parameters for the initial minimum
number of buckets, a hash function and an equality object.]
]
[
[Keys `k1`, `k2` are considered equivalent if
`!Compare(k1, k2) && !Compare(k2, k1)`]
[Keys `k1`, `k2` are considered equivalent if `Pred(k1, k2)`]
]
[
[Member function `lower_bound(k)` and `upper_bound(k)`]
[No equivalent. Since the elements aren't ordered `lower_bound` and
`upper_bound` would be meaningless.]
]
[
[`equal_range(k)` returns an empty range at the position that k
would be inserted if k isn't present in the container.]
[`equal_range(k)` returns a range at the end of the container if
k isn't present in the container. It can't return a positioned
range as k could be inserted into multiple place. To find out the
bucket that k would be inserted into use `bucket(k)`. But remember
that an insert can cause the container to rehash - meaning that the
element can be inserted into a different bucket.]
]
[
[`iterator`, `const_iterator` are of the bidirectional category.]
[`iterator`, `const_iterator` are of at least the forward category.]
]
[
[Iterators, pointers and references to the container's elements are
never invalidated.]
[[link unordered.buckets.iterator_invalidation Iterators can
be invalidated by calls to insert or rehash]. Pointers and
references to the container's elements are never invalidated.]
]
[
[Iterators iterate through the container in the order defined by
the comparison object.]
[Iterators iterate through the container in an arbitrary order, that
can change as elements are inserted, although equivalent elements
are always adjacent.]
]
[
[No equivalent]
[Local iterators can be used to iterate through individual buckets.
(The order of local iterators and iterators aren't
required to have any correspondence.)]
]
[
[Can be compared using the `==`, `!=`, `<`, `<=`, `>`, `>=` operators.]
[Can be compared using the `==` and `!=` operators.]
]
[
[]
[When inserting with a hint, implementations are permitted to ignore
the hint.]
]
[
[`erase` never throws an exception]
[The containers' hash or predicate function can throw exceptions
from `erase`]
]
]
[table:complexity_guarantees Complexity Guarantees
[[Operation] [Associative Containers] [Unordered Associative Containers]]
[
[Construction of empty container]
[constant]
[O(/n/) where /n/ is the minimum number of buckets.]
]
[
[Construction of container from a range of /N/ elements]
[O(/N/ log /N/), O(/N/) if the range is sorted with `value_comp()`]
[Average case O(/N/), worst case
O(/N/'''<superscript>2</superscript>''')]
]
[
[Insert a single element]
[logarithmic]
[Average case constant, worst case linear]
]
[
[Insert a single element with a hint]
[Amortized constant if t elements inserted right after hint,
logarithmic otherwise]
[Average case constant, worst case linear (ie. the same as
a normal insert).]
]
[
[Inserting a range of /N/ elements]
[ /N/ log(`size()`+/N/) ]
[Average case O(/N/), worst case O(/N/ * `size()`)]
]
[
[Erase by key, `k`]
[O(log(`size()`) + `count(k)`)]
[Average case: O(`count(k)`), Worst case: O(`size()`)]
]
[
[Erase a single element by iterator]
[Amortized constant]
[Average case: O(1), Worst case: O(`size()`)]
]
[
[Erase a range of /N/ elements]
[O(log(`size()`) + /N/)]
[Average case: O(/N/), Worst case: O(`size()`)]
]
[
[Clearing the container]
[O(`size()`)]
[O(`size()`)]
]
[
[Find]
[logarithmic]
[Average case: O(1), Worst case: O(`size()`)]
]
[/ TODO: Average case is probably wrong. ]
[
[Count]
[O(log(`size()`) + `count(k)`)]
[Average case: O(1), Worst case: O(`size()`)]
]
[
[`equal_range(k)`]
[logarithmic]
[Average case: O(`count(k)`), Worst case: O(`size()`)]
]
[
[`lower_bound`,`upper_bound`]
[logarithmic]
[n/a]
]
]
[endsect]
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.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

-313
View File
@@ -1,313 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.0"
width="507.85925"
height="400.45422"
viewBox="1.33 0.95 6.01 4.09"
id="svg2">
<defs
id="defs95" />
<rect
width="6.0023117"
height="4.0815721"
x="1.3310578"
y="0.95080346"
id="rect4"
style="fill:#e5e5e5;stroke:none;stroke-width:0" />
<rect
width="6.0023117"
height="4.0815721"
x="1.3310578"
y="0.95080346"
id="rect6"
style="opacity:1;fill:none;stroke:#000000;stroke-width:0.02400924" />
<rect
width="1.2004625"
height="1.6806473"
x="1.5711501"
y="1.1908962"
id="rect8"
style="fill:#ffffff;stroke:none;stroke-width:0" />
<rect
width="1.2004625"
height="1.6806473"
x="1.5711501"
y="1.1908962"
id="rect10"
style="fill:none;stroke:#000000;stroke-width:0.02400924" />
<text
x="1.7289008"
y="1.4950322"
id="text12"
style="font-size:0.19207397px;font-style:normal;font-weight:400;text-anchor:start;fill:#000000;font-family:sans">Bucket 1</text>
<line
x1="1.5711501"
y1="1.6710808"
x2="2.7716124"
y2="1.6710808"
id="line14"
style="stroke:#000000;stroke-width:0.02400924" />
<rect
width="1.2004625"
height="1.6806473"
x="3.0117054"
y="1.1908962"
id="rect16"
style="fill:#ffffff;stroke:none;stroke-width:0" />
<rect
width="1.2004625"
height="1.6806473"
x="3.0117054"
y="1.1908962"
id="rect18"
style="fill:none;stroke:#000000;stroke-width:0.02400924" />
<text
x="3.1603069"
y="1.4950322"
id="text20"
style="font-size:0.19207397px;font-style:normal;font-weight:400;text-anchor:start;fill:#000000;font-family:sans">Bucket 2</text>
<line
x1="3.0117054"
y1="1.6710808"
x2="4.2121677"
y2="1.6710808"
id="line22"
style="stroke:#000000;stroke-width:0.02400924" />
<rect
width="1.2004625"
height="1.6806473"
x="4.4522605"
y="1.1908962"
id="rect24"
style="fill:#ffffff;stroke:none;stroke-width:0" />
<rect
width="1.2004625"
height="1.6806473"
x="4.4522605"
y="1.1908962"
id="rect26"
style="fill:none;stroke:#000000;stroke-width:0.02400924" />
<text
x="4.5917125"
y="1.4950322"
id="text28"
style="font-size:0.19207397px;font-style:normal;font-weight:400;text-anchor:start;fill:#000000;font-family:sans">Bucket 3</text>
<line
x1="4.4522605"
y1="1.6710808"
x2="5.6527228"
y2="1.6710808"
id="line30"
style="stroke:#000000;stroke-width:0.02400924" />
<rect
width="1.2004625"
height="1.6806473"
x="5.8928151"
y="1.1908962"
id="rect32"
style="fill:#ffffff;stroke:none;stroke-width:0" />
<rect
width="1.2004625"
height="1.6806473"
x="5.8928151"
y="1.1908962"
id="rect34"
style="fill:none;stroke:#000000;stroke-width:0.02400924" />
<text
x="6.0688629"
y="1.4858831"
id="text36"
style="font-size:0.19207397px;font-style:normal;font-weight:400;text-anchor:start;fill:#000000;font-family:sans">Bucket 4</text>
<line
x1="5.8928151"
y1="1.6710808"
x2="7.093277"
y2="1.6710808"
id="line38"
style="stroke:#000000;stroke-width:0.02400924" />
<rect
width="1.2004625"
height="1.6806473"
x="2.2941716"
y="3.1054616"
id="rect40"
style="fill:#ffffff;stroke:none;stroke-width:0" />
<rect
width="1.2004625"
height="1.6806473"
x="2.2941716"
y="3.1054616"
id="rect42"
style="fill:none;stroke:#000000;stroke-width:0.02400924" />
<text
x="2.4427731"
y="3.4187472"
id="text44"
style="font-size:0.19207397px;font-style:normal;font-weight:400;text-anchor:start;fill:#000000;font-family:sans">Bucket 5</text>
<line
x1="2.2941716"
y1="3.5856469"
x2="3.4946339"
y2="3.5856469"
id="line46"
style="stroke:#000000;stroke-width:0.02400924" />
<rect
width="1.2004625"
height="1.6806473"
x="3.7347264"
y="3.1054616"
id="rect48"
style="fill:#ffffff;stroke:none;stroke-width:0" />
<rect
width="1.2004625"
height="1.6806473"
x="3.7347264"
y="3.1054616"
id="rect50"
style="fill:none;stroke:#000000;stroke-width:0.02400924" />
<text
x="3.8833277"
y="3.4187472"
id="text52"
style="font-size:0.19207397px;font-style:normal;font-weight:400;text-anchor:start;fill:#000000;font-family:sans">Bucket 6</text>
<line
x1="3.7347264"
y1="3.5856469"
x2="4.9351892"
y2="3.5856469"
id="line54"
style="stroke:#000000;stroke-width:0.02400924" />
<rect
width="1.2004625"
height="1.6806473"
x="5.175281"
y="3.1054616"
id="rect56"
style="fill:#ffffff;stroke:none;stroke-width:0" />
<rect
width="1.2004625"
height="1.6806473"
x="5.175281"
y="3.1054616"
id="rect58"
style="fill:none;stroke:#000000;stroke-width:0.02400924" />
<text
x="5.3330317"
y="3.4187472"
id="text60"
style="font-size:0.19207397px;font-style:normal;font-weight:400;text-anchor:start;fill:#000000;font-family:sans">Bucket 7</text>
<line
x1="5.175281"
y1="3.5856469"
x2="6.3757439"
y2="3.5856469"
id="line62"
style="stroke:#000000;stroke-width:0.02400924" />
<ellipse
cx="7.1999998"
cy="4.0110002"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse64"
style="fill:#ffffff;stroke:none" />
<ellipse
cx="7.1999998"
cy="4.0110002"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse66"
style="fill:none;stroke:#000000;stroke-width:0.035" />
<text
x="6.1443377"
y="2.1364057"
id="text68"
style="font-size:0.34038281px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Sans;-inkscape-font-specification:Sans">A</text>
<ellipse
cx="3.007"
cy="4.0300002"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse70"
style="fill:#ffffff;stroke:none" />
<ellipse
cx="3.007"
cy="4.0300002"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse72"
style="fill:none;stroke:#000000;stroke-width:0.035" />
<text
x="3.2742035"
y="2.1540098"
id="text74"
style="font-size:0.34038281px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Sans;-inkscape-font-specification:Sans">B</text>
<ellipse
cx="4.0599999"
cy="6.7820001"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse76"
style="fill:#ffffff;stroke:none" />
<ellipse
cx="4.0599999"
cy="6.7820001"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse78"
style="fill:none;stroke:#000000;stroke-width:0.035" />
<text
x="3.976877"
y="4.0473108"
id="text80"
style="font-size:0.34038281px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Sans;-inkscape-font-specification:Sans">C</text>
<ellipse
cx="7.8449998"
cy="4.6550002"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse82"
style="fill:#ffffff;stroke:none" />
<ellipse
cx="7.8449998"
cy="4.6550002"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse84"
style="fill:none;stroke:#000000;stroke-width:0.035" />
<text
x="6.5808516"
y="2.5937216"
id="text86"
style="font-size:0.34038281px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Sans;-inkscape-font-specification:Sans">D</text>
<ellipse
cx="0.87"
cy="4.0079999"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse88"
style="fill:#ffffff;stroke:none" />
<ellipse
cx="0.87"
cy="4.0079999"
rx="0.308"
ry="0.308"
transform="matrix(0.6859785,0,0,0.6859785,1.3310577,-0.7298436)"
id="ellipse90"
style="fill:none;stroke:#000000;stroke-width:0.035" />
<text
x="1.7991183"
y="2.1403852"
id="text92"
style="font-size:0.34038281px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Sans;-inkscape-font-specification:Sans">E</text>
</svg>

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

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