rice 3.0.0 → 4.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (238) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/Gemfile +3 -0
  5. data/README.md +44 -1025
  6. data/Rakefile +95 -12
  7. data/include/rice/rice.hpp +7766 -0
  8. data/include/rice/stl.hpp +1113 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +12 -14
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +11 -6
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -46
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +3 -0
  71. data/sample/callbacks/sample_callbacks.cpp +10 -13
  72. data/sample/enum/extconf.rb +3 -0
  73. data/sample/enum/sample_enum.cpp +3 -17
  74. data/sample/enum/test.rb +2 -2
  75. data/sample/inheritance/animals.cpp +8 -24
  76. data/sample/inheritance/extconf.rb +3 -0
  77. data/sample/inheritance/test.rb +1 -1
  78. data/sample/map/extconf.rb +3 -0
  79. data/sample/map/map.cpp +10 -18
  80. data/sample/map/test.rb +1 -1
  81. data/test/embed_ruby.cpp +18 -5
  82. data/test/ext/t1/extconf.rb +3 -0
  83. data/test/ext/t1/t1.cpp +1 -3
  84. data/test/ext/t2/extconf.rb +3 -0
  85. data/test/ext/t2/t2.cpp +1 -1
  86. data/test/extconf.rb +23 -0
  87. data/test/ruby/test_callbacks_sample.rb +28 -0
  88. data/test/ruby/test_multiple_extensions.rb +18 -0
  89. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  90. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  91. data/test/test_Address_Registration_Guard.cpp +23 -10
  92. data/test/test_Array.cpp +129 -73
  93. data/test/test_Attribute.cpp +147 -0
  94. data/test/test_Builtin_Object.cpp +34 -14
  95. data/test/test_Class.cpp +149 -275
  96. data/test/test_Constructor.cpp +10 -9
  97. data/test/test_Data_Object.cpp +133 -192
  98. data/test/test_Data_Type.cpp +322 -252
  99. data/test/test_Director.cpp +54 -41
  100. data/test/test_Enum.cpp +228 -103
  101. data/test/test_Exception.cpp +5 -6
  102. data/test/test_Hash.cpp +31 -30
  103. data/test/test_Identifier.cpp +4 -5
  104. data/test/test_Inheritance.cpp +221 -0
  105. data/test/test_Iterator.cpp +161 -0
  106. data/test/test_Jump_Tag.cpp +1 -1
  107. data/test/test_Keep_Alive.cpp +161 -0
  108. data/test/test_Memory_Management.cpp +2 -4
  109. data/test/test_Module.cpp +167 -110
  110. data/test/test_Object.cpp +41 -21
  111. data/test/test_Ownership.cpp +275 -0
  112. data/test/test_Self.cpp +205 -0
  113. data/test/test_Stl_Optional.cpp +90 -0
  114. data/test/test_Stl_Pair.cpp +144 -0
  115. data/test/test_Stl_SmartPointer.cpp +200 -0
  116. data/test/test_Stl_String.cpp +74 -0
  117. data/test/test_Stl_Vector.cpp +652 -0
  118. data/test/test_String.cpp +1 -2
  119. data/test/test_Struct.cpp +29 -39
  120. data/test/test_Symbol.cpp +1 -2
  121. data/test/test_To_From_Ruby.cpp +249 -285
  122. data/test/test_global_functions.cpp +39 -19
  123. data/test/unittest.hpp +0 -4
  124. metadata +70 -141
  125. data/Doxyfile +0 -2268
  126. data/Makefile.am +0 -26
  127. data/Makefile.in +0 -931
  128. data/README.mingw +0 -8
  129. data/aclocal.m4 +0 -1085
  130. data/ax_cxx_compile_stdcxx.m4 +0 -951
  131. data/bootstrap +0 -8
  132. data/config.guess +0 -1421
  133. data/config.sub +0 -1807
  134. data/configure +0 -7792
  135. data/configure.ac +0 -55
  136. data/depcomp +0 -791
  137. data/doxygen.ac +0 -314
  138. data/doxygen.am +0 -186
  139. data/extconf.rb +0 -70
  140. data/install-sh +0 -501
  141. data/missing +0 -215
  142. data/post-autoconf.rb +0 -22
  143. data/post-automake.rb +0 -28
  144. data/rice/Address_Registration_Guard.cpp +0 -22
  145. data/rice/Arg_impl.hpp +0 -129
  146. data/rice/Arg_operators.cpp +0 -21
  147. data/rice/Arg_operators.hpp +0 -19
  148. data/rice/Array.hpp +0 -214
  149. data/rice/Array.ipp +0 -256
  150. data/rice/Builtin_Object.hpp +0 -8
  151. data/rice/Builtin_Object.ipp +0 -50
  152. data/rice/Builtin_Object_defn.hpp +0 -50
  153. data/rice/Class.cpp +0 -57
  154. data/rice/Class.hpp +0 -8
  155. data/rice/Class.ipp +0 -6
  156. data/rice/Class_defn.hpp +0 -84
  157. data/rice/Data_Type.cpp +0 -54
  158. data/rice/Data_Type_fwd.hpp +0 -12
  159. data/rice/Director.cpp +0 -13
  160. data/rice/Exception.cpp +0 -54
  161. data/rice/Exception_Base.hpp +0 -8
  162. data/rice/Exception_Base.ipp +0 -13
  163. data/rice/Exception_Base_defn.hpp +0 -27
  164. data/rice/Hash.hpp +0 -230
  165. data/rice/Hash.ipp +0 -329
  166. data/rice/Identifier.cpp +0 -8
  167. data/rice/Jump_Tag.hpp +0 -24
  168. data/rice/Makefile.am +0 -121
  169. data/rice/Makefile.in +0 -884
  170. data/rice/Module.cpp +0 -84
  171. data/rice/Module.hpp +0 -8
  172. data/rice/Module.ipp +0 -6
  173. data/rice/Module_defn.hpp +0 -88
  174. data/rice/Module_impl.hpp +0 -281
  175. data/rice/Module_impl.ipp +0 -345
  176. data/rice/Object.cpp +0 -169
  177. data/rice/Object.hpp +0 -8
  178. data/rice/Object.ipp +0 -33
  179. data/rice/Object_defn.hpp +0 -214
  180. data/rice/Require_Guard.hpp +0 -21
  181. data/rice/String.cpp +0 -89
  182. data/rice/String.hpp +0 -91
  183. data/rice/Struct.cpp +0 -117
  184. data/rice/Struct.hpp +0 -162
  185. data/rice/Struct.ipp +0 -26
  186. data/rice/Symbol.cpp +0 -25
  187. data/rice/Symbol.hpp +0 -66
  188. data/rice/Symbol.ipp +0 -44
  189. data/rice/config.hpp +0 -47
  190. data/rice/config.hpp.in +0 -46
  191. data/rice/detail/Arguments.hpp +0 -118
  192. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  193. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  194. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  195. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  196. data/rice/detail/Caster.hpp +0 -103
  197. data/rice/detail/Not_Copyable.hpp +0 -25
  198. data/rice/detail/Wrapped_Function.hpp +0 -33
  199. data/rice/detail/cfp.hpp +0 -24
  200. data/rice/detail/cfp.ipp +0 -51
  201. data/rice/detail/check_ruby_type.cpp +0 -27
  202. data/rice/detail/check_ruby_type.hpp +0 -23
  203. data/rice/detail/creation_funcs.hpp +0 -37
  204. data/rice/detail/creation_funcs.ipp +0 -36
  205. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  206. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  207. data/rice/detail/demangle.cpp +0 -56
  208. data/rice/detail/demangle.hpp +0 -19
  209. data/rice/detail/env.hpp +0 -11
  210. data/rice/detail/method_data.cpp +0 -92
  211. data/rice/detail/node.hpp +0 -13
  212. data/rice/detail/protect.cpp +0 -29
  213. data/rice/detail/protect.hpp +0 -34
  214. data/rice/detail/ruby_version_code.hpp +0 -6
  215. data/rice/detail/ruby_version_code.hpp.in +0 -6
  216. data/rice/detail/st.hpp +0 -22
  217. data/rice/detail/win32.hpp +0 -16
  218. data/rice/detail/wrap_function.hpp +0 -66
  219. data/rice/protect.hpp +0 -38
  220. data/rice/protect.ipp +0 -1134
  221. data/rice/rubypp.rb +0 -97
  222. data/rice/to_from_ruby.hpp +0 -8
  223. data/rice/to_from_ruby.ipp +0 -418
  224. data/rice/to_from_ruby_defn.hpp +0 -70
  225. data/ruby/Makefile.am +0 -1
  226. data/ruby/Makefile.in +0 -628
  227. data/ruby/lib/Makefile.am +0 -3
  228. data/ruby/lib/Makefile.in +0 -506
  229. data/ruby/lib/mkmf-rice.rb.in +0 -217
  230. data/ruby/lib/version.rb +0 -3
  231. data/ruby.ac +0 -135
  232. data/sample/Makefile.am +0 -53
  233. data/sample/Makefile.in +0 -495
  234. data/test/Makefile.am +0 -73
  235. data/test/Makefile.in +0 -1219
  236. data/test/ext/Makefile.am +0 -41
  237. data/test/ext/Makefile.in +0 -483
  238. data/test/test_rice.rb +0 -45
