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 | |