is_permutation - O (N ^ 2), , , , . , .
, :
template<class Meter, class Kilogram, class Second,
class Ampere, class Kelvin, class Candela, class Mole>
struct unit {};
:
template<class, class> struct unit_multiply_impl;
template<class... Exps1, class... Exps2>
struct unit_multiply_impl<unit<Exps1...>, unit<Exps2...>> {
using type = unit<std::ratio_add<Exps1, Exps2>...>;
};
template<class U1, class U2>
using unit_multiply = typename unit_multiply_impl<U1, U2>::type;
Inverse:
template<class U> struct inverse_impl;
template<class... Exps>
struct inverse_impl<unit<Exps...>> {
using type = unit<std::ratio_multiply<Exps, std::ratio<-1>>...>;
};
template<class U> using inverse = typename inverse_impl<U>::type;
= :
template<class U, class... Us> struct compound_impl;
template<class U> struct compound_impl<U> { using type = U; };
template<class U1, class U2, class...Us>
struct compound_impl<U1, U2, Us...>
: compound_impl<unit_multiply<U1, U2>, Us...> {};
template<class U, class... Us>
using compound_unit = typename compound_impl<U, Us...>::type;
:
using std::ratio;
using meters = unit<ratio<1>, ratio<0>, ratio<0>, ratio<0>, ratio<0>, ratio<0>, ratio<0>>;
using seconds = unit<ratio<0>, ratio<0>, ratio<1>, ratio<0>, ratio<0>, ratio<0>, ratio<0>>;
using mps = compound_unit<meters, inverse<seconds>>;
using mps = compound_unit<inverse<seconds>, meters>;
using acc = compound_unit<mps, inverse<seconds>>;
using acc = compound_unit<meters, inverse<seconds>, inverse<seconds>>;
, compound_unit<mps, inverse<seconds>> compound_unit<meters, inverse<seconds>, inverse<seconds>> .