38 lines
991 B
C++
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);
|
|
}
|
|
}
|