Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

837 lines
29KB

  1. /// @ref core
  2. /// @file glm/detail/setup.hpp
  3. #ifndef GLM_SETUP_INCLUDED
  4. #define GLM_VERSION_MAJOR 0
  5. #define GLM_VERSION_MINOR 9
  6. #define GLM_VERSION_PATCH 9
  7. #define GLM_VERSION_REVISION 0
  8. #define GLM_VERSION 990
  9. #define GLM_SETUP_INCLUDED GLM_VERSION
  10. #if defined(GLM_FORCE_SWIZZLE) && defined(GLM_FORCE_UNRESTRICTED_GENTYPE)
  11. # error "Both GLM_FORCE_SWIZZLE and GLM_FORCE_UNRESTRICTED_GENTYPE can't be defined at the same time"
  12. #endif
  13. #include <cassert>
  14. #include <cstddef>
  15. ///////////////////////////////////////////////////////////////////////////////////
  16. // Messages
  17. #define GLM_MESSAGES_ENABLED 1
  18. #define GLM_MESSAGES_DISABLE 0
  19. #if defined(GLM_FORCE_MESSAGES)
  20. # define GLM_MESSAGES GLM_MESSAGES_ENABLED
  21. #else
  22. # define GLM_MESSAGES GLM_MESSAGES_DISABLE
  23. #endif
  24. ///////////////////////////////////////////////////////////////////////////////////
  25. // Detect the platform
  26. #include "../simd/platform.h"
  27. ///////////////////////////////////////////////////////////////////////////////////
  28. // Version
  29. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_VERSION_DISPLAYED)
  30. # define GLM_MESSAGE_VERSION_DISPLAYED
  31. # pragma message ("GLM: version 0.9.9.0")
  32. #endif//GLM_MESSAGES
  33. // Report compiler detection
  34. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_COMPILER_DISPLAYED)
  35. # define GLM_MESSAGE_COMPILER_DISPLAYED
  36. # if GLM_COMPILER & GLM_COMPILER_CUDA
  37. # pragma message("GLM: CUDA compiler detected")
  38. # elif GLM_COMPILER & GLM_COMPILER_VC
  39. # pragma message("GLM: Visual C++ compiler detected")
  40. # elif GLM_COMPILER & GLM_COMPILER_CLANG
  41. # pragma message("GLM: Clang compiler detected")
  42. # elif GLM_COMPILER & GLM_COMPILER_INTEL
  43. # pragma message("GLM: Intel Compiler detected")
  44. # elif GLM_COMPILER & GLM_COMPILER_GCC
  45. # pragma message("GLM: GCC compiler detected")
  46. # else
  47. # pragma message("GLM: Compiler not detected")
  48. # endif
  49. #endif//GLM_MESSAGES
  50. ///////////////////////////////////////////////////////////////////////////////////
  51. // Build model
  52. #if defined(__arch64__) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__)
  53. # define GLM_MODEL GLM_MODEL_64
  54. #elif defined(__i386__) || defined(__ppc__)
  55. # define GLM_MODEL GLM_MODEL_32
  56. #else
  57. # define GLM_MODEL GLM_MODEL_32
  58. #endif//
  59. #if !defined(GLM_MODEL) && GLM_COMPILER != 0
  60. # error "GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message."
  61. #endif//GLM_MODEL
  62. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_MODEL_DISPLAYED)
  63. # define GLM_MESSAGE_MODEL_DISPLAYED
  64. # if(GLM_MODEL == GLM_MODEL_64)
  65. # pragma message("GLM: 64 bits model")
  66. # elif(GLM_MODEL == GLM_MODEL_32)
  67. # pragma message("GLM: 32 bits model")
  68. # endif//GLM_MODEL
  69. #endif//GLM_MESSAGES
  70. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_ARCH_DISPLAYED)
  71. # define GLM_MESSAGE_ARCH_DISPLAYED
  72. # if(GLM_ARCH == GLM_ARCH_PURE)
  73. # pragma message("GLM: Platform independent code")
  74. # elif(GLM_ARCH == GLM_ARCH_AVX2)
  75. # pragma message("GLM: AVX2 instruction set")
  76. # elif(GLM_ARCH == GLM_ARCH_AVX)
  77. # pragma message("GLM: AVX instruction set")
  78. # elif(GLM_ARCH == GLM_ARCH_SSE42)
  79. # pragma message("GLM: SSE4.2 instruction set")
  80. # elif(GLM_ARCH == GLM_ARCH_SSE41)
  81. # pragma message("GLM: SSE4.1 instruction set")
  82. # elif(GLM_ARCH == GLM_ARCH_SSSE3)
  83. # pragma message("GLM: SSSE3 instruction set")
  84. # elif(GLM_ARCH == GLM_ARCH_SSE3)
  85. # pragma message("GLM: SSE3 instruction set")
  86. # elif(GLM_ARCH == GLM_ARCH_SSE2)
  87. # pragma message("GLM: SSE2 instruction set")
  88. # elif(GLM_ARCH == GLM_ARCH_X86)
  89. # pragma message("GLM: x86 instruction set")
  90. # elif(GLM_ARCH == GLM_ARCH_NEON)
  91. # pragma message("GLM: NEON instruction set")
  92. # elif(GLM_ARCH == GLM_ARCH_ARM)
  93. # pragma message("GLM: ARM instruction set")
  94. # elif(GLM_ARCH == GLM_ARCH_MIPS)
  95. # pragma message("GLM: MIPS instruction set")
  96. # elif(GLM_ARCH == GLM_ARCH_PPC)
  97. # pragma message("GLM: PowerPC architechture")
  98. # endif//GLM_ARCH
  99. #endif//GLM_MESSAGES
  100. ///////////////////////////////////////////////////////////////////////////////////
  101. // C++ Version
  102. // User defines: GLM_FORCE_CXX98, GLM_FORCE_CXX03, GLM_FORCE_CXX11, GLM_FORCE_CXX14
  103. #define GLM_LANG_CXX98_FLAG (1 << 1)
  104. #define GLM_LANG_CXX03_FLAG (1 << 2)
  105. #define GLM_LANG_CXX0X_FLAG (1 << 3)
  106. #define GLM_LANG_CXX11_FLAG (1 << 4)
  107. #define GLM_LANG_CXX1Y_FLAG (1 << 5)
  108. #define GLM_LANG_CXX14_FLAG (1 << 6)
  109. #define GLM_LANG_CXX1Z_FLAG (1 << 7)
  110. #define GLM_LANG_CXXMS_FLAG (1 << 8)
  111. #define GLM_LANG_CXXGNU_FLAG (1 << 9)
  112. #define GLM_LANG_CXX98 GLM_LANG_CXX98_FLAG
  113. #define GLM_LANG_CXX03 (GLM_LANG_CXX98 | GLM_LANG_CXX03_FLAG)
  114. #define GLM_LANG_CXX0X (GLM_LANG_CXX03 | GLM_LANG_CXX0X_FLAG)
  115. #define GLM_LANG_CXX11 (GLM_LANG_CXX0X | GLM_LANG_CXX11_FLAG)
  116. #define GLM_LANG_CXX1Y (GLM_LANG_CXX11 | GLM_LANG_CXX1Y_FLAG)
  117. #define GLM_LANG_CXX14 (GLM_LANG_CXX1Y | GLM_LANG_CXX14_FLAG)
  118. #define GLM_LANG_CXX1Z (GLM_LANG_CXX14 | GLM_LANG_CXX1Z_FLAG)
  119. #define GLM_LANG_CXXMS GLM_LANG_CXXMS_FLAG
  120. #define GLM_LANG_CXXGNU GLM_LANG_CXXGNU_FLAG
  121. #if defined(GLM_FORCE_CXX14)
  122. # if((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER <= GLM_COMPILER_GCC50)) || ((GLM_COMPILER & GLM_COMPILER_CLANG) && (GLM_COMPILER <= GLM_COMPILER_CLANG34))
  123. # pragma message("GLM: Using GLM_FORCE_CXX14 with a compiler that doesn't fully support C++14")
  124. # elif GLM_COMPILER & GLM_COMPILER_VC
  125. # pragma message("GLM: Using GLM_FORCE_CXX14 but there is no known version of Visual C++ compiler that fully supports C++14")
  126. # elif GLM_COMPILER & GLM_COMPILER_INTEL
  127. # pragma message("GLM: Using GLM_FORCE_CXX14 but there is no known version of ICC compiler that fully supports C++14")
  128. # endif
  129. # define GLM_LANG GLM_LANG_CXX14
  130. # define GLM_LANG_STL11_FORCED
  131. #elif defined(GLM_FORCE_CXX11)
  132. # if((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER <= GLM_COMPILER_GCC48)) || ((GLM_COMPILER & GLM_COMPILER_CLANG) && (GLM_COMPILER <= GLM_COMPILER_CLANG33))
  133. # pragma message("GLM: Using GLM_FORCE_CXX11 with a compiler that doesn't fully support C++11")
  134. # elif GLM_COMPILER & GLM_COMPILER_VC
  135. # pragma message("GLM: Using GLM_FORCE_CXX11 but there is no known version of Visual C++ compiler that fully supports C++11")
  136. # elif GLM_COMPILER & GLM_COMPILER_INTEL
  137. # pragma message("GLM: Using GLM_FORCE_CXX11 but there is no known version of ICC compiler that fully supports C++11")
  138. # endif
  139. # define GLM_LANG GLM_LANG_CXX11
  140. # define GLM_LANG_STL11_FORCED
  141. #elif defined(GLM_FORCE_CXX03)
  142. # define GLM_LANG GLM_LANG_CXX03
  143. #elif defined(GLM_FORCE_CXX98)
  144. # define GLM_LANG GLM_LANG_CXX98
  145. #else
  146. # if GLM_COMPILER & GLM_COMPILER_CLANG
  147. # if __cplusplus >= 201402L // GLM_COMPILER_CLANG34 + -std=c++14
  148. # define GLM_LANG GLM_LANG_CXX14
  149. # elif __has_feature(cxx_decltype_auto) && __has_feature(cxx_aggregate_nsdmi) // GLM_COMPILER_CLANG33 + -std=c++1y
  150. # define GLM_LANG GLM_LANG_CXX1Y
  151. # elif __cplusplus >= 201103L // GLM_COMPILER_CLANG33 + -std=c++11
  152. # define GLM_LANG GLM_LANG_CXX11
  153. # elif __has_feature(cxx_static_assert) // GLM_COMPILER_CLANG29 + -std=c++11
  154. # define GLM_LANG GLM_LANG_CXX0X
  155. # elif __cplusplus >= 199711L
  156. # define GLM_LANG GLM_LANG_CXX98
  157. # else
  158. # define GLM_LANG GLM_LANG_CXX
  159. # endif
  160. # elif GLM_COMPILER & GLM_COMPILER_GCC
  161. # if __cplusplus >= 201402L
  162. # define GLM_LANG GLM_LANG_CXX14
  163. # elif __cplusplus >= 201103L
  164. # define GLM_LANG GLM_LANG_CXX11
  165. # elif defined(__GXX_EXPERIMENTAL_CXX0X__)
  166. # define GLM_LANG GLM_LANG_CXX0X
  167. # else
  168. # define GLM_LANG GLM_LANG_CXX98
  169. # endif
  170. # elif GLM_COMPILER & GLM_COMPILER_VC
  171. # ifdef _MSC_EXTENSIONS
  172. # if __cplusplus >= 201402L
  173. # define GLM_LANG (GLM_LANG_CXX14 | GLM_LANG_CXXMS_FLAG)
  174. # elif __cplusplus >= 201103L
  175. # define GLM_LANG (GLM_LANG_CXX11 | GLM_LANG_CXXMS_FLAG)
  176. # else
  177. # define GLM_LANG (GLM_LANG_CXX0X | GLM_LANG_CXXMS_FLAG)
  178. # endif
  179. # else
  180. # if __cplusplus >= 201402L
  181. # define GLM_LANG GLM_LANG_CXX14
  182. # elif __cplusplus >= 201103L
  183. # define GLM_LANG GLM_LANG_CXX11
  184. # else
  185. # define GLM_LANG GLM_LANG_CXX0X
  186. # endif
  187. # endif
  188. # elif GLM_COMPILER & GLM_COMPILER_INTEL
  189. # ifdef _MSC_EXTENSIONS
  190. # define GLM_MSC_EXT GLM_LANG_CXXMS_FLAG
  191. # else
  192. # define GLM_MSC_EXT 0
  193. # endif
  194. # if __cplusplus >= 201402L
  195. # define GLM_LANG (GLM_LANG_CXX14 | GLM_MSC_EXT)
  196. # elif __cplusplus >= 201103L
  197. # define GLM_LANG (GLM_LANG_CXX11 | GLM_MSC_EXT)
  198. # elif __INTEL_CXX11_MODE__
  199. # define GLM_LANG (GLM_LANG_CXX0X | GLM_MSC_EXT)
  200. # elif __cplusplus >= 199711L
  201. # define GLM_LANG (GLM_LANG_CXX98 | GLM_MSC_EXT)
  202. # else
  203. # define GLM_LANG (GLM_LANG_CXX | GLM_MSC_EXT)
  204. # endif
  205. # elif GLM_COMPILER & GLM_COMPILER_CUDA
  206. # ifdef _MSC_EXTENSIONS
  207. # define GLM_MSC_EXT GLM_LANG_CXXMS_FLAG
  208. # else
  209. # define GLM_MSC_EXT 0
  210. # endif
  211. # if GLM_COMPILER >= GLM_COMPILER_CUDA75
  212. # define GLM_LANG (GLM_LANG_CXX0X | GLM_MSC_EXT)
  213. # else
  214. # define GLM_LANG (GLM_LANG_CXX98 | GLM_MSC_EXT)
  215. # endif
  216. # else // Unknown compiler
  217. # if __cplusplus >= 201402L
  218. # define GLM_LANG GLM_LANG_CXX14
  219. # elif __cplusplus >= 201103L
  220. # define GLM_LANG GLM_LANG_CXX11
  221. # elif __cplusplus >= 199711L
  222. # define GLM_LANG GLM_LANG_CXX98
  223. # else
  224. # define GLM_LANG GLM_LANG_CXX // Good luck with that!
  225. # endif
  226. # ifndef GLM_FORCE_PURE
  227. # define GLM_FORCE_PURE
  228. # endif
  229. # endif
  230. #endif
  231. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_LANG_DISPLAYED)
  232. # define GLM_MESSAGE_LANG_DISPLAYED
  233. # if GLM_LANG & GLM_LANG_CXX1Z_FLAG
  234. # pragma message("GLM: C++1z")
  235. # elif GLM_LANG & GLM_LANG_CXX14_FLAG
  236. # pragma message("GLM: C++14")
  237. # elif GLM_LANG & GLM_LANG_CXX1Y_FLAG
  238. # pragma message("GLM: C++1y")
  239. # elif GLM_LANG & GLM_LANG_CXX11_FLAG
  240. # pragma message("GLM: C++11")
  241. # elif GLM_LANG & GLM_LANG_CXX0X_FLAG
  242. # pragma message("GLM: C++0x")
  243. # elif GLM_LANG & GLM_LANG_CXX03_FLAG
  244. # pragma message("GLM: C++03")
  245. # elif GLM_LANG & GLM_LANG_CXX98_FLAG
  246. # pragma message("GLM: C++98")
  247. # else
  248. # pragma message("GLM: C++ language undetected")
  249. # endif//GLM_LANG
  250. # if GLM_LANG & (GLM_LANG_CXXGNU_FLAG | GLM_LANG_CXXMS_FLAG)
  251. # pragma message("GLM: Language extensions enabled")
  252. # endif//GLM_LANG
  253. #endif//GLM_MESSAGES
  254. ///////////////////////////////////////////////////////////////////////////////////
  255. // Has of C++ features
  256. // http://clang.llvm.org/cxx_status.html
  257. // http://gcc.gnu.org/projects/cxx0x.html
  258. // http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.120).aspx
  259. // Android has multiple STLs but C++11 STL detection doesn't always work #284 #564
  260. #if GLM_PLATFORM == GLM_PLATFORM_ANDROID && !defined(GLM_LANG_STL11_FORCED)
  261. # define GLM_HAS_CXX11_STL 0
  262. #elif GLM_COMPILER & GLM_COMPILER_CLANG
  263. # if (defined(_LIBCPP_VERSION) && GLM_LANG & GLM_LANG_CXX11_FLAG) || defined(GLM_LANG_STL11_FORCED)
  264. # define GLM_HAS_CXX11_STL 1
  265. # else
  266. # define GLM_HAS_CXX11_STL 0
  267. # endif
  268. #else
  269. # define GLM_HAS_CXX11_STL ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  270. ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \
  271. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  272. ((GLM_PLATFORM != GLM_PLATFORM_WINDOWS) && (GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15))))
  273. #endif
  274. // N1720
  275. #if GLM_COMPILER & GLM_COMPILER_CLANG
  276. # define GLM_HAS_STATIC_ASSERT __has_feature(cxx_static_assert)
  277. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  278. # define GLM_HAS_STATIC_ASSERT 1
  279. #else
  280. # define GLM_HAS_STATIC_ASSERT ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  281. ((GLM_COMPILER & GLM_COMPILER_GCC)) || \
  282. ((GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  283. ((GLM_COMPILER & GLM_COMPILER_VC))))
  284. #endif
  285. // N1988
  286. #if GLM_LANG & GLM_LANG_CXX11_FLAG
  287. # define GLM_HAS_EXTENDED_INTEGER_TYPE 1
  288. #else
  289. # define GLM_HAS_EXTENDED_INTEGER_TYPE (\
  290. ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_VC)) || \
  291. ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CUDA)) || \
  292. ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_GCC)) || \
  293. ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (GLM_COMPILER & GLM_COMPILER_CLANG)))
  294. #endif
  295. // N2235
  296. #if GLM_COMPILER & GLM_COMPILER_CLANG
  297. # define GLM_HAS_CONSTEXPR __has_feature(cxx_constexpr)
  298. # define GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR
  299. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  300. # define GLM_HAS_CONSTEXPR 1
  301. # define GLM_HAS_CONSTEXPR_PARTIAL GLM_HAS_CONSTEXPR
  302. #else
  303. # define GLM_HAS_CONSTEXPR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  304. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \
  305. ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)))) // GCC 4.6 support constexpr but there is a compiler bug causing a crash
  306. # define GLM_HAS_CONSTEXPR_PARTIAL (GLM_HAS_CONSTEXPR || ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14)))
  307. #endif
  308. // N2672
  309. #if GLM_COMPILER & GLM_COMPILER_CLANG
  310. # define GLM_HAS_INITIALIZER_LISTS __has_feature(cxx_generalized_initializers)
  311. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  312. # define GLM_HAS_INITIALIZER_LISTS 1
  313. #else
  314. # define GLM_HAS_INITIALIZER_LISTS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  315. ((GLM_COMPILER & GLM_COMPILER_GCC)) || \
  316. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  317. ((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA75))))
  318. #endif
  319. // N2544 Unrestricted unions http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf
  320. #if GLM_COMPILER & GLM_COMPILER_CLANG
  321. # define GLM_HAS_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions)
  322. #elif GLM_LANG & (GLM_LANG_CXX11_FLAG | GLM_LANG_CXXMS_FLAG)
  323. # define GLM_HAS_UNRESTRICTED_UNIONS 1
  324. #else
  325. # define GLM_HAS_UNRESTRICTED_UNIONS (GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  326. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_LANG & GLM_LANG_CXXMS_FLAG)) || \
  327. ((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA75)) || \
  328. ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)))
  329. #endif
  330. // N2346
  331. #if defined(GLM_FORCE_UNRESTRICTED_GENTYPE)
  332. # define GLM_HAS_DEFAULTED_FUNCTIONS 0
  333. #elif GLM_COMPILER & GLM_COMPILER_CLANG
  334. # define GLM_HAS_DEFAULTED_FUNCTIONS __has_feature(cxx_defaulted_functions)
  335. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  336. # define GLM_HAS_DEFAULTED_FUNCTIONS 1
  337. #else
  338. # define GLM_HAS_DEFAULTED_FUNCTIONS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  339. ((GLM_COMPILER & GLM_COMPILER_GCC)) || \
  340. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  341. ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \
  342. (GLM_COMPILER & GLM_COMPILER_CUDA)))
  343. #endif
  344. // N2118
  345. #if GLM_COMPILER & GLM_COMPILER_CLANG
  346. # define GLM_HAS_RVALUE_REFERENCES __has_feature(cxx_rvalue_references)
  347. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  348. # define GLM_HAS_RVALUE_REFERENCES 1
  349. #else
  350. # define GLM_HAS_RVALUE_REFERENCES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  351. ((GLM_COMPILER & GLM_COMPILER_GCC)) || \
  352. ((GLM_COMPILER & GLM_COMPILER_VC)) || \
  353. ((GLM_COMPILER & GLM_COMPILER_CUDA))))
  354. #endif
  355. // N2437 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf
  356. #if GLM_COMPILER & GLM_COMPILER_CLANG
  357. # define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS __has_feature(cxx_explicit_conversions)
  358. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  359. # define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS 1
  360. #else
  361. # define GLM_HAS_EXPLICIT_CONVERSION_OPERATORS ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  362. ((GLM_COMPILER & GLM_COMPILER_GCC)) || \
  363. ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL14)) || \
  364. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  365. ((GLM_COMPILER & GLM_COMPILER_CUDA))))
  366. #endif
  367. // N2258 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf
  368. #if GLM_COMPILER & GLM_COMPILER_CLANG
  369. # define GLM_HAS_TEMPLATE_ALIASES __has_feature(cxx_alias_templates)
  370. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  371. # define GLM_HAS_TEMPLATE_ALIASES 1
  372. #else
  373. # define GLM_HAS_TEMPLATE_ALIASES ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  374. ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \
  375. ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC47)) || \
  376. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  377. ((GLM_COMPILER & GLM_COMPILER_CUDA))))
  378. #endif
  379. // N2930 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2930.html
  380. #if GLM_COMPILER & GLM_COMPILER_CLANG
  381. # define GLM_HAS_RANGE_FOR __has_feature(cxx_range_for)
  382. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  383. # define GLM_HAS_RANGE_FOR 1
  384. #else
  385. # define GLM_HAS_RANGE_FOR ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  386. ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC46)) || \
  387. ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \
  388. ((GLM_COMPILER & GLM_COMPILER_VC)) || \
  389. ((GLM_COMPILER & GLM_COMPILER_CUDA))))
  390. #endif
  391. // N2341 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2341.pdf
  392. #if GLM_COMPILER & GLM_COMPILER_CLANG
  393. # define GLM_HAS_ALIGNOF __has_feature(c_alignof)
  394. #elif GLM_LANG & GLM_LANG_CXX11_FLAG
  395. # define GLM_HAS_ALIGNOF 1
  396. #else
  397. # define GLM_HAS_ALIGNOF ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  398. ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC48)) || \
  399. ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_COMPILER >= GLM_COMPILER_INTEL15)) || \
  400. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14)) || \
  401. ((GLM_COMPILER & GLM_COMPILER_CUDA) && (GLM_COMPILER >= GLM_COMPILER_CUDA70))))
  402. #endif
  403. #define GLM_HAS_ONLY_XYZW ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER < GLM_COMPILER_GCC46))
  404. #if GLM_HAS_ONLY_XYZW
  405. # pragma message("GLM: GCC older than 4.6 has a bug presenting the use of rgba and stpq components")
  406. #endif
  407. //
  408. #if GLM_LANG & GLM_LANG_CXX11_FLAG
  409. # define GLM_HAS_ASSIGNABLE 1
  410. #else
  411. # define GLM_HAS_ASSIGNABLE ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  412. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC15)) || \
  413. ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC49))))
  414. #endif
  415. //
  416. #define GLM_HAS_TRIVIAL_QUERIES 0
  417. //
  418. #if GLM_LANG & GLM_LANG_CXX11_FLAG
  419. # define GLM_HAS_MAKE_SIGNED 1
  420. #else
  421. # define GLM_HAS_MAKE_SIGNED ((GLM_LANG & GLM_LANG_CXX0X_FLAG) && (\
  422. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC12)) || \
  423. ((GLM_COMPILER & GLM_COMPILER_CUDA))))
  424. #endif
  425. #if GLM_ARCH == GLM_ARCH_PURE
  426. # define GLM_HAS_BITSCAN_WINDOWS 0
  427. #else
  428. # define GLM_HAS_BITSCAN_WINDOWS ((GLM_PLATFORM & GLM_PLATFORM_WINDOWS) && (\
  429. ((GLM_COMPILER & GLM_COMPILER_INTEL)) || \
  430. ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC14) && (GLM_ARCH & GLM_ARCH_X86_BIT))))
  431. #endif
  432. // OpenMP
  433. #ifdef _OPENMP
  434. # if GLM_COMPILER & GLM_COMPILER_GCC
  435. # if GLM_COMPILER >= GLM_COMPILER_GCC61
  436. # define GLM_HAS_OPENMP 45
  437. # elif GLM_COMPILER >= GLM_COMPILER_GCC49
  438. # define GLM_HAS_OPENMP 40
  439. # elif GLM_COMPILER >= GLM_COMPILER_GCC47
  440. # define GLM_HAS_OPENMP 31
  441. # else
  442. # define GLM_HAS_OPENMP 0
  443. # endif
  444. # elif GLM_COMPILER & GLM_COMPILER_CLANG
  445. # if GLM_COMPILER >= GLM_COMPILER_CLANG38
  446. # define GLM_HAS_OPENMP 31
  447. # else
  448. # define GLM_HAS_OPENMP 0
  449. # endif
  450. # elif GLM_COMPILER & GLM_COMPILER_VC
  451. # define GLM_HAS_OPENMP 20
  452. # elif GLM_COMPILER & GLM_COMPILER_INTEL
  453. # if GLM_COMPILER >= GLM_COMPILER_INTEL16
  454. # define GLM_HAS_OPENMP 40
  455. # else
  456. # define GLM_HAS_OPENMP 0
  457. # endif
  458. # else
  459. # define GLM_HAS_OPENMP 0
  460. # endif
  461. #else
  462. # define GLM_HAS_OPENMP 0
  463. #endif
  464. ///////////////////////////////////////////////////////////////////////////////////
  465. // nullptr
  466. //
  467. #if GLM_LANG & GLM_LANG_CXX0X_FLAG
  468. # define GLM_HAS_NULLPTR 1
  469. #else
  470. # define GLM_HAS_NULLPTR 0
  471. #endif
  472. #if GLM_HAS_NULLPTR
  473. # define GLM_NULLPTR nullptr
  474. #else
  475. # define GLM_NULLPTR 0
  476. #endif
  477. ///////////////////////////////////////////////////////////////////////////////////
  478. // Static assert
  479. #if GLM_HAS_STATIC_ASSERT
  480. # define GLM_STATIC_ASSERT(x, message) static_assert(x, message)
  481. #elif GLM_COMPILER & GLM_COMPILER_VC
  482. # define GLM_STATIC_ASSERT(x, message) typedef char __CASSERT__##__LINE__[(x) ? 1 : -1]
  483. #else
  484. # define GLM_STATIC_ASSERT(x, message)
  485. # define GLM_STATIC_ASSERT_NULL
  486. #endif//GLM_LANG
  487. ///////////////////////////////////////////////////////////////////////////////////
  488. // Qualifiers
  489. #if GLM_COMPILER & GLM_COMPILER_CUDA
  490. # define GLM_CUDA_FUNC_DEF __device__ __host__
  491. # define GLM_CUDA_FUNC_DECL __device__ __host__
  492. #else
  493. # define GLM_CUDA_FUNC_DEF
  494. # define GLM_CUDA_FUNC_DECL
  495. #endif
  496. #if GLM_COMPILER & GLM_COMPILER_GCC
  497. # define GLM_VAR_USED __attribute__ ((unused))
  498. #else
  499. # define GLM_VAR_USED
  500. #endif
  501. #if defined(GLM_FORCE_INLINE)
  502. # if GLM_COMPILER & GLM_COMPILER_VC
  503. # define GLM_INLINE __forceinline
  504. # define GLM_NEVER_INLINE __declspec((noinline))
  505. # elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)
  506. # define GLM_INLINE inline __attribute__((__always_inline__))
  507. # define GLM_NEVER_INLINE __attribute__((__noinline__))
  508. # elif GLM_COMPILER & GLM_COMPILER_CUDA
  509. # define GLM_INLINE __forceinline__
  510. # define GLM_NEVER_INLINE __noinline__
  511. # else
  512. # define GLM_INLINE inline
  513. # define GLM_NEVER_INLINE
  514. # endif//GLM_COMPILER
  515. #else
  516. # define GLM_INLINE inline
  517. # define GLM_NEVER_INLINE
  518. #endif//defined(GLM_FORCE_INLINE)
  519. #define GLM_FUNC_DECL GLM_CUDA_FUNC_DECL
  520. #define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE
  521. ///////////////////////////////////////////////////////////////////////////////////
  522. // Swizzle operators
  523. // User defines: GLM_FORCE_SWIZZLE
  524. #define GLM_SWIZZLE_ENABLED 1
  525. #define GLM_SWIZZLE_DISABLE 0
  526. #if defined(GLM_FORCE_SWIZZLE)
  527. # define GLM_SWIZZLE GLM_SWIZZLE_ENABLED
  528. #else
  529. # define GLM_SWIZZLE GLM_SWIZZLE_DISABLE
  530. #endif
  531. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_SWIZZLE_DISPLAYED)
  532. # define GLM_MESSAGE_SWIZZLE_DISPLAYED
  533. # if GLM_SWIZZLE == GLM_SWIZZLE_ENABLED
  534. # pragma message("GLM: Swizzling operators enabled")
  535. # else
  536. # pragma message("GLM: Swizzling operators disabled, #define GLM_SWIZZLE to enable swizzle operators")
  537. # endif
  538. #endif//GLM_MESSAGES
  539. ///////////////////////////////////////////////////////////////////////////////////
  540. // Allows using not basic types as genType
  541. // #define GLM_FORCE_UNRESTRICTED_GENTYPE
  542. #ifdef GLM_FORCE_UNRESTRICTED_GENTYPE
  543. # define GLM_UNRESTRICTED_GENTYPE 1
  544. #else
  545. # define GLM_UNRESTRICTED_GENTYPE 0
  546. #endif
  547. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_UNRESTRICTED_GENTYPE_DISPLAYED)
  548. # define GLM_MESSAGE_UNRESTRICTED_GENTYPE_DISPLAYED
  549. # ifdef GLM_FORCE_UNRESTRICTED_GENTYPE
  550. # pragma message("GLM: Use unrestricted genType")
  551. # endif
  552. #endif//GLM_MESSAGES
  553. ///////////////////////////////////////////////////////////////////////////////////
  554. // Force single only (remove explicit float64 types)
  555. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_SINGLE_ONLY_DISPLAYED)
  556. # define GLM_MESSAGE_SINGLE_ONLY_DISPLAYED
  557. # ifdef GLM_FORCE_SINGLE_ONLY
  558. # pragma message("GLM: Using only single precision floating-point types")
  559. # endif
  560. #endif//GLM_MESSAGES
  561. ///////////////////////////////////////////////////////////////////////////////////
  562. // Clip control
  563. #define GLM_DEPTH_ZERO_TO_ONE 0x00000001
  564. #define GLM_DEPTH_NEGATIVE_ONE_TO_ONE 0x00000002
  565. #ifdef GLM_FORCE_DEPTH_ZERO_TO_ONE
  566. # define GLM_DEPTH_CLIP_SPACE GLM_DEPTH_ZERO_TO_ONE
  567. #else
  568. # define GLM_DEPTH_CLIP_SPACE GLM_DEPTH_NEGATIVE_ONE_TO_ONE
  569. #endif
  570. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_DEPTH_DISPLAYED)
  571. # define GLM_MESSAGE_DEPTH_DISPLAYED
  572. # if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE
  573. # pragma message("GLM: Depth clip space: Zero to one")
  574. # else
  575. # pragma message("GLM: Depth clip space: negative one to one")
  576. # endif
  577. #endif//GLM_MESSAGES
  578. ///////////////////////////////////////////////////////////////////////////////////
  579. // Coordinate system, define GLM_FORCE_LEFT_HANDED before including GLM
  580. // to use left handed coordinate system by default.
  581. #define GLM_LEFT_HANDED 0x00000001 // For DirectX, Metal, Vulkan
  582. #define GLM_RIGHT_HANDED 0x00000002 // For OpenGL, default in GLM
  583. #ifdef GLM_FORCE_LEFT_HANDED
  584. # define GLM_COORDINATE_SYSTEM GLM_LEFT_HANDED
  585. #else
  586. # define GLM_COORDINATE_SYSTEM GLM_RIGHT_HANDED
  587. #endif
  588. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_HANDED_DISPLAYED)
  589. # define GLM_MESSAGE_HANDED_DISPLAYED
  590. # if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED
  591. # pragma message("GLM: Coordinate system: left handed")
  592. # else
  593. # pragma message("GLM: Coordinate system: right handed")
  594. # endif
  595. #endif//GLM_MESSAGES
  596. ///////////////////////////////////////////////////////////////////////////////////
  597. // Qualifiers
  598. #if (GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))
  599. # define GLM_DEPRECATED __declspec(deprecated)
  600. # define GLM_ALIGN(x) __declspec(align(x))
  601. # define GLM_ALIGNED_STRUCT(x) struct __declspec(align(x))
  602. # define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef __declspec(align(alignment)) type name
  603. # define GLM_RESTRICT_FUNC __declspec(restrict)
  604. # define GLM_RESTRICT __restrict
  605. # if GLM_COMPILER >= GLM_COMPILER_VC12
  606. # define GLM_VECTOR_CALL __vectorcall
  607. # else
  608. # define GLM_VECTOR_CALL
  609. # endif
  610. #elif GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG | GLM_COMPILER_INTEL)
  611. # define GLM_DEPRECATED __attribute__((__deprecated__))
  612. # define GLM_ALIGN(x) __attribute__((aligned(x)))
  613. # define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x)))
  614. # define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __attribute__((aligned(alignment)))
  615. # define GLM_RESTRICT_FUNC __restrict__
  616. # define GLM_RESTRICT __restrict__
  617. # if GLM_COMPILER & GLM_COMPILER_CLANG
  618. # if GLM_COMPILER >= GLM_COMPILER_CLANG37
  619. # define GLM_VECTOR_CALL __vectorcall
  620. # else
  621. # define GLM_VECTOR_CALL
  622. # endif
  623. # else
  624. # define GLM_VECTOR_CALL
  625. # endif
  626. #elif GLM_COMPILER & GLM_COMPILER_CUDA
  627. # define GLM_DEPRECATED
  628. # define GLM_ALIGN(x) __align__(x)
  629. # define GLM_ALIGNED_STRUCT(x) struct __align__(x)
  630. # define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name __align__(x)
  631. # define GLM_RESTRICT_FUNC __restrict__
  632. # define GLM_RESTRICT __restrict__
  633. # define GLM_VECTOR_CALL
  634. #else
  635. # define GLM_DEPRECATED
  636. # define GLM_ALIGN
  637. # define GLM_ALIGNED_STRUCT(x) struct
  638. # define GLM_ALIGNED_TYPEDEF(type, name, alignment) typedef type name
  639. # define GLM_RESTRICT_FUNC
  640. # define GLM_RESTRICT
  641. # define GLM_VECTOR_CALL
  642. #endif//GLM_COMPILER
  643. #if GLM_HAS_DEFAULTED_FUNCTIONS
  644. # define GLM_DEFAULT = default
  645. # ifdef GLM_FORCE_NO_CTOR_INIT
  646. # undef GLM_FORCE_CTOR_INIT
  647. # endif
  648. # ifdef GLM_FORCE_CTOR_INIT
  649. # define GLM_DEFAULT_CTOR
  650. # else
  651. # define GLM_DEFAULT_CTOR = default
  652. # endif
  653. #else
  654. # define GLM_DEFAULT
  655. # define GLM_DEFAULT_CTOR
  656. #endif
  657. #if GLM_HAS_CONSTEXPR || GLM_HAS_CONSTEXPR_PARTIAL
  658. # define GLM_CONSTEXPR constexpr
  659. # if ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER <= GLM_COMPILER_VC14)) // Visual C++ has a bug #594 https://github.com/g-truc/glm/issues/594
  660. # define GLM_CONSTEXPR_CTOR
  661. # else
  662. # define GLM_CONSTEXPR_CTOR constexpr
  663. # endif
  664. #else
  665. # define GLM_CONSTEXPR
  666. # define GLM_CONSTEXPR_CTOR
  667. #endif
  668. #if GLM_HAS_CONSTEXPR
  669. # define GLM_RELAXED_CONSTEXPR constexpr
  670. #else
  671. # define GLM_RELAXED_CONSTEXPR const
  672. #endif
  673. #if GLM_LANG >= GLM_LANG_CXX14
  674. # if ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER <= GLM_COMPILER_VC14)) // Visual C++ < 2017 does not support extended const expressions https://msdn.microsoft.com/en-us/library/hh567368.aspx https://github.com/g-truc/glm/issues/749
  675. # define GLM_CONSTEXPR_CXX14
  676. # else
  677. # define GLM_CONSTEXPR_CXX14 GLM_CONSTEXPR
  678. # endif
  679. # define GLM_CONSTEXPR_CTOR_CXX14 GLM_CONSTEXPR_CTOR
  680. #else
  681. # define GLM_CONSTEXPR_CXX14
  682. # define GLM_CONSTEXPR_CTOR_CXX14
  683. #endif
  684. #if GLM_ARCH == GLM_ARCH_PURE
  685. # define GLM_CONSTEXPR_SIMD GLM_CONSTEXPR_CTOR
  686. #else
  687. # define GLM_CONSTEXPR_SIMD
  688. #endif
  689. #ifdef GLM_FORCE_EXPLICIT_CTOR
  690. # define GLM_EXPLICIT explicit
  691. #else
  692. # define GLM_EXPLICIT
  693. #endif
  694. ///////////////////////////////////////////////////////////////////////////////////
  695. #define GLM_HAS_ALIGNED_TYPE GLM_HAS_UNRESTRICTED_UNIONS
  696. ///////////////////////////////////////////////////////////////////////////////////
  697. // Length type: all length functions returns a length_t type.
  698. // When GLM_FORCE_SIZE_T_LENGTH is defined, length_t is a typedef of size_t otherwise
  699. // length_t is a typedef of int like GLSL defines it.
  700. // User define: GLM_FORCE_SIZE_T_LENGTH
  701. namespace glm
  702. {
  703. using std::size_t;
  704. # if defined(GLM_FORCE_SIZE_T_LENGTH)
  705. typedef size_t length_t;
  706. # else
  707. typedef int length_t;
  708. # endif
  709. }//namespace glm
  710. #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_MESSAGE_FORCE_SIZE_T_LENGTH)
  711. # define GLM_MESSAGE_FORCE_SIZE_T_LENGTH
  712. # if defined GLM_FORCE_SIZE_T_LENGTH
  713. # pragma message("GLM: .length() returns glm::length_t, a typedef of std::size_t")
  714. # else
  715. # pragma message("GLM: .length() returns glm::length_t, a typedef of int following the GLSL specification")
  716. # endif
  717. #endif//GLM_MESSAGES
  718. ///////////////////////////////////////////////////////////////////////////////////
  719. // countof
  720. #if GLM_HAS_CONSTEXPR_PARTIAL
  721. namespace glm
  722. {
  723. template<typename T, std::size_t N>
  724. constexpr std::size_t countof(T const (&)[N])
  725. {
  726. return N;
  727. }
  728. }//namespace glm
  729. # define GLM_COUNTOF(arr) glm::countof(arr)
  730. #elif defined(_MSC_VER)
  731. # define GLM_COUNTOF(arr) _countof(arr)
  732. #else
  733. # define GLM_COUNTOF(arr) sizeof(arr) / sizeof(arr[0])
  734. #endif
  735. ///////////////////////////////////////////////////////////////////////////////////
  736. // Check inclusions of different versions of GLM
  737. #elif ((GLM_SETUP_INCLUDED != GLM_VERSION) && !defined(GLM_FORCE_IGNORE_VERSION))
  738. # error "GLM error: A different version of GLM is already included. Define GLM_FORCE_IGNORE_VERSION before including GLM headers to ignore this error."
  739. #elif GLM_SETUP_INCLUDED == GLM_VERSION
  740. #endif//GLM_SETUP_INCLUDED