YSTest: YCommon.h 源文件

YSTest PreAlpha_b700_20160611 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
39
41 namespace platform
42 {
43
49 using ID = std::uintmax_t;
51
53 template<ID _vN>
54 using MetaID = ystdex::integral_constant<ID, _vN>;
55
57 struct IDTagBase
58 {};
59
60 #if YB_IMPL_CLANGPP
61 # pragma GCC diagnostic push
62 # pragma GCC diagnostic ignored "-Wweak-vtables"
63 #endif
64
66 struct HostedIDTagBase : virtual IDTagBase
67 {};
68
70 template<ID _vN>
71 struct IDTag : virtual IDTagBase, virtual MetaID<_vN>
72 {};
73
75 #define YCL_IDTag_Spec(_n, _base) \
76 template<> \
77 struct IDTag<YF_Platform_##_n> : virtual _base, \
78 virtual MetaID<YF_Platform_##_n> \
79 {};
80
82 #define YCL_IDTag_SpecHost(_n) \
83 YCL_IDTag_Spec(_n, HostedIDTagBase)
84
86 #define YCL_IDTag_SpecOnBase(_n, _b) \
87 YCL_IDTag_Spec(_n, IDTag<YF_Platform_##_b>)
88
89 YCL_IDTag_SpecHost(Win32)
90 YCL_IDTag_SpecOnBase(Win64, Win32)
91 YCL_IDTag_SpecOnBase(MinGW32, Win32)
92 YCL_IDTag_SpecOnBase(MinGW64, Win64)
93 YCL_IDTag_SpecHost(Linux)
94 YCL_IDTag_SpecOnBase(Linux_x86, Linux)
95 YCL_IDTag_SpecOnBase(Linux_x64, Linux)
96 YCL_IDTag_SpecOnBase(Android, Linux)
97 YCL_IDTag_SpecOnBase(Android_ARM, Android)
98
100 template<ID... _vN>
101 struct IDTagSet : virtual IDTag<_vN>...
102 {};
104
105 #if YB_IMPL_CLANGPP
106 # pragma GCC diagnostic pop
107 #endif
108
114 #define YCL_DefPlatformFwdTmpl(_n, _fn) \
115 DefFwdTmplAuto(_n, _fn(platform::IDTag<YF_Platform>(), yforward(args)...))
116
117
124 #define YCL_CheckDecl_t(_fn) CheckDecl##_fn##_t
125 #define YCL_DeclCheck_t(_fn, _call) \
126 template<typename... _tParams> \
127 using YCL_CheckDecl_t(_fn) \
128 = decltype(_call(std::declval<_tParams&&>()...));
129
130
131
136 YB_NORETURN YF_API void
137 terminate() ynothrow;
138
139
144 namespace Descriptions
145 {
146
151 enum RecordLevel : std::uint8_t
152 {
153 Emergent = 0x00,
154 Alert = 0x20,
155 Critical = 0x40,
156 Err = 0x60,
157 Warning = 0x80,
158 Notice = 0xA0,
159 Informative = 0xC0,
160 Debug = 0xE0
161 };
162
163 } // namespace Descriptions;
164
165
173 inline PDefH(bool, IsPrint, char c)
174 ImplRet(ystdex::isprint(c))
175 inline PDefH(bool, IsPrint, wchar_t c)
176 ImplRet(ystdex::iswprint(c))
177 template<typename _tChar>
178 bool
179 IsPrint(_tChar c)
180 {
181 return platform::IsPrint(wchar_t(c));
182 }
184
185
187
188 inline PDefH(ystdex::uchar_t*, ucast, wchar_t* p) ynothrow
189 ImplRet(ystdex::replace_cast<ystdex::uchar_t*>(p))
190 inline PDefH(const ystdex::uchar_t*, ucast, const wchar_t* p) ynothrow
191 ImplRet(ystdex::replace_cast<const ystdex::uchar_t*>(p))
192 template<typename _tChar>
193 _tChar*
194 ucast(_tChar* p) ynothrow
195 {
196 return p;
197 }
198
199 inline PDefH(wchar_t*, wcast, ystdex::uchar_t* p) ynothrow
200 ImplRet(ystdex::replace_cast<wchar_t*>(p))
201 inline PDefH(const wchar_t*, wcast, const ystdex::uchar_t* p) ynothrow
202 ImplRet(ystdex::replace_cast<const wchar_t*>(p))
203 template<typename _tChar>
204 _tChar*
205 wcast(_tChar* p) ynothrow
206 {
207 return p;
208 }
210
211
216 template<typename _func, typename _tErrorRef,
217 typename _tError = ystdex::decay_t<_tErrorRef>,
218 typename _type = ystdex::result_of_t<_func&()>>
219 _type
220 RetryOnError(_func f, _tErrorRef&& err, _tError e = _tError())
221 {
222 return ystdex::retry_on_cond([&](_type res){
223 return res < _type() && _tError(err) == e;
224 }, f);
225 }
226
227
233 YF_API int
234 usystem(const char*);
235
236 } // namespace platform;
237
242 namespace platform_ex
243 {
244
245 #if YCL_DS
246
253 YF_API bool
254 AllowSleep(bool);
255 #endif
256
257 } // namespace platform_ex;
258
259 #endif
260
platform::p
while p p
Definition: YCLib/FileSystem.h:225
YB_NORETURN
#define YB_NORETURN
指定无返回值函数。
Definition: ydef.h:478
cstring.h
ISO C 标准字符串扩展。
platform::Descriptions::Warning
Definition: YCommon.h:157
platform::IDTagSet
取平台标识的整数标记集合类型。
Definition: YCommon.h:101
platform::Descriptions::Informative
Definition: YCommon.h:159
cassert.h
ISO C 断言/调试跟踪扩展。
platform::HostedIDTagBase
宿主平台标识的公共标记类型：指定任意宿主平台。
Definition: YCommon.h:66
CHRLib::e
const char const char * e
Definition: CharacterProcessing.h:109
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
YCL_IDTag_SpecOnBase
#define YCL_IDTag_SpecOnBase(_n, _b)
指定基于特定平台的 IDTag 特化。
Definition: YCommon.h:86
CHRLib::c
c
Definition: CharacterProcessing.h:81
platform::Descriptions::Emergent
Definition: YCommon.h:153
ystdex::iswprint
bool iswprint(wchar_t)
区域无关的 std::isprint 实现。
Definition: cwctype.cpp:34
platform::usystem
YF_API int usystem(const char *)
执行 UTF-8 字符串的环境命令。
Definition: YCommon.cpp:53
ystdex::isprint
bool isprint(char c)
区域无关的 std::isprint 实现。
Definition: cctype.h:108
functional.hpp
函数和可调用对象。
platform
默认平台命名空间。
Definition: Container.h:47
platform::ynothrow
const _tString &path ynothrow
Definition: YCLib/FileSystem.h:303
platform::IDTagBase
平台标识的公共标记类型：指定任意平台。
Definition: YCommon.h:57
platform::IDTag
平台标识的整数标记类型。
Definition: YCommon.h:71
platform_ex
平台扩展命名空间。
Definition: Android.h:45
ystdex
特性测试宏。
Definition: ydef.h:796
platform::Descriptions::Critical
Definition: YCommon.h:155
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
cwctype.h
ISO C 宽字符分类操作扩展。
YModules.h
platform::ID
std::uintmax_t ID
YF_Platform_* 宏替换值的公共类型。
Definition: YCommon.h:50
platform::ImplRet
const string &s ImplRet(s) YF_API string MakePathString(const char16_t *)
platform::Descriptions::Debug
Definition: YCommon.h:160
platform::MetaID
ystdex::integral_constant< ID, _vN > MetaID
YF_Platform_* 宏替换值的对应的元类型。
Definition: YCommon.h:54
platform::terminate
YB_NORETURN YF_API void terminate() ynothrow
异常终止函数。
Definition: YCommon.cpp:42
platform::Descriptions::RecordLevel
RecordLevel
记录等级。
Definition: YCommon.h:151
YF_API
#define YF_API
Definition: Platform.h:56
platform::Descriptions::Err
Definition: YCommon.h:156
YSLib::IO::f
const string &path const String &path _func f
Definition: YSLib/Service/FileSystem.h:430
ystdex::retry_on_cond
result_of_t< _fCallable &&(_tParams &&...)> retry_on_cond(_fCond cond, _fCallable &&f, _tParams &&...args)
循环重复调用：代替直接使用 do-while 语句以避免过多引入作用域外的变量。
Definition: functional.hpp:1019
platform::Descriptions::Notice
Definition: YCommon.h:158
platform::PDefH
PDefH(string, MakePathString, const char *s) ImplRet(Nonnull(s)) inline PDefH(const string &
构造适合表示路径的字符串。
platform::Descriptions::Alert
Definition: YCommon.h:154
YCL_IDTag_SpecHost
#define YCL_IDTag_SpecHost(_n)
指定宿主平台的 IDTag 特化。
Definition: YCommon.h:82