-
Notifications
You must be signed in to change notification settings - Fork 17
/
typeutilities.hh
95 lines (74 loc) · 2.37 KB
/
typeutilities.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifndef DUNE_COMMON_TYPEUTILITIES_HH
#define DUNE_COMMON_TYPEUTILITIES_HH
#include <cstddef>
#include <type_traits>
#include <tuple>
namespace Dune {
/**
* \file
* \brief Utilities for type computations, constraining overloads, ...
* \author Carsten Gräser
*/
namespace Impl
{
template<class This, class... T>
struct disableCopyMoveHelper : public std::is_base_of<This, std::tuple_element_t<0, std::tuple<std::decay_t<T>...>>>
{};
template<class This>
struct disableCopyMoveHelper<This> : public std::false_type
{};
} // namespace Impl
/**
* \brief Helper to disable constructor as copy and move constructor
*
* \ingroup TypeUtilities
*
* Helper typedef to remove constructor with forwarding reference from
* overload set for copy and move constructor or assignment.
*/
template<class This, class... T>
using disableCopyMove = std::enable_if_t< not Impl::disableCopyMoveHelper<This, T...>::value, int>;
/**
* \brief Helper class for tagging priorities.
*
* \ingroup TypeUtilities
*
* When using multiple overloads of a function
* where some are removed from the overload set
* via SFINAE, the remaining overloads may be ambiguous.
* A prototypic example would be a default overload
* that should be used if the others do not apply.
*
* By adding additional arguments of type PriorityTag<k>
* with increasing priority k to all overloads and calling
* the method with PriorityTag<m> where m is larger or equal
* to the maximal used priority, those can be made unambiguous.
*
* In this case the matching overload with highest priority
* will be used. This is achieved by the fact that PriorityTag<k>
* derives from all types PriorityTag<i> with i less than k.
*
* \tparam priority The priority of this tag.
*/
template<std::size_t priority>
struct PriorityTag : public PriorityTag<priority-1>
{
static constexpr std::size_t value = priority;
};
/**
* \brief Helper class for tagging priorities.
*
* \ingroup TypeUtilities
*
* PriorityTag<0> does not derive from any
* other PriorityTag.
*/
template<>
struct PriorityTag<0>
{
static constexpr std::size_t value = 0;
};
} // namespace Dune
#endif // DUNE_COMMON_TYPEUTILITIES_HH