rice 4.5.0 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/CMakeLists.txt +31 -0
  4. data/CMakePresets.json +75 -0
  5. data/COPYING +3 -2
  6. data/FindRuby.cmake +437 -0
  7. data/Rakefile +5 -4
  8. data/include/rice/rice.hpp +5436 -3201
  9. data/include/rice/stl.hpp +2355 -1269
  10. data/lib/make_rice_headers.rb +79 -0
  11. data/lib/mkmf-rice.rb +4 -0
  12. data/lib/rice/version.rb +3 -0
  13. data/lib/rice.rb +1 -0
  14. data/lib/rubygems/builder.rb +11 -0
  15. data/lib/rubygems/cmake_builder.rb +113 -0
  16. data/lib/rubygems_plugin.rb +9 -0
  17. data/rice/Arg.hpp +7 -1
  18. data/rice/Arg.ipp +11 -2
  19. data/rice/Buffer.hpp +123 -0
  20. data/rice/Buffer.ipp +599 -0
  21. data/rice/Constructor.ipp +3 -3
  22. data/rice/Data_Object.hpp +2 -3
  23. data/rice/Data_Object.ipp +188 -188
  24. data/rice/Data_Type.hpp +4 -5
  25. data/rice/Data_Type.ipp +42 -26
  26. data/rice/Enum.hpp +0 -1
  27. data/rice/Enum.ipp +26 -23
  28. data/rice/Init.hpp +8 -0
  29. data/rice/Init.ipp +8 -0
  30. data/rice/MemoryView.ipp +1 -41
  31. data/rice/Return.hpp +1 -1
  32. data/rice/Return.ipp +6 -0
  33. data/rice/cpp_api/Array.hpp +209 -0
  34. data/rice/cpp_api/Array.ipp +304 -0
  35. data/rice/cpp_api/Builtin_Object.hpp +31 -0
  36. data/rice/cpp_api/Builtin_Object.ipp +37 -0
  37. data/rice/cpp_api/Class.hpp +70 -0
  38. data/rice/cpp_api/Class.ipp +97 -0
  39. data/rice/cpp_api/Encoding.hpp +32 -0
  40. data/rice/cpp_api/Encoding.ipp +59 -0
  41. data/rice/cpp_api/Hash.hpp +194 -0
  42. data/rice/cpp_api/Hash.ipp +257 -0
  43. data/rice/cpp_api/Identifier.hpp +46 -0
  44. data/rice/cpp_api/Identifier.ipp +31 -0
  45. data/rice/cpp_api/Module.hpp +72 -0
  46. data/rice/cpp_api/Module.ipp +101 -0
  47. data/rice/cpp_api/Object.hpp +272 -0
  48. data/rice/cpp_api/Object.ipp +235 -0
  49. data/rice/cpp_api/String.hpp +74 -0
  50. data/rice/cpp_api/String.ipp +120 -0
  51. data/rice/cpp_api/Struct.hpp +113 -0
  52. data/rice/cpp_api/Struct.ipp +92 -0
  53. data/rice/cpp_api/Symbol.hpp +46 -0
  54. data/rice/cpp_api/Symbol.ipp +93 -0
  55. data/rice/cpp_api/shared_methods.hpp +134 -0
  56. data/rice/detail/MethodInfo.hpp +1 -9
  57. data/rice/detail/MethodInfo.ipp +5 -72
  58. data/rice/detail/Native.hpp +3 -2
  59. data/rice/detail/Native.ipp +32 -4
  60. data/rice/detail/NativeAttributeGet.hpp +3 -2
  61. data/rice/detail/NativeAttributeGet.ipp +8 -2
  62. data/rice/detail/NativeAttributeSet.hpp +3 -2
  63. data/rice/detail/NativeAttributeSet.ipp +8 -2
  64. data/rice/detail/NativeCallbackFFI.ipp +1 -1
  65. data/rice/detail/NativeFunction.hpp +17 -6
  66. data/rice/detail/NativeFunction.ipp +168 -64
  67. data/rice/detail/NativeIterator.hpp +3 -2
  68. data/rice/detail/NativeIterator.ipp +8 -2
  69. data/rice/detail/RubyType.hpp +2 -5
  70. data/rice/detail/RubyType.ipp +50 -5
  71. data/rice/detail/Type.hpp +3 -1
  72. data/rice/detail/Type.ipp +61 -31
  73. data/rice/detail/Wrapper.hpp +68 -33
  74. data/rice/detail/Wrapper.ipp +103 -113
  75. data/rice/detail/from_ruby.hpp +5 -4
  76. data/rice/detail/from_ruby.ipp +737 -365
  77. data/rice/detail/to_ruby.ipp +1092 -186
  78. data/rice/global_function.ipp +1 -1
  79. data/rice/libc/file.hpp +11 -0
  80. data/rice/libc/file.ipp +32 -0
  81. data/rice/rice.hpp +23 -16
  82. data/rice/stl/complex.hpp +6 -0
  83. data/rice/stl/complex.ipp +93 -0
  84. data/rice/stl/exception.hpp +11 -0
  85. data/rice/stl/exception.ipp +29 -0
  86. data/rice/stl/exception_ptr.hpp +6 -0
  87. data/rice/stl/exception_ptr.ipp +27 -0
  88. data/rice/stl/map.hpp +12 -0
  89. data/rice/stl/map.ipp +469 -0
  90. data/rice/stl/monostate.hpp +6 -0
  91. data/rice/stl/monostate.ipp +80 -0
  92. data/rice/stl/multimap.hpp +14 -0
  93. data/rice/stl/multimap.ipp +448 -0
  94. data/rice/stl/optional.hpp +6 -0
  95. data/rice/stl/optional.ipp +118 -0
  96. data/rice/stl/pair.hpp +13 -0
  97. data/rice/stl/pair.ipp +155 -0
  98. data/rice/stl/reference_wrapper.hpp +6 -0
  99. data/rice/stl/reference_wrapper.ipp +41 -0
  100. data/rice/stl/set.hpp +12 -0
  101. data/rice/stl/set.ipp +495 -0
  102. data/rice/stl/shared_ptr.hpp +28 -0
  103. data/rice/stl/shared_ptr.ipp +224 -0
  104. data/rice/stl/string.hpp +6 -0
  105. data/rice/stl/string.ipp +158 -0
  106. data/rice/stl/string_view.hpp +6 -0
  107. data/rice/stl/string_view.ipp +65 -0
  108. data/rice/stl/tuple.hpp +6 -0
  109. data/rice/stl/tuple.ipp +128 -0
  110. data/rice/stl/type_index.hpp +6 -0
  111. data/rice/stl/type_index.ipp +30 -0
  112. data/rice/stl/type_info.hpp +6 -0
  113. data/rice/stl/type_info.ipp +29 -0
  114. data/rice/stl/unique_ptr.hpp +22 -0
  115. data/rice/stl/unique_ptr.ipp +139 -0
  116. data/rice/stl/unordered_map.hpp +12 -0
  117. data/rice/stl/unordered_map.ipp +469 -0
  118. data/rice/stl/variant.hpp +6 -0
  119. data/rice/stl/variant.ipp +242 -0
  120. data/rice/stl/vector.hpp +12 -0
  121. data/rice/stl/vector.ipp +590 -0
  122. data/rice/stl.hpp +7 -3
  123. data/rice/traits/attribute_traits.hpp +26 -0
  124. data/rice/traits/function_traits.hpp +95 -0
  125. data/rice/traits/method_traits.hpp +47 -0
  126. data/rice/traits/rice_traits.hpp +160 -0
  127. data/rice.gemspec +85 -0
  128. data/test/embed_ruby.cpp +3 -0
  129. data/test/ruby/test_multiple_extensions_same_class.rb +14 -14
  130. data/test/test_Array.cpp +6 -3
  131. data/test/test_Attribute.cpp +34 -1
  132. data/test/test_Buffer.cpp +285 -0
  133. data/test/test_Callback.cpp +2 -3
  134. data/test/test_Data_Object.cpp +88 -34
  135. data/test/test_Data_Type.cpp +106 -65
  136. data/test/test_Director.cpp +7 -3
  137. data/test/test_Enum.cpp +5 -2
  138. data/test/test_File.cpp +1 -1
  139. data/test/test_From_Ruby.cpp +181 -114
  140. data/test/test_Iterator.cpp +1 -1
  141. data/test/{test_JumpException.cpp → test_Jump_Exception.cpp} +1 -0
  142. data/test/test_Keep_Alive.cpp +7 -18
  143. data/test/test_Keep_Alive_No_Wrapper.cpp +0 -1
  144. data/test/test_Module.cpp +13 -6
  145. data/test/test_Native_Registry.cpp +0 -1
  146. data/test/test_Overloads.cpp +180 -5
  147. data/test/test_Ownership.cpp +100 -57
  148. data/test/test_Proc.cpp +0 -1
  149. data/test/test_Self.cpp +4 -4
  150. data/test/test_Stl_Map.cpp +37 -39
  151. data/test/test_Stl_Multimap.cpp +693 -0
  152. data/test/test_Stl_Pair.cpp +8 -8
  153. data/test/test_Stl_Reference_Wrapper.cpp +4 -2
  154. data/test/test_Stl_Set.cpp +790 -0
  155. data/test/{test_Stl_SmartPointer.cpp → test_Stl_SharedPtr.cpp} +97 -127
  156. data/test/test_Stl_Tuple.cpp +116 -0
  157. data/test/test_Stl_Type.cpp +1 -1
  158. data/test/test_Stl_UniquePtr.cpp +202 -0
  159. data/test/test_Stl_Unordered_Map.cpp +28 -34
  160. data/test/test_Stl_Variant.cpp +217 -89
  161. data/test/test_Stl_Vector.cpp +209 -83
  162. data/test/test_To_Ruby.cpp +373 -1
  163. data/test/test_Type.cpp +85 -14
  164. data/test/test_global_functions.cpp +17 -4
  165. metadata +94 -10
  166. data/rice/detail/TupleIterator.hpp +0 -14
