VirtualFluids 0.2.0
Parallel CFD LBM Solver
Loading...
Searching...
No Matches
UbTuple.h
Go to the documentation of this file.
1//=======================================================================================
2// ____ ____ __ ______ __________ __ __ __ __
3// \ \ | | | | | _ \ |___ ___| | | | | / \ | |
4// \ \ | | | | | |_) | | | | | | | / \ | |
5// \ \ | | | | | _ / | | | | | | / /\ \ | |
6// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____
7// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______|
8// \ \ | | ________________________________________________________________
9// \ \ | | | ______________________________________________________________|
10// \ \| | | | __ __ __ __ ______ _______
11// \ | | |_____ | | | | | | | | | _ \ / _____)
12// \ | | _____| | | | | | | | | | | \ \ \_______
13// \ | | | | |_____ | \_/ | | | | |_/ / _____ |
14// \ _____| |__| |________| \_______/ |__| |______/ (_______/
15//
16// This file is part of VirtualFluids. VirtualFluids is free software: you can
17// redistribute it and/or modify it under the terms of the GNU General Public
18// License as published by the Free Software Foundation, either version 3 of
19// the License, or (at your option) any later version.
20//
21// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
22// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24// for more details.
25//
26// SPDX-License-Identifier: GPL-3.0-or-later
27// SPDX-FileCopyrightText: Copyright © VirtualFluids Project contributors, see AUTHORS.md in root folder
28//
33//=======================================================================================
34#ifndef UBTUPLE_H
35#define UBTUPLE_H
36
37#include <array>
38#include <iostream>
39#include <ostream>
40#include <string>
41
78
79template <typename T>
80class UbTypeOp // primary template
81{
82public:
83 using ArgT = T;
84 using BareT = T;
85 using ConstT = const T;
86 using RefT = T &;
87 using RefBareT = T &;
88 using RefConstT = const T &;
89};
90/**** end of typeop1.hpp ****/
91
92// partial specialization for const
93/**********************************
94 * typeop2.hpp:
95 **********************************/
96template <typename T>
97class UbTypeOp<T const> // partial specialization for const types
98{
99public:
100 using ArgT = const T;
101 using BareT = T;
102 using ConstT = const T;
103 using RefT = const T &;
104 using RefBareT = T &;
105 using RefConstT = const T &;
106};
107/**** end of typeop2.hpp ****/
108
109// partial specialization for references
110/**********************************
111 * typeop3.hpp:
112 **********************************/
113template <typename T>
114class UbTypeOp<T &> // partial specialization for references
115{
116public:
117 using ArgT = T &;
118 using BareT = typename UbTypeOp<T>::BareT;
119 using ConstT = const T;
120 using RefT = T &;
121 using RefBareT = typename UbTypeOp<T>::BareT &;
122 using RefConstT = const T &;
123};
124/**** end of typeop3.hpp ****/
125
126// full specialization for void
127/**********************************
128 * typeop4.hpp:
129 **********************************/
130template <>
131class UbTypeOp<void> // full specialization for void
132{
133public:
134 using ArgT = void;
135 using BareT = void;
136 using ConstT = const void;
137 using RefT = void;
138 using RefBareT = void;
140};
141/**** end of typeop4.hpp ****/
142
143template <typename T1, typename T2>
144class UbDuo;
145
146template <typename T1, typename T2>
147std::ostream &operator<<(std::ostream &os, UbDuo<T1, T2> const &d1);
148
149// duo1.hpp
150template <typename T1, typename T2>
151class UbDuo
152{
153public:
154 using Type1 = T1; // type of first field
155 using Type2 = T2; // type of second field
156 enum { N = 2 }; // number of fields
157
158public:
159 // constructors
160 UbDuo() : value1(), value2() {}
161 UbDuo(T1 const &a, T2 const &b) : value1(a), value2(b) {}
162
163 // for implicit type conversion during construction
164 template <typename U1, typename U2>
165 UbDuo(UbDuo<U1, U2> const &d) : value1(d.v1()), value2(d.v2())
166 {
167 }
168
169 // for implicit type conversion during assignments
170 template <typename U1, typename U2>
172 {
173 value1 = d.v1(); // value1;
174 value2 = d.v2(); // value2;
175 return *this;
176 }
177
178 // field access
179 T1 &v1() { return value1; }
180 T1 const &v1() const { return value1; }
181
182 T2 &v2() { return value2; }
183 T2 const &v2() const { return value2; }
184
185private:
186 T1 value1; // value of first field
187 T2 value2; // value of second field
188};
189
190// comparison operators (allow mixed types):
191template <typename T1, typename T2, typename U1, typename U2>
192inline bool operator==(UbDuo<T1, T2> const &d1, UbDuo<U1, U2> const &d2)
193{
194 return d1.v1() == d2.v1() && d1.v2() == d2.v2();
195}
196
197template <typename T1, typename T2, typename U1, typename U2>
198inline bool operator!=(UbDuo<T1, T2> const &d1, UbDuo<U1, U2> const &d2)
199{
200 return !(d1 == d2);
201}
202
203template <typename T1, typename T2, typename U1, typename U2>
204inline bool operator<(UbDuo<T1, T2> const &d1, UbDuo<U1, U2> const &d2)
205{
206 if (d1.v1() < d2.v1())
207 return true;
208 else if (d1.v1() == d2.v1())
209 return d1.v2() < d2.v2();
210
211 return false;
212}
213
214template <typename T1, typename T2>
215std::ostream &operator<<(std::ostream &os, UbDuo<T1, T2> const &d1)
216{
217 os << d1.v1() << ", " << d1.v2();
218 return os;
219}
220
221// convenience function for creation and initialization
222template <typename T1, typename T2>
223inline UbDuo<T1, T2> makeUbDuo(T1 const &a, T2 const &b)
224{
225 return UbDuo<T1, T2>(a, b);
226}
227
228// duo2.hpp
229template <typename A, typename B, typename C>
230class UbDuo<A, UbDuo<B, C>>
231{
232public:
233 using T1 = A; // type of first field
234 using T2 = UbDuo<B, C>; // type of second field
235 enum { N = UbDuo<B, C>::N + 1 }; // number of fields
236
237public:
238 // constructors
239 UbDuo() : value1(), value2() {}
240 UbDuo(T1 const &a, T2 const &b) : value1(a), value2(b) {}
241
242 // for implicit type conversion during construction
243 template <typename U1, typename U2>
244 UbDuo(UbDuo<U1, U2> const &d) : value1(d.v1()), value2(d.v2())
245 {
246 }
247
248 // for implicit type conversion during assignments
249 template <typename U1, typename U2>
251 {
252 value1 = d.v1(); // value1;
253 value2 = d.v2(); // value2;
254 return *this;
255 }
256
257 // field access
258 T1 &v1() { return value1; }
259 T1 const &v1() const { return value1; }
260
261 T2 &v2() { return value2; }
262 T2 const &v2() const { return value2; }
263
264private:
265 T1 value1; // value of first field
266 T2 value2; // value of second field
267};
268
269// duo3.hpp
270// primary template for type of Nth field of (duo) T
271template <int N, typename T>
273{
274public:
275 using ResultT = void; // in general, the result type is void
276};
277
278// specialization for 1st field of a plain duo
279template <typename A, typename B>
280class UbDuoT<1, UbDuo<A, B>>
281{
282public:
283 using ResultT = A;
284};
285
286// specialization for 2nd field of a plain duo
287template <typename A, typename B>
288class UbDuoT<2, UbDuo<A, B>>
289{
290public:
291 using ResultT = B;
292};
293
294// specialization for Nth field of a recursive duo
295template <int N, typename A, typename B, typename C>
296class UbDuoT<N, UbDuo<A, UbDuo<B, C>>>
297{
298public:
299 using ResultT = typename UbDuoT<N - 1, UbDuo<B, C>>::ResultT;
300};
301
302// specialization for 1st field of a recursive duo
303template <typename A, typename B, typename C>
304class UbDuoT<1, UbDuo<A, UbDuo<B, C>>>
305{
306public:
307 using ResultT = A;
308};
309
310// specialization for 2nd field of a recursive duo
311template <typename A, typename B, typename C>
312class UbDuoT<2, UbDuo<A, UbDuo<B, C>>>
313{
314public:
315 using ResultT = B;
316};
317
318// duo4.hpp
319// primary template for value of Nth field of (duo) T
320template <int N, typename T>
322{
323public:
324 static void get(T &) {} // in general, we have no value
325 static void get(T const &) {}
326};
327
328// specialization for 1st field of a plain duo
329template <typename A, typename B>
330class DuoValue<1, UbDuo<A, B>>
331{
332public:
333 static A &get(UbDuo<A, B> &d) { return d.v1(); }
334 static A const &get(UbDuo<A, B> const &d) { return d.v1(); }
335};
336
337// specialization for 2nd field of a plain duo
338template <typename A, typename B>
339class DuoValue<2, UbDuo<A, B>>
340{
341public:
342 static B &get(UbDuo<A, B> &d) { return d.v2(); }
343 static B const &get(UbDuo<A, B> const &d) { return d.v2(); }
344};
345
346// specialization for Nth field of recursive duo
347template <int N, typename A, typename B, typename C>
348struct DuoValue<N, UbDuo<A, UbDuo<B, C>>> {
349 static typename UbTypeOp<typename UbDuoT<N - 1, UbDuo<B, C>>::ResultT>::RefT get(UbDuo<A, UbDuo<B, C>> &d)
350 {
351 return DuoValue<N - 1, UbDuo<B, C>>::get(d.v2());
352 }
353 static typename UbTypeOp<typename UbDuoT<N - 1, UbDuo<B, C>>::ResultT>::RefConstT
354 get(UbDuo<A, UbDuo<B, C>> const &d)
355 {
356 return DuoValue<N - 1, UbDuo<B, C>>::get(d.v2());
357 }
358};
359
360// specialization for 1st field of recursive duo
361template <typename A, typename B, typename C>
362class DuoValue<1, UbDuo<A, UbDuo<B, C>>>
363{
364public:
365 static A &get(UbDuo<A, UbDuo<B, C>> &d) { return d.v1(); }
366 static A const &get(UbDuo<A, UbDuo<B, C>> const &d) { return d.v1(); }
367};
368
369// specialization for 2nd field of recursive duo
370template <typename A, typename B, typename C>
371class DuoValue<2, UbDuo<A, UbDuo<B, C>>>
372{
373public:
374 static B &get(UbDuo<A, UbDuo<B, C>> &d) { return d.v2().v1(); }
375 static B const &get(UbDuo<A, UbDuo<B, C>> const &d) { return d.v2().v1(); }
376};
377
378// duo5.hpp
379// return Nth value of variable duo
380template <int N, typename A, typename B>
381inline typename UbTypeOp<typename UbDuoT<N, UbDuo<A, B>>::ResultT>::RefT val(UbDuo<A, B> &d)
382{
383 return DuoValue<N, UbDuo<A, B>>::get(d);
384}
385
386// return Nth value of constant duo
387template <int N, typename A, typename B>
388inline typename UbTypeOp<typename UbDuoT<N, UbDuo<A, B>>::ResultT>::RefConstT val(UbDuo<A, B> const &d)
389{
390 return DuoValue<N, UbDuo<A, B>>::get(d);
391}
392
393// duo6.hpp
394// partial specialization for UbDuo<> with only c1 field
395template <typename A>
396struct UbDuo<A, void> {
397public:
398 using T1 = A; // type of first field
399 using T2 = void; // type of second field
400 enum { N = 1 }; // number of fields
401
402private:
403 T1 value1; // value of first field
404
405public:
406 // constructors
407 UbDuo() : value1() {}
408 UbDuo(T1 const &a) : value1(a) {}
409
410 // field access
411 T1 &v1() { return value1; }
412 T1 const &v1() const { return value1; }
413
414 void v2() {}
415 void v2() const {}
416};
417
418// tupel1.hpp
419// type that represents unused type parameters
421{
422};
423
460
461// UbTuple<> in general derives from UbTuple<> with c1 more UbNullT
462template <typename P1, typename P2 = UbNullT, typename P3 = UbNullT, typename P4 = UbNullT, typename P5 = UbNullT,
463 typename P6 = UbNullT, typename P7 = UbNullT, typename P8 = UbNullT>
464class UbTuple : public UbDuo<P1, typename UbTuple<P2, P3, P4, P5, P6, P7, P8, UbNullT>::BaseT>
465{
466public:
468
469 // constructor:
470 UbTuple() = default;
478
479 // for implicit type conversion during assignments
480 template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6, typename U7, typename U8>
486};
487
488// specialization to end deriving recursion
489template <typename P1, typename P2>
491{
492public:
494
495 // constructor:
496 UbTuple() = default;
504
505 // for implicit type conversion during assignments
506 template <typename U1, typename U2>
508 {
510 return *this;
511 }
512};
513
514// specialization for singletons
515template <typename P1>
517{
518public:
520
521 // constructor:
522 UbTuple() = default;
530
531 // for implicit type conversion during assignments
532 template <typename U1>
534 {
535 this->v1() = rhs.v1();
536 return *this;
537 }
538};
539
540// convenience function for 1 argument
541template <typename T1>
542inline UbTuple<T1> makeUbTuple(T1 const &a1)
543{
544 return UbTuple<T1>(a1);
545}
546
547// convenience function for 2 arguments
548template <typename T1, typename T2>
549inline UbTuple<T1, T2> makeUbTuple(T1 const &a1, T2 const &a2)
550{
551 return UbTuple<T1, T2>(a1, a2);
552}
553
554// convenience function for 3 arguments
555template <typename T1, typename T2, typename T3>
556inline UbTuple<T1, T2, T3> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3)
557{
558 return UbTuple<T1, T2, T3>(a1, a2, a3);
559}
560
561// convenience function for 4 arguments
562template <typename T1, typename T2, typename T3, typename T4>
563inline UbTuple<T1, T2, T3, T4> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4)
564{
565 return UbTuple<T1, T2, T3, T4>(a1, a2, a3, a4);
566}
567
568// convenience function for 5 arguments
569template <typename T1, typename T2, typename T3, typename T4, typename T5>
570inline UbTuple<T1, T2, T3, T4, T5> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4, T5 const &a5)
571{
573}
574
575// convenience function for 6 arguments
576template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
577inline UbTuple<T1, T2, T3, T4, T5, T6> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4, T5 const &a5,
578 T6 const &a6)
579{
581}
582
583// convenience function for 7 arguments
584template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
585inline UbTuple<T1, T2, T3, T4, T5, T6, T7> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4,
586 T5 const &a5, T6 const &a6, T7 const &a7)
587{
589}
590
591// convenience function for 8 arguments
592template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
593inline UbTuple<T1, T2, T3, T4, T5, T6, T7, T8> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4,
594 T5 const &a5, T6 const &a6, T7 const &a7, T8 const &a8)
595{
597}
598
599// convenience function for 8 arguments
600template <typename T>
602{
603 return UbTuple<T, T, T, T, T, T, T, T>(array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7]);
604}
605
606
607
608// some typedefs
619using UbTupleUInt8 = UbTuple<unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int,
620 unsigned int, unsigned int>;
632
633#endif // UBTUPLE_H
634
static A const & get(UbDuo< A, B > const &d)
Definition UbTuple.h:334
static A & get(UbDuo< A, B > &d)
Definition UbTuple.h:333
static A & get(UbDuo< A, UbDuo< B, C > > &d)
Definition UbTuple.h:365
static A const & get(UbDuo< A, UbDuo< B, C > > const &d)
Definition UbTuple.h:366
static B & get(UbDuo< A, B > &d)
Definition UbTuple.h:342
static B const & get(UbDuo< A, B > const &d)
Definition UbTuple.h:343
static B const & get(UbDuo< A, UbDuo< B, C > > const &d)
Definition UbTuple.h:375
static B & get(UbDuo< A, UbDuo< B, C > > &d)
Definition UbTuple.h:374
static void get(T const &)
Definition UbTuple.h:325
static void get(T &)
Definition UbTuple.h:324
T2 const & v2() const
Definition UbTuple.h:262
UbDuo(T1 const &a, T2 const &b)
Definition UbTuple.h:240
T1 const & v1() const
Definition UbTuple.h:259
UbDuo(UbDuo< U1, U2 > const &d)
Definition UbTuple.h:244
UbDuo< T1, T2 > & operator=(UbDuo< U1, U2 > const &d)
Definition UbTuple.h:250
T2 Type2
Definition UbTuple.h:155
@ N
Definition UbTuple.h:156
UbDuo< T1, T2 > & operator=(UbDuo< U1, U2 > const &d)
Definition UbTuple.h:171
T1 const & v1() const
Definition UbTuple.h:180
UbDuo(UbDuo< U1, U2 > const &d)
Definition UbTuple.h:165
T1 & v1()
Definition UbTuple.h:179
T1 Type1
Definition UbTuple.h:154
UbDuo()
Definition UbTuple.h:160
T2 const & v2() const
Definition UbTuple.h:183
UbDuo(T1 const &a, T2 const &b)
Definition UbTuple.h:161
T2 & v2()
Definition UbTuple.h:182
typename UbDuoT< N - 1, UbDuo< B, C > >::ResultT ResultT
Definition UbTuple.h:299
void ResultT
Definition UbTuple.h:275
UbTuple< P1, P2 > & operator=(const UbTuple< U1, U2 > &rhs)
Definition UbTuple.h:507
UbTuple(typename UbTypeOp< P1 >::RefConstT a1, typename UbTypeOp< P2 >::RefConstT a2, typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT())
Definition UbTuple.h:497
UbTuple(typename UbTypeOp< P1 >::RefConstT a1, typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT(), typename UbTypeOp< UbNullT >::RefConstT=UbNullT())
Definition UbTuple.h:523
A class implements a tuple.
Definition UbTuple.h:465
UbTuple< P1, P2, P3, P4, P5, P6, P7, P8 > & operator=(const UbTuple< U1, U2, U3, U4, U5, U6, U7, U8 > &rhs)
Definition UbTuple.h:481
UbDuo< P1, typename UbTuple< P2, P3, P4, P5, P6, P7, P8, UbNullT >::BaseT > BaseT
Definition UbTuple.h:467
UbTuple()=default
UbTuple(typename UbTypeOp< P1 >::RefConstT a1, typename UbTypeOp< P2 >::RefConstT a2, typename UbTypeOp< P3 >::RefConstT a3=UbNullT(), typename UbTypeOp< P4 >::RefConstT a4=UbNullT(), typename UbTypeOp< P5 >::RefConstT a5=UbNullT(), typename UbTypeOp< P6 >::RefConstT a6=UbNullT(), typename UbTypeOp< P7 >::RefConstT a7=UbNullT(), typename UbTypeOp< P8 >::RefConstT a8=UbNullT())
Definition UbTuple.h:471
const T ConstT
Definition UbTuple.h:119
typename UbTypeOp< T >::BareT BareT
Definition UbTuple.h:118
const T & RefConstT
Definition UbTuple.h:122
typename UbTypeOp< T >::BareT & RefBareT
Definition UbTuple.h:121
const T & RefConstT
Definition UbTuple.h:105
const void ConstT
Definition UbTuple.h:136
A class implements a tuple.
Definition UbTuple.h:81
const T ConstT
Definition UbTuple.h:85
T & RefBareT
Definition UbTuple.h:87
T BareT
Definition UbTuple.h:84
T & RefT
Definition UbTuple.h:86
const T & RefConstT
Definition UbTuple.h:88
std::shared_ptr< T > SPtr
bool operator!=(UbDuo< T1, T2 > const &d1, UbDuo< U1, U2 > const &d2)
Definition UbTuple.h:198
UbTuple< bool, bool, bool > UbTupleBool3
Definition UbTuple.h:629
bool operator<(UbDuo< T1, T2 > const &d1, UbDuo< U1, U2 > const &d2)
Definition UbTuple.h:204
UbTypeOp< typenameUbDuoT< N, UbDuo< A, B > >::ResultT >::RefT val(UbDuo< A, B > &d)
Definition UbTuple.h:381
UbTuple< short, short, short, short > UbTupleShort4
Definition UbTuple.h:628
UbTuple< T, T, T, T, T, T, T, T > makeUbTupleFromArray(const std::array< T, 8 > &array)
Definition UbTuple.h:601
UbTuple< std::string, int, int, int > UbTupleStringInt3
Definition UbTuple.h:627
UbTuple< float, float, float, float > UbTupleFloat4
Definition UbTuple.h:611
UbTuple< double, double, double, double, double, double > UbTupleDouble6
Definition UbTuple.h:624
bool operator==(UbDuo< T1, T2 > const &d1, UbDuo< U1, U2 > const &d2)
Definition UbTuple.h:192
UbTuple< int, int, int, int, int, int > UbTupleInt6
Definition UbTuple.h:617
UbTuple< std::string, double, double > UbTupleStringDouble2
Definition UbTuple.h:625
UbTuple< int, int, int, int, int > UbTupleInt5
Definition UbTuple.h:616
UbTuple< double, double, double, double > UbTupleDouble4
Definition UbTuple.h:623
UbDuo< T1, T2 > makeUbDuo(T1 const &a, T2 const &b)
Definition UbTuple.h:223
UbTuple< T1 > makeUbTuple(T1 const &a1)
Definition UbTuple.h:542
UbTuple< float, float, float, float, float, float > UbTupleFloat6
Definition UbTuple.h:612
UbTuple< double, double > UbTupleDouble2
Definition UbTuple.h:621
std::ostream & operator<<(std::ostream &os, UbDuo< T1, T2 > const &d1)
Definition UbTuple.h:215
UbTuple< int, bool > UbTupleIntBool
Definition UbTuple.h:631
UbTuple< int, double, double > UbTupleIntDouble2
Definition UbTuple.h:630
UbTuple< std::string, double, double, double > UbTupleStringDouble3
Definition UbTuple.h:626
static UbTypeOp< typenameUbDuoT< N-1, UbDuo< B, C > >::ResultT >::RefConstT get(UbDuo< A, UbDuo< B, C > > const &d)
Definition UbTuple.h:354
static UbTypeOp< typenameUbDuoT< N-1, UbDuo< B, C > >::ResultT >::RefT get(UbDuo< A, UbDuo< B, C > > &d)
Definition UbTuple.h:349
void v2() const
Definition UbTuple.h:415
T1 const & v1() const
Definition UbTuple.h:412
UbDuo(T1 const &a)
Definition UbTuple.h:408