@@ -84,14 +84,57 @@ using stltypes = remove_duplicates<combine_parameterlists<combine_parameterlists
84
84
jl_value_t *
85
85
>, fundamental_int_types>, fixed_int_types>>;
86
86
87
+
88
+ template <typename T>
89
+ struct ReferenceTypes
90
+ {
91
+ using const_reference = typename T::const_reference;
92
+ using reference = typename T::reference;
93
+ };
94
+
95
+ template <template <typename ...> class ContainerT , typename ... TupleArgs, typename ... Args>
96
+ struct ReferenceTypes <ContainerT<std::tuple<TupleArgs...>, Args...>>
97
+ {
98
+ using const_reference = std::tuple<TupleArgs...>;
99
+ using reference = const_reference;
100
+ };
101
+
102
+ template <template <typename ...> class ContainerT , typename ... Args>
103
+ struct ReferenceTypes <ContainerT<bool , Args...>>
104
+ {
105
+ using const_reference = bool ;
106
+ using reference = bool ;
107
+ };
108
+
109
+ template <typename T>
110
+ struct ReferenceTypes <std::valarray<T>>
111
+ {
112
+ using const_reference = const T&;
113
+ using reference = T&;
114
+ };
115
+
116
+ template <>
117
+ struct ReferenceTypes <std::valarray<bool >>
118
+ {
119
+ using const_reference = bool ;
120
+ using reference = bool ;
121
+ };
122
+
123
+ template <typename T>
124
+ using const_reftype = typename ReferenceTypes<T>::const_reference;
125
+
126
+ template <typename T>
127
+ using reftype = typename ReferenceTypes<T>::reference;
128
+
129
+
87
130
template <typename TypeWrapperT>
88
131
void wrap_range_based_fill ([[maybe_unused]] TypeWrapperT& wrapped)
89
132
{
90
133
#ifdef JLCXX_HAS_RANGES
91
134
using WrappedT = typename TypeWrapperT::type;
92
135
using T = typename WrappedT::value_type;
93
136
wrapped.module ().set_override_module (stl_module ());
94
- wrapped.method (" StdFill" , [] (WrappedT& v, const T& val) { std::ranges::fill (v, val); });
137
+ wrapped.method (" StdFill" , [] (WrappedT& v, const_reftype<WrappedT> val) { std::ranges::fill (v, val); });
95
138
wrapped.module ().unset_override_module ();
96
139
#endif
97
140
}
@@ -112,7 +155,7 @@ void wrap_range_based_bsearch([[maybe_unused]] TypeWrapperT& wrapped)
112
155
if constexpr (has_less<T>)
113
156
{
114
157
wrapped.module ().set_override_module (stl_module ());
115
- wrapped.method (" StdBinarySearch" , [] (WrappedT& v, const T& val) { return std::ranges::binary_search (v, val); });
158
+ wrapped.method (" StdBinarySearch" , [] (WrappedT& v, const_reftype<WrappedT> val) { return std::ranges::binary_search (v, val); });
116
159
wrapped.module ().unset_override_module ();
117
160
}
118
161
#endif
@@ -247,27 +290,10 @@ struct WrapVectorImpl
247
290
248
291
wrap_range_based_bsearch (wrapped);
249
292
wrapped.module ().set_override_module (stl_module ());
250
- wrapped.method (" push_back" , static_cast <void (WrappedT::*)(const T&)>(&WrappedT::push_back));
251
- wrapped.method (" cxxgetindex" , [] (const WrappedT& v, cxxint_t i) -> typename WrappedT::const_reference { return v[i-1 ]; });
252
- wrapped.method (" cxxgetindex" , [] (WrappedT& v, cxxint_t i) -> typename WrappedT::reference { return v[i-1 ]; });
253
- wrapped.method (" cxxsetindex!" , [] (WrappedT& v, const T& val, cxxint_t i) { v[i-1 ] = val; });
254
- wrapped.module ().unset_override_module ();
255
- }
256
- };
257
-
258
- template <>
259
- struct WrapVectorImpl <bool >
260
- {
261
- template <typename TypeWrapperT>
262
- static void wrap (TypeWrapperT&& wrapped)
263
- {
264
- using WrappedT = std::vector<bool >;
265
-
266
- wrap_range_based_bsearch (wrapped);
267
- wrapped.module ().set_override_module (stl_module ());
268
- wrapped.method (" push_back" , [] (WrappedT& v, const bool val) { v.push_back (val); });
269
- wrapped.method (" cxxgetindex" , [] (const WrappedT& v, cxxint_t i) { return bool (v[i-1 ]); });
270
- wrapped.method (" cxxsetindex!" , [] (WrappedT& v, const bool val, cxxint_t i) { v[i-1 ] = val; });
293
+ wrapped.method (" push_back" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.push_back (val); });
294
+ wrapped.method (" cxxgetindex" , [] (const WrappedT& v, cxxint_t i) -> const_reftype<WrappedT> { return v[i-1 ]; });
295
+ wrapped.method (" cxxgetindex" , [] (WrappedT& v, cxxint_t i) -> reftype<WrappedT> { return v[i-1 ]; });
296
+ wrapped.method (" cxxsetindex!" , [] (WrappedT& v, const_reftype<WrappedT> val, cxxint_t i) { v[i-1 ] = val; });
271
297
wrapped.module ().unset_override_module ();
272
298
}
273
299
};
@@ -318,9 +344,9 @@ struct WrapSTLContainer<std::valarray> : STLTypeWrapperBase<WrapSTLContainer<std
318
344
wrapped.module ().set_override_module (stl_module ());
319
345
wrapped.method (" cppsize" , &WrappedT::size);
320
346
wrapped.method (" resize" , [] (WrappedT& v, const cxxint_t s) { v.resize (s); });
321
- wrapped.method (" cxxgetindex" , [] (const WrappedT& v, cxxint_t i) { return v[i-1 ]; });
322
- wrapped.method (" cxxgetindex" , [] (WrappedT& v, cxxint_t i) { return v[i-1 ]; });
323
- wrapped.method (" cxxsetindex!" , [] (WrappedT& v, const T& val, cxxint_t i) { v[i-1 ] = val; });
347
+ wrapped.method (" cxxgetindex" , [] (const WrappedT& v, cxxint_t i) -> const_reftype<WrappedT> { return v[i-1 ]; });
348
+ wrapped.method (" cxxgetindex" , [] (WrappedT& v, cxxint_t i) -> reftype<WrappedT> { return v[i-1 ]; });
349
+ wrapped.method (" cxxsetindex!" , [] (WrappedT& v, const_reftype<WrappedT> val, cxxint_t i) { v[i-1 ] = val; });
324
350
wrapped.module ().unset_override_module ();
325
351
}
326
352
};
@@ -342,10 +368,10 @@ struct WrapSTLContainer<std::deque> : STLTypeWrapperBase<WrapSTLContainer<std::d
342
368
wrapped.module ().set_override_module (stl_module ());
343
369
wrapped.method (" cppsize" , &WrappedT::size);
344
370
wrapped.method (" resize" , [](WrappedT &v, const cxxint_t s) { v.resize (s); });
345
- wrapped.method (" cxxgetindex" , [](const WrappedT& v, cxxint_t i) { return v[i - 1 ]; });
346
- wrapped.method (" cxxsetindex!" , [](WrappedT& v, const T& val, cxxint_t i) { v[i - 1 ] = val; });
347
- wrapped.method (" push_back!" , [] (WrappedT& v, const T& val) { v.push_back (val); });
348
- wrapped.method (" push_front!" , [] (WrappedT& v, const T& val) { v.push_front (val); });
371
+ wrapped.method (" cxxgetindex" , [](const WrappedT& v, cxxint_t i) -> const_reftype<WrappedT> { return v[i - 1 ]; });
372
+ wrapped.method (" cxxsetindex!" , [](WrappedT& v, const_reftype<WrappedT> val, cxxint_t i) { v[i - 1 ] = val; });
373
+ wrapped.method (" push_back!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.push_back (val); });
374
+ wrapped.method (" push_front!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.push_front (val); });
349
375
wrapped.method (" pop_back!" , [] (WrappedT& v) { v.pop_back (); });
350
376
wrapped.method (" pop_front!" , [] (WrappedT& v) { v.pop_front (); });
351
377
wrapped.method (" iteratorbegin" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.begin ()}; });
@@ -365,25 +391,7 @@ struct WrapQueueImpl
365
391
wrapped.module ().set_override_module (stl_module ());
366
392
wrapped.method (" cppsize" , &WrappedT::size);
367
393
wrapped.method (" q_empty" , [] (WrappedT& v) { return v.empty (); });
368
- wrapped.method (" push_back!" , [] (WrappedT& v, const T& val) { v.push (val); });
369
- wrapped.method (" front" , [] (WrappedT& v) { return v.front (); });
370
- wrapped.method (" pop_front!" , [] (WrappedT& v) { v.pop (); });
371
- wrapped.module ().unset_override_module ();
372
- }
373
- };
374
-
375
- template <>
376
- struct WrapQueueImpl <bool >
377
- {
378
- template <typename TypeWrapperT>
379
- static void wrap (TypeWrapperT&& wrapped)
380
- {
381
- using WrappedT = std::queue<bool >;
382
-
383
- wrapped.module ().set_override_module (stl_module ());
384
- wrapped.method (" cppsize" , &WrappedT::size);
385
- wrapped.method (" q_empty" , [] (WrappedT& v) { return v.empty (); });
386
- wrapped.method (" push_back!" , [] (WrappedT& v, const bool val) { v.push (val); });
394
+ wrapped.method (" push_back!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.push (val); });
387
395
wrapped.method (" front" , [] (WrappedT& v) { return v.front (); });
388
396
wrapped.method (" pop_front!" , [] (WrappedT& v) { v.pop (); });
389
397
wrapped.module ().unset_override_module ();
@@ -420,7 +428,7 @@ struct WrapSTLContainer<std::priority_queue> : STLTypeWrapperBase<WrapSTLContain
420
428
wrapped.template constructor <>();
421
429
wrapped.module ().set_override_module (stl_module ());
422
430
wrapped.method (" cppsize" , &WrappedT::size);
423
- wrapped.method (" pq_push!" , [] (WrappedT& v, const T& val) { v.push (val); });
431
+ wrapped.method (" pq_push!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.push (val); });
424
432
wrapped.method (" pq_pop!" , [] (WrappedT& v) { v.pop (); });
425
433
if constexpr (std::is_same<T,bool >::value)
426
434
{
@@ -451,7 +459,7 @@ struct WrapSTLContainer<std::stack> : STLTypeWrapperBase<WrapSTLContainer<std::s
451
459
wrapped.module ().set_override_module (stl_module ());
452
460
wrapped.method (" cppsize" , &WrappedT::size);
453
461
wrapped.method (" stack_isempty" , [] (WrappedT& v) { return v.empty (); });
454
- wrapped.method (" stack_push!" , [] (WrappedT& v, const T& val) { v.push (val); });
462
+ wrapped.method (" stack_push!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.push (val); });
455
463
wrapped.method (" stack_top" , [] (WrappedT& v) { return v.top (); });
456
464
wrapped.method (" stack_pop!" , [] (WrappedT& v) { v.pop (); });
457
465
wrapped.module ().unset_override_module ();
@@ -474,18 +482,18 @@ struct WrapSTLContainer<std::set> : STLTypeWrapperBase<WrapSTLContainer<std::set
474
482
wrapped.template constructor <>();
475
483
wrapped.module ().set_override_module (stl_module ());
476
484
wrapped.method (" cppsize" , &WrappedT::size);
477
- wrapped.method (" set_insert!" , [] (WrappedT& v, const T& val) { v.insert (val); });
485
+ wrapped.method (" set_insert!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.insert (val); });
478
486
wrapped.method (" set_empty!" , [] (WrappedT& v) { v.clear (); });
479
487
wrapped.method (" set_isempty" , [] (WrappedT& v) { return v.empty (); });
480
- wrapped.method (" set_delete!" , [] (WrappedT&v, const T& val) { v.erase (val); });
481
- wrapped.method (" set_in" , [] (WrappedT& v, const T& val) { return v.count (val) != 0 ; });
488
+ wrapped.method (" set_delete!" , [] (WrappedT&v, const_reftype<WrappedT> val) { v.erase (val); });
489
+ wrapped.method (" set_in" , [] (WrappedT& v, const_reftype<WrappedT> val) { return v.count (val) != 0 ; });
482
490
wrapped.method (" iteratorbegin" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.begin ()}; });
483
491
wrapped.method (" iteratorend" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.end ()}; });
484
492
#ifdef JLCXX_HAS_RANGES
485
493
if constexpr (has_less<T>)
486
494
{
487
- wrapped.method (" StdUpperBound" , [] (WrappedT& v, const T& val) { return iterator_wrapper_type<WrappedT>{std::ranges::upper_bound (v, val)}; });
488
- wrapped.method (" StdLowerBound" , [] (WrappedT& v, const T& val) { return iterator_wrapper_type<WrappedT>{std::ranges::lower_bound (v, val)}; });
495
+ wrapped.method (" StdUpperBound" , [] (WrappedT& v, const_reftype<WrappedT> val) { return iterator_wrapper_type<WrappedT>{std::ranges::upper_bound (v, val)}; });
496
+ wrapped.method (" StdLowerBound" , [] (WrappedT& v, const_reftype<WrappedT> val) { return iterator_wrapper_type<WrappedT>{std::ranges::lower_bound (v, val)}; });
489
497
}
490
498
#endif
491
499
wrapped.module ().unset_override_module ();
@@ -507,11 +515,11 @@ struct WrapSTLContainer<std::unordered_set> : STLTypeWrapperBase<WrapSTLContaine
507
515
wrapped.template constructor <>();
508
516
wrapped.module ().set_override_module (stl_module ());
509
517
wrapped.method (" cppsize" , &WrappedT::size);
510
- wrapped.method (" set_insert!" , [] (WrappedT& v, const T& val) { v.insert (val); });
518
+ wrapped.method (" set_insert!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.insert (val); });
511
519
wrapped.method (" set_empty!" , [] (WrappedT& v) { v.clear (); });
512
520
wrapped.method (" set_isempty" , [] (WrappedT& v) { return v.empty (); });
513
- wrapped.method (" set_delete!" , [] (WrappedT&v, const T& val) { v.erase (val); });
514
- wrapped.method (" set_in" , [] (WrappedT& v, const T& val) { return v.count (val) != 0 ; });
521
+ wrapped.method (" set_delete!" , [] (WrappedT&v, const_reftype<WrappedT> val) { v.erase (val); });
522
+ wrapped.method (" set_in" , [] (WrappedT& v, const_reftype<WrappedT> val) { return v.count (val) != 0 ; });
515
523
wrapped.method (" iteratorbegin" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.begin ()}; });
516
524
wrapped.method (" iteratorend" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.end ()}; });
517
525
wrapped.module ().unset_override_module ();
@@ -534,19 +542,19 @@ struct WrapSTLContainer<std::multiset> : STLTypeWrapperBase<WrapSTLContainer<std
534
542
wrapped.template constructor <>();
535
543
wrapped.module ().set_override_module (stl_module ());
536
544
wrapped.method (" cppsize" , &WrappedT::size);
537
- wrapped.method (" multiset_insert!" , [] (WrappedT& v, const T& val) { v.insert (val); });
545
+ wrapped.method (" multiset_insert!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.insert (val); });
538
546
wrapped.method (" multiset_empty!" , [] (WrappedT& v) { v.clear (); });
539
547
wrapped.method (" multiset_isempty" , [] (WrappedT& v) { return v.empty (); });
540
- wrapped.method (" multiset_delete!" , [] (WrappedT&v, const T& val) { v.erase (val); });
541
- wrapped.method (" multiset_in" , [] (WrappedT& v, const T& val) { return v.count (val) != 0 ; });
542
- wrapped.method (" multiset_count" , [] (WrappedT& v, const T& val) { return v.count (val); });
548
+ wrapped.method (" multiset_delete!" , [] (WrappedT&v, const_reftype<WrappedT> val) { v.erase (val); });
549
+ wrapped.method (" multiset_in" , [] (WrappedT& v, const_reftype<WrappedT> val) { return v.count (val) != 0 ; });
550
+ wrapped.method (" multiset_count" , [] (WrappedT& v, const_reftype<WrappedT> val) { return v.count (val); });
543
551
wrapped.method (" iteratorbegin" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.begin ()}; });
544
552
wrapped.method (" iteratorend" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.end ()}; });
545
553
#ifdef JLCXX_HAS_RANGES
546
554
if constexpr (has_less<T>)
547
555
{
548
- wrapped.method (" StdUpperBound" , [] (WrappedT& v, const T& val) { return iterator_wrapper_type<WrappedT>{std::ranges::upper_bound (v, val)}; });
549
- wrapped.method (" StdLowerBound" , [] (WrappedT& v, const T& val) { return iterator_wrapper_type<WrappedT>{std::ranges::lower_bound (v, val)}; });
556
+ wrapped.method (" StdUpperBound" , [] (WrappedT& v, const_reftype<WrappedT> val) { return iterator_wrapper_type<WrappedT>{std::ranges::upper_bound (v, val)}; });
557
+ wrapped.method (" StdLowerBound" , [] (WrappedT& v, const_reftype<WrappedT> val) { return iterator_wrapper_type<WrappedT>{std::ranges::lower_bound (v, val)}; });
550
558
}
551
559
#endif
552
560
wrapped.module ().unset_override_module ();
@@ -568,12 +576,12 @@ struct WrapSTLContainer<std::unordered_multiset> : STLTypeWrapperBase<WrapSTLCon
568
576
wrapped.template constructor <>();
569
577
wrapped.module ().set_override_module (stl_module ());
570
578
wrapped.method (" cppsize" , &WrappedT::size);
571
- wrapped.method (" multiset_insert!" , [] (WrappedT& v, const T& val) { v.insert (val); });
579
+ wrapped.method (" multiset_insert!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.insert (val); });
572
580
wrapped.method (" multiset_empty!" , [] (WrappedT& v) { v.clear (); });
573
581
wrapped.method (" multiset_isempty" , [] (WrappedT& v) { return v.empty (); });
574
- wrapped.method (" multiset_delete!" , [] (WrappedT&v, const T& val) { v.erase (val); });
575
- wrapped.method (" multiset_in" , [] (WrappedT& v, const T& val) { return v.count (val) != 0 ; });
576
- wrapped.method (" multiset_count" , [] (WrappedT& v, const T& val) { return v.count (val); });
582
+ wrapped.method (" multiset_delete!" , [] (WrappedT&v, const_reftype<WrappedT> val) { v.erase (val); });
583
+ wrapped.method (" multiset_in" , [] (WrappedT& v, const_reftype<WrappedT> val) { return v.count (val) != 0 ; });
584
+ wrapped.method (" multiset_count" , [] (WrappedT& v, const_reftype<WrappedT> val) { return v.count (val); });
577
585
wrapped.method (" iteratorbegin" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.begin ()}; });
578
586
wrapped.method (" iteratorend" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.end ()}; });
579
587
wrapped.module ().unset_override_module ();
@@ -601,17 +609,17 @@ struct WrapSTLContainer<std::list> : STLTypeWrapperBase<WrapSTLContainer<std::li
601
609
wrapped.method (" list_isempty" , [] (WrappedT& v) { return v.empty (); });
602
610
wrapped.method (" list_front" , [] (WrappedT& v) { return v.front (); });
603
611
wrapped.method (" list_back" , [] (WrappedT& v) { return v.back (); });
604
- wrapped.method (" list_push_back!" , [] (WrappedT& v, const T& val) { v.push_back (val); });
605
- wrapped.method (" list_push_front!" , [] (WrappedT& v, const T& val) { v.push_front (val); });
612
+ wrapped.method (" list_push_back!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.push_back (val); });
613
+ wrapped.method (" list_push_front!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.push_front (val); });
606
614
wrapped.method (" list_pop_back!" , [] (WrappedT& v) { v.pop_back (); });
607
615
wrapped.method (" list_pop_front!" , [] (WrappedT& v) { v.pop_front (); });
608
616
wrapped.method (" iteratorbegin" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.begin ()}; });
609
617
wrapped.method (" iteratorend" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.end ()}; });
610
618
#ifdef JLCXX_HAS_RANGES
611
619
if constexpr (has_less<T>)
612
620
{
613
- wrapped.method (" StdUpperBound" , [] (WrappedT& v, const T& val) { return iterator_wrapper_type<WrappedT>{std::ranges::upper_bound (v, val)}; });
614
- wrapped.method (" StdLowerBound" , [] (WrappedT& v, const T& val) { return iterator_wrapper_type<WrappedT>{std::ranges::lower_bound (v, val)}; });
621
+ wrapped.method (" StdUpperBound" , [] (WrappedT& v, const_reftype<WrappedT> val) { return iterator_wrapper_type<WrappedT>{std::ranges::upper_bound (v, val)}; });
622
+ wrapped.method (" StdLowerBound" , [] (WrappedT& v, const_reftype<WrappedT> val) { return iterator_wrapper_type<WrappedT>{std::ranges::lower_bound (v, val)}; });
615
623
wrapped.method (" StdListSort" , [] (WrappedT& v) { v.sort (); });
616
624
}
617
625
#endif
@@ -637,7 +645,7 @@ struct WrapSTLContainer<std::forward_list> : STLTypeWrapperBase<WrapSTLContainer
637
645
wrapped.method (" flist_empty!" , [] (WrappedT& v) { v.clear (); });
638
646
wrapped.method (" flist_isempty" , [] (WrappedT& v) { return v.empty (); });
639
647
wrapped.method (" flist_front" , [] (WrappedT& v) { return v.front (); });
640
- wrapped.method (" flist_push_front!" , [] (WrappedT& v, const T& val) { v.push_front (val); });
648
+ wrapped.method (" flist_push_front!" , [] (WrappedT& v, const_reftype<WrappedT> val) { v.push_front (val); });
641
649
wrapped.method (" flist_pop_front!" , [] (WrappedT& v) { v.pop_front (); });
642
650
wrapped.method (" iteratorbegin" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.begin ()}; });
643
651
wrapped.method (" iteratorend" , [] (WrappedT& v) { return iterator_wrapper_type<WrappedT>{v.end ()}; });
0 commit comments