@@ -0,0 +1,448 @@
1
+ #include <map>
2
+
3
+ namespace Rice
4
+ {
5
+ namespace stl
6
+ {
7
+ template<typename T>
8
+ class MultimapHelper
9
+ {
10
+ using Key_T = typename T::key_type;
11
+ using Mapped_T = typename T::mapped_type;
12
+ using Value_T = typename T::value_type;
13
+ using Reference_T = typename T::reference;
14
+ using Size_T = typename T::size_type;
15
+ using Difference_T = typename T::difference_type;
16
+ using To_Ruby_T = typename detail::remove_cv_recursive_t<Mapped_T>;
17
+
18
+ public:
19
+ MultimapHelper(Data_Type<T> klass) : klass_(klass)
20
+ {
21
+ this->register_pair();
22
+ this->define_constructor();
23
+ this->define_copyable_methods();
24
+ this->define_capacity_methods();
25
+ this->define_access_methods();
26
+ this->define_comparable_methods();
27
+ this->define_modify_methods();
28
+ this->define_enumerable();
29
+ this->define_to_s();
30
+ }
31
+
32
+ private:
33
+
34
+ void register_pair()
35
+ {
36
+ define_pair<const Key_T, Mapped_T>();
37
+ }
38
+
39
+ void define_constructor()
40
+ {
41
+ klass_.define_constructor(Constructor<T>());
42
+ }
43
+
44
+ void define_copyable_methods()
45
+ {
46
+ if constexpr (std::is_copy_constructible_v<Value_T>)
47
+ {
48
+ klass_.define_method("copy", [](T& multimap) -> T
49
+ {
50
+ return multimap;
51
+ });
52
+ }
53
+ else
54
+ {
55
+ klass_.define_method("copy", [](T& multimap) -> T
56
+ {
57
+ throw std::runtime_error("Cannot copy multimaps with non-copy constructible types");
58
+ return multimap;
59
+ });
60
+ }
61
+ }
62
+
63
+ void define_capacity_methods()
64
+ {
65
+ klass_.define_method("empty?", &T::empty)
66
+ .define_method("max_size", &T::max_size)
67
+ .define_method("size", &T::size);
68
+
69
+ rb_define_alias(klass_, "count", "size");
70
+ rb_define_alias(klass_, "length", "size");
71
+ }
72
+
73
+ void define_access_methods()
74
+ {
75
+ // Access methods
76
+ klass_.
77
+ define_method("[]", [](const T& multimap, const Key_T& key) -> Array
78
+ {
79
+ Array result;
80
+ auto range = multimap.equal_range(key);
81
+
82
+ for (auto iter = range.first; iter != range.second; iter++)
83
+ {
84
+ result.push<Mapped_T>(iter->second);
85
+ }
86
+
87
+ return result;
88
+ })
89
+ .define_method("include?", [](T& multimap, Key_T& key) -> bool
90
+ {
91
+ return multimap.find(key) != multimap.end();
92
+ })
93
+ .define_method("keys", [](T& multimap) -> std::vector<Key_T>
94
+ {
95
+ std::vector<Key_T> result;
96
+ std::transform(multimap.begin(), multimap.end(), std::back_inserter(result),
97
+ [](const auto& pair)
98
+ {
99
+ return pair.first;
100
+ });
101
+
102
+ return result;
103
+ })
104
+ .define_method("values", [](T& multimap) -> std::vector<Mapped_T>
105
+ {
106
+ std::vector<Mapped_T> result;
107
+ std::transform(multimap.begin(), multimap.end(), std::back_inserter(result),
108
+ [](const auto& pair)
109
+ {
110
+ return pair.second;
111
+ });
112
+
113
+ return result;
114
+ });
115
+
116
+ rb_define_alias(klass_, "has_key", "include?");
117
+ }
118
+
119
+ // Methods that require Value_T to support operator==
120
+ void define_comparable_methods()
121
+ {
122
+ if constexpr (detail::is_comparable_v<Mapped_T>)
123
+ {
124
+ klass_.define_method("value?", [](T& multimap, Mapped_T& value) -> bool
125
+ {
126
+ auto it = std::find_if(multimap.begin(), multimap.end(),
127
+ [&value](auto& pair)
128
+ {
129
+ return pair.second == value;
130
+ });
131
+
132
+ return it != multimap.end();
133
+ });
134
+ }
135
+ else
136
+ {
137
+ klass_.define_method("value?", [](T& multimap, Mapped_T& value) -> bool
138
+ {
139
+ return false;
140
+ });
141
+ }
142
+
143
+ rb_define_alias(klass_, "has_value", "value?");
144
+ }
145
+
146
+ void define_modify_methods()
147
+ {
148
+ klass_.define_method("clear", &T::clear)
149
+ .define_method("delete", [](T& multimap, Key_T& key) -> std::optional<Mapped_T>
150
+ {
151
+ auto iter = multimap.find(key);
152
+
153
+ if (iter != multimap.end())
154
+ {
155
+ Mapped_T result = iter->second;
156
+ multimap.erase(iter);
157
+ return result;
158
+ }
159
+ else
160
+ {
161
+ return std::nullopt;
162
+ }
163
+ })
164
+ .define_method("insert", [](T& map, Key_T key, Mapped_T& value) -> Mapped_T
165
+ {
166
+ Value_T element{ key, value };
167
+ map.insert(element);
168
+ return value;
169
+ });
170
+ }
171
+
172
+ void define_enumerable()
173
+ {
174
+ // Add enumerable support
175
+ klass_.template define_iterator<typename T::iterator (T::*)()>(&T::begin, &T::end);
176
+ }
177
+
178
+ void define_to_s()
179
+ {
180
+ if constexpr (detail::is_ostreamable_v<Key_T> && detail::is_ostreamable_v<Mapped_T>)
181
+ {
182
+ klass_.define_method("to_s", [](const T& multimap)
183
+ {
184
+ auto iter = multimap.begin();
185
+
186
+ std::stringstream stream;
187
+ stream << "<" << detail::rubyClassName(detail::typeName(typeid(T))) << ":";
188
+ stream << "{";
189
+
190
+ for (; iter != multimap.end(); iter++)
191
+ {
192
+ if (iter != multimap.begin())
193
+ {
194
+ stream << ", ";
195
+ }
196
+ stream << iter->first << " => " << iter->second;
197
+ }
198
+
199
+ stream << "}>";
200
+ return stream.str();
201
+ });
202
+ }
203
+ else
204
+ {
205
+ klass_.define_method("to_s", [](const T& multimap)
206
+ {
207
+ return "[Not printable]";
208
+ });
209
+ }
210
+ }
211
+
212
+ private:
213
+ Data_Type<T> klass_;
214
+ };
215
+ } // namespace
216
+
217
+ template<typename Key, typename T>
218
+ Data_Type<std::multimap<Key, T>> define_multimap(std::string klassName)
219
+ {
220
+ using MultiMap_T = std::multimap<Key, T>;
221
+ using Data_Type_T = Data_Type<MultiMap_T>;
222
+
223
+ if (klassName.empty())
224
+ {
225
+ std::string typeName = detail::typeName(typeid(MultiMap_T));
226
+ klassName = detail::rubyClassName(typeName);
227
+ }
228
+
229
+ Module rb_mStd = define_module("Std");
230
+ if (Data_Type_T::check_defined(klassName, rb_mStd))
231
+ {
232
+ return Data_Type_T();
233
+ }
234
+
235
+ Identifier id(klassName);
236
+ Data_Type_T result = define_class_under<detail::intrinsic_type<MultiMap_T>>(rb_mStd, id);
237
+ stl::MultimapHelper helper(result);
238
+ return result;
239
+ }
240
+
241
+ namespace detail
242
+ {
243
+ // Helper method - maybe someday create a C++ Ruby set wrapper
244
+ template<typename T, typename U>
245
+ std::multimap<T, U> toMultimap(VALUE rubyHash)
246
+ {
247
+ using Function_T = void(*)(VALUE, int(*)(VALUE, VALUE, VALUE), VALUE);
248
+
249
+ auto block = [](VALUE key, VALUE value, VALUE user_data) -> int
250
+ {
251
+ using Key_T = typename std::multimap<T, U>::key_type;
252
+ using Mapped_T = typename std::multimap<T, U>::mapped_type;
253
+ using Value_T = typename std::multimap<T, U>::value_type;
254
+
255
+ return cpp_protect([&]
256
+ {
257
+ Value_T pair = { From_Ruby<Key_T>().convert(key), From_Ruby<Mapped_T>().convert(value) };
258
+ std::multimap<T, U>* result = (std::multimap<T, U>*)user_data;
259
+ result->insert(pair);
260
+ return ST_CONTINUE;
261
+ });
262
+ };
263
+
264
+ std::multimap<T, U> result;
265
+ detail::protect<Function_T>(rb_hash_foreach, rubyHash, block, (VALUE)&result);
266
+ return result;
267
+ }
268
+
269
+ template<typename Key_T, typename T>
270
+ struct Type<std::multimap<Key_T, T>>
271
+ {
272
+ static bool verify()
273
+ {
274
+ Type<Key_T>::verify();
275
+ Type<Key_T>::verify();
276
+
277
+ if (!Data_Type<std::multimap<Key_T, T>>::is_defined())
278
+ {
279
+ define_multimap<Key_T, T>();
280
+ }
281
+
282
+ return true;
283
+ }
284
+ };
285
+
286
+ template<typename T, typename U>
287
+ class From_Ruby<std::multimap<T, U>>
288
+ {
289
+ public:
290
+ From_Ruby() = default;
291
+
292
+ explicit From_Ruby(Arg * arg) : arg_(arg)
293
+ {
294
+ }
295
+
296
+ Convertible is_convertible(VALUE value)
297
+ {
298
+ switch (rb_type(value))
299
+ {
300
+ case RUBY_T_DATA:
301
+ return Data_Type<std::multimap<T, U>>::is_descendant(value) ? Convertible::Exact : Convertible::None;
302
+ break;
303
+ case RUBY_T_HASH:
304
+ return Convertible::Cast;
305
+ break;
306
+ default:
307
+ return Convertible::None;
308
+ }
309
+ }
310
+
311
+ std::multimap<T, U> convert(VALUE value)
312
+ {
313
+ switch (rb_type(value))
314
+ {
315
+ case RUBY_T_DATA:
316
+ {
317
+ // This is a wrapped multimap (hopefully!)
318
+ return *detail::unwrap<std::multimap<T, U>>(value, Data_Type<std::multimap<T, U>>::ruby_data_type(), false);
319
+ }
320
+ case RUBY_T_HASH:
321
+ {
322
+ // If this an Ruby hash and the multimapped type is copyable
323
+ if constexpr (std::is_default_constructible_v<U>)
324
+ {
325
+ return toMultimap<T, U>(value);
326
+ }
327
+ }
328
+ default:
329
+ {
330
+ throw Exception(rb_eTypeError, "wrong argument type %s (expected % s)",
331
+ detail::protect(rb_obj_classname, value), "std::multimap");
332
+ }
333
+ }
334
+ }
335
+
336
+ private:
337
+ Arg* arg_ = nullptr;
338
+ };
339
+
340
+ template<typename T, typename U>
341
+ class From_Ruby<std::multimap<T, U>&>
342
+ {
343
+ public:
344
+ From_Ruby() = default;
345
+
346
+ explicit From_Ruby(Arg * arg) : arg_(arg)
347
+ {
348
+ }
349
+
350
+ Convertible is_convertible(VALUE value)
351
+ {
352
+ switch (rb_type(value))
353
+ {
354
+ case RUBY_T_DATA:
355
+ return Data_Type<std::multimap<T, U>>::is_descendant(value) ? Convertible::Exact : Convertible::None;
356
+ break;
357
+ case RUBY_T_HASH:
358
+ return Convertible::Cast;
359
+ break;
360
+ default:
361
+ return Convertible::None;
362
+ }
363
+ }
364
+
365
+ std::multimap<T, U>& convert(VALUE value)
366
+ {
367
+ switch (rb_type(value))
368
+ {
369
+ case RUBY_T_DATA:
370
+ {
371
+ // This is a wrapped multimap (hopefully!)
372
+ return *detail::unwrap<std::multimap<T, U>>(value, Data_Type<std::multimap<T, U>>::ruby_data_type(), false);
373
+ }
374
+ case RUBY_T_HASH:
375
+ {
376
+ // If this an Ruby array and the multimap type is copyable
377
+ if constexpr (std::is_default_constructible_v<std::multimap<T, U>>)
378
+ {
379
+ this->converted_ = toMultimap<T, U>(value);
380
+ return this->converted_;
381
+ }
382
+ }
383
+ default:
384
+ {
385
+ throw Exception(rb_eTypeError, "wrong argument type %s (expected % s)",
386
+ detail::protect(rb_obj_classname, value), "std::multimap");
387
+ }
388
+ }
389
+ }
390
+
391
+ private:
392
+ Arg* arg_ = nullptr;
393
+ std::multimap<T, U> converted_;
394
+ };
395
+
396
+ template<typename T, typename U>
397
+ class From_Ruby<std::multimap<T, U>*>
398
+ {
399
+ public:
400
+ Convertible is_convertible(VALUE value)
401
+ {
402
+ switch (rb_type(value))
403
+ {
404
+ case RUBY_T_DATA:
405
+ return Data_Type<std::multimap<T, U>>::is_descendant(value) ? Convertible::Exact : Convertible::None;
406
+ break;
407
+ case RUBY_T_NIL:
408
+ return Convertible::Exact;
409
+ break;
410
+ case RUBY_T_HASH:
411
+ return Convertible::Cast;
412
+ break;
413
+ default:
414
+ return Convertible::None;
415
+ }
416
+ }
417
+
418
+ std::multimap<T, U>* convert(VALUE value)
419
+ {
420
+ switch (rb_type(value))
421
+ {
422
+ case RUBY_T_DATA:
423
+ {
424
+ // This is a wrapped multimap (hopefully!)
425
+ return detail::unwrap<std::multimap<T, U>>(value, Data_Type<std::multimap<T, U>>::ruby_data_type(), false);
426
+ }
427
+ case RUBY_T_HASH:
428
+ {
429
+ // If this an Ruby array and the multimap type is copyable
430
+ if constexpr (std::is_default_constructible_v<U>)
431
+ {
432
+ this->converted_ = toMultimap<T, U>(value);
433
+ return &this->converted_;
434
+ }
435
+ }
436
+ default:
437
+ {
438
+ throw Exception(rb_eTypeError, "wrong argument type %s (expected % s)",
439
+ detail::protect(rb_obj_classname, value), "std::multimap");
440
+ }
441
+ }
442
+ }
443
+
444
+ private:
445
+ std::multimap<T, U> converted_;
446
+ };
447
+ }
448
+ }
@@ -0,0 +1,6 @@
1
+ #ifndef Rice__stl__optional__hpp_
2
+ #define Rice__stl__optional__hpp_
3
+
4
+ #include "optional.ipp"
5
+
6
+ #endif // Rice__stl__optional__hpp_
@@ -0,0 +1,118 @@
1
+ #include <optional>
2
+
3
+ namespace Rice::detail
4
+ {
5
+ template<typename T>
6
+ struct Type<std::optional<T>>
7
+ {
8
+ constexpr static bool verify()
9
+ {
10
+ return Type<intrinsic_type<T>>::verify();
11
+ }
12
+ };
13
+
14
+ template<>
15
+ class To_Ruby<std::nullopt_t>
16
+ {
17
+ public:
18
+ VALUE convert(const std::nullopt_t& _)
19
+ {
20
+ return Qnil;
21
+ }
22
+ };
23
+
24
+ template<typename T>
25
+ class To_Ruby<std::optional<T>>
26
+ {
27
+ public:
28
+ static VALUE convert(const std::optional<T>& data, bool takeOwnership = false)
29
+ {
30
+ if (data.has_value())
31
+ {
32
+ return To_Ruby<T>().convert(data.value());
33
+ }
34
+ else
35
+ {
36
+ return Qnil;
37
+ }
38
+ }
39
+ };
40
+
41
+ template<typename T>
42
+ class To_Ruby<std::optional<T>&>
43
+ {
44
+ public:
45
+ static VALUE convert(const std::optional<T>& data, bool takeOwnership = false)
46
+ {
47
+ if (data.has_value())
48
+ {
49
+ return To_Ruby<T>().convert(data.value());
50
+ }
51
+ else
52
+ {
53
+ return Qnil;
54
+ }
55
+ }
56
+ };
57
+
58
+ template<typename T>
59
+ class From_Ruby<std::optional<T>>
60
+ {
61
+ public:
62
+ Convertible is_convertible(VALUE value)
63
+ {
64
+ switch (rb_type(value))
65
+ {
66
+ case RUBY_T_NIL:
67
+ return Convertible::Exact;
68
+ break;
69
+ default:
70
+ return From_Ruby<T>().is_convertible(value);
71
+ }
72
+ }
73
+
74
+ std::optional<T> convert(VALUE value)
75
+ {
76
+ if (value == Qnil)
77
+ {
78
+ return std::nullopt;
79
+ }
80
+ else
81
+ {
82
+ return From_Ruby<T>().convert(value);
83
+ }
84
+ }
85
+ };
86
+
87
+ template<typename T>
88
+ class From_Ruby<std::optional<T>&>
89
+ {
90
+ public:
91
+ Convertible is_convertible(VALUE value)
92
+ {
93
+ switch (rb_type(value))
94
+ {
95
+ case RUBY_T_NIL:
96
+ return Convertible::Exact;
97
+ break;
98
+ default:
99
+ return From_Ruby<T>().is_convertible(value);
100
+ }
101
+ }
102
+
103
+ std::optional<T>& convert(VALUE value)
104
+ {
105
+ if (value == Qnil)
106
+ {
107
+ this->converted_ = std::nullopt;
108
+ }
109
+ else
110
+ {
111
+ this->converted_ = From_Ruby<T>().convert(value);
112
+ }
113
+ return this->converted_;
114
+ }
115
+ private:
116
+ std::optional<T> converted_;
117
+ };
118
+ }
data/rice/stl/pair.hpp ADDED
@@ -0,0 +1,13 @@
1
+ #ifndef Rice__stl__pair__hpp_
2
+ #define Rice__stl__pair__hpp_
3
+
4
+ namespace Rice
5
+ {
6
+ template<typename T1, typename T2>
7
+ Data_Type<std::pair<T1, T2>> define_pair(std::string klassName = "");
8
+ }
9
+
10
+ #include "pair.ipp"
11
+
12
+ #endif // Rice__stl__pair__hpp_
13
+