Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

146 lines
5.1 KiB
C++

//
// main.cpp
// ArticleEnumClass_v2
//
// Created by Gabriel Aubut-Lussier on 17-08-07.
// Copyright © 2017 Gabriel Aubut-Lussier. All rights reserved.
//
#include <cassert>
#include "EnumClass.h"
#include <iostream>
enum class eTest
{
kEnumerator1 = 1 << 0,
kEnumerator2 = 1 << 1,
kEnumerator3 = 1 << 2
};
enableEnumClassBitmask(eTest);
constexpr bool f(eTest e) {return e != static_cast<eTest>(0);}
constexpr bool g(enumerator<eTest> e) {return bool(e);}
constexpr bool h(bitmask<eTest> e) {return bool(e);}
int main(int argc, const char * argv[])
{
constexpr auto t = eTest::kEnumerator1;
constexpr auto enumerator = ::enumerator<eTest>{t};
constexpr auto bitmask = t | eTest::kEnumerator2;
/**
* operator&
*/
static_assert(t & t, "operator&(T, T)");
static_assert(enumerator & enumerator, "operator&(enumerator<T>, enumerator<T>)");
static_assert(bitmask & bitmask, "operator&(bitmask<T>, bitmask<T>)");
static_assert(t & enumerator, "operator&(T, enumerator<T>)");
static_assert(enumerator & t, "operator&(enumerator<T>, T)");
static_assert(t & bitmask, "operator&(T, bitmask<T>)");
static_assert(bitmask & t, "operator&(bitmask<T>, T)");
static_assert(enumerator & bitmask, "operator&(enumerator<T>, bitmask<T>)");
static_assert(bitmask & enumerator, "operator&(bitmask<T>, enumerator<T>)");
/**
* operator|
*/
static_assert(enumerator | enumerator, "operator|(T, T)");
static_assert(enumerator | enumerator, "operator|(enumerator<T>, enumerator<T>)");
static_assert(bitmask | bitmask, "operator|(bitmask<T>, bitmask<T>)");
static_assert(t | enumerator, "operator|(T, enumerator<T>)");
static_assert(enumerator | t, "operator|(enumerator<T>, T)");
static_assert(t | bitmask, "operator|(T, bitmask<T>)");
static_assert(bitmask | t, "operator|(bitmask<T>, T)");
static_assert(enumerator | bitmask, "operator|(enumerator<T>, bitmask<T>)");
static_assert(bitmask | enumerator, "operator|(bitmask<T>, enumerator<T>)");
/**
* operator^
*/
static_assert(!bool(t ^ t), "operator^(T, T)");
static_assert(!bool(enumerator ^ enumerator), "operator^(enumerator<T>, enumerator<T>)");
static_assert(!bool(bitmask ^ bitmask), "operator^(bitmask<T>, bitmask<T>)");
static_assert(!bool(t ^ enumerator), "operator^(T, enumerator<T>)");
static_assert(!bool(enumerator ^ t), "operator^(enumerator<T>, T)");
static_assert(t ^ bitmask, "operator^(T, bitmask<T>)");
static_assert(bitmask ^ t, "operator^(bitmask<T>, T)");
static_assert(enumerator ^ bitmask, "operator^(enumerator<T>, bitmask<T>)");
static_assert(bitmask ^ enumerator, "operator^(bitmask<T>, enumerator<T>)");
/**
* operator~
*/
static_assert(~t, "operator~(T)");
static_assert(~enumerator, "operator~(enumerator<T>)");
static_assert(~bitmask, "operator~(bitmask<T>)");
/**
* operator&=
*/
auto mutbitmask = bitmask;
mutbitmask &= t;
mutbitmask &= enumerator;
mutbitmask &= mutbitmask;
assert(bitmask);
/**
* operator|=
*/
mutbitmask |= t;
mutbitmask |= enumerator;
mutbitmask |= mutbitmask;
assert(mutbitmask);
/**
* operator^=
*/
mutbitmask ^= t;
mutbitmask ^= enumerator;
mutbitmask ^= mutbitmask;
assert(!mutbitmask);
/**
* bitmask::operator bool
*/
assert(!bool(mutbitmask));
/**
* operator==
*/
static_assert(t == t, "operator==(T, T)");
static_assert(enumerator == enumerator, "operator==(enumerator<T>, enumerator<T>)");
static_assert(bitmask == bitmask, "operator==(bitmask<T>, bitmask<T>)");
static_assert(t == enumerator, "operator==(T, enumerator<T>)");
static_assert(enumerator == t, "operator==(enumerator<T>, T)");
// static_assert(t == bitmask, "operator==(T, bitmask<T>)");
// static_assert(bitmask == t, "operator==(bitmask<T>, T)");
// static_assert(enumerator == bitmask, "operator==(enumerator<T>, bitmask<T>)");
// static_assert(bitmask == enumerator, "operator==(bitmask<T>, enumerator<T>)");
/**
* operator!=
*/
static_assert(!(t != t), "operator!=(T, T)");
static_assert(!(enumerator != enumerator), "operator!=(enumerator<T>, enumerator<T>)");
static_assert(!(bitmask != bitmask), "operator!=(bitmask<T>, bitmask<T>)");
static_assert(!(t != enumerator), "operator!=(T, enumerator<T>)");
static_assert(!(enumerator != t), "operator!=(enumerator<T>, T)");
// static_assert(t != bitmask, "operator!=(T, bitmask<T>)");
// static_assert(bitmask != t, "operator!=(bitmask<T>, T)");
// static_assert(enumerator != bitmask, "operator!=(enumerator<T>, bitmask<T>)");
// static_assert(bitmask != enumerator, "operator!=(bitmask<T>, enumerator<T>)");
static_assert(enumerator, "enumerator<T>::operator bool()");
static_assert(bitmask, "bitmask<T>::operator bool()");
static_assert(f(t), "no conversion");
static_assert(f(enumerator), "enumerator<T>::operator T() implicit conversion");
static_assert(g(t), "enumerator<T>(T) implicit conversion");
static_assert(h(t), "bitmask<T>(T) implicit conversion");
static_assert(h(enumerator), "bitmask<T>(enumerator<T>) implicit conversion");
static_assert(g(bitmask & t), "It must be possible to isolate a single enumerator from a bitmask");
static_assert(make_bitmask(t) == ::bitmask<eTest>{t}, "Must be able to easily make a bitmask from a single enumerator");
}