1/*!
2 * \file   include/TFEL/Math/Quantity/Unit.ixx
3 * \brief  This file implements the classes declared in Unit.hxx
4 * \author Thomas Helfer
5 * \date   17 Jul 2006
6 * \copyright Copyright (C) 2006-2018 CEA/DEN, EDF R&D. All rights
7 * reserved.
8 * This project is publicly released under either the GNU GPL Licence
9 * or the CECILL-A licence. A copy of thoses licences are delivered
10 * with the sources of TFEL. CEA or EDF may also distribute this
11 * project under specific licensing conditions.
12 */
13
14#ifndef LIB_TFEL_MATH_UNIT_IXX
15#define LIB_TFEL_MATH_UNIT_IXX
16
17namespace tfel{
18
19  namespace math{
20
21    template<int N1,int N2,int N3,int N4,int N5,int N6,int N7,
22	     unsigned int D1,unsigned int D2,unsigned int D3,
23	     unsigned int D4,unsigned int D5,unsigned int D6,
24	     unsigned int D7,int O1,int O2,int O3,int O4,int O5,
25	     int O6,int O7,unsigned int AP1,unsigned int AP2,
26	     unsigned int AP3,unsigned int AP4,unsigned int AP5,
27	     unsigned int AP6,unsigned int AP7>
28    struct AddUnit_<Unit<std::integral_constant<int,N1>,
29			 std::integral_constant<int,N2>,
30			 std::integral_constant<int,N3>,
31			 std::integral_constant<int,N4>,
32			 std::integral_constant<int,N5>,
33			 std::integral_constant<int,N6>,
34			 std::integral_constant<int,N7> ,
35			 std::integral_constant<unsigned int,D1>,
36			 std::integral_constant<unsigned int,D2>,
37			 std::integral_constant<unsigned int,D3>,
38			 std::integral_constant<unsigned int,D4>,
39			 std::integral_constant<unsigned int,D5>,
40			 std::integral_constant<unsigned int,D6>,
41			 std::integral_constant<unsigned int,D7> >,
42		    Unit<std::integral_constant<int,O1>,
43			 std::integral_constant<int,O2>,
44			 std::integral_constant<int,O3>,
45			 std::integral_constant<int,O4>,
46			 std::integral_constant<int,O5>,
47			 std::integral_constant<int,O6>,
48			 std::integral_constant<int,O7>,
49			 std::integral_constant<unsigned int,AP1>,
50			 std::integral_constant<unsigned int,AP2>,
51			 std::integral_constant<unsigned int,AP3>,
52			 std::integral_constant<unsigned int,AP4>,
53			 std::integral_constant<unsigned int,AP5>,
54			 std::integral_constant<unsigned int,AP6>,
55			 std::integral_constant<unsigned int,AP7> > >
56    {
57      typedef typename GenerateUnit<std::ratio<N1*AP1+O1*D1,D1*AP1>::num,
58				    std::ratio<N2*AP2+O2*D2,D2*AP2>::num,
59				    std::ratio<N3*AP3+O3*D3,D3*AP3>::num,
60				    std::ratio<N4*AP4+O4*D4,D4*AP4>::num,
61				    std::ratio<N5*AP5+O5*D5,D5*AP5>::num,
62				    std::ratio<N6*AP6+O6*D6,D6*AP6>::num,
63				    std::ratio<N7*AP7+O7*D7,D7*AP7>::num,
64				    std::ratio<N1*AP1+O1*D1,D1*AP1>::den,
65				    std::ratio<N2*AP2+O2*D2,D2*AP2>::den,
66				    std::ratio<N3*AP3+O3*D3,D3*AP3>::den,
67				    std::ratio<N4*AP4+O4*D4,D4*AP4>::den,
68				    std::ratio<N5*AP5+O5*D5,D5*AP5>::den,
69				    std::ratio<N6*AP6+O6*D6,D6*AP6>::den,
70				    std::ratio<N7*AP7+O7*D7,D7*AP7>::den>::type type;
71    };
72
73    template<int N1,int N2,int N3,int N4,int N5,int N6,int N7,
74	     int O1,int O2,int O3,int O4,int O5,int O6,int O7>
75    struct AddUnit_<Unit<std::integral_constant<int,N1>,
76			 std::integral_constant<int,N2>,
77			 std::integral_constant<int,N3>,
78			 std::integral_constant<int,N4>,
79			 std::integral_constant<int,N5>,
80			 std::integral_constant<int,N6>,
81			 std::integral_constant<int,N7> ,
82			 std::integral_constant<unsigned int,1u>,
83			 std::integral_constant<unsigned int,1u>,
84			 std::integral_constant<unsigned int,1u>,
85			 std::integral_constant<unsigned int,1u>,
86			 std::integral_constant<unsigned int,1u>,
87			 std::integral_constant<unsigned int,1u>,
88			 std::integral_constant<unsigned int,1u> >,
89		    Unit<std::integral_constant<int,O1>,
90			 std::integral_constant<int,O2>,
91			 std::integral_constant<int,O3>,
92			 std::integral_constant<int,O4>,
93			 std::integral_constant<int,O5>,
94			 std::integral_constant<int,O6>,
95			 std::integral_constant<int,O7>,
96			 std::integral_constant<unsigned int,1u>,
97			 std::integral_constant<unsigned int,1u>,
98			 std::integral_constant<unsigned int,1u>,
99			 std::integral_constant<unsigned int,1u>,
100			 std::integral_constant<unsigned int,1u>,
101			 std::integral_constant<unsigned int,1u>,
102			 std::integral_constant<unsigned int,1u> > >
103    {
104      typedef typename GenerateUnit<N1+O1,N2+O2,N3+O3,N4+O4,N5+O5,N6+O6,N7+O7>::type type;
105    };
106
107
108    template<int N1,int N2,int N3,int N4,int N5,int N6,int N7,
109	     unsigned int D1,unsigned int D2,unsigned int D3,
110	     unsigned int D4,unsigned int D5,unsigned int D6,
111	     unsigned int D7,int O1,int O2,int O3,
112	     int O4,int O5,int O6,int O7,unsigned int AP1,
113	     unsigned int AP2,unsigned int AP3,unsigned int AP4,
114	     unsigned int AP5,unsigned int AP6,unsigned int AP7>
115    struct SubUnit_<Unit<std::integral_constant<int,N1>,
116			 std::integral_constant<int,N2>,
117			 std::integral_constant<int,N3>,
118			 std::integral_constant<int,N4>,
119			 std::integral_constant<int,N5>,
120			 std::integral_constant<int,N6>,
121			 std::integral_constant<int,N7>,
122			 std::integral_constant<unsigned int,D1>,
123			 std::integral_constant<unsigned int,D2>,
124			 std::integral_constant<unsigned int,D3>,
125			 std::integral_constant<unsigned int,D4>,
126			 std::integral_constant<unsigned int,D5>,
127			 std::integral_constant<unsigned int,D6>,
128			 std::integral_constant<unsigned int,D7> >,
129		    Unit<std::integral_constant<int,O1>,
130			 std::integral_constant<int,O2>,
131			 std::integral_constant<int,O3>,
132			 std::integral_constant<int,O4>,
133			 std::integral_constant<int,O5>,
134			 std::integral_constant<int,O6>,
135			 std::integral_constant<int,O7>,
136			 std::integral_constant<unsigned int,AP1>,
137			 std::integral_constant<unsigned int,AP2>,
138			 std::integral_constant<unsigned int,AP3>,
139			 std::integral_constant<unsigned int,AP4>,
140			 std::integral_constant<unsigned int,AP5>,
141			 std::integral_constant<unsigned int,AP6>,
142			 std::integral_constant<unsigned int,AP7> > >
143    {
144      typedef typename GenerateUnit<std::ratio<N1*AP1-O1*D1,D1*AP1>::num,
145				    std::ratio<N2*AP2-O2*D2,D2*AP2>::num,
146				    std::ratio<N3*AP3-O3*D3,D3*AP3>::num,
147				    std::ratio<N4*AP4-O4*D4,D4*AP4>::num,
148				    std::ratio<N5*AP5-O5*D5,D5*AP5>::num,
149				    std::ratio<N6*AP6-O6*D6,D6*AP6>::num,
150				    std::ratio<N7*AP7-O7*D7,D7*AP7>::num,
151				    std::ratio<N1*AP1-O1*D1,D1*AP1>::den,
152				    std::ratio<N2*AP2-O2*D2,D2*AP2>::den,
153				    std::ratio<N3*AP3-O3*D3,D3*AP3>::den,
154				    std::ratio<N4*AP4-O4*D4,D4*AP4>::den,
155				    std::ratio<N5*AP5-O5*D5,D5*AP5>::den,
156				    std::ratio<N6*AP6-O6*D6,D6*AP6>::den,
157				    std::ratio<N7*AP7-O7*D7,D7*AP7>::den>::type type;
158    };
159
160    template<int N1,int N2,int N3,int N4,int N5,int N6,int N7,
161	     int O1,int O2,int O3,int O4,int O5,int O6,int O7>
162    struct SubUnit_<Unit<std::integral_constant<int,N1>,
163			 std::integral_constant<int,N2>,
164			 std::integral_constant<int,N3>,
165			 std::integral_constant<int,N4>,
166			 std::integral_constant<int,N5>,
167			 std::integral_constant<int,N6>,
168			 std::integral_constant<int,N7>,
169			 std::integral_constant<unsigned int,1u>,
170			 std::integral_constant<unsigned int,1u>,
171			 std::integral_constant<unsigned int,1u>,
172			 std::integral_constant<unsigned int,1u>,
173			 std::integral_constant<unsigned int,1u>,
174			 std::integral_constant<unsigned int,1u>,
175			 std::integral_constant<unsigned int,1u> >,
176		    Unit<std::integral_constant<int,O1>,
177			 std::integral_constant<int,O2>,
178			 std::integral_constant<int,O3>,
179			 std::integral_constant<int,O4>,
180			 std::integral_constant<int,O5>,
181			 std::integral_constant<int,O6>,
182			 std::integral_constant<int,O7>,
183			 std::integral_constant<unsigned int,1u>,
184			 std::integral_constant<unsigned int,1u>,
185			 std::integral_constant<unsigned int,1u>,
186			 std::integral_constant<unsigned int,1u>,
187			 std::integral_constant<unsigned int,1u>,
188			 std::integral_constant<unsigned int,1u>,
189			 std::integral_constant<unsigned int,1u> > >
190    {
191      typedef typename GenerateUnit<N1-O1,N2-O2,N3-O3,N4-O4,N5-O5,N6-O6,N7-O7>::type type;
192    };
193
194    template<int N, unsigned int D,int N1,int N2,int N3,int N4,int N5,int N6,int N7,
195	     unsigned int D1,unsigned int D2,unsigned int D3,unsigned int D4,
196	     unsigned int D5,unsigned int D6,unsigned int D7>
197    struct PowUnit_<N,D,Unit<std::integral_constant<int,N1>,
198			     std::integral_constant<int,N2>,
199			     std::integral_constant<int,N3>,
200			     std::integral_constant<int,N4>,
201			     std::integral_constant<int,N5>,
202			     std::integral_constant<int,N6>,
203			     std::integral_constant<int,N7> ,
204			     std::integral_constant<unsigned int,D1>,
205			     std::integral_constant<unsigned int,D2>,
206			     std::integral_constant<unsigned int,D3>,
207			     std::integral_constant<unsigned int,D4>,
208			     std::integral_constant<unsigned int,D5>,
209			     std::integral_constant<unsigned int,D6>,
210			     std::integral_constant<unsigned int,D7> > >
211    {
212      typedef typename GenerateUnit<std::ratio<N1*N,D1*D>::num,
213				    std::ratio<N2*N,D2*D>::num,
214				    std::ratio<N3*N,D3*D>::num,
215				    std::ratio<N4*N,D4*D>::num,
216				    std::ratio<N5*N,D5*D>::num,
217				    std::ratio<N6*N,D6*D>::num,
218				    std::ratio<N7*N,D7*D>::num,
219				    std::ratio<N1*N,D1*D>::den,
220				    std::ratio<N2*N,D2*D>::den,
221				    std::ratio<N3*N,D3*D>::den,
222				    std::ratio<N4*N,D4*D>::den,
223				    std::ratio<N5*N,D5*D>::den,
224				    std::ratio<N6*N,D6*D>::den,
225				    std::ratio<N7*N,D7*D>::den>::type type;
226    };
227
228  } // end of Namesapce math
229
230} // end of namespace tfel
231
232#endif /* LIB_TFEL_MATH_UNIT_IXX */
233
234