repeat.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #pragma once
  2. //https://dev.to/sgf4/repeat-macro-in-c-2hh0
  3. #define REPEAT_1(FN) FN(0)
  4. #define REPEAT_2(FN) REPEAT_1(FN) FN(1)
  5. #define REPEAT_3(FN) REPEAT_2(FN) FN(2)
  6. #define REPEAT_4(FN) REPEAT_3(FN) FN(3)
  7. #define REPEAT_5(FN) REPEAT_4(FN) FN(4)
  8. #define REPEAT_6(FN) REPEAT_5(FN) FN(5)
  9. #define REPEAT_7(FN) REPEAT_6(FN) FN(6)
  10. #define REPEAT_8(FN) REPEAT_7(FN) FN(7)
  11. #define REPEAT_9(FN) REPEAT_8(FN) FN(8)
  12. #define REPEAT_10(FN) REPEAT_9(FN) FN(9)
  13. #define REPEAT_11(FN) REPEAT_10(FN) FN(10)
  14. #define REPEAT_12(FN) REPEAT_11(FN) FN(11)
  15. #define REPEAT_13(FN) REPEAT_12(FN) FN(12)
  16. #define REPEAT_14(FN) REPEAT_13(FN) FN(13)
  17. #define REPEAT_15(FN) REPEAT_14(FN) FN(14)
  18. #define REPEAT_16(FN) REPEAT_15(FN) FN(15)
  19. #define REPEAT_17(FN) REPEAT_16(FN) FN(16)
  20. #define REPEAT_18(FN) REPEAT_17(FN) FN(17)
  21. #define REPEAT_19(FN) REPEAT_18(FN) FN(18)
  22. #define REPEAT_20(FN) REPEAT_19(FN) FN(19)
  23. #define REPEAT_21(FN) REPEAT_20(FN) FN(20)
  24. #define REPEAT_22(FN) REPEAT_21(FN) FN(21)
  25. #define REPEAT_23(FN) REPEAT_22(FN) FN(22)
  26. #define REPEAT_24(FN) REPEAT_23(FN) FN(23)
  27. #define REPEAT_25(FN) REPEAT_24(FN) FN(24)
  28. #define REPEAT_26(FN) REPEAT_25(FN) FN(25)
  29. #define REPEAT_27(FN) REPEAT_26(FN) FN(26)
  30. #define REPEAT_28(FN) REPEAT_27(FN) FN(27)
  31. #define REPEAT_29(FN) REPEAT_28(FN) FN(28)
  32. #define REPEAT_30(FN) REPEAT_29(FN) FN(29)
  33. #define REPEAT_31(FN) REPEAT_30(FN) FN(30)
  34. #define REPEAT_32(FN) REPEAT_31(FN) FN(31)
  35. #define REPEAT_33(FN) REPEAT_32(FN) FN(32)
  36. #define REPEAT_34(FN) REPEAT_33(FN) FN(33)
  37. #define REPEAT_35(FN) REPEAT_34(FN) FN(34)
  38. #define REPEAT_36(FN) REPEAT_35(FN) FN(35)
  39. #define REPEAT_37(FN) REPEAT_36(FN) FN(36)
  40. #define REPEAT_38(FN) REPEAT_37(FN) FN(37)
  41. #define REPEAT_39(FN) REPEAT_38(FN) FN(38)
  42. #define REPEAT_40(FN) REPEAT_39(FN) FN(39)
  43. #define REPEAT_41(FN) REPEAT_40(FN) FN(40)
  44. #define REPEAT_42(FN) REPEAT_41(FN) FN(41)
  45. #define REPEAT_43(FN) REPEAT_42(FN) FN(42)
  46. #define REPEAT_44(FN) REPEAT_43(FN) FN(43)
  47. #define REPEAT_45(FN) REPEAT_44(FN) FN(44)
  48. #define REPEAT_46(FN) REPEAT_45(FN) FN(45)
  49. #define REPEAT_47(FN) REPEAT_46(FN) FN(46)
  50. #define REPEAT_48(FN) REPEAT_47(FN) FN(47)
  51. #define REPEAT_49(FN) REPEAT_48(FN) FN(48)
  52. #define REPEAT_50(FN) REPEAT_49(FN) FN(49)
  53. #define REPEAT_51(FN) REPEAT_50(FN) FN(50)
  54. #define REPEAT_52(FN) REPEAT_51(FN) FN(51)
  55. #define REPEAT_53(FN) REPEAT_52(FN) FN(52)
  56. #define REPEAT_54(FN) REPEAT_53(FN) FN(53)
  57. #define REPEAT_55(FN) REPEAT_54(FN) FN(54)
  58. #define REPEAT_56(FN) REPEAT_55(FN) FN(55)
  59. #define REPEAT_57(FN) REPEAT_56(FN) FN(56)
  60. #define REPEAT_58(FN) REPEAT_57(FN) FN(57)
  61. #define REPEAT_59(FN) REPEAT_58(FN) FN(58)
  62. #define REPEAT_60(FN) REPEAT_59(FN) FN(59)
  63. #define REPEAT_61(FN) REPEAT_60(FN) FN(60)
  64. #define REPEAT_62(FN) REPEAT_61(FN) FN(61)
  65. #define REPEAT_63(FN) REPEAT_62(FN) FN(62)
  66. #define REPEAT_64(FN) REPEAT_63(FN) FN(63)
  67. #define REPEAT_65(FN) REPEAT_64(FN) FN(64)
  68. #define REPEAT_66(FN) REPEAT_65(FN) FN(65)
  69. #define REPEAT_67(FN) REPEAT_66(FN) FN(66)
  70. #define REPEAT_68(FN) REPEAT_67(FN) FN(67)
  71. #define REPEAT_69(FN) REPEAT_68(FN) FN(68)
  72. #define REPEAT_70(FN) REPEAT_69(FN) FN(69)
  73. #define REPEAT_71(FN) REPEAT_70(FN) FN(70)
  74. #define REPEAT_72(FN) REPEAT_71(FN) FN(71)
  75. #define REPEAT_73(FN) REPEAT_72(FN) FN(72)
  76. #define REPEAT_74(FN) REPEAT_73(FN) FN(73)
  77. #define REPEAT_75(FN) REPEAT_74(FN) FN(74)
  78. #define REPEAT_76(FN) REPEAT_75(FN) FN(75)
  79. #define REPEAT_77(FN) REPEAT_76(FN) FN(76)
  80. #define REPEAT_78(FN) REPEAT_77(FN) FN(77)
  81. #define REPEAT_79(FN) REPEAT_78(FN) FN(78)
  82. #define REPEAT_80(FN) REPEAT_79(FN) FN(79)
  83. #define REPEAT_81(FN) REPEAT_80(FN) FN(80)
  84. #define REPEAT_82(FN) REPEAT_81(FN) FN(81)
  85. #define REPEAT_83(FN) REPEAT_82(FN) FN(82)
  86. #define REPEAT_84(FN) REPEAT_83(FN) FN(83)
  87. #define REPEAT_85(FN) REPEAT_84(FN) FN(84)
  88. #define REPEAT_86(FN) REPEAT_85(FN) FN(85)
  89. #define REPEAT_87(FN) REPEAT_86(FN) FN(86)
  90. #define REPEAT_88(FN) REPEAT_87(FN) FN(87)
  91. #define REPEAT_89(FN) REPEAT_88(FN) FN(88)
  92. #define REPEAT_90(FN) REPEAT_89(FN) FN(89)
  93. #define REPEAT_91(FN) REPEAT_90(FN) FN(90)
  94. #define REPEAT_92(FN) REPEAT_91(FN) FN(91)
  95. #define REPEAT_93(FN) REPEAT_92(FN) FN(92)
  96. #define REPEAT_94(FN) REPEAT_93(FN) FN(93)
  97. #define REPEAT_95(FN) REPEAT_94(FN) FN(94)
  98. #define REPEAT_96(FN) REPEAT_95(FN) FN(95)
  99. #define REPEAT_97(FN) REPEAT_96(FN) FN(96)
  100. #define REPEAT_98(FN) REPEAT_97(FN) FN(97)
  101. #define REPEAT_99(FN) REPEAT_98(FN) FN(98)
  102. #define REPEAT_100(FN) REPEAT_99(FN) FN(99)
  103. #define REPEAT(FN, N) REPEAT_##N(FN)
  104. //
  105. #define REPEAT_NO_0_1(FN)
  106. #define REPEAT_NO_0_2(FN) REPEAT_NO_0_1(FN) FN(1)
  107. #define REPEAT_NO_0_3(FN) REPEAT_NO_0_2(FN) FN(2)
  108. #define REPEAT_NO_0_4(FN) REPEAT_NO_0_3(FN) FN(3)
  109. #define REPEAT_NO_0_5(FN) REPEAT_NO_0_4(FN) FN(4)
  110. #define REPEAT_NO_0_6(FN) REPEAT_NO_0_5(FN) FN(5)
  111. #define REPEAT_NO_0_7(FN) REPEAT_NO_0_6(FN) FN(6)
  112. #define REPEAT_NO_0_8(FN) REPEAT_NO_0_7(FN) FN(7)
  113. #define REPEAT_NO_0_9(FN) REPEAT_NO_0_8(FN) FN(8)
  114. #define REPEAT_NO_0_10(FN) REPEAT_NO_0_9(FN) FN(9)
  115. #define REPEAT_NO_0_11(FN) REPEAT_NO_0_10(FN) FN(10)
  116. #define REPEAT_NO_0_12(FN) REPEAT_NO_0_11(FN) FN(11)
  117. #define REPEAT_NO_0_13(FN) REPEAT_NO_0_12(FN) FN(12)
  118. #define REPEAT_NO_0_14(FN) REPEAT_NO_0_13(FN) FN(13)
  119. #define REPEAT_NO_0_15(FN) REPEAT_NO_0_14(FN) FN(14)
  120. #define REPEAT_NO_0_16(FN) REPEAT_NO_0_15(FN) FN(15)
  121. #define REPEAT_NO_0_17(FN) REPEAT_NO_0_16(FN) FN(16)
  122. #define REPEAT_NO_0_18(FN) REPEAT_NO_0_17(FN) FN(17)
  123. #define REPEAT_NO_0_19(FN) REPEAT_NO_0_18(FN) FN(18)
  124. #define REPEAT_NO_0_20(FN) REPEAT_NO_0_19(FN) FN(19)
  125. #define REPEAT_NO_0_21(FN) REPEAT_NO_0_20(FN) FN(20)
  126. #define REPEAT_NO_0_22(FN) REPEAT_NO_0_21(FN) FN(21)
  127. #define REPEAT_NO_0_23(FN) REPEAT_NO_0_22(FN) FN(22)
  128. #define REPEAT_NO_0_24(FN) REPEAT_NO_0_23(FN) FN(23)
  129. #define REPEAT_NO_0_25(FN) REPEAT_NO_0_24(FN) FN(24)
  130. #define REPEAT_NO_0_26(FN) REPEAT_NO_0_25(FN) FN(25)
  131. #define REPEAT_NO_0_27(FN) REPEAT_NO_0_26(FN) FN(26)
  132. #define REPEAT_NO_0_28(FN) REPEAT_NO_0_27(FN) FN(27)
  133. #define REPEAT_NO_0_29(FN) REPEAT_NO_0_28(FN) FN(28)
  134. #define REPEAT_NO_0_30(FN) REPEAT_NO_0_29(FN) FN(29)
  135. #define REPEAT_NO_0_31(FN) REPEAT_NO_0_30(FN) FN(30)
  136. #define REPEAT_NO_0_32(FN) REPEAT_NO_0_31(FN) FN(31)
  137. #define REPEAT_NO_0_33(FN) REPEAT_NO_0_32(FN) FN(32)
  138. #define REPEAT_NO_0_34(FN) REPEAT_NO_0_33(FN) FN(33)
  139. #define REPEAT_NO_0_35(FN) REPEAT_NO_0_34(FN) FN(34)
  140. #define REPEAT_NO_0_36(FN) REPEAT_NO_0_35(FN) FN(35)
  141. #define REPEAT_NO_0_37(FN) REPEAT_NO_0_36(FN) FN(36)
  142. #define REPEAT_NO_0_38(FN) REPEAT_NO_0_37(FN) FN(37)
  143. #define REPEAT_NO_0_39(FN) REPEAT_NO_0_38(FN) FN(38)
  144. #define REPEAT_NO_0_40(FN) REPEAT_NO_0_39(FN) FN(39)
  145. #define REPEAT_NO_0_41(FN) REPEAT_NO_0_40(FN) FN(40)
  146. #define REPEAT_NO_0_42(FN) REPEAT_NO_0_41(FN) FN(41)
  147. #define REPEAT_NO_0_43(FN) REPEAT_NO_0_42(FN) FN(42)
  148. #define REPEAT_NO_0_44(FN) REPEAT_NO_0_43(FN) FN(43)
  149. #define REPEAT_NO_0_45(FN) REPEAT_NO_0_44(FN) FN(44)
  150. #define REPEAT_NO_0_46(FN) REPEAT_NO_0_45(FN) FN(45)
  151. #define REPEAT_NO_0_47(FN) REPEAT_NO_0_46(FN) FN(46)
  152. #define REPEAT_NO_0_48(FN) REPEAT_NO_0_47(FN) FN(47)
  153. #define REPEAT_NO_0_49(FN) REPEAT_NO_0_48(FN) FN(48)
  154. #define REPEAT_NO_0_50(FN) REPEAT_NO_0_49(FN) FN(49)
  155. #define REPEAT_NO_0_51(FN) REPEAT_NO_0_50(FN) FN(50)
  156. #define REPEAT_NO_0_52(FN) REPEAT_NO_0_51(FN) FN(51)
  157. #define REPEAT_NO_0_53(FN) REPEAT_NO_0_52(FN) FN(52)
  158. #define REPEAT_NO_0_54(FN) REPEAT_NO_0_53(FN) FN(53)
  159. #define REPEAT_NO_0_55(FN) REPEAT_NO_0_54(FN) FN(54)
  160. #define REPEAT_NO_0_56(FN) REPEAT_NO_0_55(FN) FN(55)
  161. #define REPEAT_NO_0_57(FN) REPEAT_NO_0_56(FN) FN(56)
  162. #define REPEAT_NO_0_58(FN) REPEAT_NO_0_57(FN) FN(57)
  163. #define REPEAT_NO_0_59(FN) REPEAT_NO_0_58(FN) FN(58)
  164. #define REPEAT_NO_0_60(FN) REPEAT_NO_0_59(FN) FN(59)
  165. #define REPEAT_NO_0_61(FN) REPEAT_NO_0_60(FN) FN(60)
  166. #define REPEAT_NO_0_62(FN) REPEAT_NO_0_61(FN) FN(61)
  167. #define REPEAT_NO_0_63(FN) REPEAT_NO_0_62(FN) FN(62)
  168. #define REPEAT_NO_0_64(FN) REPEAT_NO_0_63(FN) FN(63)
  169. #define REPEAT_NO_0_65(FN) REPEAT_NO_0_64(FN) FN(64)
  170. #define REPEAT_NO_0_66(FN) REPEAT_NO_0_65(FN) FN(65)
  171. #define REPEAT_NO_0_67(FN) REPEAT_NO_0_66(FN) FN(66)
  172. #define REPEAT_NO_0_68(FN) REPEAT_NO_0_67(FN) FN(67)
  173. #define REPEAT_NO_0_69(FN) REPEAT_NO_0_68(FN) FN(68)
  174. #define REPEAT_NO_0_70(FN) REPEAT_NO_0_69(FN) FN(69)
  175. #define REPEAT_NO_0_71(FN) REPEAT_NO_0_70(FN) FN(70)
  176. #define REPEAT_NO_0_72(FN) REPEAT_NO_0_71(FN) FN(71)
  177. #define REPEAT_NO_0_73(FN) REPEAT_NO_0_72(FN) FN(72)
  178. #define REPEAT_NO_0_74(FN) REPEAT_NO_0_73(FN) FN(73)
  179. #define REPEAT_NO_0_75(FN) REPEAT_NO_0_74(FN) FN(74)
  180. #define REPEAT_NO_0_76(FN) REPEAT_NO_0_75(FN) FN(75)
  181. #define REPEAT_NO_0_77(FN) REPEAT_NO_0_76(FN) FN(76)
  182. #define REPEAT_NO_0_78(FN) REPEAT_NO_0_77(FN) FN(77)
  183. #define REPEAT_NO_0_79(FN) REPEAT_NO_0_78(FN) FN(78)
  184. #define REPEAT_NO_0_80(FN) REPEAT_NO_0_79(FN) FN(79)
  185. #define REPEAT_NO_0_81(FN) REPEAT_NO_0_80(FN) FN(80)
  186. #define REPEAT_NO_0_82(FN) REPEAT_NO_0_81(FN) FN(81)
  187. #define REPEAT_NO_0_83(FN) REPEAT_NO_0_82(FN) FN(82)
  188. #define REPEAT_NO_0_84(FN) REPEAT_NO_0_83(FN) FN(83)
  189. #define REPEAT_NO_0_85(FN) REPEAT_NO_0_84(FN) FN(84)
  190. #define REPEAT_NO_0_86(FN) REPEAT_NO_0_85(FN) FN(85)
  191. #define REPEAT_NO_0_87(FN) REPEAT_NO_0_86(FN) FN(86)
  192. #define REPEAT_NO_0_88(FN) REPEAT_NO_0_87(FN) FN(87)
  193. #define REPEAT_NO_0_89(FN) REPEAT_NO_0_88(FN) FN(88)
  194. #define REPEAT_NO_0_90(FN) REPEAT_NO_0_89(FN) FN(89)
  195. #define REPEAT_NO_0_91(FN) REPEAT_NO_0_90(FN) FN(90)
  196. #define REPEAT_NO_0_92(FN) REPEAT_NO_0_91(FN) FN(91)
  197. #define REPEAT_NO_0_93(FN) REPEAT_NO_0_92(FN) FN(92)
  198. #define REPEAT_NO_0_94(FN) REPEAT_NO_0_93(FN) FN(93)
  199. #define REPEAT_NO_0_95(FN) REPEAT_NO_0_94(FN) FN(94)
  200. #define REPEAT_NO_0_96(FN) REPEAT_NO_0_95(FN) FN(95)
  201. #define REPEAT_NO_0_97(FN) REPEAT_NO_0_96(FN) FN(96)
  202. #define REPEAT_NO_0_98(FN) REPEAT_NO_0_97(FN) FN(97)
  203. #define REPEAT_NO_0_99(FN) REPEAT_NO_0_98(FN) FN(98)
  204. #define REPEAT_NO_0_100(FN) REPEAT_NO_0_99(FN) FN(99)
  205. #define REPEAT_NO_0(FN, N) REPEAT_NO_0_##N(FN)