diff --git a/test/unit_test/static/CMakeLists.txt b/test/unit_test/static/CMakeLists.txt index 4af05b6a..f5135edb 100644 --- a/test/unit_test/static/CMakeLists.txt +++ b/test/unit_test/static/CMakeLists.txt @@ -35,7 +35,6 @@ add_library( chrono_test.cpp concepts_test.cpp # custom_rep_test_min_expl.cpp - custom_rep_test_min_impl.cpp dimension_test.cpp fixed_string_test.cpp fractional_exponent_quantity.cpp diff --git a/test/unit_test/static/custom_rep_test_min_expl.cpp b/test/unit_test/static/custom_rep_test_min_expl.cpp index e69af5d9..689c9666 100644 --- a/test/unit_test/static/custom_rep_test_min_expl.cpp +++ b/test/unit_test/static/custom_rep_test_min_expl.cpp @@ -20,7 +20,9 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -#include +#include +#include +#include #include #include @@ -41,8 +43,6 @@ template class min_expl { std::intmax_t value_; public: - using value_type = std::intmax_t; - // default construction min_expl() requires(Mode != 1) @@ -103,9 +103,6 @@ public: } // namespace -template -inline constexpr bool mp_units::is_scalar> = true; - template struct std::common_type> : std::type_identity> {}; template @@ -113,68 +110,63 @@ struct std::common_type, std::intmax_t> : std::type_identity>, min_expl<>>); -static_assert(!std::convertible_to, quantity>>); +static_assert(std::constructible_from>, min_expl<>>); +static_assert(!std::convertible_to, length>>); // not constructible from an underlying type -static_assert(!std::constructible_from>, int>); -static_assert(!std::convertible_to>>); - -// multiply syntax should work -template -concept creates_quantity = requires { T{} * U; }; - -static_assert(creates_quantity, si::metre>); +static_assert(!std::constructible_from>, int>); +static_assert(!std::convertible_to>>); // dimensionless quantity implicitly convertible from the representation type -static_assert(std::constructible_from>, min_expl<>>); -static_assert(std::convertible_to, quantity>>); +static_assert(std::constructible_from>, min_expl<>>); +static_assert(std::convertible_to, dimensionless>>); // but not from an underlying type -static_assert(std::constructible_from>, int>); -static_assert(!std::convertible_to>>); +static_assert(!std::constructible_from>, int>); +static_assert(!std::convertible_to>>); // or for ratio != 1 -static_assert(!std::constructible_from>, min_expl<>>); -static_assert(!std::convertible_to, quantity>>); +static_assert(std::constructible_from>, min_expl<>>); +static_assert(!std::convertible_to, dimensionless>>); // quantity convertible from itself -static_assert(std::constructible_from>, quantity>>); -static_assert(std::convertible_to>, quantity>>); +static_assert(std::constructible_from>, length>>); +static_assert(std::convertible_to>, length>>); // not convertible from an underlying type -static_assert(std::constructible_from>, quantity>); -static_assert(!std::convertible_to, quantity>>); +static_assert(!std::constructible_from>, length>); +static_assert(!std::convertible_to, length>>); // quantity convertible from another non truncating unit -static_assert(std::constructible_from>, quantity, min_expl<>>>); -static_assert(std::convertible_to, min_expl<>>, quantity>>); +static_assert(std::constructible_from>, length>>); +static_assert(std::convertible_to>, length>>); // quantity not convertible from another truncating unit -static_assert(!std::constructible_from, min_expl<>>, quantity>>); -static_assert(!std::convertible_to>, quantity, min_expl<>>>); +static_assert(!std::constructible_from>, length>>); +static_assert(!std::convertible_to>, length>>); // rep type with explicit constructor - implicit construction of rep not allowed -static_assert(!std::constructible_from>, int>); -static_assert(!std::convertible_to>>); +static_assert(!std::constructible_from>, int>); +static_assert(!std::convertible_to>>); -static_assert(!std::constructible_from>, quantity>); -static_assert(!std::convertible_to, quantity>>); +static_assert(!std::constructible_from>, length>); +static_assert(!std::convertible_to, length>>); -static_assert(!std::constructible_from, min_expl<>>); -static_assert(!std::convertible_to, quantity>); +static_assert(!std::constructible_from, min_expl<>>); +static_assert(!std::convertible_to, length>); -static_assert(!std::constructible_from, quantity>>); -static_assert(!std::convertible_to>, quantity>); +static_assert(!std::constructible_from, length>>); +static_assert(!std::convertible_to>, length>); -static_assert(!std::constructible_from>, quantity>); -static_assert(!std::convertible_to, quantity>>); +static_assert(!std::constructible_from>, dimensionless>); +static_assert(!std::convertible_to, length>>); -static_assert(!std::constructible_from, quantity>>); -static_assert(!std::convertible_to>, quantity>); +static_assert(!std::constructible_from, dimensionless>>); +static_assert(!std::convertible_to>, length>); // all operations needed to satisfy concept static_assert(Representation>); @@ -194,7 +186,7 @@ static_assert(!Representation>); // quantity's operators should mirror the representation type capabilities template -concept invalid_member_operations = requires(quantity lhs) { +concept invalid_member_operations = requires(length lhs) { requires !requires { +lhs; }; requires !requires { -lhs; }; requires !requires { ++lhs; }; @@ -202,55 +194,50 @@ concept invalid_member_operations = requires(quantity lhs) { requires !requires { --lhs; }; requires !requires { lhs--; }; - requires !requires(quantity rhs) { lhs += rhs; }; - requires !requires(quantity rhs) { lhs -= rhs; }; + requires !requires(length rhs) { lhs += rhs; }; + requires !requires(length rhs) { lhs -= rhs; }; requires !requires(Rep rhs) { lhs *= rhs; }; requires !requires(Rep rhs) { lhs /= rhs; }; requires !requires(Rep rhs) { lhs %= rhs; }; - requires !requires(quantity rhs) { lhs %= rhs; }; + requires !requires(length rhs) { lhs %= rhs; }; - requires !requires(quantity rhs) { lhs + rhs; }; - requires !requires(quantity rhs) { lhs - rhs; }; + requires !requires(length rhs) { lhs + rhs; }; + requires !requires(length rhs) { lhs - rhs; }; requires !requires(Rep rhs) { lhs % rhs; }; - requires !requires(quantity rhs) { lhs % rhs; }; - requires !requires(quantity rhs) { lhs < rhs; }; - requires !requires(quantity rhs) { lhs > rhs; }; - requires !requires(quantity rhs) { lhs <= rhs; }; - requires !requires(quantity rhs) { lhs >= rhs; }; + requires !requires(length rhs) { lhs % rhs; }; + requires !requires(length rhs) { lhs < rhs; }; + requires !requires(length rhs) { lhs > rhs; }; + requires !requires(length rhs) { lhs <= rhs; }; + requires !requires(length rhs) { lhs >= rhs; }; - requires !requires(quantity rhs) { lhs + rhs; }; - requires !requires(quantity rhs) { lhs - rhs; }; + requires !requires(length rhs) { lhs + rhs; }; + requires !requires(length rhs) { lhs - rhs; }; requires !requires(int rhs) { lhs % rhs; }; - requires !requires(quantity rhs) { lhs % rhs; }; - requires !requires(quantity rhs) { lhs == rhs; }; - requires !requires(quantity rhs) { lhs != rhs; }; - requires !requires(quantity rhs) { lhs < rhs; }; - requires !requires(quantity rhs) { lhs > rhs; }; - requires !requires(quantity rhs) { lhs <= rhs; }; - requires !requires(quantity rhs) { lhs >= rhs; }; + requires !requires(length rhs) { lhs % rhs; }; + requires !requires(length rhs) { lhs == rhs; }; + requires !requires(length rhs) { lhs != rhs; }; + requires !requires(length rhs) { lhs < rhs; }; + requires !requires(length rhs) { lhs > rhs; }; + requires !requires(length rhs) { lhs <= rhs; }; + requires !requires(length rhs) { lhs >= rhs; }; requires !requires(std::ostream os) { os << lhs; }; }; static_assert(invalid_member_operations>); // equality -static_assert(quantity, min_expl<>>(min_expl(2)) == - quantity>(min_expl(2'000))); -static_assert(quantity>(min_expl(123)) * min_expl(2) == - quantity>(min_expl(246))); -static_assert(quantity>(min_expl(123)) * quantity{min_expl(2)} == - quantity>(min_expl(246))); -static_assert(min_expl(2) * quantity>(min_expl(123)) == - quantity>(min_expl(246))); -static_assert(quantity{min_expl(2)} * quantity>(min_expl(123)) == - quantity>(min_expl(246))); -static_assert(quantity>(min_expl(246)) / min_expl(2) == - quantity>(min_expl(123))); -static_assert(quantity>(min_expl(246)) / quantity{min_expl(2)} == - quantity>(min_expl(123))); -static_assert(quantity>(min_expl(246)) / quantity>(min_expl(2)) == +static_assert(length>(min_expl(2)) == length>(min_expl(2000))); +static_assert(length>(min_expl(123)) * min_expl(2) == length>(min_expl(246))); +static_assert(length>(min_expl(123)) * quantity{min_expl(2)} == + length>(min_expl(246))); +static_assert(min_expl(2) * length>(min_expl(123)) == length>(min_expl(246))); +static_assert(quantity{min_expl(2)} * length>(min_expl(123)) == + length>(min_expl(246))); +static_assert(length>(min_expl(246)) / min_expl(2) == length>(min_expl(123))); +static_assert(length>(min_expl(246)) / quantity{min_expl(2)} == + length>(min_expl(123))); +static_assert(length>(min_expl(246)) / length>(min_expl(2)) == quantity{min_expl(123)}); -static_assert(quantity>(min_expl(246)) / quantity>(min_expl(2)) == - min_expl(123)); +static_assert(length>(min_expl(246)) / length>(min_expl(2)) == min_expl(123)); } // namespace