2016-03-04 12:12:37 +00:00
|
|
|
|
2017-09-20 08:16:26 +00:00
|
|
|
// This work derives from Vittorio Romeo's code used for cppcon 2015 licensed
|
|
|
|
// under the Academic Free License.
|
2016-03-15 10:29:13 +00:00
|
|
|
// His code is available here: https://github.com/SuperV1234/cppcon2015
|
|
|
|
|
|
|
|
|
2016-03-04 12:12:37 +00:00
|
|
|
#ifndef EC_BITSET_HPP
|
|
|
|
#define EC_BITSET_HPP
|
|
|
|
|
|
|
|
#include <bitset>
|
|
|
|
#include "Meta/TypeList.hpp"
|
2016-03-04 12:39:25 +00:00
|
|
|
#include "Meta/Combine.hpp"
|
2016-03-05 14:33:24 +00:00
|
|
|
#include "Meta/IndexOf.hpp"
|
2016-03-13 09:07:49 +00:00
|
|
|
#include "Meta/ForEach.hpp"
|
2016-04-20 12:59:47 +00:00
|
|
|
#include "Meta/Contains.hpp"
|
2016-03-04 12:12:37 +00:00
|
|
|
|
|
|
|
namespace EC
|
|
|
|
{
|
|
|
|
template <typename ComponentsList, typename TagsList>
|
|
|
|
struct Bitset :
|
|
|
|
public std::bitset<ComponentsList::size + TagsList::size>
|
|
|
|
{
|
2016-03-04 12:39:25 +00:00
|
|
|
using Combined = EC::Meta::Combine<ComponentsList, TagsList>;
|
|
|
|
|
2016-03-14 09:16:09 +00:00
|
|
|
template <typename Component>
|
|
|
|
constexpr auto getComponentBit() const
|
|
|
|
{
|
|
|
|
return (*this)[EC::Meta::IndexOf<Component, Combined>::value];
|
|
|
|
}
|
|
|
|
|
2016-03-04 12:12:37 +00:00
|
|
|
template <typename Component>
|
|
|
|
constexpr auto getComponentBit()
|
|
|
|
{
|
2016-03-04 12:39:25 +00:00
|
|
|
return (*this)[EC::Meta::IndexOf<Component, Combined>::value];
|
2016-03-04 12:12:37 +00:00
|
|
|
}
|
|
|
|
|
2016-03-14 09:16:09 +00:00
|
|
|
template <typename Tag>
|
|
|
|
constexpr auto getTagBit() const
|
|
|
|
{
|
|
|
|
return (*this)[EC::Meta::IndexOf<Tag, Combined>::value];
|
|
|
|
}
|
|
|
|
|
2016-03-04 12:12:37 +00:00
|
|
|
template <typename Tag>
|
|
|
|
constexpr auto getTagBit()
|
|
|
|
{
|
2016-03-04 12:39:25 +00:00
|
|
|
return (*this)[EC::Meta::IndexOf<Tag, Combined>::value];
|
2016-03-04 12:12:37 +00:00
|
|
|
}
|
2016-03-05 14:33:24 +00:00
|
|
|
|
|
|
|
template <typename Contents>
|
|
|
|
static constexpr Bitset<ComponentsList, TagsList> generateBitset()
|
|
|
|
{
|
|
|
|
Bitset<ComponentsList, TagsList> bitset;
|
2016-03-13 09:07:49 +00:00
|
|
|
|
|
|
|
EC::Meta::forEach<Contents>([&bitset] (auto t) {
|
|
|
|
if(EC::Meta::Contains<decltype(t), Combined>::value)
|
2016-03-05 14:33:24 +00:00
|
|
|
{
|
2017-09-20 08:16:26 +00:00
|
|
|
bitset[EC::Meta::IndexOf<decltype(t), Combined>::value] =
|
|
|
|
true;
|
2016-03-05 14:33:24 +00:00
|
|
|
}
|
2016-03-13 09:07:49 +00:00
|
|
|
});
|
2016-03-05 14:33:24 +00:00
|
|
|
|
|
|
|
return bitset;
|
|
|
|
}
|
2016-03-04 12:12:37 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|