Enums
Enumerates (enums) are often used to distinguish mutual exclusive properties. An enum variable can have than only one value. There are other use cases where more than one enum value can be active at the same time. If these enums are unique and ascending it gives a possibility for optimized storage
by using std::bitset
over other STL containers.
Container
To allow non mutual exclusive enums and store them in a container the following options exist:
- use a
std::vector
- use a
std::bitset
- enums are represented by unique
using a
std:vector
is the traditional solution but using the alternative
of a
std::bitset
is more optimal; both in performance as in less
memory consumption. The last option is effectively the same as using bitset but enums are more naturllly sequentially ordened.
Example
Suppose you have the case where used file types are represented by
enums and there is a 'Content' class which gives an oversight of all used file
types.
enum EFileTypes
{
eFtBegin = 0,
eFtData = eFtBegin,
eFtBitmap,
eFtConfig,
eFtEnd,
};
using std::vector
Normally one uses a std::vector
to store elements. Above example would then
become like this:
#include <algorithm>
#include <vector>
struct Content
{
void AddFileType(EFileTypes eFt)
{
if (!HasFileType(eFt))
{
m_vecTypes.push_back(eFt);
}
}
bool HasFileType(EFileTypes eFt) const
{
return std::find(m_vecTypes.cbegin(), m_vecTypes.cend(), eFt) != m_vecTypes.cend();
}
std::vector<EFileTypes> m_vecTypes;
};
using std::bitset
with a bitset one can use the (unique) enum value as position in a bitset:
#include <bitset>
struct Content
{
void AddFileType(EFileTypes eFt)
{
m_btsTypes.set(eFt);
}
bool HasFileType(EFileTypes eFt) const
{
return m_btsTypes.test(eFt);
}
std::bitset<eFtEnd> m_btsTypes;
};
Using a bitset has thus the following advantages:
- O (c) lookup to check if an enum is present
-
memory dense when there are only a couple of enums. Only when you have a large
enum range (e.g. > 64) this can become a less attractive option since the bitset is always the size of the largest enum value
- equality operator is easily made