// 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 "units/bits/dimension_op.h" #include "units/unit.h" #include using namespace units; namespace { struct u0 : named_unit {}; struct d0 : base_dimension<"d0", u0> {}; struct u1 : named_unit {}; struct d1 : base_dimension<"d1", u1> {}; struct u2 : named_unit {}; struct d2 : base_dimension<"d2", u2> {}; struct u3 : named_unit {}; struct d3 : base_dimension<"d3", u3> {}; // exponent_invert static_assert(is_same_v>, units::exponent>); static_assert(is_same_v>, units::exponent>); // dim_unpack template struct typeinfo; template using dim_unpack = TYPENAME detail::dim_unpack::type; template using derived_dim = detail::derived_dimension_base; static_assert(is_same_v, exponent_list<>>); static_assert(is_same_v>, exponent_list>>); static_assert(is_same_v, units::exponent>, exponent_list, units::exponent>>); using dim1 = derived_dim>; using dim2 = derived_dim, units::exponent>; static_assert(is_same_v, units::exponent>, exponent_list, units::exponent>>); static_assert(is_same_v, units::exponent, units::exponent>, exponent_list, units::exponent, units::exponent, units::exponent>>); // dim_invert static_assert(is_same_v>>, d0>); static_assert(is_same_v>>, unknown_dimension>>); static_assert( is_same_v, units::exponent>>, unknown_dimension, units::exponent>>); // make_dimension template using make_dimension = detail::make_dimension; static_assert(is_same_v>, derived_dim>>); static_assert(is_same_v, units::exponent>, derived_dim, units::exponent>>); static_assert(is_same_v, units::exponent>, derived_dim, units::exponent>>); static_assert(is_same_v, units::exponent>, derived_dim>>); static_assert(is_same_v, units::exponent>, derived_dim>>); static_assert(is_same_v, units::exponent>, derived_dim>>); static_assert(is_same_v, units::exponent>, derived_dim>>); static_assert(is_same_v, units::exponent, units::exponent, units::exponent>, derived_dim, units::exponent>>); static_assert(is_same_v, units::exponent, units::exponent, units::exponent>, derived_dim, units::exponent>>); static_assert(is_same_v, units::exponent, units::exponent>, derived_dim>>); static_assert(is_same_v, units::exponent, units::exponent>, derived_dim>>); static_assert(is_same_v, units::exponent, units::exponent>, derived_dim>>); // dimension_multiply static_assert(is_same_v>, derived_dim>>, unknown_dimension, units::exponent>>); static_assert( is_same_v>, d1>, unknown_dimension, units::exponent>>); static_assert( is_same_v>>, unknown_dimension, units::exponent>>); static_assert(is_same_v, unknown_dimension, units::exponent>>); static_assert(is_same_v< dimension_multiply, units::exponent, units::exponent>, derived_dim>>, unknown_dimension, units::exponent, units::exponent, units::exponent>>); static_assert(is_same_v< dimension_multiply, units::exponent, units::exponent>, derived_dim>>, unknown_dimension, units::exponent, units::exponent>>); static_assert(is_same_v< dimension_multiply, units::exponent, units::exponent>, derived_dim>>, unknown_dimension, units::exponent>>); static_assert(is_same_v>, derived_dim>>, d0>); // dimension_divide static_assert(is_same_v>, derived_dim>>, unknown_dimension, units::exponent>>); static_assert(is_same_v>, unknown_dimension>>, d0>); } // namespace