|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +nav-class: dark |
| 4 | +categories: joaquin |
| 5 | +title: Containers galore |
| 6 | +author-id: joaquin |
| 7 | +author-name: Joaquín M López Muñoz |
| 8 | +--- |
| 9 | + |
| 10 | +During Q4 2025, I've been working in the following areas: |
| 11 | + |
| 12 | +### Boost.Bloom |
| 13 | + |
| 14 | +* Written [an article](https://bannalia.blogspot.com/2025/10/bulk-operations-in-boostbloom.html) explaining |
| 15 | +the usage and implementation of the recently introduced bulk operations. |
| 16 | + |
| 17 | +### Boost.Unordered |
| 18 | + |
| 19 | +* Written maintenance fixes |
| 20 | +[PR#320](https://github.com/boostorg/unordered/pull/320), |
| 21 | +[PR#321](https://github.com/boostorg/unordered/pull/321), |
| 22 | +[PR#326](https://github.com/boostorg/unordered/pull/326), |
| 23 | +[PR#327](https://github.com/boostorg/unordered/pull/327), |
| 24 | +[PR#328](https://github.com/boostorg/unordered/pull/328), |
| 25 | +[PR#335](https://github.com/boostorg/unordered/pull/335). |
| 26 | + |
| 27 | +### Boost.MultiIndex |
| 28 | + |
| 29 | +* Refactored the library to use Boost.Mp11 instead of Boost.MPL ([PR#87](https://github.com/boostorg/multi_index/pull/87)), |
| 30 | +remove pre-C++11 variadic argument emulation ([PR#88](https://github.com/boostorg/multi_index/pull/88)) |
| 31 | +and remove all sorts of pre-C++11 polyfills ([PR#90](https://github.com/boostorg/multi_index/pull/90)). |
| 32 | +These changes are explained in [an article](https://bannalia.blogspot.com/2025/12/boostmultiindex-refactored.html) |
| 33 | +and will be shipped in Boost 1.91. Transition is expected to be mostly backwards |
| 34 | +compatible, though two Boost libraries needed adjustments as they use MultiIndex |
| 35 | +in rather advanced ways (see below). |
| 36 | + |
| 37 | +### Boost.Flyweight |
| 38 | + |
| 39 | +* Adapted the library to work with Boost.MultiIndex 1.91 |
| 40 | +([PR#25](https://github.com/boostorg/flyweight/pull/25)). |
| 41 | + |
| 42 | +### Boost.Bimap |
| 43 | + |
| 44 | +* Adapted the library to work with Boost.MultiIndex 1.91 |
| 45 | +([PR#50](https://github.com/boostorg/bimap/pull/50)). |
| 46 | + |
| 47 | +### Other Boost libraries |
| 48 | + |
| 49 | +* Helped set up the Antora-based doc build chain for DynamicBitset |
| 50 | +([PR#96](https://github.com/boostorg/dynamic_bitset/pull/96), |
| 51 | +[PR#97](https://github.com/boostorg/dynamic_bitset/pull/97), |
| 52 | +[PR#98](https://github.com/boostorg/dynamic_bitset/pull/98)). |
| 53 | +* Same with OpenMethod |
| 54 | +([PR#40](https://github.com/boostorg/openmethod/pull/40)). |
| 55 | +* Fixed concept compliance of iterators provided by Spirit |
| 56 | +([PR#840](https://github.com/boostorg/spirit/pull/840), |
| 57 | +[PR#841](https://github.com/boostorg/spirit/pull/841)). |
| 58 | + |
| 59 | +### Experiments with Fil-C |
| 60 | + |
| 61 | +[Fil-C](https://fil-c.org/) is a C and C++ compiler built on top of LLVM that adds run-time |
| 62 | +memory-safety mechanisms preventing out-of-bounds and use-after-free accesses. |
| 63 | +I've been experimenting with compiling Boost.Unordered test suite with Fil-C and running |
| 64 | +some benchmarks to measure the resulting degradation in execution times and memory usage. |
| 65 | +Results follow: |
| 66 | + |
| 67 | +* Articles |
| 68 | + * [Some experiments with Boost.Unordered on Fil-C](https://bannalia.blogspot.com/2025/11/some-experiments-with-boostunordered-on.html) |
| 69 | + * [Comparing the run-time performance of Fil-C and ASAN](https://bannalia.blogspot.com/2025/11/comparing-run-time-performance-of-fil-c.html) |
| 70 | +* Repos |
| 71 | + * [Compiling Boost.Unordered test suite with Fil-C](https://github.com/joaquintides/fil-c_boost_unordered) |
| 72 | + * [Benchmarks of Fil-C and ASAN against baseline](https://github.com/boostorg/boost_unordered_benchmarks/tree/boost_unordered_flat_map_fil-c) |
| 73 | + * [Memory consumption of Fil-C and ASAN with respect to baseline](https://github.com/boostorg/boost_unordered_benchmarks/tree/boost_unordered_flat_map_fil-c_memory) |
| 74 | + |
| 75 | +### Proof of concept of a semistable vector |
| 76 | + |
| 77 | +By "semistable vector" I mean that pointers to the elements may be invalidated |
| 78 | +upon isertion and erasure (just like a regular `std::vector`) but iterators |
| 79 | +to non-erased elements remain valid throughout. |
| 80 | +I've written a small [proof of concept](https://github.com/joaquintides/semistable_vector/) |
| 81 | +of this idea and measured its performance against non-stable `std::vector` and fully |
| 82 | +stable `std::list`. It is dubious that such container could be of interest for production |
| 83 | +use, but the techniques explored are mildly interesting and could be adapted, for |
| 84 | +instance, to write powerful safe iterator facilities. |
| 85 | + |
| 86 | +### Teaser: exploring the `std::hive` space |
| 87 | + |
| 88 | +In short, `std::hive` (coming in C++26) is a container with stable references/iterators |
| 89 | +and fast insertion and erasure. The [reference implementation](https://github.com/mattreecebentley/plf_hive) |
| 90 | +for this container relies on a rather convoluted data structure, and I started to wonder |
| 91 | +if something simpler could deliver superior performance. Expect to see the results of |
| 92 | +my experiments in Q1 2026. |
| 93 | + |
| 94 | +### Website |
| 95 | + |
| 96 | +* Filed issues |
| 97 | +[#1936](https://github.com/boostorg/website-v2/issues/1936), |
| 98 | +[#1937](https://github.com/boostorg/website-v2/issues/1937), |
| 99 | +[#1984](https://github.com/boostorg/website-v2/issues/1984). |
| 100 | + |
| 101 | +### Support to the community |
| 102 | + |
| 103 | +* I've been part of a task force with the C++ Alliance to review the entire |
| 104 | +catalog of Boost libraries (170+) and categorize them according to their |
| 105 | +maintainance status and relevance in light of additions to the C++ |
| 106 | +standard library over the years. |
| 107 | +* Supporting the community as a member of the Fiscal Sponsorhip Committee (FSC). |
0 commit comments