@@ -1,951 +0,0 @@
1
- # ===========================================================================
2
- # https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
3
- # ===========================================================================
4
- #
5
- # SYNOPSIS
6
- #
7
- # AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
8
- #
9
- # DESCRIPTION
10
- #
11
- # Check for baseline language coverage in the compiler for the specified
12
- # version of the C++ standard. If necessary, add switches to CXX and
13
- # CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
14
- # or '14' (for the C++14 standard).
15
- #
16
- # The second argument, if specified, indicates whether you insist on an
17
- # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
18
- # -std=c++11). If neither is specified, you get whatever works, with
19
- # preference for an extended mode.
20
- #
21
- # The third argument, if specified 'mandatory' or if left unspecified,
22
- # indicates that baseline support for the specified C++ standard is
23
- # required and that the macro should error out if no mode with that
24
- # support is found. If specified 'optional', then configuration proceeds
25
- # regardless, after defining HAVE_CXX${VERSION} if and only if a
26
- # supporting mode is found.
27
- #
28
- # LICENSE
29
- #
30
- # Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
31
- # Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
32
- # Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
33
- # Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
34
- # Copyright (c) 2015 Paul Norman <penorman@mac.com>
35
- # Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
36
- # Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com>
37
- # Copyright (c) 2019 Enji Cooper <yaneurabeya@gmail.com>
38
- #
39
- # Copying and distribution of this file, with or without modification, are
40
- # permitted in any medium without royalty provided the copyright notice
41
- # and this notice are preserved. This file is offered as-is, without any
42
- # warranty.
43
-
44
- #serial 11
45
-
46
- dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
47
- dnl (serial version number 13).
48
-
49
- AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
50
- m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
51
- [$1], [14], [ax_cxx_compile_alternatives="14 1y"],
52
- [$1], [17], [ax_cxx_compile_alternatives="17 1z"],
53
- [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
54
- m4_if([$2], [], [],
55
- [$2], [ext], [],
56
- [$2], [noext], [],
57
- [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
58
- m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
59
- [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
60
- [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
61
- [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
62
- AC_LANG_PUSH([C++])dnl
63
- ac_success=no
64
-
65
- m4_if([$2], [noext], [], [dnl
66
- if test x$ac_success = xno; then
67
- for alternative in ${ax_cxx_compile_alternatives}; do
68
- switch="-std=gnu++${alternative}"
69
- cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
70
- AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
71
- $cachevar,
72
- [ac_save_CXX="$CXX"
73
- CXX="$CXX $switch"
74
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
75
- [eval $cachevar=yes],
76
- [eval $cachevar=no])
77
- CXX="$ac_save_CXX"])
78
- if eval test x\$$cachevar = xyes; then
79
- CXX="$CXX $switch"
80
- if test -n "$CXXCPP" ; then
81
- CXXCPP="$CXXCPP $switch"
82
- fi
83
- ac_success=yes
84
- break
85
- fi
86
- done
87
- fi])
88
-
89
- m4_if([$2], [ext], [], [dnl
90
- if test x$ac_success = xno; then
91
- dnl HP's aCC needs +std=c++11 according to:
92
- dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
93
- dnl Cray's crayCC needs "-h std=c++11"
94
- for alternative in ${ax_cxx_compile_alternatives}; do
95
- for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
96
- cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
97
- AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
98
- $cachevar,
99
- [ac_save_CXX="$CXX"
100
- CXX="$CXX $switch"
101
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
102
- [eval $cachevar=yes],
103
- [eval $cachevar=no])
104
- CXX="$ac_save_CXX"])
105
- if eval test x\$$cachevar = xyes; then
106
- CXX="$CXX $switch"
107
- if test -n "$CXXCPP" ; then
108
- CXXCPP="$CXXCPP $switch"
109
- fi
110
- ac_success=yes
111
- break
112
- fi
113
- done
114
- if test x$ac_success = xyes; then
115
- break
116
- fi
117
- done
118
- fi])
119
- AC_LANG_POP([C++])
120
- if test x$ax_cxx_compile_cxx$1_required = xtrue; then
121
- if test x$ac_success = xno; then
122
- AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
123
- fi
124
- fi
125
- if test x$ac_success = xno; then
126
- HAVE_CXX$1=0
127
- AC_MSG_NOTICE([No compiler with C++$1 support was found])
128
- else
129
- HAVE_CXX$1=1
130
- AC_DEFINE(HAVE_CXX$1,1,
131
- [define if the compiler supports basic C++$1 syntax])
132
- fi
133
- AC_SUBST(HAVE_CXX$1)
134
- ])
135
-
136
-
137
- dnl Test body for checking C++11 support
138
-
139
- m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
140
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
141
- )
142
-
143
-
144
- dnl Test body for checking C++14 support
145
-
146
- m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
147
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
148
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
149
- )
150
-
151
- m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
152
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
153
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
154
- _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
155
- )
156
-
157
- dnl Tests for new features in C++11
158
-
159
- m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
160
-
161
- // If the compiler admits that it is not ready for C++11, why torture it?
162
- // Hopefully, this will speed up the test.
163
-
164
- #ifndef __cplusplus
165
-
166
- #error "This is not a C++ compiler"
167
-
168
- #elif __cplusplus < 201103L
169
-
170
- #error "This is not a C++11 compiler"
171
-
172
- #else
173
-
174
- namespace cxx11
175
- {
176
-
177
- namespace test_static_assert
178
- {
179
-
180
- template <typename T>
181
- struct check
182
- {
183
- static_assert(sizeof(int) <= sizeof(T), "not big enough");
184
- };
185
-
186
- }
187
-
188
- namespace test_final_override
189
- {
190
-
191
- struct Base
192
- {
193
- virtual ~Base() {}
194
- virtual void f() {}
195
- };
196
-
197
- struct Derived : public Base
198
- {
199
- virtual ~Derived() override {}
200
- virtual void f() override {}
201
- };
202
-
203
- }
204
-
205
- namespace test_double_right_angle_brackets
206
- {
207
-
208
- template < typename T >
209
- struct check {};
210
-
211
- typedef check<void> single_type;
212
- typedef check<check<void>> double_type;
213
- typedef check<check<check<void>>> triple_type;
214
- typedef check<check<check<check<void>>>> quadruple_type;
215
-
216
- }
217
-
218
- namespace test_decltype
219
- {
220
-
221
- int
222
- f()
223
- {
224
- int a = 1;
225
- decltype(a) b = 2;
226
- return a + b;
227
- }
228
-
229
- }
230
-
231
- namespace test_type_deduction
232
- {
233
-
234
- template < typename T1, typename T2 >
235
- struct is_same
236
- {
237
- static const bool value = false;
238
- };
239
-
240
- template < typename T >
241
- struct is_same<T, T>
242
- {
243
- static const bool value = true;
244
- };
245
-
246
- template < typename T1, typename T2 >
247
- auto
248
- add(T1 a1, T2 a2) -> decltype(a1 + a2)
249
- {
250
- return a1 + a2;
251
- }
252
-
253
- int
254
- test(const int c, volatile int v)
255
- {
256
- static_assert(is_same<int, decltype(0)>::value == true, "");
257
- static_assert(is_same<int, decltype(c)>::value == false, "");
258
- static_assert(is_same<int, decltype(v)>::value == false, "");
259
- auto ac = c;
260
- auto av = v;
261
- auto sumi = ac + av + 'x';
262
- auto sumf = ac + av + 1.0;
263
- static_assert(is_same<int, decltype(ac)>::value == true, "");
264
- static_assert(is_same<int, decltype(av)>::value == true, "");
265
- static_assert(is_same<int, decltype(sumi)>::value == true, "");
266
- static_assert(is_same<int, decltype(sumf)>::value == false, "");
267
- static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
268
- return (sumf > 0.0) ? sumi : add(c, v);
269
- }
270
-
271
- }
272
-
273
- namespace test_noexcept
274
- {
275
-
276
- int f() { return 0; }
277
- int g() noexcept { return 0; }
278
-
279
- static_assert(noexcept(f()) == false, "");
280
- static_assert(noexcept(g()) == true, "");
281
-
282
- }
283
-
284
- namespace test_constexpr
285
- {
286
-
287
- template < typename CharT >
288
- unsigned long constexpr
289
- strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
290
- {
291
- return *s ? strlen_c_r(s + 1, acc + 1) : acc;
292
- }
293
-
294
- template < typename CharT >
295
- unsigned long constexpr
296
- strlen_c(const CharT *const s) noexcept
297
- {
298
- return strlen_c_r(s, 0UL);
299
- }
300
-
301
- static_assert(strlen_c("") == 0UL, "");
302
- static_assert(strlen_c("1") == 1UL, "");
303
- static_assert(strlen_c("example") == 7UL, "");
304
- static_assert(strlen_c("another\0example") == 7UL, "");
305
-
306
- }
307
-
308
- namespace test_rvalue_references
309
- {
310
-
311
- template < int N >
312
- struct answer
313
- {
314
- static constexpr int value = N;
315
- };
316
-
317
- answer<1> f(int&) { return answer<1>(); }
318
- answer<2> f(const int&) { return answer<2>(); }
319
- answer<3> f(int&&) { return answer<3>(); }
320
-
321
- void
322
- test()
323
- {
324
- int i = 0;
325
- const int c = 0;
326
- static_assert(decltype(f(i))::value == 1, "");
327
- static_assert(decltype(f(c))::value == 2, "");
328
- static_assert(decltype(f(0))::value == 3, "");
329
- }
330
-
331
- }
332
-
333
- namespace test_uniform_initialization
334
- {
335
-
336
- struct test
337
- {
338
- static const int zero {};
339
- static const int one {1};
340
- };
341
-
342
- static_assert(test::zero == 0, "");
343
- static_assert(test::one == 1, "");
344
-
345
- }
346
-
347
- namespace test_lambdas
348
- {
349
-
350
- void
351
- test1()
352
- {
353
- auto lambda1 = [](){};
354
- auto lambda2 = lambda1;
355
- lambda1();
356
- lambda2();
357
- }
358
-
359
- int
360
- test2()
361
- {
362
- auto a = [](int i, int j){ return i + j; }(1, 2);
363
- auto b = []() -> int { return '0'; }();
364
- auto c = [=](){ return a + b; }();
365
- auto d = [&](){ return c; }();
366
- auto e = [a, &b](int x) mutable {
367
- const auto identity = [](int y){ return y; };
368
- for (auto i = 0; i < a; ++i)
369
- a += b--;
370
- return x + identity(a + b);
371
- }(0);
372
- return a + b + c + d + e;
373
- }
374
-
375
- int
376
- test3()
377
- {
378
- const auto nullary = [](){ return 0; };
379
- const auto unary = [](int x){ return x; };
380
- using nullary_t = decltype(nullary);
381
- using unary_t = decltype(unary);
382
- const auto higher1st = [](nullary_t f){ return f(); };
383
- const auto higher2nd = [unary](nullary_t f1){
384
- return [unary, f1](unary_t f2){ return f2(unary(f1())); };
385
- };
386
- return higher1st(nullary) + higher2nd(nullary)(unary);
387
- }
388
-
389
- }
390
-
391
- namespace test_variadic_templates
392
- {
393
-
394
- template <int...>
395
- struct sum;
396
-
397
- template <int N0, int... N1toN>
398
- struct sum<N0, N1toN...>
399
- {
400
- static constexpr auto value = N0 + sum<N1toN...>::value;
401
- };
402
-
403
- template <>
404
- struct sum<>
405
- {
406
- static constexpr auto value = 0;
407
- };
408
-
409
- static_assert(sum<>::value == 0, "");
410
- static_assert(sum<1>::value == 1, "");
411
- static_assert(sum<23>::value == 23, "");
412
- static_assert(sum<1, 2>::value == 3, "");
413
- static_assert(sum<5, 5, 11>::value == 21, "");
414
- static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
415
-
416
- }
417
-
418
- // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
419
- // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
420
- // because of this.
421
- namespace test_template_alias_sfinae
422
- {
423
-
424
- struct foo {};
425
-
426
- template<typename T>
427
- using member = typename T::member_type;
428
-
429
- template<typename T>
430
- void func(...) {}
431
-
432
- template<typename T>
433
- void func(member<T>*) {}
434
-
435
- void test();
436
-
437
- void test() { func<foo>(0); }
438
-
439
- }
440
-
441
- } // namespace cxx11
442
-
443
- #endif // __cplusplus >= 201103L
444
-
445
- ]])
446
-
447
-
448
- dnl Tests for new features in C++14
449
-
450
- m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
451
-
452
- // If the compiler admits that it is not ready for C++14, why torture it?
453
- // Hopefully, this will speed up the test.
454
-
455
- #ifndef __cplusplus
456
-
457
- #error "This is not a C++ compiler"
458
-
459
- #elif __cplusplus < 201402L
460
-
461
- #error "This is not a C++14 compiler"
462
-
463
- #else
464
-
465
- namespace cxx14
466
- {
467
-
468
- namespace test_polymorphic_lambdas
469
- {
470
-
471
- int
472
- test()
473
- {
474
- const auto lambda = [](auto&&... args){
475
- const auto istiny = [](auto x){
476
- return (sizeof(x) == 1UL) ? 1 : 0;
477
- };
478
- const int aretiny[] = { istiny(args)... };
479
- return aretiny[0];
480
- };
481
- return lambda(1, 1L, 1.0f, '1');
482
- }
483
-
484
- }
485
-
486
- namespace test_binary_literals
487
- {
488
-
489
- constexpr auto ivii = 0b0000000000101010;
490
- static_assert(ivii == 42, "wrong value");
491
-
492
- }
493
-
494
- namespace test_generalized_constexpr
495
- {
496
-
497
- template < typename CharT >
498
- constexpr unsigned long
499
- strlen_c(const CharT *const s) noexcept
500
- {
501
- auto length = 0UL;
502
- for (auto p = s; *p; ++p)
503
- ++length;
504
- return length;
505
- }
506
-
507
- static_assert(strlen_c("") == 0UL, "");
508
- static_assert(strlen_c("x") == 1UL, "");
509
- static_assert(strlen_c("test") == 4UL, "");
510
- static_assert(strlen_c("another\0test") == 7UL, "");
511
-
512
- }
513
-
514
- namespace test_lambda_init_capture
515
- {
516
-
517
- int
518
- test()
519
- {
520
- auto x = 0;
521
- const auto lambda1 = [a = x](int b){ return a + b; };
522
- const auto lambda2 = [a = lambda1(x)](){ return a; };
523
- return lambda2();
524
- }
525
-
526
- }
527
-
528
- namespace test_digit_separators
529
- {
530
-
531
- constexpr auto ten_million = 100'000'000;
532
- static_assert(ten_million == 100000000, "");
533
-
534
- }
535
-
536
- namespace test_return_type_deduction
537
- {
538
-
539
- auto f(int& x) { return x; }
540
- decltype(auto) g(int& x) { return x; }
541
-
542
- template < typename T1, typename T2 >
543
- struct is_same
544
- {
545
- static constexpr auto value = false;
546
- };
547
-
548
- template < typename T >
549
- struct is_same<T, T>
550
- {
551
- static constexpr auto value = true;
552
- };
553
-
554
- int
555
- test()
556
- {
557
- auto x = 0;
558
- static_assert(is_same<int, decltype(f(x))>::value, "");
559
- static_assert(is_same<int&, decltype(g(x))>::value, "");
560
- return x;
561
- }
562
-
563
- }
564
-
565
- } // namespace cxx14
566
-
567
- #endif // __cplusplus >= 201402L
568
-
569
- ]])
570
-
571
-
572
- dnl Tests for new features in C++17
573
-
574
- m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
575
-
576
- // If the compiler admits that it is not ready for C++17, why torture it?
577
- // Hopefully, this will speed up the test.
578
-
579
- #ifndef __cplusplus
580
-
581
- #error "This is not a C++ compiler"
582
-
583
- #elif __cplusplus < 201703L
584
-
585
- #error "This is not a C++17 compiler"
586
-
587
- #else
588
-
589
- #include <initializer_list>
590
- #include <utility>
591
- #include <type_traits>
592
-
593
- namespace cxx17
594
- {
595
-
596
- namespace test_constexpr_lambdas
597
- {
598
-
599
- constexpr int foo = [](){return 42;}();
600
-
601
- }
602
-
603
- namespace test::nested_namespace::definitions
604
- {
605
-
606
- }
607
-
608
- namespace test_fold_expression
609
- {
610
-
611
- template<typename... Args>
612
- int multiply(Args... args)
613
- {
614
- return (args * ... * 1);
615
- }
616
-
617
- template<typename... Args>
618
- bool all(Args... args)
619
- {
620
- return (args && ...);
621
- }
622
-
623
- }
624
-
625
- namespace test_extended_static_assert
626
- {
627
-
628
- static_assert (true);
629
-
630
- }
631
-
632
- namespace test_auto_brace_init_list
633
- {
634
-
635
- auto foo = {5};
636
- auto bar {5};
637
-
638
- static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
639
- static_assert(std::is_same<int, decltype(bar)>::value);
640
- }
641
-
642
- namespace test_typename_in_template_template_parameter
643
- {
644
-
645
- template<template<typename> typename X> struct D;
646
-
647
- }
648
-
649
- namespace test_fallthrough_nodiscard_maybe_unused_attributes
650
- {
651
-
652
- int f1()
653
- {
654
- return 42;
655
- }
656
-
657
- [[nodiscard]] int f2()
658
- {
659
- [[maybe_unused]] auto unused = f1();
660
-
661
- switch (f1())
662
- {
663
- case 17:
664
- f1();
665
- [[fallthrough]];
666
- case 42:
667
- f1();
668
- }
669
- return f1();
670
- }
671
-
672
- }
673
-
674
- namespace test_extended_aggregate_initialization
675
- {
676
-
677
- struct base1
678
- {
679
- int b1, b2 = 42;
680
- };
681
-
682
- struct base2
683
- {
684
- base2() {
685
- b3 = 42;
686
- }
687
- int b3;
688
- };
689
-
690
- struct derived : base1, base2
691
- {
692
- int d;
693
- };
694
-
695
- derived d1 {{1, 2}, {}, 4}; // full initialization
696
- derived d2 {{}, {}, 4}; // value-initialized bases
697
-
698
- }
699
-
700
- namespace test_general_range_based_for_loop
701
- {
702
-
703
- struct iter
704
- {
705
- int i;
706
-
707
- int& operator* ()
708
- {
709
- return i;
710
- }
711
-
712
- const int& operator* () const
713
- {
714
- return i;
715
- }
716
-
717
- iter& operator++()
718
- {
719
- ++i;
720
- return *this;
721
- }
722
- };
723
-
724
- struct sentinel
725
- {
726
- int i;
727
- };
728
-
729
- bool operator== (const iter& i, const sentinel& s)
730
- {
731
- return i.i == s.i;
732
- }
733
-
734
- bool operator!= (const iter& i, const sentinel& s)
735
- {
736
- return !(i == s);
737
- }
738
-
739
- struct range
740
- {
741
- iter begin() const
742
- {
743
- return {0};
744
- }
745
-
746
- sentinel end() const
747
- {
748
- return {5};
749
- }
750
- };
751
-
752
- void f()
753
- {
754
- range r {};
755
-
756
- for (auto i : r)
757
- {
758
- [[maybe_unused]] auto v = i;
759
- }
760
- }
761
-
762
- }
763
-
764
- namespace test_lambda_capture_asterisk_this_by_value
765
- {
766
-
767
- struct t
768
- {
769
- int i;
770
- int foo()
771
- {
772
- return [*this]()
773
- {
774
- return i;
775
- }();
776
- }
777
- };
778
-
779
- }
780
-
781
- namespace test_enum_class_construction
782
- {
783
-
784
- enum class byte : unsigned char
785
- {};
786
-
787
- byte foo {42};
788
-
789
- }
790
-
791
- namespace test_constexpr_if
792
- {
793
-
794
- template <bool cond>
795
- int f ()
796
- {
797
- if constexpr(cond)
798
- {
799
- return 13;
800
- }
801
- else
802
- {
803
- return 42;
804
- }
805
- }
806
-
807
- }
808
-
809
- namespace test_selection_statement_with_initializer
810
- {
811
-
812
- int f()
813
- {
814
- return 13;
815
- }
816
-
817
- int f2()
818
- {
819
- if (auto i = f(); i > 0)
820
- {
821
- return 3;
822
- }
823
-
824
- switch (auto i = f(); i + 4)
825
- {
826
- case 17:
827
- return 2;
828
-
829
- default:
830
- return 1;
831
- }
832
- }
833
-
834
- }
835
-
836
- namespace test_template_argument_deduction_for_class_templates
837
- {
838
-
839
- template <typename T1, typename T2>
840
- struct pair
841
- {
842
- pair (T1 p1, T2 p2)
843
- : m1 {p1},
844
- m2 {p2}
845
- {}
846
-
847
- T1 m1;
848
- T2 m2;
849
- };
850
-
851
- void f()
852
- {
853
- [[maybe_unused]] auto p = pair{13, 42u};
854
- }
855
-
856
- }
857
-
858
- namespace test_non_type_auto_template_parameters
859
- {
860
-
861
- template <auto n>
862
- struct B
863
- {};
864
-
865
- B<5> b1;
866
- B<'a'> b2;
867
-
868
- }
869
-
870
- namespace test_structured_bindings
871
- {
872
-
873
- int arr[2] = { 1, 2 };
874
- std::pair<int, int> pr = { 1, 2 };
875
-
876
- auto f1() -> int(&)[2]
877
- {
878
- return arr;
879
- }
880
-
881
- auto f2() -> std::pair<int, int>&
882
- {
883
- return pr;
884
- }
885
-
886
- struct S
887
- {
888
- int x1 : 2;
889
- volatile double y1;
890
- };
891
-
892
- S f3()
893
- {
894
- return {};
895
- }
896
-
897
- auto [ x1, y1 ] = f1();
898
- auto& [ xr1, yr1 ] = f1();
899
- auto [ x2, y2 ] = f2();
900
- auto& [ xr2, yr2 ] = f2();
901
- const auto [ x3, y3 ] = f3();
902
-
903
- }
904
-
905
- namespace test_exception_spec_type_system
906
- {
907
-
908
- struct Good {};
909
- struct Bad {};
910
-
911
- void g1() noexcept;
912
- void g2();
913
-
914
- template<typename T>
915
- Bad
916
- f(T*, T*);
917
-
918
- template<typename T1, typename T2>
919
- Good
920
- f(T1*, T2*);
921
-
922
- static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
923
-
924
- }
925
-
926
- namespace test_inline_variables
927
- {
928
-
929
- template<class T> void f(T)
930
- {}
931
-
932
- template<class T> inline T g(T)
933
- {
934
- return T{};
935
- }
936
-
937
- template<> inline void f<>(int)
938
- {}
939
-
940
- template<> int g<>(int)
941
- {
942
- return 5;
943
- }
944
-
945
- }
946
-
947
- } // namespace cxx17
948
-
949
- #endif // __cplusplus < 201703L
950
-
951
- ]])