1 // Boost.Units - A C++ library for zero-overhead dimensional analysis and 2 // unit/quantity manipulation and conversion 3 // 4 // Copyright (C) 2003-2008 Matthias Christian Schabel 5 // Copyright (C) 2008 Steven Watanabe 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See 8 // accompanying file LICENSE_1_0.txt or copy at 9 // http://www.boost.org/LICENSE_1_0.txt) 10 11 #ifndef BOOST_UNITS_MAKE_SYSTEM_HPP 12 #define BOOST_UNITS_MAKE_SYSTEM_HPP 13 14 /// \file 15 /// \brief Metafunction returning a homogeneous system that can 16 /// represent any combination of the base units. 17 /// \details 18 /// Metafunction make_system returning a homogeneous system that can 19 /// represent any combination of the base units. There must 20 /// be no way to represent any of the base units in terms 21 /// of the others. make_system<foot_base_unit, meter_base_unit>::type 22 /// is not allowed, for example. 23 24 #include <boost/units/config.hpp> 25 #include <boost/units/dimensionless_type.hpp> 26 #include <boost/units/homogeneous_system.hpp> 27 #include <boost/units/detail/dimension_list.hpp> 28 #include <boost/units/detail/sort.hpp> 29 30 namespace boost { 31 32 namespace units { 33 34 #ifdef BOOST_UNITS_DOXYGEN 35 36 namespace detail { 37 38 struct unspecified {}; 39 40 } 41 42 /// Metafunction returning a homogeneous system that can 43 /// represent any combination of the base units. There must 44 /// be no way to represent any of the base units in terms 45 /// of the others. make_system<foot_base_unit, meter_base_unit>::type 46 /// is not allowed, for example. 47 template<class BaseUnit0, class BaseUnit1, class BaseUnit2, ..., class BaseUnitN> 48 struct make_system 49 { 50 typedef homogeneous_system<detail::unspecified> type; 51 }; 52 53 #else 54 55 struct na {}; 56 57 template< 58 class U0 = na, 59 class U1 = na, 60 class U2 = na, 61 class U3 = na, 62 class U4 = na, 63 class U5 = na, 64 class U6 = na, 65 class U7 = na, 66 class U8 = na, 67 class U9 = na 68 > 69 struct make_system; 70 71 template<> 72 struct make_system<> 73 { 74 typedef homogeneous_system<dimensionless_type> type; 75 }; 76 77 // Codewarrior 9.2 doesn't like using the defaults. Need 78 // to specify na explicitly. 79 template<class T0> 80 struct make_system<T0, na, na, na, na, na, na, na, na, na> 81 { 82 typedef homogeneous_system<list<T0, dimensionless_type> > type; 83 }; 84 85 template<class T0, class T1> 86 struct make_system<T0, T1, na, na, na, na, na, na, na, na> 87 { 88 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, dimensionless_type> > >::type> type; 89 }; 90 91 template<class T0, class T1, class T2> 92 struct make_system<T0, T1, T2, na, na, na, na, na, na, na> 93 { 94 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, dimensionless_type> > > >::type> type; 95 }; 96 97 template<class T0, class T1, class T2, class T3> 98 struct make_system<T0, T1, T2, T3, na, na, na, na, na, na> 99 { 100 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, dimensionless_type> > > > >::type> type; 101 }; 102 103 template<class T0, class T1, class T2, class T3, class T4> 104 struct make_system<T0, T1, T2, T3, T4, na, na, na, na, na> 105 { 106 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, dimensionless_type> > > > > >::type> type; 107 }; 108 109 template<class T0, class T1, class T2, class T3, class T4, class T5> 110 struct make_system<T0, T1, T2, T3, T4, T5, na, na, na, na> 111 { 112 typedef homogeneous_system<typename detail::insertion_sort<list<T0, list<T1, list<T2, list<T3, list<T4, list<T5, dimensionless_type> > > > > > >::type> type; 113 }; 114 115 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6> 116 struct make_system<T0, T1, T2, T3, T4, T5, T6, na, na, na> 117 { 118 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; 119 }; 120 121 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7> 122 struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, na, na> 123 { 124 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; 125 }; 126 127 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8> 128 struct make_system<T0, T1, T2, T3, T4, T5, T6, T7, T8, na> 129 { 130 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; 131 }; 132 133 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> 134 struct make_system 135 { 136 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; 137 }; 138 139 #endif 140 141 } // namespace units 142 143 } // namespace boost 144 145 #endif 146