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
20namespace boost {
21
22namespace units {
23
24/// A utility class for defining composite dimensions with integer powers.
25template<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>
33struct 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
51template<class DT1,long E1>
52struct 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
67template<class DT1,long E1,
68 class DT2,long E2>
69struct 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
85template<class DT1,long E1,
86 class DT2,long E2,
87 class DT3,long E3>
88struct 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
105template<class DT1,long E1,
106 class DT2,long E2,
107 class DT3,long E3,
108 class DT4,long E4>
109struct 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
127template<class DT1,long E1,
128 class DT2,long E2,
129 class DT3,long E3,
130 class DT4,long E4,
131 class DT5,long E5>
132struct 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
151template<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>
157struct 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
177template<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>
184struct 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

source code of boost/boost/units/derived_dimension.hpp