hedley.h 76 KB

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