diff --git a/include/bitcoin/system/constraints.hpp b/include/bitcoin/system/constraints.hpp index 3f1c519d8d..cbcc280f86 100644 --- a/include/bitcoin/system/constraints.hpp +++ b/include/bitcoin/system/constraints.hpp @@ -118,6 +118,10 @@ template using if_not_base_of = bool_if< !std::is_base_of::value>; +template +using if_common_type = bool_if< + is_common_type>; + template using if_same_size = bool_if< is_same_size>; diff --git a/include/bitcoin/system/typelets.hpp b/include/bitcoin/system/typelets.hpp index 3577319b58..209ecfb754 100644 --- a/include/bitcoin/system/typelets.hpp +++ b/include/bitcoin/system/typelets.hpp @@ -32,6 +32,16 @@ template constexpr bool is_same_type = std::is_same_v, std::decay_t>; +/// Left is base class of Right, independent of const and volatility. +template +constexpr bool is_base_type = std::is_base_of_v, + std::decay_t>; + +/// Types share a common base class or are the same type. +template +constexpr bool is_common_type = is_base_type || + is_base_type; + /// Alias - bool is unsigned: bool(-1) < bool(0). w/char sign unspecified. /// w/charxx_t types are unsigned. iostream relies on w/char. template @@ -76,8 +86,7 @@ constexpr bool is_integral_integer = is_integral /*&& is_integer*/; /// numeric_limits may be specialized by non-integrals (such as uintx). template -constexpr bool is_floating_point = - std::is_floating_point_v>; +constexpr bool is_floating_point = std::is_floating_point_v>; /// Constrained to is_integral types. template , bool> = true> diff --git a/test/constraints.cpp b/test/constraints.cpp index 0f5be12261..329e5b302f 100644 --- a/test/constraints.cpp +++ b/test/constraints.cpp @@ -18,18 +18,21 @@ */ #include "test.hpp" - // helpers typedef bool non_constant; typedef const bool constant; -class base {}; +class not_default_constructible { not_default_constructible(int) {} }; + class not_derived {}; +class base {}; class derived : base {}; -////class not_default_constructible { not_default_constructible(int) {}}; +class more_derived : derived {}; +class also_derived : base {}; +class more_also_derived : also_derived {}; -template -constexpr bool is_defined = true; +template +constexpr bool is_defined = !std::is_void_v; // sizes @@ -129,8 +132,8 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); +static_assert(is_defined>); +static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -138,7 +141,7 @@ static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); -////static_assert(!is_defined>); +////////static_assert(!is_defined>); static_assert(is_defined>); static_assert(is_defined>); @@ -164,10 +167,10 @@ static_assert(is_defined>); ////static_assert(!is_defined>); static_assert(is_defined>); -////static_assert(!is_defined>); +////static_assert(!is_defined>); static_assert(is_defined>); -////static_assert(!is_defined>); +////static_assert(!is_defined>); static_assert(is_defined>); static_assert(is_defined>); @@ -183,6 +186,19 @@ static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); +static_assert(is_defined>); +static_assert(is_defined>); +static_assert(is_defined>); +static_assert(is_defined>); +static_assert(is_defined>); +static_assert(is_defined>); +static_assert(is_defined>); +static_assert(is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); + static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); @@ -202,10 +218,6 @@ static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(!is_defined>); -////static_assert(!is_defined>); static_assert(is_defined>); static_assert(is_defined>); @@ -216,20 +228,15 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); + +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); static_assert(is_defined>); static_assert(is_defined>); @@ -237,7 +244,7 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); +static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -271,7 +278,7 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); +static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -286,20 +293,16 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); +////static_assert(!is_defined>); static_assert(is_defined>); static_assert(is_defined>); @@ -320,8 +323,6 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(!is_defined>); -////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -347,14 +348,14 @@ static_assert(is_defined>>); ////static_assert(!is_defined>); static_assert(is_defined>); -////static_assert(is_defined>>); +static_assert(is_defined>>); ////static_assert(!is_defined>); -static_assert(is_defined>>); +////static_assert(!is_defined>>); ////static_assert(!is_defined>); static_assert(is_defined>); static_assert(is_defined>); -//static_assert(!is_defined>); +////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -389,7 +390,7 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); +////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -441,7 +442,7 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); +////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -449,7 +450,7 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); +static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -491,8 +492,8 @@ static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>>); -// integral integer types -// bool is considered non-integral. + // integral integer types + // bool is considered non-integral. static_assert(is_defined>); static_assert(is_defined>); @@ -559,7 +560,7 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); +////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -588,7 +589,7 @@ static_assert(is_defined static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); +////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -596,7 +597,7 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); +static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -606,7 +607,7 @@ static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); static_assert(is_defined>); -////static_assert(is_defined>); +////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -619,8 +620,8 @@ static_assert(is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); -////static_assert(is_defined>); -////static_assert(is_defined>); +////static_assert(is_little_endian || is_defined>); +////static_assert(is_big_endian || is_defined>); ////static_assert(!is_defined>); ////static_assert(!is_defined>); @@ -647,7 +648,8 @@ static_assert(is_defined>>); static_assert(is_defined>); static_assert(is_defined>>); static_assert(is_defined>>); -////static_assert(is_defined>>); +////static_assert(!is_defined>>); +////static_assert(!is_defined>>); ////static_assert(!is_defined>); ////static_assert(!is_defined>>); ////static_assert(!is_defined>); \ No newline at end of file diff --git a/test/typelets.cpp b/test/typelets.cpp index db89f9d7d3..f336368cc8 100644 --- a/test/typelets.cpp +++ b/test/typelets.cpp @@ -21,6 +21,8 @@ class base {}; class not_derived {}; class derived : base {}; +class also_derived : base {}; +class more_derived : also_derived {}; // These are implementation defined. ////static_assert(is_same_type); @@ -55,6 +57,26 @@ static_assert(!is_same_type); static_assert(!is_same_type); static_assert(is_same_type), const bool>); +// Classes only for derivation. +static_assert(!is_base_type); +static_assert(is_base_type); +static_assert(is_base_type); +static_assert(is_base_type); +static_assert(is_base_type); +static_assert(!is_base_type); + +// Classes only for derivation. +static_assert(!is_common_type); +static_assert(is_common_type); +static_assert(is_common_type); +static_assert(is_common_type); +static_assert(is_common_type); +static_assert(!is_common_type); +static_assert(!is_common_type); +static_assert(!is_common_type); +static_assert(is_common_type); +static_assert(is_common_type); + // These are implementation defined. ////static_assert(is_signed); ////static_assert(!is_signed);