Compare commits

...

1730 Commits

Author SHA1 Message Date
59e2a562ed deprecated boost::unordered::hash_is_avalanching in favor of boost::hash_is_avalanching (#313)
* deprecated boost::unordered::hash_is_avalanching in favor of boost::hash_is_avalanching

* replaced deprecation message with simpler BOOST_HEADER_DEPRECATED
2025-06-02 12:43:45 +02:00
164cbe4e0f documented non-const reference passing to erase_if (#312)
* documented non-const reference passing to erase_if

* prevented warning as error in Boost.Container build

* skipped tests for MinGW (https://github.com/boostorg/atomic/pull/70)

* correct reference link for previous commit is https://github.com/boostorg/atomic/issues/73

* commented previous disabled cases

* disabled cfoa_serialization_tests with TSAN

* fixed previous

* fixed previous

* fixed previous
2025-05-31 18:08:37 +02:00
a64d81a378 editorial s/mulx/mul (mulx properly refers to multiplication and xoring) 2025-04-26 10:48:47 +02:00
628c8c445e GHA: windows-2025 (#306) 2025-04-16 13:04:11 +02:00
3dde65b2ef added pull to open-addressing containers (#309)
* added pull to open-addressing containers

* added pull_tests.cpp

* guarded pull against exceptions in mid init_type construction
2025-04-14 21:47:30 +02:00
2907fe8c98 trimmed AppVeyor jobs (#311)
* removed jobs redundant with Drone or GHA

* added 32-bit jobs removed from AppVeyor
2025-04-14 18:51:18 +02:00
28663ad5ce [skip ci] fixed AppVeyor badge link 2025-04-13 13:03:17 +02:00
5417494fae removed debug info in mingw-w64 32 bit to reduce compiler memory consumption (#310)
* removed debug info in mingw-w64 32.bit to reduce compiler memory consumption

* documented previous
2025-04-13 09:17:20 +02:00
3d2c63f744 fixed relative links in docs 2025-01-25 12:42:15 +01:00
87d92996eb added header synopses to the reference (#303)
* added header synopses to the reference

* disabled font color override for in-link code portions

* relinked bundle
2025-01-23 20:33:34 +01:00
17ab97dd4b Merge pull request #302 from cmazakas/doc/header-fix
update ui bundle
2025-01-21 11:46:01 -08:00
2ea05da453 update ui bundle 2025-01-21 10:55:08 -08:00
a2c355cde4 fixed links to docs 2025-01-21 09:26:11 +01:00
18ef4784ec Merge pull request #299 from cmazakas/antora-documentation
Convert documentation to Antora
2025-01-20 08:18:32 -08:00
6c0b763176 Disable Interprocess tests when /RTC is in effect. 2025-01-17 18:40:03 +02:00
6ab7e3ec20 update playbook to use commit-specific ui bundle 2025-01-14 15:49:40 -08:00
3b26dcb79e remove unnecessary files in docs 2025-01-14 12:06:49 -08:00
2ecd00030a add antora_docs hook, update index.html 2025-01-14 10:55:50 -08:00
1a034bfadd update ui output path and add b2 support 2025-01-10 16:07:53 -08:00
db3ddc9012 fix image links in benchmarks section 2025-01-09 12:23:46 -08:00
0e768a2dca fix broken links 2025-01-07 14:50:21 -08:00
d5faa1b5cf fix broken cross-references 2025-01-07 11:57:39 -08:00
bebd8ccc50 replace index.adoc with intro.adoc 2025-01-06 14:30:20 -08:00
fa8936a343 add missing script contents 2025-01-06 09:35:39 -08:00
db31da1302 fix xrefs and image paths 2025-01-03 09:46:02 -08:00
6f432c0d98 convert docs to antora 2025-01-03 09:45:44 -08:00
40cf55240b Revert "update documentation to use antora"
This reverts commit 3c452f93c5.
2024-12-31 12:11:06 -08:00
3c452f93c5 update documentation to use antora 2024-12-31 12:00:52 -08:00
cb835cdf1d Merge pull request #295 from k3DW/inline-asm
Fix inline assembly for armv7 target
2024-12-30 20:55:26 +01:00
07f6463c1c Fix inline assembly for armv7 target
This fix is based on boostorg/outcome#308
2024-12-29 12:55:49 -06:00
c0c8d61688 Merge pull request #298 from boostorg/fix/split-msvc-14.2
split msvc-14.2 jobs
2024-12-29 16:17:35 +01:00
d0116814c9 split msvc-14.2 jobs 2024-12-29 12:06:18 +01:00
a885388480 Merge pull request #297 from boostorg/fix/upgrade-macos
bumped all macos jobs one version up
2024-12-28 22:17:16 +01:00
accae6fdd9 bumped all macos jobs one version up 2024-12-28 17:51:31 +01:00
a633bbaa4d Merge pull request #296 from boostorg/fix/upgrade-boost-process
upgraded tests to boost::process::v2
2024-12-28 17:41:34 +01:00
1389043933 upgraded to boost::process::v2 2024-12-28 12:29:33 +01:00
b41c054c66 Merge pull request #293 from boostorg/fix/upgrade_droneubuntu2404
updated cppalliance/droneubuntu2304 to 2404
2024-10-23 18:32:15 +02:00
fbc981eac9 Merge pull request #292 from k3DW/explicit-instantiation
Ensure each container type can be explicitly instantiated
2024-10-23 16:47:16 +02:00
5d2b27d1d9 updated cppalliance/droneubuntu2304 to 2404 2024-10-23 13:47:41 +02:00
a36937d9b5 Ensure fca containers have the embedded GDB pretty-printers if none of the [c]foa containers have also been included. (#291)
This was missed in PR #274. We don't yet have automated pretty-printer tests, so this change will have no effect on CI.
2024-10-09 09:54:47 +02:00
e214ecdbd0 Use std::ref instead of copying the function parameter… (#290)
* GHA: revise numerous CI jobs. Fix sanitizer on new kernel

* Use std::ref instead of copying the function parameter in std::initializer_list overloads of insert_{or|and}_[c]visit

* Reimplement detail::is_invocable

* Update docs for std::ref(f) changes

---------

Co-authored-by: sdarwin <samuel.d.darwin@gmail.com>
2024-10-08 17:35:58 +02:00
94ab2f0776 GHA: revise numerous CI jobs. Fix sanitizer on new kernel (#289) 2024-10-08 17:35:35 +02:00
1bdb3717d3 updated concurrent benchmarks 2024-10-08 17:28:52 +02:00
cfdfae0a65 Ensure each container type can be explicitly instantiated 2024-10-06 22:38:00 -05:00
489b50bc0f Merge pull request #287 from k3DW/insert-return-type
Change the range insertion return type match the documentation
2024-09-27 22:24:08 -05:00
3fe7871745 Fix the return value from cfoa 'insert()' overloads to match the docs for iterator-pair and initializer-list 2024-09-26 17:45:33 -05:00
1e043993ac Update cfoa 'insert()' tests to check the return value of the iterator-pair and initializer-list overloads 2024-09-25 22:59:13 -05:00
834580b539 added insert_and_visit and similar operations to concurrent containers (#283) 2024-09-21 10:58:30 +02:00
57546ed7e3 Switch all Cygwin64 jobs to Debug, because Release times out 2024-09-11 16:52:49 +03:00
6067d9e515 Disable tests using Boost.Process under MinGW as well 2024-09-11 12:15:37 +03:00
ad4f00a825 Update test/Jamfile.v2 2024-09-11 02:16:05 +03:00
d1c166558a Update test/Jamfile.v2 2024-09-10 22:05:00 +03:00
d8a75accff Update build.jam 2024-09-10 22:03:05 +03:00
cdb31c8309 Sync from upstream. 2024-09-09 15:23:31 -05:00
f48ae7f7f4 Merge pull request #281 from k3DW/instantiate-classes
Put instantiate_[fca] classes into their respective test file
2024-09-08 12:45:08 -05:00
843d6df58c Sync from upstream. 2024-09-06 08:42:51 -05:00
95f36f334d updated README.md 2024-09-06 10:00:28 +02:00
3f4d5fc567 Put instantiate_[fca] classes into their respective test file, instead of in the headers 2024-09-03 21:17:36 -05:00
9a2483dd2c Sync from upstream. 2024-09-03 20:09:40 -05:00
cd9a592f00 Fixed std::initializer_list assignment issues for open-addressing containers (#277)
* fixed #276

* used range insert, stylistic this->

* assigned non-empty std::initializer_lists
2024-09-02 18:56:13 +02:00
aa67315922 Sync from upstream. 2024-08-27 09:24:49 -05:00
21937249c4 Merge pull request #275 from k3DW/cygwin
Fix compiling on Cygwin for tests using Interprocess
2024-08-26 22:05:04 -05:00
5dd2068b62 Fix tests using Interprocess not compiling on Cygwin 2024-08-26 13:43:33 -05:00
85098f0506 Sync from upstream. 2024-08-26 07:13:46 -05:00
1b0037135c Add concurrent_node containers to the GDB pretty-printer script 2024-08-25 13:01:49 -05:00
f734e399e3 Feature/concurrent node containers (#271)
* added concurrent node containers

* removed spurious typename

* added missing includes

* avoided unused param warning

* worked around Clang bug

* s/{}/() to work around GCC4.8 problems with aggregate initialization

* used /bigobj for cfoa/visit_tests.cpp

* suppressed localized maybe-uninitialized warnings

* fixed comments

* added /bigobj to cfoa/insert_tests.cpp

* instrumented double exact comparison to spot a spurious error

* fixed pedantic error

* refactored byte_span machinery

* compromised on sub-epsilon equality for doubles that should be identical

* documented boost::concurrent_node_(map|set)

* added concurrent_node_set

* added missing AlternativeType

* tested empty node insertion

* tested node_handle allocator management

* added nonassignable_allocator and node_handle_allocator_swap_tests

* fixed warning disabling

* silenced spurious GCC warning

* broadened scope of previous pragma

* broadened even more

* worked around spurious constexpr-related msvc-14.0 bug
https://godbolt.org/z/v78545Ebf

* added workaround back

* replaced previous workaround with built-in one

* added workaround back on top of built-in solution (which doesn't work 100% of the time)
2024-08-25 18:34:58 +02:00
2afef71107 Sync from upstream. 2024-08-23 11:12:09 -05:00
35bdabf259 Fix typo in docs 2024-08-23 00:03:49 -05:00
1ebe692957 Merge pull request #274 from k3DW/gdb
Write GDB pretty-printers for all containers and iterators
2024-08-22 23:45:23 -05:00
111a503195 Generate inline assembly header file for automatic GDB pretty-printer script inclusion 2024-08-22 18:56:24 -05:00
5206ac46a3 Output the open-addressing containers' stats through a GDB xmethod 2024-08-17 14:37:06 -05:00
0bca47c690 Write docs for GDB pretty-printers 2024-08-17 14:37:05 -05:00
7f9aa8505f Fix containers of reference type 2024-08-17 14:37:05 -05:00
ae364ea311 Add fancy pointer support to GDB pretty-printers 2024-08-17 14:37:05 -05:00
f415d17e58 Write GDB pretty-printers for FOA containers, without fancy pointers 2024-08-17 14:37:05 -05:00
10fd6c8647 Write GDB pretty-printers for FCA containers, without fancy pointers 2024-08-17 14:37:05 -05:00
45e50f6cd2 Use references in test file, so we can check the debugger display without dereferencing the container 2024-08-17 14:37:05 -05:00
600dd0a8e2 Rename 'natvis_tests.cpp' to 'debuggability/visualization_tests.cpp', to be used with other kinds of visualizations 2024-08-17 14:37:05 -05:00
a6a0cd0a13 Sync from upstream. 2024-08-08 22:00:05 -05:00
a39cf60e93 Merge pull request #269 from k3DW/191
static_assert on the constructibility of the containers' types
2024-08-08 11:57:22 -05:00
a14b159665 Add missing calls to as_const(), otherwise we may call a 'T(T&)' constructor instead of the intended 'T(T const&)' 2024-08-07 16:15:36 -05:00
793fad5620 Run clang-format on the 'types' files 2024-08-07 16:09:15 -05:00
c117f4448f static_assert on the constructibility of the containers' types 2024-08-07 16:09:15 -05:00
65f3ea60dd Use as_const to remove any possibility of use-after-move (#272) 2024-08-06 15:48:13 +02:00
7645e4f20d Sync from upstream. 2024-07-25 17:18:43 -05:00
cd4c1f3713 Fix Boost.Config includes in natvis_tests.cpp (#268) 2024-07-24 09:05:21 +02:00
32ce058ebe Move inter-lib dependencies to a project variable and into the build targets. 2024-07-23 22:34:23 -05:00
4c6d0211fb Update copyright dates. 2024-07-20 22:52:04 -05:00
1edbe3fdbe Change all <source> references to <library>. 2024-07-20 21:27:30 -05:00
42579dee10 Add uuid test dependency. 2024-07-19 16:00:30 -05:00
0928b3d016 Add process test dependency. 2024-07-19 12:58:21 -05:00
5d7786b47e Add interprocess test dependency. 2024-07-19 08:11:35 -05:00
228fede498 Sync from upstream. 2024-07-18 09:28:57 -05:00
1d1f0d306d Feature/nonconst set visit (#265)
* Made some boost::concurrent_flat_set operations exclusive-locked

* unnamed unused args

* fixed PR number

* replaced homemade mechanism with boost::compat::latch
2024-07-16 19:50:08 +02:00
7ddd562532 Implement natvis for fancy pointers (#262)
* Add file for manual natvis testing

* Equip natvis file to allow fancy pointers

* Update docs

* [skip ci] add links to natvis docs
2024-07-15 19:42:28 +02:00
3ad8ac4c34 fix asan and tsan jobs on Drone (#264) 2024-07-15 12:38:32 +02:00
ac1a2b4d23 fixed syntax error 2024-07-14 16:43:04 +02:00
e354fb432b configured ASAN/TSAN jobs as privileged 2024-07-14 16:41:21 +02:00
88535dca1f Sync from upstream. 2024-07-12 08:54:23 -05:00
d61719a196 [skip ci] updated benchmark plots 2024-06-26 09:13:54 +02:00
e3818afd45 test interprocess concurrency (#258)
* added cfoa_interprocess_concurrency_tests

* avoided C++14 digit separators

* stopped using exit codes to pass numerical info to parent

* Reorder includes to make msvc-14.0 happy

* made cumulative_stats interprocess concurrency safe

* disabled interprocess_concurrency_tests for Clang 3.5-8
(Boost.Process compile error)

* made test names shorter for the benefit of MINGW32

---------

Co-authored-by: Peter Dimov <pdimov@gmail.com>
2024-06-22 09:13:30 +02:00
3d9b24019d Bump B2 require to 5.2 2024-06-14 11:33:56 -05:00
0387791dc1 Sync from upstream. 2024-06-11 08:46:53 -05:00
a166a56401 dropped macos-11 and included macos-14 (#254)
* dropped macos-11 and included macos-14

* enabled CI for this branch

* disabled CI for this branch (was for testing purposes)
2024-06-11 10:00:20 +02:00
4126a56528 Sync from upstream. 2024-06-10 21:40:32 -05:00
3c53fe5db9 reverted prior 2024-06-10 20:38:10 +02:00
cfa3cb2d1f enabled CI for this branch 2024-06-10 20:10:01 +02:00
cffd0a413e added CODECOV_TOKEN (#253)
* added CODECOV_TOKEN

* added missing newline
2024-06-08 18:50:31 +02:00
8b40aef85f Merge pull request #252 from k3DW/feature/251
Fix 'invalid argument' to boost::interprocess::shared_memory_object
2024-06-08 11:17:41 +02:00
9995c9beb0 Fix 'invalid argument' to boost::interprocess::shared_memory_object 2024-06-06 23:05:43 -05:00
5827bf2574 gotten rid of redundant base1, base2 and base3 2024-06-03 18:53:24 +02:00
38acf9c619 Sync from upstream. 2024-06-02 13:50:31 -05:00
a2f760f320 Merge pull request #249 from boostorg/feature/natvis
Implement natvis visualizations
2024-06-02 20:00:09 +02:00
39d86cb896 Display foa stats in natvis if applicable 2024-06-02 11:27:15 -05:00
317d4aa060 Write release notes and documentation for natvis 2024-06-01 09:26:38 -05:00
901f0a29b8 Write natvis for foa iterators 2024-06-01 09:26:38 -05:00
0a66c687fd Write natvis for foa and cfoa containers 2024-06-01 09:26:37 -05:00
763a862928 Write natvis for foa and cfoa helpers 2024-05-31 23:51:31 -05:00
27ead86b36 Write natvis for fca iterators 2024-05-31 23:51:31 -05:00
485101db9b Write natvis for fca containers 2024-05-31 23:51:30 -05:00
29521c3a77 Create natvis file and update CMakeLists.txt 2024-05-31 16:50:57 -05:00
be1f493a6e Merge pull request #250 from boostorg/feature/is_avalanching_trait_update
Feature/is_avalanching_trait_update
2024-05-30 20:04:19 +02:00
401b06663f forced a compile error when Hash::is_avalanching is not a type 2024-05-30 09:11:06 +02:00
7e9032c703 s/UB/ill-formed 2024-05-30 09:08:07 +02:00
f77bdb9b67 updated is_avalanching trait protocol 2024-05-29 19:51:32 +02:00
e5d89f1a15 Update dependencies. 2024-05-13 21:48:23 -05:00
8630a588bd Sync from upstream. 2024-05-10 20:47:21 -05:00
6745d67d62 typo 2024-05-09 09:12:28 +02:00
87e0e52cf7 Merge pull request #247 from boostorg/feature/stats
Feature/stats
2024-05-08 17:19:12 +02:00
475acdc351 typo 2024-05-08 11:43:11 +02:00
93f33c336b typos/editorial 2024-05-08 11:11:09 +02:00
d46e83296c added section on hash quality, avalanching and stats 2024-05-07 20:13:43 +02:00
a527745ff8 added example of stats for well- and ill-behaved hash functions 2024-05-07 20:13:20 +02:00
86f622240d documented stats 2024-05-06 18:48:40 +02:00
4c0aea983e made reset_stats noexcept 2024-05-06 13:26:30 +02:00
28fc689011 avoided shorten-64-to-32 and sign-conversion warnings 2024-05-05 18:30:42 +02:00
22d8cca03b added stats to bulk visitation 2024-05-05 17:56:03 +02:00
390efc275f Add requires-b2 check to top-level build file. 2024-05-05 09:00:01 -05:00
c1317cb5be replaced get_cumulative_stats() with direct access to cstats 2024-05-03 18:11:13 +02:00
223f64752d implemented proper stats handling on concurrent<->unordered move construction 2024-05-03 18:04:21 +02:00
37451ecc94 relaxed checks for non-empty unsuccessful lookup stats 2024-05-03 13:07:09 +02:00
3868496ac9 Sync from upstream. 2024-05-02 22:47:22 -05:00
8452b30608 implemented proper stats handling on move assignment 2024-05-02 20:41:27 +02:00
d121c91c88 avoided shadowed declaration warning 2024-05-02 12:48:48 +02:00
6212f2642c avoided spurious check of deleted copy ctor 2024-05-02 11:15:29 +02:00
d5605671bd avoided shadowed local variable warnings 2024-05-02 10:22:14 +02:00
45c51840f7 avoided shadowed declaration warning 2024-05-02 09:52:58 +02:00
90ca4fb07e avoided float-equal warnings 2024-05-02 09:49:11 +02:00
83ab4b4b9f avoided unused-local-type warning 2024-05-01 21:32:49 +02:00
04006547a2 editorial 2024-05-01 20:57:02 +02:00
7b0e4da61e editorial 2024-05-01 20:56:05 +02:00
0c1b719945 added missing typedefs 2024-05-01 20:52:36 +02:00
ee77a65fae added missing typename 2024-05-01 20:32:12 +02:00
3b2eae07d4 avoided name hiding warning 2024-05-01 20:28:12 +02:00
b0c480839b renamed test file 2024-05-01 18:27:45 +02:00
6215406c02 added tests for stats feature 2024-05-01 18:15:14 +02:00
e588e04a1b swapped stats on move construction/assignment 2024-05-01 18:11:01 +02:00
d01ae76074 grouped cumulative_stats summarization in one operation 2024-05-01 16:34:53 +02:00
5feb7459ee added stat counts 2024-04-30 19:18:15 +02:00
83abd9cc4e avoided -Wextra-semi-stmt warning 2024-04-30 17:49:52 +02:00
648f6fd23e protected cumulative_stats against count wraparound 2024-04-30 17:32:53 +02:00
2d8fd43cc4 editorial 2024-04-30 17:25:10 +02:00
a0f86fc2d2 Merge pull request #243 from chriselrod/patch-1
Fix typo in docs comparing open to closed adressing `map`s
2024-04-30 09:09:51 +02:00
5800b0630d Fix typo in docs comparing open to closed adressing maps 2024-04-30 01:13:00 -04:00
9806e75cc9 added stats to boost::concurrent_flat_set 2024-04-29 20:32:27 +02:00
76c460a703 grouped foa::table_core cumulative stats in one member 2024-04-29 20:30:16 +02:00
18797a3f32 added noexcept guarantees to cumulative stats calculation 2024-04-29 19:28:35 +02:00
1ecb92deb5 added stats to boost::concurrent_flat_map 2024-04-29 12:06:50 +02:00
443113840d added stats to foa::concurrent_table 2024-04-29 12:06:28 +02:00
b07cee08c4 added stats to the rest of open-addressing containers 2024-04-29 11:23:15 +02:00
05b66e1034 added stats to boost::unordered_flat_map 2024-04-28 18:44:40 +02:00
e712c37e9f added stats to foa::table 2024-04-28 18:44:23 +02:00
a1f9097f2b Sync from upstream. 2024-04-10 07:57:16 -05:00
73582be563 fixed #240 2024-04-03 20:07:04 +02:00
f177f437b9 Switch to library requirements instead of source. As source puts extra source in install targets. 2024-03-29 21:16:00 -05:00
fb41bdc82d Update .appveyor.yml 2024-03-25 17:35:26 +02:00
7c84969249 Merge pull request #239 from k3DW/feature/229
Add unordered container `pmr` aliases
2024-03-25 09:58:29 +01:00
553ce263fa Fix pmr tests on macos-13 2024-03-24 12:22:45 -05:00
e63853d87d Fix fca allocator swapping, and test that pmr allocator swap compiles 2024-03-24 12:22:45 -05:00
e816ba511c Write pmr tests to check for no allocator propagation 2024-03-24 12:22:45 -05:00
82ba55e4a4 Write test pmr_emplace_erase to check basic functionality with pmr allocators 2024-03-24 12:22:44 -05:00
626db552ab Write pmr memory resource 'counted_new_delete_resource' 2024-03-24 10:47:02 -05:00
5d16a36921 Update docs 2024-03-24 10:47:02 -05:00
16732c5c4c Add unordered container pmr aliases 2024-03-23 14:02:53 -05:00
a3873dc19b Sync from upstream. 2024-03-16 09:01:13 -05:00
5e6b9291de Merge pull request #238 from boostorg/fix/gh-237
Fixed bug in the `const` version of `unordered_multimap::find(k, hash, eq)`
2024-03-16 09:18:41 +01:00
ccf9a76ebe Fixed #237 2024-03-15 17:30:10 +01:00
89515ee604 Make the library modular usable. 2024-03-11 08:38:17 -05:00
15cfef6967 Fixed support for allocators with explicit copy constructors (#234)
* added tests for explicit allocators

* made explicit_alloc_ctor_tests work
by adhering to the principle that classes templated with Allocator should accept exactly Allocator objects

* removed TMP machinery older compilers choke about

* initialized variables

* updated release notes

* fixed PR number
2024-02-17 18:58:48 +01:00
7692065552 Merge pull request #230 from k3DW/feature/226
Optimize `emplace()` for arguments of the form `k, v`
2024-02-12 17:24:49 +01:00
bbad4735aa Update reference 2024-02-11 11:22:28 -06:00
1d25c1c053 Update copyright notices 2024-02-11 11:22:28 -06:00
260418e4ee Fix cfoa tests 2024-02-11 11:22:28 -06:00
aff242dbaf Optimize emplace(k,v) for fca containers 2024-02-11 11:22:28 -06:00
4e6d4ade6c Optimize emplace(k,v) for foa and cfoa containers 2024-02-11 11:22:27 -06:00
4fbe450a65 Generalize alloc_cted_insert_type into allocator_constructed and remove the factory function alloc_make_insert_type() 2024-02-11 11:22:27 -06:00
bd5c9fc740 Add cfoa tests for emplace(k,v) 2024-02-11 11:22:27 -06:00
f411968ffd Add tests for immovable key_type 2024-02-11 11:22:26 -06:00
be7c63e1bf Add foa and fca tests for emplace(k,v) 2024-02-10 11:10:28 -06:00
1df37051ae Add msvc-14.1, msvc-14.2 /permissive- to Drone 2024-02-08 20:55:54 +02:00
c4dbda0f78 Add missing include 2024-02-08 20:52:34 +02:00
fa895edac2 Add msvc-14.3 /permissive- to Drone 2024-02-08 20:10:50 +02:00
43186b04d1 Add msvc-14.3 /permissive- to GHA 2024-02-08 19:59:47 +02:00
67c5cdb3a6 Optimize emplace() for exactly a value_type or init_type argument (#227)
* Add structs to count special member functions

* Add failing emplace tests, that will pass after making the optimization

* Optimize emplace() to not allocate when we already have a value_type or init_type

* Fix newly failing cfoa tests
2023-12-31 18:56:14 +01:00
75a94781d5 Fix/b2 5.0.0 (#228)
updated CI after b2 5.0.0 new requirements on the compiler used for self-build
2023-12-30 22:11:11 +01:00
76185abe80 extended workaround to GCC 4.9 2023-12-30 19:41:13 +01:00
0d2751c5e1 Extract at()'s throw_exception calls into noinline function (#223)
* Create function `detail::throw_out_of_range()` to make `at()` more inlineable

* Replace `boost::throw_exception()` with `detail::throw_out_of_range()`
2023-12-19 17:08:08 +01:00
f493603f5c [skip ci] editorial 2023-12-01 12:22:48 +01:00
74ca1b0e74 Update test/CMakeLists.txt 2023-11-30 17:54:53 +02:00
7b16324869 Regenerate CMakeLists.txt 2023-11-30 17:40:41 +02:00
6680e86b38 [skip ci] typo 2023-11-25 09:49:24 +01:00
3e76b1cf68 [skip ci] beautified some badges 2023-11-19 18:45:21 +01:00
22f29718e4 changed drone badges 2023-11-19 09:48:38 +01:00
f7c7f8fdd2 [skip ci] added Drone badges 2023-11-18 11:30:47 +01:00
7fd94b9df7 Fix/bucket iterator indirection operator (#220 rewrite) (#221)
* Add tests for member of pointer operator for bucket iterators

* Fix erroneous conversion from node* to value_type* in bucket iterators

Originally caughy by vslashg  from PR https://github.com/boostorg/unordered/pull/220

* Update change log

* Update GHA config to use containers in C++20 builds for clang-14 as it's incompatible with libstdc++-13

* fixed Python installation problem

* tried variation of former fix

* tried another variation of former fix

* tried yet another variation

* editorial

---------

Co-authored-by: Christian Mazakas <christian.mazakas@gmail.com>
2023-11-17 08:51:40 +01:00
1c0e54ee3e updated boost::unordered_[multi]set and boost::unordered_(flat|node)_map benchmarks 2023-11-06 18:20:36 +01:00
329022b23c removed unnecesary picture tags README.md 2023-10-31 09:38:53 +01:00
47f5be3a3f typo 2023-10-31 08:59:21 +01:00
de2ac0ce33 revamped README.md 2023-10-29 18:46:51 +01:00
42df4f2749 removed lifting of swap and ==/!= operations 2023-10-22 20:16:05 +02:00
dbe93c765c asserted allocator equality on unordered_node_(map|set)::merge and updated docs 2023-10-21 12:35:59 +02:00
ea4fc5e66d fine-tuned element prefetching in unprotected_bulk_visit 2023-10-18 18:20:22 +02:00
0e19223e5b Replace uses of boost::enable_if_t in deduction guides with std::enable_if_t 2023-10-12 13:13:56 +03:00
8ee48fe909 Feature/bulk visit (#217) 2023-10-11 12:50:28 +02:00
ef0b3a0cd8 fixed #201 2023-10-04 17:38:33 +02:00
44b669a71c Merge pull request #215 from cmazakas/cxx03_deprecation
cxx03 deprecation
2023-09-29 14:59:59 -07:00
554ce65a69 Remove unnecessary forced inlining of bool conversion 2023-09-29 10:52:34 -07:00
c37d9a3bf1 Clean up tests to properly use boost::unordered::piecewise_construct and ensure it's a humble alias for its std counterpart 2023-09-29 08:29:06 -07:00
4fcc6a9cab Manually implement explicit boolean conversion, removing header dependency on Core's polyfill 2023-09-29 08:03:49 -07:00
0d61746fa3 Remove unnecessary requires_cxx11 header 2023-09-29 08:03:11 -07:00
20559cbe5c Remove extraneous whitespace introduced by a clang-format bug 2023-09-29 07:44:52 -07:00
6728ffcf6d Cleanup polyfilled type traits helpers to derive from integral constant 2023-09-29 07:42:58 -07:00
9f5f8b1b48 Update maintainers list in libraries.json 2023-09-28 21:27:46 -07:00
aedebff4e1 Remove extraneous header include of Core's addressof impl 2023-09-28 21:27:46 -07:00
47fa9cd17e Pull triviality type traits into internal type_traits header 2023-09-28 21:27:46 -07:00
a0e1bc295a Update libraries.json 2023-09-28 12:54:51 -07:00
f5bd5bc3d0 Cleanup default-constructiblity check for gcc-4 2023-09-28 12:52:13 -07:00
630031706b Remove project test requirements and remove problematic CI entries 2023-09-28 09:51:47 -07:00
9bc7876583 Update foa to be gcc-4.8 compliant 2023-09-28 08:31:14 -07:00
b482890453 Update testing requirements to re-enable gcc-4.8 and above 2023-09-28 08:27:12 -07:00
bc764d34cf Remove extraneous workarounds for gcc-4 in foa core header 2023-09-27 13:03:15 -07:00
a9da328e1d Add missing copyright to static_assert() header 2023-09-27 13:03:15 -07:00
087f2052fc Update include paths to use ContainerHash instead of Functional for hash 2023-09-27 13:03:15 -07:00
51a75c0fd0 Replace usage of make_void with void_t 2023-09-27 13:03:15 -07:00
ce5033c4a0 Update out-of-line definitions in prime_fmod to be conditional on pre-c++17 support 2023-09-27 13:03:15 -07:00
bcbb13e0cf Add missing licensing to opt_storage header 2023-09-27 13:03:15 -07:00
7aac692162 Replace all usages of boost::addressof with their std counterpart 2023-09-27 13:03:15 -07:00
f1729bb8a1 Remove unused choice<n> helper structs 2023-09-27 12:21:15 -07:00
b4884b7201 Relocate piecewise_construct to impl file, remove unnecessary fwd header 2023-09-27 12:21:15 -07:00
b0a13f896f Remove problematic characters from clang GHA job names 2023-09-27 11:44:45 -07:00
cb86544fcf updated docs to reflect C++03 support drop 2023-09-27 11:44:45 -07:00
6c97eabbb3 Refactor prime_fmod_size policy to use static members in lieu of namespace-scope ones 2023-09-27 11:44:45 -07:00
968c2e9c11 Split clang GHA jobs 2023-09-27 11:44:45 -07:00
53a6566a98 Split up GHA gcc-12 sanitizer jobs 2023-09-27 11:44:45 -07:00
9b1ec6cbce Reinstate boost::unordered::piecewise_construct
Maintain backwards-compatibility for users instead of forcing them to change to `std::`
2023-09-27 11:44:45 -07:00
3f3b2128ec Update extract() SFINAE to be friendly to msvc-14.0
msvc-14.0 seems to require the parameter pack be explicitly mentioned though no other compilers seem to have this issue
2023-09-27 11:44:45 -07:00
d3e6be7356 Replace boost::addressof with std::addressof
For some reason, gcc-5 and 6 don't like Boost's impl here but the std one seems to work
2023-09-27 11:44:45 -07:00
423eb08f00 Work around bugs in gcc's analysis
Under `-m32 -O3` builds, it seems like gcc gets confused by the usage of malloc and calloc so we opt into the C++ versions, operator new and delete
2023-09-27 11:44:45 -07:00
777f2084a3 Remove dependency on TypeTraits 2023-09-27 11:44:45 -07:00
e5bf418c3d Add missing Boost.Tuple #include 2023-09-27 11:44:45 -07:00
9d8beff688 Remove dependency on Boost.Tuple 2023-09-27 11:44:45 -07:00
91f63697a7 Replace <boost/limits> with STL <limits> 2023-09-27 11:44:44 -07:00
22344ab27f Add missing <algorithm> include for std::max 2023-09-27 11:44:44 -07:00
d742ee3a3b Remove unnecessary BOOST_UNORDERED_USE_MOVE tests 2023-09-27 11:44:44 -07:00
d881d4d5e2 Remove Boost.StaticAssert 2023-09-27 11:44:44 -07:00
15318f0e46 Refactor prime_fmod_size impl to no longer use Boost.Preprocessor 2023-09-27 11:44:44 -07:00
e32f72d69c Remove dependency on Boost.Utility in implementation.hpp 2023-09-27 11:44:44 -07:00
e37e749b0b Remove Boost.PP from implementation.hpp 2023-09-27 11:44:44 -07:00
b02d013d44 Add missing <algorithm> include 2023-09-27 11:44:44 -07:00
33dbd7cd76 Remove dependency on Boost.Move 2023-09-27 11:44:44 -07:00
8f382e874d Remove BOOST_COPYABLE_AND_MOVABLE 2023-09-27 11:44:44 -07:00
bce9b5927a Remove BOOST_MOVABLE_BUT_NOT_COPYABLE 2023-09-27 11:44:44 -07:00
c6aa90651c Final cleanup of BOOST_NO_CXX11_* 2023-09-27 11:44:44 -07:00
cddb7cb8b1 Remove BOOST_NO_CXX11_NOEXCEPT 2023-09-27 11:44:44 -07:00
a36a7327eb Remove BOOST_NO_CXX11_ALLOCATOR 2023-09-27 11:44:44 -07:00
d2dc503e4a Remove BOOST_NO_CXX11_DEFAULTED_FUNCTIONS 2023-09-27 11:44:44 -07:00
0c7b51cc16 Remove BOOST_NO_CXX11_RVALUE_REFERENCES 2023-09-27 11:44:44 -07:00
3f0f8efbba Remove BOOST_NO_CXX11_VARIADIC_TEMPLATES 2023-09-27 11:44:44 -07:00
8d59040ece Remove BOOST_COPY_ASSIGN_REF 2023-09-27 11:44:44 -07:00
15d04295d6 Disable self-move warnings for gcc in node_handle_tests 2023-09-27 11:44:44 -07:00
866ab46385 Remove BOOST_FWD_REF 2023-09-27 11:44:44 -07:00
4cd1827104 Remove BOOST_RV_REF 2023-09-27 11:44:44 -07:00
3bd7e93ac6 Remove BOOST_UNORDERED_TUPLE_ARGS 2023-09-27 11:44:44 -07:00
1d991d065e Remove BOOST_UNORDERED_EMPLACE_LIMIT 2023-09-27 11:44:44 -07:00
8782036a88 Remove BOOST_UNORDERED_HAVE_PIECEWISE_CONSTRUCT 2023-09-27 11:44:44 -07:00
f088a5b9b9 Remove usage of boost::forward 2023-09-27 11:44:44 -07:00
16386f586f Remove usage of BOOST_UNORDERED_CXX11_CONSTRUCTION 2023-09-27 11:44:44 -07:00
59a7fa09ba Remove usage of BOOST_NO_CXX11_HDR_TYPE_TRAITS 2023-09-27 11:44:44 -07:00
8cbd9ad80a Remove BOOST_NO_CXX11_HDR_INITIALIZER_LIST checks 2023-09-27 11:44:44 -07:00
b0ee2b5116 Remove BOOST_UNORDERED_EMPLACE_TEMPLATE machinery 2023-09-27 11:44:44 -07:00
adb91ac06d Replace boost::move with std::move 2023-09-27 11:44:44 -07:00
11322de29f Remove BOOST_CONSTEXPR 2023-09-27 11:44:44 -07:00
0c90a84aa0 Add missing #include for Boost.Assert 2023-09-27 11:44:44 -07:00
aa16d1b8a9 Remove BOOST_NOEXCEPT 2023-09-27 11:44:44 -07:00
6b65c8f230 fixed assignment bug with POCXA, fancy, unequal allocators (#214) 2023-09-26 20:08:13 +02:00
b445ff639d Merge pull request #213 from cmazakas/self-include-tests
self-include tests
2023-09-22 13:02:45 -07:00
08187c7a1f Swap _include_tests suffix for _hpp 2023-09-19 12:27:19 -07:00
6953014874 Update self-include tests to use a significantly shorter mangling scheme for msvc targets 2023-09-19 11:42:23 -07:00
7b24cf6607 Cleanup self-include tests to compile solely as object files 2023-09-19 08:51:12 -07:00
6f0a715541 Update drone.bat to abbreviate paths
Our generated executable names exceed the MAX_PATH length Win32 imposes
2023-09-18 15:32:48 -07:00
85c7900339 Add missing element_type includes 2023-09-18 13:25:21 -07:00
c0cd51bd2a Update test jamfile to glob for project headers and create self-include tests 2023-09-18 13:25:21 -07:00
73891c6ec8 Merge pull request #212 from boostorg/feature/concurrent_flat_set
Feature/concurrent_flat_set
2023-09-16 18:36:36 +02:00
82f4d9899c stylistic/editorial 2023-09-16 12:17:07 +02:00
cad3509a17 added boost::concurrent_flat_set to mmap_tests 2023-09-16 11:18:39 +02:00
44582ecbb9 removed unused typedefs 2023-09-16 10:18:36 +02:00
9e38e3c578 typos 2023-09-16 10:15:36 +02:00
d5d6a18298 removed unused utilities 2023-09-16 10:15:36 +02:00
88f8228079 tested concurrent_flat_set 2023-09-16 10:15:36 +02:00
31c3ce97de avoided sign-conversion warning 2023-09-16 10:15:36 +02:00
651f209e20 shut down VS warning 2023-09-16 10:15:36 +02:00
d9d4ff1676 removed unused typedef 2023-09-16 10:15:36 +02:00
2ce456768d completed concurrent_flat_set testing 2023-09-16 10:15:36 +02:00
65d4a9cafa fixed try_emplace tests after (value|init)_type_generator removal in helpers.hpp 2023-09-16 10:15:36 +02:00
8d2a5c25ea tested boost::concurrent_flat_set 2023-09-16 10:15:05 +02:00
49f0929466 documented boost::concurrent_flat_set 2023-09-16 09:50:22 +02:00
0673c5653c added boost::concurrent_flat_set 2023-09-16 09:50:22 +02:00
a3a1ab6ad2 Merge pull request #211 from boostorg/fix/gh-189
fix/gh-189
2023-09-15 14:59:00 -07:00
7d639e2e86 Update docs noexcept specification for move assignment 2023-09-15 09:50:33 -07:00
32b9f06fe5 Update release notes to include fancy pointer support 2023-09-15 09:50:33 -07:00
3d302980d4 Update mmap_tests to use Boost.UUID to mangle executable names
CIs can run multiple instances of the test suite at once resulting in duplicate shm_names which is disastrous for each test
2023-09-15 09:50:33 -07:00
1dc1962b8c Update cfoa's assign tests to cover fancy and plain pointers for flat_map<-> concurrent interop 2023-09-15 09:50:33 -07:00
a0c7112652 Update arrays transfer in table_core moves constructors to be exception-safe 2023-09-15 09:50:33 -07:00
b031b61b94 Update docs on rehashing behavior in face of fancy pointer changes 2023-09-15 09:50:33 -07:00
b9fe4ed789 Clean up how group_accesses are setup for concurrent_table_arrays 2023-09-15 09:50:33 -07:00
c707bcb6d8 Refactor table_iterator to avoid extraneous amounts of boost::to_address 2023-09-15 09:50:33 -07:00
771943e291 Add to_pointer helper for converting raw pointers to fancy
This helps us avoid an unconditional nullptr check when the user's pointer type is fancy
2023-09-15 09:50:33 -07:00
675e30bd95 Clean up dummy_groups and groups allocation 2023-09-15 09:50:33 -07:00
2cab340749 Replace direct accesses of fancy pointers with getters 2023-09-15 09:50:33 -07:00
c3786357a6 Update noexcept specification to accomodate for throwing arrays::new_ 2023-09-15 09:50:33 -07:00
33ee8ea302 Disable mmap_tests for cygwin targets
Interprocess tries to erroneously call ftruncate without the corresponding header being included.
2023-09-15 08:22:31 -07:00
583225ad9f Update docs about relaxed Allocator requirements 2023-09-15 08:22:31 -07:00
c16a3f2a4a Update table_iterators to store fancy pointers 2023-08-30 09:57:22 -07:00
1d93fa12a2 Update mmap_tests to include iterators 2023-08-30 09:57:22 -07:00
f4f322b94d Update requirements for TypeIndex 2023-08-30 09:57:22 -07:00
3299b31787 Update tests to accomodate foa containers allocating groups when the pointer type is fancy 2023-08-30 09:57:22 -07:00
95a37b0d3d Update foa-based containers to store only fancy pointers 2023-08-30 09:57:20 -07:00
4d6ebc7eb3 Update test fancy pointers to be Nullable, add rebind alias template 2023-08-30 09:56:28 -07:00
a0679e5ffe Add mmap_tests 2023-08-30 09:56:28 -07:00
b01f9ee15d Refactor Jamfile, add C++11 as compiler minimum 2023-08-30 09:56:28 -07:00
215d8e82cb Merge pull request #207 from boostorg/feature/serialization_support
Feature/serialization support
2023-08-29 10:50:21 -07:00
067884a4e2 Merge pull request #210 from boostorg/fix/gh-205
Fix for issue #205
2023-08-28 10:38:13 -07:00
ca2a46f290 complied with https://github.com/boostorg/core/commit/5f6fe65 2023-08-25 19:45:16 +02:00
d007a5a7bd renamed serialize_node_pointer as serialize_tracked_address (editorial) 2023-08-25 11:34:39 +02:00
b0195297f0 simplified dtor call, s/&/boost::addressof 2023-08-18 21:07:58 +02:00
52061a7c64 typo 2023-08-18 21:03:12 +02:00
829a4a1620 worked around lack of std::shuffle in VS2010 2023-08-18 10:35:55 +02:00
6dd58f4e9c added missing carriage return 2023-08-17 10:28:45 +02:00
a2ad7966ea removed serialization tests from UBSAN runs 2023-08-17 10:21:54 +02:00
9d897faece added cfoa_serialization_tests 2023-08-17 10:21:54 +02:00
389e967484 added embarrassingly absent BOOST_TEST 2023-08-17 10:21:54 +02:00
0365be763a dealt with serialization_tests's big executable size 2023-08-17 10:21:54 +02:00
fc3fca4264 reverted prior (didn't work) 2023-08-17 10:21:54 +02:00
bf0ae6e63a marked UB-incurring boost::archive::xml_oarchive ctor/dtor as no_sanitize 2023-08-17 10:21:54 +02:00
9057369f93 refactored to work around GCC 4.4 hiccups with std::pair<X*,...> p(0,...) 2023-08-17 10:21:54 +02:00
aec9c48cf4 restored passing of working directory 2023-08-17 10:21:54 +02:00
3968ff0567 uploaded generate_legacy_archives.cpp for preservation 2023-08-17 10:21:54 +02:00
8170716156 de-constified values in legacy_serialization_test to appease some defective C++03 compilers 2023-08-17 10:21:54 +02:00
651727508b removed unneeded working directory passing 2023-08-17 10:21:54 +02:00
b3b4853dfa added legacy serialization tests 2023-08-17 10:21:54 +02:00
1f3980986d avoided sign-compare warnings 2023-08-17 10:21:54 +02:00
4e458f0054 added foa_exception_tests 2023-08-17 10:21:54 +02:00
8fe3ebc7b3 simplified serialization building 2023-08-17 10:21:54 +02:00
cf298cba7f removed spurious macro definition 2023-08-17 10:21:54 +02:00
d83efc5ea4 added first tests of serialization support 2023-08-17 10:21:54 +02:00
ff9d08a917 adapted to iterators (eventually) holding fancy pointers 2023-08-17 10:21:54 +02:00
e1a30831fe editorial 2023-08-17 10:21:54 +02:00
34e5773a4a documented serialization support 2023-08-17 10:21:45 +02:00
c26137f2dd unnamed unused arg 2023-08-17 10:20:25 +02:00
1264805a59 avoided type shadowing 2023-08-17 10:20:25 +02:00
bfb6520107 unnamed unused args 2023-08-17 10:20:25 +02:00
ab867a65f4 unnamed unused args 2023-08-17 10:20:25 +02:00
5239b101e2 added serialization support (pending docs and testing) 2023-08-17 10:20:25 +02:00
c5f64ed1d3 Prevent erroneous copying of groups data, update max load to properly propagate 2023-08-16 10:22:08 -07:00
a06498f5ce Add tests catching erroneous copying of groups data 2023-08-16 10:21:27 -07:00
bcd8969b9a editorial 2023-08-12 12:43:29 +02:00
bc7e77f239 Merge pull request #200 from boostorg/feature/detect_reentrancy
Feature/detect reentrancy
2023-08-12 11:58:29 +02:00
66222eee6a Merge branch 'develop' into feature/detect_reentrancy 2023-08-12 09:54:22 +02:00
ee1974dc87 Merge pull request #198 from boostorg/feature/concurrent_unordered_interop
Feature/concurrent unordered interop
2023-08-12 09:48:08 +02:00
4918bb6b7e Add tests for interop assignment 2023-08-11 12:35:44 -07:00
e563c89b1c Remove extraneous typename 2023-08-11 12:35:44 -07:00
ce076782fd Add tests for interop constructors 2023-08-11 12:35:44 -07:00
b206513a11 fixed friend declarations 2023-08-11 12:35:44 -07:00
bf4a5efd2d documented concurrent/unordered interop 2023-08-11 12:35:40 -07:00
6b6dde4f97 stylistic 2023-08-11 12:35:13 -07:00
ac1a236de6 added concurrent_flat_map(unordered_flat_map&&) 2023-08-11 12:35:13 -07:00
d4adcd9b71 added missing std::move's 2023-08-11 12:35:13 -07:00
c046b916f8 fix atomic_size_control copy ctor 2023-08-11 12:35:13 -07:00
4be37cfdaf avoided premature instantiation of concurrent_table 2023-08-11 12:35:13 -07:00
6994a37b23 used direct arrays construction in place of empty_initialize
(arrays_type not default constructible)
2023-08-11 12:35:13 -07:00
6bf84067b3 added unordered_flat_map(concurrent_flat_map&&) 2023-08-11 12:35:13 -07:00
48ff743d06 Merge pull request #199 from boostorg/feature/visit_until
Feature/visit until
2023-08-11 12:26:13 -07:00
5339bf67d9 Add missing #include's 2023-08-03 10:52:03 -07:00
1979ce98a2 documented BOOST_UNORDERED_DISABLE_REENTRANCY_CHECK 2023-07-28 18:22:20 +02:00
a22c133c3d Add tests for visit_while 2023-07-26 10:14:11 -07:00
f919ce532a repositioned LCOV annotations 2023-07-26 16:50:25 +02:00
30187f7743 excluded code from coverage analysis 2023-07-26 12:47:31 +02:00
dd30162c9e simplified reentrancy check config 2023-07-25 09:18:53 +02:00
fde765c494 added reentrancy check to release notes 2023-07-24 20:31:32 +02:00
9c476ef72a typo 2023-07-24 20:19:09 +02:00
470abf41d8 dropped [c]visit_until 2023-07-24 20:13:18 +02:00
a3626b5095 fixed reentrancy checking for scoped_bilock 2023-07-24 19:44:09 +02:00
948151bd7d added RVO enabler 2023-07-24 18:43:20 +02:00
f965298154 added reentrancy checking 2023-07-24 18:29:30 +02:00
5a4d93a72d documented [c]visit_(until|while) 2023-07-21 19:39:43 +02:00
bee4ed2e5f implemented [c]visit_(until|while) 2023-07-21 18:16:28 +02:00
bd24dfd284 updated concurrent map benchmark plots 2023-07-18 18:19:13 +02:00
faf54eef0d Merge pull request #196 from sdarwin/gha_runners
Self-hosted github actions runners
2023-07-13 10:12:44 +02:00
97b52879f5 Self-hosted github actions runners 2023-07-12 14:42:51 -06:00
9a7d1d336a Update ci.yml 2023-06-26 21:41:13 +03:00
3fc18d56ac Remove latch_tests.cpp 2023-06-26 16:13:20 +03:00
6bcf457b46 Use boost::compat::latch 2023-06-26 10:32:52 +03:00
01b2369700 Update .appveyor.yml 2023-06-26 02:45:47 +03:00
fcb3f0e82a Decrease iterations in rw_spinlock_test8 to avoid timeouts 2023-06-26 02:42:12 +03:00
1e4deb10a1 Add rw_spinlock tests 2023-06-25 19:03:02 +03:00
6ee93f17e4 [skip ci] updated boost::unordered_(flat|node)_map benchmarks 2023-06-22 19:21:02 +02:00
7e41e08a57 updated boost::concurrent_flat_map benchmarks 2023-06-22 09:02:24 +02:00
7a6c8eca09 Merge pull request #194 from boostorg/fix/extra-semicolon
Remove extraneous semicolons
2023-06-21 15:35:05 -07:00
dce386068b Remove extraneous semicolons 2023-06-21 07:46:53 -07:00
7d39b68e46 Fix -Wsign-conversion issue 2023-06-20 21:36:25 +03:00
79a59bce72 Change the backoff algorithm of rw_spinlock 2023-06-20 21:36:25 +03:00
717048e868 Split Appveyor jobs to avoid timeouts 2023-06-20 17:49:15 +03:00
de8c2a5ad9 Merge pull request #193 from boostorg/feature/proxy-erase
Feature/proxy erase
2023-06-20 11:49:27 +02:00
678f8802f4 [skip ci] updated boost::unordered_[multi]set benchmarks 2023-06-20 09:53:25 +02:00
704b3c7a4b Update docs to describe the returned proxy type as "convertible to iterator" 2023-06-19 14:33:10 -07:00
671b68f4d1 Restart drone CI 2023-06-19 10:45:37 -07:00
b2a4b22c89 Remove erroneous asserts from the test suite
These asserts were erroneously being removed in release builds of the tests which is never the intention
2023-06-19 09:21:48 -07:00
2eebe157fd refactored proxy_erase to reduce template instantiations and strengthen misuse avoidance 2023-06-19 08:21:13 -07:00
2b6cfe4f3c documented proxy erase(iterator) 2023-06-19 08:21:13 -07:00
2f7bba0c21 Implement proxy erase(iterator) 2023-06-19 08:21:13 -07:00
d65d9a65b7 Merge pull request #188 from boostorg/feature/cfoa
Feature/cfoa
2023-06-17 17:25:56 +02:00
67913ed99a re-enabled CI on feature/* branches 2023-06-17 17:21:09 +02:00
0440cd3183 widened previous workaround 2023-06-17 09:37:17 +02:00
3a3148cc16 Add workaround for gcc-5.4 deficiencies in copy elision and new() construction 2023-06-16 14:16:26 -07:00
f51070ab21 Update free function erase_if() to support non-copyable predicates 2023-06-16 14:16:26 -07:00
ac5a99da31 Add max_size() impl 2023-06-15 22:15:57 -07:00
6fed6ea5ad Remove extraneous fwd.hpp include from public facing headers 2023-06-15 22:15:57 -07:00
c51c06492a Update iterator range insert to use emplace() vs insert() to avoid copies in certain cases 2023-06-15 22:15:57 -07:00
f604efe866 Add missing const reference qualifiers to allocator_type constructor parameters 2023-06-15 22:15:57 -07:00
e8ec858313 Refactor type policies used by containers into their own dedicated headers 2023-06-15 22:15:57 -07:00
bc8996559b Remove unnecessary backticks from static_assert() messages 2023-06-15 22:15:57 -07:00
449e1a30d3 Remove outdated reference to proposed synopsis 2023-06-15 22:15:57 -07:00
c2484f05f0 avoided old GCC/Clang hiccup with {} for aggregate copy construction 2023-06-09 21:31:30 +02:00
f7e2132bdb Merge branch 'feature/cfoa' of https://github.com/boostorg/unordered into feature/cfoa 2023-06-09 21:20:36 +02:00
07a8b2b14d stylistic 2023-06-09 08:55:25 -07:00
2eac49f0ed added copy ctor for cache_aligned_size_control 2023-06-09 08:55:25 -07:00
6a8d7857e2 fixed unqualified swap call 2023-06-09 08:55:25 -07:00
ef34ec5e87 added missing #include 2023-06-09 08:55:25 -07:00
518a5d2e1e refactored padding into a clean design 2023-06-09 08:55:25 -07:00
3ea8a768ca added padding between and around ml and size_ 2023-06-09 08:55:25 -07:00
4b877d363a updated concurrent_flat_map benchmarks 2023-06-09 08:55:25 -07:00
2395db7bb9 Cleanup docs 2023-06-09 08:55:25 -07:00
7327053eea updated concurrent_flat_map benchmarks 2023-06-08 09:34:05 +02:00
af19d99b70 Clean up CI to pre-debugging state 2023-06-07 10:05:19 -07:00
64f9370fff implemented cacheline alignment without extended alignas 2023-06-07 11:30:52 +02:00
ca193de243 added missing #include 2023-06-07 11:28:00 +02:00
2914925b4d Explicitly disable ccache in GHA runner file 2023-06-06 09:14:00 -07:00
bc37851725 Remove usage of ccache from problematic gcc-12 sanitizer actions 2023-06-06 08:51:59 -07:00
f89a31849c Fix workaround for cfoa_fwd_tests 2023-06-06 08:27:55 -07:00
ec945810eb Remove problematic test from clang-3.7 runner 2023-06-05 15:56:06 -07:00
68ddaba57a Update cfoa's fwd header to be in line with the others 2023-06-05 15:47:41 -07:00
c48c2afc56 Add gcc-13 and Ubuntu 23.04 to Drone CI 2023-06-05 14:24:38 -07:00
01a5dd0dd1 Add concurrent_flat_map to link tests for foa 2023-06-05 14:19:18 -07:00
300a8e61bd Add ubsan + asan jobs to gcc-12 2023-06-05 11:16:34 -07:00
1d2be664a0 added boost::concurrent_flat_map benchmarks 2023-06-05 20:08:32 +02:00
e6b1ef9e1e Add ubsan gcc-12 runners to drone 2023-06-05 09:32:11 -07:00
4efb55146a Update gcc used for code coverage collection 2023-06-02 15:08:29 -07:00
8877d21237 Replace dependency on SmartPtr with primitives in Core 2023-06-02 14:14:18 -07:00
44c50cd2ea Resolve potential ambiguities during insertion by introducing a member function template 2023-06-01 14:19:14 -07:00
e7c1e1a56e Clean up raii count checkers to avoid extraneous assertions 2023-06-01 14:18:54 -07:00
9a22f8fbee Add missing dependency on SmartPtr 2023-05-31 09:14:44 -07:00
51520de04b Add allocator using fancy pointers to insert_tests 2023-05-31 07:30:37 -07:00
6e0f76f4c2 Add missing FindThreads to CML 2023-05-30 14:52:45 -07:00
06aa4b5c19 Cleanup test CML 2023-05-30 13:24:21 -07:00
332540c857 Attempt to fix CMake tests 2023-05-30 12:05:10 -07:00
fdedb6c957 Add merge exceptions tests for cfoa 2023-05-30 09:19:50 -07:00
7aaa2e9452 polished BOOST_UNORDERED_PREFETCH[_ELEMENTS] 2023-05-28 19:09:14 +02:00
950e640fcf Update concurrent_table to use macro-based prefetching 2023-05-26 21:06:01 -07:00
7874625c08 Replace prefetch_elements() with macro so builtins aren't optimized away by DSE 2023-05-26 20:56:52 -07:00
2ab4225473 Add workaround for gcc-12 and above where the prefetch call is ignored 2023-05-26 08:16:02 -07:00
c5df4ec069 Remove unused test 2023-05-25 08:41:26 -07:00
55d79204be Add exceptions tests for cfoa assign ops 2023-05-24 15:23:09 -07:00
f5d5299b88 Flesh out constructor exception tests 2023-05-24 11:06:45 -07:00
253a9bccf6 fixed leak in throwing allocator-extended move ctor 2023-05-24 09:19:31 +02:00
61f11a58ee Push up failing test case for code review purposes 2023-05-23 15:28:14 -07:00
e78dc311e3 Clean up erase tests 2023-05-23 08:43:10 -07:00
a5748c2e8b Add initial container population to insert iterator range tests 2023-05-22 15:24:36 -07:00
146c5cb6be Clean up exception tests 2023-05-22 14:19:21 -07:00
c63a88032d Loosen restrictions on erase exceptions tests to accomodate runs where there are no successful erasures 2023-05-22 12:10:10 -07:00
3ad164267a Update duration of erase operations to trigger successful erasures when only 2 threads are available 2023-05-22 11:37:07 -07:00
a9203ed93c Clean up erase_tests 2023-05-22 10:17:36 -07:00
16550ded0c Add exceptional erase tests 2023-05-22 10:17:36 -07:00
b4c75abca9 typo 2023-05-22 09:49:00 +02:00
a696bdecf6 editorial 2023-05-21 13:10:46 +02:00
8865a940fc editorial 2023-05-21 12:55:23 +02:00
2a28698c8c editorial 2023-05-21 12:43:45 +02:00
96f5983f88 fixed initializer_list insert requirements 2023-05-21 12:39:02 +02:00
ddb1148a31 reformulated static member initialization to appease VS2015 2023-05-20 12:16:30 +02:00
ffcae204ee Add insert_exception_tests 2023-05-19 12:33:23 -07:00
f28527c4d8 removed double separating line 2023-05-19 11:28:08 +02:00
528f7d4b12 title cased some sections 2023-05-19 11:17:56 +02:00
a140de4254 typos/editorial 2023-05-19 10:51:00 +02:00
f1bc948be8 Update table formatting in intro to use monospaced font 2023-05-18 13:14:58 -07:00
3d640ac032 refactored to modernize and improve flow 2023-05-18 20:18:58 +02:00
ff10b287e2 Remove unreliable check from swap_tests 2023-05-17 13:36:56 -07:00
4a416501c8 Fix misuse of ctad macro 2023-05-17 10:14:45 -07:00
bf06fa97e3 Add deduction guides 2023-05-17 09:38:29 -07:00
fcf6fee0f6 Make usage of forceinline consistent with the underlying concurrent_table 2023-05-16 15:42:47 -07:00
8ddfc8ec7a Update execution policies to accept by forwarding reference 2023-05-16 14:33:41 -07:00
5f249bc681 Add fwd header 2023-05-16 13:31:35 -07:00
dbd1a929e6 Remove unnenecessary spinning 2023-05-16 12:34:50 -07:00
32ff2f145e Add initial draft of equality tests 2023-05-16 11:55:56 -07:00
63026fd320 Clean up tests to avoid needless yields and extraneous spurious wakeups 2023-05-16 09:19:43 -07:00
6295c7f0d4 Add free function erase_if() 2023-05-15 13:40:33 -07:00
c3879e238d Add free function swap() 2023-05-15 07:54:19 -07:00
9260bff8f8 editorial 2023-05-15 10:20:45 +02:00
f48fc70f4b typos/editorial 2023-05-14 11:13:48 +02:00
48f703132e added implementation description for cfoa 2023-05-13 19:29:41 +02:00
69ee0039e0 added implementation rationale for concurrent hashmap 2023-05-13 19:29:08 +02:00
add01e2dfd added compliance section for concurrent hashmap 2023-05-13 19:28:43 +02:00
4b4db3dfb3 fixed links 2023-05-13 10:00:35 +02:00
81480feeb4 fixed regression at unprotected_emplace 2023-05-12 12:45:31 +02:00
d615a08f76 made operator [==|!=] templated again to accommodate fwd declarations 2023-05-12 12:33:27 +02:00
dacc1c8234 made operator[==|!=] non-templated 2023-05-12 11:41:50 +02:00
511e2b3272 refactored to provide equality comparison from table_core 2023-05-12 11:24:20 +02:00
bcf5d0cf13 Attempt to disable extraneous runs on CI 2023-05-11 08:39:29 -07:00
80a1904d92 Fix call_count check in rehash_tests 2023-05-11 08:39:16 -07:00
21afc69894 Add initial tests for rehash(), reserve() 2023-05-10 13:22:02 -07:00
c90b72a643 Squelch gcc self-move warning for version 13 2023-05-09 14:00:14 -07:00
c2c34f96a3 Improve robustness of merge_tests to schedule merges without spurious wakeups and in a wider stride of insertions 2023-05-09 14:00:14 -07:00
69ba1c7c00 editorial 2023-05-09 19:53:56 +02:00
ba25041fc8 added tutorial on boost::concurrent_flat_map 2023-05-08 18:37:36 +02:00
02197674f4 prevented VS C4800 warning 2023-05-06 12:44:07 +02:00
f0fe62d6ab Add count(), contains() 2023-05-05 15:41:23 -07:00
53328766b9 Return size_type instead of size_t 2023-05-05 15:41:08 -07:00
5b775345ba Clean up concurrent_table's merge impl 2023-05-05 11:47:20 -07:00
99b0868283 Add initial impl of merge() 2023-05-05 10:20:52 -07:00
1c98a4a8f1 changed all titles to Title Casing 2023-05-05 18:56:33 +02:00
bf73366117 typo 2023-05-05 17:55:53 +02:00
719394c522 Split important info int separate paragraphs 2023-05-05 17:55:02 +02:00
03fccc1947 refined concurrency requirements and guarantees 2023-05-05 17:37:20 +02:00
814264082f fixed BNF syntax 2023-05-04 19:19:37 +02:00
70e3dc4628 Changed the return type of iterator/initializer_list insert[_or_[c]visit] and merge to size_type 2023-05-04 19:16:39 +02:00
b72dbef1a9 added equality comparison to reference 2023-05-04 18:51:03 +02:00
26924c73b9 fixed space reservation in concurrent_table::operator=(std::initializer_list) 2023-05-04 18:09:28 +02:00
23e720a968 Split up Drone jobs even further due to extended runtimes 2023-05-03 15:32:06 -07:00
4fb7751b55 Add missing #include 2023-05-03 11:37:32 -07:00
3c0fb0fa1b Attempt to fix flaky CI 2023-05-03 11:37:32 -07:00
3fe0807ae9 Add test that intermixes insertion and visitation
Attempt to test the happens-before and synchronizes-with relationship, looking for potential bugs on weakly-ordered models
2023-05-03 11:37:32 -07:00
dfb4f2a28a added reference for boost::concurrent_flat_map 2023-05-03 17:53:13 +02:00
cc4cfc7ef2 Fix bug in swap_test iteration logic that caused early termination of the swap loop 2023-05-02 15:57:16 -07:00
a9bf367d6e Test if being the kind of program that calls yield() pays dividends for flaky CI failures 2023-05-02 15:44:21 -07:00
2ea0dbf30e Add impl of member function swap() 2023-05-02 13:44:27 -07:00
40c4d456f3 Clean up for CI 2023-05-01 15:21:25 -07:00
011b7a5969 Add initial impl of clear 2023-05-01 11:58:58 -07:00
c52ad849ea Add policy check that excludes unsequenced policies
It's technically UB for the callable in an unsequenced policy to acquire a lock so we add static_assert()s to catch potential user error.
2023-05-01 11:58:58 -07:00
615ce1e9b6 refactored unprotected_rehash_if_full out 2023-04-29 11:35:11 +02:00
bee9a3cb1a Split Drone jobs to help with CI timeouts and load 2023-04-28 14:10:58 -07:00
081932221f Attempt to fix flaky assign_tests 2023-04-28 13:42:28 -07:00
135c9586af Add fuzzy test mixing copy-assignment with insertion 2023-04-27 15:23:21 -07:00
187fd3e71e Implement initializer_list assignment 2023-04-27 12:00:42 -07:00
0959df1896 Flesh out move assignment tests 2023-04-27 09:30:49 -07:00
7833a8359d Use Core's allocator access to handle allocator_traits not having uniform support in early C++11 compilers 2023-04-26 13:58:20 -07:00
212c6a1e4d Add prototype of move assignment 2023-04-26 12:54:04 -07:00
d7acb7e8b8 Fix capturing in latch_tests 2023-04-26 12:54:04 -07:00
0bc4f2c4b9 refactored foa::concurrent_table::merge internals 2023-04-26 13:39:38 +02:00
2b612ed120 Flesh out assign_tests 2023-04-25 13:14:08 -07:00
a7c15e86fc Update num_threads to use the concurrent hint from the stdlib 2023-04-25 12:18:15 -07:00
4c117ab20a made merge blocking 2023-04-25 15:53:18 +02:00
e9c6a0fef5 Add polyfill implementation of std::latch 2023-04-24 13:29:35 -07:00
ac216a93c8 Add tests back in 2023-04-24 13:29:07 -07:00
e49fef5f9a commented out all tests except those for cfoa 2023-04-23 17:27:50 +02:00
26ab9ff584 Add prototype copy assignment operator 2023-04-21 15:56:22 -07:00
1e92d9f545 Refactor stateful_allocator to test helpers 2023-04-21 13:33:18 -07:00
2cf72093b1 Update test to spin until the container is non-empty 2023-04-21 10:44:06 -07:00
88d4d64edf Add last remaining constructors 2023-04-21 10:33:21 -07:00
7f7e577e77 polished description 2023-04-21 09:13:28 +02:00
80d7203d78 Add more iterator constructor overloads 2023-04-20 15:35:04 -07:00
5dfed4deec Update thread_runner to block on hand-rolled barrier, add yield points to hash, key_equal 2023-04-20 14:34:01 -07:00
e08f9f11a1 Add more constructors 2023-04-20 12:58:29 -07:00
c304284773 Update tests to use condition variables for work synchronization instead of sleeps 2023-04-20 12:58:29 -07:00
0e8affcc07 [skip ci] editorial 2023-04-20 20:40:10 +02:00
ba00dbd65a Merge branch 'feature/cfoa' of https://github.com/boostorg/unordered into feature/cfoa 2023-04-20 18:50:29 +02:00
c214fb44a3 completed internal code documentation 2023-04-20 18:49:42 +02:00
c704788718 Fix flaky test by starting insertion thread earlier 2023-04-20 09:25:33 -07:00
a91efeb237 refactored size_/ml swap 2023-04-20 17:29:21 +02:00
7812b26d3a Add allocator aware move constructors 2023-04-19 15:18:53 -07:00
8bd07e17c3 Add forced inlining to keep msvc benchmarks on par with raw concurrent_table 2023-04-19 10:52:41 -07:00
b3c0368ab5 Clean up typedef names to avoid conflicts 2023-04-19 09:35:47 -07:00
37edc392a5 Add allocator-aware copy constructor 2023-04-19 09:35:38 -07:00
fb403bc233 Add explicit allocator constructor 2023-04-18 15:36:12 -07:00
910b8de697 Add iterator range + allocator constructor, continue to clean up constructor_tests 2023-04-18 15:11:53 -07:00
3aff995ae0 Clean up constructor_tests 2023-04-18 13:38:24 -07:00
68c018fda6 Clean up usage of decltype to help msvc-14.3 2023-04-18 12:30:34 -07:00
a9ad06139e Add move constructor 2023-04-18 12:00:08 -07:00
9a0e5e9ea8 dispensed with std::array 2023-04-15 12:13:40 +02:00
b1a52d0236 explicitly declared guards' copy ctors as it prevents VS from doing spurious copies (!) 2023-04-15 09:51:01 +02:00
1723358298 refactored to deICE Clang<=3.8 and for clarity 2023-04-14 10:48:26 +02:00
6bf0e93a41 Remove size check as the insertion thread may not have started by the time the check happens 2023-04-13 13:30:56 -07:00
0e5ef25a69 added workaround for GCC<=5 having problems with return {...} syntax 2023-04-13 19:31:20 +02:00
ab84a922cf added workaround for lack of std::is_trivially_copy_assignable in GCC<5.0 2023-04-13 13:00:29 +02:00
d8bc38f154 Clean up tag dispatch for group_type copy assignment 2023-04-12 14:41:36 -07:00
ecd4a82ed5 Add test for select_on_container_copy_construction Allocator requirement 2023-04-12 13:58:01 -07:00
0898219edc Test empty visitation 2023-04-12 12:23:16 -07:00
d9b62d24dc Begin work on constructors 2023-04-12 12:22:59 -07:00
b771278813 Fix copy assignment warning in gcc 2023-04-12 12:22:38 -07:00
2226a7238d adjusted arg constness in erase and erase_if 2023-04-11 16:32:47 +02:00
00c6a93a56 restored invocability static asserts 2023-04-10 11:03:11 +02:00
8ea1cbbd64 s/BOOST_ASSERT/BOOST_TEST to avoid unused var warnings 2023-04-10 10:17:05 +02:00
81a47ca88d updated more tests affected by change in position of f 2023-04-10 09:05:19 +02:00
c54151769f updated insert_or_assign impls to f-last interface 2023-04-09 21:56:12 +02:00
e73d5ecdd1 updated tests affected by change in position of f 2023-04-09 20:41:15 +02:00
8a4e987030 made f the last argument in all *_or_[c]visit functions 2023-04-09 20:20:55 +02:00
8544d9f3c8 Clean up test/Jamfile 2023-04-07 12:40:06 -07:00
ed80cb14e2 Add visit_all() 2023-04-07 12:39:39 -07:00
91eb2ddbd1 Fix sign comparison warning 2023-04-07 12:39:13 -07:00
3bd28dc3d7 Implement basic version of single element visitation 2023-04-06 13:42:57 -07:00
e4d2da40f2 Add missing static_assert()s 2023-04-06 09:36:08 -07:00
a004e71dd0 Implement emplace, emplace_or_[c]visit 2023-04-05 13:21:18 -07:00
ddcab1c171 Add impl of try_emplace, try_emplace_or_[c]visit 2023-04-04 15:16:52 -07:00
e3cbf03f47 Commit missing changes to erase_if() 2023-04-03 14:11:51 -07:00
f8fbbc3b76 Add ExecutionPolicy overload of erase_if 2023-04-03 13:15:15 -07:00
52bf2bf7a2 Add insert_or_cvisit() overloads 2023-04-03 08:14:21 -07:00
cf39fc4c38 Implement transparent erase_if, unary erase_if 2023-04-03 08:14:21 -07:00
1309361a02 Remove erroneous move() calls 2023-04-03 08:14:21 -07:00
946491489e added workaround for lack of std::is_trivially_constructible in GCC<5.0 2023-04-01 12:06:39 +02:00
19202d2a8d avoided memset-related GCC warning 2023-04-01 09:09:22 +02:00
3be466966d avoided copy elision for the initialization of an atomic 2023-03-31 19:46:59 +02:00
d22787c218 use memset for group array initialization only when permissible 2023-03-31 19:36:31 +02:00
b86dee9a18 removed BOOST_UNORDERED_EMBEDDED_GROUP_ACCESS support 2023-03-31 18:52:00 +02:00
863984a7c8 fixed erase_if(x,f) return value calculation 2023-03-31 17:28:21 +02:00
e9b3ad4a5f reverted 2023-03-31 13:07:02 +02:00
e00d700457 experiment with unaligned embedded group 2023-03-31 11:32:29 +02:00
53e20a2a1b Add transparent impl of erase() 2023-03-30 12:41:31 -07:00
af4cdf8fab Shorten "transparent" to "transp" 2023-03-30 12:41:18 -07:00
7003e91d44 Harden erase() tests 2023-03-30 11:43:12 -07:00
e86bb5cce2 stylistic 2023-03-30 14:50:19 +02:00
6a4728add0 removed implementation of scoped_bilock copy ctor 2023-03-30 12:39:10 +02:00
f02afbc815 simplified scoped_bilock impl 2023-03-30 12:13:58 +02:00
6399dfd1e4 made erase_if returned count exact 2023-03-30 10:08:38 +02:00
f468fb77e0 Hopefully fix sign-conversion warnings 2023-03-29 15:55:22 -07:00
5e316ebc88 Add initial draft of erase() 2023-03-29 15:00:54 -07:00
0c90585511 Refactor myriad test helpers into separate file 2023-03-29 15:00:32 -07:00
13b4fd7133 Fix sign-compare warnings 2023-03-29 12:16:09 -07:00
27b4c62bd2 fixed initialization of concurrent_table:🧵counter 2023-03-29 20:35:48 +02:00
846de7ca82 added cvisit overloads to concurrent_table 2023-03-29 19:17:57 +02:00
62cf58d1ca sprinkled some inlines 2023-03-29 18:29:15 +02:00
4482031329 made concurrent_table::thread_counter static 2023-03-29 16:45:15 +02:00
7b1af37b9c Update RAII counters to use unsigned integers instead of signed 2023-03-28 14:37:52 -07:00
1c48f665ea Add alias target for foa container tests 2023-03-28 14:30:29 -07:00
e4072747bb Implement insert_or_visit() 2023-03-28 14:28:42 -07:00
ce674c8007 Add transparent insert_or_assign 2023-03-27 15:06:28 -07:00
45ebc1e555 fixed call ambiguities in insert_or_visit 2023-03-27 13:39:14 +02:00
02c3bd4072 stylistic 2023-03-27 11:32:07 +02:00
5f4172c13f refactored visitation an const-protection of args to visitation functions 2023-03-27 10:17:25 +02:00
40c5c6907a fixed const-casting in erase_if(foa::table&,...) 2023-03-25 18:50:25 +01:00
8dbe380d6c changed predicate arg to an lvalue ref to avoid ADL ambiguities 2023-03-25 17:37:02 +01:00
37ff9de0db fixed remaining errors in erase_if(foa::table&,...) 2023-03-25 17:35:37 +01:00
ae9f35073b avoided sign conversion warning 2023-03-25 17:17:00 +01:00
a85df27d4c fixed previous commit 2023-03-25 12:47:19 +01:00
88c70b885d fixed previous commit 2023-03-25 12:37:10 +01:00
240f5f94b1 moved erase_if_impl from foa::table_core into foa::table 2023-03-25 12:31:49 +01:00
7415721f7d completed shared/exclusive visitation 2023-03-25 12:28:44 +01:00
8b5539756b Partially implement insert_or_assign() 2023-03-24 14:35:01 -07:00
49ac1035bb (partially) implemented shared/exclusive visitation 2023-03-24 19:49:59 +01:00
d085c40541 relaxed all ops of atomic_integral 2023-03-24 18:37:53 +01:00
99d5b9b1bb Avoid unsupported typedef on earlier compilers 2023-03-24 08:57:51 -07:00
ad86f9211b Flesh out tests for insertion 2023-03-23 10:59:50 -07:00
d9515fdc2f Add insert(initializer_list) 2023-03-23 10:59:50 -07:00
eedbc6bcf7 Add missing stdlib= to drone.sh 2023-03-23 10:59:50 -07:00
297fb2e8c4 abode by TSan on Neon 2023-03-23 09:41:36 +01:00
99eab2dfb1 Fix missing quotes in jsonnet file 2023-03-22 15:14:16 -07:00
1070c9b69e Attempt to add tsan to Drone CI 2023-03-22 15:11:55 -07:00
9e6b5a7e43 Add tsan OSX job 2023-03-22 15:07:36 -07:00
e1f11e840c update clang tsan job to use libc++ 2023-03-22 13:55:42 -07:00
f2d4f1968b Explicitly add B2_TARGETS to script invocation 2023-03-22 12:49:05 -07:00
4a7116b996 partially restored prior commit to nail down problem with Clang x86 2023-03-22 20:16:09 +01:00
41584e73d9 partially reverted prior commit to nail down problem with Clang x86 2023-03-22 20:09:53 +01:00
52453cb5a4 Merge branch 'feature/cfoa' of https://github.com/boostorg/unordered into feature/cfoa 2023-03-22 19:25:10 +01:00
44b918896d tried relaxing atomic operations 2023-03-22 19:24:46 +01:00
ff356ac083 Fix typo in GHA ci.yml 2023-03-22 11:20:03 -07:00
3064801a89 Attempt to add tsan to GHA 2023-03-22 11:19:13 -07:00
e9d9f19e76 Flesh out insert_tests 2023-03-22 10:47:01 -07:00
9b85c38e37 Add rehash, add missing move in insert() 2023-03-22 10:46:19 -07:00
0b2829c793 hardened TSan detection 2023-03-21 20:03:35 +01:00
a9c2d1daa5 abode by TSan on SSE2 2023-03-21 19:41:55 +01:00
d29815b3a8 group-synchronized earlier in unprotected_norehash_emplace_or_visit 2023-03-21 14:47:43 +01:00
7ed7878278 fixed 3df435d4d3 fix 2023-03-21 11:50:21 +01:00
4c927cd2f2 Implement myriad insert() overloads, get first threaded test working 2023-03-20 16:00:54 -07:00
2fae05ed31 made concurrent_table use table_core's automatic capacity growth formula 2023-03-20 12:43:57 -07:00
41abb96d83 avoided sign conversion warning 2023-03-20 12:43:57 -07:00
63f51e7c41 fixed concurrent_table_arrays::delete_ 2023-03-20 12:43:57 -07:00
ba4f321934 removed unused typedef 2023-03-20 12:43:57 -07:00
68563fab72 removed unused typedef 2023-03-20 12:43:57 -07:00
d8e9503869 made table_arrays non-aggregate for the benefit of older compilers 2023-03-20 12:43:57 -07:00
86e998cbc7 fixed UB in dummy_group_accesses 2023-03-20 12:43:57 -07:00
ce722e4d56 avoided shadowing 2023-03-20 12:43:57 -07:00
77eaab4803 provided concurrent_table_arrays ctor to satisfy older compilers 2023-03-20 12:43:57 -07:00
96562f4c3b hardened non-embedded group_access 2023-03-20 12:43:57 -07:00
d66ceaf7fe avoided std::atomic_* aliases 2023-03-20 12:43:57 -07:00
2e44769247 added preliminary version of non-embedded group_access 2023-03-20 12:43:57 -07:00
e64fd45760 removed inefficient group15::match_really_occupied 2023-03-20 12:43:57 -07:00
454fc7501e extended shutting down VS C4324 warning 2023-03-20 12:43:57 -07:00
a89c62728a removed unnecessary mutable 2023-03-20 12:43:57 -07:00
1d8c0f91f8 avoided name hiding 2023-03-20 12:43:57 -07:00
25ba8e4dfc shut down VS C4324 warning 2023-03-20 12:43:57 -07:00
fb4437219f fixed memory ordering in atomic_integral 2023-03-20 12:43:57 -07:00
0d1fdae84c implemented safe concurrent_table::load_factor 2023-03-20 12:43:57 -07:00
c5debf11cf added explicit disabling/enabling of parallel algorithms 2023-03-20 12:43:57 -07:00
9e4f89aa43 Continue fleshing out insert_tests 2023-03-20 12:43:57 -07:00
12935eb695 Add minimal prototype of concurrent_flat_map 2023-03-20 12:43:57 -07:00
2386188d69 Relocate macros needed by test suite into detail/fwd.hpp 2023-03-20 12:43:57 -07:00
e4b32f7f5e Update rw_spinlock impl to mirror github.com/pdimov's impl 2023-03-20 12:43:57 -07:00
3df435d4d3 Temporarily suppress warning about memset'ing non-trivial types by using a constructor loop 2023-03-20 12:43:57 -07:00
ed076facc4 Stabilize ABI of cacheline_protected by hardcoding its alignment to 64 2023-03-20 12:43:57 -07:00
b09c5bdcf0 Add missing <execution> header 2023-03-20 12:43:57 -07:00
6abb94bb68 Silence unused variable warnings in for_all_elements_exec 2023-03-20 12:43:57 -07:00
d2b1f095c8 Update atomic_uint nsdmi to eschew potentially deleted copy constructor 2023-03-20 12:43:57 -07:00
3d34571654 tried yest another variation for for_all_elements_while 2023-03-20 12:43:57 -07:00
d683b3ac3e disabled use of match_really_occupied in for_all_elements_while 2023-03-20 12:43:57 -07:00
e16a8737f4 shut down GCC Winterference-size 2023-03-20 12:43:57 -07:00
8f348aea26 temporarily disabled parallel algorithms 2023-03-20 12:43:57 -07:00
9a8ba2bdff re-enabled match_really_occupied in for_all_elements_while 2023-03-20 12:43:57 -07:00
3aaefdcc78 completed concurrent_table's API 2023-03-20 12:43:57 -07:00
ca59ed8c50 avoided usage of match_really_occupied on for_all_elements_while (used by rehash) 2023-03-20 12:43:57 -07:00
ff78ef25c0 removed unnecessary forwards and captures 2023-03-20 12:43:57 -07:00
ec487b5c6c stylistic 2023-03-20 12:43:57 -07:00
0a03ed8170 weakened atomic_integral ops, fixed some trivial bugs 2023-03-20 12:43:57 -07:00
5881dcc2b2 done reverse unlock in multimutex 2023-03-20 12:43:57 -07:00
2070cbe2cc fixed regression in table_core(table_core&&) 2023-03-20 12:43:57 -07:00
8198b9c57c dropped erroneous call to user-provided f 2023-03-20 12:43:57 -07:00
c35e9fc631 made slot setting on insertion exception safe 2023-03-20 12:43:57 -07:00
f244ba55de switched from available to size_ 2023-03-20 12:43:57 -07:00
5e225fe46c micro-optimized reserve_available 2023-03-20 12:43:57 -07:00
06535e518e uploaded first draft of foa::concurrent_table 2023-03-20 12:43:57 -07:00
81584c22cf swapped member order in alloc_cted_insert_type to suppress padding warnings 2023-03-20 12:43:57 -07:00
83040211e8 recovered warninng supression pragmas 2023-03-20 12:43:56 -07:00
4ed301df97 refactored insert_type creation in emplace 2023-03-20 12:43:56 -07:00
8010f506a6 added SizeImpl and fixed some size arithmetic bugs 2023-03-20 12:43:56 -07:00
840ea1ce5c refactored some more for future concurrent_table 2023-03-20 12:43:56 -07:00
447306bfb9 stylistic 2023-03-20 12:43:56 -07:00
4569c1bec0 changed type of N to std::size_t 2023-03-20 12:43:56 -07:00
37ad547e18 more fixed sign issues in Neon ops 2023-03-20 12:43:56 -07:00
e037ee8d82 fixed syntax error 2023-03-20 12:43:56 -07:00
9bbadfdb34 fixed sign issues in Neon ops 2023-03-20 12:43:56 -07:00
c1b63f68c8 added missing op to plain_integral 2023-03-20 12:43:56 -07:00
0590e3bf8c typo 2023-03-20 12:43:56 -07:00
8f17f5f548 fixed static_assert 2023-03-20 12:43:56 -07:00
3a8bea9e1d parameterized group15 and core 2023-03-20 12:43:56 -07:00
b33b354818 extended caae8eb9ac9a47dd224b81f22efe8ea34b084d54 to rest of "using typename"s 2023-03-20 12:43:56 -07:00
b08837b93e added missing template keyword 2023-03-20 12:43:56 -07:00
b3b840df30 extended Wshadow supression to foa::table 2023-03-20 12:43:56 -07:00
2ef47f0813 reformulated using to workaround VS problem 2023-03-20 12:43:56 -07:00
27f5513911 published max_load_factor 2023-03-20 12:43:56 -07:00
a5100a9d35 fixed incomplete porting of PR187 2023-03-20 12:43:56 -07:00
ccbc639677 made table_core protected interface public 2023-03-20 12:43:56 -07:00
18725a682d fixed previous fix 2023-03-20 12:43:56 -07:00
dac1135199 fixed usage syntax for destroy_on_exit 2023-03-20 12:43:56 -07:00
ead55a8938 s/noexcept(...)/noexcept(noexcept(...)) 2023-03-20 12:43:56 -07:00
8f39001ff0 fixed trivial syntax error 2023-03-20 12:43:56 -07:00
8b056b902e split foa::table in table and core in preparation for foa::concurrent_table 2023-03-20 12:43:56 -07:00
5724adbbe9 Merge pull request #187 from boostorg/feature/foa_fast_iteration
Feature/foa fast iteration
2023-03-20 12:43:29 -07:00
1c5640cfbe s/BOOST_UNORDERED_ASSUME/BOOST_ASSERT 2023-03-08 19:12:46 +01:00
4d982e133e added is-not-end assumption on table_iterator::increment 2023-03-08 18:29:55 +01:00
1bf193b8fc updated release notes 2023-03-06 21:46:42 +01:00
7faec20f26 Merge branch 'feature/foa_fast_iteration' of https://github.com/boostorg/unordered into feature/foa_fast_iteration 2023-03-06 21:44:55 +01:00
ced8b45add fixed UB with begin when using fast iteration 2023-03-06 12:44:10 -08:00
15c9bc40f7 added fast table_iterator::increment variant for regular-layout groups 2023-03-06 12:44:10 -08:00
9aedb95296 Merge pull request #185 from boostorg/fix/uses-allocator 2023-03-06 21:38:13 +01:00
e56cb4418c Remove extraneous information from TypePolicy's construct, destroy docs 2023-03-06 09:48:26 -08:00
1ae21c6d1a Remove extraneous typedef from destroy_on_exit 2023-03-06 09:47:33 -08:00
82acad3794 Increase GHA timeout to 180 minutes 2023-03-06 17:04:06 +02:00
c50461528c fixed UB with begin when using fast iteration 2023-03-06 13:50:25 +01:00
bd08e49255 added fast table_iterator::increment variant for regular-layout groups 2023-03-06 11:56:49 +01:00
dbba3cec7b Add C++03 deprecation notice 2023-03-06 09:43:45 +02:00
6c5b5b3186 Update comments on type policy to include changes to construct, destroy and move 2023-03-03 11:33:32 -08:00
47dd02a4b3 Add bugfix notes to release notes 2023-03-03 11:18:41 -08:00
8429d1a6aa Refactor node_handle to directly store element_type by modularizing and extending it 2023-03-03 11:17:38 -08:00
86d3f9f632 Refactor move(init_type&) to handle defects in C++20 versions of libstdc++ for gcc versions <=12 2023-03-03 11:17:38 -08:00
48e92afd92 Refactor drop_guard into destroy_on_exit 2023-03-03 11:17:38 -08:00
5a5c31de35 Rename storage to uninitialized_storage 2023-03-03 11:17:38 -08:00
088941dc7b Clean up usage of Allocators for flat containers 2023-03-03 11:17:38 -08:00
5f6f1691e5 Format node_map 2023-03-03 11:17:38 -08:00
45d6c07be6 Update emplace() to no longer needlessly rebind its allocator 2023-03-03 11:17:38 -08:00
5c63cd2bdb Update drone to run using the same branches as listed in GHA's ci.yml 2023-03-03 11:17:38 -08:00
86318c1e88 Update foa to construct stack-locals with the user's Allocator during emplace() 2023-03-03 11:17:38 -08:00
0ff1fa0f6e Add test that ensures proper uses-allocator construction is followed 2023-03-03 11:17:38 -08:00
d90bf0c438 Merge pull request #186 from boostorg/cxx03-deprecation
Update changelog to reflect planned C++03 deprecation
2023-03-01 09:53:24 -08:00
dc63438e22 Add missing end-of-list marker to compliance section 2023-03-01 09:37:49 -08:00
0a3ac26f00 Update changelog to reflect planned C++03 deprecation 2023-02-28 15:44:44 -08:00
c64ed1caa3 Feature/SIMD config (#184)
* added BOOST_UNORDERED_[ENABLE|DISABLE]_[SSE2|LITTLE_ENDIAN_NEON]
* renamed and refactored
* removed #undefs of SIMD usage macros
2023-02-26 16:39:50 +01:00
efc33b18be Merge pull request #182 from boostorg/feature/unordered_node_map_docs
Feature/unordered node map docs
2023-02-25 10:20:05 +01:00
c189d8d5e8 updated boost::unordered_(flat|node)_map benchmarks 2023-02-25 10:03:10 +01:00
886227db3b updated link to P2363 2023-02-24 09:58:51 +01:00
719eb90d03 fixed copy&paste error 2023-02-24 08:59:45 +01:00
fadb686bc5 added boost::unordered_node_map to benchmarks 2023-02-23 20:17:01 +01:00
aebefaef0d Merge pull request #183 from boostorg/unordered_node_map_rc
Node Map Release Candidate
2023-02-22 08:39:59 -08:00
63a564e8ff Update foa comments for changes in TypePolicy 2023-02-21 11:12:33 -08:00
16c1593368 Remove extraneous copy constructor from flat set's type policy 2023-02-21 07:53:09 -08:00
53580a3070 Fix bug in hint-based overload for node_type insertion where elements were erroneously reallocated 2023-02-19 21:26:06 -08:00
d26aeed68f Update node_handle tests to cover address stability for inserted nodes when using the hint-based overloads 2023-02-19 21:26:06 -08:00
73eefd2b5d Rename Node{X}Types to TypePolicy in node-based foa containers 2023-02-19 21:26:06 -08:00
3df600d069 Remove extraneous construct() overloads from the flat foa-based containers 2023-02-19 21:26:06 -08:00
a1adacdfe2 Refactor erase_on_exit to use a const_iterator so callsites can avoid a const cast 2023-02-19 21:26:06 -08:00
f405fa9118 Rename foa's emplace_dispatch to emplace_value 2023-02-19 21:26:06 -08:00
7b5d6e7c29 Fix typos in code comments in foa 2023-02-19 21:26:06 -08:00
7d0ba7178e Clean up naming in delete_ impl to use storage_traits for foa 2023-02-19 21:26:06 -08:00
df5e2c3aca Remove extraneous commented out code from foa 2023-02-19 21:26:06 -08:00
343e344582 Reify implementation of node_handle's swap 2023-02-19 21:26:06 -08:00
34ed463bea Reify implementation of node_handle's move assignment operator 2023-02-19 21:26:06 -08:00
5986f75d16 Refactor node_handle's clear() member function to reset() 2023-02-19 21:26:06 -08:00
b08810c0c4 Add missing copyright notice to foa.hpp 2023-02-19 21:26:06 -08:00
7c608ae7bc Include missing extract tests in transparent_tests 2023-02-19 21:25:25 -08:00
d51cee35d5 updated open-addressing benchmark info 2023-02-18 12:31:26 +01:00
d0289b4c7b editorial 2023-02-18 12:13:14 +01:00
bc7ba9cb3b Implement internal foa updates + node_handle for node-based containers 2023-02-14 10:55:35 -08:00
6b10c8a4d3 Update unordered_flat_map for new type traits 2023-02-14 10:55:35 -08:00
b9805c7309 Update unordered_flat_set for new type traits 2023-02-14 10:55:35 -08:00
844460fd22 Add unordered_node_map 2023-02-14 10:55:35 -08:00
a600278d27 Add unordered_node_set 2023-02-14 10:55:35 -08:00
4398ffe8c9 Add foa-based node containers to node_handle_tests 2023-02-14 10:55:35 -08:00
eed1eeedeb Add foa-based node containers to extract_tests 2023-02-14 10:55:35 -08:00
8c0c230f78 Add foa-based node containers to the exception tests 2023-02-14 10:55:35 -08:00
e96ec1e79a Add foa-based node containers to transparent_tests 2023-02-14 10:55:35 -08:00
be7dd51fab Add foa-based node containers to swap_tests 2023-02-14 10:55:35 -08:00
4dec95840b Add foa-based node containers to simple_tests 2023-02-14 10:55:35 -08:00
d44fb36581 Add foa-based node containers to scoped_allocator tests 2023-02-14 10:55:35 -08:00
9d3bbe27db Add foa-based node containers to scary_tests 2023-02-14 10:55:35 -08:00
13ed4afc95 Add foa-based node containers to reserve_tests 2023-02-14 10:55:35 -08:00
b3f54e74a7 Add foa-based node containers to rehash_tests 2023-02-14 10:55:35 -08:00
d6374e2718 Add foa-based node containers to post_move_tests 2023-02-14 10:55:35 -08:00
74156b6b06 Add foa-based node containers to noexcept_tests 2023-02-14 10:55:35 -08:00
965048d3e6 Add foa-based node containers to move_tests 2023-02-14 10:55:35 -08:00
36dfe6b98b Add foa-based node containers to merge_tests 2023-02-14 10:55:35 -08:00
e4e89bdbde Add foa-based node containers to max_load_tests 2023-02-14 10:55:35 -08:00
85a9d8d81d Add foa-based node containers to load_factor_tests 2023-02-14 10:55:35 -08:00
b21ad13bbb Add foa-based node containers to link tests 2023-02-14 10:55:35 -08:00
f0d10308e3 Add foa-based node containers to insert_tests 2023-02-14 10:55:35 -08:00
f240e587cb Add foa-based node containers to insert_hint_tests 2023-02-14 10:55:35 -08:00
2a7dc9e40e Add foa-based node containers to init_type_insert_tests 2023-02-14 10:55:35 -08:00
99b8d0063b Add foa-based node containers to incomplete_test 2023-02-14 10:55:35 -08:00
c6aff9278a Add foa-based node containers to fwd_set_test 2023-02-14 10:55:35 -08:00
129497133e Add foa-based node containers to fwd_map_test 2023-02-14 10:55:35 -08:00
eaa9ff0cec Add foa-based node containers to find_tests 2023-02-14 10:55:35 -08:00
fa735864a3 Add foa-based node containers to erase_tests 2023-02-14 10:55:35 -08:00
0ce180e19b Add foa-based node containers to erase_if tests 2023-02-14 10:55:35 -08:00
e578b7eee3 Add foa-based node containers to equivalent_keys_tests 2023-02-14 10:55:35 -08:00
1844695b0c Add foa-based node containers to equality_tests 2023-02-14 10:55:35 -08:00
54b9adbdbc Add foa-based node containers to emplace_tests 2023-02-14 10:55:35 -08:00
8b71656cd7 Add foa-based node containers to copy_tests 2023-02-14 10:55:35 -08:00
a858ef5688 Add foa-based node containers to contains_tests 2023-02-14 10:55:35 -08:00
18395c8d21 Add foa-based node containers to constructor_tests 2023-02-14 10:55:35 -08:00
e68ec5c9a9 Add foa-based node containers to compile_set tests 2023-02-14 10:55:35 -08:00
d3b264345d Add foa-based node containers to compile_map tests 2023-02-14 10:55:35 -08:00
f1e1733c06 Add foa-based node containers to at_tests 2023-02-14 10:55:35 -08:00
66ffbdb881 Add foa-based node containers to assign_tests 2023-02-14 10:55:35 -08:00
f7f5466ed2 Add necessary #include's and typedefs for test suite to use foa-based node containers 2023-02-14 10:55:35 -08:00
83410fcabe Add -Wunused-template to tests run with the clang-14 toolset 2023-02-14 10:55:35 -08:00
1ee91d494d Fix bug in impl of test::exception::less::operator() 2023-02-14 10:55:35 -08:00
e8fe550d6c Add less_tests to track bug in test::exception::less::operator() impl 2023-02-14 10:55:35 -08:00
5b0fe7f655 Update test::compare_range to use BOOST_TEST_ALL_WITH 2023-02-14 10:55:35 -08:00
ba439437bf Add osx 12 to gha ci matrix 2023-02-14 10:55:35 -08:00
aa6eef135e editorial 2023-02-13 18:40:36 +01:00
1dd085daaa added unordered_node_[map|set] containers to the tutorial 2023-02-13 13:29:52 +01:00
2a8f50bcb7 added reference for unordered_node_set 2023-02-12 18:32:26 +01:00
866c58a879 typo 2023-02-12 17:35:02 +01:00
c9a75a56c2 added reference for unordered_node_map 2023-02-11 13:23:34 +01:00
e1861aa3d9 updated copyright notes 2023-02-11 13:23:12 +01:00
242c7cb93a updated release notes 2023-02-11 13:22:55 +01:00
0597463902 Merge pull request #181 from boostorg/feature/mulx_docs
Documented the new mulx-based mixing algorithm
2023-02-09 09:06:51 +01:00
14d80725eb documented the new mulx-based mixing algorithm 2023-02-08 20:07:23 +01:00
a74962bc3c Revert reversion of 32 bit mulx multiplier 2023-01-30 20:03:01 +02:00
cafa1f2278 Revert "Update mulx multipliers"
This reverts commit 9bc471310e.
2023-01-30 10:17:12 +02:00
40d5097d99 fixed sign-conversion warning in Neon group15::match 2023-01-28 10:27:40 +01:00
958aea3a61 Merge branch 'develop' into feature/mulx 2023-01-27 22:03:03 +02:00
6846eb53fd Change architecture of macOS 12.4 job to arm64 2023-01-27 21:24:28 +02:00
3b3ba7d6f7 Avoid false -Warray-bounds positive under mingw32 gcc-12 2023-01-27 20:35:14 +02:00
22135bd845 Merge branch 'develop' into feature/mulx 2023-01-27 18:39:46 +02:00
141550f585 Update cmake_subdir_test 2023-01-27 18:39:06 +02:00
d750b39e1e Fix /RTCc failure in mulx32 2023-01-27 18:37:23 +02:00
055587acf4 Update cmake_subdir_test 2023-01-27 17:56:00 +02:00
0f8dd003a3 Switch default mixing policy from xmx to mulx 2023-01-27 08:15:37 +02:00
9bc471310e Update mulx multipliers 2023-01-27 08:00:40 +02:00
e56aac2e98 Merge branch 'develop' into feature/mulx 2023-01-27 07:58:45 +02:00
09a3275357 Add /doc/pdf/ to .gitignore 2023-01-12 01:35:35 +02:00
a3c1e643dc Merge pull request #177 from cmazakas/feature/p2363
Feature/p2363
2022-12-20 10:55:20 -08:00
955f94350b typo 2022-12-20 16:46:08 +01:00
1955e4f36a fixed constraint notes in transparent insert with hint 2022-12-20 11:35:15 +01:00
644295db3a added release notes for feature/p2363 2022-12-19 13:24:04 -08:00
0391b6dafc documented P2363 overloads for unordered_flat_set 2022-12-19 13:24:04 -08:00
c646f3e3ca documented P2363 overloads for unordered_flat_map 2022-12-19 13:24:04 -08:00
0e9523a0a4 documented P2363 overloads for unordered_multiset 2022-12-19 13:24:04 -08:00
24d8449831 documented P2363 overloads for unordered_set 2022-12-19 13:24:04 -08:00
59d0accce0 documented P2363 overloads for unordered/unordered_multimap 2022-12-19 12:46:46 -08:00
61aedca940 documented P2363 overloads for unordered_map 2022-12-19 12:46:46 -08:00
3fb516367f Add transparent try_emplace() docs to unordered_map 2022-12-19 12:46:46 -08:00
7d77f1d478 Add transparent insert() overloads to unordered_[flat]_set 2022-12-19 12:46:46 -08:00
7572de875c Add transparent insert tests for set containers 2022-12-19 12:46:46 -08:00
63d907cde7 Merge pull request #174 from boostorg/feature/pr165_refactor
feature/pr165 refactor
2022-12-15 10:45:10 -08:00
f0037d336d added narrow_cast 2022-12-14 10:39:32 -08:00
8b14b7cddc Add tests for narrow_cast 2022-12-14 10:39:32 -08:00
6c60524fb7 Implement transparent bucket() 2022-12-13 14:28:19 -08:00
8b1dcd3da3 Add tests for transparent bucket() 2022-12-13 14:28:19 -08:00
0e980577b0 Add transparent at() 2022-12-13 14:28:19 -08:00
1f4244ec27 Add tests for transparent at() 2022-12-13 14:28:19 -08:00
dfbff823a9 Add transparent subscript 2022-12-13 14:28:19 -08:00
b85e17085f Add tests for transparent subscript operator 2022-12-13 14:28:19 -08:00
0a879c1063 Implement transparent insert_or_assign() 2022-12-13 14:28:19 -08:00
01d508b6af Improve naming in insert_or_assign() 2022-12-13 14:28:19 -08:00
7709950111 Add transparent insert_or_assign() tests 2022-12-13 14:28:19 -08:00
1ede59e662 Improve naming in are_transparent 2022-12-13 14:28:19 -08:00
bf2b521789 Add transparent try_emplace() 2022-12-13 14:28:19 -08:00
ee1515189b Add transparent tests for unordered_map's try_emplace() 2022-12-13 14:28:19 -08:00
eb33ad3e3f Merge pull request #173 from cmazakas/fix/exception-guarantees
Exception Guarantees
2022-12-13 14:22:29 -08:00
0ad6ccb0b9 Update FOA noexcept docs for move assignment, swap 2022-12-13 13:53:29 -08:00
0ab4e12502 Update noexcept tests for new FOA requirements 2022-12-13 13:53:29 -08:00
c8910e8007 Update FOA move assignment operator to uphold the strong guarantee for Hash, KeyEqual 2022-12-13 13:53:29 -08:00
2043f98593 Add strong exception guarantees around Hash, KeyEqual for move_assign_exception_tests 2022-12-13 13:53:29 -08:00
260b573d8d Update FOA implementation to exhibit strong guarantee for Hash, KeyEqual in copy assignment 2022-12-13 13:53:29 -08:00
4ac3dcc90c Update assign_exception_tests to assert strong guarantee around Hash, KeyEqual pairing 2022-12-13 13:53:29 -08:00
75ea43823e Update test Hash, KeyEqual to be nothrow swappable 2022-12-13 13:53:29 -08:00
b1d43d3ca5 Update FOA containers to require nothrow swappability of Hash, KeyEqual members and ensure that throwing assertions uphold strong guarantee 2022-12-13 13:53:29 -08:00
534170a942 Remove foa-related macro used for relaxing invariant checking in check_equivalent_keys 2022-12-13 13:53:29 -08:00
7befee3bd6 Update swap_exception_tests to exclude FOA containers and add test for throwing asserts when comparing allocators 2022-12-13 13:53:29 -08:00
01deb2fd61 Merge pull request #176 from boostorg/feature/foa_fast_copy_fix
feature/foa fast copy fix
2022-12-13 13:52:59 -08:00
91eddbabe8 restricted memcpy to allocators known to not have fancy construct() 2022-12-13 09:35:28 -08:00
47e205487d Fix potential integer overflow in test::hash<int> 2022-12-13 09:35:28 -08:00
2c1c99407e Update copy_tests to test a trivially copyable value_type with an Allocator with defined construct() 2022-12-13 09:35:28 -08:00
6be2bf89b6 Merge pull request #175 from boostorg/feature/optimized_try_emplace
feature/optimized_try_emplace
2022-12-13 09:24:56 +01:00
5eda445db0 optimized try_emplace and extended it for future use in boost::unordered_flat_set heterogeneous insert 2022-12-11 18:49:21 +01:00
63f07daa88 Merge pull request #172 from boostorg/feature/foa_fast_copy
feature/foa fast copy
2022-12-09 10:05:54 -08:00
7040c57750 Add mulx_mix 2022-12-08 21:43:57 +02:00
9716731864 Disable benchmark/uint64.cpp under libstdc++ 32 bit 2022-12-03 15:37:22 +02:00
0bcd46a485 Use enwik8 instead of enwik9 in benchmarks under 32 bit 2022-12-03 15:32:04 +02:00
46a2cd109f Define _SILENCE_CXX20_CISO646_REMOVED_WARNING in benchmarks 2022-12-01 01:34:00 +02:00
808f8e659a Remove tsl maps from benchmarks 2022-12-01 01:30:54 +02:00
8ed05de91c Add ankerl::unordered_dense::map to benchmarks 2022-12-01 00:50:29 +02:00
1a02fca5c4 Add benchmark/.gitignore 2022-11-29 18:14:52 +02:00
d036994237 Merge pull request #165 from cmazakas/fix/msvc-rtc
Add msvc RTC to select test targets
2022-11-28 09:09:14 -08:00
8d4816eac7 Merge pull request #170 from boostorg/feature/foa_data_structure_docs
added data structure docs
2022-11-28 08:45:05 -08:00
46fc4f9f4d typos 2022-11-28 17:42:13 +01:00
725993ab95 typo 2022-11-28 17:37:13 +01:00
ffa5e6f805 typos 2022-11-27 19:39:07 +01:00
84206ebf8f Add test_contains, test_count to benchmark/word_count.cpp 2022-11-25 19:05:28 +02:00
0398afae9b Add BOOST_FORCEINLINE to unordered_flat_set::contains, unordered_flat_map::contains. Refs #168. 2022-11-25 18:01:39 +02:00
79dc3bb6d4 Add BOOST_FORCEINLINE to unordered_flat_set::count, unordered_flat_map::count 2022-11-25 17:57:06 +02:00
879de5fab8 Add BOOST_FORCEINLINE to unordered_flat_map::operator[] 2022-11-25 17:50:05 +02:00
89ccb49165 Add an iteration step to benchmark/word_size.cpp 2022-11-25 02:05:50 +02:00
70a980a980 Add word size count benchmark 2022-11-25 01:49:11 +02:00
c895dd7192 Add word count benchmark 2022-11-25 01:28:25 +02:00
ea71597053 Remove multi_index from benchmarks 2022-11-25 00:52:31 +02:00
324fa793fd expanded 1.81 release notes 2022-11-24 20:06:18 +01:00
39d53a0bfc added "Open Addressing Implementation" section 2022-11-24 20:06:05 +01:00
20ea4a77a7 Add RTC msvc jobs to GHA CI 2022-11-22 10:33:32 -08:00
53a897008a Add conditional masking to silence msvc RTC failures 2022-11-22 10:26:08 -08:00
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
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
108d4535e0 Merge pull request #161 from cmazakas/fix/ctad
Complete deduction tests, implement guides for all containers
2022-11-08 15:27:27 +02:00
2102031b93 Implement deduction guides for unordered_flat_set 2022-11-07 15:55:29 -08:00
5b92827b68 Implement deduction guides for unordered_flat_map 2022-11-07 15:55:29 -08:00
e2f4303319 Add FOA-specific default bucket count for CTAD purposes 2022-11-07 15:55:29 -08:00
c37081b4a2 Add deduction tests for flat containers 2022-11-07 15:55:29 -08:00
fd48672fd1 Implement deduction guides for unordered_[multi]set 2022-11-07 15:55:29 -08:00
530437c21b Implement deduction guides for unordered_[multi]map 2022-11-07 15:55:29 -08:00
2949b37490 Flesh out deduction_tests to include unordered_[multi]set, update to use BOOST_TEST_TRAIT_SAME 2022-11-07 15:55:29 -08:00
867e60113b Add SFINAE helpers to type_traits.hpp 2022-11-07 15:55:29 -08:00
551456c0c5 typo in section name 2022-11-07 21:25:15 +02:00
7857582ea2 Merge branch 'develop' into feature/foa_rc_docs 2022-11-07 21:24:55 +02:00
1d99854979 worked around missing std::is_trivially_copy_constructible in GCC<=4.9 2022-11-07 17:41:47 +01:00
e482947b20 Updated 1.81 documentation (#155)
* [skip CI] added first draft of unordered_flat_map.adoc

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

* uploaded current status

* uploaded current status

* updated boost::unordered_set benchmark images

* typos

* relinked boost_unordered_benchmarks

* editorial

* fixed max_load docs

* documented ctors added in #160
2022-11-07 17:11:15 +01:00
5a4071d4f0 silenced bogus CGG warning 2022-11-07 13:47:43 +01:00
c30e93544d implemented copy_elements_from with fast branch, introduced for_all_elements_while 2022-11-07 12:31:26 +01:00
99bd9d9d31 Update ci.yml 2022-11-05 20:24:40 +02:00
4310809025 Implement missing constructors outlined by LWG issue 2713 (#160)
* Harden initializer_list constructor tests

* Add tests for constructors as specified in LWG issue 2713

* Add missing constructors to unordered_flat_map

* Add missing constructors to unordered_flat_set

* Add missing constructors to unordered_[multi]map

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

* stylistic

* adjusted hysteresis factor in unchecked_emplace_with_rehash

* added public max_load

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

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,102 @@ 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: MinGW-w64 (32 bit, C++11)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_CXXFLAGS: -g0 # Reduce compiler's memory consumption
B2_CXXSTD: 11
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: MinGW-w64 (32 bit, C++14)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_CXXFLAGS: -g0 # Reduce compiler's memory consumption
B2_CXXSTD: 14
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: MinGW-w64 (32 bit, C++17)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_CXXFLAGS: -g0 # Reduce compiler's memory consumption
B2_CXXSTD: 17
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: MinGW-w64 (32 bit, C++2a)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
B2_CXXFLAGS: -g0 # Reduce compiler's memory consumption
B2_CXXSTD: 2a
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 32
- FLAVOR: MinGW-w64 (64 bit, C++11)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
B2_CXXSTD: 11
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64
- FLAVOR: MinGW-w64 (64 bit, C++14)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
B2_CXXSTD: 14
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64
- FLAVOR: MinGW-w64 (64 bit, C++17)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
B2_CXXSTD: 17
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64
- FLAVOR: MinGW-w64 (64 bit, C++2a)
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
B2_CXXSTD: 2a
B2_TOOLSET: gcc
B2_ADDRESS_MODEL: 64
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
.codecov.yml Normal file
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/**/*

510
.drone.jsonnet Normal file
View File

@ -0,0 +1,510 @@
# 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/*", "fix/*", "pr/*" ]
};
local ubsan = { UBSAN: '1', UBSAN_OPTIONS: 'print_stacktrace=1' };
local asan = { ASAN: '1' };
local tsan = { TSAN: '1' };
local linux_pipeline(name, image, environment, packages = "", sources = [], arch = "amd64") =
{
name: name,
kind: "pipeline",
type: "docker",
trigger: triggers,
platform:
{
os: "linux",
arch: arch
},
steps:
[
{
name: "everything",
image: image,
environment: environment,
privileged: true,
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.8* 32/64",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.8', CXXSTD: '11', ADDRMD: '32,64' },
"g++-4.8-multilib",
),
linux_pipeline(
"Linux 14.04 GCC 4.9 32/64",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-4.9', CXXSTD: '11', ADDRMD: '32,64' },
"g++-4.9-multilib",
),
linux_pipeline(
"Linux 16.04 GCC 5* 32/64",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 18.04 GCC 6 32/64",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-6', CXXSTD: '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: '11,14,17', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 18.04 GCC 8 32/64 (11)",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-8', CXXSTD: '11', ADDRMD: '32,64' },
"g++-8-multilib",
),
linux_pipeline(
"Linux 18.04 GCC 8 32/64 (14,17)",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-8', CXXSTD: '14,17', ADDRMD: '32,64' },
"g++-8-multilib",
),
linux_pipeline(
"Linux 20.04 GCC 9* 32/64 (11,14)",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 20.04 GCC 9* 32/64 (17,2a)",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '17,2a', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 20.04 GCC 9* ARM64",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14,17,2a' },
arch="arm64",
),
linux_pipeline(
"Linux 20.04 GCC 9* S390x (11,14)",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14' },
arch="s390x",
),
linux_pipeline(
"Linux 20.04 GCC 9* S390x (17,2a)",
"cppalliance/droneubuntu2004:multiarch",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '17,2a' },
arch="s390x",
),
linux_pipeline(
"Linux 20.04 GCC 10 32/64 (11,14)",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-10', CXXSTD: '11,14', ADDRMD: '32,64' },
"g++-10-multilib",
),
linux_pipeline(
"Linux 20.04 GCC 10 32/64 (17,20)",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-10', CXXSTD: '17,20', ADDRMD: '32,64' },
"g++-10-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 11* 32/64 (11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 22.04 GCC 11* 32/64 (17,2a)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '17,2a', ADDRMD: '32,64' },
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '11', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '14', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (17)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '17', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (20)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '20', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 32 ASAN (2b)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '2b', ADDRMD: '32' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN (11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '11,14', ADDRMD: '64' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN (17)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '17', ADDRMD: '64' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN (20)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '20', ADDRMD: '64' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 ASAN (2b)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '2b', ADDRMD: '64' } + asan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 22.04 GCC 12 64 TSAN (11,14,17,20,2b)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '11,14,17,20,2b', ADDRMD: '64', TARGET: 'libs/unordered/test//cfoa_tests' } + tsan,
"g++-12-multilib",
),
linux_pipeline(
"Linux 23.04 GCC 13 32/64 (11,14)",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '11,14', ADDRMD: '32,64' },
"g++-13 g++-13-multilib",
),
linux_pipeline(
"Linux 23.04 GCC 13 32/64 (17,20,2b)",
"cppalliance/droneubuntu2404:1",
{ TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '17,20,2b', ADDRMD: '32,64' },
"g++-13 g++-13-multilib",
),
linux_pipeline(
"Linux 16.04 Clang 3.5",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.5', CXXSTD: '11' },
"clang-3.5",
),
linux_pipeline(
"Linux 16.04 Clang 3.6",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.6', CXXSTD: '11,14' },
"clang-3.6",
),
linux_pipeline(
"Linux 16.04 Clang 3.7",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.7', CXXSTD: '11,14' },
"clang-3.7",
),
linux_pipeline(
"Linux 16.04 Clang 3.8",
"cppalliance/droneubuntu1604:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.8', CXXSTD: '11,14' },
"clang-3.8",
),
linux_pipeline(
"Linux 18.04 Clang 3.9",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-3.9', CXXSTD: '11,14' },
"clang-3.9",
),
linux_pipeline(
"Linux 18.04 Clang 4.0",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-4.0', CXXSTD: '11,14' },
"clang-4.0",
),
linux_pipeline(
"Linux 18.04 Clang 5.0",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-5.0', CXXSTD: '11,14,1z' },
"clang-5.0",
),
linux_pipeline(
"Linux 18.04 Clang 6.0",
"cppalliance/droneubuntu1804:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-6.0', CXXSTD: '11,14,17' },
"clang-6.0",
),
linux_pipeline(
"Linux 20.04 Clang 7",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-7', CXXSTD: '11,14,17' },
"clang-7",
),
linux_pipeline(
"Linux 20.04 Clang 8",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-8', CXXSTD: '11,14,17' },
"clang-8",
),
linux_pipeline(
"Linux 20.04 Clang 9",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-9', CXXSTD: '11,14,17,2a' },
"clang-9",
),
linux_pipeline(
"Linux 20.04 Clang 10",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-10', CXXSTD: '11,14,17,2a' },
"clang-10",
),
linux_pipeline(
"Linux 20.04 Clang 11",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-11', CXXSTD: '11,14,17,2a' },
"clang-11",
),
linux_pipeline(
"Linux 20.04 Clang 12",
"cppalliance/droneubuntu2004:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-12', CXXSTD: '11,14,17,2a' },
"clang-12",
),
linux_pipeline(
"Linux 22.04 Clang 13",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-13', CXXSTD: '11,14,17,20' },
"clang-13",
),
linux_pipeline(
"Linux 22.04 Clang 14 UBSAN (11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '11,14' } + ubsan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 UBSAN (17,20)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '17,20' } + ubsan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 ASAN (11,14)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '11,14' } + asan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 ASAN (17,20)",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '17,20' } + asan,
"clang-14",
),
linux_pipeline(
"Linux 22.04 Clang 14 libc++ 64 TSAN",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-14', ADDRMD: '64', TARGET: 'libs/unordered/test//cfoa_tests', CXXSTD: '11,14,17,20', STDLIB: 'libc++' } + tsan,
"clang-14 libc++-14-dev libc++abi-14-dev",
),
linux_pipeline(
"Linux 22.04 Clang 15",
"cppalliance/droneubuntu2204:1",
{ TOOLSET: 'clang', COMPILER: 'clang++-15', CXXSTD: '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 (11)",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '11' } + ubsan,
),
macos_pipeline(
"MacOS 10.15 Xcode 12.2 UBSAN (14)",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '14' } + ubsan,
),
macos_pipeline(
"MacOS 10.15 Xcode 12.2 UBSAN (1z)",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '1z' } + ubsan,
),
macos_pipeline(
"MacOS 12.4 Xcode 13.4.1 ASAN",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '11,14,1z' } + asan,
xcode_version = "13.4.1", osx_version = "monterey", arch = "arm64",
),
macos_pipeline(
"MacOS 12.4 Xcode 13.4.1 TSAN",
{ TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '11,14,1z', TARGET: 'libs/unordered/test//cfoa_tests' } + tsan,
xcode_version = "13.4.1", osx_version = "monterey", arch = "arm64",
),
windows_pipeline(
"Windows VS2015 msvc-14.0",
"cppalliance/dronevs2015",
{ TOOLSET: 'msvc-14.0', CXXSTD: '14,latest', 'B2_DONT_EMBED_MANIFEST': 1 },
),
windows_pipeline(
"Windows VS2017 msvc-14.1",
"cppalliance/dronevs2017",
{ TOOLSET: 'msvc-14.1', CXXSTD: '14,17,latest', ADDRMD: '32,64' },
),
windows_pipeline(
"Windows VS2017 msvc-14.1 permissive-",
"cppalliance/dronevs2017",
{ TOOLSET: 'msvc-14.1', CXXSTD: '14,17', CXXFLAGS: '/permissive-' },
),
windows_pipeline(
"Windows VS2019 msvc-14.2",
"cppalliance/dronevs2019",
{ TOOLSET: 'msvc-14.2', CXXSTD: '14,17,20,latest' },
),
windows_pipeline(
"Windows VS2019 msvc-14.2 permissive-",
"cppalliance/dronevs2019",
{ TOOLSET: 'msvc-14.2', CXXSTD: '14,17', CXXFLAGS: '/permissive-' },
),
windows_pipeline(
"Windows VS2022 msvc-14.3",
"cppalliance/dronevs2022:1",
{ TOOLSET: 'msvc-14.3', CXXSTD: '14,17,20,latest' },
),
windows_pipeline(
"Windows VS2022 msvc-14.3 permissive-",
"cppalliance/dronevs2022:1",
{ TOOLSET: 'msvc-14.3', CXXSTD: '14,17', CXXFLAGS: '/permissive-' },
),
]

24
.drone/drone.bat Normal file
View File

@ -0,0 +1,24 @@
@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%
if not "%CXXFLAGS%" == "" set CXXFLAGS=cxxflags=%CXXFLAGS%
b2 --abbreviate-paths -j3 libs/%LIBRARY%/test toolset=%TOOLSET% %CXXSTD% %ADDRMD% %CXXFLAGS% variant=debug,release embed-manifest-via=linker

32
.drone/drone.sh Executable file
View File

@ -0,0 +1,32 @@
#!/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
: ${TARGET:="libs/$LIBRARY/test"}
DRONE_BUILD_DIR=$(pwd)
BOOST_BRANCH=develop
if [ "$DRONE_BRANCH" = "master" ]; then BOOST_BRANCH=master; fi
if [[ $(uname) == "Linux" && ( "$TSAN" == 1 || "$ASAN" == 1 ) ]]; then
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
sudo sysctl vm.mmap_rnd_bits=28
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 $TARGET toolset=$TOOLSET cxxstd=$CXXSTD variant=debug,release ${ADDRMD:+address-model=$ADDRMD} ${STDLIB:+stdlib=$STDLIB} ${UBSAN:+undefined-sanitizer=norecover debug-symbols=on} ${ASAN:+address-sanitizer=norecover debug-symbols=on} ${TSAN:+thread-sanitizer=norecover debug-symbols=on} ${LINKFLAGS:+linkflags=$LINKFLAGS}

464
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,464 @@
# 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:
runner-selection:
# runs-on: ubuntu-latest
runs-on: ${{ github.repository_owner == 'boostorg' && fromJSON('[ "self-hosted", "linux", "x64", "ubuntu-latest-aws" ]') || 'ubuntu-latest' }}
outputs:
labelmatrix: ${{ steps.aws_hosted_runners.outputs.labelmatrix }}
steps:
- name: AWS Hosted Runners
id: aws_hosted_runners
uses: cppalliance/aws-hosted-runners@v1.0.0
posix:
defaults:
run:
shell: bash
strategy:
fail-fast: false
matrix:
include:
# Linux, gcc
- { compiler: gcc-7, cxxstd: '11,14,17', os: 'ubuntu-20.04', install: 'g++-7' }
- { compiler: gcc-8, cxxstd: '11,14,17', os: 'ubuntu-20.04', install: 'g++-8' }
- { compiler: gcc-9, cxxstd: '11,14,17', os: 'ubuntu-22.04', install: 'g++-9' }
- { compiler: gcc-10, cxxstd: '11,14,17,20', os: 'ubuntu-22.04', install: 'g++-10' }
- { compiler: gcc-11, cxxstd: '11,14,17,20', os: 'ubuntu-22.04', install: 'g++-11' }
- { compiler: gcc-12, cxxstd: '11,14,17,20', os: 'ubuntu-22.04', install: 'g++-12' }
- { compiler: gcc-13, cxxstd: '11,14,17,20', os: 'ubuntu-24.04', install: 'g++-13' }
- { compiler: gcc-14, cxxstd: '11,14,17,20', os: 'ubuntu-24.04', install: 'g++-14' }
- { name: "gcc-14 w/ sanitizers (11)", sanitize: yes,
compiler: gcc-14, cxxstd: '11', os: 'ubuntu-24.04', install: 'g++-14', ccache_key: "san1" }
- { name: "gcc-14 w/ sanitizers (14)", sanitize: yes,
compiler: gcc-14, cxxstd: '14', os: 'ubuntu-24.04', install: 'g++-14', ccache_key: "san1" }
- { name: "gcc-14 w/ sanitizers (17)", sanitize: yes,
compiler: gcc-14, cxxstd: '17', os: 'ubuntu-24.04', install: 'g++-14', ccache_key: "san2" }
- { name: "gcc-14 w/ sanitizers (20)", sanitize: yes,
compiler: gcc-14, cxxstd: '20', os: 'ubuntu-24.04', install: 'g++-14', ccache_key: "san2" }
- { name: "gcc-14 w/ sanitizers (2b)", sanitize: yes,
compiler: gcc-14, cxxstd: '2b', os: 'ubuntu-24.04', install: 'g++-14', ccache_key: "san2" }
- { name: Collect coverage, coverage: yes,
compiler: gcc-14, cxxstd: '20', os: 'ubuntu-24.04', install: 'g++-14 g++-14-multilib', address-model: '32,64', ccache_key: "cov" }
- { name: "cfoa tsan (gcc-14)", cxxstd: '11,14,17,20,2b', os: 'ubuntu-24.04', install: 'g++-14', compiler: gcc-14,
targets: 'libs/unordered/test//cfoa_tests', thread-sanitize: yes, ccache_key: "tsan" }
# Linux, clang, libc++
- { compiler: clang-7, cxxstd: '11,14,17', os: 'ubuntu-20.04', stdlib: libc++, install: 'clang-7 libc++-7-dev libc++abi-7-dev' }
- { compiler: clang-10, cxxstd: '11,14,17,20', os: 'ubuntu-20.04', stdlib: libc++, install: 'clang-10 libc++-10-dev libc++abi-10-dev' }
- { compiler: clang-11, cxxstd: '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 (11,14)", sanitize: yes,
compiler: clang-12, cxxstd: '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)", sanitize: yes,
compiler: clang-12, cxxstd: '17', os: 'ubuntu-20.04', stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev', ccache_key: "san2" }
- { name: "clang-12 w/ sanitizers (20)", sanitize: yes,
compiler: clang-12, cxxstd: '20', os: 'ubuntu-20.04', stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev', ccache_key: "san2" }
- { name: "clang-12 w/ sanitizers (2b)", sanitize: yes,
compiler: clang-12, cxxstd: '2b', os: 'ubuntu-20.04', stdlib: libc++, install: 'clang-12 libc++-12-dev libc++abi-12-dev', ccache_key: "san2" }
- { compiler: 'clang-13', cxxstd: '11,14', os: 'ubuntu-22.04', stdlib: libc++, install: 'clang-13 libc++-13-dev libc++abi-13-dev' }
- { compiler: 'clang-13', cxxstd: '17,20,2b', os: 'ubuntu-22.04', stdlib: libc++, install: 'clang-13 libc++-13-dev libc++abi-13-dev' }
- { compiler: 'clang-14', cxxstd: '11,14', os: 'ubuntu-22.04', stdlib: libc++, install: 'clang-14 libc++-14-dev libc++abi-14-dev' }
- { compiler: 'clang-14', cxxstd: '17,20,2b', os: 'ubuntu-22.04', stdlib: libc++, install: 'clang-14 libc++-14-dev libc++abi-14-dev' }
- { compiler: 'clang-15', cxxstd: '11,14', os: 'ubuntu-22.04', stdlib: libc++, install: 'clang-15 libc++-15-dev libc++abi-15-dev' }
- { compiler: 'clang-15', cxxstd: '17,20,2b', os: 'ubuntu-22.04', stdlib: libc++, install: 'clang-15 libc++-15-dev libc++abi-15-dev' }
- { compiler: 'clang-16', cxxstd: '11,14', os: 'ubuntu-24.04', stdlib: libc++, install: 'clang-16 libc++-16-dev libc++abi-16-dev' }
- { compiler: 'clang-16', cxxstd: '17,20,2b', os: 'ubuntu-24.04', stdlib: libc++, install: 'clang-16 libc++-16-dev libc++abi-16-dev' }
- { compiler: 'clang-17', cxxstd: '11,14', os: 'ubuntu-24.04', stdlib: libc++, install: 'clang-17 libc++-17-dev libc++abi-17-dev' }
- { compiler: 'clang-17', cxxstd: '17,20,2b', os: 'ubuntu-24.04', stdlib: libc++, install: 'clang-17 libc++-17-dev libc++abi-17-dev' }
- { compiler: 'clang-18', cxxstd: '11,14', os: 'ubuntu-24.04', stdlib: libc++, install: 'clang-18 libc++-18-dev libc++abi-18-dev' }
- { compiler: 'clang-18', cxxstd: '17,20,2b', os: 'ubuntu-24.04', stdlib: libc++, install: 'clang-18 libc++-18-dev libc++abi-18-dev' }
# not using libc++ because of https://github.com/llvm/llvm-project/issues/52771
- { name: "clang-18 w/ sanitizers (11,14)", sanitize: yes,
compiler: clang-18, cxxstd: '11,14', os: 'ubuntu-24.04', ccache_key: "san1" }
- { name: "clang-18 w/ sanitizers (17)", sanitize: yes,
compiler: clang-18, cxxstd: '17', os: 'ubuntu-24.04', ccache_key: "san2" }
- { name: "clang-18 w/ sanitizers (20)", sanitize: yes,
compiler: clang-18, cxxstd: '20', container: 'ubuntu:24.04', os: 'ubuntu-latest', ccache_key: "san2" }
- { name: "clang-18 w/ sanitizers (2b)", sanitize: yes,
compiler: clang-18, cxxstd: '2b', container: 'ubuntu:24.04', os: 'ubuntu-latest', ccache_key: "san2" }
- { name: "cfoa tsan (clang-18)", cxxstd: '11,14,17,20,2b', os: 'ubuntu-24.04', compiler: clang-18,
targets: 'libs/unordered/test//cfoa_tests', thread-sanitize: yes,
stdlib: libc++, install: 'clang-18 libc++-18-dev libc++abi-18-dev', ccache_key: "tsan" }
# OSX, clang
- { compiler: clang, cxxstd: '11,14,17,20,2b', os: 'macos-13', sanitize: yes, ccache_key: "san1" }
- { compiler: clang, cxxstd: '11,14,17,20,2b', os: 'macos-13', thread-sanitize: yes, targets: 'libs/unordered/test//cfoa_tests', ccache_key: "tsan" }
- { compiler: clang, cxxstd: '11,14,17,20,2b', os: 'macos-14' }
- { compiler: clang, cxxstd: '11,14,17,20,2b', os: 'macos-15' }
timeout-minutes: 360
# posix (gcc-12 w/ sanitizers is taking longer than 210 minutes
# timeout-minutes: 210
needs: [runner-selection]
runs-on: ${{ fromJSON(needs.runner-selection.outputs.labelmatrix)[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-is-python3 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_TSAN: ${{matrix.thread-sanitize}}
B2_TARGETS: ${{matrix.targets}}
B2_STDLIB: ${{matrix.stdlib}}
# More entries can be added in the same way, see the B2_ARGS assignment in ci/enforce.sh for the possible keys.
# B2_DEFINES: ${{matrix.defines}}
# 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: |
if [[ ${B2_TSAN} == "yes" ]] && [[ $(uname) == "Linux" ]]; then
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
sudo sysctl vm.mmap_rnd_bits=28
fi
B2_TARGETS=${{matrix.targets}} ci/build.sh
- name: Upload coverage
if: matrix.coverage
run: ci/codecov.sh "upload"
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- 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', addrmd: '32,64', os: 'windows-2019', variant: 'debug,release' }
- { toolset: msvc-14.2, cxxstd: '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: msvc-14.3, cxxstd: '14,17', addrmd: '32,64', os: 'windows-2022', variant: 'debug,release', cxxflags: '/permissive-' }
- { toolset: clang-win, cxxstd: '14,17,latest', addrmd: '32,64', os: 'windows-2022', variant: 'debug,release' }
- { toolset: clang-win, cxxstd: '14,17,latest', addrmd: '32,64', os: 'windows-2025', variant: 'debug,release' }
- { toolset: msvc-14.3, cxxstd: '14,17,20,latest', addrmd: '32,64', os: 'windows-2025', variant: 'debug,release' }
- { toolset: gcc, cxxstd: '11,14,17,2a', addrmd: '64', os: 'windows-2019', variant: 'debug,release' }
needs: [runner-selection]
runs-on: ${{ fromJSON(needs.runner-selection.outputs.labelmatrix)[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: '11,17,20', variant: 'release' }
- { sys: MINGW64, compiler: gcc, cxxstd: '11,17,20', variant: 'debug,release' }
needs: [runner-selection]
runs-on: ${{ fromJSON(needs.runner-selection.outputs.labelmatrix)['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}}
B2_VARIANT: ${{matrix.variant}}
run: ci/github/install.sh
- name: Run tests
env:
B2_VARIANT: ${{matrix.variant}}
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
needs: [runner-selection]
runs-on: ${{ fromJSON(needs.runner-selection.outputs.labelmatrix)[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
.gitignore vendored
View File

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

41
CMakeLists.txt Normal file
View File

@ -0,0 +1,41 @@
# 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.8...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::mp11
Boost::predef
Boost::throw_exception
)
if(CMAKE_VERSION VERSION_GREATER 3.18 AND CMAKE_GENERATOR MATCHES "Visual Studio")
file(GLOB_RECURSE boost_unordered_IDEFILES CONFIGURE_DEPENDS include/*.hpp)
source_group(TREE ${PROJECT_SOURCE_DIR}/include FILES ${boost_unordered_IDEFILES} PREFIX "Header Files")
list(APPEND boost_unordered_IDEFILES extra/boost_unordered.natvis)
target_sources(boost_unordered PRIVATE ${boost_unordered_IDEFILES})
endif()
target_compile_features(boost_unordered INTERFACE cxx_std_11)
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
add_subdirectory(test)
endif()

23
LICENSE Normal file
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.

79
README.md Normal file
View File

@ -0,0 +1,79 @@
# Boost.Unordered
[![Branch](https://img.shields.io/badge/branch-master-brightgreen.svg)](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) [![Drone status](https://img.shields.io/drone/build/boostorg/unordered/master?server=https%3A%2F%2Fdrone.cpp.al&logo=drone&logoColor=%23CCCCCC&label=CI)](https://drone.cpp.al/boostorg/unordered) [![Build status](https://img.shields.io/appveyor/build/cppalliance/unordered/master?logo=appveyor&label=CI)](https://ci.appveyor.com/project/cppalliance/unordered/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/index.html) [![Enter the Matrix](https://img.shields.io/badge/matrix-master-brightgreen.svg)](http://www.boost.org/development/tests/master/developer/unordered.html)<br/>
[![Branch](https://img.shields.io/badge/branch-develop-brightgreen.svg)](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) [![Drone status](https://img.shields.io/drone/build/boostorg/unordered/develop?server=https%3A%2F%2Fdrone.cpp.al&logo=drone&logoColor=%23CCCCCC&label=CI)](https://drone.cpp.al/boostorg/unordered) [![Build status](https://img.shields.io/appveyor/build/cppalliance/unordered/develop?logo=appveyor&label=CI)](https://ci.appveyor.com/project/cppalliance/unordered/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/index.html) [![Enter the Matrix](https://img.shields.io/badge/matrix-develop-brightgreen.svg)](http://www.boost.org/development/tests/develop/developer/unordered.html)<br/>
[![BSL 1.0](https://img.shields.io/badge/license-BSL_1.0-blue.svg)](https://www.boost.org/users/license.html) <img alt="C++11 required" src="https://img.shields.io/badge/standard-C%2b%2b11-blue.svg"> <img alt="Header-only library" src="https://img.shields.io/badge/build-header--only-blue.svg">
Boost.Unordered offers a catalog of hash containers with different standards compliance levels, performances and intented usage scenarios:
**`boost::unordered_set` `boost::unordered_map` `boost::unordered_multiset` `boost::unordered_multimap`**
<ul>Fully conformant implementations of <code>std::unordered_[multi](set|map)</code>,
but faster and up to the latest revisions of the standard even if you're working in an older version of C++ (heterogeneous lookup,
<code>try_emplace</code>, <code>contains</code>, etc.)</ul>
**`boost::unordered_flat_set` `boost::unordered_flat_map`**
<ul>The fastest of the lot. Based on open addressing, these containers slightly
deviate from the standard in exchange for top performance.</ul>
**`boost::unordered_node_set` `boost::unordered_node_map`**
<ul>Variations of <code>boost::unordered_flat_(set|map)</code> providing pointer stability.</ul>
**`boost::concurrent_flat_set` `boost::concurrent_flat_map`**
<ul>High performance for multithreaded scenarios. Introducing a new non-standard, iterator-free API.</ul>
**`boost::concurrent_node_set` `boost::concurrent_node_map`**
<ul>Variations of <code>boost::concurrent_flat_(set|map)</code> providing pointer stability.</ul>
## Learn about Boost.Unordered
* [Online documentation](https://boost.org/libs/unordered)
* [Some benchmarks](https://github.com/boostorg/boost_unordered_benchmarks)
* Technical articles on Boost.Unordered internal design:
* [Advancing the state of the art for `std::unordered_map` implementations](https://bannalia.blogspot.com/2022/06/advancing-state-of-art-for.html)
* [Inside `boost::unordered_flat_map`](https://bannalia.blogspot.com/2022/11/inside-boostunorderedflatmap.html)
* [Inside `boost::concurrent_flat_map`](https://bannalia.blogspot.com/2023/07/inside-boostconcurrentflatmap.html)
* [Bulk visitation in `boost::concurrent_flat_map`](https://bannalia.blogspot.com/2023/10/bulk-visitation-in-boostconcurrentflatm.html)
* Debugging visualizers for Boost.Unordered:
* [Natvis for boost::unordered_map, and how to use &lt;Intrinsic&gt; elements](https://blog.ganets.ky/NatvisForUnordered/)
* [Natvis for boost::concurrent_flat_map, and why fancy pointers are hard](https://blog.ganets.ky/NatvisForUnordered2/)
* [Visualizing boost::unordered_map in GDB, with pretty-printer customization points](https://blog.ganets.ky/PrettyPrinter/)
Boost.Unordered can be installed in a number of ways:
* [Download Boost](https://www.boost.org/users/download/) and you're ready to go (this is a header-only library requiring no building).
* Using Conan 2: In case you don't have it yet, add an entry for Boost in your `conanfile.txt` (the example requires at least Boost 1.86):
```
[requires]
boost/[>=1.86.0]
```
<ul>If you're not using any compiled Boost library, the following will skip building altogether:</ul>
```
[options]
boost:header_only=True
```
* Using vcpkg: Execute the command
```
vcpkg install boost-unordered
```
* Using CMake: [Boost CMake support infrastructure](https://github.com/boostorg/cmake)
allows you to use CMake directly to download, build and consume all of Boost or
some specific libraries.
## Support
* Join the **#boost-unordered** discussion group at [cpplang.slack.com](https://cpplang.slack.com/)
([ask for an invite](https://cppalliance.org/slack/) if youre not a member of this workspace yet)
* Ask in the [Boost Users mailing list](https://lists.boost.org/mailman/listinfo.cgi/boost-users)
(add the `[unordered]` tag at the beginning of the subject line)
* [File an issue](https://github.com/boostorg/unordered/issues)
## Contribute
* [Pull requests](https://github.com/boostorg/unordered/pulls) against **develop** branch are most welcome.
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).

3
benchmark/.gitignore vendored Normal file
View File

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

432
benchmark/string.cpp Normal file
View File

@ -0,0 +1,432 @@
// Copyright 2021 Peter Dimov.
// Copyright 2023-2024 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/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>
#include <type_traits>
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_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map =
absl::node_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map =
absl::flat_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
// fnv1a_hash
template<int Bits> struct fnv1a_hash_impl;
template<> struct fnv1a_hash_impl<32>
{
std::size_t operator()( std::string 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 = std::true_type;
};
template<class K, class V> using std_unordered_map_fnv1a =
std::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_map_fnv1a =
boost::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map_fnv1a =
boost::unordered_node_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map_fnv1a =
boost::unordered_flat_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map_fnv1a =
absl::node_hash_map<K, V, fnv1a_hash, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map_fnv1a =
absl::flat_hash_map<K, V, fnv1a_hash, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map_fnv1a =
ankerl::unordered_dense::map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
//
int main()
{
init_indices();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map>( "ankerl::unordered_dense::map" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map>( "absl::node_hash_map" );
test<absl_flat_hash_map>( "absl::flat_hash_map" );
#endif
test<std_unordered_map_fnv1a>( "std::unordered_map, FNV-1a" );
test<boost_unordered_map_fnv1a>( "boost::unordered_map, FNV-1a" );
test<boost_unordered_node_map_fnv1a>( "boost::unordered_node_map, FNV-1a" );
test<boost_unordered_flat_map_fnv1a>( "boost::unordered_flat_map, FNV-1a" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map_fnv1a>( "ankerl::unordered_dense::map, FNV-1a" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map_fnv1a>( "absl::node_hash_map, FNV-1a" );
test<absl_flat_hash_map_fnv1a>( "absl::flat_hash_map, FNV-1a" );
#endif
std::cout << "---\n\n";
for( auto const& x: times )
{
std::cout << std::setw( 38 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}
#ifdef HAVE_ABSEIL
# include "absl/container/internal/raw_hash_set.cc"
# include "absl/hash/internal/hash.cc"
# include "absl/hash/internal/low_level_hash.cc"
# include "absl/hash/internal/city.cc"
#endif

343
benchmark/string_stats.cpp Normal file
View File

@ -0,0 +1,343 @@
// Copyright 2021 Peter Dimov.
// Copyright 2023-2024 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#define BOOST_UNORDERED_ENABLE_STATS
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/core/detail/splitmix64.hpp>
#include <boost/config.hpp>
#include <unordered_map>
#include <vector>
#include <memory>
#include <cstdint>
#include <iostream>
#include <iomanip>
#include <chrono>
#include <type_traits>
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 = 50'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;
}
//
// All Unordered container use the same struct
using stats = boost::unordered_flat_map<int, int>::stats;
struct record
{
std::string label_;
long long time_;
stats stats_;
};
static std::vector<record> records;
template<template<class...> class Map> BOOST_NOINLINE void test( char const* label )
{
std::cout << label << ":\n\n";
Map<std::string, std::uint32_t> map;
auto t0 = std::chrono::steady_clock::now();
auto t1 = t0;
test_insert( map, t1 );
record rec = { label, 0 };
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;
rec.stats_ = map.get_stats();
records.push_back( rec );
}
//
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>>;
// 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 = std::true_type;
};
template<class K, class V> using boost_unordered_flat_map_fnv1a =
boost::unordered_flat_map<K, V, fnv1a_hash, std::equal_to<K>>;
// slightly bad hash
struct slightly_bad_hash
{
using is_avalanching = std::true_type;
std::size_t operator()( std::string const& s ) const
{
std::size_t h = s.size();
for( auto ch: s )
{
h *= 0x811C9DC4u; // multiplicative factor is even!
h += static_cast<std::size_t>( ch );
}
return h;
}
};
template<class K, class V> using boost_unordered_flat_map_slightly_bad_hash =
boost::unordered_flat_map<K, V, slightly_bad_hash, std::equal_to<K>>;
// bad hash
struct bad_hash
{
using is_avalanching = std::true_type;
std::size_t operator()( std::string const& s ) const
{
std::size_t h = s.size();
for( auto ch: s )
{
h *= 31;
h += static_cast<std::size_t>( ch );
}
return h;
}
};
template<class K, class V> using boost_unordered_flat_map_bad_hash =
boost::unordered_flat_map<K, V, bad_hash, std::equal_to<K>>;
//
int main()
{
init_indices();
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
test<boost_unordered_flat_map_fnv1a>( "boost::unordered_flat_map, FNV-1a" );
test<boost_unordered_flat_map_slightly_bad_hash>( "boost::unordered_flat_map, slightly_bad_hash" );
test<boost_unordered_flat_map_bad_hash>( "boost::unordered_flat_map, bad_hash" );
std::cout << "---\n\n";
for( auto const& x: records )
{
std::cout << std::setw( 46 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms\n"
<< std::setw( 46 ) << "insertion: "
<< "probe length " << x.stats_.insertion.probe_length.average << "\n"
<< std::setw( 46 ) << "successful lookup: "
<< "probe length " << x.stats_.successful_lookup.probe_length.average
<< ", num comparisons " << x.stats_.successful_lookup.num_comparisons.average << "\n"
<< std::setw( 46 ) << "unsuccessful lookup: "
<< "probe length " << x.stats_.unsuccessful_lookup.probe_length.average
<< ", num comparisons " << x.stats_.unsuccessful_lookup.num_comparisons.average << "\n\n";
}
}

433
benchmark/string_view.cpp Normal file
View File

@ -0,0 +1,433 @@
// Copyright 2021 Peter Dimov.
// Copyright 2023-2024 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/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>
#include <type_traits>
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_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map =
absl::node_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map =
absl::flat_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
// fnv1a_hash
template<int Bits> struct fnv1a_hash_impl;
template<> struct fnv1a_hash_impl<32>
{
std::size_t operator()( std::string_view const& s ) const
{
std::size_t h = 0x811C9DC5u;
char const * first = s.data();
char const * last = first + s.size();
for( ; first != last; ++first )
{
h ^= static_cast<unsigned char>( *first );
h *= 0x01000193ul;
}
return h;
}
};
template<> struct fnv1a_hash_impl<64>
{
std::size_t operator()( std::string_view const& s ) const
{
std::size_t h = 0xCBF29CE484222325ull;
char const * first = s.data();
char const * last = first + s.size();
for( ; first != last; ++first )
{
h ^= static_cast<unsigned char>( *first );
h *= 0x00000100000001B3ull;
}
return h;
}
};
struct fnv1a_hash: fnv1a_hash_impl< std::numeric_limits<std::size_t>::digits >
{
using is_avalanching = std::true_type;
};
template<class K, class V> using std_unordered_map_fnv1a =
std::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_map_fnv1a =
boost::unordered_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_node_map_fnv1a =
boost::unordered_node_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map_fnv1a =
boost::unordered_flat_map<K, V, fnv1a_hash, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map_fnv1a =
absl::node_hash_map<K, V, fnv1a_hash, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map_fnv1a =
absl::flat_hash_map<K, V, fnv1a_hash, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map_fnv1a =
ankerl::unordered_dense::map<K, V, fnv1a_hash, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
//
int main()
{
init_indices();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map>( "ankerl::unordered_dense::map" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map>( "absl::node_hash_map" );
test<absl_flat_hash_map>( "absl::flat_hash_map" );
#endif
test<std_unordered_map_fnv1a>( "std::unordered_map, FNV-1a" );
test<boost_unordered_map_fnv1a>( "boost::unordered_map, FNV-1a" );
test<boost_unordered_node_map_fnv1a>( "boost::unordered_node_map, FNV-1a" );
test<boost_unordered_flat_map_fnv1a>( "boost::unordered_flat_map, FNV-1a" );
#ifdef HAVE_ANKERL_UNORDERED_DENSE
test<ankerl_unordered_dense_map_fnv1a>( "ankerl::unordered_dense::map, FNV-1a" );
#endif
#ifdef HAVE_ABSEIL
test<absl_node_hash_map_fnv1a>( "absl::node_hash_map, FNV-1a" );
test<absl_flat_hash_map_fnv1a>( "absl::flat_hash_map, FNV-1a" );
#endif
std::cout << "---\n\n";
for( auto const& x: times )
{
std::cout << std::setw( 38 ) << ( x.label_ + ": " ) << std::setw( 5 ) << x.time_ << " ms, " << std::setw( 9 ) << x.bytes_ << " bytes in " << x.count_ << " allocations\n";
}
}
#ifdef HAVE_ABSEIL
# include "absl/container/internal/raw_hash_set.cc"
# include "absl/hash/internal/hash.cc"
# include "absl/hash/internal/low_level_hash.cc"
# include "absl/hash/internal/city.cc"
#endif

352
benchmark/uint32.cpp Normal file
View File

@ -0,0 +1,352 @@
// Copyright 2021 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/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_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map =
absl::node_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map =
absl::flat_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
int main()
{
init_indices();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
#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

362
benchmark/uint64.cpp Normal file
View File

@ -0,0 +1,362 @@
// Copyright 2021 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/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_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map =
absl::node_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map =
absl::flat_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
int main()
{
init_indices();
#if defined(BOOST_LIBSTDCXX_VERSION) && __SIZE_WIDTH__ == 32
// Pathological behavior:
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104945
#else
test<std_unordered_map>( "std::unordered_map" );
#endif
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
#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

403
benchmark/uuid.cpp Normal file
View File

@ -0,0 +1,403 @@
// Copyright 2021, 2022 Peter Dimov.
// Copyright 2023 Joaquin M Lopez Munoz.
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt
#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
#define _SILENCE_CXX20_CISO646_REMOVED_WARNING
#include <boost/unordered_map.hpp>
#include <boost/unordered/unordered_node_map.hpp>
#include <boost/unordered/unordered_flat_map.hpp>
#include <boost/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_node_map =
boost::unordered_node_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
template<class K, class V> using boost_unordered_flat_map =
boost::unordered_flat_map<K, V, boost::hash<K>, std::equal_to<K>, allocator_for<K, V>>;
#ifdef HAVE_ABSEIL
template<class K, class V> using absl_node_hash_map =
absl::node_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
template<class K, class V> using absl_flat_hash_map =
absl::flat_hash_map<K, V, absl::container_internal::hash_default_hash<K>, absl::container_internal::hash_default_eq<K>, allocator_for<K, V>>;
#endif
#ifdef HAVE_ANKERL_UNORDERED_DENSE
template<class K, class V> using ankerl_unordered_dense_map =
ankerl::unordered_dense::map<K, V, ankerl::unordered_dense::hash<K>, std::equal_to<K>, ::allocator< std::pair<K, V> >>;
#endif
int main()
{
init_indices();
test<std_unordered_map>( "std::unordered_map" );
test<boost_unordered_map>( "boost::unordered_map" );
test<boost_unordered_node_map>( "boost::unordered_node_map" );
test<boost_unordered_flat_map>( "boost::unordered_flat_map" );
#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

386
benchmark/word_count.cpp Normal file
View File

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

244
benchmark/word_size.cpp Normal file
View File

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

26
build.jam Normal file
View File

@ -0,0 +1,26 @@
# Copyright 2023-2024 René Ferdinand Rivera Morell
# Copyright 2024 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt
require-b2 5.2 ;
constant boost_dependencies :
/boost/assert//boost_assert
/boost/config//boost_config
/boost/container_hash//boost_container_hash
/boost/core//boost_core
/boost/mp11//boost_mp11
/boost/predef//boost_predef
/boost/throw_exception//boost_throw_exception
;
project /boost/unordered ;
explicit
[ alias boost_unordered : : : : <include>include <library>$(boost_dependencies) ]
[ alias all : boost_unordered test ]
;
call-if : boost-library unordered
;

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])

2
doc/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/build/
/node_modules/

View File

@ -1,72 +1,57 @@
import generate ;
import path ;
import property-set ;
import virtual-target ;
# 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)
path-constant HERE : . ;
using boostbook ;
using quickbook ;
make html/index.html : build_antora.sh : @run-script ;
generate files-to-install : html/index.html : <generating-rule>@delayed-glob ;
install install
: files-to-install
: <location>html
<install-source-root>html/unordered
;
explicit html/index.html files-to-install ;
path-constant images_location : ../ ;
path-constant admonishment_location : ../../../../doc/src/images ;
# this runs the antora script
actions run-script
{
bash $(>)
}
xml unordered : unordered.qbk :
<xsl:param>generate.consistent.ids=1 ;
# this globs after its sources are created
rule delayed-glob ( project name : property-set : sources * )
{
for local src in $(sources)
{
# the next line causes the source to be generated immediately
# and not later (which it normally would)
UPDATE_NOW [ $(src).actualize ] ;
}
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
# we need to construct the path to the globbed directory;
# this path would be <current-project>/antora
local root = [ path.root html [ $(project).location ] ] ;
local files ;
<xsl:param>boost.compact.typedef=0
<xsl:param>boost.compact.function=0
<xsl:param>boost.compact.enum=0
# actual globbing happens here
for local file in [ path.glob-tree $(root) : * ]
{
# we have to skip directories, because our match expression accepts anything
if [ CHECK_IF_FILE $(file) ]
{
# we construct a list of targets to copy
files += [ virtual-target.from-file $(file:D=) : $(file:D) : $(project) ] ;
}
}
<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
;
# we prepend empty usage requirements to the result
return [ property-set.empty ] $(files) ;
}
###############################################################################
alias boostdoc
: unordered
:
:
: ;
alias boostdoc ;
explicit boostdoc ;
alias boostrelease ;
alias boostrelease : install ;
explicit boostrelease ;

6
doc/antora.yml Normal file
View File

@ -0,0 +1,6 @@
name: unordered
version: ~
title: Boost.Unordered
nav:
- modules/ROOT/nav.adoc
start_page: intro.adoc

9
doc/antora_docs.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
set -ex
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd "$SCRIPT_DIR"
npm ci
npx antora unordered-playbook.yml

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>

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]

9
doc/build_antora.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
set -ex
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd "$SCRIPT_DIR"
npm ci
npx antora unordered-playbook.yml

View File

@ -1,360 +0,0 @@
[/ Copyright 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) ]
[template ticket[number]'''<ulink
url="https://svn.boost.org/trac/boost/ticket/'''[number]'''">'''#[number]'''</ulink>''']
[template pull_request[number][@https://github.com/boostorg/unordered/pull/[number] GitHub #[number]]]
[section:changes Change Log]
[h2 Review Version]
Initial review version, for the review conducted from 7th December 2007 to
16th December 2007.
[h2 1.35.0 Add-on - 31st March 2008]
Unofficial release uploaded to vault, to be used with Boost 1.35.0. Incorporated
many of the suggestions from the review.
* Improved portability thanks to Boost regression testing.
* Fix lots of typos, and clearer text in the documentation.
* Fix floating point to `std::size_t` conversion when calculating sizes from
the max load factor, and use `double` in the calculation for greater accuracy.
* Fix some errors in the examples.
[h2 Boost 1.36.0]
First official release.
* Rearrange the internals.
* Move semantics - full support when rvalue references are available, emulated
using a cut down version of the Adobe move library when they are not.
* Emplace support when rvalue references and variadic template are available.
* More efficient node allocation when rvalue references and variadic template
are available.
* Added equality operators.
[h2 Boost 1.37.0]
* Rename overload of `emplace` with hint, to `emplace_hint` as specified in
[@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2691.pdf n2691].
* Provide forwarding headers at `<boost/unordered/unordered_map_fwd.hpp>` and
`<boost/unordered/unordered_set_fwd.hpp>`.
* Move all the implementation inside `boost/unordered`, to assist
modularization and hopefully make it easier to track changes in subversion.
[h2 Boost 1.38.0]
* Use [@boost:/libs/core/swap.html `boost::swap`].
* [@https://svn.boost.org/trac/boost/ticket/2237 Ticket 2237]:
Document that the equality and inequality operators are undefined for two
objects if their equality predicates aren't equivalent. Thanks to Daniel
Krügler.
* [@https://svn.boost.org/trac/boost/ticket/1710 Ticket 1710]:
Use a larger prime number list. Thanks to Thorsten Ottosen and Hervé
Brönnimann.
* Use
[@boost:/libs/type_traits/doc/html/boost_typetraits/category/alignment.html
aligned storage] to store the types. This changes the way the allocator is
used to construct nodes. It used to construct the node with two calls to
the allocator's `construct` method - once for the pointers and once for the
value. It now constructs the node with a single call to construct and
then constructs the value using in place construction.
* Add support for C++0x initializer lists where they're available (currently
only g++ 4.4 in C++0x mode).
[h2 Boost 1.39.0]
* [@https://svn.boost.org/trac/boost/ticket/2756 Ticket 2756]: Avoid a warning
on Visual C++ 2009.
* Some other minor internal changes to the implementation, tests and
documentation.
* Avoid an unnecessary copy in `operator[]`.
* [@https://svn.boost.org/trac/boost/ticket/2975 Ticket 2975]: Fix length of
prime number list.
[h2 Boost 1.40.0]
* [@https://svn.boost.org/trac/boost/ticket/2975 Ticket 2975]:
Store the prime list as a preprocessor sequence - so that it will always get
the length right if it changes again in the future.
* [@https://svn.boost.org/trac/boost/ticket/1978 Ticket 1978]:
Implement `emplace` for all compilers.
* [@https://svn.boost.org/trac/boost/ticket/2908 Ticket 2908],
[@https://svn.boost.org/trac/boost/ticket/3096 Ticket 3096]:
Some workarounds for old versions of borland, including adding explicit
destructors to all containers.
* [@https://svn.boost.org/trac/boost/ticket/3082 Ticket 3082]:
Disable incorrect Visual C++ warnings.
* Better configuration for C++0x features when the headers aren't available.
* Create less buckets by default.
[h2 Boost 1.41.0 - Major update]
* The original version made heavy use of macros to sidestep some of the older
compilers' poor template support. But since I no longer support those
compilers and the macro use was starting to become a maintenance burden it
has been rewritten to use templates instead of macros for the implementation
classes.
* The container object is now smaller thanks to using `boost::compressed_pair`
for EBO and a slightly different function buffer - now using a bool instead
of a member pointer.
* Buckets are allocated lazily which means that constructing an empty container
will not allocate any memory.
[h2 Boost 1.42.0]
* Support instantiating the containers with incomplete value types.
* Reduced the number of warnings (mostly in tests).
* Improved codegear compatibility.
* [@http://svn.boost.org/trac/boost/ticket/3693 Ticket 3693]:
Add `erase_return_void` as a temporary workaround for the current
`erase` which can be inefficient because it has to find the next
element to return an iterator.
* Add templated find overload for compatible keys.
* [@http://svn.boost.org/trac/boost/ticket/3773 Ticket 3773]:
Add missing `std` qualifier to `ptrdiff_t`.
* Some code formatting changes to fit almost all lines into 80 characters.
[h2 Boost 1.43.0]
* [@http://svn.boost.org/trac/boost/ticket/3966 Ticket 3966]:
`erase_return_void` is now `quick_erase`, which is the
[@http://home.roadrunner.com/~hinnant/issue_review/lwg-active.html#579
current forerunner for resolving the slow erase by iterator], although
there's a strong possibility that this may change in the future. The old
method name remains for backwards compatibility but is considered deprecated
and will be removed in a future release.
* Use Boost.Exception.
* Stop using deprecated `BOOST_HAS_*` macros.
[h2 Boost 1.45.0]
* Fix a bug when inserting into an `unordered_map` or `unordered_set` using
iterators which returns `value_type` by copy.
[h2 Boost 1.48.0 - Major update]
This is major change which has been converted to use Boost.Move's move
emulation, and be more compliant with the C++11 standard. See the
[link unordered.compliance compliance section] for details.
The container now meets C++11's complexity requirements, but to do so
uses a little more memory. This means that `quick_erase` and
`erase_return_void` are no longer required, they'll be removed in a
future version.
C++11 support has resulted in some breaking changes:
* Equality comparison has been changed to the C++11 specification.
In a container with equivalent keys, elements in a group with equal
keys used to have to be in the same order to be considered equal,
now they can be a permutation of each other. To use the old
behavior define the macro `BOOST_UNORDERED_DEPRECATED_EQUALITY`.
* The behaviour of swap is different when the two containers to be
swapped has unequal allocators. It used to allocate new nodes using
the appropriate allocators, it now swaps the allocators if
the allocator has a member structure `propagate_on_container_swap`,
such that `propagate_on_container_swap::value` is true.
* Allocator's `construct` and `destroy` functions are called with raw
pointers, rather than the allocator's `pointer` type.
* `emplace` used to emulate the variadic pair constructors that
appeared in early C++0x drafts. Since they were removed it no
longer does so. It does emulate the new `piecewise_construct`
pair constructors - only you need to use
`boost::piecewise_construct`. To use the old emulation of
the variadic constructors define
`BOOST_UNORDERED_DEPRECATED_PAIR_CONSTRUCT`.
[h2 Boost 1.49.0]
* Fix warning due to accidental odd assignment.
* Slightly better error messages.
[h2 Boost 1.50.0]
* Fix equality for `unordered_multiset` and `unordered_multimap`.
* [@https://svn.boost.org/trac/boost/ticket/6857 Ticket 6857]:
Implement `reserve`.
* [@https://svn.boost.org/trac/boost/ticket/6771 Ticket 6771]:
Avoid gcc's `-Wfloat-equal` warning.
* [@https://svn.boost.org/trac/boost/ticket/6784 Ticket 6784]:
Fix some Sun specific code.
* [@https://svn.boost.org/trac/boost/ticket/6190 Ticket 6190]:
Avoid gcc's `-Wshadow` warning.
* [@https://svn.boost.org/trac/boost/ticket/6905 Ticket 6905]:
Make namespaces in macros compatible with `bcp` custom namespaces.
Fixed by Luke Elliott.
* Remove some of the smaller prime number of buckets, as they may make
collisions quite probable (e.g. multiples of 5 are very common because
we used base 10).
* On old versions of Visual C++, use the container library's implementation
of `allocator_traits`, as it's more likely to work.
* On machines with 64 bit std::size_t, use power of 2 buckets, with Thomas
Wang's hash function to pick which one to use. As modulus is very slow
for 64 bit values.
* Some internal changes.
[h2 Boost 1.51.0]
* Fix construction/destruction issue when using a C++11 compiler with a
C++03 allocator ([ticket 7100]).
* Remove a `try..catch` to support compiling without exceptions.
* Adjust SFINAE use to try to support g++ 3.4 ([ticket 7175]).
* Updated to use the new config macros.
[h2 Boost 1.52.0]
* Faster assign, which assigns to existing nodes where possible, rather than
creating entirely new nodes and copy constructing.
* Fixed bug in `erase_range` ([ticket 7471]).
* Reverted some of the internal changes to how nodes are created, especially
for C++11 compilers. 'construct' and 'destroy' should work a little better
for C++11 allocators.
* Simplified the implementation a bit. Hopefully more robust.
[h2 Boost 1.53.0]
* Remove support for the old pre-standard variadic pair constructors, and
equality implementation. Both have been deprecated since Boost 1.48.
* Remove use of deprecated config macros.
* More internal implementation changes, including a much simpler
implementation of `erase`.
[h2 Boost 1.54.0]
* Mark methods specified in standard as `noexpect`. More to come in the next
release.
* If the hash function and equality predicate are known to both have nothrow
move assignment or construction then use them.
[h2 Boost 1.55.0]
* Avoid some warnings ([ticket 8851], [ticket 8874]).
* Avoid exposing some detail functions via. ADL on the iterators.
* Follow the standard by only using the allocators' construct and destroy
methods to construct and destroy stored elements. Don't use them for internal
data like pointers.
[h2 Boost 1.56.0]
* Fix some shadowed variable warnings ([ticket 9377]).
* Fix allocator use in documentation ([ticket 9719]).
* Always use prime number of buckets for integers. Fixes performance
regression when inserting consecutive integers, although makes other
uses slower ([ticket 9282]).
* Only construct elements using allocators, as specified in C++11 standard.
[h2 Boost 1.57.0]
* Fix the `pointer` typedef in iterators ([ticket 10672]).
* Fix Coverity warning
([@https://github.com/boostorg/unordered/pull/2 GitHub #2]).
[h2 Boost 1.58.0]
* Remove unnecessary template parameter from const iterators.
* Rename private `iterator` typedef in some iterator classes, as it
confuses some traits classes.
* Fix move assignment with stateful, propagate_on_container_move_assign
allocators ([ticket 10777]).
* Fix rare exception safety issue in move assignment.
* Fix potential overflow when calculating number of buckets to allocate
([@https://github.com/boostorg/unordered/pull/4 GitHub #4]).
[h2 Boost 1.62.0]
* Remove use of deprecated `boost::iterator`.
* Remove `BOOST_NO_STD_DISTANCE` workaround.
* Remove `BOOST_UNORDERED_DEPRECATED_EQUALITY` warning.
* Simpler implementation of assignment, fixes an exception safety issue
for `unordered_multiset` and `unordered_multimap`. Might be a little slower.
* Stop using return value SFINAE which some older compilers have issues
with.
[h2 Boost 1.63.0]
* Check hint iterator in `insert`/`emplace_hint`.
* Fix some warnings, mostly in the tests.
* Manually write out `emplace_args` for small numbers of arguments -
should make template error messages a little more bearable.
* Remove superfluous use of `boost::forward` in emplace arguments,
which fixes emplacing string literals in old versions of Visual C++.
* Fix an exception safety issue in assignment. If bucket allocation
throws an exception, it can overwrite the hash and equality functions while
leaving the existing elements in place. This would mean that the function
objects wouldn't match the container elements, so elements might be in the
wrong bucket and equivalent elements would be incorrectly handled.
* Various reference documentation improvements.
* Better allocator support ([ticket 12459]).
* Make the no argument constructors implicit.
* Implement missing allocator aware constructors.
* Fix assigning the hash/key equality functions for empty containers.
* Remove unary/binary_function from the examples in the documentation.
They are removed in C++17.
* Support 10 constructor arguments in emplace. It was meant to support up to 10
arguments, but an off by one error in the preprocessor code meant it only
supported up to 9.
[h2 Boost 1.64.0]
* Initial support for new C++17 member functions:
`insert_or_assign` and `try_emplace` in `unordered_map`,
* Initial support for `merge` and `extract`.
Does not include transferring nodes between
`unordered_map` and `unordered_multimap` or between `unordered_set` and
`unordered_multiset` yet. That will hopefully be in the next version of
Boost.
[h2 Boost 1.65.0]
* Add deprecated attributes to `quick_erase` and `erase_return_void`.
I really will remove them in a future version this time.
* Small standards compliance fixes:
* `noexpect` specs for `swap` free functions.
* Add missing `insert(P&&)` methods.
[h2 Boost 1.66.0]
* Simpler move construction implementation.
* Documentation fixes ([pull_request 6]).
[h2 Boost 1.67.0]
* Improved C++17 support:
* Add template deduction guides from the standard.
* Use a simple implementation of `optional` in node handles, so
that they're closer to the standard.
* Add missing `noexcept` specifications to `swap`, `operator=`
and node handles, and change the implementation to match.
Using `std::allocator_traits::is_always_equal`, or our own
implementation when not available, and
`boost::is_nothrow_swappable` in the implementation.
* Improved C++20 support:
* Use `boost::to_address`, which has the proposed C++20 semantics,
rather than the old custom implementation.
* Add `element_type` to iterators, so that `std::pointer_traits`
will work.
* Use `std::piecewise_construct` on recent versions of Visual C++,
and other uses of the Dinkumware standard library,
now using Boost.Predef to check compiler and library versions.
* Use `std::iterator_traits` rather than the boost iterator traits
in order to remove dependency on Boost.Iterator.
* Remove iterators' inheritance from `std::iterator`, which is
deprecated in C++17, thanks to Daniela Engert
([@https://github.com/boostorg/unordered/pull/7 PR#7]).
* Stop using `BOOST_DEDUCED_TYPENAME`.
* Update some Boost include paths.
* Rename some internal methods, and variables.
* Various testing improvements.
* Miscellaneous internal changes.
[endsect]

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]

View File

@ -1,128 +0,0 @@
[/ Copyright 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:compliance Standard Compliance]
The intent of Boost.Unordered is to implement a close (but imperfect)
implementation of the C++17 standard, that will work with C++98 upwards.
The wide compatibility does mean some comprimises have to be made.
With a compiler and library that fully support C++11, the differences should
be minor.
[section:move Move emulation]
Support for move semantics is implemented using Boost.Move. If rvalue
references are available it will use them, but if not it uses a close,
but imperfect emulation. On such compilers:
* Non-copyable objects can be stored in the containers.
They can be constructed in place using `emplace`, or if they support
Boost.Move, moved into place.
* The containers themselves are not movable.
* Argument forwarding is not perfect.
[endsect]
[section:allocator_compliance Use of allocators]
C++11 introduced a new allocator system. It's backwards compatible due to
the lax requirements for allocators in the old standard, but might need
some changes for allocators which worked with the old versions of the
unordered containers.
It uses a traits class, `allocator_traits` to handle the allocator
adding extra functionality, and making some methods and types optional.
During development a stable release of
`allocator_traits` wasn't available so an internal partial implementation
is always used in this version. Hopefully a future version will use the
standard implementation where available.
The member functions `construct`, `destroy` and `max_size` are now
optional, if they're not available a fallback is used.
A full implementation of `allocator_traits` requires sophisticated
member function detection so that the fallback is used whenever the
member function call is not well formed.
This requires support for SFINAE expressions, which are available on
GCC from version 4.4 and Clang.
On other compilers, there's just a test to see if the allocator has
a member, but no check that it can be called. So rather than using a
fallback there will just be a compile error.
`propagate_on_container_copy_assignment`,
`propagate_on_container_move_assignment`,
`propagate_on_container_swap` and
`select_on_container_copy_construction` are also supported.
Due to imperfect move emulation, some assignments might check
`propagate_on_container_copy_assignment` on some compilers and
`propagate_on_container_move_assignment` on others.
[endsect]
[section:construction Construction/Destruction using allocators]
The following support is required for full use of C++11 style
construction/destruction:
* Variadic templates.
* Piecewise construction of `std::pair`.
* Either `std::allocator_traits` or expression SFINAE.
This is detected using Boost.Config. The macro
`BOOST_UNORDERED_CXX11_CONSTRUCTION` will be set to 1 if it is found, or 0
otherwise.
When this is the case `allocator_traits::construct` and
`allocator_traits::destroy` will always be used, apart from when piecewise
constructing a `std::pair` using `boost::tuple` (see [link
unordered.compliance.pairs below]), but that should be easily avoided.
When support is not available `allocator_traits::construct` and
`allocator_traits::destroy` are never called.
[endsect]
[section:pointer_traits Pointer Traits]
`pointer_traits` aren't used. Instead, pointer types are obtained from
rebound allocators, this can cause problems if the allocator can't be
used with incomplete types. If `const_pointer` is not defined in the
allocator, `boost::pointer_to_other<pointer, const value_type>::type`
is used to obtain a const pointer.
[endsect]
[#unordered.compliance.pairs]
[section:pairs Pairs]
Since the containers use `std::pair` they're limited to the version
from the current standard library. But since C++11 `std::pair`'s
`piecewise_construct` based constructor is very useful, `emplace`
emulates it with a `piecewise_construct` in the `boost::unordered`
namespace. So for example, the following will work:
boost::unordered_multimap<std::string, std::complex> x;
x.emplace(
boost::unordered::piecewise_construct,
boost::make_tuple("key"), boost::make_tuple(1, 2));
Older drafts of the standard also supported variadic constructors
for `std::pair`, where the first argument would be used for the
first part of the pair, and the remaining for the second part.
[endsect]
[section:misc Miscellaneous]
When swapping, `Pred` and `Hash` are not currently swapped by calling
`swap`, their copy constructors are used. As a consequence when swapping
an exception may be thrown from their copy constructor.
Variadic constructor arguments for `emplace` are only used when both
rvalue references and variadic template parameters are available.
Otherwise `emplace` can only take up to 10 constructors arguments.
[endsect]
[endsect]

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

View File

@ -1,86 +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:hash_equality Equality Predicates and Hash Functions]
While the associative containers use an ordering relation to specify how the
elements are stored, the unordered associative containers use an equality
predicate and a hash function. For example, [classref boost::unordered_map]
is declared as:
template <
class Key, class Mapped,
class Hash = ``[classref boost::hash]``<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<std::pair<Key const, Mapped> > >
class ``[classref boost::unordered_map unordered_map]``;
The hash function comes first as you might want to change the hash function
but not the equality predicate. For example, if you wanted to use the
[@http://www.isthe.com/chongo/tech/comp/fnv/ FNV-1 hash] you could write:
[import src_code/dictionary.cpp]
[case_sensitive_dictionary_fnv]
There is an [@boost:/libs/unordered/examples/fnv1.hpp implementation
of FNV-1] in the examples directory.
If you wish to use a different equality function,
you will also need to use a matching hash function. For
example, to implement a case insensitive dictionary you need to define a
case insensitive equality predicate and hash function:
[case_insensitive_functions]
Which you can then use in a case insensitive dictionary:
[case_insensitive_dictionary]
This is a simplified version of the example at
[@boost:/libs/unordered/examples/case_insensitive.hpp /libs/unordered/examples/case_insensitive.hpp]
which supports other locales and string types.
[caution
Be careful when using the equality (`==`) operator with custom equality
predicates, especially if you're using a function pointer. If you compare two
containers with different equality predicates then the result is undefined.
For most stateless function objects this is impossible - since you can only
compare objects with the same equality predicate you know the equality
predicates must be equal. But if you're using function pointers or a stateful
equality predicate (e.g. boost::function) then you can get into trouble.
]
[h2 Custom Types]
Similarly, a custom hash function can be used for custom types:
[import src_code/point1.cpp]
[point_example1]
Since the default hash function is [link hash Boost.Hash],
we can [link hash.custom extend it to support the type]
so that the hash function doesn't need to be explicitly given:
[import src_code/point2.cpp]
[point_example2]
See the [link hash.custom Boost.Hash documentation] for more detail on how to
do this. Remember that it relies on extensions to the draft standard - so it
won't work for other implementations of the unordered associative containers,
you'll need to explicitly use Boost.Hash.
[table:access_methods Methods for accessing the hash and equality functions.
[[Method] [Description]]
[
[`hasher hash_function() const`]
[Returns the container's hash function.]
]
[
[`key_equal key_eq() const`]
[Returns the container's key equality function.]
]
]
[endsect]

View File

@ -1,101 +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) ]
[def __hash-table__ [@http://en.wikipedia.org/wiki/Hash_table
hash table]]
[def __hash-function__ [@http://en.wikipedia.org/wiki/Hash_function
hash function]]
[section:intro Introduction]
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 isn't 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 [link unordered.compliance deviations from the standard] in
order to work with non-C++11 compilers and libraries.
`unordered_set` and `unordered_multiset` are defined in the header
<[headerref boost/unordered_set.hpp]>
namespace boost {
template <
class Key,
class Hash = ``[classref boost::hash]``<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<Key> >
class ``[classref boost::unordered_set unordered_set]``;
template<
class Key,
class Hash = ``[classref boost::hash]``<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<Key> >
class ``[classref boost::unordered_multiset unordered_multiset]``;
}
`unordered_map` and `unordered_multimap` are defined in the header
<[headerref boost/unordered_map.hpp]>
namespace boost {
template <
class Key, class Mapped,
class Hash = ``[classref boost::hash]``<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<std::pair<Key const, Mapped> > >
class ``[classref boost::unordered_map unordered_map]``;
template<
class Key, class Mapped,
class Hash = ``[classref boost::hash]``<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<std::pair<Key const, Mapped> > >
class ``[classref boost::unordered_multimap unordered_multimap]``;
}
When using Boost.TR1, these classes are included from `<unordered_set>` and
`<unordered_map>`, with the classes added to the `std::tr1` namespace.
The containers are used in a similar manner to the normal associative
containers:
[import src_code/intro.cpp]
[intro_example1_2]
But since the elements aren't ordered, the output of:
[intro_example1_3]
can be in any order. For example, it might be:
two,2
one,1
three,3
To store an object in an unordered associative container requires both a
key equality function and a hash function. The default function objects in
the standard containers support a few basic types including integer types,
floating point types, pointer types, and the standard strings. Since
Boost.Unordered uses [classref boost::hash] it also supports some other types,
including standard containers. To use any types not supported by these methods
you have to [link hash.custom extend Boost.Hash to support the type] or use
your own custom equality predicates and hash functions. See the
[link unordered.hash_equality Equality Predicates and Hash Functions] section
for more details.
There are other differences, which are listed in the
[link unordered.comparison Comparison with Associative Containers] section.
[endsect]

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: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 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: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 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: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 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: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 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: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 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: 33 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: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 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: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

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