123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- // Boost.Units - A C++ library for zero-overhead dimensional analysis and
- // unit/quantity manipulation and conversion
- //
- // Copyright (C) 2003-2008 Matthias Christian Schabel
- // Copyright (C) 2008 Steven Watanabe
- //
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_UNITS_MAKE_SYSTEM_HPP
- #define BOOST_UNITS_MAKE_SYSTEM_HPP
- /// \file
- /// \brief Metafunction returning a homogeneous system that can
- /// represent any combination of the base units.
- /// \details
- /// Metafunction make_system returning a homogeneous system that can
- /// represent any combination of the base units. There must
- /// be no way to represent any of the base units in terms
- /// of the others. make_system<foot_base_unit, meter_base_unit>::type
- /// is not allowed, for example.
- #include <boost/units/config.hpp>
- #include <boost/units/dimensionless_type.hpp>
- #include <boost/units/homogeneous_system.hpp>
- #include <boost/units/detail/dimension_list.hpp>
- #include <boost/units/detail/sort.hpp>
- namespace boost {
- namespace units {
- #ifdef BOOST_UNITS_DOXYGEN
- namespace detail {
- struct unspecified {};
- }
- /// Metafunction returning a homogeneous system that can
- /// represent any combination of the base units. There must
- /// be no way to represent any of the base units in terms
- /// of the others. make_system<foot_base_unit, meter_base_unit>::type
- /// is not allowed, for example.
- template<class BaseUnit0, class BaseUnit1, class BaseUnit2, ..., class BaseUnitN>
- struct make_system
- {
- typedef homogeneous_system<detail::unspecified> type;
- };
- #else
- struct na {};
- template<
- class U0 = na,
- class U1 = na,
- class U2 = na,
- class U3 = na,
- class U4 = na,
- class U5 = na,
- class U6 = na,
- class U7 = na,
- class U8 = na,
- class U9 = na
- >
- struct make_system;
- template<>
- struct make_system<>
- {
- typedef homogeneous_system<dimensionless_type> type;
- };
- // Codewarrior 9.2 doesn't like using the defaults. Need
- // to specify na explicitly.
- template<class T0>
- struct make_system<T0, na, na, na, na, na, na, na, na, na>
- {
- typedef homogeneous_system<list<T0, dimensionless_type> > type;
- };
- template<class T0, class T1>
- struct make_system<T0, T1, na, na, na, na, na, na, na, na>
- {
- typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, dimensionless_type> > >::type> type;
- };
- template<class T0, class T1, class T2>
- struct make_system<T0, T1, T2, na, na, na, na, na, na, na>
- {
- typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, dimensionless_type> > > >::type> type;
- };
- template<class T0, class T1, class T2, class T3>
- struct make_system<T0, T1, T2, T3, na, na, na, na, na, na>
- {
- typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, dimensionless_type> > > > >::type> type;
- };
- template<class T0, class T1, class T2, class T3, class T4>
- struct make_system<T0, T1, T2, T3, T4, na, na, na, na, na>
- {
- typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, dimensionless_type> > > > > >::type> type;
- };
- template<class T0, class T1, class T2, class T3, class T4, class T5>
- struct make_system<T0, T1, T2, T3, T4, T5, na, na, na, na>
- {
- typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, dimensionless_type> > > > > > >::type> type;
- };
- template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
- struct make_system<T0, T1, T2, T3, T4, T5, T6, na, na, na>
- {
- typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, dimensionless_type> > > > > > > >::type> type;
- };
- template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7>
- struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, na, na>
- {
- typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, list<T7, dimensionless_type> > > > > > > > >::type> type;
- };
- template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
- struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, T8, na>
- {
- typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, list<T7, list<T8, dimensionless_type> > > > > > > > > >::type> type;
- };
- template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
- struct make_system
- {
- typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, list<T6, list<T7, list<T8, list<T9, dimensionless_type> > > > > > > > > > >::type> type;
- };
- #endif
- } // namespace units
- } // namespace boost
- #endif
|