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