zemu 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. checksums.yaml +7 -0
  2. data/lib/zemu/config.rb +312 -0
  3. data/lib/zemu/instance.rb +179 -0
  4. data/lib/zemu.rb +172 -0
  5. data/src/debug.c +118 -0
  6. data/src/debug.h +30 -0
  7. data/src/external/Z/API/Z/ABIs/generic/allocator.h +36 -0
  8. data/src/external/Z/API/Z/ABIs/generic/cipher.h +47 -0
  9. data/src/external/Z/API/Z/ABIs/generic/data codec.h +33 -0
  10. data/src/external/Z/API/Z/ABIs/generic/emulation.h +103 -0
  11. data/src/external/Z/API/Z/ABIs/generic/hash function.h +33 -0
  12. data/src/external/Z/API/Z/ABIs/generic/module.h +33 -0
  13. data/src/external/Z/API/Z/ABIs/generic/wave codec.h +40 -0
  14. data/src/external/Z/API/Z/classes/base/InitializerList.hpp +34 -0
  15. data/src/external/Z/API/Z/classes/base/OpaqueFunctionPointer.hpp +26 -0
  16. data/src/external/Z/API/Z/classes/base/OpaqueMemberFunctionPointer.hpp +26 -0
  17. data/src/external/Z/API/Z/classes/base/Pair.hpp +46 -0
  18. data/src/external/Z/API/Z/classes/base/Range.hpp +111 -0
  19. data/src/external/Z/API/Z/classes/base/SizedString.hpp +66 -0
  20. data/src/external/Z/API/Z/classes/base/Status.hpp +89 -0
  21. data/src/external/Z/API/Z/classes/base/Symbol.hpp +39 -0
  22. data/src/external/Z/API/Z/classes/base/Tuple.hpp +111 -0
  23. data/src/external/Z/API/Z/classes/base/Value2D.hpp +389 -0
  24. data/src/external/Z/API/Z/classes/base/Value3D.hpp +368 -0
  25. data/src/external/Z/API/Z/classes/buffering/RingBuffer.hpp +93 -0
  26. data/src/external/Z/API/Z/classes/buffering/TripleBuffer.hpp +68 -0
  27. data/src/external/Z/API/Z/classes/functional/Functor.hpp +265 -0
  28. data/src/external/Z/API/Z/classes/functional/MemberFunction.hpp +98 -0
  29. data/src/external/Z/API/Z/classes/functional/ObjectMemberFunction.hpp +172 -0
  30. data/src/external/Z/API/Z/classes/functional/ObjectSelector.hpp +219 -0
  31. data/src/external/Z/API/Z/classes/functional/Selector.hpp +146 -0
  32. data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/AABB.hpp +81 -0
  33. data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/AABR.hpp +685 -0
  34. data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Box.hpp +219 -0
  35. data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Circle.hpp +80 -0
  36. data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Line2D.hpp +93 -0
  37. data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Line3D.hpp +80 -0
  38. data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Rectangle.hpp +675 -0
  39. data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Sphere.hpp +0 -0
  40. data/src/external/Z/API/Z/classes/memory/Shared.hpp +90 -0
  41. data/src/external/Z/API/Z/constants/base.h +35 -0
  42. data/src/external/Z/API/Z/constants/chemical elements.h +6385 -0
  43. data/src/external/Z/API/Z/constants/numbers.h +963 -0
  44. data/src/external/Z/API/Z/constants/version.h +15 -0
  45. data/src/external/Z/API/Z/formats/character set/ASCII.h +158 -0
  46. data/src/external/Z/API/Z/formats/character set/DOS CP437.h +159 -0
  47. data/src/external/Z/API/Z/formats/character set/DOS CP737.h +159 -0
  48. data/src/external/Z/API/Z/formats/character set/DOS CP775.h +159 -0
  49. data/src/external/Z/API/Z/formats/character set/DOS CP850.h +159 -0
  50. data/src/external/Z/API/Z/formats/character set/DOS CP852.h +159 -0
  51. data/src/external/Z/API/Z/formats/character set/DOS CP855.h +159 -0
  52. data/src/external/Z/API/Z/formats/character set/DOS CP857.h +159 -0
  53. data/src/external/Z/API/Z/formats/character set/DOS CP858.h +159 -0
  54. data/src/external/Z/API/Z/formats/character set/DOS CP860.h +159 -0
  55. data/src/external/Z/API/Z/formats/character set/DOS CP861.h +159 -0
  56. data/src/external/Z/API/Z/formats/character set/DOS CP862.h +159 -0
  57. data/src/external/Z/API/Z/formats/character set/DOS CP863.h +159 -0
  58. data/src/external/Z/API/Z/formats/character set/DOS CP864.h +159 -0
  59. data/src/external/Z/API/Z/formats/character set/DOS CP865.h +159 -0
  60. data/src/external/Z/API/Z/formats/character set/DOS CP866.h +159 -0
  61. data/src/external/Z/API/Z/formats/character set/DOS CP869.h +159 -0
  62. data/src/external/Z/API/Z/formats/character set/DOS CP872.h +159 -0
  63. data/src/external/Z/API/Z/formats/character set/DOS CP874.h +159 -0
  64. data/src/external/Z/API/Z/formats/character set/Unicode.h +30119 -0
  65. data/src/external/Z/API/Z/formats/data model/I16LP32.h +19 -0
  66. data/src/external/Z/API/Z/formats/data model/ILP32.h +19 -0
  67. data/src/external/Z/API/Z/formats/data model/ILP64.h +19 -0
  68. data/src/external/Z/API/Z/formats/data model/IP16L32.h +19 -0
  69. data/src/external/Z/API/Z/formats/data model/LLP64.h +19 -0
  70. data/src/external/Z/API/Z/formats/data model/LP32.h +19 -0
  71. data/src/external/Z/API/Z/formats/data model/LP64.h +19 -0
  72. data/src/external/Z/API/Z/formats/data model/SILP64.h +19 -0
  73. data/src/external/Z/API/Z/formats/file system/FAT12.h +61 -0
  74. data/src/external/Z/API/Z/formats/floating-point/IEEE 754.h +141 -0
  75. data/src/external/Z/API/Z/formats/floating-point/x87.h +74 -0
  76. data/src/external/Z/API/Z/formats/image/ICNS.h +39 -0
  77. data/src/external/Z/API/Z/formats/keymap/Mac OS.h +284 -0
  78. data/src/external/Z/API/Z/formats/keymap/Z.h +141 -0
  79. data/src/external/Z/API/Z/formats/multimedia/Creative Voice.h +106 -0
  80. data/src/external/Z/API/Z/formats/multimedia/Microsoft Wave.h +49 -0
  81. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/ACH.h +44 -0
  82. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/FRZ.h +54 -0
  83. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/PRG.h +33 -0
  84. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SEM.h +46 -0
  85. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SIT.h +34 -0
  86. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SNA.h +117 -0
  87. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SNP.h +37 -0
  88. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SP.h +62 -0
  89. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/Z80.h +117 -0
  90. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/ZX.h +56 -0
  91. data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/ZX82.h +70 -0
  92. data/src/external/Z/API/Z/formats/storage medium image/NES Game Pak/UNIF.h +26 -0
  93. data/src/external/Z/API/Z/formats/storage medium image/NES Game Pak/iNES.h +76 -0
  94. data/src/external/Z/API/Z/formats/storage medium image/audio/TAP.h +25 -0
  95. data/src/external/Z/API/Z/formats/storage medium image/audio/TZX.h +1185 -0
  96. data/src/external/Z/API/Z/formats/storage medium image/audio/Warajevo TAP.h +32 -0
  97. data/src/external/Z/API/Z/formats/storage medium image/floppy disk/FDI.h +45 -0
  98. data/src/external/Z/API/Z/functions/base/Z2D.h +583 -0
  99. data/src/external/Z/API/Z/functions/base/Z3D.h +712 -0
  100. data/src/external/Z/API/Z/functions/base/ZRange.h +137 -0
  101. data/src/external/Z/API/Z/functions/base/all.h +16 -0
  102. data/src/external/Z/API/Z/functions/base/casting.hpp +37 -0
  103. data/src/external/Z/API/Z/functions/base/character.h +38 -0
  104. data/src/external/Z/API/Z/functions/base/constructors.h +326 -0
  105. data/src/external/Z/API/Z/functions/base/structure.hpp +26 -0
  106. data/src/external/Z/API/Z/functions/base/type.hpp +60 -0
  107. data/src/external/Z/API/Z/functions/base/value.h +1901 -0
  108. data/src/external/Z/API/Z/functions/base/value.hpp +112 -0
  109. data/src/external/Z/API/Z/functions/buffering/ZRingBuffer.h +85 -0
  110. data/src/external/Z/API/Z/functions/buffering/ZTripleBuffer.h +65 -0
  111. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/Z2DLine.h +179 -0
  112. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/Z3DLine.h +168 -0
  113. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZAABB.h +361 -0
  114. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZAABR.h +1081 -0
  115. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZBox.h +340 -0
  116. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZCircle.h +142 -0
  117. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZRectangle.h +1267 -0
  118. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZSphere.h +156 -0
  119. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/all.h +18 -0
  120. data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/constructors.h +620 -0
  121. data/src/external/Z/API/Z/functions/time/date.h +29 -0
  122. data/src/external/Z/API/Z/hardware/CPU/architecture/6502.h +90 -0
  123. data/src/external/Z/API/Z/hardware/CPU/architecture/Z80.h +245 -0
  124. data/src/external/Z/API/Z/hardware/CPU/architecture/i4004.h +37 -0
  125. data/src/external/Z/API/Z/hardware/PSG/General Instrument/AY-3-891x.h +180 -0
  126. data/src/external/Z/API/Z/hardware/VDC/Ricoh/RP2C0x.h +625 -0
  127. data/src/external/Z/API/Z/hardware/bus/AGP.h +24 -0
  128. data/src/external/Z/API/Z/hardware/bus/USB.h +510 -0
  129. data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/Inves Spectrum +.h +47 -0
  130. data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/Pentagon.h +13 -0
  131. data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/Scorpion.h +13 -0
  132. data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum + 128K.h +158 -0
  133. data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum +.h +82 -0
  134. data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum +2.h +13 -0
  135. data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum +2A.h +13 -0
  136. data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum +3.h +13 -0
  137. data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum.h +109 -0
  138. data/src/external/Z/API/Z/hardware/machine/model/console/Nintendo Entertainment System/NES-001 (NTSC).h +29 -0
  139. data/src/external/Z/API/Z/hardware/machine/model/console/Nintendo Entertainment System/NES-001 (PAL).h +29 -0
  140. data/src/external/Z/API/Z/hardware/machine/platform/computer/ZX Spectrum.h +405 -0
  141. data/src/external/Z/API/Z/hardware/machine/platform/console/Game Boy.h +49 -0
  142. data/src/external/Z/API/Z/hardware/machine/platform/console/Nintendo Entertainment System.h +350 -0
  143. data/src/external/Z/API/Z/hardware/storage medium/ROM cartridge/SNES Game Pak.h +238 -0
  144. data/src/external/Z/API/Z/inspection/C/completion.h +178 -0
  145. data/src/external/Z/API/Z/inspection/C/modules/C11.h +41 -0
  146. data/src/external/Z/API/Z/inspection/C/modules/C18.h +13 -0
  147. data/src/external/Z/API/Z/inspection/C/modules/C89.h +19 -0
  148. data/src/external/Z/API/Z/inspection/C/modules/C90.h +13 -0
  149. data/src/external/Z/API/Z/inspection/C/modules/C94.h +15 -0
  150. data/src/external/Z/API/Z/inspection/C/modules/C99.h +29 -0
  151. data/src/external/Z/API/Z/inspection/C/modules/KR C.h +19 -0
  152. data/src/external/Z/API/Z/inspection/C++/completion.h +512 -0
  153. data/src/external/Z/API/Z/inspection/C++/modules/C++03.h +15 -0
  154. data/src/external/Z/API/Z/inspection/C++/modules/C++11.h +80 -0
  155. data/src/external/Z/API/Z/inspection/C++/modules/C++14.h +26 -0
  156. data/src/external/Z/API/Z/inspection/C++/modules/C++17.h +55 -0
  157. data/src/external/Z/API/Z/inspection/C++/modules/C++85.h +11 -0
  158. data/src/external/Z/API/Z/inspection/C++/modules/C++89.h +13 -0
  159. data/src/external/Z/API/Z/inspection/C++/modules/C++98.h +17 -0
  160. data/src/external/Z/API/Z/inspection/C++.h +78 -0
  161. data/src/external/Z/API/Z/inspection/C.h +79 -0
  162. data/src/external/Z/API/Z/inspection/CPU/completion.h +56 -0
  163. data/src/external/Z/API/Z/inspection/CPU/detection.h +714 -0
  164. data/src/external/Z/API/Z/inspection/CPU/modules/6502.h +25 -0
  165. data/src/external/Z/API/Z/inspection/CPU/modules/AArch32.h +32 -0
  166. data/src/external/Z/API/Z/inspection/CPU/modules/AArch64.h +32 -0
  167. data/src/external/Z/API/Z/inspection/CPU/modules/Z80.h +26 -0
  168. data/src/external/Z/API/Z/inspection/CPU/modules/x86-32.h +31 -0
  169. data/src/external/Z/API/Z/inspection/CPU/modules/x86-64.h +312 -0
  170. data/src/external/Z/API/Z/inspection/CPU.h +209 -0
  171. data/src/external/Z/API/Z/inspection/OS/completion.h +36 -0
  172. data/src/external/Z/API/Z/inspection/OS/detection.h +768 -0
  173. data/src/external/Z/API/Z/inspection/OS/modules/Linux.h +22 -0
  174. data/src/external/Z/API/Z/inspection/OS/modules/MS-DOS.h +16 -0
  175. data/src/external/Z/API/Z/inspection/OS/modules/Mac OS X.h +23 -0
  176. data/src/external/Z/API/Z/inspection/OS/modules/Windows.h +19 -0
  177. data/src/external/Z/API/Z/inspection/OS/modules/iPhone OS.h +23 -0
  178. data/src/external/Z/API/Z/inspection/OS.h +236 -0
  179. data/src/external/Z/API/Z/inspection/Objective-C/completion.h +8 -0
  180. data/src/external/Z/API/Z/inspection/Objective-C/modules/Objective-C v1.0.h +11 -0
  181. data/src/external/Z/API/Z/inspection/Objective-C/modules/Objective-C v2.0.h +15 -0
  182. data/src/external/Z/API/Z/inspection/Objective-C.h +51 -0
  183. data/src/external/Z/API/Z/inspection/Z.h +19 -0
  184. data/src/external/Z/API/Z/inspection/build.h +22 -0
  185. data/src/external/Z/API/Z/inspection/character set.h +66 -0
  186. data/src/external/Z/API/Z/inspection/compiler/completion.h +2885 -0
  187. data/src/external/Z/API/Z/inspection/compiler/modules/Apple LLVM.h +26 -0
  188. data/src/external/Z/API/Z/inspection/compiler/modules/Clang.h +1664 -0
  189. data/src/external/Z/API/Z/inspection/compiler/modules/GCC.h +1366 -0
  190. data/src/external/Z/API/Z/inspection/compiler/modules/SCCZ80.h +473 -0
  191. data/src/external/Z/API/Z/inspection/compiler/modules/Visual C++.h +606 -0
  192. data/src/external/Z/API/Z/inspection/compiler/modules/cc65.h +529 -0
  193. data/src/external/Z/API/Z/inspection/compiler/modules/generic.h +13 -0
  194. data/src/external/Z/API/Z/inspection/compiler/modules/template.h +650 -0
  195. data/src/external/Z/API/Z/inspection/compiler.h +299 -0
  196. data/src/external/Z/API/Z/inspection/data model/completion.h +128 -0
  197. data/src/external/Z/API/Z/inspection/data model/deduction.h +9 -0
  198. data/src/external/Z/API/Z/inspection/data model/detection.h +45 -0
  199. data/src/external/Z/API/Z/inspection/data model.h +362 -0
  200. data/src/external/Z/API/Z/inspection/floating-point/completion.h +50 -0
  201. data/src/external/Z/API/Z/inspection/floating-point.h +324 -0
  202. data/src/external/Z/API/Z/inspection/language.h +163 -0
  203. data/src/external/Z/API/Z/inspection/platform/detection.h +9 -0
  204. data/src/external/Z/API/Z/inspection/platform.h +29 -0
  205. data/src/external/Z/API/Z/keys/C++.h +27 -0
  206. data/src/external/Z/API/Z/keys/C.h +29 -0
  207. data/src/external/Z/API/Z/keys/CPU.h +80 -0
  208. data/src/external/Z/API/Z/keys/OS.h +182 -0
  209. data/src/external/Z/API/Z/keys/Objective-C.h +17 -0
  210. data/src/external/Z/API/Z/keys/chemistry.h +26 -0
  211. data/src/external/Z/API/Z/keys/compiler.h +178 -0
  212. data/src/external/Z/API/Z/keys/data model.h +32 -0
  213. data/src/external/Z/API/Z/keys/endianness.h +24 -0
  214. data/src/external/Z/API/Z/keys/language.h +21 -0
  215. data/src/external/Z/API/Z/keys/layout.h +20 -0
  216. data/src/external/Z/API/Z/keys/mathematics/geometry.h +29 -0
  217. data/src/external/Z/API/Z/keys/mathematics/number.h +21 -0
  218. data/src/external/Z/API/Z/keys/order.h +18 -0
  219. data/src/external/Z/API/Z/keys/platform.h +87 -0
  220. data/src/external/Z/API/Z/keys/program.h +39 -0
  221. data/src/external/Z/API/Z/keys/science/chemical elements.h +200 -0
  222. data/src/external/Z/API/Z/keys/science/electricity.h +18 -0
  223. data/src/external/Z/API/Z/keys/science/magnetism.h +19 -0
  224. data/src/external/Z/API/Z/keys/status.h +69 -0
  225. data/src/external/Z/API/Z/keys/text.h +27 -0
  226. data/src/external/Z/API/Z/keys/value.h +88 -0
  227. data/src/external/Z/API/Z/macros/arguments.h +25 -0
  228. data/src/external/Z/API/Z/macros/casting.h +22 -0
  229. data/src/external/Z/API/Z/macros/character.h +159 -0
  230. data/src/external/Z/API/Z/macros/date.h +14 -0
  231. data/src/external/Z/API/Z/macros/key.h +20 -0
  232. data/src/external/Z/API/Z/macros/language.h +126 -0
  233. data/src/external/Z/API/Z/macros/language.hpp +81 -0
  234. data/src/external/Z/API/Z/macros/members.h +86 -0
  235. data/src/external/Z/API/Z/macros/pasting.h +308 -0
  236. data/src/external/Z/API/Z/macros/pointer.h +33 -0
  237. data/src/external/Z/API/Z/macros/repetition.h +283 -0
  238. data/src/external/Z/API/Z/macros/structure.h +104 -0
  239. data/src/external/Z/API/Z/macros/templating.h +407 -0
  240. data/src/external/Z/API/Z/macros/tokens.h +14 -0
  241. data/src/external/Z/API/Z/macros/type enumeration.h +43 -0
  242. data/src/external/Z/API/Z/macros/type selection.hpp +76 -0
  243. data/src/external/Z/API/Z/macros/value.h +489 -0
  244. data/src/external/Z/API/Z/macros/variadic pasting.h +21 -0
  245. data/src/external/Z/API/Z/macros/variadic selection.h +56 -0
  246. data/src/external/Z/API/Z/macros/variadic.h +46 -0
  247. data/src/external/Z/API/Z/macros/version.h +17 -0
  248. data/src/external/Z/API/Z/network/3/IP.h +36 -0
  249. data/src/external/Z/API/Z/network/4/TCP.h +24 -0
  250. data/src/external/Z/API/Z/network/4/UDP.h +26 -0
  251. data/src/external/Z/API/Z/network/7/ED2K.h +104 -0
  252. data/src/external/Z/API/Z/network/7/HTTP.h +100 -0
  253. data/src/external/Z/API/Z/traits/SelectType.hpp +71 -0
  254. data/src/external/Z/API/Z/traits/TernaryType.hpp +20 -0
  255. data/src/external/Z/API/Z/traits/Type.hpp +4516 -0
  256. data/src/external/Z/API/Z/traits/TypeCount.hpp +52 -0
  257. data/src/external/Z/API/Z/traits/TypeList.hpp +376 -0
  258. data/src/external/Z/API/Z/traits/base.hpp +19 -0
  259. data/src/external/Z/API/Z/traits/filtering.hpp +30 -0
  260. data/src/external/Z/API/Z/traits/mathematics.hpp +48 -0
  261. data/src/external/Z/API/Z/types/arguments.h +19 -0
  262. data/src/external/Z/API/Z/types/base.h +1655 -0
  263. data/src/external/Z/API/Z/types/base.hpp +169 -0
  264. data/src/external/Z/API/Z/types/buffering.h +27 -0
  265. data/src/external/Z/API/Z/types/mathematics.h +135 -0
  266. data/src/external/Z/API/Z/types/time.h +23 -0
  267. data/src/external/Z/COPYING.LESSER +165 -0
  268. data/src/external/Z/development/Qt Creator/Z.pro +253 -0
  269. data/src/external/Z/distribution/CocoaPods/Zeta.podspec +18 -0
  270. data/src/external/Z/distribution/Gentoo Linux/Zeta-0.1.ebuild +22 -0
  271. data/src/external/Z/distribution/Gentoo Linux/metadata.xml +8 -0
  272. data/src/external/Z/distribution/Homebrew/Zeta.rb +11 -0
  273. data/src/external/z80/API/emulation/CPU/Z80.h +201 -0
  274. data/src/external/z80/README.md +229 -0
  275. data/src/external/z80/building/premake4.lua +33 -0
  276. data/src/external/z80/development/Xcode/Z80.xcodeproj/project.pbxproj +520 -0
  277. data/src/external/z80/sources/Z80.c +1660 -0
  278. data/src/interrupt.c +6 -0
  279. data/src/interrupt.h +3 -0
  280. data/src/io.c.erb +115 -0
  281. data/src/io.h.erb +18 -0
  282. data/src/main.c +69 -0
  283. data/src/memory.c.erb +43 -0
  284. data/src/memory.h.erb +9 -0
  285. metadata +329 -0
