8 #ifndef SRC_TOOLS_MIXED_HH_ 9 #define SRC_TOOLS_MIXED_HH_ 14 #include <type_traits> 18 using Dim =
unsigned int;
20 template<
template<
Dim ...>
class T>
23 template<
template<
Dim ...>
class T>
27 template<
template<
Dim ...>
class T,
int lower_dim=0>
46 template <
template<
Dim...>
class TT>
49 T<0>( (other.template
get<0>()) ),
50 T<1>( (other.template
get<1>()) ),
51 T<2>( (other.template
get<2>()) ),
52 T<3>( (other.template
get<3>()) ) )
53 { static_assert(std::is_convertible<TT<0>, T<0>>::
value,
"Non-convertible types!"); }
55 Mixed(
const T<0> &p0,
const T<1> &p1,
const T<2> &p2,
const T<3> &p3)
59 Mixed(T<0> &&p0, T<1> &&p1, T<2> &&p2, T<3> &&p3)
64 template<
typename... Args>
67 T<0>(
std::forward<Args>(args)...),
68 T<1>(
std::forward<Args>(args)...),
69 T<2>(
std::forward<Args>(args)...),
70 T<3>(
std::forward<Args>(args)...))
75 return std::get<i_dim>(*this);
79 const T<i_dim> &
get()
const {
80 return std::get<i_dim>(*this);
83 template<
template<
Dim...>
class TParent,
typename std::enable_if<std::is_convertible<TParent<0>, T<0>>
::value, T<0> >::type >
87 TParent<0>(this->get<0>()),
88 TParent<1>(this->get<1>()),
89 TParent<2>(this->get<2>()),
90 TParent<3>(this->get<3>()));
99 template<
template<
Dim ...>
class T>
118 template <
template<
Dim...>
class TT>
121 T<1>(other.template
get<1>() ),
122 T<2>(other.template
get<2>() ),
123 T<3>(other.template
get<3>() ) )
124 { static_assert(std::is_convertible<TT<1>, T<1>>::
value,
"Non-convertible types!"); }
126 Mixed(
const T<1> &p1,
const T<2> &p2,
const T<3> &p3)
130 Mixed( T<1> &&p1, T<2> &&p2, T<3> &&p3)
135 template<
typename... Args>
138 T<1>(
std::forward<Args>(args)...),
139 T<2>(
std::forward<Args>(args)...),
140 T<3>(
std::forward<Args>(args)...))
149 const T<i_dim> &
get()
const {
153 template<
template<
Dim...>
class TParent,
typename std::enable_if<std::is_convertible<TParent<1>, T<1>>
::value, T<1> >::type >
157 TParent<1>(this->get<1>()),
158 TParent<2>(this->get<2>()),
159 TParent<3>(this->get<3>()));
189 template<
template<
Dim...>
class T>
191 std::shared_ptr<T<0>>, std::shared_ptr<T<1>>,
192 std::shared_ptr<T<2>>, std::shared_ptr<T<3>>>;
194 template<
template<
Dim...>
class T>
196 std::shared_ptr<T<2>>, std::shared_ptr<T<3>>>;
199 template<
template<
Dim...>
class T,
int lower_dim=0>
218 using TPtr = std::shared_ptr<T<dim>>;
220 template <
template<
Dim...>
class TT>
223 other.template
get<0>(),
224 other.template
get<1>(),
225 other.template
get<2>(),
226 other.template
get<3>())
233 template<
typename... Args>
236 std::make_shared<T<0>>(
std::forward<Args>(args)...),
237 std::make_shared<T<1>>(
std::forward<Args>(args)...),
238 std::make_shared<T<2>>(
std::forward<Args>(args)...),
239 std::make_shared<T<3>>(
std::forward<Args>(args)...))
244 std::shared_ptr<T<i_dim>>
get() {
245 return std::get<i_dim>(*this);
249 const std::shared_ptr<T<i_dim>>
get()
const {
250 return std::get<i_dim>(*this);
266 template<
template<
Dim...>
class T>
285 using TPtr = std::shared_ptr<T<dim>>;
287 template <
template<
Dim...>
class TT>
290 other.template
get<1>(),
291 other.template
get<2>(),
292 other.template
get<3>())
299 template<
typename... Args>
302 std::make_shared<T<1>>(
std::forward<Args>(args)...),
303 std::make_shared<T<2>>(
std::forward<Args>(args)...),
304 std::make_shared<T<3>>(
std::forward<Args>(args)...))
309 std::shared_ptr<T<i_dim>>
get() {
314 const std::shared_ptr<T<i_dim>>
get()
const {
Mixed(const T< 0 > &p0, const T< 1 > &p1, const T< 2 > &p2, const T< 3 > &p3)
Mixed(const Mixed< TT, 1 > &other)
std::tuple< T< 1 >, T< 2 >, T< 3 >> _MixedBase1
std::tuple< T< 0 >, T< 1 >, T< 2 >, T< 3 >> _MixedBase0
std::tuple< std::shared_ptr< T< 0 >>, std::shared_ptr< T< 1 >>, std::shared_ptr< T< 2 >>, std::shared_ptr< T< 3 >>> _MixedPtrBase0
static constexpr bool value
UnitSI operator*(const UnitSI &a, const UnitSI &b)
Product of two units.
MixedPtr(TPtr< 0 > p0, TPtr< 1 > p1, TPtr< 2 > p2, TPtr< 3 > p3)
Mixed(const T< 1 > &p1, const T< 2 > &p2, const T< 3 > &p3)
Mixed(T< 1 > &&p1, T< 2 > &&p2, T< 3 > &&p3)
std::tuple< std::shared_ptr< T< 1 >>, std::shared_ptr< T< 2 >>, std::shared_ptr< T< 3 >>> _MixedPtrBase1
std::shared_ptr< T< dim >> TPtr
MixedPtr(const MixedPtr< TT, 1 > &other)
std::shared_ptr< DimAssembly< dim >> TPtr
Mixed(const Mixed< TT > &other)
MixedPtr(TPtr< 1 > p1, TPtr< 2 > p2, TPtr< 3 > p3)
Mixed(T< 0 > &&p0, T< 1 > &&p1, T< 2 > &&p2, T< 3 > &&p3)
MixedPtr(const MixedPtr< TT > &other)