Added forEach to EC/Meta
This commit is contained in:
parent
eeb22ede25
commit
bee0c9d26d
3 changed files with 51 additions and 0 deletions
32
src/EC/Meta/ForEach.hpp
Normal file
32
src/EC/Meta/ForEach.hpp
Normal file
|
@ -0,0 +1,32 @@
|
|||
|
||||
#ifndef EC_META_FOR_EACH_HPP
|
||||
#define EC_META_FOR_EACH_HPP
|
||||
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
#include "Morph.hpp"
|
||||
|
||||
namespace EC
|
||||
{
|
||||
namespace Meta
|
||||
{
|
||||
template <typename Function, typename TTuple, std::size_t... Indices>
|
||||
constexpr void forEachHelper(Function&& function, TTuple tuple, std::index_sequence<Indices...>)
|
||||
{
|
||||
return (void)std::initializer_list<int>{(function(std::get<Indices>(tuple)), 0)...};
|
||||
}
|
||||
|
||||
template <typename TTypeList, typename Function>
|
||||
constexpr void forEach(Function&& function)
|
||||
{
|
||||
using TTuple = EC::Meta::Morph<TTypeList, std::tuple<> >;
|
||||
using TTupleSize = std::tuple_size<TTuple>;
|
||||
using IndexSeq = std::make_index_sequence<TTupleSize::value>;
|
||||
|
||||
return forEachHelper(std::forward<Function>(function), TTuple{}, IndexSeq{});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -6,4 +6,5 @@
|
|||
#include "ContainsAll.hpp"
|
||||
#include "IndexOf.hpp"
|
||||
#include "Morph.hpp"
|
||||
#include "ForEach.hpp"
|
||||
|
||||
|
|
|
@ -181,3 +181,21 @@ TEST(Meta, TypeListGet)
|
|||
EXPECT_TRUE(isSame);
|
||||
}
|
||||
|
||||
TEST(Meta, ForEach)
|
||||
{
|
||||
EC::Bitset<ListComponentsAll, ListTagsAll> bitset;
|
||||
|
||||
auto setBits = [&bitset] (auto t) {
|
||||
bitset[EC::Meta::IndexOf<decltype(t), ListAll>::value] = true;
|
||||
};
|
||||
|
||||
EC::Meta::forEach<ListComponentsSome>(setBits);
|
||||
|
||||
EXPECT_FALSE(bitset[0]);
|
||||
EXPECT_TRUE(bitset[1]);
|
||||
EXPECT_FALSE(bitset[2]);
|
||||
EXPECT_TRUE(bitset[3]);
|
||||
EXPECT_FALSE(bitset[4]);
|
||||
EXPECT_FALSE(bitset[5]);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue