|
Boost : |
Subject: Re: [boost] interest in a flag library
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2018-11-01 07:24:05
Le 26/10/2018 à 10:08, Hans Dembinski via Boost a écrit :
>> On 26. Oct 2018, at 09:35, Andrzej Krzemienski via Boost <boost_at_[hidden]> 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.html
>
> 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/fundamental/v3/ordinal
This library defines several container and in particular an ordinal_set
https://github.com/viboes/std-make/blob/master/include/experimental/fundamental/v3/ordinal/containers/ordinal_set.hpp
but also an ordinal array
https://github.com/viboes/std-make/blob/master/include/experimental/fundamental/v3/ordinal/containers/ordinal_array.hpp
and an ordinal range
You can find a draft proposal here
https://github.com/viboes/std-make/blob/master/doc/proposal/ordinal/Ordinal.md
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/fundamental/v3/bits/bit_mask.hpp
but I have not put both together.
Please, be free to take whatever could be useful to you.
Hopping this helps,
Vicente
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk