Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-15 10:09:55

0001 // Boost.Units - A C++ library for zero-overhead dimensional analysis and 
0002 // unit/quantity manipulation and conversion
0003 //
0004 // Copyright (C) 2003-2008 Matthias Christian Schabel
0005 // Copyright (C) 2008 Steven Watanabe
0006 //
0007 // Distributed under the Boost Software License, Version 1.0. (See
0008 // accompanying file LICENSE_1_0.txt or copy at
0009 // http://www.boost.org/LICENSE_1_0.txt)
0010 
0011 #ifndef BOOST_UNITS_MAKE_SYSTEM_HPP
0012 #define BOOST_UNITS_MAKE_SYSTEM_HPP
0013 
0014 /// \file
0015 /// \brief Metafunction returning a homogeneous system that can
0016 ///    represent any combination of the base units.
0017 /// \details
0018 /// Metafunction make_system returning a homogeneous system that can
0019 /// represent any combination of the base units.  There must
0020 /// be no way to represent any of the base units in terms
0021 /// of the others.  make_system<foot_base_unit, meter_base_unit>::type
0022 /// is not allowed, for example.
0023 
0024 #include <boost/units/config.hpp>
0025 #include <boost/units/dimensionless_type.hpp>
0026 #include <boost/units/homogeneous_system.hpp>
0027 #include <boost/units/detail/dimension_list.hpp>
0028 #include <boost/units/detail/sort.hpp>
0029 
0030 namespace boost {
0031 
0032 namespace units {
0033 
0034 #ifdef BOOST_UNITS_DOXYGEN
0035 
0036 namespace detail {
0037 
0038 struct unspecified {};
0039 
0040 }
0041 
0042 /// Metafunction returning a homogeneous system that can
0043 /// represent any combination of the base units.  There must
0044 /// be no way to represent any of the base units in terms
0045 /// of the others.  make_system<foot_base_unit, meter_base_unit>::type
0046 /// is not allowed, for example.
0047 template<class BaseUnit0, class BaseUnit1, class BaseUnit2, ..., class BaseUnitN>
0048 struct make_system
0049 {
0050     typedef homogeneous_system<detail::unspecified> type;
0051 };
0052 
0053 #else
0054 
0055 struct na {};
0056 
0057 template<
0058     class U0 = na,
0059     class U1 = na,
0060     class U2 = na,
0061     class U3 = na,
0062     class U4 = na,
0063     class U5 = na,
0064     class U6 = na,
0065     class U7 = na,
0066     class U8 = na,
0067     class U9 = na
0068 >
0069 struct make_system;
0070 
0071 template<>
0072 struct make_system<>
0073 {
0074     typedef homogeneous_system<dimensionless_type> type;
0075 };
0076 
0077 // Codewarrior 9.2 doesn't like using the defaults.  Need
0078 // to specify na explicitly.
0079 template<class T0>
0080 struct make_system<T0, na, na, na, na, na, na, na, na, na>
0081 {
0082     typedef homogeneous_system<list<T0, dimensionless_type> > type;
0083 };
0084 
0085 template<class T0, class T1>
0086 struct make_system<T0, T1, na, na, na, na, na, na, na, na>
0087 {
0088     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, dimensionless_type> > >::type> type;
0089 };
0090 
0091 template<class T0, class T1, class T2>
0092 struct make_system<T0, T1, T2, na, na, na, na, na, na, na>
0093 {
0094     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, dimensionless_type> > > >::type> type;
0095 };
0096 
0097 template<class T0, class T1, class T2, class T3>
0098 struct make_system<T0, T1, T2, T3, na, na, na, na, na, na>
0099 {
0100     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, dimensionless_type> > > > >::type> type;
0101 };
0102 
0103 template<class T0, class T1, class T2, class T3, class T4>
0104 struct make_system<T0, T1, T2, T3, T4, na, na, na, na, na>
0105 {
0106     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, dimensionless_type> > > > > >::type> type;
0107 };
0108 
0109 template<class T0, class T1, class T2, class T3, class T4, class T5>
0110 struct make_system<T0, T1, T2, T3, T4, T5, na, na, na, na>
0111 {
0112     typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, dimensionless_type> > > > > > >::type> type;
0113 };
0114 
0115 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
0116 struct make_system<T0, T1, T2, T3, T4, T5, T6, na, na, na>
0117 {
0118     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;
0119 };
0120 
0121 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7>
0122 struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, na, na>
0123 {
0124     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;
0125 };
0126 
0127 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
0128 struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, T8, na>
0129 {
0130     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;
0131 };
0132 
0133 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
0134 struct make_system
0135 {
0136     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;
0137 };
0138 
0139 #endif
0140 
0141 } // namespace units
0142 
0143 } // namespace boost
0144 
0145 #endif