ttg 1.0.0
Template Task Graph (TTG): flowgraph-based programming model for high-performance distributed-memory algorithms
Loading...
Searching...
No Matches
qualifier_flags.hpp
Go to the documentation of this file.
1/*
2Defines `qualifier_flags`
3
4@Copyright Barrett Adair 2015-2017
5Distributed under the Boost Software License, Version 1.0.
6(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
7
8*/
9
10#ifndef BOOST_CLBL_TRTS_QUALIFIER_FLAGS_HPP
11#define BOOST_CLBL_TRTS_QUALIFIER_FLAGS_HPP
12
14
15namespace boost { namespace callable_traits { namespace detail {
16
17//bit qualifier_flags used to signify cv/ref qualifiers
18using qualifier_flags = std::uint32_t;
19
20/*
21 | && & V C |
22--------------------------------------------
230 | 0 0 0 0 | default
241 | 0 0 0 1 | const
252 | 0 0 1 0 | volatile
263 | 0 0 1 1 | const volatile
27--------------------------------------------
284 | 0 1 0 0 | &
295 | 0 1 0 1 | const &
306 | 0 1 1 0 | volatile &
317 | 0 1 1 1 | const volatile &
32--------------------------------------------
338 | 1 0 0 0 | &&
349 | 1 0 0 1 | const &&
3510 | 1 0 1 0 | volatile &&
3611 | 1 0 1 1 | const volatile &&
37
38*/
39
40// Flag representing the default qualifiers on a type
41// or member function overload.
43
44// Flag representing a const qualifier on a type or
45// member function overload.
46constexpr qualifier_flags const_ = 1;
47
48// Flag representing a volatile qualifier on a type
49// or member function overload.
51
52#ifdef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS
53
56#else
57
58// Flag representing an lvalue reference type, or
59// an lvalue-reference-qualified member function
60// overload.
61constexpr qualifier_flags lref_ = 4;
62
63// Flag representing an lvalue reference type, or
64// an rvalue-reference-qualified member function
65// overload.
66constexpr qualifier_flags rref_ = 8;
67
68#endif //#ifdef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS
69
70constexpr qualifier_flags cv_ = 3;
71
72template<qualifier_flags Flags>
73using remove_const_flag = std::integral_constant<
74 qualifier_flags, Flags & ~const_>;
75
76template<qualifier_flags Flags>
77using is_const = std::integral_constant<bool,
78 (Flags & const_) != 0>;
79
80template<qualifier_flags Flags>
81using remove_volatile_flag = std::integral_constant<
82 qualifier_flags, Flags & ~volatile_>;
83
84template<typename U, typename T = typename std::remove_reference<U>::type>
85using cv_of = std::integral_constant<qualifier_flags,
86 (std::is_const<T>::value ? const_ : default_)
87 | (std::is_volatile<T>::value ? volatile_ : default_)>;
88
89template<typename T>
90using ref_of = std::integral_constant<qualifier_flags,
91 std::is_rvalue_reference<T>::value ? rref_
92 : (std::is_lvalue_reference<T>::value ? lref_
93 : default_)>;
94
95//bit-flag implementation of C++11 reference collapsing rules
96template<qualifier_flags Existing,
97 qualifier_flags Other,
98 bool AlreadyHasRef = (Existing & (lref_ | rref_)) != 0,
99 bool AlreadyHasLRef = (Existing & lref_) == lref_,
100 bool IsAddingLRef = (Other & lref_) == lref_
101>
102using collapse_flags = std::integral_constant<qualifier_flags,
103 !AlreadyHasRef ? (Existing | Other)
104 : (AlreadyHasLRef ? (Existing | (Other & ~rref_))
105 : (IsAddingLRef ? ((Existing & ~rref_) | Other )
106 : (Existing | Other)))>;
107
108template<typename T> struct flag_map { static constexpr qualifier_flags value = default_; };
109template<typename T> struct flag_map<T &> { static constexpr qualifier_flags value = lref_; };
110template<typename T> struct flag_map<T &&> { static constexpr qualifier_flags value = rref_; };
111template<typename T> struct flag_map<T const> { static constexpr qualifier_flags value = const_; };
112template<typename T> struct flag_map<T const &> { static constexpr qualifier_flags value = const_ | lref_; };
113template<typename T> struct flag_map<T const &&> { static constexpr qualifier_flags value = const_ | rref_; };
114template<typename T> struct flag_map<T volatile> { static constexpr qualifier_flags value = volatile_; };
115template<typename T> struct flag_map<T volatile &> { static constexpr qualifier_flags value = volatile_ | lref_; };
116template<typename T> struct flag_map<T volatile &&> { static constexpr qualifier_flags value = volatile_ | rref_; };
117template<typename T> struct flag_map<T const volatile> { static constexpr qualifier_flags value = const_ | volatile_; };
118template<typename T> struct flag_map<T const volatile &> { static constexpr qualifier_flags value = const_ | volatile_ | lref_; };
119template<typename T> struct flag_map<T const volatile &&> { static constexpr qualifier_flags value = const_ | volatile_ | rref_; };
120
121}}} // namespace boost::callable_traits::detail
122
123#endif // #ifndef BOOST_CLBL_TRTS_QUALIFIER_FLAGS_HPP
constexpr qualifier_flags volatile_
constexpr qualifier_flags rref_
constexpr qualifier_flags const_
std::integral_constant< qualifier_flags,(std::is_const< T >::value ? const_ :default_)|(std::is_volatile< T >::value ? volatile_ :default_)> cv_of
std::integral_constant< qualifier_flags, std::is_rvalue_reference< T >::value ? rref_ :(std::is_lvalue_reference< T >::value ? lref_ :default_)> ref_of
constexpr qualifier_flags cv_
std::integral_constant< qualifier_flags, Flags &~const_ > remove_const_flag
constexpr qualifier_flags lref_
std::integral_constant< qualifier_flags, !AlreadyHasRef ?(Existing|Other) :(AlreadyHasLRef ?(Existing|(Other &~rref_)) :(IsAddingLRef ?((Existing &~rref_)|Other) :(Existing|Other)))> collapse_flags
constexpr qualifier_flags default_
std::integral_constant< qualifier_flags, Flags &~volatile_ > remove_volatile_flag
std::integral_constant< bool,(Flags &const_) !=0 > is_const
static constexpr qualifier_flags value