Flecs v4.1
A fast entity component system (ECS) for C & C++
Loading...
Searching...
No Matches
pair.hpp
Go to the documentation of this file.
1
6#pragma once
7
8namespace flecs {
9
10namespace _ {
11 struct pair_base { };
12} // _
13
14
35template <typename First, typename Second>
37 using type = conditional_t<!is_empty<First>::value || is_empty<Second>::value, First, Second>;
38 using first = First;
39 using second = Second;
40
41 pair(type& v) : ref_(v) { }
42
43 // This allows the class to be used as a temporary object
44 pair(const type& v) : ref_(const_cast<type&>(v)) { }
45
46 operator type&() {
47 return ref_;
48 }
49
50 operator const type&() const {
51 return ref_;
52 }
53
54 type* operator->() {
55 return &ref_;
56 }
57
58 const type* operator->() const {
59 return &ref_;
60 }
61
62 type& operator*() {
63 return ref_;
64 }
65
66 const type& operator*() const {
67 return ref_;
68 }
69
70private:
71 type& ref_;
72};
73
74template <typename First, typename Second, if_t<is_empty<First>::value> = 0>
76
77template <typename T>
78using raw_type_t = remove_pointer_t<remove_reference_t<T>>;
79
81template <typename T>
82struct is_pair {
83 static constexpr bool value = is_base_of_v<_::pair_base, raw_type_t<T>>;
84};
85
86template <typename T>
87inline constexpr bool is_pair_v = is_pair<T>::value;
88
90template <typename P>
91using pair_first_t = transcribe_cv_t<remove_reference_t<P>, typename raw_type_t<P>::first>;
92
94template <typename P>
95using pair_second_t = transcribe_cv_t<remove_reference_t<P>, typename raw_type_t<P>::second>;
96
98template <typename P>
99using pair_type_t = transcribe_cvp_t<remove_reference_t<P>, typename raw_type_t<P>::type>;
100
102template <typename T, typename U = int>
104
105template <typename T>
106struct actual_type<T, if_not_t< is_pair<T>::value >> {
107 using type = T;
108};
109
110template <typename T>
111struct actual_type<T, if_t< is_pair<T>::value >> {
112 using type = pair_type_t<T>;
113};
114
115template <typename T>
116using actual_type_t = typename actual_type<T>::type;
117
118
119// Get type without const, *, &
120template<typename T>
121struct base_type {
122 using type = decay_t< actual_type_t<T> >;
123};
124
125template <typename T>
126using base_type_t = typename base_type<T>::type;
127
128
129// Get type without *, & (retains const which is useful for function args)
130template<typename T>
132 using type = remove_pointer_t< remove_reference_t< actual_type_t<T> > >;
133};
134
135template <typename T>
136using base_arg_type_t = typename base_arg_type<T>::type;
137
138
139// Test if type is the same as its actual type
140template <typename T>
141struct is_actual {
142 static constexpr bool value = is_same_v<T, actual_type_t<T>>;
143};
144
145template <typename T>
146inline constexpr bool is_actual_v = is_actual<T>::value;
147
148} // flecs
transcribe_cvp_t< remove_reference_t< P >, typename raw_type_t< P >::type > pair_type_t
Get pair::type type from pair while preserving cv qualifiers and pointer type.
Definition pair.hpp:99
transcribe_cv_t< remove_reference_t< P >, typename raw_type_t< P >::second > pair_second_t
Get pair::second from pair while preserving cv qualifiers.
Definition pair.hpp:95
transcribe_cv_t< remove_reference_t< P >, typename raw_type_t< P >::first > pair_first_t
Get pair::first from pair while preserving cv qualifiers.
Definition pair.hpp:91
Get actual type from a regular type or pair.
Definition pair.hpp:103
Test if type is a pair.
Definition pair.hpp:82
Type that represents a pair.
Definition pair.hpp:36