YSTest: YCommon.h 源文件

YSTest PreAlpha_b800_20170810 The YSLib Test Project

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

- 文件列表
- 文件成员

YCommon.h
浏览该文件的文档.
1 /*
2 © 2009-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
28 #ifndef YCL_INC_ycommon_h_
29 #define YCL_INC_ycommon_h_ 1
30
31 #include "YModules.h"
32 #include YFM_YCLib_Platform
33 #include <ystdex/functional.hpp> // for ystdex::decay_t, ystdex::result_of_t,
34 // ystdex::retry_on_cond;
35 #include <ystdex/cassert.h> // yconstraint, yassume for other headers;
36 #include <ystdex/cwctype.h> // for ystdex::isprint, ystdex::iswprint;
37 #include <ystdex/cstring.h> // for ystdex::uchar_t, ystdex::replace_cast;
38 #include YFM_YBaseMacro // for TryRet, CatchIgnore;
39 #include <exception> // for std::bad_alloc;
40 #include <cerrno> // for errno, ENOMEM;
41
43 namespace platform
44 {
45
51 using ID = std::uintmax_t;
53
55 template<ID _vN>
56 using MetaID = ystdex::integral_constant<ID, _vN>;
57
59 struct IDTagBase
60 {};
61
62 #if YB_IMPL_CLANGPP
63 # pragma GCC diagnostic push
64 # pragma GCC diagnostic ignored "-Wweak-vtables"
65 #endif
66
68 struct HostedIDTagBase : virtual IDTagBase
69 {};
70
72 template<ID _vN>
73 struct IDTag : virtual IDTagBase, virtual MetaID<_vN>
74 {};
75
77 #define YCL_IDTag_Spec(_n, _base) \
78 template<> \
79 struct IDTag<YF_Platform_##_n> : virtual _base, \
80 virtual MetaID<YF_Platform_##_n> \
81 {};
82
84 #define YCL_IDTag_SpecHost(_n) \
85 YCL_IDTag_Spec(_n, HostedIDTagBase)
86
88 #define YCL_IDTag_SpecOnBase(_n, _b) \
89 YCL_IDTag_Spec(_n, IDTag<YF_Platform_##_b>)
90
91 YCL_IDTag_SpecHost(Win32)
92 YCL_IDTag_SpecOnBase(Win64, Win32)
93 YCL_IDTag_SpecOnBase(MinGW32, Win32)
94 YCL_IDTag_SpecOnBase(MinGW64, Win64)
95 YCL_IDTag_SpecHost(Linux)
96 YCL_IDTag_SpecOnBase(Linux_x86, Linux)
97 YCL_IDTag_SpecOnBase(Linux_x64, Linux)
98 YCL_IDTag_SpecOnBase(Android, Linux)
99 YCL_IDTag_SpecOnBase(Android_ARM, Android)
100
102 template<ID... _vN>
103 struct IDTagSet : virtual IDTag<_vN>...
104 {};
106
112 #define YCL_Tag_constfn inline
113
114 #if YB_IMPL_CLANGPP
115 # pragma GCC diagnostic pop
116 #endif
117
124 #define YCL_DefPlatformFwdTmpl(_n, _fn) \
125 DefFwdTmplAuto(_n, _fn(platform::IDTag<YF_Platform>(), yforward(args)...))
126
127
134 #define YCL_CheckDecl_t(_fn) CheckDecl##_fn##_t
135 #define YCL_DeclCheck_t(_fn, _call) \
136 template<typename... _tParams> \
137 using YCL_CheckDecl_t(_fn) \
138 = decltype(_call(std::declval<_tParams&&>()...));
139
140
141
146 YB_NORETURN YF_API void
147 terminate() ynothrow;
148
149
154 namespace Descriptions
155 {
156
161 enum RecordLevel : std::uint8_t
162 {
163 Emergent = 0x00,
164 Alert = 0x20,
165 Critical = 0x40,
166 Err = 0x60,
167 Warning = 0x80,
168 Notice = 0xA0,
169 Informative = 0xC0,
170 Debug = 0xE0
171 };
172
173 } // namespace Descriptions;
174
175
183 inline PDefH(bool, IsPrint, char c)
184 ImplRet(ystdex::isprint(c))
185 inline PDefH(bool, IsPrint, wchar_t c)
186 ImplRet(ystdex::iswprint(c))
187 template<typename _tChar>
188 bool
189 IsPrint(_tChar c)
190 {
191 return platform::IsPrint(wchar_t(c));
192 }
194
195
201 inline PDefH(ystdex::uchar_t*, ucast, wchar_t* p) ynothrow
202 ImplRet(ystdex::replace_cast<ystdex::uchar_t*>(p))
203 inline PDefH(const ystdex::uchar_t*, ucast, const wchar_t* p) ynothrow
204 ImplRet(ystdex::replace_cast<const ystdex::uchar_t*>(p))
205 template<typename _tChar>
206 _tChar*
207 ucast(_tChar* p) ynothrow
208 {
209 return p;
210 }
211
212 inline PDefH(wchar_t*, wcast, ystdex::uchar_t* p) ynothrow
213 ImplRet(ystdex::replace_cast<wchar_t*>(p))
214 inline PDefH(const wchar_t*, wcast, const ystdex::uchar_t* p) ynothrow
215 ImplRet(ystdex::replace_cast<const wchar_t*>(p))
216 template<typename _tChar>
217 _tChar*
218 wcast(_tChar* p) ynothrow
219 {
220 return p;
221 }
223
224
229 template<typename _func, typename... _tParams>
230 ystdex::result_of_t<_func(_tParams&&...)>
231 CallNothrow(const ystdex::result_of_t<_func(_tParams&&...)>& v, _func f,
232 _tParams&&... args) ynothrowv
233 {
234 TryRet(f(yforward(args)...))
235 CatchExpr(std::bad_alloc&, errno = ENOMEM)
236 CatchIgnore(...)
237 return v;
238 }
239
244 template<typename _func, typename _tErrorRef,
245 typename _tError = ystdex::decay_t<_tErrorRef>,
246 typename _type = ystdex::result_of_t<_func&()>>
247 _type
248 RetryOnError(_func f, _tErrorRef&& err, _tError e = _tError())
249 {
250 return ystdex::retry_on_cond([&](_type res){
251 return res < _type() && _tError(err) == e;
252 }, f);
253 }
254
259 template<typename _func, typename _type = ystdex::result_of_t<_func&()>>
260 inline _type
261 RetryOnInterrupted(_func f)
262 {
263 return RetryOnError(f, errno, EINTR);
264 }
265
266
272 YF_API int
273 usystem(const char*);
274
275
277
278
282 enum class SystemOption
283 {
289 PageSize,
291
292 MaxSemaphoreNumber,
295 MaxSemaphoreValue,
297 MaxSymlinkLoop
299 };
300
301
323 YF_API
324 #if YCL_DS
325 YB_STATELESS
326 #endif
327 size_t
328 FetchLimit(SystemOption) ynothrow;
330
331 } // namespace platform;
332
337 namespace platform_ex
338 {
339
340 #if YCL_DS
341
348 YF_API bool
349 AllowSleep(bool);
350 #endif
351
352 } // namespace platform_ex;
353
354 #endif
355
platform::MetaID
ystdex::integral_constant< ID, _vN > MetaID
YF_Platform_* 宏替换值的对应的元类型。
Definition: YCommon.h:56
platform::ID
std::uintmax_t ID
YF_Platform_* 宏替换值的公共类型。
Definition: YCommon.h:52
platform::Descriptions::Debug
Definition: YCommon.h:170
ystdex::cpp2014::result_of_t
typename result_of< _type >::type result_of_t
Definition: type_traits.hpp:355
platform::Descriptions::Alert
Definition: YCommon.h:164
v
byte v
Definition: CharRenderer.cpp:75
platform::FetchLimit
YF_API size_t FetchLimit(SystemOption) ynothrow
取限制配置。
Definition: YCommon.cpp:69
YCL_IDTag_SpecOnBase
#define YCL_IDTag_SpecOnBase(_n, _b)
指定基于特定平台的 IDTag 特化。
Definition: YCommon.h:88
platform
默认平台命名空间。
Definition: Container.h:47
ystdex::replace_cast
ystdex::enable_if_t< and_< is_object_pointer< _pDst >, is_trivially_replaceable< _tSrc, remove_pointer_t< _pDst > > >::value, _pDst > replace_cast(_tSrc *v)
保证平凡替换存储的显式转换。
Definition: type_pun.hpp:204
CHRLib::f
f(d, s)
platform::PDefH
const string const char *sig PDefH(string, ComposeMessageWithSignature, const char *msg, const char *sig) ImplRet(string(Nonnull(msg))+" @ "+Nonnull(sig)) template< class _type > inline YB_NONNULL(2) string ComposeMessageWithSignature(const _type &msg
platform::Descriptions::Emergent
Definition: YCommon.h:163
TryRet
#define TryRet(...)
指定表达式在 try 块中求值并返回。
Definition: YBaseMacro.h:124
CHRLib::args
_tParams && args
Definition: CharacterProcessing.h:538
CatchIgnore
#define CatchIgnore(_ex)
指定异常处理器忽略指定异常。
Definition: YBaseMacro.h:133
platform::ImplRet
const string const char *sig ImplRet(msg+" @ "+Nonnull(sig)) inline YB_NONNULL(1
platform::Descriptions::RecordLevel
RecordLevel
记录等级。
Definition: YCommon.h:161
CatchExpr
#define CatchExpr(_ex,...)
指定表达式作为异常处理器。
Definition: YBaseMacro.h:129
platform::usystem
YF_API int usystem(const char *)
执行 UTF-8 字符串的环境命令。
Definition: YCommon.cpp:58
ystdex::cpp2014::decay_t
typename decay< _type >::type decay_t
Definition: type_traits.hpp:340
platform::SystemOption::MaxSemaphoreValue
可具有的信号量的最大值。
ystdex
特性测试宏。
Definition: ydef.h:822
platform::Descriptions::Critical
Definition: YCommon.h:165
platform::ynothrowv
YF_API int amode ynothrowv
Definition: FileIO.h:528
YF_API
#define YF_API
Definition: Platform.h:56
YModules.h
cassert.h
ISO C 断言/调试跟踪扩展。
platform::Descriptions::Notice
Definition: YCommon.h:168
functional.hpp
函数和可调用对象。
cstring.h
ISO C 标准字符串扩展。
platform::RetryOnInterrupted
_type RetryOnInterrupted(_func f)
循环可能被中断的操作。
Definition: YCommon.h:261
platform::SystemOption::MaxSemaphoreNumber
一个进程中可具有的信号量的最大数量。
platform::HostedIDTagBase
宿主平台标识的公共标记类型：指定任意宿主平台。
Definition: YCommon.h:68
CHRLib::e
const char const char * e
Definition: CharacterProcessing.h:109
ystdex::iswprint
bool iswprint(wchar_t)
区域无关的 std::isprint 实现。
Definition: cwctype.cpp:34
std
Definition: memory.hpp:1183
platform::IDTagBase
平台标识的公共标记类型：指定任意平台。
Definition: YCommon.h:59
platform::Descriptions::Warning
Definition: YCommon.h:167
YB_NORETURN
#define YB_NORETURN
指定无返回值函数。
Definition: ydef.h:504
platform::Descriptions::Err
Definition: YCommon.h:166
platform::terminate
YB_NORETURN YF_API void terminate() ynothrow
异常终止函数。
Definition: YCommon.cpp:47
platform_ex
平台扩展命名空间。
Definition: Android.h:45
platform::Descriptions::Informative
Definition: YCommon.h:169
CHRLib::c
c
Definition: CharacterProcessing.h:81
cwctype.h
ISO C 宽字符分类操作扩展。
yforward
#define yforward(_expr)
根据参数类型使用 std::forward 传递对应参数。
Definition: ydef.h:995
ystdex::retry_on_cond
result_of_t< _fCallable &&(_tParams &&...)> retry_on_cond(_fCond cond, _fCallable &&f, _tParams &&...args)
循环重复调用：代替直接使用 do-while 语句以避免过多引入作用域外的变量。
Definition: functional.hpp:1152
platform::IDTagSet
取平台标识的整数标记集合类型。
Definition: YCommon.h:103
platform::SystemOption
SystemOption
系统配置选项。
Definition: YCommon.h:282
platform::SystemOption::MaxSymlinkLoop
在路径解析中符号链接可被可靠遍历的最大次数。
ystdex::uchar_t
cond_t< is_trivially_replaceable< wchar_t, char16_t >, char16_t, cond_t< is_trivially_replaceable< wchar_t, char32_t >, char32_t, void >> uchar_t
指定和 wchar_t 互相替换存储的非 char 内建字符类型。
Definition: cstring.h:118
ystdex::isprint
bool isprint(char c)
区域无关的 std::isprint 实现。
Definition: cctype.h:108
platform::SystemOption::PageSize
内存页面字节数。
CHRLib::p
const auto p(d)
YCL_IDTag_SpecHost
#define YCL_IDTag_SpecHost(_n)
指定宿主平台的 IDTag 特化。
Definition: YCommon.h:84
platform::ynothrow
const _tString &path ynothrow
Definition: YCLib/FileSystem.h:274
YB_STATELESS
#define YB_STATELESS
指示函数或函数模板实例为无状态函数。
Definition: ydef.h:548
platform::IDTag
平台标识的整数标记类型。
Definition: YCommon.h:73