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, typename U1, typename U2>
215inline bool operator>(UbDuo<T1, T2> const &d1, UbDuo<U1, U2> const &d2)
216{
217 if (d1.v1() > d2.v1())
218 return true;
219 else if (d1.v1() == d2.v1())
220 return d1.v2() > d2.v2();
221
222 return false;
223}
224
225
226template <typename T1, typename T2>
227std::ostream &operator<<(std::ostream &os, UbDuo<T1, T2> const &d1)
228{
229 os << d1.v1() << ", " << d1.v2();
230 return os;
231}
232
233// convenience function for creation and initialization
234template <typename T1, typename T2>
235inline UbDuo<T1, T2> makeUbDuo(T1 const &a, T2 const &b)
236{
237 return UbDuo<T1, T2>(a, b);
238}
239
240// duo2.hpp
241template <typename A, typename B, typename C>
242class UbDuo<A, UbDuo<B, C>>
243{
244public:
245 using T1 = A; // type of first field
246 using T2 = UbDuo<B, C>; // type of second field
247 enum { N = UbDuo<B, C>::N + 1 }; // number of fields
248
249public:
250 // constructors
251 UbDuo() : value1(), value2() {}
252 UbDuo(T1 const &a, T2 const &b) : value1(a), value2(b) {}
253
254 // for implicit type conversion during construction
255 template <typename U1, typename U2>
256 UbDuo(UbDuo<U1, U2> const &d) : value1(d.v1()), value2(d.v2())
257 {
258 }
259
260 // for implicit type conversion during assignments
261 template <typename U1, typename U2>
263 {
264 value1 = d.v1(); // value1;
265 value2 = d.v2(); // value2;
266 return *this;
267 }
268
269 // field access
270 T1 &v1() { return value1; }
271 T1 const &v1() const { return value1; }
272
273 T2 &v2() { return value2; }
274 T2 const &v2() const { return value2; }
275
276private:
277 T1 value1; // value of first field
278 T2 value2; // value of second field
279};
280
281// duo3.hpp
282// primary template for type of Nth field of (duo) T
283template <int N, typename T>
285{
286public:
287 using ResultT = void; // in general, the result type is void
288};
289
290// specialization for 1st field of a plain duo
291template <typename A, typename B>
292class UbDuoT<1, UbDuo<A, B>>
293{
294public:
295 using ResultT = A;
296};
297
298// specialization for 2nd field of a plain duo
299template <typename A, typename B>
300class UbDuoT<2, UbDuo<A, B>>
301{
302public:
303 using ResultT = B;
304};
305
306// specialization for Nth field of a recursive duo
307template <int N, typename A, typename B, typename C>
308class UbDuoT<N, UbDuo<A, UbDuo<B, C>>>
309{
310public:
311 using ResultT = typename UbDuoT<N - 1, UbDuo<B, C>>::ResultT;
312};
313
314// specialization for 1st field of a recursive duo
315template <typename A, typename B, typename C>
316class UbDuoT<1, UbDuo<A, UbDuo<B, C>>>
317{
318public:
319 using ResultT = A;
320};
321
322// specialization for 2nd field of a recursive duo
323template <typename A, typename B, typename C>
324class UbDuoT<2, UbDuo<A, UbDuo<B, C>>>
325{
326public:
327 using ResultT = B;
328};
329
330// duo4.hpp
331// primary template for value of Nth field of (duo) T
332template <int N, typename T>
334{
335public:
336 static void get(T &) {} // in general, we have no value
337 static void get(T const &) {}
338};
339
340// specialization for 1st field of a plain duo
341template <typename A, typename B>
342class DuoValue<1, UbDuo<A, B>>
343{
344public:
345 static A &get(UbDuo<A, B> &d) { return d.v1(); }
346 static A const &get(UbDuo<A, B> const &d) { return d.v1(); }
347};
348
349// specialization for 2nd field of a plain duo
350template <typename A, typename B>
351class DuoValue<2, UbDuo<A, B>>
352{
353public:
354 static B &get(UbDuo<A, B> &d) { return d.v2(); }
355 static B const &get(UbDuo<A, B> const &d) { return d.v2(); }
356};
357
358// specialization for Nth field of recursive duo
359template <int N, typename A, typename B, typename C>
360struct DuoValue<N, UbDuo<A, UbDuo<B, C>>> {
361 static typename UbTypeOp<typename UbDuoT<N - 1, UbDuo<B, C>>::ResultT>::RefT get(UbDuo<A, UbDuo<B, C>> &d)
362 {
363 return DuoValue<N - 1, UbDuo<B, C>>::get(d.v2());
364 }
365 static typename UbTypeOp<typename UbDuoT<N - 1, UbDuo<B, C>>::ResultT>::RefConstT
366 get(UbDuo<A, UbDuo<B, C>> const &d)
367 {
368 return DuoValue<N - 1, UbDuo<B, C>>::get(d.v2());
369 }
370};
371
372// specialization for 1st field of recursive duo
373template <typename A, typename B, typename C>
374class DuoValue<1, UbDuo<A, UbDuo<B, C>>>
375{
376public:
377 static A &get(UbDuo<A, UbDuo<B, C>> &d) { return d.v1(); }
378 static A const &get(UbDuo<A, UbDuo<B, C>> const &d) { return d.v1(); }
379};
380
381// specialization for 2nd field of recursive duo
382template <typename A, typename B, typename C>
383class DuoValue<2, UbDuo<A, UbDuo<B, C>>>
384{
385public:
386 static B &get(UbDuo<A, UbDuo<B, C>> &d) { return d.v2().v1(); }
387 static B const &get(UbDuo<A, UbDuo<B, C>> const &d) { return d.v2().v1(); }
388};
389
390// duo5.hpp
391// return Nth value of variable duo
392template <int N, typename A, typename B>
393inline typename UbTypeOp<typename UbDuoT<N, UbDuo<A, B>>::ResultT>::RefT val(UbDuo<A, B> &d)
394{
395 return DuoValue<N, UbDuo<A, B>>::get(d);
396}
397
398// return Nth value of constant duo
399template <int N, typename A, typename B>
400inline typename UbTypeOp<typename UbDuoT<N, UbDuo<A, B>>::ResultT>::RefConstT val(UbDuo<A, B> const &d)
401{
402 return DuoValue<N, UbDuo<A, B>>::get(d);
403}
404
405// duo6.hpp
406// partial specialization for UbDuo<> with only c1 field
407template <typename A>
408struct UbDuo<A, void> {
409public:
410 using T1 = A; // type of first field
411 using T2 = void; // type of second field
412 enum { N = 1 }; // number of fields
413
414private:
415 T1 value1; // value of first field
416
417public:
418 // constructors
419 UbDuo() : value1() {}
420 UbDuo(T1 const &a) : value1(a) {}
421
422 // field access
423 T1 &v1() { return value1; }
424 T1 const &v1() const { return value1; }
425
426 void v2() {}
427 void v2() const {}
428};
429
430// tupel1.hpp
431// type that represents unused type parameters
433{
434};
435
472
473// UbTuple<> in general derives from UbTuple<> with c1 more UbNullT
474template <typename P1, typename P2 = UbNullT, typename P3 = UbNullT, typename P4 = UbNullT, typename P5 = UbNullT,
475 typename P6 = UbNullT, typename P7 = UbNullT, typename P8 = UbNullT>
476class UbTuple : public UbDuo<P1, typename UbTuple<P2, P3, P4, P5, P6, P7, P8, UbNullT>::BaseT>
477{
478public:
480
481 // constructor:
482 UbTuple() = default;
490
491 // for implicit type conversion during assignments
492 template <typename U1, typename U2, typename U3, typename U4, typename U5, typename U6, typename U7, typename U8>
498};
499
500// specialization to end deriving recursion
501template <typename P1, typename P2>
503{
504public:
506
507 // constructor:
508 UbTuple() = default;
516
517 // for implicit type conversion during assignments
518 template <typename U1, typename U2>
520 {
522 return *this;
523 }
524};
525
526// specialization for singletons
527template <typename P1>
529{
530public:
532
533 // constructor:
534 UbTuple() = default;
542
543 // for implicit type conversion during assignments
544 template <typename U1>
546 {
547 this->v1() = rhs.v1();
548 return *this;
549 }
550};
551
552// convenience function for 1 argument
553template <typename T1>
554inline UbTuple<T1> makeUbTuple(T1 const &a1)
555{
556 return UbTuple<T1>(a1);
557}
558
559// convenience function for 2 arguments
560template <typename T1, typename T2>
561inline UbTuple<T1, T2> makeUbTuple(T1 const &a1, T2 const &a2)
562{
563 return UbTuple<T1, T2>(a1, a2);
564}
565
566// convenience function for 3 arguments
567template <typename T1, typename T2, typename T3>
568inline UbTuple<T1, T2, T3> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3)
569{
570 return UbTuple<T1, T2, T3>(a1, a2, a3);
571}
572
573// convenience function for 4 arguments
574template <typename T1, typename T2, typename T3, typename T4>
575inline UbTuple<T1, T2, T3, T4> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4)
576{
577 return UbTuple<T1, T2, T3, T4>(a1, a2, a3, a4);
578}
579
580// convenience function for 5 arguments
581template <typename T1, typename T2, typename T3, typename T4, typename T5>
582inline UbTuple<T1, T2, T3, T4, T5> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4, T5 const &a5)
583{
585}
586
587// convenience function for 6 arguments
588template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
589inline UbTuple<T1, T2, T3, T4, T5, T6> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4, T5 const &a5,
590 T6 const &a6)
591{
593}
594
595// convenience function for 7 arguments
596template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
597inline UbTuple<T1, T2, T3, T4, T5, T6, T7> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4,
598 T5 const &a5, T6 const &a6, T7 const &a7)
599{
601}
602
603// convenience function for 8 arguments
604template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
605inline UbTuple<T1, T2, T3, T4, T5, T6, T7, T8> makeUbTuple(T1 const &a1, T2 const &a2, T3 const &a3, T4 const &a4,
606 T5 const &a5, T6 const &a6, T7 const &a7, T8 const &a8)
607{
609}
610
611// convenience function for 8 arguments
612template <typename T>
614{
615 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]);
616}
617
618
619
620// some typedefs
631using UbTupleUInt8 = UbTuple<unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int,
632 unsigned int, unsigned int>;
644
645#endif // UBTUPLE_H
646
static A const & get(UbDuo< A, B > const &d)
Definition UbTuple.h:346
static A & get(UbDuo< A, B > &d)
Definition UbTuple.h:345
static A & get(UbDuo< A, UbDuo< B, C > > &d)
Definition UbTuple.h:377
static A const & get(UbDuo< A, UbDuo< B, C > > const &d)
Definition UbTuple.h:378
static B & get(UbDuo< A, B > &d)
Definition UbTuple.h:354
static B const & get(UbDuo< A, B > const &d)
Definition UbTuple.h:355
static B const & get(UbDuo< A, UbDuo< B, C > > const &d)
Definition UbTuple.h:387
static B & get(UbDuo< A, UbDuo< B, C > > &d)
Definition UbTuple.h:386
static void get(T const &)
Definition UbTuple.h:337
static void get(T &)
Definition UbTuple.h:336
T2 const & v2() const
Definition UbTuple.h:274
UbDuo(T1 const &a, T2 const &b)
Definition UbTuple.h:252
T1 const & v1() const
Definition UbTuple.h:271
UbDuo(UbDuo< U1, U2 > const &d)
Definition UbTuple.h:256
UbDuo< T1, T2 > & operator=(UbDuo< U1, U2 > const &d)
Definition UbTuple.h:262
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:311
void ResultT
Definition UbTuple.h:287
UbTuple< P1, P2 > & operator=(const UbTuple< U1, U2 > &rhs)
Definition UbTuple.h:519
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:509
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:535
A class implements a tuple.
Definition UbTuple.h:477
UbTuple< P1, P2, P3, P4, P5, P6, P7, P8 > & operator=(const UbTuple< U1, U2, U3, U4, U5, U6, U7, U8 > &rhs)
Definition UbTuple.h:493
UbDuo< P1, typename UbTuple< P2, P3, P4, P5, P6, P7, P8, UbNullT >::BaseT > BaseT
Definition UbTuple.h:479
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:483
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:641
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:393
bool operator>(UbDuo< T1, T2 > const &d1, UbDuo< U1, U2 > const &d2)
Definition UbTuple.h:215
UbTuple< short, short, short, short > UbTupleShort4
Definition UbTuple.h:640
UbTuple< T, T, T, T, T, T, T, T > makeUbTupleFromArray(const std::array< T, 8 > &array)
Definition UbTuple.h:613
UbTuple< std::string, int, int, int > UbTupleStringInt3
Definition UbTuple.h:639
UbTuple< float, float, float, float > UbTupleFloat4
Definition UbTuple.h:623
UbTuple< double, double, double, double, double, double > UbTupleDouble6
Definition UbTuple.h:636
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:629
UbTuple< std::string, double, double > UbTupleStringDouble2
Definition UbTuple.h:637
UbTuple< int, int, int, int, int > UbTupleInt5
Definition UbTuple.h:628
UbTuple< double, double, double, double > UbTupleDouble4
Definition UbTuple.h:635
UbDuo< T1, T2 > makeUbDuo(T1 const &a, T2 const &b)
Definition UbTuple.h:235
UbTuple< T1 > makeUbTuple(T1 const &a1)
Definition UbTuple.h:554
UbTuple< float, float, float, float, float, float > UbTupleFloat6
Definition UbTuple.h:624
UbTuple< double, double > UbTupleDouble2
Definition UbTuple.h:633
std::ostream & operator<<(std::ostream &os, UbDuo< T1, T2 > const &d1)
Definition UbTuple.h:227
UbTuple< int, bool > UbTupleIntBool
Definition UbTuple.h:643
UbTuple< int, double, double > UbTupleIntDouble2
Definition UbTuple.h:642
UbTuple< std::string, double, double, double > UbTupleStringDouble3
Definition UbTuple.h:638
static UbTypeOp< typenameUbDuoT< N-1, UbDuo< B, C > >::ResultT >::RefConstT get(UbDuo< A, UbDuo< B, C > > const &d)
Definition UbTuple.h:366
static UbTypeOp< typenameUbDuoT< N-1, UbDuo< B, C > >::ResultT >::RefT get(UbDuo< A, UbDuo< B, C > > &d)
Definition UbTuple.h:361
void v2() const
Definition UbTuple.h:427
T1 const & v1() const
Definition UbTuple.h:424
UbDuo(T1 const &a)
Definition UbTuple.h:420