1
0

hedley.h 80 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123
  1. /* Hedley - https://nemequ.github.io/hedley
  2. * Created by Evan Nemerson <[email protected]>
  3. *
  4. * To the extent possible under law, the author(s) have dedicated all
  5. * copyright and related and neighboring rights to this software to
  6. * the public domain worldwide. This software is distributed without
  7. * any warranty.
  8. *
  9. * For details, see <http://creativecommons.org/publicdomain/zero/1.0/>.
  10. * SPDX-License-Identifier: CC0-1.0
  11. */
  12. #if !defined(HEDLEY_VERSION) || (HEDLEY_VERSION < 14)
  13. #if defined(HEDLEY_VERSION)
  14. #undef HEDLEY_VERSION
  15. #endif
  16. #define HEDLEY_VERSION 14
  17. #if defined(HEDLEY_STRINGIFY_EX)
  18. #undef HEDLEY_STRINGIFY_EX
  19. #endif
  20. #define HEDLEY_STRINGIFY_EX(x) #x
  21. #if defined(HEDLEY_STRINGIFY)
  22. #undef HEDLEY_STRINGIFY
  23. #endif
  24. #define HEDLEY_STRINGIFY(x) HEDLEY_STRINGIFY_EX(x)
  25. #if defined(HEDLEY_CONCAT_EX)
  26. #undef HEDLEY_CONCAT_EX
  27. #endif
  28. #define HEDLEY_CONCAT_EX(a, b) a##b
  29. #if defined(HEDLEY_CONCAT)
  30. #undef HEDLEY_CONCAT
  31. #endif
  32. #define HEDLEY_CONCAT(a, b) HEDLEY_CONCAT_EX(a, b)
  33. #if defined(HEDLEY_CONCAT3_EX)
  34. #undef HEDLEY_CONCAT3_EX
  35. #endif
  36. #define HEDLEY_CONCAT3_EX(a, b, c) a##b##c
  37. #if defined(HEDLEY_CONCAT3)
  38. #undef HEDLEY_CONCAT3
  39. #endif
  40. #define HEDLEY_CONCAT3(a, b, c) HEDLEY_CONCAT3_EX(a, b, c)
  41. #if defined(HEDLEY_VERSION_ENCODE)
  42. #undef HEDLEY_VERSION_ENCODE
  43. #endif
  44. #define HEDLEY_VERSION_ENCODE(major, minor, revision) \
  45. (((major)*1000000) + ((minor)*1000) + (revision))
  46. #if defined(HEDLEY_VERSION_DECODE_MAJOR)
  47. #undef HEDLEY_VERSION_DECODE_MAJOR
  48. #endif
  49. #define HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000)
  50. #if defined(HEDLEY_VERSION_DECODE_MINOR)
  51. #undef HEDLEY_VERSION_DECODE_MINOR
  52. #endif
  53. #define HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000)
  54. #if defined(HEDLEY_VERSION_DECODE_REVISION)
  55. #undef HEDLEY_VERSION_DECODE_REVISION
  56. #endif
  57. #define HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000)
  58. #if defined(HEDLEY_GNUC_VERSION)
  59. #undef HEDLEY_GNUC_VERSION
  60. #endif
  61. #if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)
  62. #define HEDLEY_GNUC_VERSION \
  63. HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
  64. #elif defined(__GNUC__)
  65. #define HEDLEY_GNUC_VERSION HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0)
  66. #endif
  67. #if defined(HEDLEY_GNUC_VERSION_CHECK)
  68. #undef HEDLEY_GNUC_VERSION_CHECK
  69. #endif
  70. #if defined(HEDLEY_GNUC_VERSION)
  71. #define HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) \
  72. (HEDLEY_GNUC_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  73. #else
  74. #define HEDLEY_GNUC_VERSION_CHECK(major, minor, patch) (0)
  75. #endif
  76. #if defined(HEDLEY_MSVC_VERSION)
  77. #undef HEDLEY_MSVC_VERSION
  78. #endif
  79. #if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL)
  80. #define HEDLEY_MSVC_VERSION \
  81. HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, \
  82. (_MSC_FULL_VER % 10000000) / 100000, \
  83. (_MSC_FULL_VER % 100000) / 100)
  84. #elif defined(_MSC_FULL_VER) && !defined(__ICL)
  85. #define HEDLEY_MSVC_VERSION \
  86. HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, \
  87. (_MSC_FULL_VER % 1000000) / 10000, \
  88. (_MSC_FULL_VER % 10000) / 10)
  89. #elif defined(_MSC_VER) && !defined(__ICL)
  90. #define HEDLEY_MSVC_VERSION \
  91. HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0)
  92. #endif
  93. #if defined(HEDLEY_MSVC_VERSION_CHECK)
  94. #undef HEDLEY_MSVC_VERSION_CHECK
  95. #endif
  96. #if !defined(HEDLEY_MSVC_VERSION)
  97. #define HEDLEY_MSVC_VERSION_CHECK(major, minor, patch) (0)
  98. #elif defined(_MSC_VER) && (_MSC_VER >= 1400)
  99. #define HEDLEY_MSVC_VERSION_CHECK(major, minor, patch) \
  100. (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch)))
  101. #elif defined(_MSC_VER) && (_MSC_VER >= 1200)
  102. #define HEDLEY_MSVC_VERSION_CHECK(major, minor, patch) \
  103. (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch)))
  104. #else
  105. #define HEDLEY_MSVC_VERSION_CHECK(major, minor, patch) \
  106. (_MSC_VER >= ((major * 100) + (minor)))
  107. #endif
  108. #if defined(HEDLEY_INTEL_VERSION)
  109. #undef HEDLEY_INTEL_VERSION
  110. #endif
  111. #if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && \
  112. !defined(__ICL)
  113. #define HEDLEY_INTEL_VERSION \
  114. HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, \
  115. __INTEL_COMPILER_UPDATE)
  116. #elif defined(__INTEL_COMPILER) && !defined(__ICL)
  117. #define HEDLEY_INTEL_VERSION \
  118. HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)
  119. #endif
  120. #if defined(HEDLEY_INTEL_VERSION_CHECK)
  121. #undef HEDLEY_INTEL_VERSION_CHECK
  122. #endif
  123. #if defined(HEDLEY_INTEL_VERSION)
  124. #define HEDLEY_INTEL_VERSION_CHECK(major, minor, patch) \
  125. (HEDLEY_INTEL_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  126. #else
  127. #define HEDLEY_INTEL_VERSION_CHECK(major, minor, patch) (0)
  128. #endif
  129. #if defined(HEDLEY_INTEL_CL_VERSION)
  130. #undef HEDLEY_INTEL_CL_VERSION
  131. #endif
  132. #if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && \
  133. defined(__ICL)
  134. #define HEDLEY_INTEL_CL_VERSION \
  135. HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0)
  136. #endif
  137. #if defined(HEDLEY_INTEL_CL_VERSION_CHECK)
  138. #undef HEDLEY_INTEL_CL_VERSION_CHECK
  139. #endif
  140. #if defined(HEDLEY_INTEL_CL_VERSION)
  141. #define HEDLEY_INTEL_CL_VERSION_CHECK(major, minor, patch) \
  142. (HEDLEY_INTEL_CL_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  143. #else
  144. #define HEDLEY_INTEL_CL_VERSION_CHECK(major, minor, patch) (0)
  145. #endif
  146. #if defined(HEDLEY_PGI_VERSION)
  147. #undef HEDLEY_PGI_VERSION
  148. #endif
  149. #if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && \
  150. defined(__PGIC_PATCHLEVEL__)
  151. #define HEDLEY_PGI_VERSION \
  152. HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)
  153. #endif
  154. #if defined(HEDLEY_PGI_VERSION_CHECK)
  155. #undef HEDLEY_PGI_VERSION_CHECK
  156. #endif
  157. #if defined(HEDLEY_PGI_VERSION)
  158. #define HEDLEY_PGI_VERSION_CHECK(major, minor, patch) \
  159. (HEDLEY_PGI_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  160. #else
  161. #define HEDLEY_PGI_VERSION_CHECK(major, minor, patch) (0)
  162. #endif
  163. #if defined(HEDLEY_SUNPRO_VERSION)
  164. #undef HEDLEY_SUNPRO_VERSION
  165. #endif
  166. #if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000)
  167. #define HEDLEY_SUNPRO_VERSION \
  168. HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + \
  169. ((__SUNPRO_C >> 12) & 0xf), \
  170. (((__SUNPRO_C >> 8) & 0xf) * 10) + \
  171. ((__SUNPRO_C >> 4) & 0xf), \
  172. (__SUNPRO_C & 0xf) * 10)
  173. #elif defined(__SUNPRO_C)
  174. #define HEDLEY_SUNPRO_VERSION \
  175. HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, \
  176. (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C)&0xf)
  177. #elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000)
  178. #define HEDLEY_SUNPRO_VERSION \
  179. HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + \
  180. ((__SUNPRO_CC >> 12) & 0xf), \
  181. (((__SUNPRO_CC >> 8) & 0xf) * 10) + \
  182. ((__SUNPRO_CC >> 4) & 0xf), \
  183. (__SUNPRO_CC & 0xf) * 10)
  184. #elif defined(__SUNPRO_CC)
  185. #define HEDLEY_SUNPRO_VERSION \
  186. HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, \
  187. (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC)&0xf)
  188. #endif
  189. #if defined(HEDLEY_SUNPRO_VERSION_CHECK)
  190. #undef HEDLEY_SUNPRO_VERSION_CHECK
  191. #endif
  192. #if defined(HEDLEY_SUNPRO_VERSION)
  193. #define HEDLEY_SUNPRO_VERSION_CHECK(major, minor, patch) \
  194. (HEDLEY_SUNPRO_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  195. #else
  196. #define HEDLEY_SUNPRO_VERSION_CHECK(major, minor, patch) (0)
  197. #endif
  198. #if defined(HEDLEY_EMSCRIPTEN_VERSION)
  199. #undef HEDLEY_EMSCRIPTEN_VERSION
  200. #endif
  201. #if defined(__EMSCRIPTEN__)
  202. #define HEDLEY_EMSCRIPTEN_VERSION \
  203. HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, \
  204. __EMSCRIPTEN_tiny__)
  205. #endif
  206. #if defined(HEDLEY_EMSCRIPTEN_VERSION_CHECK)
  207. #undef HEDLEY_EMSCRIPTEN_VERSION_CHECK
  208. #endif
  209. #if defined(HEDLEY_EMSCRIPTEN_VERSION)
  210. #define HEDLEY_EMSCRIPTEN_VERSION_CHECK(major, minor, patch) \
  211. (HEDLEY_EMSCRIPTEN_VERSION >= \
  212. HEDLEY_VERSION_ENCODE(major, minor, patch))
  213. #else
  214. #define HEDLEY_EMSCRIPTEN_VERSION_CHECK(major, minor, patch) (0)
  215. #endif
  216. #if defined(HEDLEY_ARM_VERSION)
  217. #undef HEDLEY_ARM_VERSION
  218. #endif
  219. #if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION)
  220. #define HEDLEY_ARM_VERSION \
  221. HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, \
  222. (__ARMCOMPILER_VERSION % 1000000) / 10000, \
  223. (__ARMCOMPILER_VERSION % 10000) / 100)
  224. #elif defined(__CC_ARM) && defined(__ARMCC_VERSION)
  225. #define HEDLEY_ARM_VERSION \
  226. HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, \
  227. (__ARMCC_VERSION % 1000000) / 10000, \
  228. (__ARMCC_VERSION % 10000) / 100)
  229. #endif
  230. #if defined(HEDLEY_ARM_VERSION_CHECK)
  231. #undef HEDLEY_ARM_VERSION_CHECK
  232. #endif
  233. #if defined(HEDLEY_ARM_VERSION)
  234. #define HEDLEY_ARM_VERSION_CHECK(major, minor, patch) \
  235. (HEDLEY_ARM_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  236. #else
  237. #define HEDLEY_ARM_VERSION_CHECK(major, minor, patch) (0)
  238. #endif
  239. #if defined(HEDLEY_IBM_VERSION)
  240. #undef HEDLEY_IBM_VERSION
  241. #endif
  242. #if defined(__ibmxl__)
  243. #define HEDLEY_IBM_VERSION \
  244. HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, \
  245. __ibmxl_modification__)
  246. #elif defined(__xlC__) && defined(__xlC_ver__)
  247. #define HEDLEY_IBM_VERSION \
  248. HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, \
  249. (__xlC_ver__ >> 8) & 0xff)
  250. #elif defined(__xlC__)
  251. #define HEDLEY_IBM_VERSION \
  252. HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0)
  253. #endif
  254. #if defined(HEDLEY_IBM_VERSION_CHECK)
  255. #undef HEDLEY_IBM_VERSION_CHECK
  256. #endif
  257. #if defined(HEDLEY_IBM_VERSION)
  258. #define HEDLEY_IBM_VERSION_CHECK(major, minor, patch) \
  259. (HEDLEY_IBM_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  260. #else
  261. #define HEDLEY_IBM_VERSION_CHECK(major, minor, patch) (0)
  262. #endif
  263. #if defined(HEDLEY_TI_VERSION)
  264. #undef HEDLEY_TI_VERSION
  265. #endif
  266. #if defined(__TI_COMPILER_VERSION__) && \
  267. (defined(__TMS470__) || defined(__TI_ARM__) || defined(__MSP430__) || \
  268. defined(__TMS320C2000__))
  269. #if (__TI_COMPILER_VERSION__ >= 16000000)
  270. #define HEDLEY_TI_VERSION \
  271. HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, \
  272. (__TI_COMPILER_VERSION__ % 1000000) / 1000, \
  273. (__TI_COMPILER_VERSION__ % 1000))
  274. #endif
  275. #endif
  276. #if defined(HEDLEY_TI_VERSION_CHECK)
  277. #undef HEDLEY_TI_VERSION_CHECK
  278. #endif
  279. #if defined(HEDLEY_TI_VERSION)
  280. #define HEDLEY_TI_VERSION_CHECK(major, minor, patch) \
  281. (HEDLEY_TI_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  282. #else
  283. #define HEDLEY_TI_VERSION_CHECK(major, minor, patch) (0)
  284. #endif
  285. #if defined(HEDLEY_TI_CL2000_VERSION)
  286. #undef HEDLEY_TI_CL2000_VERSION
  287. #endif
  288. #if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__)
  289. #define HEDLEY_TI_CL2000_VERSION \
  290. HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, \
  291. (__TI_COMPILER_VERSION__ % 1000000) / 1000, \
  292. (__TI_COMPILER_VERSION__ % 1000))
  293. #endif
  294. #if defined(HEDLEY_TI_CL2000_VERSION_CHECK)
  295. #undef HEDLEY_TI_CL2000_VERSION_CHECK
  296. #endif
  297. #if defined(HEDLEY_TI_CL2000_VERSION)
  298. #define HEDLEY_TI_CL2000_VERSION_CHECK(major, minor, patch) \
  299. (HEDLEY_TI_CL2000_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  300. #else
  301. #define HEDLEY_TI_CL2000_VERSION_CHECK(major, minor, patch) (0)
  302. #endif
  303. #if defined(HEDLEY_TI_CL430_VERSION)
  304. #undef HEDLEY_TI_CL430_VERSION
  305. #endif
  306. #if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__)
  307. #define HEDLEY_TI_CL430_VERSION \
  308. HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, \
  309. (__TI_COMPILER_VERSION__ % 1000000) / 1000, \
  310. (__TI_COMPILER_VERSION__ % 1000))
  311. #endif
  312. #if defined(HEDLEY_TI_CL430_VERSION_CHECK)
  313. #undef HEDLEY_TI_CL430_VERSION_CHECK
  314. #endif
  315. #if defined(HEDLEY_TI_CL430_VERSION)
  316. #define HEDLEY_TI_CL430_VERSION_CHECK(major, minor, patch) \
  317. (HEDLEY_TI_CL430_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  318. #else
  319. #define HEDLEY_TI_CL430_VERSION_CHECK(major, minor, patch) (0)
  320. #endif
  321. #if defined(HEDLEY_TI_ARMCL_VERSION)
  322. #undef HEDLEY_TI_ARMCL_VERSION
  323. #endif
  324. #if defined(__TI_COMPILER_VERSION__) && \
  325. (defined(__TMS470__) || defined(__TI_ARM__))
  326. #define HEDLEY_TI_ARMCL_VERSION \
  327. HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, \
  328. (__TI_COMPILER_VERSION__ % 1000000) / 1000, \
  329. (__TI_COMPILER_VERSION__ % 1000))
  330. #endif
  331. #if defined(HEDLEY_TI_ARMCL_VERSION_CHECK)
  332. #undef HEDLEY_TI_ARMCL_VERSION_CHECK
  333. #endif
  334. #if defined(HEDLEY_TI_ARMCL_VERSION)
  335. #define HEDLEY_TI_ARMCL_VERSION_CHECK(major, minor, patch) \
  336. (HEDLEY_TI_ARMCL_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  337. #else
  338. #define HEDLEY_TI_ARMCL_VERSION_CHECK(major, minor, patch) (0)
  339. #endif
  340. #if defined(HEDLEY_TI_CL6X_VERSION)
  341. #undef HEDLEY_TI_CL6X_VERSION
  342. #endif
  343. #if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__)
  344. #define HEDLEY_TI_CL6X_VERSION \
  345. HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, \
  346. (__TI_COMPILER_VERSION__ % 1000000) / 1000, \
  347. (__TI_COMPILER_VERSION__ % 1000))
  348. #endif
  349. #if defined(HEDLEY_TI_CL6X_VERSION_CHECK)
  350. #undef HEDLEY_TI_CL6X_VERSION_CHECK
  351. #endif
  352. #if defined(HEDLEY_TI_CL6X_VERSION)
  353. #define HEDLEY_TI_CL6X_VERSION_CHECK(major, minor, patch) \
  354. (HEDLEY_TI_CL6X_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  355. #else
  356. #define HEDLEY_TI_CL6X_VERSION_CHECK(major, minor, patch) (0)
  357. #endif
  358. #if defined(HEDLEY_TI_CL7X_VERSION)
  359. #undef HEDLEY_TI_CL7X_VERSION
  360. #endif
  361. #if defined(__TI_COMPILER_VERSION__) && defined(__C7000__)
  362. #define HEDLEY_TI_CL7X_VERSION \
  363. HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, \
  364. (__TI_COMPILER_VERSION__ % 1000000) / 1000, \
  365. (__TI_COMPILER_VERSION__ % 1000))
  366. #endif
  367. #if defined(HEDLEY_TI_CL7X_VERSION_CHECK)
  368. #undef HEDLEY_TI_CL7X_VERSION_CHECK
  369. #endif
  370. #if defined(HEDLEY_TI_CL7X_VERSION)
  371. #define HEDLEY_TI_CL7X_VERSION_CHECK(major, minor, patch) \
  372. (HEDLEY_TI_CL7X_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  373. #else
  374. #define HEDLEY_TI_CL7X_VERSION_CHECK(major, minor, patch) (0)
  375. #endif
  376. #if defined(HEDLEY_TI_CLPRU_VERSION)
  377. #undef HEDLEY_TI_CLPRU_VERSION
  378. #endif
  379. #if defined(__TI_COMPILER_VERSION__) && defined(__PRU__)
  380. #define HEDLEY_TI_CLPRU_VERSION \
  381. HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, \
  382. (__TI_COMPILER_VERSION__ % 1000000) / 1000, \
  383. (__TI_COMPILER_VERSION__ % 1000))
  384. #endif
  385. #if defined(HEDLEY_TI_CLPRU_VERSION_CHECK)
  386. #undef HEDLEY_TI_CLPRU_VERSION_CHECK
  387. #endif
  388. #if defined(HEDLEY_TI_CLPRU_VERSION)
  389. #define HEDLEY_TI_CLPRU_VERSION_CHECK(major, minor, patch) \
  390. (HEDLEY_TI_CLPRU_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  391. #else
  392. #define HEDLEY_TI_CLPRU_VERSION_CHECK(major, minor, patch) (0)
  393. #endif
  394. #if defined(HEDLEY_CRAY_VERSION)
  395. #undef HEDLEY_CRAY_VERSION
  396. #endif
  397. #if defined(_CRAYC)
  398. #if defined(_RELEASE_PATCHLEVEL)
  399. #define HEDLEY_CRAY_VERSION \
  400. HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, \
  401. _RELEASE_PATCHLEVEL)
  402. #else
  403. #define HEDLEY_CRAY_VERSION \
  404. HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0)
  405. #endif
  406. #endif
  407. #if defined(HEDLEY_CRAY_VERSION_CHECK)
  408. #undef HEDLEY_CRAY_VERSION_CHECK
  409. #endif
  410. #if defined(HEDLEY_CRAY_VERSION)
  411. #define HEDLEY_CRAY_VERSION_CHECK(major, minor, patch) \
  412. (HEDLEY_CRAY_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  413. #else
  414. #define HEDLEY_CRAY_VERSION_CHECK(major, minor, patch) (0)
  415. #endif
  416. #if defined(HEDLEY_IAR_VERSION)
  417. #undef HEDLEY_IAR_VERSION
  418. #endif
  419. #if defined(__IAR_SYSTEMS_ICC__)
  420. #if __VER__ > 1000
  421. #define HEDLEY_IAR_VERSION \
  422. HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), \
  423. (__VER__ % 1000))
  424. #else
  425. #define HEDLEY_IAR_VERSION HEDLEY_VERSION_ENCODE(VER / 100, __VER__ % 100, 0)
  426. #endif
  427. #endif
  428. #if defined(HEDLEY_IAR_VERSION_CHECK)
  429. #undef HEDLEY_IAR_VERSION_CHECK
  430. #endif
  431. #if defined(HEDLEY_IAR_VERSION)
  432. #define HEDLEY_IAR_VERSION_CHECK(major, minor, patch) \
  433. (HEDLEY_IAR_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  434. #else
  435. #define HEDLEY_IAR_VERSION_CHECK(major, minor, patch) (0)
  436. #endif
  437. #if defined(HEDLEY_TINYC_VERSION)
  438. #undef HEDLEY_TINYC_VERSION
  439. #endif
  440. #if defined(__TINYC__)
  441. #define HEDLEY_TINYC_VERSION \
  442. HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, \
  443. __TINYC__ % 100)
  444. #endif
  445. #if defined(HEDLEY_TINYC_VERSION_CHECK)
  446. #undef HEDLEY_TINYC_VERSION_CHECK
  447. #endif
  448. #if defined(HEDLEY_TINYC_VERSION)
  449. #define HEDLEY_TINYC_VERSION_CHECK(major, minor, patch) \
  450. (HEDLEY_TINYC_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  451. #else
  452. #define HEDLEY_TINYC_VERSION_CHECK(major, minor, patch) (0)
  453. #endif
  454. #if defined(HEDLEY_DMC_VERSION)
  455. #undef HEDLEY_DMC_VERSION
  456. #endif
  457. #if defined(__DMC__)
  458. #define HEDLEY_DMC_VERSION \
  459. HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf)
  460. #endif
  461. #if defined(HEDLEY_DMC_VERSION_CHECK)
  462. #undef HEDLEY_DMC_VERSION_CHECK
  463. #endif
  464. #if defined(HEDLEY_DMC_VERSION)
  465. #define HEDLEY_DMC_VERSION_CHECK(major, minor, patch) \
  466. (HEDLEY_DMC_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  467. #else
  468. #define HEDLEY_DMC_VERSION_CHECK(major, minor, patch) (0)
  469. #endif
  470. #if defined(HEDLEY_COMPCERT_VERSION)
  471. #undef HEDLEY_COMPCERT_VERSION
  472. #endif
  473. #if defined(__COMPCERT_VERSION__)
  474. #define HEDLEY_COMPCERT_VERSION \
  475. HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, \
  476. (__COMPCERT_VERSION__ / 100) % 100, \
  477. __COMPCERT_VERSION__ % 100)
  478. #endif
  479. #if defined(HEDLEY_COMPCERT_VERSION_CHECK)
  480. #undef HEDLEY_COMPCERT_VERSION_CHECK
  481. #endif
  482. #if defined(HEDLEY_COMPCERT_VERSION)
  483. #define HEDLEY_COMPCERT_VERSION_CHECK(major, minor, patch) \
  484. (HEDLEY_COMPCERT_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  485. #else
  486. #define HEDLEY_COMPCERT_VERSION_CHECK(major, minor, patch) (0)
  487. #endif
  488. #if defined(HEDLEY_PELLES_VERSION)
  489. #undef HEDLEY_PELLES_VERSION
  490. #endif
  491. #if defined(__POCC__)
  492. #define HEDLEY_PELLES_VERSION \
  493. HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0)
  494. #endif
  495. #if defined(HEDLEY_PELLES_VERSION_CHECK)
  496. #undef HEDLEY_PELLES_VERSION_CHECK
  497. #endif
  498. #if defined(HEDLEY_PELLES_VERSION)
  499. #define HEDLEY_PELLES_VERSION_CHECK(major, minor, patch) \
  500. (HEDLEY_PELLES_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  501. #else
  502. #define HEDLEY_PELLES_VERSION_CHECK(major, minor, patch) (0)
  503. #endif
  504. #if defined(HEDLEY_GCC_VERSION)
  505. #undef HEDLEY_GCC_VERSION
  506. #endif
  507. #if defined(HEDLEY_GNUC_VERSION) && !defined(__clang__) && \
  508. !defined(HEDLEY_INTEL_VERSION) && !defined(HEDLEY_PGI_VERSION) && \
  509. !defined(HEDLEY_ARM_VERSION) && !defined(HEDLEY_TI_VERSION) && \
  510. !defined(HEDLEY_TI_ARMCL_VERSION) && \
  511. !defined(HEDLEY_TI_CL430_VERSION) && \
  512. !defined(HEDLEY_TI_CL2000_VERSION) && \
  513. !defined(HEDLEY_TI_CL6X_VERSION) && \
  514. !defined(HEDLEY_TI_CL7X_VERSION) && \
  515. !defined(HEDLEY_TI_CLPRU_VERSION) && !defined(__COMPCERT__)
  516. #define HEDLEY_GCC_VERSION HEDLEY_GNUC_VERSION
  517. #endif
  518. #if defined(HEDLEY_GCC_VERSION_CHECK)
  519. #undef HEDLEY_GCC_VERSION_CHECK
  520. #endif
  521. #if defined(HEDLEY_GCC_VERSION)
  522. #define HEDLEY_GCC_VERSION_CHECK(major, minor, patch) \
  523. (HEDLEY_GCC_VERSION >= HEDLEY_VERSION_ENCODE(major, minor, patch))
  524. #else
  525. #define HEDLEY_GCC_VERSION_CHECK(major, minor, patch) (0)
  526. #endif
  527. #if defined(HEDLEY_HAS_ATTRIBUTE)
  528. #undef HEDLEY_HAS_ATTRIBUTE
  529. #endif
  530. #if defined(__has_attribute)
  531. #define HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute)
  532. #else
  533. #define HEDLEY_HAS_ATTRIBUTE(attribute) (0)
  534. #endif
  535. #if defined(HEDLEY_GNUC_HAS_ATTRIBUTE)
  536. #undef HEDLEY_GNUC_HAS_ATTRIBUTE
  537. #endif
  538. #if defined(__has_attribute)
  539. #define HEDLEY_GNUC_HAS_ATTRIBUTE(attribute, major, minor, patch) \
  540. __has_attribute(attribute)
  541. #else
  542. #define HEDLEY_GNUC_HAS_ATTRIBUTE(attribute, major, minor, patch) \
  543. HEDLEY_GNUC_VERSION_CHECK(major, minor, patch)
  544. #endif
  545. #if defined(HEDLEY_GCC_HAS_ATTRIBUTE)
  546. #undef HEDLEY_GCC_HAS_ATTRIBUTE
  547. #endif
  548. #if defined(__has_attribute)
  549. #define HEDLEY_GCC_HAS_ATTRIBUTE(attribute, major, minor, patch) \
  550. __has_attribute(attribute)
  551. #else
  552. #define HEDLEY_GCC_HAS_ATTRIBUTE(attribute, major, minor, patch) \
  553. HEDLEY_GCC_VERSION_CHECK(major, minor, patch)
  554. #endif
  555. #if defined(HEDLEY_HAS_CPP_ATTRIBUTE)
  556. #undef HEDLEY_HAS_CPP_ATTRIBUTE
  557. #endif
  558. #if defined(__has_cpp_attribute) && defined(__cplusplus) && \
  559. (!defined(HEDLEY_SUNPRO_VERSION) || \
  560. HEDLEY_SUNPRO_VERSION_CHECK(5, 15, 0))
  561. #define HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute)
  562. #else
  563. #define HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0)
  564. #endif
  565. #if defined(HEDLEY_HAS_CPP_ATTRIBUTE_NS)
  566. #undef HEDLEY_HAS_CPP_ATTRIBUTE_NS
  567. #endif
  568. #if !defined(__cplusplus) || !defined(__has_cpp_attribute)
  569. #define HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns, attribute) (0)
  570. #elif !defined(HEDLEY_PGI_VERSION) && !defined(HEDLEY_IAR_VERSION) && \
  571. (!defined(HEDLEY_SUNPRO_VERSION) || \
  572. HEDLEY_SUNPRO_VERSION_CHECK(5, 15, 0)) && \
  573. (!defined(HEDLEY_MSVC_VERSION) || \
  574. HEDLEY_MSVC_VERSION_CHECK(19, 20, 0))
  575. #define HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns, attribute) \
  576. HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute)
  577. #else
  578. #define HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns, attribute) (0)
  579. #endif
  580. #if defined(HEDLEY_GNUC_HAS_CPP_ATTRIBUTE)
  581. #undef HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
  582. #endif
  583. #if defined(__has_cpp_attribute) && defined(__cplusplus)
  584. #define HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute, major, minor, patch) \
  585. __has_cpp_attribute(attribute)
  586. #else
  587. #define HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute, major, minor, patch) \
  588. HEDLEY_GNUC_VERSION_CHECK(major, minor, patch)
  589. #endif
  590. #if defined(HEDLEY_GCC_HAS_CPP_ATTRIBUTE)
  591. #undef HEDLEY_GCC_HAS_CPP_ATTRIBUTE
  592. #endif
  593. #if defined(__has_cpp_attribute) && defined(__cplusplus)
  594. #define HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute, major, minor, patch) \
  595. __has_cpp_attribute(attribute)
  596. #else
  597. #define HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute, major, minor, patch) \
  598. HEDLEY_GCC_VERSION_CHECK(major, minor, patch)
  599. #endif
  600. #if defined(HEDLEY_HAS_BUILTIN)
  601. #undef HEDLEY_HAS_BUILTIN
  602. #endif
  603. #if defined(__has_builtin)
  604. #define HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin)
  605. #else
  606. #define HEDLEY_HAS_BUILTIN(builtin) (0)
  607. #endif
  608. #if defined(HEDLEY_GNUC_HAS_BUILTIN)
  609. #undef HEDLEY_GNUC_HAS_BUILTIN
  610. #endif
  611. #if defined(__has_builtin)
  612. #define HEDLEY_GNUC_HAS_BUILTIN(builtin, major, minor, patch) \
  613. __has_builtin(builtin)
  614. #else
  615. #define HEDLEY_GNUC_HAS_BUILTIN(builtin, major, minor, patch) \
  616. HEDLEY_GNUC_VERSION_CHECK(major, minor, patch)
  617. #endif
  618. #if defined(HEDLEY_GCC_HAS_BUILTIN)
  619. #undef HEDLEY_GCC_HAS_BUILTIN
  620. #endif
  621. #if defined(__has_builtin)
  622. #define HEDLEY_GCC_HAS_BUILTIN(builtin, major, minor, patch) \
  623. __has_builtin(builtin)
  624. #else
  625. #define HEDLEY_GCC_HAS_BUILTIN(builtin, major, minor, patch) \
  626. HEDLEY_GCC_VERSION_CHECK(major, minor, patch)
  627. #endif
  628. #if defined(HEDLEY_HAS_FEATURE)
  629. #undef HEDLEY_HAS_FEATURE
  630. #endif
  631. #if defined(__has_feature)
  632. #define HEDLEY_HAS_FEATURE(feature) __has_feature(feature)
  633. #else
  634. #define HEDLEY_HAS_FEATURE(feature) (0)
  635. #endif
  636. #if defined(HEDLEY_GNUC_HAS_FEATURE)
  637. #undef HEDLEY_GNUC_HAS_FEATURE
  638. #endif
  639. #if defined(__has_feature)
  640. #define HEDLEY_GNUC_HAS_FEATURE(feature, major, minor, patch) \
  641. __has_feature(feature)
  642. #else
  643. #define HEDLEY_GNUC_HAS_FEATURE(feature, major, minor, patch) \
  644. HEDLEY_GNUC_VERSION_CHECK(major, minor, patch)
  645. #endif
  646. #if defined(HEDLEY_GCC_HAS_FEATURE)
  647. #undef HEDLEY_GCC_HAS_FEATURE
  648. #endif
  649. #if defined(__has_feature)
  650. #define HEDLEY_GCC_HAS_FEATURE(feature, major, minor, patch) \
  651. __has_feature(feature)
  652. #else
  653. #define HEDLEY_GCC_HAS_FEATURE(feature, major, minor, patch) \
  654. HEDLEY_GCC_VERSION_CHECK(major, minor, patch)
  655. #endif
  656. #if defined(HEDLEY_HAS_EXTENSION)
  657. #undef HEDLEY_HAS_EXTENSION
  658. #endif
  659. #if defined(__has_extension)
  660. #define HEDLEY_HAS_EXTENSION(extension) __has_extension(extension)
  661. #else
  662. #define HEDLEY_HAS_EXTENSION(extension) (0)
  663. #endif
  664. #if defined(HEDLEY_GNUC_HAS_EXTENSION)
  665. #undef HEDLEY_GNUC_HAS_EXTENSION
  666. #endif
  667. #if defined(__has_extension)
  668. #define HEDLEY_GNUC_HAS_EXTENSION(extension, major, minor, patch) \
  669. __has_extension(extension)
  670. #else
  671. #define HEDLEY_GNUC_HAS_EXTENSION(extension, major, minor, patch) \
  672. HEDLEY_GNUC_VERSION_CHECK(major, minor, patch)
  673. #endif
  674. #if defined(HEDLEY_GCC_HAS_EXTENSION)
  675. #undef HEDLEY_GCC_HAS_EXTENSION
  676. #endif
  677. #if defined(__has_extension)
  678. #define HEDLEY_GCC_HAS_EXTENSION(extension, major, minor, patch) \
  679. __has_extension(extension)
  680. #else
  681. #define HEDLEY_GCC_HAS_EXTENSION(extension, major, minor, patch) \
  682. HEDLEY_GCC_VERSION_CHECK(major, minor, patch)
  683. #endif
  684. #if defined(HEDLEY_HAS_DECLSPEC_ATTRIBUTE)
  685. #undef HEDLEY_HAS_DECLSPEC_ATTRIBUTE
  686. #endif
  687. #if defined(__has_declspec_attribute)
  688. #define HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) \
  689. __has_declspec_attribute(attribute)
  690. #else
  691. #define HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0)
  692. #endif
  693. #if defined(HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE)
  694. #undef HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
  695. #endif
  696. #if defined(__has_declspec_attribute)
  697. #define HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute, major, minor, patch) \
  698. __has_declspec_attribute(attribute)
  699. #else
  700. #define HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute, major, minor, patch) \
  701. HEDLEY_GNUC_VERSION_CHECK(major, minor, patch)
  702. #endif
  703. #if defined(HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE)
  704. #undef HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
  705. #endif
  706. #if defined(__has_declspec_attribute)
  707. #define HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute, major, minor, patch) \
  708. __has_declspec_attribute(attribute)
  709. #else
  710. #define HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute, major, minor, patch) \
  711. HEDLEY_GCC_VERSION_CHECK(major, minor, patch)
  712. #endif
  713. #if defined(HEDLEY_HAS_WARNING)
  714. #undef HEDLEY_HAS_WARNING
  715. #endif
  716. #if defined(__has_warning)
  717. #define HEDLEY_HAS_WARNING(warning) __has_warning(warning)
  718. #else
  719. #define HEDLEY_HAS_WARNING(warning) (0)
  720. #endif
  721. #if defined(HEDLEY_GNUC_HAS_WARNING)
  722. #undef HEDLEY_GNUC_HAS_WARNING
  723. #endif
  724. #if defined(__has_warning)
  725. #define HEDLEY_GNUC_HAS_WARNING(warning, major, minor, patch) \
  726. __has_warning(warning)
  727. #else
  728. #define HEDLEY_GNUC_HAS_WARNING(warning, major, minor, patch) \
  729. HEDLEY_GNUC_VERSION_CHECK(major, minor, patch)
  730. #endif
  731. #if defined(HEDLEY_GCC_HAS_WARNING)
  732. #undef HEDLEY_GCC_HAS_WARNING
  733. #endif
  734. #if defined(__has_warning)
  735. #define HEDLEY_GCC_HAS_WARNING(warning, major, minor, patch) \
  736. __has_warning(warning)
  737. #else
  738. #define HEDLEY_GCC_HAS_WARNING(warning, major, minor, patch) \
  739. HEDLEY_GCC_VERSION_CHECK(major, minor, patch)
  740. #endif
  741. #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
  742. defined(__clang__) || HEDLEY_GCC_VERSION_CHECK(3, 0, 0) || \
  743. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  744. HEDLEY_IAR_VERSION_CHECK(8, 0, 0) || \
  745. HEDLEY_PGI_VERSION_CHECK(18, 4, 0) || \
  746. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  747. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  748. HEDLEY_TI_ARMCL_VERSION_CHECK(4, 7, 0) || \
  749. HEDLEY_TI_CL430_VERSION_CHECK(2, 0, 1) || \
  750. HEDLEY_TI_CL2000_VERSION_CHECK(6, 1, 0) || \
  751. HEDLEY_TI_CL6X_VERSION_CHECK(7, 0, 0) || \
  752. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  753. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0) || \
  754. HEDLEY_CRAY_VERSION_CHECK(5, 0, 0) || \
  755. HEDLEY_TINYC_VERSION_CHECK(0, 9, 17) || \
  756. HEDLEY_SUNPRO_VERSION_CHECK(8, 0, 0) || \
  757. (HEDLEY_IBM_VERSION_CHECK(10, 1, 0) && defined(__C99_PRAGMA_OPERATOR))
  758. #define HEDLEY_PRAGMA(value) _Pragma(#value)
  759. #elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0)
  760. #define HEDLEY_PRAGMA(value) __pragma(value)
  761. #else
  762. #define HEDLEY_PRAGMA(value)
  763. #endif
  764. #if defined(HEDLEY_DIAGNOSTIC_PUSH)
  765. #undef HEDLEY_DIAGNOSTIC_PUSH
  766. #endif
  767. #if defined(HEDLEY_DIAGNOSTIC_POP)
  768. #undef HEDLEY_DIAGNOSTIC_POP
  769. #endif
  770. #if defined(__clang__)
  771. #define HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push")
  772. #define HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop")
  773. #elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  774. #define HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
  775. #define HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
  776. #elif HEDLEY_GCC_VERSION_CHECK(4, 6, 0)
  777. #define HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
  778. #define HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
  779. #elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0) || \
  780. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  781. #define HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push))
  782. #define HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop))
  783. #elif HEDLEY_ARM_VERSION_CHECK(5, 6, 0)
  784. #define HEDLEY_DIAGNOSTIC_PUSH _Pragma("push")
  785. #define HEDLEY_DIAGNOSTIC_POP _Pragma("pop")
  786. #elif HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  787. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  788. HEDLEY_TI_CL430_VERSION_CHECK(4, 4, 0) || \
  789. HEDLEY_TI_CL6X_VERSION_CHECK(8, 1, 0) || \
  790. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  791. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0)
  792. #define HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push")
  793. #define HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop")
  794. #elif HEDLEY_PELLES_VERSION_CHECK(2, 90, 0)
  795. #define HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
  796. #define HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
  797. #else
  798. #define HEDLEY_DIAGNOSTIC_PUSH
  799. #define HEDLEY_DIAGNOSTIC_POP
  800. #endif
  801. /* HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for
  802. HEDLEY INTERNAL USE ONLY. API subject to change without notice. */
  803. #if defined(HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
  804. #undef HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
  805. #endif
  806. #if defined(__cplusplus)
  807. #if HEDLEY_HAS_WARNING("-Wc++98-compat")
  808. #if HEDLEY_HAS_WARNING("-Wc++17-extensions")
  809. #if HEDLEY_HAS_WARNING("-Wc++1z-extensions")
  810. #define HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
  811. HEDLEY_DIAGNOSTIC_PUSH \
  812. _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") _Pragma( \
  813. "clang diagnostic ignored \"-Wc++17-extensions\"") \
  814. _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \
  815. xpr HEDLEY_DIAGNOSTIC_POP
  816. #else
  817. #define HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
  818. HEDLEY_DIAGNOSTIC_PUSH \
  819. _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
  820. _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \
  821. xpr HEDLEY_DIAGNOSTIC_POP
  822. #endif
  823. #else
  824. #define HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
  825. HEDLEY_DIAGNOSTIC_PUSH \
  826. _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
  827. xpr HEDLEY_DIAGNOSTIC_POP
  828. #endif
  829. #endif
  830. #endif
  831. #if !defined(HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
  832. #define HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x
  833. #endif
  834. #if defined(HEDLEY_CONST_CAST)
  835. #undef HEDLEY_CONST_CAST
  836. #endif
  837. #if defined(__cplusplus)
  838. #define HEDLEY_CONST_CAST(T, expr) (const_cast<T>(expr))
  839. #elif HEDLEY_HAS_WARNING("-Wcast-qual") || \
  840. HEDLEY_GCC_VERSION_CHECK(4, 6, 0) || \
  841. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  842. #define HEDLEY_CONST_CAST(T, expr) \
  843. (__extension__({ \
  844. HEDLEY_DIAGNOSTIC_PUSH \
  845. HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL((T)(expr)); \
  846. HEDLEY_DIAGNOSTIC_POP \
  847. }))
  848. #else
  849. #define HEDLEY_CONST_CAST(T, expr) ((T)(expr))
  850. #endif
  851. #if defined(HEDLEY_REINTERPRET_CAST)
  852. #undef HEDLEY_REINTERPRET_CAST
  853. #endif
  854. #if defined(__cplusplus)
  855. #define HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast<T>(expr))
  856. #else
  857. #define HEDLEY_REINTERPRET_CAST(T, expr) ((T)(expr))
  858. #endif
  859. #if defined(HEDLEY_STATIC_CAST)
  860. #undef HEDLEY_STATIC_CAST
  861. #endif
  862. #if defined(__cplusplus)
  863. #define HEDLEY_STATIC_CAST(T, expr) (static_cast<T>(expr))
  864. #else
  865. #define HEDLEY_STATIC_CAST(T, expr) ((T)(expr))
  866. #endif
  867. #if defined(HEDLEY_CPP_CAST)
  868. #undef HEDLEY_CPP_CAST
  869. #endif
  870. #if defined(__cplusplus)
  871. #if HEDLEY_HAS_WARNING("-Wold-style-cast")
  872. #define HEDLEY_CPP_CAST(T, expr) \
  873. HEDLEY_DIAGNOSTIC_PUSH \
  874. _Pragma("clang diagnostic ignored \"-Wold-style-cast\"")((T)(expr)) \
  875. HEDLEY_DIAGNOSTIC_POP
  876. #elif HEDLEY_IAR_VERSION_CHECK(8, 3, 0)
  877. #define HEDLEY_CPP_CAST(T, expr) \
  878. HEDLEY_DIAGNOSTIC_PUSH \
  879. _Pragma("diag_suppress=Pe137") HEDLEY_DIAGNOSTIC_POP
  880. #else
  881. #define HEDLEY_CPP_CAST(T, expr) ((T)(expr))
  882. #endif
  883. #else
  884. #define HEDLEY_CPP_CAST(T, expr) (expr)
  885. #endif
  886. #if defined(HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED)
  887. #undef HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
  888. #endif
  889. #if HEDLEY_HAS_WARNING("-Wdeprecated-declarations")
  890. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \
  891. _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
  892. #elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  893. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \
  894. _Pragma("warning(disable:1478 1786)")
  895. #elif HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  896. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \
  897. __pragma(warning(disable : 1478 1786))
  898. #elif HEDLEY_PGI_VERSION_CHECK(20, 7, 0)
  899. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \
  900. _Pragma("diag_suppress 1215,1216,1444,1445")
  901. #elif HEDLEY_PGI_VERSION_CHECK(17, 10, 0)
  902. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444")
  903. #elif HEDLEY_GCC_VERSION_CHECK(4, 3, 0)
  904. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \
  905. _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
  906. #elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0)
  907. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable : 4996))
  908. #elif HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  909. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  910. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  911. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  912. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  913. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  914. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  915. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  916. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  917. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  918. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  919. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  920. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  921. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  922. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0)
  923. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718")
  924. #elif HEDLEY_SUNPRO_VERSION_CHECK(5, 13, 0) && !defined(__cplusplus)
  925. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \
  926. _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)")
  927. #elif HEDLEY_SUNPRO_VERSION_CHECK(5, 13, 0) && defined(__cplusplus)
  928. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \
  929. _Pragma("error_messages(off,symdeprecated,symdeprecated2)")
  930. #elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0)
  931. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED \
  932. _Pragma("diag_suppress=Pe1444,Pe1215")
  933. #elif HEDLEY_PELLES_VERSION_CHECK(2, 90, 0)
  934. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)")
  935. #else
  936. #define HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
  937. #endif
  938. #if defined(HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS)
  939. #undef HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
  940. #endif
  941. #if HEDLEY_HAS_WARNING("-Wunknown-pragmas")
  942. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
  943. _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"")
  944. #elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  945. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
  946. _Pragma("warning(disable:161)")
  947. #elif HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  948. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
  949. __pragma(warning(disable : 161))
  950. #elif HEDLEY_PGI_VERSION_CHECK(17, 10, 0)
  951. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675")
  952. #elif HEDLEY_GCC_VERSION_CHECK(4, 3, 0)
  953. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
  954. _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
  955. #elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0)
  956. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
  957. __pragma(warning(disable : 4068))
  958. #elif HEDLEY_TI_VERSION_CHECK(16, 9, 0) || \
  959. HEDLEY_TI_CL6X_VERSION_CHECK(8, 0, 0) || \
  960. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  961. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 3, 0)
  962. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
  963. #elif HEDLEY_TI_CL6X_VERSION_CHECK(8, 0, 0)
  964. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
  965. #elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0)
  966. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161")
  967. #else
  968. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
  969. #endif
  970. #if defined(HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES)
  971. #undef HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
  972. #endif
  973. #if HEDLEY_HAS_WARNING("-Wunknown-attributes")
  974. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  975. _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"")
  976. #elif HEDLEY_GCC_VERSION_CHECK(4, 6, 0)
  977. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  978. _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
  979. #elif HEDLEY_INTEL_VERSION_CHECK(17, 0, 0)
  980. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  981. _Pragma("warning(disable:1292)")
  982. #elif HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  983. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  984. __pragma(warning(disable : 1292))
  985. #elif HEDLEY_MSVC_VERSION_CHECK(19, 0, 0)
  986. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  987. __pragma(warning(disable : 5030))
  988. #elif HEDLEY_PGI_VERSION_CHECK(20, 7, 0)
  989. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  990. _Pragma("diag_suppress 1097,1098")
  991. #elif HEDLEY_PGI_VERSION_CHECK(17, 10, 0)
  992. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  993. _Pragma("diag_suppress 1097")
  994. #elif HEDLEY_SUNPRO_VERSION_CHECK(5, 14, 0) && defined(__cplusplus)
  995. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  996. _Pragma("error_messages(off,attrskipunsup)")
  997. #elif HEDLEY_TI_VERSION_CHECK(18, 1, 0) || \
  998. HEDLEY_TI_CL6X_VERSION_CHECK(8, 3, 0) || \
  999. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0)
  1000. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  1001. _Pragma("diag_suppress 1173")
  1002. #elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0)
  1003. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES \
  1004. _Pragma("diag_suppress=Pe1097")
  1005. #else
  1006. #define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
  1007. #endif
  1008. #if defined(HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL)
  1009. #undef HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
  1010. #endif
  1011. #if HEDLEY_HAS_WARNING("-Wcast-qual")
  1012. #define HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \
  1013. _Pragma("clang diagnostic ignored \"-Wcast-qual\"")
  1014. #elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  1015. #define HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \
  1016. _Pragma("warning(disable:2203 2331)")
  1017. #elif HEDLEY_GCC_VERSION_CHECK(3, 0, 0)
  1018. #define HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \
  1019. _Pragma("GCC diagnostic ignored \"-Wcast-qual\"")
  1020. #else
  1021. #define HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
  1022. #endif
  1023. #if defined(HEDLEY_DEPRECATED)
  1024. #undef HEDLEY_DEPRECATED
  1025. #endif
  1026. #if defined(HEDLEY_DEPRECATED_FOR)
  1027. #undef HEDLEY_DEPRECATED_FOR
  1028. #endif
  1029. #if HEDLEY_MSVC_VERSION_CHECK(14, 0, 0) || \
  1030. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1031. #define HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " #since))
  1032. #define HEDLEY_DEPRECATED_FOR(since, replacement) \
  1033. __declspec(deprecated("Since " #since "; use " #replacement))
  1034. #elif HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) || \
  1035. HEDLEY_GCC_VERSION_CHECK(4, 5, 0) || \
  1036. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1037. HEDLEY_ARM_VERSION_CHECK(5, 6, 0) || \
  1038. HEDLEY_SUNPRO_VERSION_CHECK(5, 13, 0) || \
  1039. HEDLEY_PGI_VERSION_CHECK(17, 10, 0) || \
  1040. HEDLEY_TI_VERSION_CHECK(18, 1, 0) || \
  1041. HEDLEY_TI_ARMCL_VERSION_CHECK(18, 1, 0) || \
  1042. HEDLEY_TI_CL6X_VERSION_CHECK(8, 3, 0) || \
  1043. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1044. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 3, 0)
  1045. #define HEDLEY_DEPRECATED(since) \
  1046. __attribute__((__deprecated__("Since " #since)))
  1047. #define HEDLEY_DEPRECATED_FOR(since, replacement) \
  1048. __attribute__((__deprecated__("Since " #since "; use " #replacement)))
  1049. #elif defined(__cplusplus) && (__cplusplus >= 201402L)
  1050. #define HEDLEY_DEPRECATED(since) \
  1051. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_( \
  1052. [[deprecated("Since " #since)]])
  1053. #define HEDLEY_DEPRECATED_FOR(since, replacement) \
  1054. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_( \
  1055. [[deprecated("Since " #since "; use " #replacement)]])
  1056. #elif HEDLEY_HAS_ATTRIBUTE(deprecated) || HEDLEY_GCC_VERSION_CHECK(3, 1, 0) || \
  1057. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1058. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1059. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  1060. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1061. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1062. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  1063. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1064. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1065. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  1066. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1067. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1068. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1069. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1070. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  1071. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1072. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0)
  1073. #define HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))
  1074. #define HEDLEY_DEPRECATED_FOR(since, replacement) \
  1075. __attribute__((__deprecated__))
  1076. #elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) || \
  1077. HEDLEY_PELLES_VERSION_CHECK(6, 50, 0) || \
  1078. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1079. #define HEDLEY_DEPRECATED(since) __declspec(deprecated)
  1080. #define HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)
  1081. #elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0)
  1082. #define HEDLEY_DEPRECATED(since) _Pragma("deprecated")
  1083. #define HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated")
  1084. #else
  1085. #define HEDLEY_DEPRECATED(since)
  1086. #define HEDLEY_DEPRECATED_FOR(since, replacement)
  1087. #endif
  1088. #if defined(HEDLEY_UNAVAILABLE)
  1089. #undef HEDLEY_UNAVAILABLE
  1090. #endif
  1091. #if HEDLEY_HAS_ATTRIBUTE(warning) || HEDLEY_GCC_VERSION_CHECK(4, 3, 0) || \
  1092. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  1093. #define HEDLEY_UNAVAILABLE(available_since) \
  1094. __attribute__((__warning__("Not available until " #available_since)))
  1095. #else
  1096. #define HEDLEY_UNAVAILABLE(available_since)
  1097. #endif
  1098. #if defined(HEDLEY_WARN_UNUSED_RESULT)
  1099. #undef HEDLEY_WARN_UNUSED_RESULT
  1100. #endif
  1101. #if defined(HEDLEY_WARN_UNUSED_RESULT_MSG)
  1102. #undef HEDLEY_WARN_UNUSED_RESULT_MSG
  1103. #endif
  1104. #if HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \
  1105. HEDLEY_GCC_VERSION_CHECK(3, 4, 0) || \
  1106. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1107. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1108. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  1109. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1110. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1111. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  1112. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1113. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1114. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  1115. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1116. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1117. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1118. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1119. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  1120. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1121. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0) || \
  1122. (HEDLEY_SUNPRO_VERSION_CHECK(5, 15, 0) && defined(__cplusplus)) || \
  1123. HEDLEY_PGI_VERSION_CHECK(17, 10, 0)
  1124. #define HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
  1125. #define HEDLEY_WARN_UNUSED_RESULT_MSG(msg) \
  1126. __attribute__((__warn_unused_result__))
  1127. #elif (HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L)
  1128. #define HEDLEY_WARN_UNUSED_RESULT \
  1129. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
  1130. #define HEDLEY_WARN_UNUSED_RESULT_MSG(msg) \
  1131. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]])
  1132. #elif HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard)
  1133. #define HEDLEY_WARN_UNUSED_RESULT \
  1134. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
  1135. #define HEDLEY_WARN_UNUSED_RESULT_MSG(msg) \
  1136. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
  1137. #elif defined(_Check_return_) /* SAL */
  1138. #define HEDLEY_WARN_UNUSED_RESULT _Check_return_
  1139. #define HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_
  1140. #else
  1141. #define HEDLEY_WARN_UNUSED_RESULT
  1142. #define HEDLEY_WARN_UNUSED_RESULT_MSG(msg)
  1143. #endif
  1144. #if defined(HEDLEY_SENTINEL)
  1145. #undef HEDLEY_SENTINEL
  1146. #endif
  1147. #if HEDLEY_HAS_ATTRIBUTE(sentinel) || HEDLEY_GCC_VERSION_CHECK(4, 0, 0) || \
  1148. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1149. HEDLEY_ARM_VERSION_CHECK(5, 4, 0)
  1150. #define HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position)))
  1151. #else
  1152. #define HEDLEY_SENTINEL(position)
  1153. #endif
  1154. #if defined(HEDLEY_NO_RETURN)
  1155. #undef HEDLEY_NO_RETURN
  1156. #endif
  1157. #if HEDLEY_IAR_VERSION_CHECK(8, 0, 0)
  1158. #define HEDLEY_NO_RETURN __noreturn
  1159. #elif HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  1160. #define HEDLEY_NO_RETURN __attribute__((__noreturn__))
  1161. #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
  1162. #define HEDLEY_NO_RETURN _Noreturn
  1163. #elif defined(__cplusplus) && (__cplusplus >= 201103L)
  1164. #define HEDLEY_NO_RETURN \
  1165. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]])
  1166. #elif HEDLEY_HAS_ATTRIBUTE(noreturn) || HEDLEY_GCC_VERSION_CHECK(3, 2, 0) || \
  1167. HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \
  1168. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1169. HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \
  1170. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1171. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  1172. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1173. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1174. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  1175. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1176. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1177. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  1178. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1179. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1180. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1181. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1182. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  1183. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1184. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0)
  1185. #define HEDLEY_NO_RETURN __attribute__((__noreturn__))
  1186. #elif HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0)
  1187. #define HEDLEY_NO_RETURN _Pragma("does_not_return")
  1188. #elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) || \
  1189. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1190. #define HEDLEY_NO_RETURN __declspec(noreturn)
  1191. #elif HEDLEY_TI_CL6X_VERSION_CHECK(6, 0, 0) && defined(__cplusplus)
  1192. #define HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;")
  1193. #elif HEDLEY_COMPCERT_VERSION_CHECK(3, 2, 0)
  1194. #define HEDLEY_NO_RETURN __attribute((noreturn))
  1195. #elif HEDLEY_PELLES_VERSION_CHECK(9, 0, 0)
  1196. #define HEDLEY_NO_RETURN __declspec(noreturn)
  1197. #else
  1198. #define HEDLEY_NO_RETURN
  1199. #endif
  1200. #if defined(HEDLEY_NO_ESCAPE)
  1201. #undef HEDLEY_NO_ESCAPE
  1202. #endif
  1203. #if HEDLEY_HAS_ATTRIBUTE(noescape)
  1204. #define HEDLEY_NO_ESCAPE __attribute__((__noescape__))
  1205. #else
  1206. #define HEDLEY_NO_ESCAPE
  1207. #endif
  1208. #if defined(HEDLEY_UNREACHABLE)
  1209. #undef HEDLEY_UNREACHABLE
  1210. #endif
  1211. #if defined(HEDLEY_UNREACHABLE_RETURN)
  1212. #undef HEDLEY_UNREACHABLE_RETURN
  1213. #endif
  1214. #if defined(HEDLEY_ASSUME)
  1215. #undef HEDLEY_ASSUME
  1216. #endif
  1217. #if HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) || \
  1218. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1219. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1220. #define HEDLEY_ASSUME(expr) __assume(expr)
  1221. #elif HEDLEY_HAS_BUILTIN(__builtin_assume)
  1222. #define HEDLEY_ASSUME(expr) __builtin_assume(expr)
  1223. #elif HEDLEY_TI_CL2000_VERSION_CHECK(6, 2, 0) || \
  1224. HEDLEY_TI_CL6X_VERSION_CHECK(4, 0, 0)
  1225. #if defined(__cplusplus)
  1226. #define HEDLEY_ASSUME(expr) std::_nassert(expr)
  1227. #else
  1228. #define HEDLEY_ASSUME(expr) _nassert(expr)
  1229. #endif
  1230. #endif
  1231. #if (HEDLEY_HAS_BUILTIN(__builtin_unreachable) && \
  1232. (!defined(HEDLEY_ARM_VERSION))) || \
  1233. HEDLEY_GCC_VERSION_CHECK(4, 5, 0) || \
  1234. HEDLEY_PGI_VERSION_CHECK(18, 10, 0) || \
  1235. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1236. HEDLEY_IBM_VERSION_CHECK(13, 1, 5)
  1237. #define HEDLEY_UNREACHABLE() __builtin_unreachable()
  1238. #elif defined(HEDLEY_ASSUME)
  1239. #define HEDLEY_UNREACHABLE() HEDLEY_ASSUME(0)
  1240. #endif
  1241. #if !defined(HEDLEY_ASSUME)
  1242. #if defined(HEDLEY_UNREACHABLE)
  1243. #define HEDLEY_ASSUME(expr) \
  1244. HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (HEDLEY_UNREACHABLE(), 1)))
  1245. #else
  1246. #define HEDLEY_ASSUME(expr) HEDLEY_STATIC_CAST(void, expr)
  1247. #endif
  1248. #endif
  1249. #if defined(HEDLEY_UNREACHABLE)
  1250. #if HEDLEY_TI_CL2000_VERSION_CHECK(6, 2, 0) || \
  1251. HEDLEY_TI_CL6X_VERSION_CHECK(4, 0, 0)
  1252. #define HEDLEY_UNREACHABLE_RETURN(value) \
  1253. return (HEDLEY_STATIC_CAST(void, HEDLEY_ASSUME(0)), (value))
  1254. #else
  1255. #define HEDLEY_UNREACHABLE_RETURN(value) HEDLEY_UNREACHABLE()
  1256. #endif
  1257. #else
  1258. #define HEDLEY_UNREACHABLE_RETURN(value) return (value)
  1259. #endif
  1260. #if !defined(HEDLEY_UNREACHABLE)
  1261. #define HEDLEY_UNREACHABLE() HEDLEY_ASSUME(0)
  1262. #endif
  1263. HEDLEY_DIAGNOSTIC_PUSH
  1264. #if HEDLEY_HAS_WARNING("-Wpedantic")
  1265. #pragma clang diagnostic ignored "-Wpedantic"
  1266. #endif
  1267. #if HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus)
  1268. #pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
  1269. #endif
  1270. #if HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros", 4, 0, 0)
  1271. #if defined(__clang__)
  1272. #pragma clang diagnostic ignored "-Wvariadic-macros"
  1273. #elif defined(HEDLEY_GCC_VERSION)
  1274. #pragma GCC diagnostic ignored "-Wvariadic-macros"
  1275. #endif
  1276. #endif
  1277. #if defined(HEDLEY_NON_NULL)
  1278. #undef HEDLEY_NON_NULL
  1279. #endif
  1280. #if HEDLEY_HAS_ATTRIBUTE(nonnull) || HEDLEY_GCC_VERSION_CHECK(3, 3, 0) || \
  1281. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1282. HEDLEY_ARM_VERSION_CHECK(4, 1, 0)
  1283. #define HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))
  1284. #else
  1285. #define HEDLEY_NON_NULL(...)
  1286. #endif
  1287. HEDLEY_DIAGNOSTIC_POP
  1288. #if defined(HEDLEY_PRINTF_FORMAT)
  1289. #undef HEDLEY_PRINTF_FORMAT
  1290. #endif
  1291. #if defined(__MINGW32__) && HEDLEY_GCC_HAS_ATTRIBUTE(format, 4, 4, 0) && \
  1292. !defined(__USE_MINGW_ANSI_STDIO)
  1293. #define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check) \
  1294. __attribute__((__format__(ms_printf, string_idx, first_to_check)))
  1295. #elif defined(__MINGW32__) && HEDLEY_GCC_HAS_ATTRIBUTE(format, 4, 4, 0) && \
  1296. defined(__USE_MINGW_ANSI_STDIO)
  1297. #define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check) \
  1298. __attribute__((__format__(gnu_printf, string_idx, first_to_check)))
  1299. #elif HEDLEY_HAS_ATTRIBUTE(format) || HEDLEY_GCC_VERSION_CHECK(3, 1, 0) || \
  1300. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1301. HEDLEY_ARM_VERSION_CHECK(5, 6, 0) || \
  1302. HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \
  1303. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1304. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  1305. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1306. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1307. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  1308. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1309. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1310. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  1311. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1312. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1313. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1314. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1315. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  1316. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1317. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0)
  1318. #define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check) \
  1319. __attribute__((__format__(__printf__, string_idx, first_to_check)))
  1320. #elif HEDLEY_PELLES_VERSION_CHECK(6, 0, 0)
  1321. #define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check) \
  1322. __declspec(vaformat(printf, string_idx, first_to_check))
  1323. #else
  1324. #define HEDLEY_PRINTF_FORMAT(string_idx, first_to_check)
  1325. #endif
  1326. #if defined(HEDLEY_CONSTEXPR)
  1327. #undef HEDLEY_CONSTEXPR
  1328. #endif
  1329. #if defined(__cplusplus)
  1330. #if __cplusplus >= 201103L
  1331. #define HEDLEY_CONSTEXPR HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr)
  1332. #endif
  1333. #endif
  1334. #if !defined(HEDLEY_CONSTEXPR)
  1335. #define HEDLEY_CONSTEXPR
  1336. #endif
  1337. #if defined(HEDLEY_PREDICT)
  1338. #undef HEDLEY_PREDICT
  1339. #endif
  1340. #if defined(HEDLEY_LIKELY)
  1341. #undef HEDLEY_LIKELY
  1342. #endif
  1343. #if defined(HEDLEY_UNLIKELY)
  1344. #undef HEDLEY_UNLIKELY
  1345. #endif
  1346. #if defined(HEDLEY_UNPREDICTABLE)
  1347. #undef HEDLEY_UNPREDICTABLE
  1348. #endif
  1349. #if HEDLEY_HAS_BUILTIN(__builtin_unpredictable)
  1350. #define HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr))
  1351. #endif
  1352. #if (HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && \
  1353. !defined(HEDLEY_PGI_VERSION)) || \
  1354. HEDLEY_GCC_VERSION_CHECK(9, 0, 0)
  1355. #define HEDLEY_PREDICT(expr, value, probability) \
  1356. __builtin_expect_with_probability((expr), (value), (probability))
  1357. #define HEDLEY_PREDICT_TRUE(expr, probability) \
  1358. __builtin_expect_with_probability(!!(expr), 1, (probability))
  1359. #define HEDLEY_PREDICT_FALSE(expr, probability) \
  1360. __builtin_expect_with_probability(!!(expr), 0, (probability))
  1361. #define HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1)
  1362. #define HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
  1363. #elif (HEDLEY_HAS_BUILTIN(__builtin_expect) && \
  1364. !defined(HEDLEY_INTEL_CL_VERSION)) || \
  1365. HEDLEY_GCC_VERSION_CHECK(3, 0, 0) || \
  1366. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1367. (HEDLEY_SUNPRO_VERSION_CHECK(5, 15, 0) && defined(__cplusplus)) || \
  1368. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1369. HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \
  1370. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1371. HEDLEY_TI_ARMCL_VERSION_CHECK(4, 7, 0) || \
  1372. HEDLEY_TI_CL430_VERSION_CHECK(3, 1, 0) || \
  1373. HEDLEY_TI_CL2000_VERSION_CHECK(6, 1, 0) || \
  1374. HEDLEY_TI_CL6X_VERSION_CHECK(6, 1, 0) || \
  1375. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1376. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0) || \
  1377. HEDLEY_TINYC_VERSION_CHECK(0, 9, 27) || \
  1378. HEDLEY_CRAY_VERSION_CHECK(8, 1, 0)
  1379. #define HEDLEY_PREDICT(expr, expected, probability) \
  1380. (((probability) >= 0.9) \
  1381. ? __builtin_expect((expr), (expected)) \
  1382. : (HEDLEY_STATIC_CAST(void, expected), (expr)))
  1383. #define HEDLEY_PREDICT_TRUE(expr, probability) \
  1384. (__extension__({ \
  1385. double hedley_probability_ = (probability); \
  1386. ((hedley_probability_ >= 0.9) \
  1387. ? __builtin_expect(!!(expr), 1) \
  1388. : ((hedley_probability_ <= 0.1) \
  1389. ? __builtin_expect(!!(expr), 0) \
  1390. : !!(expr))); \
  1391. }))
  1392. #define HEDLEY_PREDICT_FALSE(expr, probability) \
  1393. (__extension__({ \
  1394. double hedley_probability_ = (probability); \
  1395. ((hedley_probability_ >= 0.9) \
  1396. ? __builtin_expect(!!(expr), 0) \
  1397. : ((hedley_probability_ <= 0.1) \
  1398. ? __builtin_expect(!!(expr), 1) \
  1399. : !!(expr))); \
  1400. }))
  1401. #define HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1)
  1402. #define HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
  1403. #else
  1404. #define HEDLEY_PREDICT(expr, expected, probability) \
  1405. (HEDLEY_STATIC_CAST(void, expected), (expr))
  1406. #define HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr))
  1407. #define HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr))
  1408. #define HEDLEY_LIKELY(expr) (!!(expr))
  1409. #define HEDLEY_UNLIKELY(expr) (!!(expr))
  1410. #endif
  1411. #if !defined(HEDLEY_UNPREDICTABLE)
  1412. #define HEDLEY_UNPREDICTABLE(expr) HEDLEY_PREDICT(expr, 1, 0.5)
  1413. #endif
  1414. #if defined(HEDLEY_MALLOC)
  1415. #undef HEDLEY_MALLOC
  1416. #endif
  1417. #if HEDLEY_HAS_ATTRIBUTE(malloc) || HEDLEY_GCC_VERSION_CHECK(3, 1, 0) || \
  1418. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1419. HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \
  1420. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1421. HEDLEY_IBM_VERSION_CHECK(12, 1, 0) || \
  1422. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1423. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  1424. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1425. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1426. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  1427. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1428. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1429. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  1430. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1431. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1432. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1433. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1434. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  1435. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1436. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0)
  1437. #define HEDLEY_MALLOC __attribute__((__malloc__))
  1438. #elif HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0)
  1439. #define HEDLEY_MALLOC _Pragma("returns_new_memory")
  1440. #elif HEDLEY_MSVC_VERSION_CHECK(14, 0, 0) || \
  1441. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1442. #define HEDLEY_MALLOC __declspec(restrict)
  1443. #else
  1444. #define HEDLEY_MALLOC
  1445. #endif
  1446. #if defined(HEDLEY_PURE)
  1447. #undef HEDLEY_PURE
  1448. #endif
  1449. #if HEDLEY_HAS_ATTRIBUTE(pure) || HEDLEY_GCC_VERSION_CHECK(2, 96, 0) || \
  1450. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1451. HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \
  1452. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1453. HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \
  1454. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1455. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  1456. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1457. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1458. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  1459. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1460. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1461. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  1462. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1463. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1464. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1465. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1466. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  1467. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1468. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0) || \
  1469. HEDLEY_PGI_VERSION_CHECK(17, 10, 0)
  1470. #define HEDLEY_PURE __attribute__((__pure__))
  1471. #elif HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0)
  1472. #define HEDLEY_PURE _Pragma("does_not_write_global_data")
  1473. #elif defined(__cplusplus) && (HEDLEY_TI_CL430_VERSION_CHECK(2, 0, 1) || \
  1474. HEDLEY_TI_CL6X_VERSION_CHECK(4, 0, 0) || \
  1475. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0))
  1476. #define HEDLEY_PURE _Pragma("FUNC_IS_PURE;")
  1477. #else
  1478. #define HEDLEY_PURE
  1479. #endif
  1480. #if defined(HEDLEY_CONST)
  1481. #undef HEDLEY_CONST
  1482. #endif
  1483. #if HEDLEY_HAS_ATTRIBUTE(const) || HEDLEY_GCC_VERSION_CHECK(2, 5, 0) || \
  1484. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1485. HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \
  1486. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1487. HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \
  1488. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1489. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  1490. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1491. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1492. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  1493. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1494. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1495. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  1496. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1497. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1498. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1499. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1500. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  1501. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1502. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0) || \
  1503. HEDLEY_PGI_VERSION_CHECK(17, 10, 0)
  1504. #define HEDLEY_CONST __attribute__((__const__))
  1505. #elif HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0)
  1506. #define HEDLEY_CONST _Pragma("no_side_effect")
  1507. #else
  1508. #define HEDLEY_CONST HEDLEY_PURE
  1509. #endif
  1510. #if defined(HEDLEY_RESTRICT)
  1511. #undef HEDLEY_RESTRICT
  1512. #endif
  1513. #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
  1514. !defined(__cplusplus)
  1515. #define HEDLEY_RESTRICT restrict
  1516. #elif HEDLEY_GCC_VERSION_CHECK(3, 1, 0) || \
  1517. HEDLEY_MSVC_VERSION_CHECK(14, 0, 0) || \
  1518. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1519. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0) || \
  1520. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1521. HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \
  1522. HEDLEY_PGI_VERSION_CHECK(17, 10, 0) || \
  1523. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1524. HEDLEY_TI_CL2000_VERSION_CHECK(6, 2, 4) || \
  1525. HEDLEY_TI_CL6X_VERSION_CHECK(8, 1, 0) || \
  1526. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1527. (HEDLEY_SUNPRO_VERSION_CHECK(5, 14, 0) && defined(__cplusplus)) || \
  1528. HEDLEY_IAR_VERSION_CHECK(8, 0, 0) || defined(__clang__)
  1529. #define HEDLEY_RESTRICT __restrict
  1530. #elif HEDLEY_SUNPRO_VERSION_CHECK(5, 3, 0) && !defined(__cplusplus)
  1531. #define HEDLEY_RESTRICT _Restrict
  1532. #else
  1533. #define HEDLEY_RESTRICT
  1534. #endif
  1535. #if defined(HEDLEY_INLINE)
  1536. #undef HEDLEY_INLINE
  1537. #endif
  1538. #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
  1539. (defined(__cplusplus) && (__cplusplus >= 199711L))
  1540. #define HEDLEY_INLINE inline
  1541. #elif defined(HEDLEY_GCC_VERSION) || HEDLEY_ARM_VERSION_CHECK(6, 2, 0)
  1542. #define HEDLEY_INLINE __inline__
  1543. #elif HEDLEY_MSVC_VERSION_CHECK(12, 0, 0) || \
  1544. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0) || \
  1545. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1546. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 1, 0) || \
  1547. HEDLEY_TI_CL430_VERSION_CHECK(3, 1, 0) || \
  1548. HEDLEY_TI_CL2000_VERSION_CHECK(6, 2, 0) || \
  1549. HEDLEY_TI_CL6X_VERSION_CHECK(8, 0, 0) || \
  1550. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1551. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0)
  1552. #define HEDLEY_INLINE __inline
  1553. #else
  1554. #define HEDLEY_INLINE
  1555. #endif
  1556. #if defined(HEDLEY_ALWAYS_INLINE)
  1557. #undef HEDLEY_ALWAYS_INLINE
  1558. #endif
  1559. #if HEDLEY_HAS_ATTRIBUTE(always_inline) || \
  1560. HEDLEY_GCC_VERSION_CHECK(4, 0, 0) || \
  1561. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1562. HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \
  1563. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1564. HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \
  1565. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1566. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  1567. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1568. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1569. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  1570. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1571. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1572. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  1573. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1574. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1575. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1576. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1577. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  1578. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1579. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0)
  1580. #define HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) HEDLEY_INLINE
  1581. #elif HEDLEY_MSVC_VERSION_CHECK(12, 0, 0) || \
  1582. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1583. #define HEDLEY_ALWAYS_INLINE __forceinline
  1584. #elif defined(__cplusplus) && (HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1585. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1586. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1587. HEDLEY_TI_CL6X_VERSION_CHECK(6, 1, 0) || \
  1588. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1589. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0))
  1590. #define HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;")
  1591. #elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0)
  1592. #define HEDLEY_ALWAYS_INLINE _Pragma("inline=forced")
  1593. #else
  1594. #define HEDLEY_ALWAYS_INLINE HEDLEY_INLINE
  1595. #endif
  1596. #if defined(HEDLEY_NEVER_INLINE)
  1597. #undef HEDLEY_NEVER_INLINE
  1598. #endif
  1599. #if HEDLEY_HAS_ATTRIBUTE(noinline) || HEDLEY_GCC_VERSION_CHECK(4, 0, 0) || \
  1600. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1601. HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \
  1602. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1603. HEDLEY_IBM_VERSION_CHECK(10, 1, 0) || \
  1604. HEDLEY_TI_VERSION_CHECK(15, 12, 0) || \
  1605. (HEDLEY_TI_ARMCL_VERSION_CHECK(4, 8, 0) && \
  1606. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1607. HEDLEY_TI_ARMCL_VERSION_CHECK(5, 2, 0) || \
  1608. (HEDLEY_TI_CL2000_VERSION_CHECK(6, 0, 0) && \
  1609. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1610. HEDLEY_TI_CL2000_VERSION_CHECK(6, 4, 0) || \
  1611. (HEDLEY_TI_CL430_VERSION_CHECK(4, 0, 0) && \
  1612. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1613. HEDLEY_TI_CL430_VERSION_CHECK(4, 3, 0) || \
  1614. (HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1615. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1616. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0) || \
  1617. HEDLEY_TI_CL7X_VERSION_CHECK(1, 2, 0) || \
  1618. HEDLEY_TI_CLPRU_VERSION_CHECK(2, 1, 0)
  1619. #define HEDLEY_NEVER_INLINE __attribute__((__noinline__))
  1620. #elif HEDLEY_MSVC_VERSION_CHECK(13, 10, 0) || \
  1621. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1622. #define HEDLEY_NEVER_INLINE __declspec(noinline)
  1623. #elif HEDLEY_PGI_VERSION_CHECK(10, 2, 0)
  1624. #define HEDLEY_NEVER_INLINE _Pragma("noinline")
  1625. #elif HEDLEY_TI_CL6X_VERSION_CHECK(6, 0, 0) && defined(__cplusplus)
  1626. #define HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;")
  1627. #elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0)
  1628. #define HEDLEY_NEVER_INLINE _Pragma("inline=never")
  1629. #elif HEDLEY_COMPCERT_VERSION_CHECK(3, 2, 0)
  1630. #define HEDLEY_NEVER_INLINE __attribute((noinline))
  1631. #elif HEDLEY_PELLES_VERSION_CHECK(9, 0, 0)
  1632. #define HEDLEY_NEVER_INLINE __declspec(noinline)
  1633. #else
  1634. #define HEDLEY_NEVER_INLINE
  1635. #endif
  1636. #if defined(HEDLEY_PRIVATE)
  1637. #undef HEDLEY_PRIVATE
  1638. #endif
  1639. #if defined(HEDLEY_PUBLIC)
  1640. #undef HEDLEY_PUBLIC
  1641. #endif
  1642. #if defined(HEDLEY_IMPORT)
  1643. #undef HEDLEY_IMPORT
  1644. #endif
  1645. #if defined(_WIN32) || defined(__CYGWIN__)
  1646. #define HEDLEY_PRIVATE
  1647. #define HEDLEY_PUBLIC __declspec(dllexport)
  1648. #define HEDLEY_IMPORT __declspec(dllimport)
  1649. #else
  1650. #if HEDLEY_HAS_ATTRIBUTE(visibility) || HEDLEY_GCC_VERSION_CHECK(3, 3, 0) || \
  1651. HEDLEY_SUNPRO_VERSION_CHECK(5, 11, 0) || \
  1652. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1653. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1654. HEDLEY_IBM_VERSION_CHECK(13, 1, 0) || \
  1655. (defined(__TI_EABI__) && ((HEDLEY_TI_CL6X_VERSION_CHECK(7, 2, 0) && \
  1656. defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
  1657. HEDLEY_TI_CL6X_VERSION_CHECK(7, 5, 0)))
  1658. #define HEDLEY_PRIVATE __attribute__((__visibility__("hidden")))
  1659. #define HEDLEY_PUBLIC __attribute__((__visibility__("default")))
  1660. #else
  1661. #define HEDLEY_PRIVATE
  1662. #define HEDLEY_PUBLIC
  1663. #endif
  1664. #define HEDLEY_IMPORT extern
  1665. #endif
  1666. #if defined(HEDLEY_NO_THROW)
  1667. #undef HEDLEY_NO_THROW
  1668. #endif
  1669. #if HEDLEY_HAS_ATTRIBUTE(nothrow) || HEDLEY_GCC_VERSION_CHECK(3, 3, 0) || \
  1670. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  1671. #define HEDLEY_NO_THROW __attribute__((__nothrow__))
  1672. #elif HEDLEY_MSVC_VERSION_CHECK(13, 1, 0) || \
  1673. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0) || \
  1674. HEDLEY_ARM_VERSION_CHECK(4, 1, 0)
  1675. #define HEDLEY_NO_THROW __declspec(nothrow)
  1676. #else
  1677. #define HEDLEY_NO_THROW
  1678. #endif
  1679. #if defined(HEDLEY_FALL_THROUGH)
  1680. #undef HEDLEY_FALL_THROUGH
  1681. #endif
  1682. #if HEDLEY_HAS_ATTRIBUTE(fallthrough) || HEDLEY_GCC_VERSION_CHECK(7, 0, 0)
  1683. #define HEDLEY_FALL_THROUGH __attribute__((__fallthrough__))
  1684. #elif HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang, fallthrough)
  1685. #define HEDLEY_FALL_THROUGH \
  1686. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]])
  1687. #elif HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough)
  1688. #define HEDLEY_FALL_THROUGH \
  1689. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]])
  1690. #elif defined(__fallthrough) /* SAL */
  1691. #define HEDLEY_FALL_THROUGH __fallthrough
  1692. #else
  1693. #define HEDLEY_FALL_THROUGH
  1694. #endif
  1695. #if defined(HEDLEY_RETURNS_NON_NULL)
  1696. #undef HEDLEY_RETURNS_NON_NULL
  1697. #endif
  1698. #if HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || HEDLEY_GCC_VERSION_CHECK(4, 9, 0)
  1699. #define HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__))
  1700. #elif defined(_Ret_notnull_) /* SAL */
  1701. #define HEDLEY_RETURNS_NON_NULL _Ret_notnull_
  1702. #else
  1703. #define HEDLEY_RETURNS_NON_NULL
  1704. #endif
  1705. #if defined(HEDLEY_ARRAY_PARAM)
  1706. #undef HEDLEY_ARRAY_PARAM
  1707. #endif
  1708. #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
  1709. !defined(__STDC_NO_VLA__) && !defined(__cplusplus) && \
  1710. !defined(HEDLEY_PGI_VERSION) && !defined(HEDLEY_TINYC_VERSION)
  1711. #define HEDLEY_ARRAY_PARAM(name) (name)
  1712. #else
  1713. #define HEDLEY_ARRAY_PARAM(name)
  1714. #endif
  1715. #if defined(HEDLEY_IS_CONSTANT)
  1716. #undef HEDLEY_IS_CONSTANT
  1717. #endif
  1718. #if defined(HEDLEY_REQUIRE_CONSTEXPR)
  1719. #undef HEDLEY_REQUIRE_CONSTEXPR
  1720. #endif
  1721. /* HEDLEY_IS_CONSTEXPR_ is for
  1722. HEDLEY INTERNAL USE ONLY. API subject to change without notice. */
  1723. #if defined(HEDLEY_IS_CONSTEXPR_)
  1724. #undef HEDLEY_IS_CONSTEXPR_
  1725. #endif
  1726. #if HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \
  1727. HEDLEY_GCC_VERSION_CHECK(3, 4, 0) || \
  1728. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1729. HEDLEY_TINYC_VERSION_CHECK(0, 9, 19) || \
  1730. HEDLEY_ARM_VERSION_CHECK(4, 1, 0) || \
  1731. HEDLEY_IBM_VERSION_CHECK(13, 1, 0) || \
  1732. HEDLEY_TI_CL6X_VERSION_CHECK(6, 1, 0) || \
  1733. (HEDLEY_SUNPRO_VERSION_CHECK(5, 10, 0) && !defined(__cplusplus)) || \
  1734. HEDLEY_CRAY_VERSION_CHECK(8, 1, 0)
  1735. #define HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr)
  1736. #endif
  1737. #if !defined(__cplusplus)
  1738. #if HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \
  1739. HEDLEY_GCC_VERSION_CHECK(3, 4, 0) || \
  1740. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || \
  1741. HEDLEY_IBM_VERSION_CHECK(13, 1, 0) || \
  1742. HEDLEY_CRAY_VERSION_CHECK(8, 1, 0) || \
  1743. HEDLEY_ARM_VERSION_CHECK(5, 4, 0) || \
  1744. HEDLEY_TINYC_VERSION_CHECK(0, 9, 24)
  1745. #if defined(__INTPTR_TYPE__)
  1746. #define HEDLEY_IS_CONSTEXPR_(expr) \
  1747. __builtin_types_compatible_p( \
  1748. __typeof__((1 ? (void *)((__INTPTR_TYPE__)((expr)*0)) \
  1749. : (int *)0)), \
  1750. int *)
  1751. #else
  1752. #include <stdint.h>
  1753. #define HEDLEY_IS_CONSTEXPR_(expr) \
  1754. __builtin_types_compatible_p( \
  1755. __typeof__((1 ? (void *)((intptr_t)((expr)*0)) : (int *)0)), \
  1756. int *)
  1757. #endif
  1758. #elif (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \
  1759. !defined(HEDLEY_SUNPRO_VERSION) && !defined(HEDLEY_PGI_VERSION) && \
  1760. !defined(HEDLEY_IAR_VERSION)) || \
  1761. HEDLEY_HAS_EXTENSION(c_generic_selections) || \
  1762. HEDLEY_GCC_VERSION_CHECK(4, 9, 0) || \
  1763. HEDLEY_INTEL_VERSION_CHECK(17, 0, 0) || \
  1764. HEDLEY_IBM_VERSION_CHECK(12, 1, 0) || \
  1765. HEDLEY_ARM_VERSION_CHECK(5, 3, 0)
  1766. #if defined(__INTPTR_TYPE__)
  1767. #define HEDLEY_IS_CONSTEXPR_(expr) \
  1768. _Generic((1 ? (void *)((__INTPTR_TYPE__)((expr)*0)) : (int *)0), \
  1769. int * : 1, void * : 0)
  1770. #else
  1771. #include <stdint.h>
  1772. #define HEDLEY_IS_CONSTEXPR_(expr) \
  1773. _Generic((1 ? (void *)((intptr_t)*0) : (int *)0), int * : 1, void * : 0)
  1774. #endif
  1775. #elif defined(HEDLEY_GCC_VERSION) || defined(HEDLEY_INTEL_VERSION) || \
  1776. defined(HEDLEY_TINYC_VERSION) || defined(HEDLEY_TI_ARMCL_VERSION) || \
  1777. HEDLEY_TI_CL430_VERSION_CHECK(18, 12, 0) || \
  1778. defined(HEDLEY_TI_CL2000_VERSION) || \
  1779. defined(HEDLEY_TI_CL6X_VERSION) || defined(HEDLEY_TI_CL7X_VERSION) || \
  1780. defined(HEDLEY_TI_CLPRU_VERSION) || defined(__clang__)
  1781. #define HEDLEY_IS_CONSTEXPR_(expr) \
  1782. (sizeof(void) != sizeof(*(1 ? ((void *)((expr)*0L)) : ((struct { \
  1783. char v[sizeof(void) * 2]; \
  1784. } *)1))))
  1785. #endif
  1786. #endif
  1787. #if defined(HEDLEY_IS_CONSTEXPR_)
  1788. #if !defined(HEDLEY_IS_CONSTANT)
  1789. #define HEDLEY_IS_CONSTANT(expr) HEDLEY_IS_CONSTEXPR_(expr)
  1790. #endif
  1791. #define HEDLEY_REQUIRE_CONSTEXPR(expr) \
  1792. (HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1))
  1793. #else
  1794. #if !defined(HEDLEY_IS_CONSTANT)
  1795. #define HEDLEY_IS_CONSTANT(expr) (0)
  1796. #endif
  1797. #define HEDLEY_REQUIRE_CONSTEXPR(expr) (expr)
  1798. #endif
  1799. #if defined(HEDLEY_BEGIN_C_DECLS)
  1800. #undef HEDLEY_BEGIN_C_DECLS
  1801. #endif
  1802. #if defined(HEDLEY_END_C_DECLS)
  1803. #undef HEDLEY_END_C_DECLS
  1804. #endif
  1805. #if defined(HEDLEY_C_DECL)
  1806. #undef HEDLEY_C_DECL
  1807. #endif
  1808. #if defined(__cplusplus)
  1809. #define HEDLEY_BEGIN_C_DECLS extern "C" {
  1810. #define HEDLEY_END_C_DECLS }
  1811. #define HEDLEY_C_DECL extern "C"
  1812. #else
  1813. #define HEDLEY_BEGIN_C_DECLS
  1814. #define HEDLEY_END_C_DECLS
  1815. #define HEDLEY_C_DECL
  1816. #endif
  1817. #if defined(HEDLEY_STATIC_ASSERT)
  1818. #undef HEDLEY_STATIC_ASSERT
  1819. #endif
  1820. #if !defined(__cplusplus) && \
  1821. ((defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \
  1822. (HEDLEY_HAS_FEATURE(c_static_assert) && \
  1823. !defined(HEDLEY_INTEL_CL_VERSION)) || \
  1824. HEDLEY_GCC_VERSION_CHECK(6, 0, 0) || \
  1825. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0) || defined(_Static_assert))
  1826. #define HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message)
  1827. #elif (defined(__cplusplus) && (__cplusplus >= 201103L)) || \
  1828. HEDLEY_MSVC_VERSION_CHECK(16, 0, 0) || \
  1829. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1830. #define HEDLEY_STATIC_ASSERT(expr, message) \
  1831. HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_( \
  1832. static_assert(expr, message))
  1833. #else
  1834. #define HEDLEY_STATIC_ASSERT(expr, message)
  1835. #endif
  1836. #if defined(HEDLEY_NULL)
  1837. #undef HEDLEY_NULL
  1838. #endif
  1839. #if defined(__cplusplus)
  1840. #if __cplusplus >= 201103L
  1841. #define HEDLEY_NULL HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr)
  1842. #elif defined(NULL)
  1843. #define HEDLEY_NULL NULL
  1844. #else
  1845. #define HEDLEY_NULL HEDLEY_STATIC_CAST(void *, 0)
  1846. #endif
  1847. #elif defined(NULL)
  1848. #define HEDLEY_NULL NULL
  1849. #else
  1850. #define HEDLEY_NULL ((void *)0)
  1851. #endif
  1852. #if defined(HEDLEY_MESSAGE)
  1853. #undef HEDLEY_MESSAGE
  1854. #endif
  1855. #if HEDLEY_HAS_WARNING("-Wunknown-pragmas")
  1856. #define HEDLEY_MESSAGE(msg) \
  1857. HEDLEY_DIAGNOSTIC_PUSH \
  1858. HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
  1859. HEDLEY_PRAGMA(message msg) \
  1860. HEDLEY_DIAGNOSTIC_POP
  1861. #elif HEDLEY_GCC_VERSION_CHECK(4, 4, 0) || HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  1862. #define HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(message msg)
  1863. #elif HEDLEY_CRAY_VERSION_CHECK(5, 0, 0)
  1864. #define HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(_CRI message msg)
  1865. #elif HEDLEY_IAR_VERSION_CHECK(8, 0, 0)
  1866. #define HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(message(msg))
  1867. #elif HEDLEY_PELLES_VERSION_CHECK(2, 0, 0)
  1868. #define HEDLEY_MESSAGE(msg) HEDLEY_PRAGMA(message(msg))
  1869. #else
  1870. #define HEDLEY_MESSAGE(msg)
  1871. #endif
  1872. #if defined(HEDLEY_WARNING)
  1873. #undef HEDLEY_WARNING
  1874. #endif
  1875. #if HEDLEY_HAS_WARNING("-Wunknown-pragmas")
  1876. #define HEDLEY_WARNING(msg) \
  1877. HEDLEY_DIAGNOSTIC_PUSH \
  1878. HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
  1879. HEDLEY_PRAGMA(clang warning msg) \
  1880. HEDLEY_DIAGNOSTIC_POP
  1881. #elif HEDLEY_GCC_VERSION_CHECK(4, 8, 0) || \
  1882. HEDLEY_PGI_VERSION_CHECK(18, 4, 0) || \
  1883. HEDLEY_INTEL_VERSION_CHECK(13, 0, 0)
  1884. #define HEDLEY_WARNING(msg) HEDLEY_PRAGMA(GCC warning msg)
  1885. #elif HEDLEY_MSVC_VERSION_CHECK(15, 0, 0) || \
  1886. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1887. #define HEDLEY_WARNING(msg) HEDLEY_PRAGMA(message(msg))
  1888. #else
  1889. #define HEDLEY_WARNING(msg) HEDLEY_MESSAGE(msg)
  1890. #endif
  1891. #if defined(HEDLEY_REQUIRE)
  1892. #undef HEDLEY_REQUIRE
  1893. #endif
  1894. #if defined(HEDLEY_REQUIRE_MSG)
  1895. #undef HEDLEY_REQUIRE_MSG
  1896. #endif
  1897. #if HEDLEY_HAS_ATTRIBUTE(diagnose_if)
  1898. #if HEDLEY_HAS_WARNING("-Wgcc-compat")
  1899. #define HEDLEY_REQUIRE(expr) \
  1900. HEDLEY_DIAGNOSTIC_PUSH \
  1901. _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
  1902. __attribute__((diagnose_if(!(expr), #expr, "error"))) \
  1903. HEDLEY_DIAGNOSTIC_POP
  1904. #define HEDLEY_REQUIRE_MSG(expr, msg) \
  1905. HEDLEY_DIAGNOSTIC_PUSH \
  1906. _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
  1907. __attribute__((diagnose_if(!(expr), msg, "error"))) \
  1908. HEDLEY_DIAGNOSTIC_POP
  1909. #else
  1910. #define HEDLEY_REQUIRE(expr) \
  1911. __attribute__((diagnose_if(!(expr), #expr, "error")))
  1912. #define HEDLEY_REQUIRE_MSG(expr, msg) \
  1913. __attribute__((diagnose_if(!(expr), msg, "error")))
  1914. #endif
  1915. #else
  1916. #define HEDLEY_REQUIRE(expr)
  1917. #define HEDLEY_REQUIRE_MSG(expr, msg)
  1918. #endif
  1919. #if defined(HEDLEY_FLAGS)
  1920. #undef HEDLEY_FLAGS
  1921. #endif
  1922. #if HEDLEY_HAS_ATTRIBUTE(flag_enum)
  1923. #define HEDLEY_FLAGS __attribute__((__flag_enum__))
  1924. #else
  1925. #define HEDLEY_FLAGS
  1926. #endif
  1927. #if defined(HEDLEY_FLAGS_CAST)
  1928. #undef HEDLEY_FLAGS_CAST
  1929. #endif
  1930. #if HEDLEY_INTEL_VERSION_CHECK(19, 0, 0)
  1931. #define HEDLEY_FLAGS_CAST(T, expr) \
  1932. (__extension__({ \
  1933. HEDLEY_DIAGNOSTIC_PUSH \
  1934. _Pragma("warning(disable:188)")((T)(expr)); \
  1935. HEDLEY_DIAGNOSTIC_POP \
  1936. }))
  1937. #else
  1938. #define HEDLEY_FLAGS_CAST(T, expr) HEDLEY_STATIC_CAST(T, expr)
  1939. #endif
  1940. #if defined(HEDLEY_EMPTY_BASES)
  1941. #undef HEDLEY_EMPTY_BASES
  1942. #endif
  1943. #if (HEDLEY_MSVC_VERSION_CHECK(19, 0, 23918) && \
  1944. !HEDLEY_MSVC_VERSION_CHECK(20, 0, 0)) || \
  1945. HEDLEY_INTEL_CL_VERSION_CHECK(2021, 1, 0)
  1946. #define HEDLEY_EMPTY_BASES __declspec(empty_bases)
  1947. #else
  1948. #define HEDLEY_EMPTY_BASES
  1949. #endif
  1950. /* Remaining macros are deprecated. */
  1951. #if defined(HEDLEY_GCC_NOT_CLANG_VERSION_CHECK)
  1952. #undef HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
  1953. #endif
  1954. #if defined(__clang__)
  1955. #define HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major, minor, patch) (0)
  1956. #else
  1957. #define HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major, minor, patch) \
  1958. HEDLEY_GCC_VERSION_CHECK(major, minor, patch)
  1959. #endif
  1960. #if defined(HEDLEY_CLANG_HAS_ATTRIBUTE)
  1961. #undef HEDLEY_CLANG_HAS_ATTRIBUTE
  1962. #endif
  1963. #define HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) HEDLEY_HAS_ATTRIBUTE(attribute)
  1964. #if defined(HEDLEY_CLANG_HAS_CPP_ATTRIBUTE)
  1965. #undef HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
  1966. #endif
  1967. #define HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) \
  1968. HEDLEY_HAS_CPP_ATTRIBUTE(attribute)
  1969. #if defined(HEDLEY_CLANG_HAS_BUILTIN)
  1970. #undef HEDLEY_CLANG_HAS_BUILTIN
  1971. #endif
  1972. #define HEDLEY_CLANG_HAS_BUILTIN(builtin) HEDLEY_HAS_BUILTIN(builtin)
  1973. #if defined(HEDLEY_CLANG_HAS_FEATURE)
  1974. #undef HEDLEY_CLANG_HAS_FEATURE
  1975. #endif
  1976. #define HEDLEY_CLANG_HAS_FEATURE(feature) HEDLEY_HAS_FEATURE(feature)
  1977. #if defined(HEDLEY_CLANG_HAS_EXTENSION)
  1978. #undef HEDLEY_CLANG_HAS_EXTENSION
  1979. #endif
  1980. #define HEDLEY_CLANG_HAS_EXTENSION(extension) HEDLEY_HAS_EXTENSION(extension)
  1981. #if defined(HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE)
  1982. #undef HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
  1983. #endif
  1984. #define HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) \
  1985. HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute)
  1986. #if defined(HEDLEY_CLANG_HAS_WARNING)
  1987. #undef HEDLEY_CLANG_HAS_WARNING
  1988. #endif
  1989. #define HEDLEY_CLANG_HAS_WARNING(warning) HEDLEY_HAS_WARNING(warning)
  1990. #endif /* !defined(HEDLEY_VERSION) || (HEDLEY_VERSION < X) */