pfor/tests/mp/pack.cpp

151 lines
5.0 KiB
C++

#include <catch.hpp>
#include "../common.h"
#include <pfor/mp/meta.h>
#include <pfor/mp/pack.h>
template<typename, typename> struct Comparator;
template<std::size_t A, std::size_t B>
struct Comparator<pfor::UIntToType<A>, pfor::UIntToType<B>> {
static constexpr bool value = A < B;
};
template<typename T, std::size_t I>
using TSBefore = pfor::impl::PackSortBefore<Comparator, T, pfor::UIntToType<I>>;
template<typename T, std::size_t I>
using TSAfter = pfor::impl::PackSortAfter<Comparator, T, pfor::UIntToType<I>>;
template<typename T, std::size_t I>
using TSInsert = pfor::PackSortInsert<Comparator, T, pfor::UIntToType<I>>;
template<typename T>
using TSort = pfor::PackSort<Comparator, T>;
TEST_CASE("Pack") {
using T1 = pfor::Pack<>;
using T2 = pfor::Pack<char>;
using T3 = pfor::Pack<char, char>;
using T4 = pfor::Pack<char, char, int>;
using T5 = pfor::Pack<char, int, char, float, int, char>;
using U3 = pfor::Pack<int, char>;
using U4 = pfor::Pack<char, int, char>;
using U5 = pfor::Pack<char, char, int, char>;
using M0 = pfor::Pack<>;
using M1 = pfor::Pack<char>;
using M2 = pfor::Pack<char, char, char>;
using M3 = pfor::Pack<char, int, char>;
using M4 = pfor::Pack<char, int, char, char, char, char, int, char>;
SECTION("PackGet") {
TEST(REQUIRE, is_same_v<pfor::PackGet<T2, 0>, char>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T3, 0>, char>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T3, 1>, char>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T4, 0>, char>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T4, 1>, char>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T4, 2>, int>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T5, 0>, char>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T5, 1>, int>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T5, 2>, char>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T5, 3>, float>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T5, 4>, int>);
TEST(REQUIRE, is_same_v<pfor::PackGet<T5, 5>, char>);
}
SECTION("PackAppend") {
TEST(REQUIRE, is_same_v<pfor::PackAppend<T1, char>, T2>);
TEST(REQUIRE, is_same_v<pfor::PackAppend<T2, char>, T3>);
TEST(REQUIRE, is_same_v<pfor::PackAppend<T3, int>, T4>);
}
SECTION("PackPrepend") {
TEST(REQUIRE, is_same_v<pfor::PackPrepend<T2, int>, U3>);
TEST(REQUIRE, is_same_v<pfor::PackPrepend<U3, char>, U4>);
TEST(REQUIRE, is_same_v<pfor::PackPrepend<U4, char>, U5>);
}
SECTION("PackRemove") {
TEST(REQUIRE, is_same_v<pfor::PackRemove<T4, int>, T3>);
TEST(REQUIRE, is_same_v<pfor::PackRemove<M4, char>, pfor::Pack<int, int>>);
TEST(REQUIRE, is_same_v<pfor::PackRemove<T5, double>, T5>);
}
SECTION("PackContains") {
TEST(REQUIRE_FALSE, pfor::packContains<T1, char>);
TEST(REQUIRE, pfor::packContains<T2, char>);
TEST(REQUIRE_FALSE, pfor::packContains<T2, int>);
TEST(REQUIRE, pfor::packContains<T3, char>);
TEST(REQUIRE_FALSE, pfor::packContains<T3, int>);
TEST(REQUIRE, pfor::packContains<T4, int>);
}
SECTION("PackUniq") {
using U1 = pfor::Pack<>;
using U2 = pfor::Pack<char>;
using U3 = pfor::Pack<char>;
using U4 = pfor::Pack<char, int>;
using U5 = pfor::Pack<char, int, float>;
TEST(REQUIRE, is_same_v<pfor::PackUniq<T1>, U1>);
TEST(REQUIRE, is_same_v<pfor::PackUniq<T2>, U2>);
TEST(REQUIRE, is_same_v<pfor::PackUniq<T3>, U3>);
TEST(REQUIRE, is_same_v<pfor::PackUniq<T4>, U4>);
TEST(REQUIRE, is_same_v<pfor::PackUniq<T5>, U5>);
}
SECTION("PackSize") {
TEST_IF(REQUIRE, ==, 0, pfor::packSize<T1>);
TEST_IF(REQUIRE, ==, 1, pfor::packSize<T2>);
TEST_IF(REQUIRE, ==, 2, pfor::packSize<T3>);
TEST_IF(REQUIRE, ==, 3, pfor::packSize<T4>);
TEST_IF(REQUIRE, ==, 6, pfor::packSize<T5>);
}
SECTION("PackMerge") {
TEST(REQUIRE, is_same_v<pfor::PackMerge<>, M0>);
TEST(REQUIRE, is_same_v<pfor::PackMerge<T1>, M0>);
TEST(REQUIRE, is_same_v<pfor::PackMerge<T2>, M1>);
TEST(REQUIRE, is_same_v<pfor::PackMerge<T2, T3>, M2>);
TEST(REQUIRE, is_same_v<pfor::PackMerge<T2, U3>, M3>);
TEST(REQUIRE, is_same_v<pfor::PackMerge<T2, U3, T1, T2, U5>, M4>);
}
SECTION("Pack sorting") {
using IT0 = UIntsToPack<>;
using IT1 = UIntsToPack<6, 4, 3, 8, 9, 2, 5, 3>;
using ST0 = IT0;
using ST1 = UIntsToPack<2, 3, 3, 4, 5, 6, 8, 9>;
using ST2 = UIntsToPack<2, 3, 3, 4, 5, 6, 7, 8, 9>;
using ST3 = UIntsToPack<2, 3, 3, 4, 5, 6, 7, 7, 8, 9>;
using TEmpty = pfor::Pack<>;
using BT1 = UIntsToPack<2, 3, 3, 4>;
using AT1 = UIntsToPack<5, 6, 8, 9>;
SECTION("PackSortBefore") {
TEST(REQUIRE, is_same_v<TSBefore<ST0, 5>, TEmpty>);
TEST(REQUIRE, is_same_v<TSBefore<ST1, 2>, TEmpty>);
TEST(REQUIRE, is_same_v<TSBefore<ST1, 5>, BT1>);
}
SECTION("PackSortAfter") {
TEST(REQUIRE, is_same_v<TSAfter<ST0, 5>, TEmpty>);
TEST(REQUIRE, is_same_v<TSAfter<ST1, 10>, TEmpty>);
TEST(REQUIRE, is_same_v<TSAfter<ST1, 5>, AT1>);
}
SECTION("PackSortInsert") {
TEST(REQUIRE, is_same_v<TSInsert<ST0, 7>, UIntsToPack<7>>);
TEST(REQUIRE, is_same_v<TSInsert<ST1, 7>, ST2>);
TEST(REQUIRE, is_same_v<TSInsert<ST2, 7>, ST3>);
}
SECTION("PackSort") {
TEST(REQUIRE, is_same_v<TSort<IT0>, ST0>);
TEST(REQUIRE, is_same_v<TSort<IT1>, ST1>);
}
}
}