Basic meta stuff working
This commit is contained in:
parent
0b39f8bc93
commit
8ffacb16b1
4 changed files with 106 additions and 6 deletions
|
@ -1,11 +1,11 @@
|
|||
cmake_minimum_required(VERSION 2.6)
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
project(EntityComponentSystem)
|
||||
|
||||
set(EntityComponentSystem_SOURCES
|
||||
)
|
||||
set(EntityComponentSystem_HEADERS
|
||||
EC/Meta.hpp)
|
||||
|
||||
add_library(EntityComponentSystem
|
||||
${EntityComponentSystem_SOURCES})
|
||||
add_library(EntityComponentSystem INTERFACE)
|
||||
target_include_directories(EntityComponentSystem INTERFACE ${CMAKE_SOURCE_DIR})
|
||||
|
||||
|
||||
include_directories(${CMAKE_SOURCE_DIR})
|
||||
|
@ -34,6 +34,19 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|||
endif()
|
||||
|
||||
|
||||
install(TARGETS EntityComponentSystem DESTINATION lib)
|
||||
install(FILES ${EntityComponentSystem_HEADERS} DESTINATION include/EC)
|
||||
|
||||
|
||||
find_package(GTest)
|
||||
if(GTEST_FOUND)
|
||||
set(UnitTests_SOURCES
|
||||
test/MetaTest.cpp
|
||||
test/Main.cpp)
|
||||
|
||||
add_executable(UnitTests ${UnitTests_SOURCES})
|
||||
target_link_libraries(UnitTests EntityComponentSystem ${GTEST_LIBRARIES})
|
||||
|
||||
enable_testing()
|
||||
add_test(NAME UnitTests COMMAND UnitTests)
|
||||
endif()
|
||||
|
||||
|
|
40
src/EC/Meta.hpp
Normal file
40
src/EC/Meta.hpp
Normal file
|
@ -0,0 +1,40 @@
|
|||
|
||||
#ifndef EC_META_HPP
|
||||
#define EC_META_HPP
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace EC
|
||||
{
|
||||
namespace Meta
|
||||
{
|
||||
template <typename... Types>
|
||||
struct TypeList
|
||||
{
|
||||
static constexpr std::size_t size{sizeof...(Types)};
|
||||
|
||||
};
|
||||
|
||||
template <typename T, typename... Types>
|
||||
struct ContainsHelper :
|
||||
std::false_type
|
||||
{
|
||||
};
|
||||
|
||||
template <typename T, typename Type, typename... Types>
|
||||
struct ContainsHelper<T, TypeList<Type, Types...> > :
|
||||
std::conditional<
|
||||
std::is_same<T, Type>::value,
|
||||
std::true_type,
|
||||
ContainsHelper<T, TypeList<Types...> >
|
||||
>::type
|
||||
{
|
||||
};
|
||||
|
||||
template <typename T, typename TTypeList>
|
||||
using Contains = std::integral_constant<bool, ContainsHelper<T, TTypeList>::value >;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
8
src/test/Main.cpp
Normal file
8
src/test/Main.cpp
Normal file
|
@ -0,0 +1,8 @@
|
|||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
39
src/test/MetaTest.cpp
Normal file
39
src/test/MetaTest.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <EC/Meta.hpp>
|
||||
|
||||
TEST(Meta, Contains)
|
||||
{
|
||||
struct C0 {};
|
||||
struct C1 {};
|
||||
struct C2 {};
|
||||
struct C3 {};
|
||||
|
||||
using listAll = EC::Meta::TypeList<C0, C1, C2, C3>;
|
||||
|
||||
int size = listAll::size;
|
||||
EXPECT_EQ(size, 4);
|
||||
|
||||
bool result = EC::Meta::Contains<C0, listAll>::value;
|
||||
EXPECT_TRUE(result);
|
||||
result = EC::Meta::Contains<C1, listAll>::value;
|
||||
EXPECT_TRUE(result);
|
||||
result = EC::Meta::Contains<C2, listAll>::value;
|
||||
EXPECT_TRUE(result);
|
||||
result = EC::Meta::Contains<C3, listAll>::value;
|
||||
EXPECT_TRUE(result);
|
||||
|
||||
using listSome = EC::Meta::TypeList<C1, C3>;
|
||||
size = listSome::size;
|
||||
EXPECT_EQ(size, 2);
|
||||
|
||||
result = EC::Meta::Contains<C0, listSome>::value;
|
||||
EXPECT_FALSE(result);
|
||||
result = EC::Meta::Contains<C1, listSome>::value;
|
||||
EXPECT_TRUE(result);
|
||||
result = EC::Meta::Contains<C2, listSome>::value;
|
||||
EXPECT_FALSE(result);
|
||||
result = EC::Meta::Contains<C3, listSome>::value;
|
||||
EXPECT_TRUE(result);
|
||||
}
|
Loading…
Reference in a new issue