typetraits_test.cpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. /*
  2. * Copyright 2010-2022 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx/blob/master/LICENSE
  4. */
  5. #include "test.h"
  6. #include <bx/typetraits.h>
  7. struct TestClass { };
  8. struct TestClassFinal final { };
  9. struct TestClassMember { int32_t x; };
  10. struct TestClassMemberPrivate { int32_t x; private: int32_t y; };
  11. struct TestClassStaticOnly { static int32_t x; };
  12. struct TestClassCtor { TestClassCtor (const TestClassCtor&) {} };
  13. struct TestClassDefaultCtor { TestClassDefaultCtor (const TestClassDefaultCtor&) = default; };
  14. struct TestClassDefaultDtor { ~TestClassDefaultDtor () = default; };
  15. struct TestClassVirtualDtor { virtual ~TestClassVirtualDtor () = default; };
  16. struct TestClassAbstractBase { virtual ~TestClassAbstractBase() = 0; };
  17. struct TestClassPolymorphic { virtual int32_t x() { return 1389; } };
  18. struct TestClassDerivedA /* */
  19. : TestClass { };
  20. struct TestClassDerivedB /* */
  21. : TestClassDerivedA { };
  22. struct TestClassDerivedX /* */
  23. : TestClassVirtualDtor { };
  24. union TestUnionEmpty { };
  25. union TestUnion { int32_t x; float y; };
  26. enum TestEnumEmpty { };
  27. enum TestEnum { Enum };
  28. TEST_CASE("type-traits isReference", "")
  29. {
  30. STATIC_REQUIRE(!bx::isReference<TestClass >() );
  31. STATIC_REQUIRE( bx::isReference<TestClass& >() );
  32. STATIC_REQUIRE( bx::isReference<TestClass&& >() );
  33. STATIC_REQUIRE(!bx::isReference<long >() );
  34. STATIC_REQUIRE( bx::isReference<long& >() );
  35. STATIC_REQUIRE( bx::isReference<long&& >() );
  36. STATIC_REQUIRE(!bx::isReference<double* >() );
  37. STATIC_REQUIRE( bx::isReference<double*& >() );
  38. STATIC_REQUIRE( bx::isReference<double*&& >() );;
  39. }
  40. TEST_CASE("type-traits isLvalueReference", "")
  41. {
  42. STATIC_REQUIRE(!bx::isLvalueReference<TestClass >() );
  43. STATIC_REQUIRE( bx::isLvalueReference<TestClass& >() );
  44. STATIC_REQUIRE(!bx::isLvalueReference<TestClass&& >() );
  45. STATIC_REQUIRE(!bx::isLvalueReference<long >() );
  46. STATIC_REQUIRE( bx::isLvalueReference<long& >() );
  47. STATIC_REQUIRE(!bx::isLvalueReference<long&& >() );
  48. STATIC_REQUIRE(!bx::isLvalueReference<double* >() );
  49. STATIC_REQUIRE( bx::isLvalueReference<double*& >() );
  50. STATIC_REQUIRE(!bx::isLvalueReference<double*&& >() );;
  51. }
  52. TEST_CASE("type-traits isRvalueReference", "")
  53. {
  54. STATIC_REQUIRE(!bx::isRvalueReference<TestClass >() );
  55. STATIC_REQUIRE(!bx::isRvalueReference<TestClass& >() );
  56. STATIC_REQUIRE( bx::isRvalueReference<TestClass&& >() );
  57. STATIC_REQUIRE(!bx::isRvalueReference<long >() );
  58. STATIC_REQUIRE(!bx::isRvalueReference<long& >() );
  59. STATIC_REQUIRE( bx::isRvalueReference<long&& >() );
  60. STATIC_REQUIRE(!bx::isRvalueReference<double* >() );
  61. STATIC_REQUIRE(!bx::isRvalueReference<double*& >() );
  62. STATIC_REQUIRE( bx::isRvalueReference<double*&& >() );;
  63. }
  64. TEST_CASE("type-traits isPointer", "")
  65. {
  66. STATIC_REQUIRE(!bx::isPointer<TestClass >() );
  67. STATIC_REQUIRE(!bx::isPointer<TestClass& >() );
  68. STATIC_REQUIRE( bx::isPointer<TestClass* >() );
  69. STATIC_REQUIRE( bx::isPointer<TestClass const * volatile >() );
  70. STATIC_REQUIRE(!bx::isPointer<int32_t >() );
  71. STATIC_REQUIRE( bx::isPointer<int32_t* >() );
  72. STATIC_REQUIRE(!bx::isPointer<int32_t[1389] >() );
  73. }
  74. TEST_CASE("type-traits AddLvalueReferenceT", "")
  75. {
  76. STATIC_REQUIRE( bx::isSame<bx::AddLvalueReferenceType<TestClass >, TestClass& >() );
  77. STATIC_REQUIRE( bx::isSame<bx::AddLvalueReferenceType<TestClass& >, TestClass& >() );
  78. STATIC_REQUIRE( bx::isSame<bx::AddLvalueReferenceType<TestClass&&>, TestClass& >() );
  79. STATIC_REQUIRE( bx::isLvalueReference<bx::AddLvalueReferenceType<TestClass> >() );
  80. STATIC_REQUIRE( bx::isLvalueReference<bx::AddLvalueReferenceType<TestClass&> >() );
  81. STATIC_REQUIRE( bx::isLvalueReference<bx::AddLvalueReferenceType<TestClass&&> >() );
  82. }
  83. TEST_CASE("type-traits AddRvalueReferenceT", "")
  84. {
  85. STATIC_REQUIRE( bx::isSame<bx::AddRvalueReferenceType<TestClass >, TestClass&& >() );
  86. STATIC_REQUIRE( bx::isSame<bx::AddRvalueReferenceType<TestClass& >, TestClass& >() );
  87. STATIC_REQUIRE( bx::isSame<bx::AddRvalueReferenceType<TestClass&&>, TestClass&& >() );
  88. STATIC_REQUIRE( bx::isRvalueReference<bx::AddRvalueReferenceType<TestClass> >() );
  89. STATIC_REQUIRE(!bx::isRvalueReference<bx::AddRvalueReferenceType<TestClass&> >() );
  90. STATIC_REQUIRE( bx::isRvalueReference<bx::AddRvalueReferenceType<TestClass&&> >() );
  91. }
  92. TEST_CASE("type-traits RemoveReferenceT", "")
  93. {
  94. STATIC_REQUIRE( bx::isSame<bx::RemoveReferenceType<TestClass >, TestClass >() );
  95. STATIC_REQUIRE( bx::isSame<bx::RemoveReferenceType<TestClass& >, TestClass >() );
  96. STATIC_REQUIRE( bx::isSame<bx::RemoveReferenceType<TestClass&&>, TestClass >() );
  97. STATIC_REQUIRE(!bx::isReference<bx::RemoveReferenceType<TestClass> >() );
  98. STATIC_REQUIRE(!bx::isReference<bx::RemoveReferenceType<TestClass&> >() );
  99. STATIC_REQUIRE(!bx::isReference<bx::RemoveReferenceType<TestClass&&> >() );
  100. }
  101. TEST_CASE("type-traits AddPointerT", "")
  102. {
  103. STATIC_REQUIRE( bx::isSame<bx::AddPointerType<TestClass >, TestClass* >() );
  104. STATIC_REQUIRE( bx::isSame<bx::AddPointerType<TestClass* >, TestClass** >() );
  105. STATIC_REQUIRE( bx::isSame<bx::AddPointerType<TestClass& >, TestClass* >() );
  106. STATIC_REQUIRE( bx::isSame<bx::AddPointerType<TestClass**>, TestClass*** >() );
  107. STATIC_REQUIRE( bx::isPointer<bx::AddPointerType<TestClass> >() );
  108. STATIC_REQUIRE( bx::isPointer<bx::AddPointerType<TestClass*> >() );
  109. STATIC_REQUIRE( bx::isPointer<bx::AddPointerType<TestClass&> >() );
  110. STATIC_REQUIRE( bx::isPointer<bx::AddPointerType<TestClass**> >() );
  111. }
  112. TEST_CASE("type-traits RemovePointerT", "")
  113. {
  114. STATIC_REQUIRE( bx::isSame<bx::RemovePointerType<TestClass >, TestClass >() );
  115. STATIC_REQUIRE( bx::isSame<bx::RemovePointerType<TestClass* >, TestClass >() );
  116. STATIC_REQUIRE( bx::isSame<bx::RemovePointerType<TestClass**>, TestClass* >() );
  117. STATIC_REQUIRE( bx::isSame<bx::RemovePointerType<bx::RemovePointerType<TestClass**>>, TestClass >() );
  118. STATIC_REQUIRE(!bx::isPointer<bx::RemovePointerType<TestClass> >() );
  119. STATIC_REQUIRE(!bx::isPointer<bx::RemovePointerType<TestClass*> >() );
  120. STATIC_REQUIRE( bx::isPointer<bx::RemovePointerType<TestClass**> >() );
  121. STATIC_REQUIRE(!bx::isPointer<bx::RemovePointerType<bx::RemovePointerType<TestClass**>> >() );
  122. }
  123. TEST_CASE("type-traits AddConstT", "")
  124. {
  125. STATIC_REQUIRE( bx::isSame<bx::AddConstType< TestClass >, const TestClass >() );
  126. STATIC_REQUIRE( bx::isSame<bx::AddConstType<const TestClass >, const TestClass >() );
  127. STATIC_REQUIRE( bx::isSame<bx::AddConstType< volatile TestClass >, const volatile TestClass >() );
  128. STATIC_REQUIRE( bx::isSame<bx::AddConstType<const volatile TestClass >, const volatile TestClass >() );
  129. STATIC_REQUIRE( bx::isSame<bx::AddConstType<const volatile TestClass*>, const volatile TestClass* const >() );
  130. STATIC_REQUIRE( bx::isSame<bx::AddConstType<TestClass* const volatile>, TestClass* const volatile >() );
  131. }
  132. TEST_CASE("type-traits RemoveConstT", "")
  133. {
  134. STATIC_REQUIRE( bx::isSame<bx::RemoveConstType< TestClass >, TestClass >() );
  135. STATIC_REQUIRE( bx::isSame<bx::RemoveConstType<const TestClass >, TestClass >() );
  136. STATIC_REQUIRE( bx::isSame<bx::RemoveConstType< volatile TestClass >, volatile TestClass >() );
  137. STATIC_REQUIRE( bx::isSame<bx::RemoveConstType<const volatile TestClass >, volatile TestClass >() );
  138. STATIC_REQUIRE(!bx::isSame<bx::RemoveConstType<const volatile TestClass*>, volatile TestClass*>() );
  139. STATIC_REQUIRE( bx::isSame<bx::RemoveConstType<TestClass* const volatile>, TestClass* volatile>() );
  140. }
  141. TEST_CASE("type-traits AddVolatileT", "")
  142. {
  143. STATIC_REQUIRE( bx::isSame<bx::AddVolatileType< TestClass >, volatile TestClass >() );
  144. STATIC_REQUIRE( bx::isSame<bx::AddVolatileType<const TestClass >, const volatile TestClass >() );
  145. STATIC_REQUIRE( bx::isSame<bx::AddVolatileType< volatile TestClass >, volatile TestClass >() );
  146. STATIC_REQUIRE( bx::isSame<bx::AddVolatileType<const volatile TestClass >, const volatile TestClass >() );
  147. STATIC_REQUIRE( bx::isSame<bx::AddVolatileType<const volatile TestClass*>, const volatile TestClass* volatile >() );
  148. STATIC_REQUIRE( bx::isSame<bx::AddVolatileType<TestClass* const volatile>, TestClass* const volatile >() );
  149. }
  150. TEST_CASE("type-traits RemoveVolatileT", "")
  151. {
  152. STATIC_REQUIRE( bx::isSame<bx::RemoveVolatileType< TestClass >, TestClass >() );
  153. STATIC_REQUIRE( bx::isSame<bx::RemoveVolatileType<const TestClass >, const TestClass >() );
  154. STATIC_REQUIRE( bx::isSame<bx::RemoveVolatileType< volatile TestClass >, TestClass >() );
  155. STATIC_REQUIRE( bx::isSame<bx::RemoveVolatileType<const volatile TestClass >, const TestClass >() );
  156. STATIC_REQUIRE(!bx::isSame<bx::RemoveVolatileType<const volatile TestClass*>, const TestClass* >() );
  157. STATIC_REQUIRE( bx::isSame<bx::RemoveVolatileType<TestClass* const volatile>, TestClass* const >() );
  158. }
  159. TEST_CASE("type-traits AddCvT", "")
  160. {
  161. STATIC_REQUIRE( bx::isSame<bx::AddCvType< TestClass >, const volatile TestClass >() );
  162. STATIC_REQUIRE( bx::isSame<bx::AddCvType<const TestClass >, const volatile TestClass >() );
  163. STATIC_REQUIRE( bx::isSame<bx::AddCvType< volatile TestClass >, const volatile TestClass >() );
  164. STATIC_REQUIRE( bx::isSame<bx::AddCvType<const volatile TestClass >, const volatile TestClass >() );
  165. STATIC_REQUIRE( bx::isSame<bx::AddCvType<const volatile TestClass*>, const volatile TestClass* const volatile >() );
  166. STATIC_REQUIRE( bx::isSame<bx::AddCvType<TestClass* const volatile>, TestClass* const volatile >() );
  167. }
  168. TEST_CASE("type-traits RemoveCvT", "")
  169. {
  170. STATIC_REQUIRE( bx::isSame<bx::RemoveCvType< TestClass >, TestClass >() );
  171. STATIC_REQUIRE( bx::isSame<bx::RemoveCvType<const TestClass >, TestClass >() );
  172. STATIC_REQUIRE( bx::isSame<bx::RemoveCvType< volatile TestClass >, TestClass >() );
  173. STATIC_REQUIRE( bx::isSame<bx::RemoveCvType<const volatile TestClass >, TestClass >() );
  174. STATIC_REQUIRE(!bx::isSame<bx::RemoveCvType<const volatile TestClass*>, TestClass* >() );
  175. STATIC_REQUIRE( bx::isSame<bx::RemoveCvType<TestClass* const volatile>, TestClass* >() );
  176. }
  177. TEST_CASE("type-traits isTriviallyCopyable", "")
  178. {
  179. STATIC_REQUIRE( bx::isTriviallyCopyable<int32_t >() );
  180. STATIC_REQUIRE( bx::isTriviallyCopyable<TestClass >() );
  181. STATIC_REQUIRE(!bx::isTriviallyCopyable<TestClassCtor >() );
  182. STATIC_REQUIRE( bx::isTriviallyCopyable<TestClassDefaultCtor >() );
  183. STATIC_REQUIRE( bx::isTriviallyCopyable<TestClassDefaultDtor >() );
  184. STATIC_REQUIRE(!bx::isTriviallyCopyable<TestClassVirtualDtor >() );
  185. }
  186. TEST_CASE("type-traits isTriviallyConstructible", "")
  187. {
  188. STATIC_REQUIRE( bx::isTriviallyConstructible<int32_t >() );
  189. STATIC_REQUIRE( bx::isTriviallyConstructible<TestClass >() );
  190. STATIC_REQUIRE(!bx::isTriviallyConstructible<TestClassCtor >() );
  191. STATIC_REQUIRE(!bx::isTriviallyConstructible<TestClassDefaultCtor >() );
  192. STATIC_REQUIRE( bx::isTriviallyConstructible<TestClassDefaultDtor >() );
  193. STATIC_REQUIRE(!bx::isTriviallyConstructible<TestClassVirtualDtor >() );
  194. }
  195. TEST_CASE("type-traits isTriviallyDestructible", "")
  196. {
  197. STATIC_REQUIRE( bx::isTriviallyDestructible<int32_t >() );
  198. STATIC_REQUIRE( bx::isTriviallyDestructible<TestClass >() );
  199. STATIC_REQUIRE( bx::isTriviallyDestructible<TestClassCtor >() );
  200. STATIC_REQUIRE( bx::isTriviallyDestructible<TestClassDefaultCtor >() );
  201. STATIC_REQUIRE( bx::isTriviallyDestructible<TestClassDefaultDtor >() );
  202. STATIC_REQUIRE(!bx::isTriviallyDestructible<TestClassVirtualDtor >() );
  203. }
  204. TEST_CASE("type-traits isSigned", "")
  205. {
  206. STATIC_REQUIRE(!bx::isSigned<bool >() );
  207. STATIC_REQUIRE( bx::isSigned<char >() );
  208. STATIC_REQUIRE( bx::isSigned<signed char >() );
  209. STATIC_REQUIRE(!bx::isSigned<unsigned char >() );
  210. STATIC_REQUIRE( bx::isSigned<short >() );
  211. STATIC_REQUIRE(!bx::isSigned<unsigned short >() );
  212. STATIC_REQUIRE( bx::isSigned<int >() );
  213. STATIC_REQUIRE(!bx::isSigned<unsigned int >() );
  214. STATIC_REQUIRE( bx::isSigned<long >() );
  215. STATIC_REQUIRE(!bx::isSigned<unsigned long >() );
  216. STATIC_REQUIRE( bx::isSigned<long long >() );
  217. STATIC_REQUIRE(!bx::isSigned<unsigned long long >() );
  218. STATIC_REQUIRE( bx::isSigned<long long int >() );
  219. STATIC_REQUIRE(!bx::isSigned<unsigned long long int >() );
  220. STATIC_REQUIRE( bx::isSigned<int8_t >() );
  221. STATIC_REQUIRE(!bx::isSigned<uint8_t >() );
  222. STATIC_REQUIRE( bx::isSigned<int16_t >() );
  223. STATIC_REQUIRE(!bx::isSigned<uint16_t >() );
  224. STATIC_REQUIRE( bx::isSigned<int32_t >() );
  225. STATIC_REQUIRE(!bx::isSigned<uint32_t >() );
  226. STATIC_REQUIRE( bx::isSigned<int64_t >() );
  227. STATIC_REQUIRE(!bx::isSigned<uint64_t >() );
  228. STATIC_REQUIRE( bx::isSigned<intmax_t >() );
  229. STATIC_REQUIRE(!bx::isSigned<uintmax_t >() );
  230. STATIC_REQUIRE(!bx::isSigned<uintptr_t >() );
  231. STATIC_REQUIRE( bx::isSigned<ptrdiff_t >() );
  232. STATIC_REQUIRE(!bx::isSigned<size_t >() );
  233. STATIC_REQUIRE( bx::isSigned<float >() );
  234. STATIC_REQUIRE( bx::isSigned<double >() );
  235. STATIC_REQUIRE( bx::isSigned<long double >() );
  236. }
  237. TEST_CASE("type-traits isUnsigned", "")
  238. {
  239. STATIC_REQUIRE( bx::isUnsigned<bool >() );
  240. STATIC_REQUIRE(!bx::isUnsigned<char >() );
  241. STATIC_REQUIRE(!bx::isUnsigned<signed char >() );
  242. STATIC_REQUIRE( bx::isUnsigned<unsigned char >() );
  243. STATIC_REQUIRE(!bx::isUnsigned<short >() );
  244. STATIC_REQUIRE( bx::isUnsigned<unsigned short >() );
  245. STATIC_REQUIRE(!bx::isUnsigned<int >() );
  246. STATIC_REQUIRE( bx::isUnsigned<unsigned int >() );
  247. STATIC_REQUIRE(!bx::isUnsigned<long >() );
  248. STATIC_REQUIRE( bx::isUnsigned<unsigned long >() );
  249. STATIC_REQUIRE(!bx::isUnsigned<long long >() );
  250. STATIC_REQUIRE( bx::isUnsigned<unsigned long long >() );
  251. STATIC_REQUIRE(!bx::isUnsigned<long long int >() );
  252. STATIC_REQUIRE( bx::isUnsigned<unsigned long long int >() );
  253. STATIC_REQUIRE(!bx::isUnsigned<int8_t >() );
  254. STATIC_REQUIRE( bx::isUnsigned<uint8_t >() );
  255. STATIC_REQUIRE(!bx::isUnsigned<int16_t >() );
  256. STATIC_REQUIRE( bx::isUnsigned<uint16_t >() );
  257. STATIC_REQUIRE(!bx::isUnsigned<int32_t >() );
  258. STATIC_REQUIRE( bx::isUnsigned<uint32_t >() );
  259. STATIC_REQUIRE(!bx::isUnsigned<int64_t >() );
  260. STATIC_REQUIRE( bx::isUnsigned<uint64_t >() );
  261. STATIC_REQUIRE(!bx::isUnsigned<intmax_t >() );
  262. STATIC_REQUIRE( bx::isUnsigned<uintmax_t >() );
  263. STATIC_REQUIRE( bx::isUnsigned<uintptr_t >() );
  264. STATIC_REQUIRE(!bx::isUnsigned<ptrdiff_t >() );
  265. STATIC_REQUIRE( bx::isUnsigned<size_t >() );
  266. STATIC_REQUIRE(!bx::isUnsigned<float >() );
  267. STATIC_REQUIRE(!bx::isUnsigned<double >() );
  268. STATIC_REQUIRE(!bx::isUnsigned<long double >() );
  269. }
  270. TEST_CASE("type-traits isInteger", "")
  271. {
  272. STATIC_REQUIRE( bx::isInteger<bool >() );
  273. STATIC_REQUIRE( bx::isInteger<char >() );
  274. STATIC_REQUIRE( bx::isInteger<signed char >() );
  275. STATIC_REQUIRE( bx::isInteger<unsigned char >() );
  276. STATIC_REQUIRE( bx::isInteger<short >() );
  277. STATIC_REQUIRE( bx::isInteger<unsigned short >() );
  278. STATIC_REQUIRE( bx::isInteger<int >() );
  279. STATIC_REQUIRE( bx::isInteger<unsigned int >() );
  280. STATIC_REQUIRE( bx::isInteger<long >() );
  281. STATIC_REQUIRE( bx::isInteger<unsigned long >() );
  282. STATIC_REQUIRE( bx::isInteger<long long >() );
  283. STATIC_REQUIRE( bx::isInteger<unsigned long long >() );
  284. STATIC_REQUIRE( bx::isInteger<long long int >() );
  285. STATIC_REQUIRE( bx::isInteger<unsigned long long int >() );
  286. STATIC_REQUIRE( bx::isInteger<int8_t >() );
  287. STATIC_REQUIRE( bx::isInteger<uint8_t >() );
  288. STATIC_REQUIRE( bx::isInteger<int16_t >() );
  289. STATIC_REQUIRE( bx::isInteger<uint16_t >() );
  290. STATIC_REQUIRE( bx::isInteger<int32_t >() );
  291. STATIC_REQUIRE( bx::isInteger<uint32_t >() );
  292. STATIC_REQUIRE( bx::isInteger<int64_t >() );
  293. STATIC_REQUIRE( bx::isInteger<uint64_t >() );
  294. STATIC_REQUIRE( bx::isInteger<intmax_t >() );
  295. STATIC_REQUIRE( bx::isInteger<uintmax_t >() );
  296. STATIC_REQUIRE( bx::isInteger<uintptr_t >() );
  297. STATIC_REQUIRE( bx::isInteger<ptrdiff_t >() );
  298. STATIC_REQUIRE( bx::isInteger<size_t >() );
  299. STATIC_REQUIRE(!bx::isInteger<float >() );
  300. STATIC_REQUIRE(!bx::isInteger<double >() );
  301. STATIC_REQUIRE(!bx::isInteger<long double >() );
  302. STATIC_REQUIRE(!bx::isInteger<TestClass >() );
  303. STATIC_REQUIRE(!bx::isInteger<TestClassCtor >() );
  304. STATIC_REQUIRE(!bx::isInteger<TestClassDefaultCtor >() );
  305. STATIC_REQUIRE(!bx::isInteger<TestClassDefaultDtor >() );
  306. STATIC_REQUIRE(!bx::isInteger<TestClassVirtualDtor >() );
  307. }
  308. TEST_CASE("type-traits isFloatingPoint", "")
  309. {
  310. STATIC_REQUIRE(!bx::isFloatingPoint<bool >() );
  311. STATIC_REQUIRE(!bx::isFloatingPoint<char >() );
  312. STATIC_REQUIRE(!bx::isFloatingPoint<signed char >() );
  313. STATIC_REQUIRE(!bx::isFloatingPoint<unsigned char >() );
  314. STATIC_REQUIRE(!bx::isFloatingPoint<short >() );
  315. STATIC_REQUIRE(!bx::isFloatingPoint<unsigned short >() );
  316. STATIC_REQUIRE(!bx::isFloatingPoint<int >() );
  317. STATIC_REQUIRE(!bx::isFloatingPoint<unsigned int >() );
  318. STATIC_REQUIRE(!bx::isFloatingPoint<long >() );
  319. STATIC_REQUIRE(!bx::isFloatingPoint<unsigned long >() );
  320. STATIC_REQUIRE(!bx::isFloatingPoint<long long >() );
  321. STATIC_REQUIRE(!bx::isFloatingPoint<unsigned long long >() );
  322. STATIC_REQUIRE(!bx::isFloatingPoint<long long int >() );
  323. STATIC_REQUIRE(!bx::isFloatingPoint<unsigned long long int >() );
  324. STATIC_REQUIRE(!bx::isFloatingPoint<int8_t >() );
  325. STATIC_REQUIRE(!bx::isFloatingPoint<uint8_t >() );
  326. STATIC_REQUIRE(!bx::isFloatingPoint<int16_t >() );
  327. STATIC_REQUIRE(!bx::isFloatingPoint<uint16_t >() );
  328. STATIC_REQUIRE(!bx::isFloatingPoint<int32_t >() );
  329. STATIC_REQUIRE(!bx::isFloatingPoint<uint32_t >() );
  330. STATIC_REQUIRE(!bx::isFloatingPoint<int64_t >() );
  331. STATIC_REQUIRE(!bx::isFloatingPoint<uint64_t >() );
  332. STATIC_REQUIRE(!bx::isFloatingPoint<intmax_t >() );
  333. STATIC_REQUIRE(!bx::isFloatingPoint<uintmax_t >() );
  334. STATIC_REQUIRE(!bx::isFloatingPoint<uintptr_t >() );
  335. STATIC_REQUIRE(!bx::isFloatingPoint<ptrdiff_t >() );
  336. STATIC_REQUIRE(!bx::isFloatingPoint<size_t >() );
  337. STATIC_REQUIRE( bx::isFloatingPoint<float >() );
  338. STATIC_REQUIRE( bx::isFloatingPoint<double >() );
  339. STATIC_REQUIRE( bx::isFloatingPoint<long double >() );
  340. STATIC_REQUIRE(!bx::isFloatingPoint<TestClass >() );
  341. STATIC_REQUIRE(!bx::isFloatingPoint<TestClassCtor >() );
  342. STATIC_REQUIRE(!bx::isFloatingPoint<TestClassDefaultCtor >() );
  343. STATIC_REQUIRE(!bx::isFloatingPoint<TestClassDefaultDtor >() );
  344. STATIC_REQUIRE(!bx::isFloatingPoint<TestClassVirtualDtor >() );
  345. }
  346. TEST_CASE("type-traits isArithmetic", "")
  347. {
  348. STATIC_REQUIRE( bx::isArithmetic<bool >() );
  349. STATIC_REQUIRE( bx::isArithmetic<char >() );
  350. STATIC_REQUIRE( bx::isArithmetic<signed char >() );
  351. STATIC_REQUIRE( bx::isArithmetic<unsigned char >() );
  352. STATIC_REQUIRE( bx::isArithmetic<short >() );
  353. STATIC_REQUIRE( bx::isArithmetic<unsigned short >() );
  354. STATIC_REQUIRE( bx::isArithmetic<int >() );
  355. STATIC_REQUIRE( bx::isArithmetic<unsigned int >() );
  356. STATIC_REQUIRE( bx::isArithmetic<long >() );
  357. STATIC_REQUIRE( bx::isArithmetic<unsigned long >() );
  358. STATIC_REQUIRE( bx::isArithmetic<long long >() );
  359. STATIC_REQUIRE( bx::isArithmetic<unsigned long long >() );
  360. STATIC_REQUIRE( bx::isArithmetic<long long int >() );
  361. STATIC_REQUIRE( bx::isArithmetic<unsigned long long int >() );
  362. STATIC_REQUIRE( bx::isArithmetic<int8_t >() );
  363. STATIC_REQUIRE( bx::isArithmetic<uint8_t >() );
  364. STATIC_REQUIRE( bx::isArithmetic<int16_t >() );
  365. STATIC_REQUIRE( bx::isArithmetic<uint16_t >() );
  366. STATIC_REQUIRE( bx::isArithmetic<int32_t >() );
  367. STATIC_REQUIRE( bx::isArithmetic<uint32_t >() );
  368. STATIC_REQUIRE( bx::isArithmetic<int64_t >() );
  369. STATIC_REQUIRE( bx::isArithmetic<uint64_t >() );
  370. STATIC_REQUIRE( bx::isArithmetic<intmax_t >() );
  371. STATIC_REQUIRE( bx::isArithmetic<uintmax_t >() );
  372. STATIC_REQUIRE( bx::isArithmetic<uintptr_t >() );
  373. STATIC_REQUIRE( bx::isArithmetic<ptrdiff_t >() );
  374. STATIC_REQUIRE( bx::isArithmetic<size_t >() );
  375. STATIC_REQUIRE( bx::isArithmetic<float >() );
  376. STATIC_REQUIRE( bx::isArithmetic<double >() );
  377. STATIC_REQUIRE( bx::isArithmetic<long double >() );
  378. STATIC_REQUIRE(!bx::isArithmetic<TestClass >() );
  379. STATIC_REQUIRE(!bx::isArithmetic<TestClassCtor >() );
  380. STATIC_REQUIRE(!bx::isArithmetic<TestClassDefaultCtor >() );
  381. STATIC_REQUIRE(!bx::isArithmetic<TestClassDefaultDtor >() );
  382. STATIC_REQUIRE(!bx::isArithmetic<TestClassVirtualDtor >() );
  383. }
  384. TEST_CASE("type-traits isBoundedArray", "")
  385. {
  386. STATIC_REQUIRE(!bx::isBoundedArray<TestClass >() );
  387. STATIC_REQUIRE(!bx::isBoundedArray<TestClass[] >() );
  388. STATIC_REQUIRE( bx::isBoundedArray<TestClass[1389] >() );
  389. STATIC_REQUIRE(!bx::isBoundedArray<float >() );
  390. STATIC_REQUIRE(!bx::isBoundedArray<int >() );
  391. STATIC_REQUIRE(!bx::isBoundedArray<int[] >() );
  392. STATIC_REQUIRE( bx::isBoundedArray<int[1389] >() );
  393. }
  394. TEST_CASE("type-traits isUnboundedArray", "")
  395. {
  396. STATIC_REQUIRE(!bx::isUnboundedArray<TestClass >() );
  397. STATIC_REQUIRE( bx::isUnboundedArray<TestClass[] >() );
  398. STATIC_REQUIRE(!bx::isUnboundedArray<TestClass[1389] >() );
  399. STATIC_REQUIRE(!bx::isUnboundedArray<float >() );
  400. STATIC_REQUIRE(!bx::isUnboundedArray<int32_t >() );
  401. STATIC_REQUIRE( bx::isUnboundedArray<int32_t[] >() );
  402. STATIC_REQUIRE(!bx::isUnboundedArray<int32_t[1389] >() );
  403. }
  404. TEST_CASE("type-traits isArray", "")
  405. {
  406. STATIC_REQUIRE(!bx::isArray<TestClass >() );
  407. STATIC_REQUIRE( bx::isArray<TestClass[] >() );
  408. STATIC_REQUIRE( bx::isArray<TestClass[1389] >() );
  409. STATIC_REQUIRE(!bx::isArray<float >() );
  410. STATIC_REQUIRE(!bx::isArray<int32_t >() );
  411. STATIC_REQUIRE( bx::isArray<int32_t[] >() );
  412. STATIC_REQUIRE( bx::isArray<int32_t[1389] >() );
  413. STATIC_REQUIRE( bx::isArray<TestUnion[] >() );
  414. }
  415. TEST_CASE("type-traits isEnum", "")
  416. {
  417. STATIC_REQUIRE(!bx::isEnum<TestClass >() );
  418. STATIC_REQUIRE(!bx::isEnum<TestUnion >() );
  419. STATIC_REQUIRE(!bx::isEnum<TestUnionEmpty >() );
  420. STATIC_REQUIRE(!bx::isEnum<TestUnion[] >() );
  421. STATIC_REQUIRE(!bx::isEnum<int32_t[] >() );
  422. STATIC_REQUIRE( bx::isEnum<TestEnumEmpty >() );
  423. STATIC_REQUIRE( bx::isEnum<TestEnum >() );
  424. }
  425. TEST_CASE("type-traits isUnion", "")
  426. {
  427. STATIC_REQUIRE(!bx::isUnion<TestClass >() );
  428. STATIC_REQUIRE( bx::isUnion<TestUnion >() );
  429. STATIC_REQUIRE( bx::isUnion<TestUnionEmpty >() );
  430. STATIC_REQUIRE(!bx::isUnion<TestUnion[] >() );
  431. STATIC_REQUIRE(!bx::isUnion<int32_t[] >() );
  432. STATIC_REQUIRE(!bx::isUnion<TestEnumEmpty >() );
  433. STATIC_REQUIRE(!bx::isUnion<TestEnum >() );
  434. }
  435. TEST_CASE("type-traits isClass", "")
  436. {
  437. STATIC_REQUIRE( bx::isClass<TestClass >() );
  438. STATIC_REQUIRE( bx::isClass<TestClassFinal >() );
  439. STATIC_REQUIRE( bx::isClass<TestClassCtor >() );
  440. STATIC_REQUIRE( bx::isClass<TestClassMember >() );
  441. STATIC_REQUIRE( bx::isClass<TestClassMemberPrivate >() );
  442. STATIC_REQUIRE( bx::isClass<TestClassStaticOnly >() );
  443. STATIC_REQUIRE( bx::isClass<TestClassDefaultCtor >() );
  444. STATIC_REQUIRE( bx::isClass<TestClassDefaultDtor >() );
  445. STATIC_REQUIRE( bx::isClass<TestClassVirtualDtor >() );
  446. STATIC_REQUIRE( bx::isClass<TestClassAbstractBase >() );
  447. STATIC_REQUIRE( bx::isClass<TestClassDerivedA >() );
  448. STATIC_REQUIRE( bx::isClass<TestClassDerivedB >() );
  449. STATIC_REQUIRE(!bx::isClass<TestUnion >() );
  450. STATIC_REQUIRE(!bx::isClass<TestUnion[] >() );
  451. STATIC_REQUIRE(!bx::isClass<int32_t[] >() );
  452. }
  453. TEST_CASE("type-traits isFinal", "")
  454. {
  455. STATIC_REQUIRE(!bx::isFinal<TestClass >() );
  456. STATIC_REQUIRE( bx::isFinal<TestClassFinal >() );
  457. STATIC_REQUIRE(!bx::isFinal<TestClassCtor >() );
  458. STATIC_REQUIRE(!bx::isFinal<TestClassMember >() );
  459. STATIC_REQUIRE(!bx::isFinal<TestClassMemberPrivate >() );
  460. STATIC_REQUIRE(!bx::isFinal<TestClassStaticOnly >() );
  461. STATIC_REQUIRE(!bx::isFinal<TestClassDefaultCtor >() );
  462. STATIC_REQUIRE(!bx::isFinal<TestClassDefaultDtor >() );
  463. STATIC_REQUIRE(!bx::isFinal<TestClassVirtualDtor >() );
  464. STATIC_REQUIRE(!bx::isFinal<TestClassAbstractBase >() );
  465. STATIC_REQUIRE(!bx::isFinal<TestClassPolymorphic >() );
  466. STATIC_REQUIRE(!bx::isFinal<TestClassDerivedA >() );
  467. STATIC_REQUIRE(!bx::isFinal<TestClassDerivedB >() );
  468. STATIC_REQUIRE(!bx::isFinal<TestUnion >() );
  469. STATIC_REQUIRE(!bx::isFinal<TestUnionEmpty >() );
  470. STATIC_REQUIRE(!bx::isFinal<TestUnion[] >() );
  471. STATIC_REQUIRE(!bx::isFinal<int32_t[] >() );
  472. }
  473. TEST_CASE("type-traits isEmpty", "")
  474. {
  475. STATIC_REQUIRE( bx::isEmpty<TestClass >() );
  476. STATIC_REQUIRE( bx::isEmpty<TestClassFinal >() );
  477. STATIC_REQUIRE( bx::isEmpty<TestClassCtor >() );
  478. STATIC_REQUIRE( bx::isEmpty<TestClassDefaultCtor >() );
  479. STATIC_REQUIRE( bx::isEmpty<TestClassDefaultDtor >() );
  480. STATIC_REQUIRE(!bx::isEmpty<TestClassVirtualDtor >() );
  481. STATIC_REQUIRE(!bx::isEmpty<TestClassAbstractBase >() );
  482. STATIC_REQUIRE(!bx::isEmpty<TestClassPolymorphic >() );
  483. STATIC_REQUIRE(!bx::isEmpty<TestUnion >() );
  484. STATIC_REQUIRE(!bx::isEmpty<TestUnionEmpty >() );
  485. STATIC_REQUIRE(!bx::isEmpty<TestUnion[] >() );
  486. STATIC_REQUIRE(!bx::isEmpty<int32_t[] >() );
  487. }
  488. TEST_CASE("type-traits isStandardLayout", "")
  489. {
  490. STATIC_REQUIRE( bx::isStandardLayout<TestClass >() );
  491. STATIC_REQUIRE( bx::isStandardLayout<TestClassFinal >() );
  492. STATIC_REQUIRE( bx::isStandardLayout<TestClassCtor >() );
  493. STATIC_REQUIRE( bx::isStandardLayout<TestClassMember >() );
  494. STATIC_REQUIRE(!bx::isStandardLayout<TestClassMemberPrivate >() );
  495. STATIC_REQUIRE( bx::isStandardLayout<TestClassStaticOnly >() );
  496. STATIC_REQUIRE( bx::isStandardLayout<TestClassDefaultCtor >() );
  497. STATIC_REQUIRE( bx::isStandardLayout<TestClassDefaultDtor >() );
  498. STATIC_REQUIRE(!bx::isStandardLayout<TestClassVirtualDtor >() );
  499. STATIC_REQUIRE(!bx::isStandardLayout<TestClassAbstractBase >() );
  500. STATIC_REQUIRE(!bx::isStandardLayout<TestClassPolymorphic >() );
  501. STATIC_REQUIRE( bx::isStandardLayout<TestClassDerivedA >() );
  502. STATIC_REQUIRE( bx::isStandardLayout<TestClassDerivedB >() );
  503. STATIC_REQUIRE( bx::isStandardLayout<TestUnion >() );
  504. STATIC_REQUIRE( bx::isStandardLayout<TestUnionEmpty >() );
  505. STATIC_REQUIRE( bx::isStandardLayout<TestUnion[] >() );
  506. STATIC_REQUIRE( bx::isStandardLayout<int32_t[] >() );
  507. }
  508. TEST_CASE("type-traits isTrivial", "")
  509. {
  510. STATIC_REQUIRE( bx::isTrivial<TestClass >() );
  511. STATIC_REQUIRE( bx::isTrivial<TestClassFinal >() );
  512. STATIC_REQUIRE(!bx::isTrivial<TestClassCtor >() );
  513. STATIC_REQUIRE( bx::isTrivial<TestClassMember >() );
  514. STATIC_REQUIRE( bx::isTrivial<TestClassMemberPrivate >() );
  515. STATIC_REQUIRE( bx::isTrivial<TestClassStaticOnly >() );
  516. STATIC_REQUIRE(!bx::isTrivial<TestClassDefaultCtor >() );
  517. STATIC_REQUIRE( bx::isTrivial<TestClassDefaultDtor >() );
  518. STATIC_REQUIRE(!bx::isTrivial<TestClassVirtualDtor >() );
  519. STATIC_REQUIRE(!bx::isTrivial<TestClassAbstractBase >() );
  520. STATIC_REQUIRE(!bx::isTrivial<TestClassPolymorphic >() );
  521. STATIC_REQUIRE( bx::isTrivial<TestClassDerivedA >() );
  522. STATIC_REQUIRE( bx::isTrivial<TestClassDerivedB >() );
  523. STATIC_REQUIRE( bx::isTrivial<TestUnion >() );
  524. STATIC_REQUIRE( bx::isTrivial<TestUnionEmpty >() );
  525. STATIC_REQUIRE( bx::isTrivial<TestUnion[] >() );
  526. STATIC_REQUIRE( bx::isTrivial<int32_t[] >() );
  527. }
  528. TEST_CASE("type-traits isPod", "")
  529. {
  530. STATIC_REQUIRE( bx::isPod<TestClass >() );
  531. STATIC_REQUIRE( bx::isPod<TestClassFinal >() );
  532. STATIC_REQUIRE(!bx::isPod<TestClassCtor >() );
  533. STATIC_REQUIRE( bx::isPod<TestClassMember >() );
  534. STATIC_REQUIRE(!bx::isPod<TestClassMemberPrivate >() );
  535. STATIC_REQUIRE( bx::isPod<TestClassStaticOnly >() );
  536. STATIC_REQUIRE(!bx::isPod<TestClassDefaultCtor >() );
  537. STATIC_REQUIRE( bx::isPod<TestClassDefaultDtor >() );
  538. STATIC_REQUIRE(!bx::isPod<TestClassVirtualDtor >() );
  539. STATIC_REQUIRE(!bx::isPod<TestClassPolymorphic >() );
  540. STATIC_REQUIRE(!bx::isPod<TestClassAbstractBase >() );
  541. STATIC_REQUIRE( bx::isPod<TestClassDerivedA >() );
  542. STATIC_REQUIRE( bx::isPod<TestClassDerivedB >() );
  543. STATIC_REQUIRE( bx::isPod<TestUnion >() );
  544. STATIC_REQUIRE( bx::isPod<TestUnionEmpty >() );
  545. STATIC_REQUIRE( bx::isPod<TestUnion[] >() );
  546. STATIC_REQUIRE( bx::isPod<int32_t[] >() );
  547. }
  548. TEST_CASE("type-traits isPolymorphic", "")
  549. {
  550. STATIC_REQUIRE(!bx::isPolymorphic<TestClass >() );
  551. STATIC_REQUIRE(!bx::isPolymorphic<TestClassFinal >() );
  552. STATIC_REQUIRE(!bx::isPolymorphic<TestClassCtor >() );
  553. STATIC_REQUIRE(!bx::isPolymorphic<TestClassMember >() );
  554. STATIC_REQUIRE(!bx::isPolymorphic<TestClassMemberPrivate >() );
  555. STATIC_REQUIRE(!bx::isPolymorphic<TestClassStaticOnly >() );
  556. STATIC_REQUIRE(!bx::isPolymorphic<TestClassDefaultCtor >() );
  557. STATIC_REQUIRE(!bx::isPolymorphic<TestClassDefaultDtor >() );
  558. STATIC_REQUIRE( bx::isPolymorphic<TestClassVirtualDtor >() );
  559. STATIC_REQUIRE( bx::isPolymorphic<TestClassAbstractBase >() );
  560. STATIC_REQUIRE( bx::isPolymorphic<TestClassPolymorphic >() );
  561. STATIC_REQUIRE(!bx::isPolymorphic<TestClassDerivedA >() );
  562. STATIC_REQUIRE(!bx::isPolymorphic<TestClassDerivedB >() );
  563. STATIC_REQUIRE( bx::isPolymorphic<TestClassDerivedX >() );
  564. STATIC_REQUIRE(!bx::isPolymorphic<TestUnion >() );
  565. STATIC_REQUIRE(!bx::isPolymorphic<TestUnionEmpty >() );
  566. STATIC_REQUIRE(!bx::isPolymorphic<TestUnion[] >() );
  567. STATIC_REQUIRE(!bx::isPolymorphic<int32_t[] >() );
  568. }
  569. TEST_CASE("type-traits isDestructorVirtual", "")
  570. {
  571. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClass >() );
  572. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassFinal >() );
  573. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassCtor >() );
  574. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassMember >() );
  575. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassMemberPrivate >() );
  576. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassStaticOnly >() );
  577. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassDefaultCtor >() );
  578. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassDefaultDtor >() );
  579. STATIC_REQUIRE( bx::isDestructorVirtual<TestClassVirtualDtor >() );
  580. STATIC_REQUIRE( bx::isDestructorVirtual<TestClassAbstractBase >() );
  581. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassPolymorphic >() );
  582. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassDerivedA >() );
  583. STATIC_REQUIRE(!bx::isDestructorVirtual<TestClassDerivedB >() );
  584. STATIC_REQUIRE( bx::isDestructorVirtual<TestClassDerivedX >() );
  585. STATIC_REQUIRE(!bx::isDestructorVirtual<TestUnion >() );
  586. STATIC_REQUIRE(!bx::isDestructorVirtual<TestUnionEmpty >() );
  587. STATIC_REQUIRE(!bx::isDestructorVirtual<TestUnion[] >() );
  588. STATIC_REQUIRE(!bx::isDestructorVirtual<int32_t[] >() );
  589. }
  590. TEST_CASE("type-traits isBaseOf", "")
  591. {
  592. STATIC_REQUIRE( bx::isBaseOf<TestClass, TestClass >() );
  593. STATIC_REQUIRE( bx::isBaseOf<TestClass, TestClassDerivedA >() );
  594. STATIC_REQUIRE( bx::isBaseOf<TestClass, TestClassDerivedB >() );
  595. STATIC_REQUIRE(!bx::isBaseOf<TestClass, TestClassFinal >() );
  596. STATIC_REQUIRE(!bx::isBaseOf<TestClassDerivedB, TestClassDerivedA >() );
  597. STATIC_REQUIRE(!bx::isBaseOf<TestClassDerivedB, TestClassDerivedX >() );
  598. STATIC_REQUIRE(!bx::isBaseOf<int32_t, int32_t >() );
  599. }