pfor/tests/mp/meta.cpp

38 lines
991 B
C++

#include <catch.hpp>
#include "../common.h"
#include <pfor/mp/meta.h>
template<typename T>
struct Sizeof {
static constexpr std::size_t value = sizeof(T);
};
TEST_CASE("Meta") {
SECTION("If") {
TEST(REQUIRE, is_same_v<pfor::If<false, char, int>, int>);
TEST(REQUIRE, is_same_v<pfor::If<true, char, int>, char>);
}
SECTION("accumulate") {
using E = pfor::Pack<>;
using T = pfor::Pack<char, int, float>;
std::size_t esize = pfor::accumulate<Sizeof, E>(0, std::plus<std::size_t>{});
std::size_t tsize = pfor::accumulate<Sizeof, T>(1, std::multiplies<std::size_t>{});
REQUIRE(esize == 0);
REQUIRE(tsize == sizeof(char)*sizeof(int)*sizeof(float));
}
SECTION("GCD") {
pfor::IntToType<pfor::gcd(1, 0)> a; // ensure gcd can be computed at compile-time
REQUIRE(pfor::gcd(5, 0) == 5);
REQUIRE(pfor::gcd(9, 0) == 9);
REQUIRE(pfor::gcd(-21, 9) == 3);
REQUIRE(pfor::gcd(2*3*7*11*17, 11*19*23) == 11);
REQUIRE(pfor::gcd(2*3*7*11*17*23, -11*19*23) == 11*23);
}
}