// The MIT License (MIT) // // Copyright (c) 2018 Mateusz Pusz // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #if MP_UNITS_HOSTED #include #endif #ifdef MP_UNITS_IMPORT_STD import std; #else #include #include #if MP_UNITS_HOSTED #include #include #include #endif #endif namespace { using namespace mp_units; inline constexpr struct my_origin final : absolute_point_origin { } my_origin; inline constexpr struct my_relative_origin final : relative_point_origin { } my_relative_origin; inline constexpr auto dim_speed = isq::dim_length / isq::dim_time; namespace nu { inline constexpr struct second final : named_unit<"s"> { } second; inline constexpr struct hour final : named_unit<"h", mag<3600> * second> { } hour; } // namespace nu // BaseDimension static_assert(detail::BaseDimension); static_assert(!detail::BaseDimension); static_assert(!detail::BaseDimension); static_assert(!detail::BaseDimension(isq::dim_length))>); static_assert(!detail::BaseDimension>>); static_assert(!detail::BaseDimension); static_assert(!detail::BaseDimension>); static_assert(!detail::BaseDimension); static_assert(!detail::BaseDimension); // Dimension static_assert(Dimension); static_assert(Dimension); static_assert(Dimension); static_assert(Dimension(isq::dim_length))>); static_assert(Dimension>>); static_assert(Dimension); static_assert(Dimension); static_assert(!Dimension>); static_assert(!Dimension); static_assert(!Dimension); // DimensionOf static_assert(DimensionOf); static_assert(DimensionOf); static_assert(DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(!DimensionOf); static_assert(DimensionOf); static_assert(DimensionOf); static_assert(DimensionOf); // QuantitySpec inline constexpr auto speed = isq::length / isq::time; static_assert(QuantitySpec); static_assert(QuantitySpec); static_assert(QuantitySpec); static_assert(QuantitySpec>); static_assert(QuantitySpec); static_assert(QuantitySpec(isq::length))>); static_assert(QuantitySpec); static_assert(QuantitySpec); static_assert(!QuantitySpec); static_assert(!QuantitySpec); // QuantitySpecOf static_assert(QuantitySpecOf); static_assert(QuantitySpecOf); static_assert(!QuantitySpecOf); static_assert(QuantitySpecOf); static_assert(!QuantitySpecOf); static_assert(QuantitySpecOf); static_assert(!QuantitySpecOf); static_assert(QuantitySpecOf, isq::height>); static_assert(QuantitySpecOf, isq::displacement>); static_assert(!QuantitySpecOf); static_assert(!QuantitySpecOf>); static_assert(!QuantitySpecOf, dimensionless>); static_assert(!QuantitySpecOf, kind_of>); static_assert(!QuantitySpecOf); static_assert(!QuantitySpecOf>); static_assert(QuantitySpecOf, isq::angular_measure>); static_assert(QuantitySpecOf, kind_of>); static_assert(!QuantitySpecOf); static_assert(!QuantitySpecOf>); static_assert(!QuantitySpecOf, isq::angular_measure>); static_assert(!QuantitySpecOf, kind_of>); // NamedQuantitySpec static_assert(detail::NamedQuantitySpec); static_assert(detail::NamedQuantitySpec); static_assert(detail::NamedQuantitySpec); static_assert(!detail::NamedQuantitySpec>); static_assert(!detail::NamedQuantitySpec); static_assert(!detail::NamedQuantitySpec(isq::length))>); static_assert(detail::NamedQuantitySpec); static_assert(!detail::NamedQuantitySpec); static_assert(!detail::NamedQuantitySpec); static_assert(!detail::NamedQuantitySpec); // DerivedQuantitySpec static_assert(!detail::DerivedQuantitySpec); static_assert(!detail::DerivedQuantitySpec); static_assert(!detail::DerivedQuantitySpec>); static_assert(!detail::DerivedQuantitySpec); static_assert(detail::DerivedQuantitySpec); static_assert(detail::DerivedQuantitySpec(isq::length))>); static_assert(!detail::DerivedQuantitySpec); static_assert(detail::DerivedQuantitySpec); static_assert(!detail::DerivedQuantitySpec); static_assert(!detail::DerivedQuantitySpec); // QuantityKindSpec static_assert(!detail::QuantityKindSpec); static_assert(!detail::QuantityKindSpec); static_assert(detail::QuantityKindSpec>); static_assert(!detail::QuantityKindSpec); static_assert(!detail::QuantityKindSpec); static_assert(!detail::QuantityKindSpec(isq::length))>); static_assert(!detail::QuantityKindSpec); static_assert(!detail::QuantityKindSpec); static_assert(!detail::QuantityKindSpec); static_assert(!detail::QuantityKindSpec); // Unit static_assert(Unit); static_assert(Unit); static_assert(Unit>); static_assert(Unit); static_assert(Unit); static_assert(Unit); static_assert(Unit * si::second)>); static_assert(Unit); static_assert(Unit(si::metre))>); static_assert(Unit); static_assert(Unit, struct si::second>>); static_assert(Unit>>); static_assert(Unit); static_assert(Unit); static_assert(Unit); static_assert(!Unit>>); static_assert(!Unit>); static_assert(!Unit>); static_assert(!Unit>>); static_assert(!Unit, si::second>>); static_assert(!Unit); static_assert(!Unit); #if MP_UNITS_HOSTED static_assert(!Unit); #endif // PrefixableUnit static_assert(PrefixableUnit); static_assert(PrefixableUnit); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit>); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit * si::second)>); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit(si::metre))>); static_assert(PrefixableUnit); static_assert(!PrefixableUnit, struct si::second>>); static_assert(!PrefixableUnit>>); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit>>); static_assert(!PrefixableUnit>); static_assert(!PrefixableUnit>); static_assert(!PrefixableUnit>>); static_assert(!PrefixableUnit, si::second>>); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit); #if MP_UNITS_HOSTED static_assert(!PrefixableUnit); #endif // AssociatedUnit static_assert(AssociatedUnit); static_assert(!AssociatedUnit); static_assert(AssociatedUnit); static_assert(AssociatedUnit>); static_assert(AssociatedUnit); static_assert(AssociatedUnit); static_assert(AssociatedUnit * si::second)>); static_assert(AssociatedUnit); static_assert(AssociatedUnit(si::metre))>); static_assert(AssociatedUnit); static_assert(AssociatedUnit, struct si::second>>); static_assert(AssociatedUnit>>); static_assert(AssociatedUnit); static_assert(AssociatedUnit / si::hour, si::metre / si::second))>); static_assert(!AssociatedUnit); static_assert(!AssociatedUnit / nu::hour, si::metre / nu::second))>); static_assert(!AssociatedUnit>>); static_assert(!AssociatedUnit>); static_assert(!AssociatedUnit>); static_assert(!AssociatedUnit>>); static_assert(!AssociatedUnit, si::second>>); static_assert(!AssociatedUnit); static_assert(!AssociatedUnit); #if MP_UNITS_HOSTED static_assert(!AssociatedUnit); #endif // UnitOf static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(!UnitOf); static_assert(!UnitOf); static_assert(!UnitOf); // Reference static_assert(Reference); static_assert(Reference); static_assert(Reference); static_assert(Reference); static_assert(Reference); static_assert(!Reference); static_assert(!Reference); static_assert(!Reference>); static_assert(!Reference); static_assert(!Reference); // ReferenceOf static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(!ReferenceOf); static_assert(ReferenceOf); static_assert(!ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(!ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(!ReferenceOf); static_assert(!ReferenceOf); static_assert(!ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(!ReferenceOf); static_assert(!ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); static_assert(!ReferenceOf); static_assert(!ReferenceOf); // RepresentationOf static_assert(RepresentationOf); static_assert(!RepresentationOf); static_assert(!RepresentationOf); static_assert(RepresentationOf); static_assert(!RepresentationOf); static_assert(RepresentationOf); static_assert(!RepresentationOf); static_assert(!RepresentationOf); static_assert(RepresentationOf); static_assert(!RepresentationOf); static_assert(!RepresentationOf); static_assert(!RepresentationOf); static_assert(!RepresentationOf); static_assert(!RepresentationOf); static_assert(!RepresentationOf); static_assert(!RepresentationOf, quantity_character::real_scalar>); #if MP_UNITS_HOSTED static_assert(!RepresentationOf, quantity_character::real_scalar>); static_assert(RepresentationOf, quantity_character::complex_scalar>); static_assert(!RepresentationOf, quantity_character::vector>); static_assert(!RepresentationOf, quantity_character::tensor>); static_assert(!RepresentationOf, quantity_character::real_scalar>); static_assert(!RepresentationOf, quantity_character::complex_scalar>); static_assert(RepresentationOf, quantity_character::vector>); static_assert(!RepresentationOf, quantity_character::complex_scalar>); static_assert(!RepresentationOf, quantity_character::tensor>); static_assert(!RepresentationOf>, quantity_character::real_scalar>); static_assert(!RepresentationOf>, quantity_character::complex_scalar>); static_assert(RepresentationOf>, quantity_character::vector>); static_assert(!RepresentationOf>, quantity_character::complex_scalar>); static_assert(!RepresentationOf>, quantity_character::tensor>); static_assert(!RepresentationOf); static_assert(!RepresentationOf); #endif // Quantity static_assert(Quantity>); static_assert(Quantity>); static_assert(Quantity>); static_assert(Quantity>); #if MP_UNITS_HOSTED static_assert(!Quantity); #endif static_assert(!Quantity>); static_assert(!Quantity); // QuantityOf static_assert(QuantityOf, isq::length>); static_assert(QuantityOf, isq::radius>); static_assert(!QuantityOf, isq::length>); static_assert(QuantityOf, isq::length>); static_assert(!QuantityOf, isq::radius>); static_assert(QuantityOf, isq::length>); static_assert(QuantityOf, isq::radius>); static_assert(!QuantityOf, isq::dim_length>); static_assert(QuantityOf, dimensionless>); static_assert(QuantityOf, dimensionless>); static_assert(QuantityOf, isq::rotation>); static_assert(QuantityOf, dimensionless>); static_assert(QuantityOf, isq::angular_measure>); static_assert(!QuantityOf, dimensionless>); static_assert(QuantityOf, isq::angular_measure>); static_assert(!QuantityOf, dimensionless>); static_assert(QuantityOf, isq::rotation>); static_assert(QuantityOf, isq::angular_measure>); static_assert(!QuantityOf, isq::rotation>); static_assert(!QuantityOf, isq::angular_measure>); // QuantityLike #if MP_UNITS_HOSTED static_assert(QuantityLike); static_assert(QuantityLike); #endif static_assert(!QuantityLike>); static_assert(!QuantityLike>); static_assert(!QuantityLike); // QuantityPoint static_assert(QuantityPoint>); static_assert(QuantityPoint>); static_assert(QuantityPoint>); static_assert(QuantityPoint>); static_assert(QuantityPoint>); static_assert(QuantityPoint>); static_assert(!QuantityPoint); static_assert(!QuantityPoint>); static_assert(!QuantityPoint); static_assert(!QuantityPoint); #if MP_UNITS_HOSTED static_assert(!QuantityPoint); static_assert(!QuantityPoint>); #endif static_assert(!QuantityPoint); // QuantityPointOf static_assert(QuantityPointOf, isq::length>); static_assert(QuantityPointOf, isq::radius>); static_assert(QuantityPointOf, isq::length>); static_assert(!QuantityPointOf, isq::radius>); static_assert(QuantityPointOf, isq::length>); static_assert(QuantityPointOf, isq::radius>); static_assert(QuantityPointOf, isq::length>); static_assert(QuantityPointOf, isq::radius>); static_assert(QuantityPointOf, my_origin>); static_assert(QuantityPointOf, my_relative_origin>); static_assert(QuantityPointOf, my_relative_origin>); static_assert(QuantityPointOf, my_origin>); static_assert(QuantityPointOf, my_origin>); static_assert(QuantityPointOf, my_relative_origin>); static_assert(QuantityPointOf, my_relative_origin>); static_assert(QuantityPointOf, my_origin>); static_assert(QuantityPointOf, my_origin>); static_assert(QuantityPointOf, my_relative_origin>); static_assert(QuantityPointOf, my_relative_origin>); static_assert(QuantityPointOf, my_origin>); // PointOrigin static_assert(PointOrigin); static_assert(PointOrigin); static_assert(!PointOrigin>); static_assert(!PointOrigin>); static_assert(!PointOrigin>); static_assert(!PointOrigin>); static_assert(!PointOrigin>); static_assert(!PointOrigin); #if MP_UNITS_HOSTED static_assert(!PointOrigin); static_assert(!PointOrigin>); #endif static_assert(!PointOrigin); // PointOriginFor static_assert(PointOriginFor); static_assert(PointOriginFor); static_assert(!PointOriginFor); static_assert(PointOriginFor); static_assert(PointOriginFor); static_assert(!PointOriginFor); static_assert(!PointOriginFor, isq::length>); static_assert(!PointOriginFor, isq::radius>); static_assert(!PointOriginFor, isq::time>); static_assert(!PointOriginFor, isq::length>); static_assert(!PointOriginFor, isq::radius>); static_assert(!PointOriginFor, isq::time>); static_assert(!PointOriginFor, isq::length>); static_assert(!PointOriginFor, isq::radius>); static_assert(!PointOriginFor, isq::time>); static_assert(!PointOriginFor, isq::length>); static_assert(!PointOriginFor, isq::radius>); static_assert(!PointOriginFor, isq::time>); static_assert(!PointOriginFor); #if MP_UNITS_HOSTED static_assert(!PointOriginFor); static_assert(!PointOriginFor, isq::length>); #endif static_assert(!PointOriginFor); // QuantityPointLike #if MP_UNITS_HOSTED static_assert(QuantityPointLike>); static_assert(!QuantityPointLike); #endif static_assert(!QuantityPointLike>); static_assert(!QuantityPointLike>); static_assert(!QuantityPointLike); // Quantity Character Concepts #if MP_UNITS_HOSTED // TODO provide support for the below when quantity specifications expressions are done static_assert(detail::Scalar>); static_assert(detail::Scalar>); static_assert(detail::Scalar>); static_assert(detail::Scalar>); // static_assert(detail::Scalar>>); static_assert(!detail::Scalar>>); static_assert(!detail::Scalar>>); static_assert(!detail::Scalar>>); static_assert(!detail::Scalar>); static_assert(!detail::Scalar>); static_assert(detail::RealScalar>); static_assert(detail::RealScalar>); static_assert(detail::RealScalar>); static_assert(detail::RealScalar>); // static_assert(!detail::RealScalar>); static_assert(!detail::RealScalar>>); static_assert(!detail::ComplexScalar>); static_assert(!detail::ComplexScalar>); static_assert(!detail::ComplexScalar>); static_assert(!detail::ComplexScalar>); static_assert(!detail::ComplexScalar>); // static_assert(detail::ComplexScalar>>); // static_assert(detail::Vector>); // static_assert(detail::Vector>); // static_assert(detail::Vector>); static_assert(!detail::Vector>); // static_assert(detail::Vector>); static_assert(!detail::Vector>>); // static_assert(detail::Vector, cartesian_vector>); // static_assert(detail::Vector>>); // static_assert(detail::Vector, cartesian_vector>); // static_assert(detail::Vector>>); #endif } // namespace