Reference documentation for deal.II version 9.3.3
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
template_constraints.h
Go to the documentation of this file.
1// ---------------------------------------------------------------------
2//
3// Copyright (C) 2003 - 2021 by the deal.II authors
4//
5// This file is part of the deal.II library.
6//
7// The deal.II library is free software; you can use it, redistribute
8// it, and/or modify it under the terms of the GNU Lesser General
9// Public License as published by the Free Software Foundation; either
10// version 2.1 of the License, or (at your option) any later version.
11// The full text of the license can be found in the file LICENSE.md at
12// the top level directory of deal.II.
13//
14// ---------------------------------------------------------------------
15
16#ifndef dealii_template_constraints_h
17#define dealii_template_constraints_h
18
19
20#include <deal.II/base/config.h>
21
23
24#include <complex>
25#include <iterator>
26#include <utility>
27
29
30namespace internal
31{
32 namespace TemplateConstraints
33 {
34 // helper struct for is_base_of_all and all_same_as
35 template <bool... Values>
37
38
43 template <bool... Values>
44 struct all_true
45 {
46 static constexpr bool value =
47 std::is_same<BoolStorage<Values..., true>,
48 BoolStorage<true, Values...>>::value;
49 };
50 } // namespace TemplateConstraints
51} // namespace internal
52
59template <class Base, class... Derived>
61{
63 std::is_base_of<Base, Derived>::value...>::value;
64};
65
66
67
74template <class Type, class... Types>
76{
78 std::is_same<Type, Types>::value...>::value;
79};
80
81
82
83/*
84 * A generalization of `std::enable_if` that only works if
85 * <i>all</i> of the given boolean template parameters are
86 * true.
87 */
88template <bool... Values>
90 : std::enable_if<internal::TemplateConstraints::all_true<Values...>::value>
91{};
92
93
94
100template <typename T>
102{
103 template <typename C>
104 static std::false_type
105 test(...);
106
107 template <typename C>
108 static auto
109 test(int) -> decltype(std::begin(std::declval<C>()),
110 std::end(std::declval<C>()),
111 std::true_type());
112
113public:
114 using type = decltype(test<T>(0));
115
116 static const bool value = type::value;
117};
118
119
120
178template <typename T>
180{
181 using type = T;
182};
183
184
185
191template <typename ArgType, typename ValueType>
193{
194 ValueType value;
195 ValueType
196 operator()(const ArgType &)
197 {
198 return value;
199 }
200};
201
202
203
221{
226 template <typename T>
227 static bool
228 equal(const T *p1, const T *p2)
229 {
230 return (p1 == p2);
231 }
232
233
240 template <typename T, typename U>
241 static bool
242 equal(const T *, const U *)
243 {
244 return false;
245 }
246};
247
248
249
250namespace internal
251{
262 template <typename T, typename U>
264 {
265 using type = decltype(std::declval<T>() * std::declval<U>());
266 };
267
268} // namespace internal
269
270
271
318template <typename T, typename U>
320{
321 using type =
323 typename std::decay<U>::type>::type;
324};
325
326namespace internal
327{
328 // Annoyingly, there is no std::complex<T>::operator*(U) for scalars U
329 // other than T (not even in C++11, or C++14). We provide our own overloads
330 // in base/complex_overloads.h, but in order for them to work, we have to
331 // manually specify all products we want to allow:
332
333 template <typename T>
334 struct ProductTypeImpl<std::complex<T>, std::complex<T>>
335 {
336 using type = std::complex<T>;
337 };
338
339 template <typename T, typename U>
340 struct ProductTypeImpl<std::complex<T>, std::complex<U>>
341 {
342 using type = std::complex<typename ProductType<T, U>::type>;
343 };
344
345 template <typename U>
346 struct ProductTypeImpl<double, std::complex<U>>
347 {
348 using type = std::complex<typename ProductType<double, U>::type>;
349 };
350
351 template <typename T>
352 struct ProductTypeImpl<std::complex<T>, double>
353 {
354 using type = std::complex<typename ProductType<T, double>::type>;
355 };
356
357 template <typename U>
358 struct ProductTypeImpl<float, std::complex<U>>
359 {
360 using type = std::complex<typename ProductType<float, U>::type>;
361 };
362
363 template <typename T>
364 struct ProductTypeImpl<std::complex<T>, float>
365 {
366 using type = std::complex<typename ProductType<T, float>::type>;
367 };
368
369} // namespace internal
370
371
372
428template <typename T>
430
431
432template <>
433struct EnableIfScalar<double>
434{
435 using type = double;
436};
437
438template <>
439struct EnableIfScalar<float>
440{
441 using type = float;
442};
443
444template <>
445struct EnableIfScalar<long double>
446{
447 using type = long double;
448};
449
450template <>
452{
453 using type = int;
454};
455
456template <>
457struct EnableIfScalar<unsigned int>
458{
459 using type = unsigned int;
460};
461
462template <typename T>
463struct EnableIfScalar<std::complex<T>>
464{
465 using type = std::complex<T>;
466};
467
468
470
471#endif
static const bool value
static std::false_type test(...)
decltype(test< T >(0)) type
static auto test(int) -> decltype(std::begin(std::declval< C >()), std::end(std::declval< C >()), std::true_type())
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:402
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:403
static const char U
static const char T
VectorType::value_type * end(VectorType &V)
VectorType::value_type * begin(VectorType &V)
STL namespace.
static bool equal(const T *p1, const T *p2)
static bool equal(const T *, const U *)
typename internal::ProductTypeImpl< typename std::decay< T >::type, typename std::decay< U >::type >::type type
static constexpr bool value
ValueType operator()(const ArgType &)
std::complex< typename ProductType< double, U >::type > type
std::complex< typename ProductType< float, U >::type > type
std::complex< typename ProductType< T, double >::type > type
std::complex< typename ProductType< T, float >::type > type
std::complex< typename ProductType< T, U >::type > type
decltype(std::declval< T >() *std::declval< U >()) type
static constexpr bool value