@@ -0,0 +1,4516 @@
1
+ /* Z Kit - traits/Type.hpp
2
+ _____ _______________
3
+ /_ /_/ -_/_ _/ _ |
4
+ /____/\___/ /__//___/_| Kit
5
+ Copyright (C) 2006-2018 Manuel Sainz de Baranda y Goñi.
6
+ Copyright (C) 2018 Ortega Sosa, Sofía.
7
+ Released under the terms of the GNU Lesser General Public License v3. */
8
+
9
+ #ifndef _Z_traits_Type_HPP_
10
+ #define _Z_traits_Type_HPP_
11
+
12
+ #include <Z/keys/mathematics/number.h>
13
+ #include <Z/inspection/Z.h>
14
+ #include <Z/traits/base.hpp>
15
+ #include <Z/traits/TernaryType.hpp>
16
+ #include <Z/traits/TypeList.hpp>
17
+
18
+ #if !Z_HAS_TRAIT(TypeList)
19
+ # include <Z/traits/SelectType.hpp>
20
+
21
+ # if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE)
22
+ # include <Z/traits/TypeCount.hpp>
23
+ # endif
24
+ #endif
25
+
26
+ #if Z_COMPILER_HAS_MAGIC_CONSTANT(MANGLED_FUNCTION_NAME) && \
27
+ Z_LANGUAGE_HAS(CPP, CPP14_RULES_ON_CONSTANT_EXPRESSION_FUNCTION)
28
+
29
+ # include <Z/functions/base/type.hpp>
30
+ # include <Z/classes/base/Symbol.hpp>
31
+ #endif
32
+
33
+ // MARK: - Component availability configuration
34
+
35
+ //-------------------------------------------------.
36
+ // Components that are only available if the types |
37
+ // to which they refer are supported or enabled. |
38
+ //-------------------------------------------------'
39
+
40
+ #if Z_UINT8_VALUE_TYPE == Z_VALUE_TYPE_UINT8
41
+ # define Z_HAS_TRAIT_TypeIsUInt8 TRUE
42
+ # define Z_TRAIT_Type_HAS_is_uint8 TRUE
43
+ #else
44
+ # define Z_HAS_TRAIT_TypeIsUInt8 FALSE
45
+ # define Z_TRAIT_Type_HAS_is_uint8 FALSE
46
+ #endif
47
+
48
+ #if Z_SINT8_VALUE_TYPE == Z_VALUE_TYPE_SINT8
49
+ # define Z_HAS_TRAIT_TypeIsSInt8 TRUE
50
+ # define Z_TRAIT_Type_HAS_is_sint8 TRUE
51
+ #else
52
+ # define Z_HAS_TRAIT_TypeIsSInt8 FALSE
53
+ # define Z_TRAIT_Type_HAS_is_sint8 FALSE
54
+ #endif
55
+
56
+ #if Z_UINT16_VALUE_TYPE == Z_VALUE_TYPE_UINT16
57
+ # define Z_HAS_TRAIT_TypeIsUInt16 TRUE
58
+ # define Z_TRAIT_Type_HAS_is_uint16 TRUE
59
+ #else
60
+ # define Z_HAS_TRAIT_TypeIsUInt16 FALSE
61
+ # define Z_TRAIT_Type_HAS_is_uint16 FALSE
62
+ #endif
63
+
64
+ #if Z_SINT16_VALUE_TYPE == Z_VALUE_TYPE_SINT16
65
+ # define Z_HAS_TRAIT_TypeIsSInt16 TRUE
66
+ # define Z_TRAIT_Type_HAS_is_sint16 TRUE
67
+ #else
68
+ # define Z_HAS_TRAIT_TypeIsSInt16 FALSE
69
+ # define Z_TRAIT_Type_HAS_is_sint16 FALSE
70
+ #endif
71
+
72
+ #if defined(Z_UINT32) && Z_UINT32_VALUE_TYPE == Z_VALUE_TYPE_UINT32
73
+ # define Z_HAS_TRAIT_TypeIsUInt32 TRUE
74
+ # define Z_TRAIT_Type_HAS_is_uint32 TRUE
75
+ #else
76
+ # define Z_HAS_TRAIT_TypeIsUInt32 FALSE
77
+ # define Z_TRAIT_Type_HAS_is_uint32 FALSE
78
+ #endif
79
+
80
+ #if defined(Z_SINT32) && Z_SINT32_VALUE_TYPE == Z_VALUE_TYPE_SINT32
81
+ # define Z_HAS_TRAIT_TypeIsSInt32 TRUE
82
+ # define Z_TRAIT_Type_HAS_is_sint32 TRUE
83
+ #else
84
+ # define Z_HAS_TRAIT_TypeIsSInt32 FALSE
85
+ # define Z_TRAIT_Type_HAS_is_sint32 FALSE
86
+ #endif
87
+
88
+ #if defined(Z_UINT64) && Z_UINT64_VALUE_TYPE == Z_VALUE_TYPE_UINT64
89
+ # define Z_HAS_TRAIT_TypeIsUInt64 TRUE
90
+ # define Z_TRAIT_Type_HAS_is_uint64 TRUE
91
+ #else
92
+ # define Z_HAS_TRAIT_TypeIsUInt64 FALSE
93
+ # define Z_TRAIT_Type_HAS_is_uint64 FALSE
94
+ #endif
95
+
96
+ #if defined(Z_SINT64) && Z_SINT64_VALUE_TYPE == Z_VALUE_TYPE_SINT64
97
+ # define Z_HAS_TRAIT_TypeIsSInt64 TRUE
98
+ # define Z_TRAIT_Type_HAS_is_sint64 TRUE
99
+ #else
100
+ # define Z_HAS_TRAIT_TypeIsSInt64 FALSE
101
+ # define Z_TRAIT_Type_HAS_is_sint64 FALSE
102
+ #endif
103
+
104
+ #if defined(Z_UINT128) && Z_UINT128_VALUE_TYPE == Z_VALUE_TYPE_UINT128
105
+ # define Z_HAS_TRAIT_TypeIsUInt128 TRUE
106
+ # define Z_TRAIT_Type_HAS_is_uint128 TRUE
107
+ #else
108
+ # define Z_HAS_TRAIT_TypeIsUInt128 FALSE
109
+ # define Z_TRAIT_Type_HAS_is_uint128 FALSE
110
+ #endif
111
+
112
+ #if defined(Z_SINT128) && Z_SINT128_VALUE_TYPE == Z_VALUE_TYPE_SINT128
113
+ # define Z_HAS_TRAIT_TypeIsSInt128 TRUE
114
+ # define Z_TRAIT_Type_HAS_is_sint128 TRUE
115
+ #else
116
+ # define Z_HAS_TRAIT_TypeIsSInt128 FALSE
117
+ # define Z_TRAIT_Type_HAS_is_sint128 FALSE
118
+ #endif
119
+
120
+ #if defined(Z_FLOAT16) && Z_FLOAT16_VALUE_TYPE == Z_VALUE_TYPE_FLOAT16
121
+ # define Z_HAS_TRAIT_TypeIsFloat16 TRUE
122
+ # define Z_TRAIT_Type_HAS_is_float16 TRUE
123
+ #else
124
+ # define Z_HAS_TRAIT_TypeIsFloat16 FALSE
125
+ # define Z_TRAIT_Type_HAS_is_float16 FALSE
126
+ #endif
127
+
128
+ #if defined(Z_FLOAT32) && Z_FLOAT32_VALUE_TYPE == Z_VALUE_TYPE_FLOAT32
129
+ # define Z_HAS_TRAIT_TypeIsFloat32 TRUE
130
+ # define Z_TRAIT_Type_HAS_is_float32 TRUE
131
+ #else
132
+ # define Z_HAS_TRAIT_TypeIsFloat32 FALSE
133
+ # define Z_TRAIT_Type_HAS_is_float32 FALSE
134
+ #endif
135
+
136
+ #if defined(Z_FLOAT64) && Z_FLOAT64_VALUE_TYPE == Z_VALUE_TYPE_FLOAT64
137
+ # define Z_HAS_TRAIT_TypeIsFloat64 TRUE
138
+ # define Z_TRAIT_Type_HAS_is_float64 TRUE
139
+ #else
140
+ # define Z_HAS_TRAIT_TypeIsFloat64 FALSE
141
+ # define Z_TRAIT_Type_HAS_is_float64 FALSE
142
+ #endif
143
+
144
+ #if defined(Z_FLOAT128) && Z_FLOAT128_VALUE_TYPE == Z_VALUE_TYPE_FLOAT128
145
+ # define Z_HAS_TRAIT_TypeIsFloat128 TRUE
146
+ # define Z_TRAIT_Type_HAS_is_float128 TRUE
147
+ #else
148
+ # define Z_HAS_TRAIT_TypeIsFloat128 FALSE
149
+ # define Z_TRAIT_Type_HAS_is_float128 FALSE
150
+ #endif
151
+
152
+ #if defined(Z_FLOAT80_X87) && Z_FLOAT80_X87_VALUE_TYPE == Z_VALUE_TYPE_FLOAT80_X87
153
+ # define Z_HAS_TRAIT_TypeIsFloat80_x87 TRUE
154
+ # define Z_TRAIT_Type_HAS_is_float80_x87 TRUE
155
+ #else
156
+ # define Z_HAS_TRAIT_TypeIsFloat80_x87 FALSE
157
+ # define Z_TRAIT_Type_HAS_is_float80_x87 FALSE
158
+ #endif
159
+
160
+ #if defined(Z_FLOAT96_X87) && Z_FLOAT96_X87_VALUE_TYPE == Z_VALUE_TYPE_FLOAT96_X87
161
+ # define Z_HAS_TRAIT_TypeIsFloat96_x87 TRUE
162
+ # define Z_TRAIT_Type_HAS_is_float96_x87 TRUE
163
+ #else
164
+ # define Z_HAS_TRAIT_TypeIsFloat96_x87 FALSE
165
+ # define Z_TRAIT_Type_HAS_is_float96_x87 FALSE
166
+ #endif
167
+
168
+ #if defined(Z_FLOAT128_X87) && Z_FLOAT128_X87_VALUE_TYPE == Z_VALUE_TYPE_FLOAT128_X87
169
+ # define Z_HAS_TRAIT_TypeIsFloat128_x87 TRUE
170
+ # define Z_TRAIT_Type_HAS_is_float128_x87 TRUE
171
+ #else
172
+ # define Z_HAS_TRAIT_TypeIsFloat128_x87 FALSE
173
+ # define Z_TRAIT_Type_HAS_is_float128_x87 FALSE
174
+ #endif
175
+
176
+ #ifdef Z_LLONG
177
+ # define Z_HAS_TRAIT_TypeIsSLLong TRUE
178
+ # define Z_HAS_TRAIT_TypeIsULLong TRUE
179
+ # define Z_TRAIT_Type_HAS_is_sllong TRUE
180
+ # define Z_TRAIT_Type_HAS_is_ullong TRUE
181
+ #else
182
+ # define Z_HAS_TRAIT_TypeIsSLLong FALSE
183
+ # define Z_HAS_TRAIT_TypeIsULLong FALSE
184
+ # define Z_TRAIT_Type_HAS_is_sllong FALSE
185
+ # define Z_TRAIT_Type_HAS_is_ullong FALSE
186
+ #endif
187
+
188
+ #ifdef Z_FLOAT
189
+ # define Z_HAS_TRAIT_TypeIsFloat TRUE
190
+ # define Z_TRAIT_Type_HAS_is_float TRUE
191
+ #else
192
+ # define Z_HAS_TRAIT_TypeIsFloat FALSE
193
+ # define Z_TRAIT_Type_HAS_is_float FALSE
194
+ #endif
195
+
196
+ #ifdef Z_DOUBLE
197
+ # define Z_HAS_TRAIT_TypeIsDouble TRUE
198
+ # define Z_TRAIT_Type_HAS_is_double TRUE
199
+ #else
200
+ # define Z_HAS_TRAIT_TypeIsDouble FALSE
201
+ # define Z_TRAIT_Type_HAS_is_double FALSE
202
+ #endif
203
+
204
+ #ifdef Z_LDOUBLE
205
+ # define Z_HAS_TRAIT_TypeIsLDouble TRUE
206
+ # define Z_TRAIT_Type_HAS_is_ldouble TRUE
207
+ #else
208
+ # define Z_HAS_TRAIT_TypeIsLDouble FALSE
209
+ # define Z_TRAIT_Type_HAS_is_ldouble FALSE
210
+ #endif
211
+
212
+ #if Z_LANGUAGE_HAS_TYPE(CPP, BOOLEAN)
213
+ # define Z_HAS_TRAIT_TypeIsBoolean TRUE
214
+ # define Z_TRAIT_Type_HAS_is_boolean TRUE
215
+ #else
216
+ # define Z_HAS_TRAIT_TypeIsBoolean FALSE
217
+ # define Z_TRAIT_Type_HAS_is_boolean FALSE
218
+ #endif
219
+
220
+ /*#if Z_LANGUAGE_HAS_TYPE(CPP, WCHAR)
221
+ # define Z_HAS_TRAIT_TypeIsWChar TRUE
222
+ # define Z_TRAIT_Type_HAS_is_wchar TRUE
223
+ #else
224
+ # define Z_HAS_TRAIT_TypeIsWChar FALSE
225
+ # define Z_TRAIT_Type_HAS_is_wchar FALSE
226
+ #endif
227
+
228
+ #if Z_LANGUAGE_HAS_TYPE(CPP, CHAR16)
229
+ # define Z_HAS_TRAIT_TypeIsChar16 TRUE
230
+ # define Z_TRAIT_Type_HAS_is_char16 TRUE
231
+ #else
232
+ # define Z_HAS_TRAIT_TypeIsChar16 FALSE
233
+ # define Z_TRAIT_Type_HAS_is_char16 FALSE
234
+ #endif
235
+
236
+ #if Z_LANGUAGE_HAS_TYPE(CPP, CHAR32)
237
+ # define Z_HAS_TRAIT_TypeIsChar32 TRUE
238
+ # define Z_TRAIT_Type_HAS_is_char32 TRUE
239
+ #else
240
+ # define Z_HAS_TRAIT_TypeIsChar32 FALSE
241
+ # define Z_TRAIT_Type_HAS_is_char32 FALSE
242
+ #endif*/
243
+
244
+ #if Z_LANGUAGE_HAS_SPECIFIER(CPP, DECLARED_TYPE) && Z_LANGUAGE_HAS_LITERAL(CPP, NULL_POINTER)
245
+ # define Z_HAS_TRAIT_TypeIsNullPointer TRUE
246
+ # define Z_TRAIT_Type_HAS_is_null_pointer TRUE
247
+ #else
248
+ # define Z_HAS_TRAIT_TypeIsNullPointer FALSE
249
+ # define Z_TRAIT_Type_HAS_is_null_pointer FALSE
250
+ #endif
251
+
252
+ //--------------------------------------------------------.
253
+ // Components that are only available if the language |
254
+ // features to which they refer are supported or enabled. |
255
+ //--------------------------------------------------------'
256
+
257
+ #if Z_LANGUAGE_HAS(CPP, RVALUE_REFERENCE)
258
+ # define Z_HAS_TRAIT_TypeIsFunctionRValueReference TRUE
259
+ # define Z_HAS_TRAIT_TypeIsRValueReference TRUE
260
+ # define Z_HAS_TRAIT_TypeAddRValueReference TRUE
261
+ # define Z_HAS_TRAIT_TypeToRValueReference TRUE
262
+ # define Z_TRAIT_Type_HAS_is_function_rvalue_reference TRUE
263
+ # define Z_TRAIT_Type_HAS_is_rvalue_reference TRUE
264
+ # define Z_TRAIT_Type_HAS_add_rvalue_reference TRUE
265
+ # define Z_TRAIT_Type_HAS_to_rvalue_reference TRUE
266
+ #else
267
+ # define Z_HAS_TRAIT_TypeIsFunctionRValueReference FALSE
268
+ # define Z_HAS_TRAIT_TypeIsRValueReference FALSE
269
+ # define Z_HAS_TRAIT_TypeAddRValueReference FALSE
270
+ # define Z_HAS_TRAIT_TypeToRValueReference FALSE
271
+ # define Z_TRAIT_Type_HAS_is_function_rvalue_reference FALSE
272
+ # define Z_TRAIT_Type_HAS_is_rvalue_reference FALSE
273
+ # define Z_TRAIT_Type_HAS_add_rvalue_reference FALSE
274
+ # define Z_TRAIT_Type_HAS_to_rvalue_reference FALSE
275
+ #endif
276
+
277
+ #if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
278
+ # define Z_HAS_TRAIT_TypeIsConstLValue TRUE
279
+ # define Z_HAS_TRAIT_TypeIsConstRValue TRUE
280
+ # define Z_HAS_TRAIT_TypeIsConstVolatileLValue TRUE
281
+ # define Z_HAS_TRAIT_TypeIsConstVolatileRValue TRUE
282
+ # define Z_HAS_TRAIT_TypeIsLValue TRUE
283
+ # define Z_HAS_TRAIT_TypeIsRValue TRUE
284
+ # define Z_HAS_TRAIT_TypeIsVolatileLValue TRUE
285
+ # define Z_HAS_TRAIT_TypeIsVolatileRValue TRUE
286
+ # define Z_HAS_TRAIT_TypeAddConstLValue TRUE
287
+ # define Z_HAS_TRAIT_TypeAddConstRValue TRUE
288
+ # define Z_HAS_TRAIT_TypeAddConstVolatileLValue TRUE
289
+ # define Z_HAS_TRAIT_TypeAddConstVolatileRValue TRUE
290
+ # define Z_HAS_TRAIT_TypeAddLValue TRUE
291
+ # define Z_HAS_TRAIT_TypeAddRValue TRUE
292
+ # define Z_HAS_TRAIT_TypeAddVolatileLValue TRUE
293
+ # define Z_HAS_TRAIT_TypeAddVolatileRValue TRUE
294
+ # define Z_HAS_TRAIT_TypeRemoveConstThis TRUE
295
+ # define Z_HAS_TRAIT_TypeRemoveConstVolatileThis TRUE
296
+ # define Z_HAS_TRAIT_TypeRemoveThis TRUE
297
+ # define Z_HAS_TRAIT_TypeRemoveVolatileThis TRUE
298
+ # define Z_HAS_TRAIT_TypeToConstLValue TRUE
299
+ # define Z_HAS_TRAIT_TypeToConstRValue TRUE
300
+ # define Z_HAS_TRAIT_TypeToConstVolatileLValue TRUE
301
+ # define Z_HAS_TRAIT_TypeToConstVolatileRValue TRUE
302
+ # define Z_HAS_TRAIT_TypeToLValue TRUE
303
+ # define Z_HAS_TRAIT_TypeToRValue TRUE
304
+ # define Z_HAS_TRAIT_TypeToVolatileLValue TRUE
305
+ # define Z_HAS_TRAIT_TypeToVolatileRValue TRUE
306
+ # define Z_TRAIT_Type_HAS_is_const_lvalue TRUE
307
+ # define Z_TRAIT_Type_HAS_is_const_rvalue TRUE
308
+ # define Z_TRAIT_Type_HAS_is_const_volatile_lvalue TRUE
309
+ # define Z_TRAIT_Type_HAS_is_const_volatile_rvalue TRUE
310
+ # define Z_TRAIT_Type_HAS_is_lvalue TRUE
311
+ # define Z_TRAIT_Type_HAS_is_rvalue TRUE
312
+ # define Z_TRAIT_Type_HAS_is_volatile_lvalue TRUE
313
+ # define Z_TRAIT_Type_HAS_is_volatile_rvalue TRUE
314
+ # define Z_TRAIT_Type_HAS_add_const_lvalue TRUE
315
+ # define Z_TRAIT_Type_HAS_add_const_rvalue TRUE
316
+ # define Z_TRAIT_Type_HAS_add_const_volatile_lvalue TRUE
317
+ # define Z_TRAIT_Type_HAS_add_const_volatile_rvalue TRUE
318
+ # define Z_TRAIT_Type_HAS_add_lvalue TRUE
319
+ # define Z_TRAIT_Type_HAS_add_rvalue TRUE
320
+ # define Z_TRAIT_Type_HAS_add_volatile_lvalue TRUE
321
+ # define Z_TRAIT_Type_HAS_add_volatile_rvalue TRUE
322
+ # define Z_TRAIT_Type_HAS_remove_const_this TRUE
323
+ # define Z_TRAIT_Type_HAS_remove_const_volatile_this TRUE
324
+ # define Z_TRAIT_Type_HAS_remove_this TRUE
325
+ # define Z_TRAIT_Type_HAS_remove_volatile_this TRUE
326
+ # define Z_TRAIT_Type_HAS_to_const_lvalue TRUE
327
+ # define Z_TRAIT_Type_HAS_to_const_rvalue TRUE
328
+ # define Z_TRAIT_Type_HAS_to_const_volatile_lvalue TRUE
329
+ # define Z_TRAIT_Type_HAS_to_const_volatile_rvalue TRUE
330
+ # define Z_TRAIT_Type_HAS_to_lvalue TRUE
331
+ # define Z_TRAIT_Type_HAS_to_rvalue TRUE
332
+ # define Z_TRAIT_Type_HAS_to_volatile_lvalue TRUE
333
+ # define Z_TRAIT_Type_HAS_to_volatile_rvalue TRUE
334
+ #else
335
+ # define Z_HAS_TRAIT_TypeIsConstLValue FALSE
336
+ # define Z_HAS_TRAIT_TypeIsConstRValue FALSE
337
+ # define Z_HAS_TRAIT_TypeIsConstVolatileLValue FALSE
338
+ # define Z_HAS_TRAIT_TypeIsConstVolatileRValue FALSE
339
+ # define Z_HAS_TRAIT_TypeIsLValue FALSE
340
+ # define Z_HAS_TRAIT_TypeIsRValue FALSE
341
+ # define Z_HAS_TRAIT_TypeIsVolatileLValue FALSE
342
+ # define Z_HAS_TRAIT_TypeIsVolatileRValue FALSE
343
+ # define Z_HAS_TRAIT_TypeAddConstLValue FALSE
344
+ # define Z_HAS_TRAIT_TypeAddConstRValue FALSE
345
+ # define Z_HAS_TRAIT_TypeAddConstVolatileLValue FALSE
346
+ # define Z_HAS_TRAIT_TypeAddConstVolatileRValue FALSE
347
+ # define Z_HAS_TRAIT_TypeAddLValue FALSE
348
+ # define Z_HAS_TRAIT_TypeAddRValue FALSE
349
+ # define Z_HAS_TRAIT_TypeAddVolatileLValue FALSE
350
+ # define Z_HAS_TRAIT_TypeAddVolatileRValue FALSE
351
+ # define Z_HAS_TRAIT_TypeRemoveConstThis FALSE
352
+ # define Z_HAS_TRAIT_TypeRemoveConstVolatileThis FALSE
353
+ # define Z_HAS_TRAIT_TypeRemoveThis FALSE
354
+ # define Z_HAS_TRAIT_TypeRemoveVolatileThis FALSE
355
+ # define Z_HAS_TRAIT_TypeToConstLValue FALSE
356
+ # define Z_HAS_TRAIT_TypeToConstRValue FALSE
357
+ # define Z_HAS_TRAIT_TypeToConstVolatileLValue FALSE
358
+ # define Z_HAS_TRAIT_TypeToConstVolatileRValue FALSE
359
+ # define Z_HAS_TRAIT_TypeToLValue FALSE
360
+ # define Z_HAS_TRAIT_TypeToRValue FALSE
361
+ # define Z_HAS_TRAIT_TypeToVolatileLValue FALSE
362
+ # define Z_HAS_TRAIT_TypeToVolatileRValue FALSE
363
+ # define Z_TRAIT_Type_HAS_is_const_lvalue FALSE
364
+ # define Z_TRAIT_Type_HAS_is_const_rvalue FALSE
365
+ # define Z_TRAIT_Type_HAS_is_const_volatile_lvalue FALSE
366
+ # define Z_TRAIT_Type_HAS_is_const_volatile_rvalue FALSE
367
+ # define Z_TRAIT_Type_HAS_is_lvalue FALSE
368
+ # define Z_TRAIT_Type_HAS_is_rvalue FALSE
369
+ # define Z_TRAIT_Type_HAS_is_volatile_lvalue FALSE
370
+ # define Z_TRAIT_Type_HAS_is_volatile_rvalue FALSE
371
+ # define Z_TRAIT_Type_HAS_add_const_lvalue FALSE
372
+ # define Z_TRAIT_Type_HAS_add_const_rvalue FALSE
373
+ # define Z_TRAIT_Type_HAS_add_const_volatile_lvalue FALSE
374
+ # define Z_TRAIT_Type_HAS_add_const_volatile_rvalue FALSE
375
+ # define Z_TRAIT_Type_HAS_add_lvalue FALSE
376
+ # define Z_TRAIT_Type_HAS_add_rvalue FALSE
377
+ # define Z_TRAIT_Type_HAS_add_volatile_lvalue FALSE
378
+ # define Z_TRAIT_Type_HAS_add_volatile_rvalue FALSE
379
+ # define Z_TRAIT_Type_HAS_remove_const_this FALSE
380
+ # define Z_TRAIT_Type_HAS_remove_const_volatile_this FALSE
381
+ # define Z_TRAIT_Type_HAS_remove_this FALSE
382
+ # define Z_TRAIT_Type_HAS_remove_volatile_this FALSE
383
+ # define Z_TRAIT_Type_HAS_to_const_lvalue FALSE
384
+ # define Z_TRAIT_Type_HAS_to_const_rvalue FALSE
385
+ # define Z_TRAIT_Type_HAS_to_const_volatile_lvalue FALSE
386
+ # define Z_TRAIT_Type_HAS_to_const_volatile_rvalue FALSE
387
+ # define Z_TRAIT_Type_HAS_to_lvalue FALSE
388
+ # define Z_TRAIT_Type_HAS_to_rvalue FALSE
389
+ # define Z_TRAIT_Type_HAS_to_volatile_lvalue FALSE
390
+ # define Z_TRAIT_Type_HAS_to_volatile_rvalue FALSE
391
+ #endif
392
+
393
+ //------------------------------------------------.
394
+ // Components that need compiler built-in traits. |
395
+ // There are no known workarounds. |
396
+ //------------------------------------------------'
397
+
398
+ #if Z_COMPILER_HAS_TRAIT(TYPE_HAS_VIRTUAL_DESTRUCTOR)
399
+ # define Z_HAS_TRAIT_TypeHasVirtualDestructor TRUE
400
+ # define Z_TRAIT_Type_HAS_has_virtual_destructor TRUE
401
+ #else
402
+ # define Z_HAS_TRAIT_TypeHasVirtualDestructor FALSE
403
+ # define Z_TRAIT_Type_HAS_has_virtual_destructor FALSE
404
+ #endif
405
+
406
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_ABSTRACT)
407
+ # define Z_HAS_TRAIT_TypeIsAbstract TRUE
408
+ # define Z_TRAIT_Type_HAS_is_abstract TRUE
409
+ #else
410
+ # define Z_HAS_TRAIT_TypeIsAbstract FALSE
411
+ # define Z_TRAIT_Type_HAS_is_abstract FALSE
412
+ #endif
413
+
414
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_AGGREGATE)
415
+ # define Z_HAS_TRAIT_TypeIsAggregate TRUE
416
+ # define Z_TRAIT_Type_HAS_is_aggregate TRUE
417
+ #else
418
+ # define Z_HAS_TRAIT_TypeIsAggregate FALSE
419
+ # define Z_TRAIT_Type_HAS_is_aggregate FALSE
420
+ #endif
421
+
422
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_ASSIGNABLE)
423
+ # define Z_HAS_TRAIT_TypeIsAssignable TRUE
424
+ #else
425
+ # define Z_HAS_TRAIT_TypeIsAssignable FALSE
426
+ #endif
427
+
428
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_BASE)
429
+ # define Z_HAS_TRAIT_TypeIsBase TRUE
430
+ #else
431
+ # define Z_HAS_TRAIT_TypeIsBase FALSE
432
+ #endif
433
+
434
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_CONVERTIBLE)
435
+ # define Z_HAS_TRAIT_TypeIsConvertible TRUE
436
+ #else
437
+ # define Z_HAS_TRAIT_TypeIsConvertible FALSE
438
+ #endif
439
+
440
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_FINAL)
441
+ # define Z_HAS_TRAIT_TypeIsFinal TRUE
442
+ # define Z_TRAIT_Type_HAS_is_final TRUE
443
+ #else
444
+ # define Z_HAS_TRAIT_TypeIsFinal FALSE
445
+ # define Z_TRAIT_Type_HAS_is_final FALSE
446
+ #endif
447
+
448
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_INTERFACE_CLASS)
449
+ # define Z_HAS_TRAIT_TypeIsInterfaceClass TRUE
450
+ # define Z_TRAIT_Type_HAS_is_interface_class TRUE
451
+ #else
452
+ # define Z_HAS_TRAIT_TypeIsInterfaceClass FALSE
453
+ # define Z_TRAIT_Type_HAS_is_interface_class FALSE
454
+ #endif
455
+
456
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_LITERAL)
457
+ # define Z_HAS_TRAIT_TypeIsLiteral TRUE
458
+ # define Z_TRAIT_Type_HAS_is_literal TRUE
459
+ #else
460
+ # define Z_HAS_TRAIT_TypeIsLiteral FALSE
461
+ # define Z_TRAIT_Type_HAS_is_literal FALSE
462
+ #endif
463
+
464
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_NOTHROW_ASSIGNABLE)
465
+ # define Z_HAS_TRAIT_TypeIsNothrowAssignable TRUE
466
+ #else
467
+ # define Z_HAS_TRAIT_TypeIsNothrowAssignable FALSE
468
+ #endif
469
+
470
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_POD)
471
+ # define Z_HAS_TRAIT_TypeIsPOD TRUE
472
+ # define Z_TRAIT_Type_HAS_is_pod TRUE
473
+ #else
474
+ # define Z_HAS_TRAIT_TypeIsPOD FALSE
475
+ # define Z_TRAIT_Type_HAS_is_pod FALSE
476
+ #endif
477
+
478
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_POLYMORPHIC)
479
+ # define Z_HAS_TRAIT_TypeIsPolymorphic TRUE
480
+ # define Z_TRAIT_Type_HAS_is_polymorphic TRUE
481
+ #else
482
+ # define Z_HAS_TRAIT_TypeIsPolymorphic FALSE
483
+ # define Z_TRAIT_Type_HAS_is_polymorphic FALSE
484
+ #endif
485
+
486
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_TRIVIALLY_ASSIGNABLE)
487
+ # define Z_HAS_TRAIT_TypeIsTriviallyAssignable TRUE
488
+ #else
489
+ # define Z_HAS_TRAIT_TypeIsTriviallyAssignable FALSE
490
+ #endif
491
+
492
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_TRIVIALLY_COPY_ASSIGNABLE)
493
+ # define Z_HAS_TRAIT_TypeIsTriviallyCopyAssignable TRUE
494
+ # define Z_TRAIT_Type_HAS_is_trivially_copy_assignable TRUE
495
+ #else
496
+ # define Z_HAS_TRAIT_TypeIsTriviallyCopyAssignable FALSE
497
+ # define Z_TRAIT_Type_HAS_is_trivially_copy_assignable FALSE
498
+ #endif
499
+
500
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE)
501
+ # define Z_HAS_TRAIT_TypeIsTriviallyCopyConstructible TRUE
502
+ # define Z_TRAIT_Type_HAS_is_trivially_copy_constructible TRUE
503
+ #else
504
+ # define Z_HAS_TRAIT_TypeIsTriviallyCopyConstructible FALSE
505
+ # define Z_TRAIT_Type_HAS_is_trivially_copy_constructible FALSE
506
+ #endif
507
+
508
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_TRIVIALLY_COPYABLE)
509
+ # define Z_HAS_TRAIT_TypeIsTriviallyCopyable TRUE
510
+ # define Z_TRAIT_Type_HAS_is_trivially_copyable TRUE
511
+ #else
512
+ # define Z_HAS_TRAIT_TypeIsTriviallyCopyable FALSE
513
+ # define Z_TRAIT_Type_HAS_is_trivially_copyable FALSE
514
+ #endif
515
+
516
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE)
517
+ # define Z_HAS_TRAIT_TypeIsTriviallyDefaultConstructible TRUE
518
+ # define Z_TRAIT_Type_HAS_is_trivially_default_constructible TRUE
519
+ #else
520
+ # define Z_HAS_TRAIT_TypeIsTriviallyDefaultConstructible FALSE
521
+ # define Z_TRAIT_Type_HAS_is_trivially_default_constructible FALSE
522
+ #endif
523
+
524
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_TRIVIALLY_DESTRUCTIBLE)
525
+ # define Z_HAS_TRAIT_TypeIsTriviallyDestructible TRUE
526
+ # define Z_TRAIT_Type_HAS_is_trivially_destructible TRUE
527
+ #else
528
+ # define Z_HAS_TRAIT_TypeIsTriviallyDestructible FALSE
529
+ # define Z_TRAIT_Type_HAS_is_trivially_destructible FALSE
530
+ #endif
531
+
532
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_UNION)
533
+ # define Z_HAS_TRAIT_TypeIsUnion TRUE
534
+ # define Z_TRAIT_Type_HAS_is_union TRUE
535
+ #else
536
+ # define Z_HAS_TRAIT_TypeIsUnion FALSE
537
+ # define Z_TRAIT_Type_HAS_is_union FALSE
538
+ #endif
539
+
540
+ #if Z_COMPILER_HAS_TRAIT(TYPE_UNDERLYING_TYPE)
541
+ # define Z_HAS_TRAIT_TypeUnderlyingType TRUE
542
+ # define Z_TRAIT_Type_HAS_underlying_type TRUE
543
+ #else
544
+ # define Z_HAS_TRAIT_TypeUnderlyingType FALSE
545
+ # define Z_TRAIT_Type_HAS_underlying_type FALSE
546
+ #endif
547
+
548
+ //-----------------------------------------------------------.
549
+ // Components that need compiler built-in traits in addition |
550
+ // to some C++11 features. There are no known workarounds. |
551
+ //-----------------------------------------------------------'
552
+
553
+ #if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE) && Z_COMPILER_HAS_TRAIT(TYPE_IS_CONSTRUCTIBLE)
554
+ # define Z_HAS_TRAIT_TypeIsConstructible TRUE
555
+ #else
556
+ # define Z_HAS_TRAIT_TypeIsConstructible FALSE
557
+ #endif
558
+
559
+ #if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE) && Z_COMPILER_HAS_TRAIT(TYPE_IS_NOTHROW_CONSTRUCTIBLE)
560
+ # define Z_HAS_TRAIT_TypeIsNothrowConstructible TRUE
561
+ #else
562
+ # define Z_HAS_TRAIT_TypeIsNothrowConstructible FALSE
563
+ #endif
564
+
565
+ #if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE) && Z_COMPILER_HAS_TRAIT(TYPE_IS_TRIVIALLY_CONSTRUCTIBLE)
566
+ # define Z_HAS_TRAIT_TypeIsTriviallyConstructible TRUE
567
+ #else
568
+ # define Z_HAS_TRAIT_TypeIsTriviallyConstructible FALSE
569
+ #endif
570
+
571
+ //-------------------------------------------------------------.
572
+ // Components that use built-in compiler traits if available. |
573
+ // If not, they use workarounds that need some C++11 features. |
574
+ //-------------------------------------------------------------'
575
+
576
+ #if Z_COMPILER_HAS_TRAIT(TYPE_IS_ENUMERATION) || Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
577
+ # define Z_HAS_TRAIT_TypeIsEnumeration TRUE
578
+ # define Z_TRAIT_Type_HAS_is_enumeration TRUE
579
+ #else
580
+ # define Z_HAS_TRAIT_TypeIsEnumeration FALSE
581
+ # define Z_TRAIT_Type_HAS_is_enumeration FALSE
582
+ #endif
583
+
584
+ //-------------------------------------------.
585
+ // Components that need some C++11 features. |
586
+ //-------------------------------------------'
587
+
588
+ #if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
589
+ # define Z_HAS_TRAIT_TypeIsComplete TRUE
590
+ # define Z_HAS_TRAIT_TypeIsIncomplete TRUE
591
+ #else
592
+ # define Z_HAS_TRAIT_TypeIsComplete FALSE
593
+ # define Z_HAS_TRAIT_TypeIsIncomplete FALSE
594
+ #endif
595
+
596
+ #if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE) && Z_LANGUAGE_HAS_SPECIFIER(CPP, DECLARED_TYPE)
597
+ # define Z_HAS_TRAIT_TypeIsDefaultConstructible TRUE
598
+ # define Z_TRAIT_Type_HAS_is_default_constructible TRUE
599
+ #else
600
+ # define Z_HAS_TRAIT_TypeIsDefaultConstructible FALSE
601
+ # define Z_TRAIT_Type_HAS_is_default_constructible FALSE
602
+ #endif
603
+
604
+ #if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE) && Z_LANGUAGE_HAS_SPECIFIER(CPP, DECLARED_TYPE)
605
+ # define Z_HAS_TRAIT_TypeIsFunctional TRUE
606
+ # define Z_HAS_TRAIT_TypeIsFunctor TRUE
607
+ #else
608
+ # define Z_HAS_TRAIT_TypeIsFunctional FALSE
609
+ # define Z_HAS_TRAIT_TypeIsFunctor TRUE
610
+ #endif
611
+
612
+ #if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE_EXTENDED_PARAMETERS)
613
+ # define Z_HAS_TRAIT_TypeIsTemplate TRUE
614
+ # define Z_TRAIT_Type_HAS_is_template TRUE
615
+ #else
616
+ # define Z_HAS_TRAIT_TypeIsTemplate FALSE
617
+ # define Z_TRAIT_Type_HAS_is_template FALSE
618
+ #endif
619
+
620
+ #if Z_HAS_TRAIT(TypeList)
621
+ # define Z_HAS_TRAIT_TypeParameters TRUE
622
+ # define Z_TRAIT_Type_HAS_parameters TRUE
623
+ #else
624
+ # define Z_HAS_TRAIT_TypeParameters FALSE
625
+ # define Z_TRAIT_Type_HAS_parameters FALSE
626
+ #endif
627
+
628
+ //-------------------------------------------------------------------------.
629
+ // Components that need some C++14 features in addition to compiler magic. |
630
+ //-------------------------------------------------------------------------'
631
+
632
+ #if Z_COMPILER_HAS_MAGIC_CONSTANT(MANGLED_FUNCTION_NAME) && \
633
+ Z_LANGUAGE_HAS(CPP, CPP14_RULES_ON_CONSTANT_EXPRESSION_FUNCTION)
634
+
635
+ # define Z_TRAIT_Type_HAS_string TRUE
636
+ # define Z_TRAIT_Type_HAS_symbol TRUE
637
+ # define Z_TRAIT_Type_HAS_type_string_size TRUE
638
+ #else
639
+ # define Z_TRAIT_Type_HAS_string FALSE
640
+ # define Z_TRAIT_Type_HAS_symbol FALSE
641
+ # define Z_TRAIT_Type_HAS_type_string_size FALSE
642
+ #endif
643
+
644
+ //------------------------------------------------------.
645
+ // Components that are only available in Objective-C++. |
646
+ //------------------------------------------------------'
647
+
648
+ #if Z_LANGUAGE_INCLUDES(OBJECTIVE_CPP)
649
+ # define Z_HAS_TRAIT_TypeIsObjectiveCClass TRUE
650
+ # define Z_HAS_TRAIT_TypeIsObjectiveCClassPointer TRUE
651
+ # define Z_HAS_TRAIT_TypeIsObjectiveCObject TRUE
652
+ # define Z_HAS_TRAIT_TypeIsObjectiveCObjectPointer TRUE
653
+ # define Z_TRAIT_Type_HAS_is_objective_c_class TRUE
654
+ # define Z_TRAIT_Type_HAS_is_objective_c_class_pointer TRUE
655
+ # define Z_TRAIT_Type_HAS_is_objective_c_object TRUE
656
+ # define Z_TRAIT_Type_HAS_is_objective_c_object_pointer TRUE
657
+ #else
658
+ # define Z_HAS_TRAIT_TypeIsObjectiveCClass FALSE
659
+ # define Z_HAS_TRAIT_TypeIsObjectiveCClassPointer FALSE
660
+ # define Z_HAS_TRAIT_TypeIsObjectiveCObject FALSE
661
+ # define Z_HAS_TRAIT_TypeIsObjectiveCObjectPointer FALSE
662
+ # define Z_TRAIT_Type_HAS_is_objective_c_class FALSE
663
+ # define Z_TRAIT_Type_HAS_is_objective_c_class_pointer FALSE
664
+ # define Z_TRAIT_Type_HAS_is_objective_c_object FALSE
665
+ # define Z_TRAIT_Type_HAS_is_objective_c_object_pointer FALSE
666
+ #endif
667
+
668
+ //-----------------------------------------------------.
669
+ // Components that are only available in Objective-C++ |
670
+ // and that need some C++11 features. |
671
+ //-----------------------------------------------------'
672
+
673
+ #if Z_LANGUAGE_INCLUDES(OBJECTIVE_CPP) && Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
674
+ # define Z_HAS_TRAIT_TypeIsObjectiveCInstance TRUE
675
+ # define Z_HAS_TRAIT_TypeIsObjectiveCInstancePointer TRUE
676
+ # define Z_TRAIT_Type_HAS_is_objective_c_instance TRUE
677
+ # define Z_TRAIT_Type_HAS_is_objective_c_instance_pointer TRUE
678
+ #else
679
+ # define Z_HAS_TRAIT_TypeIsObjectiveCInstance FALSE
680
+ # define Z_HAS_TRAIT_TypeIsObjectiveCInstancePointer FALSE
681
+ # define Z_TRAIT_Type_HAS_is_objective_c_instance FALSE
682
+ # define Z_TRAIT_Type_HAS_is_objective_c_instance_pointer FALSE
683
+ #endif
684
+
685
+ //-------------------------------------------------------------------.
686
+ // Aliases that are only available if the language supports template |
687
+ // aliases and the component to which they refer is also available. |
688
+ //-------------------------------------------------------------------'
689
+
690
+ #if Z_LANGUAGE_HAS(CPP, TEMPLATE_ALIAS)
691
+ # define Z_TRAIT_Type_HAS_to_member_pointer TRUE
692
+ # define Z_HAS_TRAIT_ALIAS_type_add_const TRUE
693
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_volatile TRUE
694
+ # define Z_HAS_TRAIT_ALIAS_type_add_lvalue_reference TRUE
695
+ # define Z_HAS_TRAIT_ALIAS_type_add_pointer TRUE
696
+ # define Z_HAS_TRAIT_ALIAS_type_add_volatile TRUE
697
+ # define Z_HAS_TRAIT_ALIAS_type_class_type TRUE
698
+ # define Z_HAS_TRAIT_ALIAS_type_element_type TRUE
699
+ # define Z_HAS_TRAIT_ALIAS_type_pointee_type TRUE
700
+ # define Z_HAS_TRAIT_ALIAS_type_referencee_type TRUE
701
+ # define Z_HAS_TRAIT_ALIAS_type_remove_const TRUE
702
+ # define Z_HAS_TRAIT_ALIAS_type_remove_const_volatile TRUE
703
+ # define Z_HAS_TRAIT_ALIAS_type_remove_pointer TRUE
704
+ # define Z_HAS_TRAIT_ALIAS_type_remove_reference TRUE
705
+ # define Z_HAS_TRAIT_ALIAS_type_remove_volatile TRUE
706
+ # define Z_HAS_TRAIT_ALIAS_type_return_type TRUE
707
+ # define Z_HAS_TRAIT_ALIAS_type_to_const TRUE
708
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_volatile TRUE
709
+ # define Z_HAS_TRAIT_ALIAS_type_to_forwardable TRUE
710
+ # define Z_HAS_TRAIT_ALIAS_type_to_function TRUE
711
+ # define Z_HAS_TRAIT_ALIAS_type_to_lvalue_reference TRUE
712
+ # define Z_HAS_TRAIT_ALIAS_type_to_member_pointer TRUE
713
+ # define Z_HAS_TRAIT_ALIAS_type_to_opaque TRUE
714
+ # define Z_HAS_TRAIT_ALIAS_type_to_pointer TRUE
715
+ # define Z_HAS_TRAIT_ALIAS_type_to_signed TRUE
716
+ # define Z_HAS_TRAIT_ALIAS_type_to_unqualified TRUE
717
+ # define Z_HAS_TRAIT_ALIAS_type_to_unsigned TRUE
718
+ # define Z_HAS_TRAIT_ALIAS_type_to_volatile TRUE
719
+ # define Z_HAS_TRAIT_ALIAS_type_to_wrap TRUE
720
+ #else
721
+ # define Z_TRAIT_Type_HAS_to_member_pointer FALSE
722
+ # define Z_HAS_TRAIT_ALIAS_type_add_const FALSE
723
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_volatile FALSE
724
+ # define Z_HAS_TRAIT_ALIAS_type_add_lvalue_reference FALSE
725
+ # define Z_HAS_TRAIT_ALIAS_type_add_pointer FALSE
726
+ # define Z_HAS_TRAIT_ALIAS_type_add_volatile FALSE
727
+ # define Z_HAS_TRAIT_ALIAS_type_class_type FALSE
728
+ # define Z_HAS_TRAIT_ALIAS_type_element_type FALSE
729
+ # define Z_HAS_TRAIT_ALIAS_type_pointee_type FALSE
730
+ # define Z_HAS_TRAIT_ALIAS_type_referencee_type FALSE
731
+ # define Z_HAS_TRAIT_ALIAS_type_remove_const FALSE
732
+ # define Z_HAS_TRAIT_ALIAS_type_remove_const_volatile FALSE
733
+ # define Z_HAS_TRAIT_ALIAS_type_remove_pointer FALSE
734
+ # define Z_HAS_TRAIT_ALIAS_type_remove_reference FALSE
735
+ # define Z_HAS_TRAIT_ALIAS_type_remove_volatile FALSE
736
+ # define Z_HAS_TRAIT_ALIAS_type_return_type FALSE
737
+ # define Z_HAS_TRAIT_ALIAS_type_to_const FALSE
738
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_volatile FALSE
739
+ # define Z_HAS_TRAIT_ALIAS_type_to_forwardable FALSE
740
+ # define Z_HAS_TRAIT_ALIAS_type_to_function FALSE
741
+ # define Z_HAS_TRAIT_ALIAS_type_to_lvalue_reference FALSE
742
+ # define Z_HAS_TRAIT_ALIAS_type_to_member_pointer FALSE
743
+ # define Z_HAS_TRAIT_ALIAS_type_to_opaque FALSE
744
+ # define Z_HAS_TRAIT_ALIAS_type_to_pointer FALSE
745
+ # define Z_HAS_TRAIT_ALIAS_type_to_signed FALSE
746
+ # define Z_HAS_TRAIT_ALIAS_type_to_unqualified FALSE
747
+ # define Z_HAS_TRAIT_ALIAS_type_to_unsigned FALSE
748
+ # define Z_HAS_TRAIT_ALIAS_type_to_volatile FALSE
749
+ # define Z_HAS_TRAIT_ALIAS_type_to_wrap FALSE
750
+ #endif
751
+
752
+ #if Z_LANGUAGE_HAS(CPP, TEMPLATE_ALIAS) && \
753
+ Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
754
+
755
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_lvalue TRUE
756
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_rvalue TRUE
757
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_volatile_lvalue TRUE
758
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_volatile_rvalue TRUE
759
+ # define Z_HAS_TRAIT_ALIAS_type_add_lvalue TRUE
760
+ # define Z_HAS_TRAIT_ALIAS_type_add_rvalue TRUE
761
+ # define Z_HAS_TRAIT_ALIAS_type_add_volatile_lvalue TRUE
762
+ # define Z_HAS_TRAIT_ALIAS_type_add_volatile_rvalue TRUE
763
+ # define Z_HAS_TRAIT_ALIAS_type_remove_const_this TRUE
764
+ # define Z_HAS_TRAIT_ALIAS_type_remove_const_volatile_this TRUE
765
+ # define Z_HAS_TRAIT_ALIAS_type_remove_this TRUE
766
+ # define Z_HAS_TRAIT_ALIAS_type_remove_volatile_this TRUE
767
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_lvalue TRUE
768
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_rvalue TRUE
769
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_volatile_lvalue TRUE
770
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_volatile_rvalue TRUE
771
+ # define Z_HAS_TRAIT_ALIAS_type_to_lvalue TRUE
772
+ # define Z_HAS_TRAIT_ALIAS_type_to_rvalue TRUE
773
+ # define Z_HAS_TRAIT_ALIAS_type_to_volatile_lvalue TRUE
774
+ # define Z_HAS_TRAIT_ALIAS_type_to_volatile_rvalue TRUE
775
+ #else
776
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_lvalue TRUE
777
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_rvalue TRUE
778
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_volatile_lvalue TRUE
779
+ # define Z_HAS_TRAIT_ALIAS_type_add_const_volatile_rvalue TRUE
780
+ # define Z_HAS_TRAIT_ALIAS_type_add_lvalue TRUE
781
+ # define Z_HAS_TRAIT_ALIAS_type_add_rvalue TRUE
782
+ # define Z_HAS_TRAIT_ALIAS_type_add_volatile_lvalue TRUE
783
+ # define Z_HAS_TRAIT_ALIAS_type_add_volatile_rvalue TRUE
784
+ # define Z_HAS_TRAIT_ALIAS_type_remove_const_this TRUE
785
+ # define Z_HAS_TRAIT_ALIAS_type_remove_const_volatile_this TRUE
786
+ # define Z_HAS_TRAIT_ALIAS_type_remove_this TRUE
787
+ # define Z_HAS_TRAIT_ALIAS_type_remove_volatile_this TRUE
788
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_lvalue TRUE
789
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_rvalue TRUE
790
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_volatile_lvalue TRUE
791
+ # define Z_HAS_TRAIT_ALIAS_type_to_const_volatile_rvalue TRUE
792
+ # define Z_HAS_TRAIT_ALIAS_type_to_lvalue TRUE
793
+ # define Z_HAS_TRAIT_ALIAS_type_to_rvalue TRUE
794
+ # define Z_HAS_TRAIT_ALIAS_type_to_volatile_lvalue TRUE
795
+ # define Z_HAS_TRAIT_ALIAS_type_to_volatile_rvalue TRUE
796
+ #endif
797
+
798
+ #if Z_LANGUAGE_HAS(CPP, TEMPLATE_ALIAS) && Z_LANGUAGE_HAS(CPP, RVALUE_REFERENCE)
799
+ # define Z_HAS_TRAIT_ALIAS_type_add_rvalue_reference TRUE
800
+ # define Z_HAS_TRAIT_ALIAS_type_to_rvalue_reference TRUE
801
+ #else
802
+ # define Z_HAS_TRAIT_ALIAS_type_add_rvalue_reference FALSE
803
+ # define Z_HAS_TRAIT_ALIAS_type_to_rvalue_reference FALSE
804
+ #endif
805
+
806
+ #if Z_LANGUAGE_HAS(CPP, TEMPLATE_ALIAS) && Z_TRAIT_HAS(Type, parameters)
807
+ # define Z_HAS_TRAIT_ALIAS_type_parameters TRUE
808
+ #else
809
+ # define Z_HAS_TRAIT_ALIAS_type_parameters FALSE
810
+ #endif
811
+
812
+ #if Z_LANGUAGE_HAS(CPP, TEMPLATE_ALIAS) && Z_TRAIT_HAS(Type, underlying_type)
813
+ # define Z_HAS_TRAIT_ALIAS_type_underlying_type TRUE
814
+ #else
815
+ # define Z_HAS_TRAIT_ALIAS_type_underlying_type FALSE
816
+ #endif
817
+
818
+ // MARK: - Helpers
819
+
820
+ namespace Zeta {namespace Detail {namespace Type {namespace Helpers {
821
+
822
+ # if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
823
+
824
+ namespace {
825
+ template <class T, SInt L, Boolean B> struct IsComplete : False {};
826
+ template <class T, SInt L> struct IsComplete <T, L, !!sizeof(T)> : True {};
827
+ template <class T, SInt L, Boolean B> struct IsIncomplete : True {};
828
+ template <class T, SInt L> struct IsIncomplete<T, L, !!sizeof(T)> : False {};
829
+ }
830
+
831
+ template <class T, Boolean B> struct IsStructureOrUnion : False {};
832
+ template <class T> struct IsStructureOrUnion<T, !!sizeof(int (T::*))> : True {};
833
+
834
+ template <class T, Boolean B> struct IsUsableToCastNumber : False {};
835
+ template <class T> struct IsUsableToCastNumber<T, !!sizeof((T)1)> : True {};
836
+
837
+ # if Z_LANGUAGE_HAS_SPECIFIER(CPP, DECLARED_TYPE)
838
+
839
+ template <class T, class R> struct IsDefaultConstructible : False {};
840
+ template <class T> struct IsDefaultConstructible<T, decltype(T())> : True {};
841
+
842
+ template <class T> Z_INLINE T fake();
843
+
844
+ template <class T, class F, class R> struct IsFunctional : False {};
845
+ template <class T, class F, class R> struct IsFunctor : False {};
846
+
847
+ #if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE)
848
+
849
+ template <class T, class R, class... P> struct IsFunctional<T, R(P...), decltype(fake<T>() (fake<P>()...))> : True {};
850
+ template <class T, class R, class... P> struct IsFunctor <T, R(P...), decltype(fake<T>().operator()(fake<P>()...))> : True {};
851
+
852
+ # else
853
+
854
+ template <class T, class R> struct IsFunctional<T, R(), decltype(fake<T>() ())> : True {};
855
+ template <class T, class R> struct IsFunctor <T, R(), decltype(fake<T>().operator()())> : True {};
856
+
857
+ # define Z_TEMPLATE_FAKE_ARGUMENT(index) fake<P##index>()
858
+
859
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
860
+ \
861
+ template <class T, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct IsFunctional< \
862
+ T, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)), \
863
+ decltype(fake<T>()(Z_FOR_##parameter_count##_CALL_WITH_INDEX(Z_TEMPLATE_FAKE_ARGUMENT, Z_COMMA))) \
864
+ > : True {}; \
865
+ \
866
+ template <class T, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct IsFunctor< \
867
+ T, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)), \
868
+ decltype(fake<T>().operator()(Z_FOR_##parameter_count##_CALL_WITH_INDEX(Z_TEMPLATE_FAKE_ARGUMENT, Z_COMMA))) \
869
+ > : True {};
870
+
871
+ Z_FOR_32_CALL_WITH_TIME(Z_TEMPLATE_SPECIALIZATIONS, Z_EMPTY)
872
+ # undef Z_TEMPLATE_SPECIALIZATIONS
873
+ # undef Z_TEMPLATE_FAKE_ARGUMENT
874
+
875
+ # endif
876
+
877
+ # endif
878
+
879
+ # endif
880
+
881
+ template <class T> struct RemovePointer;
882
+ template <class T> struct RemovePointer<T*> {typedef T type;};
883
+ }}}}
884
+
885
+ // MARK: - Abstract
886
+
887
+ namespace Zeta {namespace Detail {namespace Type {namespace Abstract {
888
+
889
+ struct Invalid {
890
+ enum { is_arithmetic = false,
891
+ is_array = false,
892
+ is_callable = false,
893
+ is_char = false,
894
+ is_class = false,
895
+ is_const = false,
896
+ is_const_volatile = false,
897
+ is_data_member_pointer = false,
898
+ is_empty = false,
899
+ is_exact = false,
900
+ is_integer = false,
901
+ is_integral = false,
902
+ is_flexible_array = false,
903
+ is_function = false,
904
+ is_function_lvalue_reference = false,
905
+ is_function_pointer = false,
906
+ is_function_reference = false,
907
+ is_fundamental = false,
908
+ is_lvalue_reference = false,
909
+ is_member_function_pointer = false,
910
+ is_member_pointer = false,
911
+ is_nat = true,
912
+ is_natural = false,
913
+ is_number = false,
914
+ is_pointer = false,
915
+ is_qualified = false,
916
+ is_real = false,
917
+ is_reference = false,
918
+ is_scalar = false,
919
+ is_schar = false,
920
+ is_signed = false,
921
+ is_signed_or_unsigned = false,
922
+ is_simple = false,
923
+ is_sint = false,
924
+ is_slong = false,
925
+ is_sshort = false,
926
+ is_statically_allocatable = false,
927
+ is_storable = false,
928
+ is_structure = false,
929
+ is_structure_or_union = false,
930
+ is_uchar = false,
931
+ is_uint = false,
932
+ is_ulong = false,
933
+ is_unsigned = false,
934
+ is_ushort = false,
935
+ is_valid = false,
936
+ is_variadic = false,
937
+ is_variadic_function = false,
938
+ is_void = false,
939
+ is_void_pointer = false,
940
+ is_volatile = false
941
+ };
942
+
943
+ enum { arity = 0,
944
+ bits = 0,
945
+ element_count = 0,
946
+ pointer_level = 0,
947
+ size = 0
948
+ };
949
+
950
+ typedef NaT type;
951
+
952
+ typedef NaT add_const;
953
+ typedef NaT add_const_volatile;
954
+ typedef NaT add_lvalue_reference;
955
+ typedef NaT add_pointer;
956
+ typedef NaT add_volatile;
957
+ typedef NaT class_type;
958
+ typedef NaT element_type;
959
+ typedef NaT pointee_type;
960
+ typedef NaT referencee_type;
961
+ typedef NaT remove_const;
962
+ typedef NaT remove_const_volatile;
963
+ typedef NaT remove_pointer;
964
+ typedef NaT remove_reference;
965
+ typedef NaT remove_volatile;
966
+ typedef NaT return_type;
967
+ typedef NaT to_const;
968
+ typedef NaT to_const_volatile;
969
+ typedef NaT to_forwardable;
970
+ typedef NaT to_function;
971
+ typedef NaT to_lvalue_reference;
972
+ typedef NaT to_opaque;
973
+ typedef NaT to_pointer;
974
+ typedef NaT to_signed;
975
+ typedef NaT to_unqualified;
976
+ typedef NaT to_unsigned;
977
+ typedef NaT to_volatile;
978
+ typedef NaT to_wrap;
979
+
980
+ # if Z_TRAIT_HAS(Type, has_virtual_destructor)
981
+ enum {has_virtual_destructor = false};
982
+ # endif
983
+
984
+ # if Z_TRAIT_HAS(Type, is_abstract)
985
+ enum {is_abstract = false};
986
+ # endif
987
+
988
+ # if Z_TRAIT_HAS(Type, is_aggregate)
989
+ enum {is_aggregate = false};
990
+ # endif
991
+
992
+ # if Z_TRAIT_HAS(Type, is_boolean)
993
+ enum {is_boolean = false};
994
+ # endif
995
+
996
+ /*# if Z_TRAIT_HAS(Type, is_char16)
997
+ enum {is_char16 = false};
998
+ # endif
999
+
1000
+ # if Z_TRAIT_HAS(Type, is_char32)
1001
+ enum {is_char32 = false};
1002
+ # endif*/
1003
+
1004
+ # if Z_TRAIT_HAS(Type, is_default_constructible)
1005
+ enum {is_default_constructible = false};
1006
+ # endif
1007
+
1008
+ # if Z_TRAIT_HAS(Type, is_double)
1009
+ enum {is_double = false};
1010
+ # endif
1011
+
1012
+ # if Z_TRAIT_HAS(Type, is_enumeration)
1013
+ enum {is_enumeration = false};
1014
+ # endif
1015
+
1016
+ # if Z_TRAIT_HAS(Type, is_final)
1017
+ enum {is_final = false};
1018
+ # endif
1019
+
1020
+ # if Z_TRAIT_HAS(Type, is_float)
1021
+ enum {is_float = false};
1022
+ # endif
1023
+
1024
+ # if Z_TRAIT_HAS(Type, is_float16)
1025
+ enum {is_float16 = false};
1026
+ # endif
1027
+
1028
+ # if Z_TRAIT_HAS(Type, is_float32)
1029
+ enum {is_float32 = false};
1030
+ # endif
1031
+
1032
+ # if Z_TRAIT_HAS(Type, is_float64)
1033
+ enum {is_float64 = false};
1034
+ # endif
1035
+
1036
+ # if Z_TRAIT_HAS(Type, is_float128)
1037
+ enum {is_float128 = false};
1038
+ # endif
1039
+
1040
+ # if Z_TRAIT_HAS(Type, is_float80_x87)
1041
+ enum {is_float80_x87 = false};
1042
+ # endif
1043
+
1044
+ # if Z_TRAIT_HAS(Type, is_float96_x87)
1045
+ enum {is_float96_x87 = false};
1046
+ # endif
1047
+
1048
+ # if Z_TRAIT_HAS(Type, is_float128_x87)
1049
+ enum {is_float128_x87 = false};
1050
+ # endif
1051
+
1052
+ # if Z_TRAIT_HAS(Type, is_interface_class)
1053
+ enum {is_interface_class = false};
1054
+ # endif
1055
+
1056
+ # if Z_TRAIT_HAS(Type, is_ldouble)
1057
+ enum {is_ldouble = false};
1058
+ # endif
1059
+
1060
+ # if Z_TRAIT_HAS(Type, is_literal)
1061
+ enum {is_literal = false};
1062
+ # endif
1063
+
1064
+ # if Z_TRAIT_HAS(Type, is_null_pointer)
1065
+ enum {is_null_pointer = false};
1066
+ # endif
1067
+
1068
+ # if Z_TRAIT_HAS(Type, is_pod)
1069
+ enum {is_pod = false};
1070
+ # endif
1071
+
1072
+ # if Z_TRAIT_HAS(Type, is_polymorphic)
1073
+ enum {is_polymorphic = false};
1074
+ # endif
1075
+
1076
+ # if Z_TRAIT_HAS(Type, is_sint8)
1077
+ enum {is_sint8 = false};
1078
+ # endif
1079
+
1080
+ # if Z_TRAIT_HAS(Type, is_sint16)
1081
+ enum {is_sint16 = false};
1082
+ # endif
1083
+
1084
+ # if Z_TRAIT_HAS(Type, is_sint32)
1085
+ enum {is_sint32 = false};
1086
+ # endif
1087
+
1088
+ # if Z_TRAIT_HAS(Type, is_sint64)
1089
+ enum {is_sint64 = false};
1090
+ # endif
1091
+
1092
+ # if Z_TRAIT_HAS(Type, is_sint128)
1093
+ enum {is_sint128 = false};
1094
+ # endif
1095
+
1096
+ # if Z_TRAIT_HAS(Type, is_template)
1097
+ enum {is_template = false};
1098
+ # endif
1099
+
1100
+ # if Z_TRAIT_HAS(Type, is_trivially_copy_assignable)
1101
+ enum {is_trivially_copy_assignable = false};
1102
+ # endif
1103
+
1104
+ # if Z_TRAIT_HAS(Type, is_trivially_copy_constructible)
1105
+ enum {is_trivially_copy_constructible = false};
1106
+ # endif
1107
+
1108
+ # if Z_TRAIT_HAS(Type, is_trivially_copyable)
1109
+ enum {is_trivially_copyable = false};
1110
+ # endif
1111
+
1112
+ # if Z_TRAIT_HAS(Type, is_trivially_default_constructible)
1113
+ enum {is_trivially_default_constructible = false};
1114
+ # endif
1115
+
1116
+ # if Z_TRAIT_HAS(Type, is_trivially_destructible)
1117
+ enum {is_trivially_destructible = false};
1118
+ # endif
1119
+
1120
+ # if Z_TRAIT_HAS(Type, is_uint8)
1121
+ enum {is_uint8 = false};
1122
+ # endif
1123
+
1124
+ # if Z_TRAIT_HAS(Type, is_uint16)
1125
+ enum {is_uint16 = false};
1126
+ # endif
1127
+
1128
+ # if Z_TRAIT_HAS(Type, is_uint32)
1129
+ enum {is_uint32 = false};
1130
+ # endif
1131
+
1132
+ # if Z_TRAIT_HAS(Type, is_uint64)
1133
+ enum {is_uint64 = false};
1134
+ # endif
1135
+
1136
+ # if Z_TRAIT_HAS(Type, is_uint128)
1137
+ enum {is_uint128 = false};
1138
+ # endif
1139
+
1140
+ # if Z_TRAIT_HAS(Type, is_union)
1141
+ enum {is_union = false};
1142
+ # endif
1143
+
1144
+ /*# if Z_TRAIT_HAS(Type, is_wchar)
1145
+ enum {is_wchar = false};
1146
+ # endif*/
1147
+
1148
+ # if Z_LANGUAGE_INCLUDES(OBJECTIVE_CPP)
1149
+
1150
+ enum { is_objective_c_class = false,
1151
+ is_objective_c_class_pointer = false,
1152
+ is_objective_c_object = false,
1153
+ is_objective_c_object_pointer = false
1154
+ };
1155
+
1156
+ # if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
1157
+ enum { is_objective_c_instance = false,
1158
+ is_objective_c_instance_pointer = false
1159
+ };
1160
+ # endif
1161
+
1162
+ # endif
1163
+
1164
+ # ifdef Z_LLONG
1165
+ enum { is_sllong = false,
1166
+ is_ullong = false
1167
+ };
1168
+ # endif
1169
+
1170
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
1171
+
1172
+ enum { is_const_lvalue = false,
1173
+ is_const_rvalue = false,
1174
+ is_const_volatile_lvalue = false,
1175
+ is_const_volatile_rvalue = false,
1176
+ is_lvalue = false,
1177
+ is_rvalue = false,
1178
+ is_volatile_lvalue = false,
1179
+ is_volatile_rvalue = false
1180
+ };
1181
+
1182
+ typedef NaT add_const_lvalue;
1183
+ typedef NaT add_const_rvalue;
1184
+ typedef NaT add_const_volatile_lvalue;
1185
+ typedef NaT add_const_volatile_rvalue;
1186
+ typedef NaT add_lvalue;
1187
+ typedef NaT add_rvalue;
1188
+ typedef NaT add_volatile_lvalue;
1189
+ typedef NaT add_volatile_rvalue;
1190
+ typedef NaT remove_const_this;
1191
+ typedef NaT remove_const_volatile_this;
1192
+ typedef NaT remove_this;
1193
+ typedef NaT remove_volatile_this;
1194
+ typedef NaT to_const_lvalue;
1195
+ typedef NaT to_const_rvalue;
1196
+ typedef NaT to_const_volatile_lvalue;
1197
+ typedef NaT to_const_volatile_rvalue;
1198
+ typedef NaT to_lvalue;
1199
+ typedef NaT to_rvalue;
1200
+ typedef NaT to_volatile_lvalue;
1201
+ typedef NaT to_volatile_rvalue;
1202
+
1203
+ # endif
1204
+
1205
+ # if Z_LANGUAGE_HAS(CPP, RVALUE_REFERENCE)
1206
+
1207
+ enum { is_function_rvalue_reference = false,
1208
+ is_rvalue_reference = false
1209
+ };
1210
+
1211
+ typedef NaT add_rvalue_reference;
1212
+ typedef NaT to_rvalue_reference;
1213
+
1214
+ # endif
1215
+
1216
+ # if Z_TRAIT_HAS(Type, parameters)
1217
+ typedef NaT parameters;
1218
+ # endif
1219
+
1220
+ # if Z_TRAIT_HAS(Type, underlying_type)
1221
+ typedef NaT underlying_type;
1222
+ # endif
1223
+ };
1224
+
1225
+ struct Valid : Invalid {
1226
+ enum { is_nat = false,
1227
+ is_valid = true
1228
+ };
1229
+ };
1230
+
1231
+ struct Storable : Valid {
1232
+ enum {is_storable = true};
1233
+ };
1234
+
1235
+ struct Simple : Storable {
1236
+ enum { is_simple = true,
1237
+ is_statically_allocatable = true
1238
+ };
1239
+
1240
+ # if Z_TRAIT_HAS(Type, is_literal)
1241
+ enum {is_literal = true};
1242
+ # endif
1243
+
1244
+ # if Z_TRAIT_HAS(Type, is_trivially_copy_constructible)
1245
+ enum {is_trivially_copy_constructible = true};
1246
+ # endif
1247
+
1248
+ # if Z_TRAIT_HAS(Type, is_trivially_destructible)
1249
+ enum {is_trivially_destructible = true};
1250
+ # endif
1251
+
1252
+ //----------------------------------------------.
1253
+ // Unlike the standard C++ library, Z considers |
1254
+ // the following to be "true" for references: |
1255
+ //----------------------------------------------'
1256
+
1257
+ # if Z_TRAIT_HAS(Type, is_default_constructible)
1258
+ enum {is_default_constructible = true};
1259
+ # endif
1260
+
1261
+ # if Z_TRAIT_HAS(Type, is_trivially_copy_assignable)
1262
+ enum {is_trivially_copy_assignable = true};
1263
+ # endif
1264
+
1265
+ # if Z_TRAIT_HAS(Type, is_trivially_copyable)
1266
+ enum {is_trivially_copyable = true};
1267
+ # endif
1268
+
1269
+ # if Z_TRAIT_HAS(Type, is_trivially_default_constructible)
1270
+ enum {is_trivially_default_constructible = true};
1271
+ # endif
1272
+ };
1273
+
1274
+ struct Number : Simple {
1275
+ enum { is_arithmetic = true,
1276
+ is_fundamental = true,
1277
+ is_number = true,
1278
+ is_scalar = true
1279
+ };
1280
+
1281
+ # if Z_TRAIT_HAS(Type, is_pod)
1282
+ enum {is_pod = true};
1283
+ # endif
1284
+ };
1285
+
1286
+ struct Integral : Number {
1287
+ enum { is_exact = true,
1288
+ is_integral = true,
1289
+ };
1290
+ };
1291
+
1292
+ struct Natural : Integral {
1293
+ enum { is_natural = true,
1294
+ is_unsigned = true,
1295
+ is_signed_or_unsigned = true
1296
+ };
1297
+ enum {number_set = Z_NUMBER_SET_N};
1298
+ enum {minimum = 0};
1299
+ };
1300
+
1301
+ struct Integer : Integral {
1302
+ enum { is_integer = true,
1303
+ is_signed = true,
1304
+ is_signed_or_unsigned = true
1305
+ };
1306
+ enum {number_set = Z_NUMBER_SET_Z};
1307
+ };
1308
+
1309
+ struct Real : Number {
1310
+ enum { is_real = true,
1311
+ is_signed = true,
1312
+ is_signed_or_unsigned = true
1313
+ };
1314
+ enum {number_set = Z_NUMBER_SET_R};
1315
+ };
1316
+
1317
+ struct PointerLike : Simple {
1318
+ enum {is_scalar = true};
1319
+
1320
+ # if Z_TRAIT_HAS(Type, is_pod)
1321
+ enum {is_pod = true};
1322
+ # endif
1323
+ };
1324
+
1325
+ # if Z_TRAIT_HAS(Type, is_uint8)
1326
+
1327
+ struct UInt8 : Natural {
1328
+ enum {is_uint8 = true};
1329
+
1330
+ enum { value_type = Z_UINT8_VALUE_TYPE,
1331
+ fixed_value_type = Z_UINT8_FIXED_VALUE_TYPE,
1332
+ value_format = Z_UINT8_VALUE_FORMAT
1333
+ };
1334
+ enum {maximum = Z_UINT8_MAXIMUM};
1335
+
1336
+ typedef zuint8 type;
1337
+ typedef zuint8 to_unsigned;
1338
+ typedef zsint8 to_signed;
1339
+ };
1340
+
1341
+ # endif
1342
+
1343
+ # if Z_TRAIT_HAS(Type, is_sint8)
1344
+
1345
+ struct SInt8 : Integer {
1346
+ enum {is_sint8 = true};
1347
+
1348
+ enum { value_type = Z_SINT8_VALUE_TYPE,
1349
+ fixed_value_type = Z_SINT8_FIXED_VALUE_TYPE,
1350
+ value_format = Z_SINT8_VALUE_FORMAT
1351
+ };
1352
+ enum { minimum = Z_SINT8_MINIMUM,
1353
+ maximum = Z_SINT8_MAXIMUM
1354
+ };
1355
+
1356
+ typedef zsint8 type;
1357
+ typedef zuint8 to_unsigned;
1358
+ typedef zsint8 to_signed;
1359
+ };
1360
+
1361
+ # endif
1362
+
1363
+ # if Z_TRAIT_HAS(Type, is_uint16)
1364
+
1365
+ struct UInt16 : Natural {
1366
+ enum {is_uint16 = true};
1367
+
1368
+ enum { value_type = Z_UINT16_VALUE_TYPE,
1369
+ fixed_value_type = Z_UINT16_FIXED_VALUE_TYPE,
1370
+ value_format = Z_UINT16_VALUE_FORMAT
1371
+ };
1372
+ enum {maximum = Z_UINT16_MAXIMUM};
1373
+
1374
+ typedef zuint16 type;
1375
+ typedef zuint16 to_unsigned;
1376
+ typedef zsint16 to_signed;
1377
+ };
1378
+
1379
+ # endif
1380
+
1381
+ # if Z_TRAIT_HAS(Type, is_sint16)
1382
+
1383
+ struct SInt16 : Integer {
1384
+ enum {is_sint16 = true};
1385
+
1386
+ enum { value_type = Z_SINT16_VALUE_TYPE,
1387
+ fixed_value_type = Z_SINT16_FIXED_VALUE_TYPE,
1388
+ value_format = Z_SINT16_VALUE_FORMAT
1389
+ };
1390
+ enum { minimum = Z_SINT16_MINIMUM,
1391
+ maximum = Z_SINT16_MAXIMUM
1392
+ };
1393
+
1394
+ typedef zsint16 type;
1395
+ typedef zuint16 to_unsigned;
1396
+ typedef zsint16 to_signed;
1397
+ };
1398
+
1399
+ # endif
1400
+
1401
+ # if Z_TRAIT_HAS(Type, is_uint32)
1402
+
1403
+ struct UInt32 : Natural {
1404
+ enum {is_uint32 = true};
1405
+
1406
+ enum { value_type = Z_UINT32_VALUE_TYPE,
1407
+ fixed_value_type = Z_UINT32_FIXED_VALUE_TYPE,
1408
+ value_format = Z_UINT32_VALUE_FORMAT
1409
+ };
1410
+ enum {maximum = Z_UINT32_MAXIMUM};
1411
+
1412
+ typedef zuint32 type;
1413
+ typedef zuint32 to_unsigned;
1414
+ typedef zsint32 to_signed;
1415
+ };
1416
+
1417
+ # endif
1418
+
1419
+ # if Z_TRAIT_HAS(Type, is_sint32)
1420
+
1421
+ struct SInt32 : Integer {
1422
+ enum {is_sint32 = true};
1423
+
1424
+ enum { value_type = Z_SINT16_VALUE_TYPE,
1425
+ fixed_value_type = Z_SINT16_FIXED_VALUE_TYPE,
1426
+ value_format = Z_SINT16_VALUE_FORMAT
1427
+ };
1428
+ enum { minimum = Z_SINT32_MINIMUM,
1429
+ maximum = Z_SINT32_MAXIMUM
1430
+ };
1431
+
1432
+ typedef zsint32 type;
1433
+ typedef zuint32 to_unsigned;
1434
+ typedef zsint32 to_signed;
1435
+ };
1436
+
1437
+ # endif
1438
+
1439
+ # if Z_TRAIT_HAS(Type, is_uint64)
1440
+
1441
+ struct UInt64 : Natural {
1442
+ enum {is_uint64 = true};
1443
+
1444
+ enum { value_type = Z_UINT64_VALUE_TYPE,
1445
+ fixed_value_type = Z_UINT64_FIXED_VALUE_TYPE,
1446
+ value_format = Z_UINT64_VALUE_FORMAT
1447
+ };
1448
+ enum {maximum = Z_UINT64_MAXIMUM};
1449
+
1450
+ typedef zuint64 type;
1451
+ typedef zuint64 to_unsigned;
1452
+
1453
+ # ifdef Z_SINT64
1454
+ typedef zsint64 to_signed;
1455
+ # endif
1456
+ };
1457
+
1458
+ # endif
1459
+
1460
+ # if Z_TRAIT_HAS(Type, is_sint64)
1461
+
1462
+ struct SInt64 : Integer {
1463
+ enum {is_sint64 = true};
1464
+
1465
+ enum { value_type = Z_SINT64_VALUE_TYPE,
1466
+ fixed_value_type = Z_SINT64_FIXED_VALUE_TYPE,
1467
+ value_format = Z_SINT64_VALUE_FORMAT
1468
+ };
1469
+ enum { minimum = Z_SINT64_MINIMUM,
1470
+ maximum = Z_SINT64_MAXIMUM
1471
+ };
1472
+
1473
+ typedef zsint64 type;
1474
+ typedef zsint64 to_signed;
1475
+
1476
+ # ifdef Z_UINT64
1477
+ typedef zuint64 to_unsigned;
1478
+ # endif
1479
+ };
1480
+
1481
+ # endif
1482
+
1483
+ # if Z_TRAIT_HAS(Type, is_uint128)
1484
+
1485
+ struct UInt128 : Natural {
1486
+ enum {is_uint128 = true};
1487
+
1488
+ enum { value_type = Z_UINT128_VALUE_TYPE,
1489
+ fixed_value_type = Z_UINT128_FIXED_VALUE_TYPE,
1490
+ value_format = Z_UINT128_VALUE_FORMAT
1491
+ };
1492
+ enum {maximum = Z_UINT128_MAXIMUM};
1493
+
1494
+ typedef zuint128 type;
1495
+ typedef zuint128 to_unsigned;
1496
+
1497
+ # ifdef Z_SINT128
1498
+ typedef zsint128 to_signed;
1499
+ # endif
1500
+ };
1501
+
1502
+ # endif
1503
+
1504
+ # if Z_TRAIT_HAS(Type, is_sint128)
1505
+
1506
+ struct SInt128 : Integer {
1507
+ enum {is_sint128 = true};
1508
+
1509
+ enum { value_type = Z_SINT128_VALUE_TYPE,
1510
+ fixed_value_type = Z_SINT128_FIXED_VALUE_TYPE,
1511
+ value_format = Z_SINT128_VALUE_FORMAT
1512
+ };
1513
+ enum { minimum = Z_SINT128_MINIMUM,
1514
+ maximum = Z_SINT128_MAXIMUM
1515
+ };
1516
+
1517
+ typedef zsint128 type;
1518
+ typedef zsint128 to_signed;
1519
+
1520
+ # ifdef Z_UINT128
1521
+ typedef zuint128 to_unsigned;
1522
+ # endif
1523
+ };
1524
+
1525
+ # endif
1526
+
1527
+ # if Z_TRAIT_HAS(Type, is_float16)
1528
+
1529
+ struct Float16 : Real {
1530
+ enum {is_float16 = true};
1531
+
1532
+ enum { value_type = Z_FLOAT16_VALUE_TYPE,
1533
+ fixed_value_type = Z_FLOAT16_FIXED_VALUE_TYPE,
1534
+ value_format = Z_FLOAT16_VALUE_FORMAT
1535
+ };
1536
+ enum { bias = Z_FLOAT16_BIAS,
1537
+ decimal_digits = Z_FLOAT16_DECIMAL_DIGITS,
1538
+ significand_offset = Z_FLOAT16_SIGNIFICAND_OFFSET,
1539
+ significand_bits = Z_FLOAT16_SIGNIFICAND_BITS,
1540
+ significand_digits = Z_FLOAT16_SIGNIFICAND_DIGITS,
1541
+ exponent_offset = Z_FLOAT16_EXPONENT_OFFSET,
1542
+ exponent_bits = Z_FLOAT16_EXPONENT_BITS,
1543
+ exponent_radix = Z_FLOAT16_EXPONENT_RADIX,
1544
+ sign_offset = Z_FLOAT16_SIGN_OFFSET,
1545
+ sign_bits = Z_FLOAT16_SIGN_BITS
1546
+ };
1547
+ enum { exponent_minimum = Z_FLOAT16_EXPONENT_MINIMUM,
1548
+ exponent_maximum = Z_FLOAT16_EXPONENT_MAXIMUM,
1549
+ exponent_10_minimum = Z_FLOAT16_EXPONENT_10_MINIMUM,
1550
+ exponent_10_maximum = Z_FLOAT16_EXPONENT_10_MAXIMUM
1551
+ };
1552
+
1553
+ static Z_CT(CPP11) zfloat16 epsilon () {return Z_FLOAT16_EPSILON;}
1554
+ static Z_CT(CPP11) zfloat16 minimum () {return Z_FLOAT16_MINIMUM;}
1555
+ static Z_CT(CPP11) zfloat16 maximum () {return Z_FLOAT16_MAXIMUM;}
1556
+ /* static Z_CT(CPP11) zfloat16 infinity() Z_NO_EXCEPTION {return Z_FLOAT16_INFINITY;}
1557
+ static Z_CT(CPP11) zfloat16 nan () Z_NO_EXCEPTION {return Z_FLOAT16_NAN;}*/
1558
+
1559
+ typedef zfloat16 type;
1560
+ typedef zfloat16 to_signed;
1561
+ };
1562
+
1563
+ # endif
1564
+
1565
+ # if Z_TRAIT_HAS(Type, is_float32)
1566
+
1567
+ struct Float32 : Real {
1568
+ enum {is_float32 = true};
1569
+
1570
+ enum { value_type = Z_FLOAT32_VALUE_TYPE,
1571
+ fixed_value_type = Z_FLOAT32_FIXED_VALUE_TYPE,
1572
+ value_format = Z_FLOAT32_VALUE_FORMAT
1573
+ };
1574
+ enum { bias = Z_FLOAT32_BIAS,
1575
+ decimal_digits = Z_FLOAT32_DECIMAL_DIGITS,
1576
+ significand_offset = Z_FLOAT32_SIGNIFICAND_OFFSET,
1577
+ significand_bits = Z_FLOAT32_SIGNIFICAND_BITS,
1578
+ significand_digits = Z_FLOAT32_SIGNIFICAND_DIGITS,
1579
+ exponent_offset = Z_FLOAT32_EXPONENT_OFFSET,
1580
+ exponent_bits = Z_FLOAT32_EXPONENT_BITS,
1581
+ exponent_radix = Z_FLOAT32_EXPONENT_RADIX,
1582
+ sign_offset = Z_FLOAT32_SIGN_OFFSET,
1583
+ sign_bits = Z_FLOAT32_SIGN_BITS
1584
+ };
1585
+ enum { exponent_minimum = Z_FLOAT32_EXPONENT_MINIMUM,
1586
+ exponent_maximum = Z_FLOAT32_EXPONENT_MAXIMUM,
1587
+ exponent_10_minimum = Z_FLOAT32_EXPONENT_10_MINIMUM,
1588
+ exponent_10_maximum = Z_FLOAT32_EXPONENT_10_MAXIMUM
1589
+ };
1590
+
1591
+ static Z_CT(CPP11) zfloat32 epsilon () {return Z_FLOAT32_EPSILON;}
1592
+ static Z_CT(CPP11) zfloat32 minimum () {return Z_FLOAT32_MINIMUM;}
1593
+ static Z_CT(CPP11) zfloat32 maximum () {return Z_FLOAT32_MAXIMUM;}
1594
+ /* static Z_CT(CPP11) zfloat32 infinity() Z_NO_EXCEPTION {return Z_FLOAT32_INFINITY;}
1595
+ static Z_CT(CPP11) zfloat32 nan () Z_NO_EXCEPTION {return Z_FLOAT32_NAN;}*/
1596
+
1597
+ typedef zfloat32 type;
1598
+ typedef zfloat32 to_signed;
1599
+ };
1600
+
1601
+ # endif
1602
+
1603
+ # if Z_TRAIT_HAS(Type, is_float64)
1604
+
1605
+ struct Float64 : Real {
1606
+ enum {is_float64 = true};
1607
+
1608
+ enum { value_type = Z_FLOAT64_VALUE_TYPE,
1609
+ fixed_value_type = Z_FLOAT64_FIXED_VALUE_TYPE,
1610
+ value_format = Z_FLOAT64_VALUE_FORMAT
1611
+ };
1612
+ enum { bias = Z_FLOAT64_BIAS,
1613
+ decimal_digits = Z_FLOAT64_DECIMAL_DIGITS,
1614
+ significand_offset = Z_FLOAT64_SIGNIFICAND_OFFSET,
1615
+ significand_bits = Z_FLOAT64_SIGNIFICAND_BITS,
1616
+ significand_digits = Z_FLOAT64_SIGNIFICAND_DIGITS,
1617
+ exponent_offset = Z_FLOAT64_EXPONENT_OFFSET,
1618
+ exponent_bits = Z_FLOAT64_EXPONENT_BITS,
1619
+ exponent_radix = Z_FLOAT64_EXPONENT_RADIX,
1620
+ sign_offset = Z_FLOAT64_SIGN_OFFSET,
1621
+ sign_bits = Z_FLOAT64_SIGN_BITS
1622
+ };
1623
+ enum { exponent_minimum = Z_FLOAT64_EXPONENT_MINIMUM,
1624
+ exponent_maximum = Z_FLOAT64_EXPONENT_MAXIMUM,
1625
+ exponent_10_minimum = Z_FLOAT64_EXPONENT_10_MINIMUM,
1626
+ exponent_10_maximum = Z_FLOAT64_EXPONENT_10_MAXIMUM
1627
+ };
1628
+
1629
+ static Z_CT(CPP11) zfloat64 epsilon () {return Z_FLOAT64_EPSILON;}
1630
+ static Z_CT(CPP11) zfloat64 minimum () {return Z_FLOAT64_MINIMUM;}
1631
+ static Z_CT(CPP11) zfloat64 maximum () {return Z_FLOAT64_MAXIMUM;}
1632
+ /* static Z_CT(CPP11) zfloat64 infinity() Z_NO_EXCEPTION {return Z_FLOAT64_INFINITY;}
1633
+ static Z_CT(CPP11) zfloat64 nan () Z_NO_EXCEPTION {return Z_FLOAT64_NAN;}*/
1634
+
1635
+ typedef zfloat64 type;
1636
+ typedef zfloat64 to_signed;
1637
+ };
1638
+
1639
+ # endif
1640
+
1641
+ # if Z_TRAIT_HAS(Type, is_float128)
1642
+
1643
+ struct Float128 : Real {
1644
+ enum {is_float128 = true};
1645
+
1646
+ enum { value_type = Z_FLOAT128_VALUE_TYPE,
1647
+ fixed_value_type = Z_FLOAT128_FIXED_VALUE_TYPE,
1648
+ value_format = Z_FLOAT128_VALUE_FORMAT
1649
+ };
1650
+ enum { bias = Z_FLOAT128_BIAS,
1651
+ decimal_digits = Z_FLOAT128_DECIMAL_DIGITS,
1652
+ significand_offset = Z_FLOAT128_SIGNIFICAND_OFFSET,
1653
+ significand_bits = Z_FLOAT128_SIGNIFICAND_BITS,
1654
+ significand_digits = Z_FLOAT128_SIGNIFICAND_DIGITS,
1655
+ exponent_offset = Z_FLOAT128_EXPONENT_OFFSET,
1656
+ exponent_bits = Z_FLOAT128_EXPONENT_BITS,
1657
+ exponent_radix = Z_FLOAT128_EXPONENT_RADIX,
1658
+ sign_offset = Z_FLOAT128_SIGN_OFFSET,
1659
+ sign_bits = Z_FLOAT128_SIGN_BITS
1660
+ };
1661
+ enum { exponent_minimum = Z_FLOAT128_EXPONENT_MINIMUM,
1662
+ exponent_maximum = Z_FLOAT128_EXPONENT_MAXIMUM,
1663
+ exponent_10_minimum = Z_FLOAT128_EXPONENT_10_MINIMUM,
1664
+ exponent_10_maximum = Z_FLOAT128_EXPONENT_10_MAXIMUM
1665
+ };
1666
+
1667
+ static Z_CT(CPP11) zfloat128 epsilon () {return Z_FLOAT128_EPSILON;}
1668
+ static Z_CT(CPP11) zfloat128 minimum () {return Z_FLOAT128_MINIMUM;}
1669
+ static Z_CT(CPP11) zfloat128 maximum () {return Z_FLOAT128_MAXIMUM;}
1670
+ /* static Z_CT(CPP11) zfloat128 infinity() Z_NO_EXCEPTION {return Z_FLOAT128_INFINITY;}
1671
+ static Z_CT(CPP11) zfloat128 nan () Z_NO_EXCEPTION {return Z_FLOAT128_NAN;}*/
1672
+
1673
+ typedef zfloat128 type;
1674
+ typedef zfloat128 to_signed;
1675
+ };
1676
+
1677
+ # endif
1678
+
1679
+ # if Z_TRAIT_HAS(Type, is_float80_x87)
1680
+
1681
+ struct Float80_x87 : Real {
1682
+ enum {is_float80_x87 = true};
1683
+
1684
+ enum { value_type = Z_FLOAT80_X87_VALUE_TYPE,
1685
+ fixed_value_type = Z_FLOAT80_X87_FIXED_VALUE_TYPE,
1686
+ value_format = Z_FLOAT80_X87_VALUE_FORMAT
1687
+ };
1688
+ enum { bias = Z_FLOAT80_X87_BIAS,
1689
+ decimal_digits = Z_FLOAT80_X87_DECIMAL_DIGITS,
1690
+ significand_offset = Z_FLOAT80_X87_SIGNIFICAND_OFFSET,
1691
+ significand_bits = Z_FLOAT80_X87_SIGNIFICAND_BITS,
1692
+ significand_digits = Z_FLOAT80_X87_SIGNIFICAND_DIGITS,
1693
+ exponent_offset = Z_FLOAT80_X87_EXPONENT_OFFSET,
1694
+ exponent_bits = Z_FLOAT80_X87_EXPONENT_BITS,
1695
+ exponent_radix = Z_FLOAT80_X87_EXPONENT_RADIX,
1696
+ sign_offset = Z_FLOAT80_X87_SIGN_OFFSET,
1697
+ sign_bits = Z_FLOAT80_X87_SIGN_BITS
1698
+ };
1699
+ enum { exponent_minimum = Z_FLOAT80_X87_EXPONENT_MINIMUM,
1700
+ exponent_maximum = Z_FLOAT80_X87_EXPONENT_MAXIMUM,
1701
+ exponent_10_minimum = Z_FLOAT80_X87_EXPONENT_10_MINIMUM,
1702
+ exponent_10_maximum = Z_FLOAT80_X87_EXPONENT_10_MAXIMUM
1703
+ };
1704
+
1705
+ static Z_CT(CPP11) zfloat80_x87 epsilon () {return Z_FLOAT80_X87_EPSILON;}
1706
+ static Z_CT(CPP11) zfloat80_x87 minimum () {return Z_FLOAT80_X87_MINIMUM;}
1707
+ static Z_CT(CPP11) zfloat80_x87 maximum () {return Z_FLOAT80_X87_MAXIMUM;}
1708
+ /* static Z_CT(CPP11) zfloat80_x87 infinity() Z_NO_EXCEPTION {return Z_FLOAT80_X87_INFINITY;}
1709
+ static Z_CT(CPP11) zfloat80_x87 nan () Z_NO_EXCEPTION {return Z_FLOAT80_X87_NAN;}*/
1710
+
1711
+ typedef zfloat80_x87 type;
1712
+ typedef zfloat80_x87 to_signed;
1713
+ };
1714
+
1715
+ # endif
1716
+
1717
+ # if Z_TRAIT_HAS(Type, is_float96_x87)
1718
+
1719
+ struct Float96_x87 : Real {
1720
+ enum {is_float96_x87 = true};
1721
+
1722
+ enum { value_type = Z_FLOAT96_X87_VALUE_TYPE,
1723
+ fixed_value_type = Z_FLOAT96_X87_FIXED_VALUE_TYPE,
1724
+ value_format = Z_FLOAT96_X87_VALUE_FORMAT
1725
+ };
1726
+ enum { bias = Z_FLOAT96_X87_BIAS,
1727
+ decimal_digits = Z_FLOAT96_X87_DECIMAL_DIGITS,
1728
+ significand_offset = Z_FLOAT96_X87_SIGNIFICAND_OFFSET,
1729
+ significand_bits = Z_FLOAT96_X87_SIGNIFICAND_BITS,
1730
+ significand_digits = Z_FLOAT96_X87_SIGNIFICAND_DIGITS,
1731
+ exponent_offset = Z_FLOAT96_X87_EXPONENT_OFFSET,
1732
+ exponent_bits = Z_FLOAT96_X87_EXPONENT_BITS,
1733
+ exponent_radix = Z_FLOAT96_X87_EXPONENT_RADIX,
1734
+ sign_offset = Z_FLOAT96_X87_SIGN_OFFSET,
1735
+ sign_bits = Z_FLOAT96_X87_SIGN_BITS
1736
+ };
1737
+ enum { exponent_minimum = Z_FLOAT96_X87_EXPONENT_MINIMUM,
1738
+ exponent_maximum = Z_FLOAT96_X87_EXPONENT_MAXIMUM,
1739
+ exponent_10_minimum = Z_FLOAT96_X87_EXPONENT_10_MINIMUM,
1740
+ exponent_10_maximum = Z_FLOAT96_X87_EXPONENT_10_MAXIMUM
1741
+ };
1742
+
1743
+ static Z_CT(CPP11) zfloat96_x87 epsilon () {return Z_FLOAT96_X87_EPSILON;}
1744
+ static Z_CT(CPP11) zfloat96_x87 minimum () {return Z_FLOAT96_X87_MINIMUM;}
1745
+ static Z_CT(CPP11) zfloat96_x87 maximum () {return Z_FLOAT96_X87_MAXIMUM;}
1746
+ /* static Z_CT(CPP11) zfloat96_x87 infinity() Z_NO_EXCEPTION {return Z_FLOAT96_X87_INFINITY;}
1747
+ static Z_CT(CPP11) zfloat96_x87 nan () Z_NO_EXCEPTION {return Z_FLOAT96_X87_NAN;}*/
1748
+
1749
+ typedef zfloat96_x87 type;
1750
+ typedef zfloat96_x87 to_signed;
1751
+ };
1752
+
1753
+ # endif
1754
+
1755
+ # if Z_TRAIT_HAS(Type, is_float128_x87)
1756
+
1757
+ struct Float128_x87 : Real {
1758
+ enum {is_float128_x87 = true};
1759
+
1760
+ enum { value_type = Z_FLOAT128_X87_VALUE_TYPE,
1761
+ fixed_value_type = Z_FLOAT128_X87_FIXED_VALUE_TYPE,
1762
+ value_format = Z_FLOAT128_X87_VALUE_FORMAT
1763
+ };
1764
+ enum { bias = Z_FLOAT128_X87_BIAS,
1765
+ decimal_digits = Z_FLOAT128_X87_DECIMAL_DIGITS,
1766
+ significand_offset = Z_FLOAT128_X87_SIGNIFICAND_OFFSET,
1767
+ significand_bits = Z_FLOAT128_X87_SIGNIFICAND_BITS,
1768
+ significand_digits = Z_FLOAT128_X87_SIGNIFICAND_DIGITS,
1769
+ exponent_offset = Z_FLOAT128_X87_EXPONENT_OFFSET,
1770
+ exponent_bits = Z_FLOAT128_X87_EXPONENT_BITS,
1771
+ exponent_radix = Z_FLOAT128_X87_EXPONENT_RADIX,
1772
+ sign_offset = Z_FLOAT128_X87_SIGN_OFFSET,
1773
+ sign_bits = Z_FLOAT128_X87_SIGN_BITS
1774
+ };
1775
+ enum { exponent_minimum = Z_FLOAT128_X87_EXPONENT_MINIMUM,
1776
+ exponent_maximum = Z_FLOAT128_X87_EXPONENT_MAXIMUM,
1777
+ exponent_10_minimum = Z_FLOAT128_X87_EXPONENT_10_MINIMUM,
1778
+ exponent_10_maximum = Z_FLOAT128_X87_EXPONENT_10_MAXIMUM
1779
+ };
1780
+
1781
+ static Z_CT(CPP11) zfloat128_x87 epsilon () {return Z_FLOAT128_X87_EPSILON;}
1782
+ static Z_CT(CPP11) zfloat128_x87 minimum () {return Z_FLOAT128_X87_MINIMUM;}
1783
+ static Z_CT(CPP11) zfloat128_x87 maximum () {return Z_FLOAT128_X87_MAXIMUM;}
1784
+ /* static Z_CT(CPP11) zfloat128_x87 infinity() Z_NO_EXCEPTION {return Z_FLOAT128_X87_INFINITY;}
1785
+ static Z_CT(CPP11) zfloat128_x87 nan () Z_NO_EXCEPTION {return Z_FLOAT128_X87_NAN;}*/
1786
+
1787
+ typedef zfloat128_x87 type;
1788
+ typedef zfloat128_x87 to_signed;
1789
+ };
1790
+
1791
+ # endif
1792
+
1793
+ struct Void : Valid {
1794
+ enum { is_fundamental = true,
1795
+ is_void = true
1796
+ };
1797
+
1798
+ # if Z_TRAIT_HAS(Type, is_literal)
1799
+ enum {is_literal = true};
1800
+ # endif
1801
+
1802
+ typedef void type;
1803
+ };
1804
+
1805
+ struct Char : TernaryType<Z_CHAR_IS_SIGNED, Integer, Natural>::type {
1806
+ enum {is_char = true};
1807
+
1808
+ enum { value_type = Z_CHAR_VALUE_TYPE,
1809
+ fixed_value_type = Z_CHAR_FIXED_VALUE_TYPE,
1810
+ value_format = Z_CHAR_VALUE_FORMAT
1811
+ };
1812
+ enum { minimum = Z_CHAR_MINIMUM,
1813
+ maximum = Z_CHAR_MAXIMUM
1814
+ };
1815
+
1816
+ typedef zchar type;
1817
+ typedef zuchar to_unsigned;
1818
+ typedef zschar to_signed;
1819
+ };
1820
+
1821
+ struct UChar : Natural {
1822
+ enum {is_uchar = true};
1823
+
1824
+ enum { value_type = Z_UCHAR_VALUE_TYPE,
1825
+ fixed_value_type = Z_UCHAR_FIXED_VALUE_TYPE,
1826
+ value_format = Z_UCHAR_VALUE_FORMAT
1827
+ };
1828
+ enum {maximum = Z_UCHAR_MAXIMUM};
1829
+
1830
+ typedef zuchar type;
1831
+ typedef zuchar to_unsigned;
1832
+ typedef zschar to_signed;
1833
+ };
1834
+
1835
+ struct SChar : Integer {
1836
+ enum {is_schar = true};
1837
+
1838
+ enum { value_type = Z_SCHAR_VALUE_TYPE,
1839
+ fixed_value_type = Z_SCHAR_FIXED_VALUE_TYPE,
1840
+ value_format = Z_SCHAR_VALUE_FORMAT
1841
+ };
1842
+ enum { minimum = Z_SCHAR_MINIMUM,
1843
+ maximum = Z_SCHAR_MAXIMUM
1844
+ };
1845
+
1846
+ typedef zschar type;
1847
+ typedef zuchar to_unsigned;
1848
+ typedef zschar to_signed;
1849
+ };
1850
+
1851
+ struct UShort : Natural {
1852
+ enum {is_ushort = true};
1853
+
1854
+ enum { value_type = Z_USHORT_VALUE_TYPE,
1855
+ fixed_value_type = Z_USHORT_FIXED_VALUE_TYPE,
1856
+ value_format = Z_USHORT_VALUE_FORMAT
1857
+ };
1858
+ enum {maximum = Z_USHORT_MAXIMUM};
1859
+
1860
+ typedef zushort type;
1861
+ typedef zushort to_unsigned;
1862
+ typedef zsshort to_signed;
1863
+ };
1864
+
1865
+ struct SShort : Integer {
1866
+ enum {is_sshort = true};
1867
+
1868
+ enum { value_type = Z_SSHORT_VALUE_TYPE,
1869
+ fixed_value_type = Z_SSHORT_FIXED_VALUE_TYPE,
1870
+ value_format = Z_SSHORT_VALUE_FORMAT
1871
+ };
1872
+ enum { minimum = Z_SSHORT_MINIMUM,
1873
+ maximum = Z_SSHORT_MAXIMUM
1874
+ };
1875
+
1876
+ typedef zsshort type;
1877
+ typedef zushort to_unsigned;
1878
+ typedef zsshort to_signed;
1879
+ };
1880
+
1881
+ struct UInt : Natural {
1882
+ enum {is_uint = true};
1883
+
1884
+ enum { value_type = Z_UINT_VALUE_TYPE,
1885
+ fixed_value_type = Z_UINT_FIXED_VALUE_TYPE,
1886
+ value_format = Z_UINT_VALUE_FORMAT
1887
+ };
1888
+ enum {maximum = Z_UINT_MAXIMUM};
1889
+
1890
+ typedef zuint type;
1891
+ typedef zuint to_unsigned;
1892
+ typedef zsint to_signed;
1893
+ };
1894
+
1895
+ struct SInt : Integer {
1896
+ enum {is_sint = true};
1897
+
1898
+ enum { value_type = Z_SINT_VALUE_TYPE,
1899
+ fixed_value_type = Z_SINT_FIXED_VALUE_TYPE,
1900
+ value_format = Z_SINT_VALUE_FORMAT
1901
+ };
1902
+ enum { minimum = Z_SINT_MINIMUM,
1903
+ maximum = Z_SINT_MAXIMUM
1904
+ };
1905
+
1906
+ typedef zsint type;
1907
+ typedef zuint to_unsigned;
1908
+ typedef zsint to_signed;
1909
+ };
1910
+
1911
+ struct ULong : Natural {
1912
+ enum {is_ulong = true};
1913
+
1914
+ enum { value_type = Z_ULONG_VALUE_TYPE,
1915
+ fixed_value_type = Z_ULONG_FIXED_VALUE_TYPE,
1916
+ value_format = Z_ULONG_VALUE_FORMAT
1917
+ };
1918
+ enum {maximum = Z_ULONG_MAXIMUM};
1919
+
1920
+ typedef zulong type;
1921
+ typedef zulong to_unsigned;
1922
+ typedef zslong to_signed;
1923
+
1924
+ };
1925
+
1926
+ struct SLong : Integer {
1927
+ enum {is_slong = true};
1928
+
1929
+ enum { value_type = Z_SLONG_VALUE_TYPE,
1930
+ fixed_value_type = Z_SLONG_FIXED_VALUE_TYPE,
1931
+ value_format = Z_SLONG_VALUE_FORMAT
1932
+ };
1933
+ enum { minimum = Z_SLONG_MINIMUM,
1934
+ maximum = Z_SLONG_MAXIMUM
1935
+ };
1936
+
1937
+ typedef zslong type;
1938
+ typedef zulong to_unsigned;
1939
+ typedef zslong to_signed;
1940
+ };
1941
+
1942
+ # ifdef Z_LLONG
1943
+
1944
+ struct ULLong : Natural {
1945
+ enum {is_ullong = true};
1946
+
1947
+ enum { value_type = Z_ULLONG_VALUE_TYPE,
1948
+ fixed_value_type = Z_ULLONG_FIXED_VALUE_TYPE,
1949
+ value_format = Z_ULLONG_VALUE_FORMAT
1950
+ };
1951
+ enum {maximum = Z_ULLONG_MAXIMUM};
1952
+
1953
+ typedef zullong type;
1954
+ typedef zullong to_unsigned;
1955
+
1956
+ # ifdef Z_SLLONG
1957
+ typedef zsllong to_signed;
1958
+ # endif
1959
+ };
1960
+
1961
+ struct SLLong : Integer {
1962
+ enum {is_sllong = true};
1963
+
1964
+ enum { value_type = Z_SLLONG_VALUE_TYPE,
1965
+ fixed_value_type = Z_SLLONG_FIXED_VALUE_TYPE,
1966
+ value_format = Z_SLLONG_VALUE_FORMAT
1967
+ };
1968
+ enum { minimum = Z_SLLONG_MINIMUM,
1969
+ maximum = Z_SLLONG_MAXIMUM
1970
+ };
1971
+
1972
+ typedef zsllong type;
1973
+ typedef zsllong to_signed;
1974
+
1975
+ # ifdef Z_ULLONG
1976
+ typedef zullong to_unsigned;
1977
+ # endif
1978
+ };
1979
+
1980
+ # endif
1981
+
1982
+ # if Z_TRAIT_HAS(Type, is_float)
1983
+
1984
+ struct Float : Real {
1985
+ enum {is_float = true};
1986
+
1987
+ enum { value_type = Z_FLOAT_VALUE_TYPE,
1988
+ fixed_value_type = Z_FLOAT_FIXED_VALUE_TYPE,
1989
+ value_format = Z_FLOAT_VALUE_FORMAT
1990
+ };
1991
+ enum { bias = Z_FLOAT_BIAS,
1992
+ decimal_digits = Z_FLOAT_DECIMAL_DIGITS,
1993
+ significand_offset = Z_FLOAT_SIGNIFICAND_OFFSET,
1994
+ significand_bits = Z_FLOAT_SIGNIFICAND_BITS,
1995
+ significand_digits = Z_FLOAT_SIGNIFICAND_DIGITS,
1996
+ exponent_offset = Z_FLOAT_EXPONENT_OFFSET,
1997
+ exponent_bits = Z_FLOAT_EXPONENT_BITS,
1998
+ exponent_radix = Z_FLOAT_EXPONENT_RADIX,
1999
+ sign_offset = Z_FLOAT_SIGN_OFFSET,
2000
+ sign_bits = Z_FLOAT_SIGN_BITS
2001
+ };
2002
+ enum { exponent_minimum = Z_FLOAT_EXPONENT_MINIMUM,
2003
+ exponent_maximum = Z_FLOAT_EXPONENT_MAXIMUM,
2004
+ exponent_10_minimum = Z_FLOAT_EXPONENT_10_MINIMUM,
2005
+ exponent_10_maximum = Z_FLOAT_EXPONENT_10_MAXIMUM
2006
+ };
2007
+
2008
+ static Z_CT(CPP11) zfloat epsilon () {return Z_FLOAT_EPSILON;}
2009
+ static Z_CT(CPP11) zfloat minimum () {return Z_FLOAT_MINIMUM;}
2010
+ static Z_CT(CPP11) zfloat maximum () {return Z_FLOAT_MAXIMUM;}
2011
+ /* static Z_CT(CPP11) zfloat infinity() Z_NO_EXCEPTION {return Z_FLOAT_INFINITY;}
2012
+ static Z_CT(CPP11) zfloat nan () Z_NO_EXCEPTION {return Z_FLOAT_NAN;}*/
2013
+
2014
+ typedef zfloat type;
2015
+ typedef zfloat to_signed;
2016
+ };
2017
+
2018
+ # endif
2019
+
2020
+ # if Z_TRAIT_HAS(Type, is_double)
2021
+
2022
+ struct Double : Real {
2023
+ enum {is_double = true};
2024
+
2025
+ enum { value_type = Z_DOUBLE_VALUE_TYPE,
2026
+ fixed_value_type = Z_DOUBLE_FIXED_VALUE_TYPE,
2027
+ value_format = Z_DOUBLE_VALUE_FORMAT
2028
+ };
2029
+ enum { bias = Z_DOUBLE_BIAS,
2030
+ decimal_digits = Z_DOUBLE_DECIMAL_DIGITS,
2031
+ significand_offset = Z_DOUBLE_SIGNIFICAND_OFFSET,
2032
+ significand_bits = Z_DOUBLE_SIGNIFICAND_BITS,
2033
+ significand_digits = Z_DOUBLE_SIGNIFICAND_DIGITS,
2034
+ exponent_offset = Z_DOUBLE_EXPONENT_OFFSET,
2035
+ exponent_bits = Z_DOUBLE_EXPONENT_BITS,
2036
+ exponent_radix = Z_DOUBLE_EXPONENT_RADIX,
2037
+ sign_offset = Z_DOUBLE_SIGN_OFFSET,
2038
+ sign_bits = Z_DOUBLE_SIGN_BITS
2039
+ };
2040
+ enum { exponent_minimum = Z_DOUBLE_EXPONENT_MINIMUM,
2041
+ exponent_maximum = Z_DOUBLE_EXPONENT_MAXIMUM,
2042
+ exponent_10_minimum = Z_DOUBLE_EXPONENT_10_MINIMUM,
2043
+ exponent_10_maximum = Z_DOUBLE_EXPONENT_10_MAXIMUM
2044
+ };
2045
+
2046
+ static Z_CT(CPP11) zdouble epsilon () {return Z_DOUBLE_EPSILON;}
2047
+ static Z_CT(CPP11) zdouble minimum () {return Z_DOUBLE_MINIMUM;}
2048
+ static Z_CT(CPP11) zdouble maximum () {return Z_DOUBLE_MAXIMUM;}
2049
+ /* static Z_CT(CPP11) zdouble infinity() Z_NO_EXCEPTION {return Z_DOUBLE_INFINITY;}
2050
+ static Z_CT(CPP11) zdouble nan () Z_NO_EXCEPTION {return Z_DOUBLE_NAN;}*/
2051
+
2052
+ typedef zdouble type;
2053
+ typedef zdouble to_signed;
2054
+ };
2055
+
2056
+ # endif
2057
+
2058
+ # if Z_TRAIT_HAS(Type, is_ldouble)
2059
+
2060
+ struct LDouble : Real {
2061
+ enum {is_ldouble = true};
2062
+
2063
+ enum { value_type = Z_LDOUBLE_VALUE_TYPE,
2064
+ fixed_value_type = Z_LDOUBLE_FIXED_VALUE_TYPE,
2065
+ value_format = Z_LDOUBLE_VALUE_FORMAT
2066
+ };
2067
+ enum { bias = Z_LDOUBLE_BIAS,
2068
+ decimal_digits = Z_LDOUBLE_DECIMAL_DIGITS,
2069
+ significand_offset = Z_LDOUBLE_SIGNIFICAND_OFFSET,
2070
+ significand_bits = Z_LDOUBLE_SIGNIFICAND_BITS,
2071
+ significand_digits = Z_LDOUBLE_SIGNIFICAND_DIGITS,
2072
+ exponent_offset = Z_LDOUBLE_EXPONENT_OFFSET,
2073
+ exponent_bits = Z_LDOUBLE_EXPONENT_BITS,
2074
+ exponent_radix = Z_LDOUBLE_EXPONENT_RADIX,
2075
+ sign_offset = Z_LDOUBLE_SIGN_OFFSET,
2076
+ sign_bits = Z_LDOUBLE_SIGN_BITS
2077
+ };
2078
+ enum { exponent_minimum = Z_LDOUBLE_EXPONENT_MINIMUM,
2079
+ exponent_maximum = Z_LDOUBLE_EXPONENT_MAXIMUM,
2080
+ exponent_10_minimum = Z_LDOUBLE_EXPONENT_10_MINIMUM,
2081
+ exponent_10_maximum = Z_LDOUBLE_EXPONENT_10_MAXIMUM
2082
+ };
2083
+
2084
+ static Z_CT(CPP11) zldouble epsilon () {return Z_LDOUBLE_EPSILON;}
2085
+ static Z_CT(CPP11) zldouble minimum () {return Z_LDOUBLE_MINIMUM;}
2086
+ static Z_CT(CPP11) zldouble maximum () {return Z_LDOUBLE_MAXIMUM;}
2087
+ /* static Z_CT(CPP11) zldouble infinity() Z_NO_EXCEPTION {return Z_LDOUBLE_INFINITY;}
2088
+ static Z_CT(CPP11) zldouble nan () Z_NO_EXCEPTION {return Z_LDOUBLE_NAN;}*/
2089
+
2090
+ typedef zldouble type;
2091
+ typedef zldouble to_signed;
2092
+ };
2093
+
2094
+ # endif
2095
+
2096
+ # if Z_TRAIT_HAS(Type, is_boolean)
2097
+
2098
+ struct Boolean : Integral {
2099
+ enum {is_boolean = true};
2100
+
2101
+ typedef bool type;
2102
+ };
2103
+
2104
+ # endif
2105
+
2106
+ /*# if Z_TRAIT_HAS(Type, is_wchar)
2107
+
2108
+ struct WChar {
2109
+ enum {is_wchar = true};
2110
+
2111
+ typedef wchar_t type;
2112
+ };
2113
+
2114
+ # endif
2115
+
2116
+ # if Z_TRAIT_HAS(Type, is_char16)
2117
+
2118
+ struct Char16 {
2119
+ enum {is_wchar = true};
2120
+
2121
+ typedef char16_t type;
2122
+ };
2123
+
2124
+ # endif
2125
+
2126
+ # if Z_TRAIT_HAS(Type, is_char32)
2127
+
2128
+ struct Char32 {
2129
+ enum {is_wchar = true};
2130
+
2131
+ typedef char32_t type;
2132
+ };
2133
+
2134
+ # endif*/
2135
+
2136
+ # if Z_TRAIT_HAS(Type, is_null_pointer)
2137
+
2138
+ struct NullPointer : PointerLike {
2139
+ enum { is_fundamental = true,
2140
+ is_null_pointer = true
2141
+ };
2142
+
2143
+ typedef decltype(nullptr) type;
2144
+ };
2145
+
2146
+ # endif
2147
+
2148
+ template <zboolean E, class T> struct Array;
2149
+
2150
+ template <class T> struct Array<false, T> : Storable {
2151
+ enum {is_array = true};
2152
+
2153
+ typedef T element_type;
2154
+ };
2155
+
2156
+ template <class T> struct Array<true, T> : Array<false, T> {
2157
+ # if Z_TRAIT_HAS(Type, is_aggregate)
2158
+ enum {is_aggregate = true};
2159
+ # endif
2160
+
2161
+ # if Z_TRAIT_HAS(Type, is_default_constructible)
2162
+ enum {is_default_constructible = Helpers::IsDefaultConstructible<T, T>::value};
2163
+ # endif
2164
+
2165
+ # if Z_TRAIT_HAS(Type, is_literal)
2166
+ enum {is_literal = Z_COMPILER_TRAIT(TYPE_IS_LITERAL)(T)};
2167
+ # endif
2168
+
2169
+ # if Z_TRAIT_HAS(Type, is_pod)
2170
+ enum {is_pod = Z_COMPILER_TRAIT(TYPE_IS_POD)(T)};
2171
+ # endif
2172
+
2173
+ # if Z_TRAIT_HAS(Type, is_trivially_copy_constructible)
2174
+ enum {is_trivially_copy_constructible = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE)(T)};
2175
+ # endif
2176
+
2177
+ # if Z_TRAIT_HAS(Type, is_trivially_copyable)
2178
+ enum {is_trivially_copyable = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_COPYABLE)(T)};
2179
+ # endif
2180
+
2181
+ # if Z_TRAIT_HAS(Type, is_trivially_default_constructible)
2182
+ enum {is_trivially_default_constructible = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE)(T)};
2183
+ # endif
2184
+
2185
+ # if Z_TRAIT_HAS(Type, is_trivially_destructible)
2186
+ enum {is_trivially_destructible = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_DESTRUCTIBLE)(T)};
2187
+ # endif
2188
+ };
2189
+
2190
+ template <zboolean E, class T, zusize N> struct SizedArray : Array<E, T> {
2191
+ enum { is_empty = (N == 0),
2192
+ is_statically_allocatable = true
2193
+ };
2194
+ enum {element_count = N};
2195
+
2196
+ typedef T type[N];
2197
+ };
2198
+
2199
+ template <zboolean E, class T> struct FlexibleArray : Array<E, T> {
2200
+ enum { is_empty = true,
2201
+ is_flexible_array = true
2202
+ };
2203
+
2204
+ typedef T type[];
2205
+ };
2206
+
2207
+ template <class T> struct Pointer : PointerLike {
2208
+ enum {is_pointer = true};
2209
+
2210
+ typedef T* type;
2211
+ typedef T pointee_type;
2212
+ };
2213
+
2214
+ template <class T, class C, class M> struct MemberPointer : PointerLike {
2215
+ enum { is_member_pointer = true,
2216
+ is_pointer = true
2217
+ };
2218
+
2219
+ typedef T type;
2220
+ typedef C class_type;
2221
+ typedef M pointee_type;
2222
+ };
2223
+
2224
+ template <class T, class C, class M> struct DataMemberPointer : MemberPointer<T, C, M> {
2225
+ enum {is_data_member_pointer = true};
2226
+
2227
+ };
2228
+
2229
+ template <class T, class C, class M> struct MemberFunctionPointer : MemberPointer<T, C, M> {
2230
+ enum { is_callable = true,
2231
+ is_member_function_pointer = true
2232
+ };
2233
+ enum {pointer_level = 1};
2234
+
2235
+ typedef M to_function;
2236
+ };
2237
+
2238
+ template <class T> struct Reference : Simple {
2239
+ enum {is_reference = true};
2240
+
2241
+ typedef T referencee_type;
2242
+ };
2243
+
2244
+ template <class T> struct LValueReference : Reference<T> {
2245
+ enum {is_lvalue_reference = true};
2246
+
2247
+ typedef T& type;
2248
+ };
2249
+
2250
+ # if Z_LANGUAGE_HAS(CPP, RVALUE_REFERENCE)
2251
+
2252
+ template <class T> struct RValueReference : Reference<T> {
2253
+ enum {is_rvalue_reference = true};
2254
+
2255
+ typedef T&& type;
2256
+ };
2257
+
2258
+ # endif
2259
+
2260
+ # if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE)
2261
+
2262
+ template <class R, class... P> struct Function : Valid {
2263
+ enum { is_callable = true,
2264
+ is_function = true
2265
+ };
2266
+ enum {arity = TypeCount<P...>::value};
2267
+
2268
+ typedef R type (P...);
2269
+ typedef R to_const (P...) const;
2270
+ typedef R to_const_volatile(P...) const volatile;
2271
+ typedef R to_volatile (P...) volatile;
2272
+
2273
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
2274
+ typedef R to_const_lvalue (P...) const &;
2275
+ typedef R to_const_rvalue (P...) const &&;
2276
+ typedef R to_const_volatile_lvalue(P...) const volatile &;
2277
+ typedef R to_const_volatile_rvalue(P...) const volatile &&;
2278
+ typedef R to_lvalue (P...) &;
2279
+ typedef R to_rvalue (P...) &&;
2280
+ typedef R to_volatile_lvalue (P...) volatile &;
2281
+ typedef R to_volatile_rvalue (P...) volatile &&;
2282
+ # endif
2283
+
2284
+ typedef R return_type;
2285
+
2286
+ # if Z_TRAIT_HAS(Type, parameters)
2287
+ typedef TypeList<P...> parameters;
2288
+ # endif
2289
+ };
2290
+
2291
+ template <class R, class... P> struct VariadicFunction : Function<R, P...> {
2292
+ enum {is_variadic = true};
2293
+
2294
+ typedef R type (P..., ...);
2295
+ typedef R to_const (P..., ...) const;
2296
+ typedef R to_const_volatile(P..., ...) const volatile;
2297
+ typedef R to_volatile (P..., ...) volatile;
2298
+
2299
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
2300
+ typedef R to_const_lvalue (P..., ...) const &;
2301
+ typedef R to_const_rvalue (P..., ...) const &&;
2302
+ typedef R to_const_volatile_lvalue(P..., ...) const volatile &;
2303
+ typedef R to_const_volatile_rvalue(P..., ...) const volatile &&;
2304
+ typedef R to_lvalue (P..., ...) &;
2305
+ typedef R to_rvalue (P..., ...) &&;
2306
+ typedef R to_volatile_lvalue (P..., ...) volatile &;
2307
+ typedef R to_volatile_rvalue (P..., ...) volatile &&;
2308
+ # endif
2309
+ };
2310
+
2311
+ # else
2312
+
2313
+ template <class R> struct FunctionWith0Parameters : Valid {
2314
+ enum { is_callable = true,
2315
+ is_function = true
2316
+ };
2317
+ enum {arity = 0};
2318
+
2319
+ typedef R type ();
2320
+ typedef R to_const () const;
2321
+ typedef R to_const_volatile() const volatile;
2322
+ typedef R to_volatile () volatile;
2323
+
2324
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
2325
+ typedef R to_const_lvalue () const &;
2326
+ typedef R to_const_rvalue () const &&;
2327
+ typedef R to_const_volatile_lvalue() const volatile &;
2328
+ typedef R to_const_volatile_rvalue() const volatile &&;
2329
+ typedef R to_lvalue () &;
2330
+ typedef R to_rvalue () &&;
2331
+ typedef R to_volatile_lvalue () volatile &;
2332
+ typedef R to_volatile_rvalue () volatile &&;
2333
+ # endif
2334
+
2335
+ typedef R return_type;
2336
+ };
2337
+
2338
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
2339
+
2340
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
2341
+ \
2342
+ template <class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> \
2343
+ struct FunctionWith##parameter_count##Parameters : Valid { \
2344
+ enum { is_callable = true, \
2345
+ is_function = true \
2346
+ }; \
2347
+ enum {arity = parameter_count}; \
2348
+ \
2349
+ typedef R type (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)); \
2350
+ typedef R to_const (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const; \
2351
+ typedef R to_const_lvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const &; \
2352
+ typedef R to_const_rvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const &&; \
2353
+ typedef R to_const_volatile (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile; \
2354
+ typedef R to_const_volatile_lvalue(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile &; \
2355
+ typedef R to_const_volatile_rvalue(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile &&; \
2356
+ typedef R to_lvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) &; \
2357
+ typedef R to_rvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) &&; \
2358
+ typedef R to_volatile (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile; \
2359
+ typedef R to_volatile_lvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile &; \
2360
+ typedef R to_volatile_rvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile &&; \
2361
+ typedef R return_type; \
2362
+ }; \
2363
+ \
2364
+ template <class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> \
2365
+ struct VariadicFunctionWith##parameter_count##Parameters \
2366
+ : FunctionWith##parameter_count##Parameters<R, Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)> { \
2367
+ enum {is_variadic = true}; \
2368
+ \
2369
+ typedef R type (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...); \
2370
+ typedef R to_const (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const; \
2371
+ typedef R to_const_lvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const &; \
2372
+ typedef R to_const_rvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const &&; \
2373
+ typedef R to_const_volatile (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile; \
2374
+ typedef R to_const_volatile_lvalue(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile &; \
2375
+ typedef R to_const_volatile_rvalue(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile &&; \
2376
+ typedef R to_lvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) &; \
2377
+ typedef R to_rvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) &&; \
2378
+ typedef R to_volatile (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile; \
2379
+ typedef R to_volatile_lvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile &; \
2380
+ typedef R to_volatile_rvalue (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile &&; \
2381
+ };
2382
+
2383
+ # else
2384
+
2385
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
2386
+ \
2387
+ template <class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> \
2388
+ struct FunctionWith##parameter_count##Parameters : Valid { \
2389
+ enum { is_callable = true, \
2390
+ is_function = true \
2391
+ }; \
2392
+ enum {arity = parameter_count + 1}; \
2393
+ \
2394
+ typedef R type (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)); \
2395
+ typedef R to_const (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const; \
2396
+ typedef R to_const_volatile(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile; \
2397
+ typedef R to_volatile (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile; \
2398
+ \
2399
+ typedef R return_type; \
2400
+ }; \
2401
+ \
2402
+ template <class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> \
2403
+ struct VariadicFunctionWith##parameter_count##Parameters \
2404
+ : FunctionWith##parameter_count##Parameters<R, Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)> { \
2405
+ enum {is_variadic = true}; \
2406
+ \
2407
+ typedef R type (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...); \
2408
+ typedef R to_const (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const; \
2409
+ typedef R to_const_volatile(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile; \
2410
+ typedef R to_volatile (Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile; \
2411
+ };
2412
+
2413
+ # endif
2414
+
2415
+ Z_FOR_32_CALL_WITH_TIME(Z_TEMPLATE_SPECIALIZATIONS, Z_EMPTY)
2416
+ # undef Z_TEMPLATE_SPECIALIZATIONS
2417
+
2418
+ # endif
2419
+
2420
+ enum { Enumeration,
2421
+ Structure,
2422
+ Union,
2423
+ ObjectiveCInstance
2424
+ };
2425
+
2426
+ template <zboolean E, zuint K, class T> struct Kind;
2427
+
2428
+ # if Z_TRAIT_HAS(Type, is_enumeration)
2429
+
2430
+ template <class T> struct Kind<false, Enumeration, T> : Simple {
2431
+ enum { is_enumeration = true,
2432
+ is_scalar = true
2433
+ };
2434
+
2435
+ # if Z_TRAIT_HAS(Type, is_pod)
2436
+ enum {is_pod = true};
2437
+ # endif
2438
+
2439
+ typedef T type;
2440
+ };
2441
+
2442
+ template <class T> struct Kind<true, Enumeration, T> : Kind<false, Enumeration, T> {
2443
+ # if Z_TRAIT_HAS(Type, underlying_type)
2444
+ typedef Z_COMPILER_TRAIT(TYPE_UNDERLYING_TYPE)(T) underlying_type;
2445
+ # endif
2446
+ };
2447
+
2448
+ # endif
2449
+
2450
+ template <zboolean E, class T> struct StructureOrUnion;
2451
+
2452
+ template <class T> struct StructureOrUnion<false, T> : Storable {
2453
+ enum {is_structure_or_union = true};
2454
+
2455
+ typedef T type;
2456
+ };
2457
+
2458
+ template <class T> struct StructureOrUnion<true, T> : StructureOrUnion<false, T> {
2459
+
2460
+ # if Z_TRAIT_HAS(Type, is_aggregate)
2461
+ enum {is_aggregate = Z_COMPILER_TRAIT(TYPE_IS_AGGREGATE)(T)};
2462
+ # endif
2463
+
2464
+ # if Z_TRAIT_HAS(Type, is_default_constructible)
2465
+ enum {is_default_constructible = Helpers::IsDefaultConstructible<T, T>::value};
2466
+ # endif
2467
+
2468
+ # if Z_TRAIT_HAS(Type, is_final)
2469
+ enum {is_final = Z_COMPILER_TRAIT(TYPE_IS_FINAL)(T)};
2470
+ # endif
2471
+
2472
+ # if Z_TRAIT_HAS(Type, is_literal)
2473
+ enum {is_literal = Z_COMPILER_TRAIT(TYPE_IS_LITERAL)(T)};
2474
+ # endif
2475
+
2476
+ # if Z_TRAIT_HAS(Type, is_pod)
2477
+ enum {is_pod = Z_COMPILER_TRAIT(TYPE_IS_POD)(T)};
2478
+ # endif
2479
+
2480
+ # if Z_TRAIT_HAS(Type, is_trivially_copy_assignable)
2481
+ enum {is_trivially_copy_assignable = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_COPY_ASSIGNABLE)(T)};
2482
+ # endif
2483
+
2484
+ # if Z_TRAIT_HAS(Type, is_trivially_copy_constructible)
2485
+ enum {is_trivially_copy_constructible = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_COPY_CONSTRUCTIBLE)(T)};
2486
+ # endif
2487
+
2488
+ # if Z_TRAIT_HAS(Type, is_trivially_copyable)
2489
+ enum {is_trivially_copyable = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_COPYABLE)(T)};
2490
+ # endif
2491
+
2492
+ # if Z_TRAIT_HAS(Type, is_trivially_default_constructible)
2493
+ enum {is_trivially_default_constructible = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE)(T)};
2494
+ # endif
2495
+
2496
+ # if Z_TRAIT_HAS(Type, is_trivially_destructible)
2497
+ enum {is_trivially_destructible = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_DESTRUCTIBLE)(T)};
2498
+ # endif
2499
+ };
2500
+
2501
+ template <zboolean E, class T> struct MaybeTemplate : StructureOrUnion<E, T> {};
2502
+
2503
+ # if Z_TRAIT_HAS(Type, is_template)
2504
+
2505
+ template <zboolean E, template <class...> class T, class... A> struct MaybeTemplate<E, T<A...> > : StructureOrUnion<E, T<A...> > {
2506
+ enum {is_template = true};
2507
+ enum {arity = TypeCount<A...>::value};
2508
+
2509
+ typedef TypeList<A...> parameters;
2510
+ };
2511
+
2512
+ # endif
2513
+
2514
+ template <class T> class Kind<false, Structure, T> : public MaybeTemplate<false, T> {
2515
+ public:
2516
+ enum { is_class = true,
2517
+ is_structure = true
2518
+ };
2519
+ };
2520
+
2521
+ template <class T> class Kind<true, Structure, T> : public MaybeTemplate<true, T> {
2522
+ public:
2523
+ enum { is_class = true,
2524
+ is_structure = true
2525
+ };
2526
+
2527
+ # if Z_TRAIT_HAS(Type, has_virtual_destructor)
2528
+ enum {has_virtual_destructor = Z_COMPILER_TRAIT(TYPE_HAS_VIRTUAL_DESTRUCTOR)(T)};
2529
+ # endif
2530
+
2531
+ # if Z_TRAIT_HAS(Type, is_abstract)
2532
+ enum {is_abstract = Z_COMPILER_TRAIT(TYPE_IS_ABSTRACT)(T)};
2533
+ # endif
2534
+
2535
+ # if Z_COMPILER_HAS_TRAIT(TYPE_IS_EMPTY)
2536
+ enum {is_empty = Z_COMPILER_TRAIT(TYPE_IS_EMPTY)(T)};
2537
+ # else
2538
+ private:
2539
+ struct Dummy {zsint dummy;};
2540
+ struct Z_EBCO EmptyTest : T {zsint dummy;};
2541
+
2542
+ public:
2543
+ enum {is_empty = (sizeof(EmptyTest) == sizeof(Dummy))};
2544
+ # endif
2545
+
2546
+ # if Z_TRAIT_HAS(Type, is_interface_class)
2547
+ enum {is_interface_class = Z_COMPILER_TRAIT(TYPE_IS_INTERFACE_CLASS)(T)};
2548
+ # endif
2549
+
2550
+ # if Z_TRAIT_HAS(Type, is_polymorphic)
2551
+ enum {is_polymorphic = Z_COMPILER_TRAIT(TYPE_IS_POLYMORPHIC)(T)};
2552
+ # endif
2553
+ };
2554
+
2555
+ # if Z_TRAIT_HAS(Type, is_union)
2556
+
2557
+ template <zboolean E, class T> struct Kind<E, Union, T> : MaybeTemplate<E, T> {
2558
+ enum { is_statically_allocatable = true,
2559
+ is_union = true
2560
+ };
2561
+ };
2562
+
2563
+ # endif
2564
+
2565
+ # if Z_LANGUAGE_INCLUDES(OBJECTIVE_CPP)
2566
+
2567
+ struct ObjectiveCObject : Valid {
2568
+ enum {is_objective_c_object = true};
2569
+
2570
+ typedef typename Pointer<id>::remove_pointer type;
2571
+ };
2572
+
2573
+ struct ObjectiveCClass : ObjectiveCObject {
2574
+ enum {is_objective_c_class = true};
2575
+
2576
+ typedef typename Pointer<Class>::remove_pointer type;
2577
+ };
2578
+
2579
+ # if Z_TRAIT_HAS(Type, is_objective_c_instance)
2580
+
2581
+ template <zboolean E, class T> struct Kind<E, ObjectiveCInstance, T> : ObjectiveCObject {
2582
+ enum {is_objective_c_instance = true};
2583
+
2584
+ typedef T type;
2585
+ };
2586
+
2587
+ # endif
2588
+
2589
+ # endif
2590
+ }}}}
2591
+
2592
+ namespace Zeta {namespace Detail {namespace Type {namespace Mixins {
2593
+
2594
+ // MARK: - Mixins: Qualifiers (generic)
2595
+
2596
+ template <class C> struct Unqualified : C {
2597
+ typedef const typename C::type add_const;
2598
+ typedef const volatile typename C::type add_const_volatile;
2599
+ typedef volatile typename C::type add_volatile;
2600
+ typedef typename C::type remove_const;
2601
+ typedef typename C::type remove_const_volatile;
2602
+ typedef typename C::type remove_volatile;
2603
+ typedef const typename C::type to_const;
2604
+ typedef const volatile typename C::type to_const_volatile;
2605
+ typedef volatile typename C::type to_volatile;
2606
+ typedef typename C::type to_unqualified;
2607
+ };
2608
+
2609
+ template <class C> struct Qualified : C {
2610
+ enum {is_qualified = true};
2611
+ };
2612
+
2613
+ template <class C> struct Const : Qualified<C> {
2614
+ enum {is_const = true};
2615
+
2616
+ typedef typename C::to_const type;
2617
+ typedef typename C::to_const_volatile add_volatile;
2618
+ typedef typename C::to_const remove_volatile;
2619
+ };
2620
+
2621
+ template <class C> struct Volatile : Qualified<C> {
2622
+ enum {is_volatile = true};
2623
+
2624
+ typedef typename C::to_volatile type;
2625
+ typedef typename C::to_const_volatile add_const;
2626
+ typedef typename C::to_volatile remove_const;
2627
+ };
2628
+
2629
+ template <class C> struct ConstVolatile : Qualified<C> {
2630
+ enum { is_const = true,
2631
+ is_const_volatile = true,
2632
+ is_volatile = true
2633
+ };
2634
+
2635
+ typedef typename C::to_const_volatile type;
2636
+ typedef typename C::to_const_volatile add_const;
2637
+ typedef typename C::to_const_volatile add_volatile;
2638
+ typedef typename C::to_volatile remove_const;
2639
+ typedef typename C::to_const remove_volatile;
2640
+ };
2641
+
2642
+ // MARK: - Mixins: Qualifiers (signed or unsigned)
2643
+
2644
+ template <class C> struct ConstInteger : Const<C> {
2645
+ typedef const typename C::to_unsigned to_unsigned;
2646
+ };
2647
+
2648
+ template <class C> struct VolatileInteger : Volatile<C> {
2649
+ typedef volatile typename C::to_unsigned to_unsigned;
2650
+ };
2651
+
2652
+ template <class C> struct ConstVolatileInteger : ConstVolatile<C> {
2653
+ typedef const volatile typename C::to_unsigned to_unsigned;
2654
+ };
2655
+
2656
+ template <class C> struct ConstSignedOrUnsigned : TernaryType<C::is_real, Const<C>, ConstInteger<C> >::type {
2657
+ typedef const typename C::to_signed to_signed;
2658
+ };
2659
+
2660
+ template <class C> struct VolatileSignedOrUnsigned : TernaryType<C::is_real, Volatile<C>, VolatileInteger<C> >::type {
2661
+ typedef volatile typename C::to_signed to_signed;
2662
+ };
2663
+
2664
+ template <class C> struct ConstVolatileSignedOrUnsigned : TernaryType<C::is_real, ConstVolatile<C>, ConstVolatileInteger<C> >::type {
2665
+ typedef const volatile typename C::to_signed to_signed;
2666
+ };
2667
+
2668
+ // MARK: - Mixins: Qualifiers (array)
2669
+
2670
+ template <class C> struct ConstArray : Const<C> {
2671
+ typedef const typename C::element_type element_type;
2672
+ };
2673
+
2674
+ template <class C> struct VolatileArray : Volatile<C> {
2675
+ typedef volatile typename C::element_type element_type;
2676
+ };
2677
+
2678
+ template <class C> struct ConstVolatileArray : ConstVolatile<C> {
2679
+ typedef const volatile typename C::element_type element_type;
2680
+ };
2681
+
2682
+ // MARK: - Mixins: Qualifiers (function)
2683
+
2684
+ template <class C> struct UnqualifiedFunction : C {
2685
+ typedef typename C::to_const add_const;
2686
+ typedef typename C::to_const_volatile add_const_volatile;
2687
+ typedef typename C::to_volatile add_volatile;
2688
+ typedef typename C::type remove_const;
2689
+ typedef typename C::type remove_const_volatile;
2690
+ typedef typename C::type remove_volatile;
2691
+ typedef typename C::type to_unqualified;
2692
+
2693
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
2694
+ typedef typename C::to_const_lvalue add_const_lvalue;
2695
+ typedef typename C::to_const_rvalue add_const_rvalue;
2696
+ typedef typename C::to_const_volatile_lvalue add_const_volatile_lvalue;
2697
+ typedef typename C::to_const_volatile_rvalue add_const_volatile_rvalue;
2698
+ typedef typename C::to_lvalue add_lvalue;
2699
+ typedef typename C::to_rvalue add_rvalue;
2700
+ typedef typename C::to_volatile_lvalue add_volatile_lvalue;
2701
+ typedef typename C::to_volatile_rvalue add_volatile_rvalue;
2702
+ typedef typename C::type remove_const_this;
2703
+ typedef typename C::type remove_const_volatile_this;
2704
+ typedef typename C::type remove_this;
2705
+ typedef typename C::type remove_volatile_this;
2706
+ # endif
2707
+ };
2708
+
2709
+ template <class C> struct QualifiedFunction : C {
2710
+ enum {is_qualified = true};
2711
+ };
2712
+
2713
+ template <class C> struct ConstFunction : QualifiedFunction<C> {
2714
+ enum {is_const = true};
2715
+
2716
+ typedef typename C::to_const type;
2717
+ typedef typename C::to_const_volatile add_volatile;
2718
+ typedef typename C::to_const remove_volatile;
2719
+
2720
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
2721
+ typedef typename C::to_const_lvalue add_lvalue;
2722
+ typedef typename C::to_const_rvalue add_rvalue;
2723
+ typedef typename C::to_const_volatile_lvalue add_volatile_lvalue;
2724
+ typedef typename C::to_const_volatile_rvalue add_volatile_rvalue;
2725
+ typedef typename C::to_const remove_this;
2726
+ typedef typename C::to_const remove_volatile_this;
2727
+ # endif
2728
+ };
2729
+
2730
+ template <class C> struct VolatileFunction : QualifiedFunction<C> {
2731
+ enum {is_volatile = true};
2732
+
2733
+ typedef typename C::to_volatile type;
2734
+ typedef typename C::to_const_volatile add_const;
2735
+ typedef typename C::to_volatile remove_const;
2736
+
2737
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
2738
+ typedef typename C::to_const_volatile_lvalue add_const_lvalue;
2739
+ typedef typename C::to_const_volatile_rvalue add_const_rvalue;
2740
+ typedef typename C::to_volatile_lvalue add_lvalue;
2741
+ typedef typename C::to_volatile_rvalue add_rvalue;
2742
+ typedef typename C::to_volatile remove_const_this;
2743
+ typedef typename C::to_volatile remove_this;
2744
+ # endif
2745
+ };
2746
+
2747
+ template <class C> struct ConstVolatileFunction : QualifiedFunction<C> {
2748
+ enum { is_const = true,
2749
+ is_const_volatile = true,
2750
+ is_volatile = true
2751
+ };
2752
+
2753
+ typedef typename C::to_const_volatile type;
2754
+ typedef typename C::to_const_volatile add_const;
2755
+ typedef typename C::to_const_volatile add_volatile;
2756
+ typedef typename C::to_volatile remove_const;
2757
+ typedef typename C::to_const remove_volatile;
2758
+
2759
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
2760
+ typedef typename C::to_const_volatile_lvalue add_const_lvalue;
2761
+ typedef typename C::to_const_volatile_rvalue add_const_rvalue;
2762
+ typedef typename C::to_const_volatile_lvalue add_lvalue;
2763
+ typedef typename C::to_const_volatile_rvalue add_rvalue;
2764
+ typedef typename C::to_const_volatile_lvalue add_volatile_lvalue;
2765
+ typedef typename C::to_const_volatile_rvalue add_volatile_rvalue;
2766
+ typedef typename C::to_volatile remove_const_this;
2767
+ typedef typename C::to_const_volatile remove_this;
2768
+ typedef typename C::to_const remove_volatile_this;
2769
+ # endif
2770
+ };
2771
+
2772
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
2773
+
2774
+ template <class C> struct LValueFunction : QualifiedFunction<C> {
2775
+ enum {is_lvalue = true};
2776
+
2777
+ typedef typename C::to_lvalue type;
2778
+ typedef typename C::to_const_lvalue add_const;
2779
+ typedef typename C::to_const_volatile_lvalue add_const_volatile;
2780
+ typedef typename C::to_volatile_lvalue add_volatile;
2781
+ typedef typename C::to_lvalue remove_const;
2782
+ typedef typename C::to_lvalue remove_const_volatile;
2783
+ typedef typename C::to_lvalue remove_volatile;
2784
+ };
2785
+
2786
+ template <class C> struct RValueFunction : QualifiedFunction<C> {
2787
+ enum {is_rvalue = true};
2788
+
2789
+ typedef typename C::to_rvalue type;
2790
+ typedef typename C::to_const_rvalue add_const;
2791
+ typedef typename C::to_const_volatile_rvalue add_const_volatile;
2792
+ typedef typename C::to_volatile_rvalue add_volatile;
2793
+ typedef typename C::to_rvalue remove_const;
2794
+ typedef typename C::to_rvalue remove_const_volatile;
2795
+ typedef typename C::to_rvalue remove_volatile;
2796
+ };
2797
+
2798
+ template <class C> struct ConstLValueFunction : QualifiedFunction<C> {
2799
+ enum { is_const = true,
2800
+ is_const_lvalue = true,
2801
+ is_lvalue = true
2802
+ };
2803
+
2804
+ typedef typename C::to_const_lvalue type;
2805
+ typedef typename C::to_const_lvalue add_const;
2806
+ typedef typename C::to_const_volatile_lvalue add_const_volatile;
2807
+ typedef typename C::to_const_lvalue add_lvalue;
2808
+ typedef typename C::to_const_rvalue add_rvalue;
2809
+ typedef typename C::to_const_volatile_lvalue add_volatile;
2810
+ typedef typename C::to_const_volatile_lvalue add_volatile_lvalue;
2811
+ typedef typename C::to_const_volatile_rvalue add_volatile_rvalue;
2812
+ typedef typename C::to_lvalue remove_const;
2813
+ typedef typename C::to_lvalue remove_const_volatile;
2814
+ typedef typename C::to_const remove_this;
2815
+ typedef typename C::to_const_lvalue remove_volatile;
2816
+ typedef typename C::to_const remove_volatile_this;
2817
+ };
2818
+
2819
+ template <class C> struct ConstRValueFunction : QualifiedFunction<C> {
2820
+ enum { is_const = true,
2821
+ is_const_rvalue = true,
2822
+ is_rvalue = true
2823
+ };
2824
+
2825
+ typedef typename C::to_const_rvalue type;
2826
+ typedef typename C::to_const_rvalue add_const;
2827
+ typedef typename C::to_const_volatile_rvalue add_const_volatile;
2828
+ typedef typename C::to_const_lvalue add_lvalue;
2829
+ typedef typename C::to_const_rvalue add_rvalue;
2830
+ typedef typename C::to_const_volatile_rvalue add_volatile;
2831
+ typedef typename C::to_const_volatile_lvalue add_volatile_lvalue;
2832
+ typedef typename C::to_const_volatile_rvalue add_volatile_rvalue;
2833
+ typedef typename C::to_rvalue remove_const;
2834
+ typedef typename C::to_rvalue remove_const_volatile;
2835
+ typedef typename C::to_const remove_this;
2836
+ typedef typename C::to_const_rvalue remove_volatile;
2837
+ typedef typename C::to_const remove_volatile_this;
2838
+ };
2839
+
2840
+ template <class C> struct VolatileLValueFunction : QualifiedFunction<C> {
2841
+ enum { is_lvalue = true,
2842
+ is_volatile = true,
2843
+ is_volatile_lvalue = true
2844
+ };
2845
+
2846
+ typedef typename C::to_volatile_lvalue type;
2847
+ typedef typename C::to_const_volatile_lvalue add_const;
2848
+ typedef typename C::to_const_volatile_lvalue add_const_lvalue;
2849
+ typedef typename C::to_const_volatile_rvalue add_const_rvalue;
2850
+ typedef typename C::to_const_volatile_lvalue add_const_volatile;
2851
+ typedef typename C::to_volatile_lvalue add_lvalue;
2852
+ typedef typename C::to_volatile_rvalue add_rvalue;
2853
+ typedef typename C::to_volatile_lvalue add_volatile;
2854
+ typedef typename C::to_volatile_lvalue remove_const;
2855
+ typedef typename C::to_volatile remove_const_this;
2856
+ typedef typename C::to_lvalue remove_const_volatile;
2857
+ typedef typename C::to_volatile remove_this;
2858
+ typedef typename C::to_lvalue remove_volatile;
2859
+ };
2860
+
2861
+ template <class C> struct VolatileRValueFunction : QualifiedFunction<C> {
2862
+ enum { is_rvalue = true,
2863
+ is_volatile = true,
2864
+ is_volatile_rvalue = true
2865
+ };
2866
+
2867
+ typedef typename C::to_volatile_rvalue type;
2868
+ typedef typename C::to_const_volatile_rvalue add_const;
2869
+ typedef typename C::to_const_volatile_lvalue add_const_lvalue;
2870
+ typedef typename C::to_const_volatile_rvalue add_const_rvalue;
2871
+ typedef typename C::to_const_volatile_rvalue add_const_volatile;
2872
+ typedef typename C::to_volatile_lvalue add_lvalue;
2873
+ typedef typename C::to_volatile_rvalue add_rvalue;
2874
+ typedef typename C::to_volatile_rvalue add_volatile;
2875
+ typedef typename C::to_volatile_rvalue remove_const;
2876
+ typedef typename C::to_volatile remove_const_this;
2877
+ typedef typename C::to_rvalue remove_const_volatile;
2878
+ typedef typename C::to_volatile remove_this;
2879
+ typedef typename C::to_rvalue remove_volatile;
2880
+ };
2881
+
2882
+ template <class C> struct ConstVolatileLValueFunction : QualifiedFunction<C> {
2883
+ enum { is_const = true,
2884
+ is_const_lvalue = true,
2885
+ is_const_volatile = true,
2886
+ is_const_volatile_lvalue = true,
2887
+ is_lvalue = true,
2888
+ is_volatile = true,
2889
+ is_volatile_lvalue = true
2890
+ };
2891
+
2892
+ typedef typename C::to_const_volatile_lvalue type;
2893
+ typedef typename C::to_const_volatile_lvalue add_const;
2894
+ typedef typename C::to_const_volatile_lvalue add_const_lvalue;
2895
+ typedef typename C::to_const_volatile_rvalue add_const_rvalue;
2896
+ typedef typename C::to_const_volatile_lvalue add_const_volatile;
2897
+ typedef typename C::to_const_volatile_lvalue add_lvalue;
2898
+ typedef typename C::to_const_volatile_rvalue add_rvalue;
2899
+ typedef typename C::to_const_volatile_lvalue add_volatile;
2900
+ typedef typename C::to_const_volatile_lvalue add_volatile_lvalue;
2901
+ typedef typename C::to_const_volatile_rvalue add_volatile_rvalue;
2902
+ typedef typename C::to_volatile_lvalue remove_const;
2903
+ typedef typename C::to_volatile remove_const_this;
2904
+ typedef typename C::to_lvalue remove_const_volatile;
2905
+ typedef typename C::to_const_volatile remove_this;
2906
+ typedef typename C::to_const_lvalue remove_volatile;
2907
+ typedef typename C::to_const remove_volatile_this;
2908
+ };
2909
+
2910
+ template <class C> struct ConstVolatileRValueFunction : QualifiedFunction<C> {
2911
+ enum { is_const = true,
2912
+ is_const_rvalue = true,
2913
+ is_const_volatile = true,
2914
+ is_const_volatile_rvalue = true,
2915
+ is_rvalue = true,
2916
+ is_volatile = true,
2917
+ is_volatile_rvalue = true
2918
+ };
2919
+
2920
+ typedef typename C::to_const_volatile_rvalue type;
2921
+ typedef typename C::to_const_volatile_rvalue add_const;
2922
+ typedef typename C::to_const_volatile_lvalue add_const_lvalue;
2923
+ typedef typename C::to_const_volatile_rvalue add_const_rvalue;
2924
+ typedef typename C::to_const_volatile_rvalue add_const_volatile;
2925
+ typedef typename C::to_const_volatile_lvalue add_lvalue;
2926
+ typedef typename C::to_const_volatile_rvalue add_rvalue;
2927
+ typedef typename C::to_const_volatile_rvalue add_volatile;
2928
+ typedef typename C::to_const_volatile_lvalue add_volatile_lvalue;
2929
+ typedef typename C::to_const_volatile_rvalue add_volatile_rvalue;
2930
+ typedef typename C::to_volatile_rvalue remove_const;
2931
+ typedef typename C::to_volatile remove_const_this;
2932
+ typedef typename C::to_rvalue remove_const_volatile;
2933
+ typedef typename C::to_const_volatile remove_this;
2934
+ typedef typename C::to_const_rvalue remove_volatile;
2935
+ typedef typename C::to_const remove_volatile_this;
2936
+ };
2937
+
2938
+ # endif
2939
+
2940
+ // MARK: - Mixins: Kind
2941
+
2942
+ template <class C> struct Virtual : C {
2943
+ typedef typename C::type remove_pointer;
2944
+ typedef typename C::type remove_reference;
2945
+ };
2946
+
2947
+ template <class C> struct Storable : Virtual<C> {
2948
+ Z_DEFINE_STRICT_STRUCTURE (typename C::type value; ) to_wrap;
2949
+ Z_DEFINE_STRICT_STRUCTURE (UInt8 data[sizeof(to_wrap)];) to_opaque;
2950
+
2951
+ enum { size = C::is_empty ? 0 : sizeof(to_wrap),
2952
+ bits = C::is_empty ? 0 : sizeof(to_wrap) * 8
2953
+ };
2954
+ };
2955
+
2956
+ template <class C> struct Convertible : C {
2957
+ typedef typename C::type& add_lvalue_reference;
2958
+ typedef typename C::type* add_pointer;
2959
+ typedef typename C::type& to_lvalue_reference;
2960
+ typedef typename C::type* to_pointer;
2961
+
2962
+ # if Z_LANGUAGE_HAS(CPP, RVALUE_REFERENCE)
2963
+ typedef typename C::type&& add_rvalue_reference;
2964
+ typedef typename C::type&& to_rvalue_reference;
2965
+ # endif
2966
+ };
2967
+
2968
+ enum { Void,
2969
+ Function,
2970
+ InconvertibleFunction,
2971
+ ConvertibleFunction,
2972
+ Value,
2973
+ VoidPointer,
2974
+ Pointer,
2975
+ MemberFunctionPointer,
2976
+ Reference,
2977
+ ObjectiveCObject
2978
+ };
2979
+
2980
+ template <zuint K, class C> struct Kind;
2981
+
2982
+ // MARK: - Mixins: Kind (virtual)
2983
+
2984
+ template <class C> struct Kind<Void, C> : Virtual<C> {
2985
+ typedef typename C::type* add_pointer;
2986
+ typedef typename C::type* to_pointer;
2987
+ };
2988
+
2989
+ template <class C> struct Kind<InconvertibleFunction, C> : Virtual<C> {
2990
+ typedef typename C::type to_function;
2991
+ };
2992
+
2993
+ template <class C> struct Kind<ConvertibleFunction, C> : Kind<InconvertibleFunction, Convertible<C> > {};
2994
+
2995
+ // MARK: - Mixins: Kind (storable)
2996
+
2997
+ template <class C> struct Kind<Value, C> : Storable<Convertible<C> > {};
2998
+
2999
+ template <class C> struct Kind<VoidPointer, C> : Storable<C> {
3000
+ typedef typename C::type& add_lvalue_reference;
3001
+ typedef typename C::type* add_pointer;
3002
+ typedef typename C::pointee_type remove_pointer;
3003
+ typedef typename C::type to_pointer;
3004
+
3005
+ # if Z_TRAIT_HAS(Type, add_rvalue_reference)
3006
+ typedef typename C::type&& add_rvalue_reference;
3007
+ # endif
3008
+ };
3009
+
3010
+ template <class C> struct Kind<Pointer, C> : Kind<VoidPointer, C> {
3011
+ typedef typename C::pointee_type& to_lvalue_reference;
3012
+
3013
+ # if Z_TRAIT_HAS(Type, to_rvalue_reference)
3014
+ typedef typename C::pointee_type&& to_rvalue_reference;
3015
+ # endif
3016
+ };
3017
+
3018
+ template <class C> struct Kind<MemberFunctionPointer, C> : Storable<C> {
3019
+ typedef typename C::pointee_type to_function;
3020
+ };
3021
+
3022
+ template <class C> struct Kind<Reference, C> : Storable<C> {
3023
+ typedef NaT add_const;
3024
+ typedef NaT add_const_volatile;
3025
+ typedef NaT add_volatile;
3026
+ typedef typename C::type remove_pointer;
3027
+ typedef typename C::referencee_type remove_reference;
3028
+ typedef NaT to_const;
3029
+ typedef NaT to_const_volatile;
3030
+ typedef typename C::referencee_type& to_lvalue_reference;
3031
+ typedef typename C::referencee_type* to_pointer;
3032
+ typedef NaT to_volatile;
3033
+
3034
+ # if Z_TRAIT_HAS(Type, to_rvalue_reference)
3035
+ typedef typename C::referencee_type&& to_rvalue_reference;
3036
+ # endif
3037
+ };
3038
+
3039
+ // MARK: - Mixins: Objective-C objects
3040
+
3041
+ # if Z_LANGUAGE_INCLUDES(OBJECTIVE_CPP)
3042
+ template <class C> struct Kind<ObjectiveCObject, C> : Convertible<C> {};
3043
+ # endif
3044
+ }}}}
3045
+
3046
+ namespace Zeta {namespace Detail {namespace Type {
3047
+
3048
+ // MARK: - Specializations: Enumerations, structures, unions and Objective-C instances
3049
+
3050
+ template <class T> struct Ambiguous {
3051
+
3052
+ enum { structure_detected =
3053
+ # if Z_COMPILER_HAS_TRAIT(TYPE_IS_CLASS)
3054
+ Z_COMPILER_TRAIT(TYPE_IS_CLASS)(T)
3055
+ # else
3056
+ false
3057
+ # endif
3058
+ };
3059
+
3060
+ enum { union_detected =
3061
+ # if Z_COMPILER_HAS_TRAIT(TYPE_IS_UNION)
3062
+ Z_COMPILER_TRAIT(TYPE_IS_UNION)(T)
3063
+ # else
3064
+ false
3065
+ # endif
3066
+ };
3067
+
3068
+ enum { structure_or_union_detected = structure_detected || union_detected ||
3069
+ # if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
3070
+ Helpers::IsStructureOrUnion<T, true>::value
3071
+ # else
3072
+ false
3073
+ # endif
3074
+ };
3075
+
3076
+ enum { enumeration_detected =
3077
+ # if Z_COMPILER_HAS_TRAIT(TYPE_IS_ENUMERATION)
3078
+ Z_COMPILER_TRAIT(TYPE_IS_ENUMERATION)(T)
3079
+ # elif Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
3080
+ !structure_or_union_detected && Helpers::IsUsableToCastNumber<T, true>::value
3081
+ # else
3082
+ false
3083
+ # endif
3084
+ };
3085
+
3086
+ enum { objective_c_instance_detected =
3087
+ Z_LANGUAGE_INCLUDES(OBJECTIVE_C) &&
3088
+ Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE) &&
3089
+ !enumeration_detected &&
3090
+ !structure_or_union_detected
3091
+ };
3092
+
3093
+ enum { kind = enumeration_detected
3094
+ ? Abstract::Enumeration
3095
+ : (union_detected
3096
+ ? Abstract::Union
3097
+ : (objective_c_instance_detected
3098
+ ? Abstract::ObjectiveCInstance
3099
+ : Abstract::Structure))
3100
+ };
3101
+ };
3102
+
3103
+ template <Boolean E, class T> struct Case : Mixins::Unqualified<Abstract::Kind<E, Ambiguous<T>::kind, T> > {};
3104
+
3105
+ // MARK: - Specializations: Fixed width numeric types
3106
+
3107
+ # if Z_TRAIT_HAS(Type, is_uint8)
3108
+ template <Boolean E> struct Case<E, UInt8> : Mixins::Unqualified<Abstract::UInt8> {};
3109
+ # endif
3110
+
3111
+ # if Z_TRAIT_HAS(Type, is_sint8)
3112
+ template <Boolean E> struct Case<E, SInt8> : Mixins::Unqualified<Abstract::SInt8> {};
3113
+ # endif
3114
+
3115
+ # if Z_TRAIT_HAS(Type, is_uint16)
3116
+ template <Boolean E> struct Case<E, UInt16> : Mixins::Unqualified<Abstract::UInt16> {};
3117
+ # endif
3118
+
3119
+ # if Z_TRAIT_HAS(Type, is_sint16)
3120
+ template <Boolean E> struct Case<E, SInt16> : Mixins::Unqualified<Abstract::SInt16> {};
3121
+ # endif
3122
+
3123
+ # if Z_TRAIT_HAS(Type, is_uint32)
3124
+ template <Boolean E> struct Case<E, UInt32> : Mixins::Unqualified<Abstract::UInt32> {};
3125
+ # endif
3126
+
3127
+ # if Z_TRAIT_HAS(Type, is_sint32)
3128
+ template <Boolean E> struct Case<E, SInt32> : Mixins::Unqualified<Abstract::SInt32> {};
3129
+ # endif
3130
+
3131
+ # if Z_TRAIT_HAS(Type, is_uint64)
3132
+ template <Boolean E> struct Case<E, UInt64> : Mixins::Unqualified<Abstract::UInt64> {};
3133
+ # endif
3134
+
3135
+ # if Z_TRAIT_HAS(Type, is_sint64)
3136
+ template <Boolean E> struct Case<E, SInt64> : Mixins::Unqualified<Abstract::SInt64> {};
3137
+ # endif
3138
+
3139
+ # if Z_TRAIT_HAS(Type, is_uint128)
3140
+ template <Boolean E> struct Case<E, UInt128> : Mixins::Unqualified<Abstract::UInt128> {};
3141
+ # endif
3142
+
3143
+ # if Z_TRAIT_HAS(Type, is_sint128)
3144
+ template <Boolean E> struct Case<E, SInt128> : Mixins::Unqualified<Abstract::SInt128> {};
3145
+ # endif
3146
+
3147
+ # if Z_TRAIT_HAS(Type, is_float16)
3148
+ template <Boolean E> struct Case<E, Float16> : Mixins::Unqualified<Abstract::Float16> {};
3149
+ # endif
3150
+
3151
+ # if Z_TRAIT_HAS(Type, is_float32)
3152
+ template <Boolean E> struct Case<E, Float32> : Mixins::Unqualified<Abstract::Float32> {};
3153
+ # endif
3154
+
3155
+ # if Z_TRAIT_HAS(Type, is_float64)
3156
+ template <Boolean E> struct Case<E, Float64> : Mixins::Unqualified<Abstract::Float64> {};
3157
+ # endif
3158
+
3159
+ # if Z_TRAIT_HAS(Type, is_float128)
3160
+ template <Boolean E> struct Case<E, Float128> : Mixins::Unqualified<Abstract::Float128> {};
3161
+ # endif
3162
+
3163
+ # if Z_TRAIT_HAS(Type, is_float80_x87)
3164
+ template <Boolean E> struct Case<E, Float80_x87> : Mixins::Unqualified<Abstract::Float80_x87> {};
3165
+ # endif
3166
+
3167
+ # if Z_TRAIT_HAS(Type, is_float96_x87)
3168
+ template <Boolean E> struct Case<E, Float96_x87> : Mixins::Unqualified<Abstract::Float96_x87> {};
3169
+ # endif
3170
+
3171
+ # if Z_TRAIT_HAS(Type, is_float128_x87)
3172
+ template <Boolean E> struct Case<E, Float128_x87> : Mixins::Unqualified<Abstract::Float128_x87> {};
3173
+ # endif
3174
+
3175
+ // MARK: - Specializations: C/C++ fundamental types
3176
+
3177
+ template <Boolean E> struct Case<E, void > : Mixins::Unqualified<Abstract::Void > {};
3178
+ template <Boolean E> struct Case<E, Char > : Mixins::Unqualified<Abstract::Char > {};
3179
+ template <Boolean E> struct Case<E, UChar > : Mixins::Unqualified<Abstract::UChar > {};
3180
+ template <Boolean E> struct Case<E, SChar > : Mixins::Unqualified<Abstract::SChar > {};
3181
+ template <Boolean E> struct Case<E, UShort> : Mixins::Unqualified<Abstract::UShort> {};
3182
+ template <Boolean E> struct Case<E, SShort> : Mixins::Unqualified<Abstract::SShort> {};
3183
+ template <Boolean E> struct Case<E, UInt > : Mixins::Unqualified<Abstract::UInt > {};
3184
+ template <Boolean E> struct Case<E, SInt > : Mixins::Unqualified<Abstract::SInt > {};
3185
+ template <Boolean E> struct Case<E, ULong > : Mixins::Unqualified<Abstract::ULong > {};
3186
+ template <Boolean E> struct Case<E, SLong > : Mixins::Unqualified<Abstract::SLong > {};
3187
+
3188
+ # ifdef Z_LLONG
3189
+ template <Boolean E> struct Case<E, ULLong> : Mixins::Unqualified<Abstract::ULLong> {};
3190
+ template <Boolean E> struct Case<E, SLLong> : Mixins::Unqualified<Abstract::SLLong> {};
3191
+ # endif
3192
+
3193
+ # if Z_TRAIT_HAS(Type, is_float)
3194
+ template <Boolean E> struct Case<E, Float> : Mixins::Unqualified<Abstract::Float> {};
3195
+ # endif
3196
+
3197
+ # if Z_TRAIT_HAS(Type, is_double)
3198
+ template <Boolean E> struct Case<E, Double> : Mixins::Unqualified<Abstract::Double> {};
3199
+ # endif
3200
+
3201
+ # if Z_TRAIT_HAS(Type, is_ldouble)
3202
+ template <Boolean E> struct Case<E, LDouble> : Mixins::Unqualified<Abstract::LDouble> {};
3203
+ # endif
3204
+
3205
+ # if Z_TRAIT_HAS(Type, is_boolean)
3206
+ template <Boolean E> struct Case<E, Boolean> : Mixins::Unqualified<Abstract::Boolean> {};
3207
+ # endif
3208
+
3209
+ // MARK: - Specializations: C++ specific fundamental types
3210
+
3211
+ /*# if Z_TRAIT_HAS(Type, is_wchar)
3212
+ template <Boolean E> struct Case<E, WChar> : Mixins::Unqualified<Abstract::WChar> {};
3213
+ # endif
3214
+
3215
+ # if Z_TRAIT_HAS(Type, is_char16)
3216
+ template <Boolean E> struct Case<E, Char16> : Mixins::Unqualified<Abstract::Char16> {};
3217
+ # endif
3218
+
3219
+ # if Z_TRAIT_HAS(Type, is_char32)
3220
+ template <Boolean E> struct Case<E, Char32> : Mixins::Unqualified<Abstract::Char32> {};
3221
+ # endif*/
3222
+
3223
+ # if Z_TRAIT_HAS(Type, is_null_pointer)
3224
+ template <Boolean E> struct Case<E, NullPointer> : Mixins::Unqualified<Abstract::NullPointer> {};
3225
+ # endif
3226
+
3227
+ // MARK: - Specializations: Sized arrays
3228
+
3229
+ template <Boolean E, class T, USize N> struct Case<E, T[N]> : Mixins::Unqualified<Abstract::SizedArray<E, T, N> > {};
3230
+
3231
+ template <Boolean E, class T, USize N> struct Case<E, const T[N]> : Mixins::ConstArray <Case<E, T[N]> > {};
3232
+ template <Boolean E, class T, USize N> struct Case<E, volatile T[N]> : Mixins::VolatileArray <Case<E, T[N]> > {};
3233
+ template <Boolean E, class T, USize N> struct Case<E, const volatile T[N]> : Mixins::ConstVolatileArray<Case<E, T[N]> > {};
3234
+
3235
+ // MARK: - Specializations: Flexible arrays
3236
+
3237
+ template <Boolean E, class T> struct Case<E, T[]> : Mixins::Unqualified<Abstract::FlexibleArray<E, T> > {};
3238
+
3239
+ template <Boolean E, class T> struct Case<E, const T[]> : Mixins::ConstArray <Case<E, T[]> > {};
3240
+ template <Boolean E, class T> struct Case<E, volatile T[]> : Mixins::VolatileArray <Case<E, T[]> > {};
3241
+ template <Boolean E, class T> struct Case<E, const volatile T[]> : Mixins::ConstVolatileArray<Case<E, T[]> > {};
3242
+
3243
+ // MARK: - Specializations: Pointers
3244
+
3245
+ template <Boolean E, class T> class Case<E, T*> : public Mixins::Unqualified<Abstract::Pointer<T> > {
3246
+ private:
3247
+ typedef Case<false, T> Pointee;
3248
+
3249
+ public:
3250
+ enum { is_callable = Pointee::is_function,
3251
+ is_function_pointer = Pointee::is_function,
3252
+ is_void_pointer = Pointee::is_void
3253
+ };
3254
+
3255
+ # if Z_LANGUAGE_INCLUDES(OBJECTIVE_CPP)
3256
+
3257
+ enum { is_objective_c_class_pointer = Pointee::is_objective_c_class,
3258
+ is_objective_c_object_pointer = Pointee::is_objective_c_object,
3259
+ };
3260
+
3261
+ # if Z_TRAIT_HAS(Type, is_objective_c_instance_pointer)
3262
+ enum {is_objective_c_instance_pointer = Pointee::is_objective_c_instance};
3263
+ # endif
3264
+
3265
+ # endif
3266
+
3267
+ enum {pointer_level = Pointee::pointer_level + 1};
3268
+
3269
+ typedef typename TernaryType<is_function_pointer, T, NaT>::type to_function;
3270
+ };
3271
+
3272
+ template <Boolean E, class C, class T> struct Case<E, T C::*> : Mixins::Unqualified<Abstract::DataMemberPointer<T C::*, C, T> > {
3273
+ enum {pointer_level = Case<E, T>::pointer_level + 1};
3274
+ };
3275
+
3276
+ # if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE)
3277
+
3278
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) , C, R(P...) > > {};
3279
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) const > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) const , C, R(P...) const > > {};
3280
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) const volatile> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) const volatile, C, R(P...) const volatile> > {};
3281
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) volatile > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) volatile, C, R(P...) volatile> > {};
3282
+
3283
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) , C, R(P..., ...) > > {};
3284
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) const > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) const , C, R(P..., ...) const > > {};
3285
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) const volatile> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) const volatile, C, R(P..., ...) const volatile> > {};
3286
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) volatile> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) volatile, C, R(P..., ...) volatile> > {};
3287
+
3288
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
3289
+
3290
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) & , C, R(P...) & > > {};
3291
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) &&, C, R(P...) &&> > {};
3292
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) const & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) const & , C, R(P...) const & > > {};
3293
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) const &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) const &&, C, R(P...) const &&> > {};
3294
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) const volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) const volatile & , C, R(P...) const volatile & > > {};
3295
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) const volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) const volatile &&, C, R(P...) const volatile &&> > {};
3296
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) volatile & , C, R(P...) volatile & > > {};
3297
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P...) volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P...) volatile &&, C, R(P...) volatile &&> > {};
3298
+
3299
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) & , C, R(P..., ...) & > > {};
3300
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) &&, C, R(P..., ...) &&> > {};
3301
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) const & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) const & , C, R(P..., ...) const & > > {};
3302
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) const &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) const &&, C, R(P..., ...) const &&> > {};
3303
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) const volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) const volatile & , C, R(P..., ...) const volatile & > > {};
3304
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) const volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) const volatile &&, C, R(P..., ...) const volatile &&> > {};
3305
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) volatile & , C, R(P..., ...) volatile & > > {};
3306
+ template <Boolean E, class C, class R, class... P> struct Case<E, R(C::*)(P..., ...) volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(P..., ...) volatile &&, C, R(P..., ...) volatile &&> > {};
3307
+
3308
+ # endif
3309
+
3310
+ # else
3311
+
3312
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() , C, R() > > {};
3313
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() const > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() const , C, R() const > > {};
3314
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() const volatile> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() const volatile, C, R() const volatile> > {};
3315
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() volatile> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() volatile, C, R() volatile> > {};
3316
+
3317
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
3318
+ \
3319
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) > > {}; \
3320
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const > > {}; \
3321
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile> > {}; \
3322
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile> > {}; \
3323
+ \
3324
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) > > {}; \
3325
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const > > {}; \
3326
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile> > {}; \
3327
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile> > {};
3328
+
3329
+ Z_FOR_32_CALL_WITH_TIME(Z_TEMPLATE_SPECIALIZATIONS, Z_EMPTY)
3330
+ # undef Z_TEMPLATE_SPECIALIZATIONS
3331
+
3332
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
3333
+
3334
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() & , C, R() & > > {};
3335
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() &&, C, R() &&> > {};
3336
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() const & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() const & , C, R() const & > > {};
3337
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() const &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() const &&, C, R() const &&> > {};
3338
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() const volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() const volatile & , C, R() const volatile & > > {};
3339
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() const volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() const volatile &&, C, R() const volatile &&> > {};
3340
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() volatile & , C, R() volatile & > > {};
3341
+ template <Boolean E, class C, class R> struct Case<E, R(C::*)() volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)() volatile &&, C, R() volatile &&> > {};
3342
+
3343
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
3344
+ \
3345
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) & , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) & > > {}; \
3346
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) &&, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) &&> > {}; \
3347
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const & , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const & > > {}; \
3348
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const &&, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const &&> > {}; \
3349
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile & , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile & > > {}; \
3350
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile &&, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile &&> > {}; \
3351
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile & , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile & > > {}; \
3352
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile &&, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile &&> > {}; \
3353
+ \
3354
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) & , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) & > > {}; \
3355
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) &&, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) &&> > {}; \
3356
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const & , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const & > > {}; \
3357
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const &&, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const &&> > {}; \
3358
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile & , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile & > > {}; \
3359
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile &&, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile &&> > {}; \
3360
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile & > : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile & , C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile & > > {}; \
3361
+ template <Boolean E, class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile &&> : Mixins::Unqualified<Abstract::MemberFunctionPointer<R(C::*)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile &&, C, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile &&> > {};
3362
+
3363
+ Z_FOR_32_CALL_WITH_TIME(Z_TEMPLATE_SPECIALIZATIONS, Z_EMPTY)
3364
+ # undef Z_TEMPLATE_SPECIALIZATIONS
3365
+
3366
+ # endif
3367
+
3368
+ # endif
3369
+
3370
+ // MARK: - Specializations: References
3371
+
3372
+ template <Boolean E, class T> struct Case<E, T&> : Mixins::Unqualified<Abstract::LValueReference<T> > {
3373
+ enum { is_function_reference = Case<false, T>::is_function,
3374
+ is_function_lvalue_reference = is_function_reference,
3375
+ is_callable = is_function_reference
3376
+ };
3377
+
3378
+ typedef typename TernaryType<is_function_reference, T, NaT>::type to_function;
3379
+ };
3380
+
3381
+ # if Z_TRAIT_HAS(Type, is_rvalue_reference)
3382
+
3383
+ template <Boolean E, class T> struct Case<E, T&&> : Mixins::Unqualified<Abstract::RValueReference<T> > {
3384
+ enum { is_function_reference = Case<false, T>::is_function,
3385
+ is_function_rvalue_reference = is_function_reference,
3386
+ is_callable = is_function_reference
3387
+ };
3388
+
3389
+ typedef typename TernaryType<is_function_reference, T, NaT>::type to_function;
3390
+ };
3391
+
3392
+ # endif
3393
+
3394
+ // MARK: - Specializations: Functions
3395
+
3396
+ # if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE)
3397
+
3398
+ template <Boolean E, class R, class... P> struct Case<E, R(P...)> : Mixins::UnqualifiedFunction<Abstract::Function<R, P...> > {};
3399
+
3400
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) const > : Mixins::ConstFunction <Case<E, R(P...)> > {};
3401
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) const volatile> : Mixins::ConstVolatileFunction<Case<E, R(P...)> > {};
3402
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) volatile> : Mixins::VolatileFunction <Case<E, R(P...)> > {};
3403
+
3404
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...)> : Mixins::UnqualifiedFunction<Abstract::VariadicFunction<R, P...> > {};
3405
+
3406
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) const > : Mixins::ConstFunction <Case<E, R(P..., ...)> > {};
3407
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) const volatile> : Mixins::ConstVolatileFunction<Case<E, R(P..., ...)> > {};
3408
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) volatile> : Mixins::VolatileFunction <Case<E, R(P..., ...)> > {};
3409
+
3410
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
3411
+
3412
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) & > : Mixins::LValueFunction <Case<E, R(P...)> > {};
3413
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) &&> : Mixins::RValueFunction <Case<E, R(P...)> > {};
3414
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) const & > : Mixins::ConstLValueFunction <Case<E, R(P...)> > {};
3415
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) const &&> : Mixins::ConstRValueFunction <Case<E, R(P...)> > {};
3416
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) const volatile & > : Mixins::ConstVolatileLValueFunction<Case<E, R(P...)> > {};
3417
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) const volatile &&> : Mixins::ConstVolatileRValueFunction<Case<E, R(P...)> > {};
3418
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) volatile & > : Mixins::VolatileLValueFunction <Case<E, R(P...)> > {};
3419
+ template <Boolean E, class R, class... P> struct Case<E, R(P...) volatile &&> : Mixins::VolatileRValueFunction <Case<E, R(P...)> > {};
3420
+
3421
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) & > : Mixins::LValueFunction <Case<E, R(P..., ...)> > {};
3422
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) &&> : Mixins::RValueFunction <Case<E, R(P..., ...)> > {};
3423
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) const & > : Mixins::ConstLValueFunction <Case<E, R(P..., ...)> > {};
3424
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) const &&> : Mixins::ConstRValueFunction <Case<E, R(P..., ...)> > {};
3425
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) const volatile & > : Mixins::ConstVolatileLValueFunction<Case<E, R(P..., ...)> > {};
3426
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) const volatile &&> : Mixins::ConstVolatileRValueFunction<Case<E, R(P..., ...)> > {};
3427
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) volatile & > : Mixins::VolatileLValueFunction <Case<E, R(P..., ...)> > {};
3428
+ template <Boolean E, class R, class... P> struct Case<E, R(P..., ...) volatile &&> : Mixins::VolatileRValueFunction <Case<E, R(P..., ...)> > {};
3429
+
3430
+ # endif
3431
+
3432
+ # else
3433
+
3434
+ template <Boolean E, class R> struct Case<E, R()> : Mixins::UnqualifiedFunction<Abstract::FunctionWith0Parameters<R> > {};
3435
+
3436
+ template <Boolean E, class R> struct Case<E, R() const > : Mixins::ConstFunction <Case<E, R()> > {};
3437
+ template <Boolean E, class R> struct Case<E, R() const volatile> : Mixins::ConstVolatileFunction<Case<E, R()> > {};
3438
+ template <Boolean E, class R> struct Case<E, R() volatile> : Mixins::VolatileFunction <Case<E, R()> > {};
3439
+
3440
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
3441
+ \
3442
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> : Mixins::UnqualifiedFunction<Abstract::FunctionWith##parameter_count##Parameters<R, Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)> > {}; \
3443
+ \
3444
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const > : Mixins::ConstFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3445
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile> : Mixins::ConstVolatileFunction<Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3446
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile> : Mixins::VolatileFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3447
+ \
3448
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> : Mixins::UnqualifiedFunction<Abstract::VariadicFunctionWith##parameter_count##Parameters<R, Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)> > {}; \
3449
+ \
3450
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const > : Mixins::ConstFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {}; \
3451
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile> : Mixins::ConstVolatileFunction<Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {}; \
3452
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile> : Mixins::VolatileFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {};
3453
+
3454
+ Z_FOR_32_CALL_WITH_TIME(Z_TEMPLATE_SPECIALIZATIONS, Z_EMPTY)
3455
+ # undef Z_TEMPLATE_SPECIALIZATIONS
3456
+
3457
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
3458
+
3459
+ template <Boolean E, class R> struct Case<E, R() & > : Mixins::LValueFunction <Case<E, R()> > {};
3460
+ template <Boolean E, class R> struct Case<E, R() &&> : Mixins::RValueFunction <Case<E, R()> > {};
3461
+ template <Boolean E, class R> struct Case<E, R() const & > : Mixins::ConstLValueFunction <Case<E, R()> > {};
3462
+ template <Boolean E, class R> struct Case<E, R() const &&> : Mixins::ConstRValueFunction <Case<E, R()> > {};
3463
+ template <Boolean E, class R> struct Case<E, R() const volatile & > : Mixins::ConstVolatileLValueFunction<Case<E, R()> > {};
3464
+ template <Boolean E, class R> struct Case<E, R() const volatile &&> : Mixins::ConstVolatileRValueFunction<Case<E, R()> > {};
3465
+ template <Boolean E, class R> struct Case<E, R() volatile & > : Mixins::VolatileLValueFunction <Case<E, R()> > {};
3466
+ template <Boolean E, class R> struct Case<E, R() volatile &&> : Mixins::VolatileRValueFunction <Case<E, R()> > {};
3467
+
3468
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
3469
+ \
3470
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) & > : Mixins::LValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3471
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) &&> : Mixins::RValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3472
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const & > : Mixins::ConstLValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3473
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const &&> : Mixins::ConstRValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3474
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile & > : Mixins::ConstVolatileLValueFunction<Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3475
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile &&> : Mixins::ConstVolatileRValueFunction<Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3476
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile & > : Mixins::VolatileLValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3477
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile &&> : Mixins::VolatileRValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA))> > {}; \
3478
+ \
3479
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) & > : Mixins::LValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {}; \
3480
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) &&> : Mixins::RValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {}; \
3481
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const & > : Mixins::ConstLValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {}; \
3482
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const &&> : Mixins::ConstRValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {}; \
3483
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile & > : Mixins::ConstVolatileLValueFunction<Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {}; \
3484
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile &&> : Mixins::ConstVolatileRValueFunction<Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {}; \
3485
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile & > : Mixins::VolatileLValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {}; \
3486
+ template <Boolean E, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile &&> : Mixins::VolatileRValueFunction <Case<E, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...)> > {};
3487
+
3488
+ Z_FOR_32_CALL_WITH_TIME(Z_TEMPLATE_SPECIALIZATIONS, Z_EMPTY)
3489
+ # undef Z_TEMPLATE_SPECIALIZATIONS
3490
+
3491
+ # endif
3492
+
3493
+ # endif
3494
+
3495
+ // MARK: - Specializations: Apple blocks
3496
+
3497
+ // MARK: - Specializations: Objective-C
3498
+
3499
+ # if Z_LANGUAGE_INCLUDES(OBJECTIVE_CPP)
3500
+ template <Boolean E> struct Case<E, Helpers::RemovePointer<id >::type> : Mixins::Unqualified<Abstract::ObjectiveCObject> {};
3501
+ template <Boolean E> struct Case<E, Helpers::RemovePointer<Class>::type> : Mixins::Unqualified<Abstract::ObjectiveCClass > {};
3502
+ # endif
3503
+
3504
+ // MARK: - Specializations: Qualified types
3505
+
3506
+ template <Boolean E, class T> struct Case<E, const T> : TernaryType<Case<false, T>::is_signed_or_unsigned, Mixins::ConstSignedOrUnsigned <Case<E, T> >, Mixins::Const <Case<E, T> > >::type {};
3507
+ template <Boolean E, class T> struct Case<E, const volatile T> : TernaryType<Case<false, T>::is_signed_or_unsigned, Mixins::ConstVolatileSignedOrUnsigned<Case<E, T> >, Mixins::ConstVolatile<Case<E, T> > >::type {};
3508
+ template <Boolean E, class T> struct Case<E, volatile T> : TernaryType<Case<false, T>::is_signed_or_unsigned, Mixins::VolatileSignedOrUnsigned <Case<E, T> >, Mixins::Volatile <Case<E, T> > >::type {};
3509
+
3510
+ // MARK: - Final aggregate
3511
+
3512
+ template <class T> struct Final : Mixins::Kind<
3513
+ Case<false, T>::is_storable
3514
+ ? (Case<false, T>::is_pointer
3515
+ ? (Case<false, T>::is_member_function_pointer
3516
+ ? Mixins::MemberFunctionPointer
3517
+ : (Case<false, T>::is_void_pointer ? Mixins::VoidPointer : Mixins::Pointer))
3518
+ : (Case<false, T>::is_reference
3519
+ ? Mixins::Reference
3520
+ : Mixins::Value))
3521
+ : (Case<false, T>::is_void
3522
+ ? Mixins::Void
3523
+ : (Case<false, T>::is_function && Case<false, T>::is_qualified
3524
+ ? Mixins::InconvertibleFunction
3525
+ : Mixins::ConvertibleFunction)),
3526
+ Case<true, T>
3527
+ > {
3528
+ typedef typename TernaryType<
3529
+ Final::is_structure_or_union,
3530
+ typename Final<const typename Final::remove_const_volatile>::add_lvalue_reference, T
3531
+ >::type to_forwardable;
3532
+ };
3533
+
3534
+ template <> struct Final< NaT> : Abstract::Invalid {};
3535
+ template <> struct Final<const NaT> : Abstract::Invalid {};
3536
+ template <> struct Final<const volatile NaT> : Abstract::Invalid {};
3537
+ template <> struct Final< volatile NaT> : Abstract::Invalid {};
3538
+ }}}
3539
+
3540
+ namespace Zeta {
3541
+
3542
+ template <class A, class B> struct TypeAreEqual : False {};
3543
+ template <class A > struct TypeAreEqual<A, A> : True {};
3544
+
3545
+ # if Z_HAS_TRAIT(TypeIsAssignable)
3546
+
3547
+ template <class T, class from_type> struct TypeIsAssignable {
3548
+ enum {value = Z_COMPILER_TRAIT(TYPE_IS_ASSIGNABLE)(T, from_type)};
3549
+ };
3550
+
3551
+ # endif
3552
+
3553
+ # if Z_HAS_TRAIT(TypeIsBase)
3554
+
3555
+ template <class T, class of_type> struct TypeIsBase {
3556
+ enum {value = Z_COMPILER_TRAIT(TYPE_IS_BASE)(T, of_type)};
3557
+ };
3558
+
3559
+ # endif
3560
+
3561
+ # if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
3562
+
3563
+ namespace {
3564
+ template <class T, SInt at_line> struct TypeIsComplete : Detail::Type::Helpers::IsComplete <T, at_line, true> {};
3565
+ template <class T, SInt at_line> struct TypeIsIncomplete : Detail::Type::Helpers::IsIncomplete<T, at_line, true> {};
3566
+ }
3567
+
3568
+ # endif
3569
+
3570
+ # if Z_HAS_TRAIT(TypeIsConvertible)
3571
+
3572
+ template <class T, class to_type> struct TypeIsConvertible {
3573
+ enum {value = Z_COMPILER_TRAIT(TYPE_IS_CONVERTIBLE)(T, to_type)};
3574
+ };
3575
+
3576
+ # endif
3577
+
3578
+ # if Z_HAS_TRAIT(TypeIsConstructible)
3579
+
3580
+ template <class T, class... parameters> struct TypeIsConstructible {
3581
+ enum {value = Z_COMPILER_TRAIT(TYPE_IS_CONSTRUCTIBLE)(T, parameters...)};
3582
+ };
3583
+
3584
+ # endif
3585
+
3586
+ # if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE) && Z_LANGUAGE_HAS_SPECIFIER(CPP, DECLARED_TYPE)
3587
+
3588
+ template <class T, class compatible_call_prototype> struct TypeIsFunctional;
3589
+ template <class T, class compatible_call_prototype> struct TypeIsFunctor;
3590
+
3591
+ # if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE)
3592
+
3593
+ template <class T, class R, class... P> struct TypeIsFunctional<T, R(P...)> : Detail::Type::Helpers::IsFunctional<T, R(P...), R> {};
3594
+ template <class T, class R, class... P> struct TypeIsFunctor <T, R(P...)> : Detail::Type::Helpers::IsFunctor <T, R(P...), R> {};
3595
+
3596
+ # else
3597
+
3598
+ template <class T, class R> struct TypeIsFunctional<T, R()> : Detail::Type::Helpers::IsFunctional<T, R(), R> {};
3599
+ template <class T, class R> struct TypeIsFunctor <T, R()> : Detail::Type::Helpers::IsFunctor <T, R(), R> {};
3600
+
3601
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
3602
+ \
3603
+ template <class T, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeIsFunctional< \
3604
+ T, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) \
3605
+ > : Detail::Type::Helpers::IsFunctional<T, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)), R> {}; \
3606
+ \
3607
+ template <class T, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeIsFunctor< \
3608
+ T, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) \
3609
+ > : Detail::Type::Helpers::IsFunctor<T, R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)), R> {};
3610
+
3611
+ Z_FOR_32_CALL_WITH_TIME(Z_TEMPLATE_SPECIALIZATIONS, Z_EMPTY)
3612
+ # undef Z_TEMPLATE_SPECIALIZATIONS
3613
+
3614
+ # endif
3615
+
3616
+ # endif
3617
+
3618
+ # if Z_HAS_TRAIT(TypeIsNothrowAssignable)
3619
+
3620
+ template <class T, class from_type> struct TypeIsNothrowAssignable {
3621
+ enum {value = Z_COMPILER_TRAIT(TYPE_IS_NOTHROW_ASSIGNABLE)(T, from_type)};
3622
+ };
3623
+
3624
+ # endif
3625
+
3626
+ # if Z_HAS_TRAIT(TypeIsNothrowConstructible)
3627
+
3628
+ template <class T, class... parameters> struct TypeIsNothrowConstructible {
3629
+ enum {value = Z_COMPILER_TRAIT(TYPE_IS_NOTHROW_CONSTRUCTIBLE)(T, parameters...)};
3630
+ };
3631
+
3632
+ # endif
3633
+
3634
+ # if Z_HAS_TRAIT(TypeIsTriviallyAssignable)
3635
+
3636
+ template <class T, class from_type> struct TypeIsTriviallyAssignable {
3637
+ enum {value = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_ASSIGNABLE)(T, from_type)};
3638
+ };
3639
+
3640
+ # endif
3641
+
3642
+ # if Z_HAS_TRAIT(TypeIsTriviallyConstructible)
3643
+
3644
+ template <class T, class... parameters> struct TypeIsTriviallyConstructible {
3645
+ enum {value = Z_COMPILER_TRAIT(TYPE_IS_TRIVIALLY_CONSTRUCTIBLE)(T, parameters...)};
3646
+ };
3647
+
3648
+ # endif
3649
+
3650
+ template <class T, class klass> struct TypeToMemberPointer;
3651
+
3652
+ template <class T, class C> struct TypeToMemberPointer {typedef T C::*type;};
3653
+
3654
+ template <class C> struct TypeToMemberPointer< void, C> {typedef NaT type;};
3655
+ template <class C> struct TypeToMemberPointer<const void, C> {typedef NaT type;};
3656
+ template <class C> struct TypeToMemberPointer<const volatile void, C> {typedef NaT type;};
3657
+ template <class C> struct TypeToMemberPointer< volatile void, C> {typedef NaT type;};
3658
+
3659
+ # if Z_LANGUAGE_HAS(CPP, VARIADIC_TEMPLATE)
3660
+
3661
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) , C> {typedef R(C::*type)(P...) ;};
3662
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) const , C> {typedef R(C::*type)(P...) const ;};
3663
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) const volatile, C> {typedef R(C::*type)(P...) const volatile;};
3664
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) volatile, C> {typedef R(C::*type)(P...) volatile;};
3665
+
3666
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) , C> {typedef R(C::*type)(P..., ...) ;};
3667
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) const , C> {typedef R(C::*type)(P..., ...) const ;};
3668
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) const volatile, C> {typedef R(C::*type)(P..., ...) const volatile;};
3669
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) volatile, C> {typedef R(C::*type)(P..., ...) volatile;};
3670
+
3671
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
3672
+
3673
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) & , C> {typedef R(C::*type)(P...) & ;};
3674
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) &&, C> {typedef R(C::*type)(P...) &&;};
3675
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) const & , C> {typedef R(C::*type)(P...) const & ;};
3676
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) const &&, C> {typedef R(C::*type)(P...) const &&;};
3677
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) const volatile & , C> {typedef R(C::*type)(P...) const volatile & ;};
3678
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) const volatile &&, C> {typedef R(C::*type)(P...) const volatile &&;};
3679
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) volatile & , C> {typedef R(C::*type)(P...) volatile & ;};
3680
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P...) volatile &&, C> {typedef R(C::*type)(P...) volatile &&;};
3681
+
3682
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) & , C> {typedef R(C::*type)(P..., ...) & ;};
3683
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) &&, C> {typedef R(C::*type)(P..., ...) &&;};
3684
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) const & , C> {typedef R(C::*type)(P..., ...) const & ;};
3685
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) const &&, C> {typedef R(C::*type)(P..., ...) const &&;};
3686
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) const volatile & , C> {typedef R(C::*type)(P..., ...) const volatile & ;};
3687
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) const volatile &&, C> {typedef R(C::*type)(P..., ...) const volatile &&;};
3688
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) volatile & , C> {typedef R(C::*type)(P..., ...) volatile & ;};
3689
+ template <class C, class R, class... P> struct TypeToMemberPointer<R(P..., ...) volatile &&, C> {typedef R(C::*type)(P..., ...) volatile &&;};
3690
+
3691
+ # endif
3692
+
3693
+ # else
3694
+
3695
+ template <class C, class R> struct TypeToMemberPointer<R() , C> {typedef R(C::*type)() ;};
3696
+ template <class C, class R> struct TypeToMemberPointer<R() const , C> {typedef R(C::*type)() const ;};
3697
+ template <class C, class R> struct TypeToMemberPointer<R() const volatile, C> {typedef R(C::*type)() const volatile;};
3698
+ template <class C, class R> struct TypeToMemberPointer<R() volatile, C> {typedef R(C::*type)() volatile;};
3699
+
3700
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
3701
+ \
3702
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) ;}; \
3703
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const ;}; \
3704
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile;}; \
3705
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile;}; \
3706
+ \
3707
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) ;}; \
3708
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const ;}; \
3709
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile;}; \
3710
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile;};
3711
+
3712
+ Z_FOR_32_CALL_WITH_TIME(Z_TEMPLATE_SPECIALIZATIONS, Z_EMPTY)
3713
+ # undef Z_TEMPLATE_SPECIALIZATIONS
3714
+
3715
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
3716
+
3717
+ template <class C, class R> struct TypeToMemberPointer<R() & , C> {typedef R(C::*type)() & ;};
3718
+ template <class C, class R> struct TypeToMemberPointer<R() &&, C> {typedef R(C::*type)() &&;};
3719
+ template <class C, class R> struct TypeToMemberPointer<R() const & , C> {typedef R(C::*type)() const & ;};
3720
+ template <class C, class R> struct TypeToMemberPointer<R() const &&, C> {typedef R(C::*type)() const &&;};
3721
+ template <class C, class R> struct TypeToMemberPointer<R() const volatile & , C> {typedef R(C::*type)() const volatile & ;};
3722
+ template <class C, class R> struct TypeToMemberPointer<R() const volatile &&, C> {typedef R(C::*type)() const volatile &&;};
3723
+ template <class C, class R> struct TypeToMemberPointer<R() volatile & , C> {typedef R(C::*type)() volatile & ;};
3724
+ template <class C, class R> struct TypeToMemberPointer<R() volatile &&, C> {typedef R(C::*type)() volatile &&;};
3725
+
3726
+ # define Z_TEMPLATE_SPECIALIZATIONS(parameter_count) \
3727
+ \
3728
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) & , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) & ;}; \
3729
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) &&, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) &&;}; \
3730
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const & , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const & ;}; \
3731
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const &&, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const &&;}; \
3732
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile & , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile & ;}; \
3733
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile &&, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) const volatile &&;}; \
3734
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile & , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile & ;}; \
3735
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile &&, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA)) volatile &&;}; \
3736
+ \
3737
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) & , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) & ;}; \
3738
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) &&, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) &&;}; \
3739
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const & , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const & ;}; \
3740
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const &&, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const &&;}; \
3741
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile & , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile & ;}; \
3742
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile &&, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) const volatile &&;}; \
3743
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile & , C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile & ;}; \
3744
+ template <class C, class R, Z_FOR_##parameter_count##_APPEND_INDEX(class P, Z_COMMA)> struct TypeToMemberPointer<R(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile &&, C> {typedef R(C::*type)(Z_FOR_##parameter_count##_APPEND_INDEX(P, Z_COMMA), ...) volatile &&;};
3745
+
3746
+ Z_FOR_32_CALL_WITH_TIME(Z_TEMPLATE_SPECIALIZATIONS, Z_EMPTY)
3747
+ # undef Z_TEMPLATE_SPECIALIZATIONS
3748
+
3749
+ # endif
3750
+
3751
+ # endif
3752
+
3753
+ template <class T> class Type : public Detail::Type::Final<T> {
3754
+ public:
3755
+
3756
+ # if Z_TRAIT_HAS(Type, to_member_pointer)
3757
+ template <class klass> using to_member_pointer = typename TypeToMemberPointer<typename Type::type, klass>::type;
3758
+ # endif
3759
+
3760
+ # if Z_COMPILER_HAS_MAGIC_CONSTANT(MANGLED_FUNCTION_NAME) && Z_LANGUAGE_HAS(CPP, CPP14_RULES_ON_CONSTANT_EXPRESSION_FUNCTION)
3761
+
3762
+ # define Z_IMPLEMENTATION_MEMBER_FUNCTIONS \
3763
+ static Z_CT(CPP14) USize string_size() {return type_string_size <T>() ;} \
3764
+ static Z_CT(CPP14) SizedString<string_size()> string () {return type_string <T>() ;} \
3765
+ static Z_CT(CPP14) Symbol symbol () {return Symbol(type_string<T>());}
3766
+
3767
+ Z_IMPLEMENTATION_MEMBER_FUNCTIONS
3768
+ # else
3769
+ # define Z_IMPLEMENTATION_MEMBER_FUNCTIONS
3770
+ # endif
3771
+
3772
+ struct flow {
3773
+ enum { is_arithmetic = Type::is_arithmetic,
3774
+ is_array = Type::is_array,
3775
+ is_callable = Type::is_callable,
3776
+ is_char = Type::is_char,
3777
+ is_class = Type::is_class,
3778
+ is_const = Type::is_const,
3779
+ is_const_volatile = Type::is_const_volatile,
3780
+ is_data_member_pointer = Type::is_data_member_pointer,
3781
+ is_empty = Type::is_empty,
3782
+ is_exact = Type::is_exact,
3783
+ is_integer = Type::is_integer,
3784
+ is_integral = Type::is_integral,
3785
+ is_flexible_array = Type::is_flexible_array,
3786
+ is_function = Type::is_function,
3787
+ is_function_lvalue_reference = Type::is_function_lvalue_reference,
3788
+ is_function_pointer = Type::is_function_pointer,
3789
+ is_function_reference = Type::is_function_reference,
3790
+ is_fundamental = Type::is_fundamental,
3791
+ is_lvalue_reference = Type::is_lvalue_reference,
3792
+ is_member_function_pointer = Type::is_member_function_pointer,
3793
+ is_member_pointer = Type::is_member_pointer,
3794
+ is_nat = Type::is_nat,
3795
+ is_natural = Type::is_natural,
3796
+ is_number = Type::is_number,
3797
+ is_pointer = Type::is_pointer,
3798
+ is_qualified = Type::is_qualified,
3799
+ is_real = Type::is_real,
3800
+ is_reference = Type::is_reference,
3801
+ is_scalar = Type::is_scalar,
3802
+ is_schar = Type::is_schar,
3803
+ is_signed = Type::is_signed,
3804
+ is_signed_or_unsigned = Type::is_signed_or_unsigned,
3805
+ is_simple = Type::is_simple,
3806
+ is_sint = Type::is_sint,
3807
+ is_slong = Type::is_slong,
3808
+ is_sshort = Type::is_sshort,
3809
+ is_statically_allocatable = Type::is_statically_allocatable,
3810
+ is_storable = Type::is_storable,
3811
+ is_structure = Type::is_structure,
3812
+ is_structure_or_union = Type::is_structure_or_union,
3813
+ is_uchar = Type::is_uchar,
3814
+ is_uint = Type::is_uint,
3815
+ is_ulong = Type::is_ulong,
3816
+ is_unsigned = Type::is_unsigned,
3817
+ is_ushort = Type::is_ushort,
3818
+ is_valid = Type::is_valid,
3819
+ is_variadic = Type::is_variadic,
3820
+ is_variadic_function = Type::is_variadic_function,
3821
+ is_void = Type::is_void,
3822
+ is_void_pointer = Type::is_void_pointer,
3823
+ is_volatile = Type::is_volatile
3824
+ };
3825
+
3826
+ enum { arity = Type::arity,
3827
+ element_count = Type::element_count,
3828
+ pointer_level = Type::pointer_level
3829
+ };
3830
+
3831
+ enum { bits = Type::bits,
3832
+ size = Type::size
3833
+ };
3834
+
3835
+ typedef Type end;
3836
+
3837
+ typedef typename Type::type type;
3838
+
3839
+ typedef typename Type<typename Type::add_const >::flow add_const;
3840
+ typedef typename Type<typename Type::add_const_volatile >::flow add_const_volatile;
3841
+ typedef typename Type<typename Type::add_lvalue_reference >::flow add_lvalue_reference;
3842
+ typedef typename Type<typename Type::add_pointer >::flow add_pointer;
3843
+ typedef typename Type<typename Type::add_volatile >::flow add_volatile;
3844
+ typedef typename Type<typename Type::class_type >::flow class_type;
3845
+ typedef typename Type<typename Type::element_type >::flow element_type;
3846
+ typedef typename Type<typename Type::pointee_type >::flow pointee_type;
3847
+ typedef typename Type<typename Type::referencee_type >::flow referencee_type;
3848
+ typedef typename Type<typename Type::remove_const >::flow remove_const;
3849
+ typedef typename Type<typename Type::remove_const_volatile>::flow remove_const_volatile;
3850
+ typedef typename Type<typename Type::remove_pointer >::flow remove_pointer;
3851
+ typedef typename Type<typename Type::remove_reference >::flow remove_reference;
3852
+ typedef typename Type<typename Type::remove_volatile >::flow remove_volatile;
3853
+ typedef typename Type<typename Type::return_type >::flow return_type;
3854
+ typedef typename Type<typename Type::to_const >::flow to_const;
3855
+ typedef typename Type<typename Type::to_const_volatile >::flow to_const_volatile;
3856
+ typedef typename Type<typename Type::to_forwardable >::flow to_forwardable;
3857
+ typedef typename Type<typename Type::to_function >::flow to_function;
3858
+ typedef typename Type<typename Type::to_lvalue_reference >::flow to_lvalue_reference;
3859
+ typedef typename Type<typename Type::to_opaque >::flow to_opaque;
3860
+ typedef typename Type<typename Type::to_pointer >::flow to_pointer;
3861
+ typedef typename Type<typename Type::to_signed >::flow to_signed;
3862
+ typedef typename Type<typename Type::to_unqualified >::flow to_unqualified;
3863
+ typedef typename Type<typename Type::to_unsigned >::flow to_unsigned;
3864
+ typedef typename Type<typename Type::to_volatile >::flow to_volatile;
3865
+ typedef typename Type<typename Type::to_wrap >::flow to_wrap;
3866
+
3867
+ # if Z_TRAIT_HAS(Type, has_virtual_destructor)
3868
+ enum {has_virtual_destructor = Type::has_virtual_destructor};
3869
+ # endif
3870
+
3871
+ # if Z_TRAIT_HAS(Type, is_abstract)
3872
+ enum {is_abstract = Type::is_abstract};
3873
+ # endif
3874
+
3875
+ # if Z_TRAIT_HAS(Type, is_aggregate)
3876
+ enum {is_aggregate = Type::is_aggregate};
3877
+ # endif
3878
+
3879
+ # if Z_TRAIT_HAS(Type, is_boolean)
3880
+ enum {is_boolean = Type::is_boolean};
3881
+ # endif
3882
+
3883
+ /*# if Z_TRAIT_HAS(Type, is_char16)
3884
+ enum {is_char16 = Type::is_char16};
3885
+ # endif
3886
+
3887
+ # if Z_TRAIT_HAS(Type, is_char32)
3888
+ enum {is_char32 = Type::is_char32};
3889
+ # endif*/
3890
+
3891
+ # if Z_TRAIT_HAS(Type, is_default_constructible)
3892
+ enum {is_default_constructible = Type::is_default_constructible};
3893
+ # endif
3894
+
3895
+ # if Z_TRAIT_HAS(Type, is_double)
3896
+ enum {is_double = Type::is_double};
3897
+ # endif
3898
+
3899
+ # if Z_TRAIT_HAS(Type, is_enumeration)
3900
+ enum {is_enumeration = Type::is_enumeration};
3901
+ # endif
3902
+
3903
+ # if Z_TRAIT_HAS(Type, is_final)
3904
+ enum {is_final = Type::is_final};
3905
+ # endif
3906
+
3907
+ # if Z_TRAIT_HAS(Type, is_float)
3908
+ enum {is_float = Type::is_float};
3909
+ # endif
3910
+
3911
+ # if Z_TRAIT_HAS(Type, is_float16)
3912
+ enum {is_float16 = Type::is_float16};
3913
+ # endif
3914
+
3915
+ # if Z_TRAIT_HAS(Type, is_float32)
3916
+ enum {is_float32 = Type::is_float32};
3917
+ # endif
3918
+
3919
+ # if Z_TRAIT_HAS(Type, is_float64)
3920
+ enum {is_float64 = Type::is_float64};
3921
+ # endif
3922
+
3923
+ # if Z_TRAIT_HAS(Type, is_float128)
3924
+ enum {is_float128 = Type::is_float128};
3925
+ # endif
3926
+
3927
+ # if Z_TRAIT_HAS(Type, is_float80_x87)
3928
+ enum {is_float80_x87 = Type::is_float80_x87};
3929
+ # endif
3930
+
3931
+ # if Z_TRAIT_HAS(Type, is_float96_x87)
3932
+ enum {is_float96_x87 = Type::is_float96_x87};
3933
+ # endif
3934
+
3935
+ # if Z_TRAIT_HAS(Type, is_float128_x87)
3936
+ enum {is_float128_x87 = Type::is_float128_x87};
3937
+ # endif
3938
+
3939
+ # if Z_TRAIT_HAS(Type, is_interface_class)
3940
+ enum {is_interface_class = Type::is_interface_class};
3941
+ # endif
3942
+
3943
+ # if Z_TRAIT_HAS(Type, is_ldouble)
3944
+ enum {is_ldouble = Type::is_ldouble};
3945
+ # endif
3946
+
3947
+ # if Z_TRAIT_HAS(Type, is_literal)
3948
+ enum {is_literal = Type::is_literal};
3949
+ # endif
3950
+
3951
+ # if Z_TRAIT_HAS(Type, is_null_pointer)
3952
+ enum {is_null_pointer = Type::is_null_pointer};
3953
+ # endif
3954
+
3955
+ # if Z_TRAIT_HAS(Type, is_pod)
3956
+ enum {is_pod = Type::is_pod};
3957
+ # endif
3958
+
3959
+ # if Z_TRAIT_HAS(Type, is_polymorphic)
3960
+ enum {is_polymorphic = Type::is_polymorphic};
3961
+ # endif
3962
+
3963
+ # if Z_TRAIT_HAS(Type, is_sint8)
3964
+ enum {is_sint8 = Type::is_sint8};
3965
+ # endif
3966
+
3967
+ # if Z_TRAIT_HAS(Type, is_sint16)
3968
+ enum {is_sint16 = Type::is_sint16};
3969
+ # endif
3970
+
3971
+ # if Z_TRAIT_HAS(Type, is_sint32)
3972
+ enum {is_sint32 = Type::is_sint32};
3973
+ # endif
3974
+
3975
+ # if Z_TRAIT_HAS(Type, is_sint64)
3976
+ enum {is_sint64 = Type::is_sint64};
3977
+ # endif
3978
+
3979
+ # if Z_TRAIT_HAS(Type, is_sint128)
3980
+ enum {is_sint128 = Type::is_sint128};
3981
+ # endif
3982
+
3983
+ # if Z_TRAIT_HAS(Type, is_template)
3984
+ enum {is_template = Type::is_template};
3985
+ # endif
3986
+
3987
+ # if Z_TRAIT_HAS(Type, is_trivially_copy_assignable)
3988
+ enum {is_trivially_copy_assignable = Type::is_trivially_copy_assignable};
3989
+ # endif
3990
+
3991
+ # if Z_TRAIT_HAS(Type, is_trivially_copy_constructible)
3992
+ enum {is_trivially_copy_constructible = Type::is_trivially_copy_constructible};
3993
+ # endif
3994
+
3995
+ # if Z_TRAIT_HAS(Type, is_trivially_copyable)
3996
+ enum {is_trivially_copyable = Type::is_trivially_copyable};
3997
+ # endif
3998
+
3999
+ # if Z_TRAIT_HAS(Type, is_trivially_default_constructible)
4000
+ enum {is_trivially_default_constructible = Type::is_trivially_default_constructible};
4001
+ # endif
4002
+
4003
+ # if Z_TRAIT_HAS(Type, is_trivially_destructible)
4004
+ enum {is_trivially_destructible = Type::is_trivially_destructible};
4005
+ # endif
4006
+
4007
+ # if Z_TRAIT_HAS(Type, is_uint8)
4008
+ enum {is_uint8 = Type::is_uint8};
4009
+ # endif
4010
+
4011
+ # if Z_TRAIT_HAS(Type, is_uint16)
4012
+ enum {is_uint16 = Type::is_uint16};
4013
+ # endif
4014
+
4015
+ # if Z_TRAIT_HAS(Type, is_uint32)
4016
+ enum {is_uint32 = Type::is_uint32};
4017
+ # endif
4018
+
4019
+ # if Z_TRAIT_HAS(Type, is_uint64)
4020
+ enum {is_uint64 = Type::is_uint64};
4021
+ # endif
4022
+
4023
+ # if Z_TRAIT_HAS(Type, is_uint128)
4024
+ enum {is_uint128 = Type::is_uint128};
4025
+ # endif
4026
+
4027
+ # if Z_TRAIT_HAS(Type, is_union)
4028
+ enum {is_union = Type::is_union};
4029
+ # endif
4030
+
4031
+ /*# if Z_TRAIT_HAS(Type, is_wchar)
4032
+ enum {is_wchar = Type::is_wchar};
4033
+ # endif*/
4034
+
4035
+ # if Z_LANGUAGE_INCLUDES(OBJECTIVE_CPP)
4036
+
4037
+ enum { is_objective_c_class = Type::is_objective_c_class,
4038
+ is_objective_c_class_pointer = Type::is_objective_c_class_pointer,
4039
+ is_objective_c_object = Type::is_objective_c_object,
4040
+ is_objective_c_object_pointer = Type::is_objective_c_object_pointer
4041
+ };
4042
+
4043
+ # if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
4044
+ enum { is_objective_c_instance = Type::is_objective_c_instance,
4045
+ is_objective_c_instance_pointer = Type::is_objective_c_instance_pointer
4046
+ };
4047
+ # endif
4048
+
4049
+ # endif
4050
+
4051
+ # ifdef Z_LLONG
4052
+ enum { is_sllong = Type::is_sllong,
4053
+ is_ullong = Type::is_ullong
4054
+ };
4055
+ # endif
4056
+
4057
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
4058
+
4059
+ enum { is_const_lvalue = Type::is_const_lvalue,
4060
+ is_const_rvalue = Type::is_const_rvalue,
4061
+ is_const_volatile_lvalue = Type::is_const_volatile_lvalue,
4062
+ is_const_volatile_rvalue = Type::is_const_volatile_rvalue,
4063
+ is_lvalue = Type::is_lvalue,
4064
+ is_rvalue = Type::is_rvalue,
4065
+ is_volatile_lvalue = Type::is_volatile_lvalue,
4066
+ is_volatile_rvalue = Type::is_volatile_rvalue
4067
+ };
4068
+
4069
+ typedef typename Type<typename Type::add_const_lvalue >::flow add_const_lvalue;
4070
+ typedef typename Type<typename Type::add_const_rvalue >::flow add_const_rvalue;
4071
+ typedef typename Type<typename Type::add_const_volatile_lvalue >::flow add_const_volatile_lvalue;
4072
+ typedef typename Type<typename Type::add_const_volatile_rvalue >::flow add_const_volatile_rvalue;
4073
+ typedef typename Type<typename Type::add_lvalue >::flow add_lvalue;
4074
+ typedef typename Type<typename Type::add_rvalue >::flow add_rvalue;
4075
+ typedef typename Type<typename Type::add_volatile_lvalue >::flow add_volatile_lvalue;
4076
+ typedef typename Type<typename Type::add_volatile_rvalue >::flow add_volatile_rvalue;
4077
+ typedef typename Type<typename Type::remove_const_this >::flow remove_const_this;
4078
+ typedef typename Type<typename Type::remove_const_volatile_this>::flow remove_const_volatile_this;
4079
+ typedef typename Type<typename Type::remove_this >::flow remove_this;
4080
+ typedef typename Type<typename Type::remove_volatile_this >::flow remove_volatile_this;
4081
+ typedef typename Type<typename Type::to_const_lvalue >::flow to_const_lvalue;
4082
+ typedef typename Type<typename Type::to_const_rvalue >::flow to_const_rvalue;
4083
+ typedef typename Type<typename Type::to_const_volatile_lvalue >::flow to_const_volatile_lvalue;
4084
+ typedef typename Type<typename Type::to_const_volatile_rvalue >::flow to_const_volatile_rvalue;
4085
+ typedef typename Type<typename Type::to_lvalue >::flow to_lvalue;
4086
+ typedef typename Type<typename Type::to_rvalue >::flow to_rvalue;
4087
+ typedef typename Type<typename Type::to_volatile_lvalue >::flow to_volatile_lvalue;
4088
+ typedef typename Type<typename Type::to_volatile_rvalue >::flow to_volatile_rvalue;
4089
+
4090
+ # endif
4091
+
4092
+ # if Z_LANGUAGE_HAS(CPP, RVALUE_REFERENCE)
4093
+
4094
+ enum { is_function_rvalue_reference = Type::is_function_rvalue_reference,
4095
+ is_rvalue_reference = Type::is_rvalue_reference
4096
+ };
4097
+
4098
+ typedef typename Type<typename Type::add_rvalue_reference >::flow add_rvalue_reference;
4099
+ typedef typename Type<typename Type::to_rvalue_reference >::flow to_rvalue_reference;
4100
+
4101
+ # endif
4102
+
4103
+ # if Z_TRAIT_HAS(Type, parameters)
4104
+ typedef typename Type::parameters parameters;
4105
+ # endif
4106
+
4107
+ # if Z_TRAIT_HAS(Type, underlying_type)
4108
+ typedef typename Type<typename Type::underlying_type>::flow underlying_type;
4109
+ # endif
4110
+
4111
+ # if Z_TRAIT_HAS(Type, to_member_pointer)
4112
+ template <class klass> using to_member_pointer = typename Type<typename Type::to_member_pointer<klass> >::flow;
4113
+ # endif
4114
+
4115
+ Z_IMPLEMENTATION_MEMBER_FUNCTIONS
4116
+ };
4117
+
4118
+ # undef Z_IMPLEMENTATION_MEMBER_FUNCTIONS
4119
+ };
4120
+
4121
+ template <class T> struct TypeArity {enum {value = Type<T>::arity };};
4122
+ template <class T> struct TypeBits {enum {value = Type<T>::bits };};
4123
+ template <class T> struct TypeElementCount {enum {value = Type<T>::element_count };};
4124
+ template <class T> struct TypeIsArithmetic {enum {value = Type<T>::is_arithmetic };};
4125
+ template <class T> struct TypeIsArray {enum {value = Type<T>::is_array };};
4126
+ template <class T> struct TypeIsCallable {enum {value = Type<T>::is_callable };};
4127
+ template <class T> struct TypeIsChar {enum {value = Type<T>::is_char };};
4128
+ template <class T> struct TypeIsClass {enum {value = Type<T>::is_class };};
4129
+ template <class T> struct TypeIsConst {enum {value = Type<T>::is_const };};
4130
+ template <class T> struct TypeIsConstVolatile {enum {value = Type<T>::is_const_volatile };};
4131
+ template <class T> struct TypeIsDataMemberPointer {enum {value = Type<T>::is_data_member_pointer };};
4132
+ template <class T> struct TypeIsEmpty {enum {value = Type<T>::is_empty };};
4133
+ template <class T> struct TypeIsExact {enum {value = Type<T>::is_exact };};
4134
+ template <class T> struct TypeIsInteger {enum {value = Type<T>::is_integer };};
4135
+ template <class T> struct TypeIsIntegral {enum {value = Type<T>::is_integral };};
4136
+ template <class T> struct TypeIsFlexibleArray {enum {value = Type<T>::is_flexible_array };};
4137
+ template <class T> struct TypeIsFunction {enum {value = Type<T>::is_function };};
4138
+ template <class T> struct TypeIsFunctionLValueReference {enum {value = Type<T>::is_function_lvalue_reference};};
4139
+ template <class T> struct TypeIsFunctionPointer {enum {value = Type<T>::is_function_pointer };};
4140
+ template <class T> struct TypeIsFunctionReference {enum {value = Type<T>::is_function_reference };};
4141
+ template <class T> struct TypeIsFundamental {enum {value = Type<T>::is_fundamental };};
4142
+ template <class T> struct TypeIsLValueReference {enum {value = Type<T>::is_lvalue_reference };};
4143
+ template <class T> struct TypeIsMemberFunctionPointer {enum {value = Type<T>::is_member_function_pointer };};
4144
+ template <class T> struct TypeIsMemberPointer {enum {value = Type<T>::is_member_pointer };};
4145
+ template <class T> struct TypeIsNaT {enum {value = Type<T>::is_nat };};
4146
+ template <class T> struct TypeIsNatural {enum {value = Type<T>::is_natural };};
4147
+ template <class T> struct TypeIsNumber {enum {value = Type<T>::is_number };};
4148
+ template <class T> struct TypeIsPointer {enum {value = Type<T>::is_pointer };};
4149
+ template <class T> struct TypeIsQualified {enum {value = Type<T>::is_qualified };};
4150
+ template <class T> struct TypeIsReal {enum {value = Type<T>::is_real };};
4151
+ template <class T> struct TypeIsReference {enum {value = Type<T>::is_reference };};
4152
+ template <class T> struct TypeIsScalar {enum {value = Type<T>::is_scalar };};
4153
+ template <class T> struct TypeIsSChar {enum {value = Type<T>::is_schar };};
4154
+ template <class T> struct TypeIsSigned {enum {value = Type<T>::is_signed };};
4155
+ template <class T> struct TypeIsSignedOrUnsigned {enum {value = Type<T>::is_signed_or_unsigned };};
4156
+ template <class T> struct TypeIsSimple {enum {value = Type<T>::is_simple };};
4157
+ template <class T> struct TypeIsSInt {enum {value = Type<T>::is_sint };};
4158
+ template <class T> struct TypeIsSLong {enum {value = Type<T>::is_slong };};
4159
+ template <class T> struct TypeIsSShort {enum {value = Type<T>::is_sshort };};
4160
+ template <class T> struct TypeIsStaticallyAllocatable {enum {value = Type<T>::is_statically_allocatable };};
4161
+ template <class T> struct TypeIsStorable {enum {value = Type<T>::is_storable };};
4162
+ template <class T> struct TypeIsStructure {enum {value = Type<T>::is_structure };};
4163
+ template <class T> struct TypeIsStructureOrUnion {enum {value = Type<T>::is_structure_or_union };};
4164
+ template <class T> struct TypeIsUChar {enum {value = Type<T>::is_uchar };};
4165
+ template <class T> struct TypeIsUInt {enum {value = Type<T>::is_uint };};
4166
+ template <class T> struct TypeIsULong {enum {value = Type<T>::is_ulong };};
4167
+ template <class T> struct TypeIsUnsigned {enum {value = Type<T>::is_unsigned };};
4168
+ template <class T> struct TypeIsUShort {enum {value = Type<T>::is_ushort };};
4169
+ template <class T> struct TypeIsValid {enum {value = Type<T>::is_valid };};
4170
+ template <class T> struct TypeIsVariadic {enum {value = Type<T>::is_variadic };};
4171
+ template <class T> struct TypeIsVariadicFunction {enum {value = Type<T>::is_variadic_function };};
4172
+ template <class T> struct TypeIsVoid {enum {value = Type<T>::is_void };};
4173
+ template <class T> struct TypeIsVoidPointer {enum {value = Type<T>::is_void_pointer };};
4174
+ template <class T> struct TypeIsVolatile {enum {value = Type<T>::is_volatile };};
4175
+ template <class T> struct TypePointerLevel {enum {value = Type<T>::pointer_level };};
4176
+ template <class T> struct TypeSize {enum {value = Type<T>::size };};
4177
+
4178
+ template <class T> struct TypeAddConst {typedef typename Type<T>::add_const type;};
4179
+ template <class T> struct TypeAddConstVolatile {typedef typename Type<T>::add_const_volatile type;};
4180
+ template <class T> struct TypeAddLValueReference {typedef typename Type<T>::add_lvalue_reference type;};
4181
+ template <class T> struct TypeAddPointer {typedef typename Type<T>::add_pointer type;};
4182
+ template <class T> struct TypeAddVolatile {typedef typename Type<T>::add_volatile type;};
4183
+ template <class T> struct TypeClassType {typedef typename Type<T>::class_type type;};
4184
+ template <class T> struct TypeElementType {typedef typename Type<T>::element_type type;};
4185
+ template <class T> struct TypePointeeType {typedef typename Type<T>::pointee_type type;};
4186
+ template <class T> struct TypeReferenceeType {typedef typename Type<T>::referencee_type type;};
4187
+ template <class T> struct TypeRemoveConst {typedef typename Type<T>::remove_const type;};
4188
+ template <class T> struct TypeRemoveConstVolatile {typedef typename Type<T>::remove_const_volatile type;};
4189
+ template <class T> struct TypeRemovePointer {typedef typename Type<T>::remove_pointer type;};
4190
+ template <class T> struct TypeRemoveReference {typedef typename Type<T>::remove_reference type;};
4191
+ template <class T> struct TypeRemoveVolatile {typedef typename Type<T>::remove_volatile type;};
4192
+ template <class T> struct TypeReturnType {typedef typename Type<T>::return_type type;};
4193
+ template <class T> struct TypeToConst {typedef typename Type<T>::to_const type;};
4194
+ template <class T> struct TypeToConstVolatile {typedef typename Type<T>::to_const_volatile type;};
4195
+ template <class T> struct TypeToForwardable {typedef typename Type<T>::to_forwardable type;};
4196
+ template <class T> struct TypeToFunction {typedef typename Type<T>::to_function type;};
4197
+ template <class T> struct TypeToLValueReference {typedef typename Type<T>::to_lvalue_reference type;};
4198
+ template <class T> struct TypeToOpaque {typedef typename Type<T>::to_opaque type;};
4199
+ template <class T> struct TypeToPointer {typedef typename Type<T>::to_pointer type;};
4200
+ template <class T> struct TypeToSigned {typedef typename Type<T>::to_signed type;};
4201
+ template <class T> struct TypeToUnqualified {typedef typename Type<T>::to_unqualified type;};
4202
+ template <class T> struct TypeToUnsigned {typedef typename Type<T>::to_unsigned type;};
4203
+ template <class T> struct TypeToVolatile {typedef typename Type<T>::to_volatile type;};
4204
+ template <class T> struct TypeToWrap {typedef typename Type<T>::to_wrap type;};
4205
+
4206
+ # if Z_HAS_TRAIT(TypeHasVirtualDestructor)
4207
+ template <class T> struct TypeHasVirtualDestructor {enum {value = Type<T>::has_virtual_destructor};};
4208
+ # endif
4209
+
4210
+ # if Z_HAS_TRAIT(TypeIsAbstract)
4211
+ template <class T> struct TypeIsAbstract {enum {value = Type<T>::is_abstract};};
4212
+ # endif
4213
+
4214
+ # if Z_HAS_TRAIT(TypeIsAggregate)
4215
+ template <class T> struct TypeIsAggregate {enum {value = Type<T>::is_aggregate};};
4216
+ # endif
4217
+
4218
+ # if Z_HAS_TRAIT(TypeIsBoolean)
4219
+ template <class T> struct TypeIsBoolean {enum {value = Type<T>::is_boolean};};
4220
+ # endif
4221
+
4222
+ /*# if Z_HAS_TRAIT(TypeIsChar16)
4223
+ template <class T> struct TypeIsChar16 {enum {value = Type<T>::is_char16};};
4224
+ # endif
4225
+
4226
+ # if Z_HAS_TRAIT(TypeIsChar32)
4227
+ template <class T> struct TypeIsChar32 {enum {value = Type<T>::is_char32};};
4228
+ # endif*/
4229
+
4230
+ # if Z_HAS_TRAIT(TypeIsDefaultConstructible)
4231
+ template <class T> struct TypeIsDefaultConstructible {enum {value = Type<T>::is_default_constructible};};
4232
+ # endif
4233
+
4234
+ # if Z_HAS_TRAIT(TypeIsDouble)
4235
+ template <class T> struct TypeIsDouble {enum {value = Type<T>::is_double};};
4236
+ # endif
4237
+
4238
+ # if Z_HAS_TRAIT(TypeIsEnumeration)
4239
+ template <class T> struct TypeIsEnumeration {enum {value = Type<T>::is_enumeration};};
4240
+ # endif
4241
+
4242
+ # if Z_HAS_TRAIT(TypeIsFinal)
4243
+ template <class T> struct TypeIsFinal {enum {value = Type<T>::is_final};};
4244
+ # endif
4245
+
4246
+ # if Z_HAS_TRAIT(TypeIsFloat)
4247
+ template <class T> struct TypeIsFloat {enum {value = Type<T>::is_float};};
4248
+ # endif
4249
+
4250
+ # if Z_HAS_TRAIT(TypeIsFloat16)
4251
+ template <class T> struct TypeIsFloat16 {enum {value = Type<T>::is_float16};};
4252
+ # endif
4253
+
4254
+ # if Z_HAS_TRAIT(TypeIsFloat32)
4255
+ template <class T> struct TypeIsFloat32 {enum {value = Type<T>::is_float32};};
4256
+ # endif
4257
+
4258
+ # if Z_HAS_TRAIT(TypeIsFloat64)
4259
+ template <class T> struct TypeIsFloat64 {enum {value = Type<T>::is_float64};};
4260
+ # endif
4261
+
4262
+ # if Z_HAS_TRAIT(TypeIsFloat128)
4263
+ template <class T> struct TypeIsFloat128 {enum {value = Type<T>::is_float128};};
4264
+ # endif
4265
+
4266
+ # if Z_HAS_TRAIT(TypeIsFloat80_x87)
4267
+ template <class T> struct TypeIsFloat80_x87 {enum {value = Type<T>::is_float80_x87};};
4268
+ # endif
4269
+
4270
+ # if Z_HAS_TRAIT(TypeIsFloat96_x87)
4271
+ template <class T> struct TypeIsFloat96_x87 {enum {value = Type<T>::is_float96_x87};};
4272
+ # endif
4273
+
4274
+ # if Z_HAS_TRAIT(TypeIsFloat128_x87)
4275
+ template <class T> struct TypeIsFloat128_x87 {enum {value = Type<T>::is_float128_x87};};
4276
+ # endif
4277
+
4278
+ # if Z_HAS_TRAIT(TypeIsInterfaceClass)
4279
+ template <class T> struct TypeIsInterfaceClass {enum {value = Type<T>::is_interface_class};};
4280
+ # endif
4281
+
4282
+ # if Z_HAS_TRAIT(TypeIsLDouble)
4283
+ template <class T> struct TypeIsLDouble {enum {value = Type<T>::is_ldouble};};
4284
+ # endif
4285
+
4286
+ # if Z_HAS_TRAIT(TypeIsLiteral)
4287
+ template <class T> struct TypeIsLiteral {enum {value = Type<T>::is_literal};};
4288
+ # endif
4289
+
4290
+ # if Z_HAS_TRAIT(TypeIsNullPointer)
4291
+ template <class T> struct TypeIsNullPointer {enum {value = Type<T>::is_null_pointer};};
4292
+ # endif
4293
+
4294
+ # if Z_HAS_TRAIT(TypeIsPOD)
4295
+ template <class T> struct TypeIsPOD {enum {value = Type<T>::is_pod};};
4296
+ # endif
4297
+
4298
+ # if Z_HAS_TRAIT(TypeIsPolymorphic)
4299
+ template <class T> struct TypeIsPolymorphic {enum {value = Type<T>::is_polymorphic};};
4300
+ # endif
4301
+
4302
+ # if Z_HAS_TRAIT(TypeIsSInt8)
4303
+ template <class T> struct TypeIsSInt8 {enum {value = Type<T>::is_sint8};};
4304
+ # endif
4305
+
4306
+ # if Z_HAS_TRAIT(TypeIsSInt16)
4307
+ template <class T> struct TypeIsSInt16 {enum {value = Type<T>::is_sint16};};
4308
+ # endif
4309
+
4310
+ # if Z_HAS_TRAIT(TypeIsSInt32)
4311
+ template <class T> struct TypeIsSInt32 {enum {value = Type<T>::is_sint32};};
4312
+ # endif
4313
+
4314
+ # if Z_HAS_TRAIT(TypeIsSInt64)
4315
+ template <class T> struct TypeIsSInt64 {enum {value = Type<T>::is_sint64};};
4316
+ # endif
4317
+
4318
+ # if Z_HAS_TRAIT(TypeIsSInt128)
4319
+ template <class T> struct TypeIsSInt128 {enum {value = Type<T>::is_sint128};};
4320
+ # endif
4321
+
4322
+ # if Z_HAS_TRAIT(TypeIsTemplate)
4323
+ template <class T> struct TypeIsTemplate {enum {value = Type<T>::is_template};};
4324
+ # endif
4325
+
4326
+ # if Z_HAS_TRAIT(TypeIsTriviallyCopyAssignable)
4327
+ template <class T> struct TypeIsTriviallyCopyAssignable {enum {value = Type<T>::is_trivially_copy_assignable};};
4328
+ # endif
4329
+
4330
+ # if Z_HAS_TRAIT(TypeIsTriviallyCopyConstructible)
4331
+ template <class T> struct TypeIsTriviallyCopyConstructible {enum {value = Type<T>::is_trivially_copy_constructible};};
4332
+ # endif
4333
+
4334
+ # if Z_HAS_TRAIT(TypeIsTriviallyCopyable)
4335
+ template <class T> struct TypeIsTriviallyCopyable {enum {value = Type<T>::is_trivially_copyable};};
4336
+ # endif
4337
+
4338
+ # if Z_HAS_TRAIT(TypeIsTriviallyDefaultConstructible)
4339
+ template <class T> struct TypeIsTriviallyDefaultConstructible {enum {value = Type<T>::is_trivially_default_constructible};};
4340
+ # endif
4341
+
4342
+ # if Z_HAS_TRAIT(TypeIsTriviallyDestructible)
4343
+ template <class T> struct TypeIsTriviallyDestructible {enum {value = Type<T>::is_trivially_destructible};};
4344
+ # endif
4345
+
4346
+ # if Z_HAS_TRAIT(TypeIsUInt8)
4347
+ template <class T> struct TypeIsUInt8 {enum {value = Type<T>::is_uint8};};
4348
+ # endif
4349
+
4350
+ # if Z_HAS_TRAIT(TypeIsUInt16)
4351
+ template <class T> struct TypeIsUInt16 {enum {value = Type<T>::is_uint16};};
4352
+ # endif
4353
+
4354
+ # if Z_HAS_TRAIT(TypeIsUInt32)
4355
+ template <class T> struct TypeIsUInt32 {enum {value = Type<T>::is_uint32};};
4356
+ # endif
4357
+
4358
+ # if Z_HAS_TRAIT(TypeIsUInt64)
4359
+ template <class T> struct TypeIsUInt64 {enum {value = Type<T>::is_uint64};};
4360
+ # endif
4361
+
4362
+ # if Z_HAS_TRAIT(TypeIsUInt128)
4363
+ template <class T> struct TypeIsUInt128 {enum {value = Type<T>::is_uint128};};
4364
+ # endif
4365
+
4366
+ # if Z_HAS_TRAIT(TypeIsUnion)
4367
+ template <class T> struct TypeIsUnion {enum {value = Type<T>::is_union};};
4368
+ # endif
4369
+
4370
+ /*# if Z_HAS_TRAIT(TypeIsWChar)
4371
+ template <class T> struct TypeIsWChar {enum {value = Type<T>::is_wchar};};
4372
+ # endif*/
4373
+
4374
+ # if Z_LANGUAGE_INCLUDES(OBJECTIVE_CPP)
4375
+
4376
+ template <class T> struct TypeIsObjectiveCClass {enum {value = Type<T>::is_objective_c_class };};
4377
+ template <class T> struct TypeIsObjectiveCClassPointer {enum {value = Type<T>::is_objective_c_class_pointer };};
4378
+ template <class T> struct TypeIsObjectiveCObject {enum {value = Type<T>::is_objective_c_object };};
4379
+ template <class T> struct TypeIsObjectiveCObjectPointer {enum {value = Type<T>::is_objective_c_object_pointer};};
4380
+
4381
+ # if Z_LANGUAGE_HAS(CPP, EXPRESSION_SFINAE)
4382
+ template <class T> struct TypeIsObjectiveCInstance {enum {value = Type<T>::is_objective_c_instance };};
4383
+ template <class T> struct TypeIsObjectiveCInstancePointer {enum {value = Type<T>::is_objective_c_instance_pointer};};
4384
+ # endif
4385
+
4386
+ # endif
4387
+
4388
+ # ifdef Z_LLONG
4389
+ template <class T> struct TypeIsSLLong {enum {value = Type<T>::is_sllong};};
4390
+ template <class T> struct TypeIsULLong {enum {value = Type<T>::is_ullong};};
4391
+ # endif
4392
+
4393
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
4394
+
4395
+ template <class T> struct TypeIsConstLValue {enum {value = Type<T>::is_const_lvalue };};
4396
+ template <class T> struct TypeIsConstRValue {enum {value = Type<T>::is_const_rvalue };};
4397
+ template <class T> struct TypeIsConstVolatileLValue {enum {value = Type<T>::is_const_volatile_lvalue};};
4398
+ template <class T> struct TypeIsConstVolatileRValue {enum {value = Type<T>::is_const_volatile_rvalue};};
4399
+ template <class T> struct TypeIsLValue {enum {value = Type<T>::is_lvalue };};
4400
+ template <class T> struct TypeIsRValue {enum {value = Type<T>::is_rvalue };};
4401
+ template <class T> struct TypeIsVolatileLValue {enum {value = Type<T>::is_volatile_lvalue };};
4402
+ template <class T> struct TypeIsVolatileRValue {enum {value = Type<T>::is_volatile_rvalue };};
4403
+
4404
+ template <class T> struct TypeAddConstLValue {typedef typename Type<T>::add_const_lvalue type;};
4405
+ template <class T> struct TypeAddConstRValue {typedef typename Type<T>::add_const_rvalue type;};
4406
+ template <class T> struct TypeAddConstVolatileLValue {typedef typename Type<T>::add_const_volatile_lvalue type;};
4407
+ template <class T> struct TypeAddConstVolatileRValue {typedef typename Type<T>::add_const_volatile_rvalue type;};
4408
+ template <class T> struct TypeAddLValue {typedef typename Type<T>::add_lvalue type;};
4409
+ template <class T> struct TypeAddRValue {typedef typename Type<T>::add_rvalue type;};
4410
+ template <class T> struct TypeAddVolatileLValue {typedef typename Type<T>::add_volatile_lvalue type;};
4411
+ template <class T> struct TypeAddVolatileRValue {typedef typename Type<T>::add_volatile_rvalue type;};
4412
+ template <class T> struct TypeRemoveConstThis {typedef typename Type<T>::remove_const_this type;};
4413
+ template <class T> struct TypeRemoveConstVolatileThis {typedef typename Type<T>::remove_const_volatile_this type;};
4414
+ template <class T> struct TypeRemoveThis {typedef typename Type<T>::remove_this type;};
4415
+ template <class T> struct TypeRemoveVolatileThis {typedef typename Type<T>::remove_volatile_this type;};
4416
+ template <class T> struct TypeToConstLValue {typedef typename Type<T>::to_const_lvalue type;};
4417
+ template <class T> struct TypeToConstRValue {typedef typename Type<T>::to_const_rvalue type;};
4418
+ template <class T> struct TypeToConstVolatileLValue {typedef typename Type<T>::to_const_volatile_lvalue type;};
4419
+ template <class T> struct TypeToConstVolatileRValue {typedef typename Type<T>::to_const_volatile_rvalue type;};
4420
+ template <class T> struct TypeToLValue {typedef typename Type<T>::to_lvalue type;};
4421
+ template <class T> struct TypeToRValue {typedef typename Type<T>::to_rvalue type;};
4422
+ template <class T> struct TypeToVolatileLValue {typedef typename Type<T>::to_volatile_lvalue type;};
4423
+ template <class T> struct TypeToVolatileRValue {typedef typename Type<T>::to_volatile_rvalue type;};
4424
+
4425
+ # endif
4426
+
4427
+ # if Z_LANGUAGE_HAS(CPP, RVALUE_REFERENCE)
4428
+
4429
+ template <class T> struct TypeIsFunctionRValueReference {enum {value = Type<T>::is_function_rvalue_reference};};
4430
+ template <class T> struct TypeIsRValueReference {enum {value = Type<T>::is_rvalue_reference };};
4431
+
4432
+ template <class T> struct TypeAddRValueReference {typedef typename Type<T>::add_rvalue_reference type;};
4433
+ template <class T> struct TypeToRValueReference {typedef typename Type<T>::to_rvalue_reference type;};
4434
+
4435
+ # endif
4436
+
4437
+ # if Z_HAS_TRAIT(TypeParameters)
4438
+ template <class T> struct TypeParameters {typedef typename Type<T>::parameters type;};
4439
+ # endif
4440
+
4441
+ # if Z_HAS_TRAIT(TypeUnderlyingType)
4442
+ template <class T> struct TypeUnderlyingType {typedef typename Type<T>::underlying_type type;};
4443
+ # endif
4444
+
4445
+ # if Z_LANGUAGE_HAS(CPP, TEMPLATE_ALIAS)
4446
+
4447
+ template <class T> using type_add_const = typename Type<T>::add_const;
4448
+ template <class T> using type_add_const_volatile = typename Type<T>::add_const_volatile;
4449
+ template <class T> using type_add_lvalue_reference = typename Type<T>::add_lvalue_reference;
4450
+ template <class T> using type_add_pointer = typename Type<T>::add_pointer;
4451
+ template <class T> using type_add_volatile = typename Type<T>::add_volatile;
4452
+ template <class T> using type_class_type = typename Type<T>::class_type;
4453
+ template <class T> using type_element_type = typename Type<T>::element_type;
4454
+ template <class T> using type_pointee_type = typename Type<T>::pointee_type;
4455
+ template <class T> using type_referencee_type = typename Type<T>::referencee_type;
4456
+ template <class T> using type_remove_const = typename Type<T>::remove_const;
4457
+ template <class T> using type_remove_const_volatile = typename Type<T>::remove_const_volatile;
4458
+ template <class T> using type_remove_pointer = typename Type<T>::remove_pointer;
4459
+ template <class T> using type_remove_reference = typename Type<T>::remove_reference;
4460
+ template <class T> using type_remove_volatile = typename Type<T>::remove_volatile;
4461
+ template <class T> using type_return_type = typename Type<T>::return_type;
4462
+ template <class T> using type_to_const = typename Type<T>::to_const;
4463
+ template <class T> using type_to_const_volatile = typename Type<T>::to_const_volatile;
4464
+ template <class T> using type_to_forwardable = typename Type<T>::to_forwardable;
4465
+ template <class T> using type_to_function = typename Type<T>::to_function;
4466
+ template <class T> using type_to_lvalue_reference = typename Type<T>::to_lvalue_reference;
4467
+ template <class T> using type_to_opaque = typename Type<T>::to_opaque;
4468
+ template <class T> using type_to_pointer = typename Type<T>::to_pointer;
4469
+ template <class T> using type_to_signed = typename Type<T>::to_signed;
4470
+ template <class T> using type_to_unqualified = typename Type<T>::to_unqualified;
4471
+ template <class T> using type_to_unsigned = typename Type<T>::to_unsigned;
4472
+ template <class T> using type_to_volatile = typename Type<T>::to_volatile;
4473
+ template <class T> using type_to_wrap = typename Type<T>::to_wrap;
4474
+
4475
+ template <class T, class klass> using type_to_member_pointer = typename TypeToMemberPointer<T, klass>::type;
4476
+
4477
+ # if Z_LANGUAGE_HAS(CPP, REFERENCE_QUALIFIED_NON_STATIC_MEMBER_FUNCTION)
4478
+ template <class T> using type_add_const_lvalue = typename Type<T>::add_const_lvalue;
4479
+ template <class T> using type_add_const_rvalue = typename Type<T>::add_const_rvalue;
4480
+ template <class T> using type_add_const_volatile_lvalue = typename Type<T>::add_const_volatile_lvalue;
4481
+ template <class T> using type_add_const_volatile_rvalue = typename Type<T>::add_const_volatile_rvalue;
4482
+ template <class T> using type_add_lvalue = typename Type<T>::add_lvalue;
4483
+ template <class T> using type_add_rvalue = typename Type<T>::add_rvalue;
4484
+ template <class T> using type_add_volatile_lvalue = typename Type<T>::add_volatile_lvalue;
4485
+ template <class T> using type_add_volatile_rvalue = typename Type<T>::add_volatile_rvalue;
4486
+ template <class T> using type_remove_const_this = typename Type<T>::remove_const_this;
4487
+ template <class T> using type_remove_const_volatile_this = typename Type<T>::remove_const_volatile_this;
4488
+ template <class T> using type_remove_this = typename Type<T>::remove_this;
4489
+ template <class T> using type_remove_volatile_this = typename Type<T>::remove_volatile_this;
4490
+ template <class T> using type_to_const_lvalue = typename Type<T>::to_const_lvalue;
4491
+ template <class T> using type_to_const_rvalue = typename Type<T>::to_const_rvalue;
4492
+ template <class T> using type_to_const_volatile_lvalue = typename Type<T>::to_const_volatile_lvalue;
4493
+ template <class T> using type_to_const_volatile_rvalue = typename Type<T>::to_const_volatile_rvalue;
4494
+ template <class T> using type_to_lvalue = typename Type<T>::to_lvalue;
4495
+ template <class T> using type_to_rvalue = typename Type<T>::to_rvalue;
4496
+ template <class T> using type_to_volatile_lvalue = typename Type<T>::to_volatile_lvalue;
4497
+ template <class T> using type_to_volatile_rvalue = typename Type<T>::to_volatile_rvalue;
4498
+ # endif
4499
+
4500
+ # if Z_LANGUAGE_HAS(CPP, RVALUE_REFERENCE)
4501
+ template <class T> using type_add_rvalue_reference = typename Type<T>::add_rvalue_reference;
4502
+ template <class T> using type_to_rvalue_reference = typename Type<T>::to_rvalue_reference;
4503
+ # endif
4504
+
4505
+ # if Z_HAS_TRAIT_ALIAS(type_parameters)
4506
+ template <class T> using type_parameters = typename Type<T>::parameters;
4507
+ # endif
4508
+
4509
+ # if Z_HAS_TRAIT_ALIAS(type_underlying_type)
4510
+ template <class T> using type_underlying_type = typename Type<T>::underlying_type;
4511
+ # endif
4512
+
4513
+ # endif
4514
+ }
4515
+
4516
+ #endif // _Z_traits_Type_HPP_