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_DERIVED_DIMENSION_HPP |
12 | #define BOOST_UNITS_DERIVED_DIMENSION_HPP |
13 | |
14 | #include <boost/units/dim.hpp> |
15 | #include <boost/units/dimension.hpp> |
16 | #include <boost/units/static_rational.hpp> |
17 | #include <boost/units/units_fwd.hpp> |
18 | #include <boost/units/detail/dimension_list.hpp> |
19 | |
20 | namespace boost { |
21 | |
22 | namespace units { |
23 | |
24 | /// A utility class for defining composite dimensions with integer powers. |
25 | template<class DT1 = dimensionless_type,long E1 = 0, |
26 | class DT2 = dimensionless_type,long E2 = 0, |
27 | class DT3 = dimensionless_type,long E3 = 0, |
28 | class DT4 = dimensionless_type,long E4 = 0, |
29 | class DT5 = dimensionless_type,long E5 = 0, |
30 | class DT6 = dimensionless_type,long E6 = 0, |
31 | class DT7 = dimensionless_type,long E7 = 0, |
32 | class DT8 = dimensionless_type,long E8 = 0> |
33 | struct derived_dimension |
34 | { |
35 | #ifdef BOOST_UNITS_DOXYGEN |
36 | typedef detail::unspecified type; |
37 | #else |
38 | typedef typename |
39 | make_dimension_list< list< dim< DT1,static_rational<E1> >, |
40 | list< dim< DT2,static_rational<E2> >, |
41 | list< dim< DT3,static_rational<E3> >, |
42 | list< dim< DT4,static_rational<E4> >, |
43 | list< dim< DT5,static_rational<E5> >, |
44 | list< dim< DT6,static_rational<E6> >, |
45 | list< dim< DT7,static_rational<E7> >, |
46 | list< dim< DT8,static_rational<E8> >, dimensionless_type > > > > > > > > >::type type; |
47 | #endif |
48 | }; |
49 | |
50 | /// INTERNAL ONLY |
51 | template<class DT1,long E1> |
52 | struct derived_dimension< |
53 | DT1, E1, |
54 | dimensionless_type,0, |
55 | dimensionless_type,0, |
56 | dimensionless_type,0, |
57 | dimensionless_type,0, |
58 | dimensionless_type,0, |
59 | dimensionless_type,0, |
60 | dimensionless_type,0> |
61 | { |
62 | typedef typename |
63 | make_dimension_list< list< dim< DT1,static_rational<E1> >, dimensionless_type > >::type type; |
64 | }; |
65 | |
66 | /// INTERNAL ONLY |
67 | template<class DT1,long E1, |
68 | class DT2,long E2> |
69 | struct derived_dimension< |
70 | DT1, E1, |
71 | DT2, E2, |
72 | dimensionless_type,0, |
73 | dimensionless_type,0, |
74 | dimensionless_type,0, |
75 | dimensionless_type,0, |
76 | dimensionless_type,0, |
77 | dimensionless_type,0> |
78 | { |
79 | typedef typename |
80 | make_dimension_list< list< dim< DT1,static_rational<E1> >, |
81 | list< dim< DT2,static_rational<E2> >, dimensionless_type > > >::type type; |
82 | }; |
83 | |
84 | /// INTERNAL ONLY |
85 | template<class DT1,long E1, |
86 | class DT2,long E2, |
87 | class DT3,long E3> |
88 | struct derived_dimension< |
89 | DT1, E1, |
90 | DT2, E2, |
91 | DT3, E3, |
92 | dimensionless_type,0, |
93 | dimensionless_type,0, |
94 | dimensionless_type,0, |
95 | dimensionless_type,0, |
96 | dimensionless_type,0> |
97 | { |
98 | typedef typename |
99 | make_dimension_list< list< dim< DT1,static_rational<E1> >, |
100 | list< dim< DT2,static_rational<E2> >, |
101 | list< dim< DT3,static_rational<E3> >, dimensionless_type > > > >::type type; |
102 | }; |
103 | |
104 | /// INTERNAL ONLY |
105 | template<class DT1,long E1, |
106 | class DT2,long E2, |
107 | class DT3,long E3, |
108 | class DT4,long E4> |
109 | struct derived_dimension< |
110 | DT1, E1, |
111 | DT2, E2, |
112 | DT3, E3, |
113 | DT4, E4, |
114 | dimensionless_type,0, |
115 | dimensionless_type,0, |
116 | dimensionless_type,0, |
117 | dimensionless_type,0> |
118 | { |
119 | typedef typename |
120 | make_dimension_list< list< dim< DT1,static_rational<E1> >, |
121 | list< dim< DT2,static_rational<E2> >, |
122 | list< dim< DT3,static_rational<E3> >, |
123 | list< dim< DT4,static_rational<E4> >, dimensionless_type > > > > >::type type; |
124 | }; |
125 | |
126 | /// INTERNAL ONLY |
127 | template<class DT1,long E1, |
128 | class DT2,long E2, |
129 | class DT3,long E3, |
130 | class DT4,long E4, |
131 | class DT5,long E5> |
132 | struct derived_dimension< |
133 | DT1, E1, |
134 | DT2, E2, |
135 | DT3, E3, |
136 | DT4, E4, |
137 | DT5, E5, |
138 | dimensionless_type,0, |
139 | dimensionless_type,0, |
140 | dimensionless_type,0> |
141 | { |
142 | typedef typename |
143 | make_dimension_list< list< dim< DT1,static_rational<E1> >, |
144 | list< dim< DT2,static_rational<E2> >, |
145 | list< dim< DT3,static_rational<E3> >, |
146 | list< dim< DT4,static_rational<E4> >, |
147 | list< dim< DT5,static_rational<E5> >, dimensionless_type > > > > > >::type type; |
148 | }; |
149 | |
150 | /// INTERNAL ONLY |
151 | template<class DT1,long E1, |
152 | class DT2,long E2, |
153 | class DT3,long E3, |
154 | class DT4,long E4, |
155 | class DT5,long E5, |
156 | class DT6,long E6> |
157 | struct derived_dimension< |
158 | DT1, E1, |
159 | DT2, E2, |
160 | DT3, E3, |
161 | DT4, E4, |
162 | DT5, E5, |
163 | DT6, E6, |
164 | dimensionless_type,0, |
165 | dimensionless_type,0> |
166 | { |
167 | typedef typename |
168 | make_dimension_list< list< dim< DT1,static_rational<E1> >, |
169 | list< dim< DT2,static_rational<E2> >, |
170 | list< dim< DT3,static_rational<E3> >, |
171 | list< dim< DT4,static_rational<E4> >, |
172 | list< dim< DT5,static_rational<E5> >, |
173 | list< dim< DT6,static_rational<E6> >, dimensionless_type > > > > > > >::type type; |
174 | }; |
175 | |
176 | /// INTERNAL ONLY |
177 | template<class DT1,long E1, |
178 | class DT2,long E2, |
179 | class DT3,long E3, |
180 | class DT4,long E4, |
181 | class DT5,long E5, |
182 | class DT6,long E6, |
183 | class DT7,long E7> |
184 | struct derived_dimension< |
185 | DT1, E1, |
186 | DT2, E2, |
187 | DT3, E3, |
188 | DT4, E4, |
189 | DT5, E5, |
190 | DT6, E6, |
191 | DT7, E7, |
192 | dimensionless_type,0> |
193 | { |
194 | typedef typename |
195 | make_dimension_list< list< dim< DT1,static_rational<E1> >, |
196 | list< dim< DT2,static_rational<E2> >, |
197 | list< dim< DT3,static_rational<E3> >, |
198 | list< dim< DT4,static_rational<E4> >, |
199 | list< dim< DT5,static_rational<E5> >, |
200 | list< dim< DT6,static_rational<E6> >, |
201 | list< dim< DT7,static_rational<E7> >, dimensionless_type > > > > > > > >::type type; |
202 | }; |
203 | |
204 | } // namespace units |
205 | |
206 | } // namespace boost |
207 | |
208 | #endif // BOOST_UNITS_DERIVED_DIMENSION_HPP |
209 | |