YSTest: ref.hpp 源文件

YSTest PreAlpha_b700_20160611 The YSLib Test Project

- 首页
- 相关页面
- 模块
- 命名空间
- 类
- 文件

- 文件列表
- 文件成员

ref.hpp
浏览该文件的文档.
1 /*
2 © 2011-2016 FrankHB.
3
4 This file is part of the YSLib project, and may only be used,
5 modified, and distributed under the terms of the YSLib project
6 license, LICENSE.TXT. By continuing to use, modify, or distribute
7 this file you indicate that you have read the license and
8 understand and accept it fully.
9 */
10
30 #ifndef YB_INC_ystdex_ref_hpp_
31 #define YB_INC_ystdex_ref_hpp_ 1
32
33 #include "addressof.hpp" // for "addressof.hpp", ystdex::constfn_addressof,
34 // exclude_self_t, cond_t, not_, is_object;
35 #include <functional> // for std::reference_wrapper;
36
44 #if YB_IMPL_MSCPP >= 1800
45 # ifndef __cpp_lib_transparent_operators
46 # define __cpp_lib_transparent_operators 201210
47 # endif
48 #endif
49 #if YB_IMPL_MSCPP >= 1900
50 # ifndef __cpp_lib_invoke
51 # define __cpp_lib_invoke 201411
52 # endif
53 #endif
54
55
56 namespace ystdex
57 {
58
60
61
73 template<typename _type>
74 class lref
75 {
76 public:
77 using type = _type;
78
79 private:
80 _type* ptr;
81
82 public:
83 yconstfn
84 lref(_type& t) ynothrow
85 : ptr(ystdex::constfn_addressof(t))
86 {}
88 lref(_type&&) = delete;
89 yconstfn
90 lref(std::reference_wrapper<_type> t) ynothrow
91 : lref(t.get())
92 {}
93
95 lref(const lref&) = default;
96
98 lref&
99 operator=(const lref&) = default;
100
101 operator _type&() const ynothrow
102 {
103 return *ptr;
104 }
105
106 _type&
107 get() const ynothrow
108 {
109 return *ptr;
110 }
111 };
112
118 template<typename _type>
119 yconstfn lref<_type>
120 ref(_type& t)
121 {
122 return lref<_type>(t);
123 }
124 template<class _type>
125 void
126 ref(const _type&&) = delete;
127
128 template<typename _type>
129 yconstfn lref<const _type>
130 cref(const _type& t)
131 {
132 return lref<const _type>(t);
133 }
134 template<class _type>
135 void
136 cref(const _type&&) = delete;
138
139
140
142
143
149 template<typename _type>
150 struct is_reference_wrapper : false_type
151 {};
152
153 template<typename _type>
154 struct is_reference_wrapper<std::reference_wrapper<_type>> : true_type
155 {};
156
157 template<typename _type>
158 struct is_reference_wrapper<lref<_type>> : true_type
159 {};
161
169 template<typename _type>
170 struct unwrap_reference
171 {
172 using type = _type;
173 };
174
175 template<typename _type>
176 using unwrap_reference_t = _t<unwrap_reference<_type>>;
177
178 template<typename _type>
179 struct unwrap_reference<std::reference_wrapper<_type>>
180 {
181 using type = _type;
182 };
183
184 template<typename _type>
185 struct unwrap_reference<lref<_type>>
186 {
187 using type = _type;
188 };
190
191
192
200 template<typename _type>
201 yconstfn _type&
202 unref(_type&& x) ynothrow
203 {
204 return x;
205 }
207 template<typename _type>
208 yconstfn _type&
209 unref(const lref<_type>& x) ynothrow
210 {
211 return x.get();
212 }
214
215
222 class void_ref
223 {
224 private:
225 const volatile void* ptr;
226
227 public:
228 template<typename _type>
229 yconstfn
230 void_ref(_type& obj)
231 : ptr(&obj)
232 {}
233
234 template<typename _type>
235 yconstfn YB_PURE
236 operator _type&() const
237 {
238 return *static_cast<_type*>(&*this);
239 }
240
241 YB_PURE void*
242 operator&() const volatile
243 {
244 return const_cast<void*>(ptr);
245 }
246 };
247
248
254 struct pseudo_output
255 {
257
258 template<typename... _tParams>
259 yconstfn
260 pseudo_output(_tParams&&...) ynothrow
261 {}
262
263 template<typename _tParam,
264 yimpl(exclude_self_t<pseudo_output, _tParam>)>
265 yconstfn const pseudo_output&
266 operator=(_tParam&&) const ynothrow
267 {
268 return *this;
269 }
270 template<typename... _tParams>
271 yconstfn const pseudo_output&
272 operator()(_tParams&&...) const ynothrow
273 {
274 return *this;
275 }
277 };
278
279
286 template<typename _type, typename _tRes = pseudo_output>
288 using nonvoid_result_t = cond_t<not_<is_void<_type>>, _type, pseudo_output>;
289
291 template<typename _type, typename _tRes = pseudo_output>
292 using object_result_t = cond_t<is_object<_type>, _type, pseudo_output>;
294
295 } // namespace ystdex;
296
297 #endif
298
YSLib::Drawing::GBinaryGroup::get
yconstfn _type & get(GBinaryGroup< _type > &val)
取分量。
Definition: YGDIBase.h:242
YSLib::Drawing::x
The boundary is out of the const Rect SDst SPos x
Definition: YDraw.h:127
ynothrow
#define ynothrow
YSLib 无异常抛出保证：若支持 noexcept 关键字， 指定特定的 noexcept 异常规范。
Definition: ydef.h:740
ystdex::nonvoid_result_t
cond_t< not_< is_void< _type >>, _type, pseudo_output > nonvoid_result_t
若类型不是空类型则取后备结果类型（默认为 pseudo_output ）。
Definition: ref.hpp:288
ystdex::lref::ptr
_type * ptr
Definition: ref.hpp:80
ystdex::void_ref::ptr
const volatile void * ptr
Definition: ref.hpp:225
ystdex::lref::operator=
lref & operator=(const lref &)=default
addressof.hpp
一元操作符 & 和取指针的相关接口。
ystdex::exclude_self_t
enable_if_t<!is_same< _tClass &, decay_t< _tParam > & >::value, _type > exclude_self_t
移除选择类类型的特定重载避免构造模板和复制/转移特殊成员函数冲突。
Definition: type_traits.hpp:708
ystdex::void_ref
任意对象引用类型。
Definition: ref.hpp:222
ystdex::void_ref::operator&
void * operator&() const volatile
Definition: ref.hpp:242
ystdex::lref
左值引用包装。
Definition: ref.hpp:74
yimpl
#define yimpl(...)
实现标签。
Definition: ydef.h:256
YB_PURE
#define YB_PURE
指示函数或函数模板实例为纯函数。
Definition: ydef.h:501
ystdex::unwrap_reference< std::reference_wrapper< _type > >::type
_type type
Definition: ref.hpp:181
ystdex::constfn_addressof
enable_if_t<!has_overloaded_addressof< _type >::value, _type * > constfn_addressof(_type &r)
尝试对非重载 operator& 提供 constexpr 的 std::addressof 替代。
Definition: addressof.hpp:78
std
Definition: memory.hpp:1100
ystdex::unwrap_reference_t
_t< unwrap_reference< _type >> unwrap_reference_t
Definition: ref.hpp:176
ystdex::_t
typename _type::type _t
嵌套类型别名。
Definition: type_traits.hpp:96
ystdex::unref
_type & unref(_type &&x)
解除引用包装。
Definition: ref.hpp:202
ystdex::lref<::FreeImageIO >::type
::FreeImageIO type
Definition: ref.hpp:77
ystdex::lref::lref
lref(_type &t)
Definition: ref.hpp:84
ystdex
特性测试宏。
Definition: ydef.h:796
ystdex::unwrap_reference::type
_type type
Definition: ref.hpp:172
ystdex::cond_t
conditional_t< _tCond::value, _tThen, _tElse > cond_t
条件判断。
Definition: type_traits.hpp:698
ystdex::pseudo_output
伪输出对象。
Definition: ref.hpp:254
ystdex::pseudo_output::operator()
const pseudo_output & operator()(_tParams &&...) const
Definition: ref.hpp:272
ystdex::pseudo_output::pseudo_output
pseudo_output(_tParams &&...)
Definition: ref.hpp:260
ystdex::lref::lref
lref(std::reference_wrapper< _type > t)
Definition: ref.hpp:90
yconstfn
#define yconstfn
指定编译时常量函数。
Definition: ydef.h:654
ystdex::unwrap_reference< lref< _type > >::type
_type type
Definition: ref.hpp:187
ystdex::unwrap_reference
取引用包装的类型或未被包装的模板参数类型。
Definition: ref.hpp:170
ystdex::cref
lref< const _type > cref(const _type &t)
Definition: ref.hpp:130
ystdex::is_reference_wrapper
判断模板参数指定的类型是否。
Definition: ref.hpp:150
ystdex::pseudo_output::operator=
const pseudo_output & operator=(_tParam &&) const
Definition: ref.hpp:266
ystdex::object_result_t
cond_t< is_object< _type >, _type, pseudo_output > object_result_t
若类型不是对象类型则取后备结果类型（默认为 pseudo_output ）。
Definition: ref.hpp:292
ystdex::void_ref::void_ref
void_ref(_type &obj)
Definition: ref.hpp:230
ystdex::ref
lref< _type > ref(_type &t)
构造引用包装。
Definition: ref.hpp:120