Le 26/10/2018 à 10:08, Hans Dembinski via Boost a écrit :
On 26. Oct 2018, at 09:35, Andrzej Krzemienski via Boost
wrote: Hi. I would use a type-safe library for flags. I am missing one today. […] I would rather expect an interface using named functions or indexing operator:
``` if (!flags[Flag::READ]) flags.reset(Flag::EXEC); ``` There are std::bitset (fixed size, allocates on the stack) and boost::dynamic_bitset (dynamic size, allocates from stack and heap)
https://www.boost.org/doc/libs/1_68_0/libs/dynamic_bitset/dynamic_bitset.htm...
The latter also has more sensible implementations of operator& and operator|. Before you invent a new thing, what is wrong with these classes?
Their size. The size of std::bitset<8> is not 8 bits but very often 64 bits. :( We need something like std::bitset<N>, where we can define the size of the block xxx::bitset<20, unsigned char>. The size of xxx::bitset<20, unsigned char> should be 3 bytes. Aside this point relative to the size, there is also the fact that std::bitset<N> uses only index between 0 and N-1. I've defined a ordinal library where the index is not a number between 0 and N-1, but any type that is isomorphic to O..N-1. https://github.com/viboes/std-make/tree/master/include/experimental/fundamen... This library defines several container and in particular an ordinal_set https://github.com/viboes/std-make/blob/master/include/experimental/fundamen... but also an ordinal array https://github.com/viboes/std-make/blob/master/include/experimental/fundamen... and an ordinal range You can find a draft proposal here https://github.com/viboes/std-make/blob/master/doc/proposal/ordinal/Ordinal.... In particular enums with power of 2 constants are isomorphic to 0..N-1. Unfortunately ordinal_set<O> when the cardinality of O is 24 is not 3 bytes as I use std::bitset as underlying implementation. I started an implementation of a bitmask that has a builtin unsigned int underlying representation in https://github.com/viboes/std-make/blob/master/include/experimental/fundamen... but I have not put both together. Please, be free to take whatever could be useful to you. Hopping this helps, Vicente