@@ -599,61 +599,111 @@ class Action
599
599
return bool (fn_);
600
600
}
601
601
602
- any operator ()(const SemanticValues& sv, any& dt) const {
602
+ any operator ()(SemanticValues& sv, any& dt) const {
603
603
return fn_ (sv, dt);
604
604
}
605
605
606
606
private:
607
607
template <typename R>
608
- struct TypeAdaptor {
609
- TypeAdaptor (std::function<R (const SemanticValues& sv)> fn)
608
+ struct TypeAdaptor_sv {
609
+ TypeAdaptor_sv (std::function<R (SemanticValues& sv)> fn)
610
610
: fn_(fn) {}
611
- any operator ()(const SemanticValues& sv, any& /* dt*/ ) {
611
+ any operator ()(SemanticValues& sv, any& /* dt*/ ) {
612
+ return call<R>(fn_, sv);
613
+ }
614
+ std::function<R (SemanticValues& sv)> fn_;
615
+ };
616
+
617
+ template <typename R>
618
+ struct TypeAdaptor_csv {
619
+ TypeAdaptor_csv (std::function<R (const SemanticValues& sv)> fn)
620
+ : fn_(fn) {}
621
+ any operator ()(SemanticValues& sv, any& /* dt*/ ) {
612
622
return call<R>(fn_, sv);
613
623
}
614
624
std::function<R (const SemanticValues& sv)> fn_;
615
625
};
616
626
617
627
template <typename R>
618
- struct TypeAdaptor_c {
619
- TypeAdaptor_c (std::function<R (const SemanticValues& sv, any& dt)> fn)
628
+ struct TypeAdaptor_sv_dt {
629
+ TypeAdaptor_sv_dt (std::function<R (SemanticValues& sv, any& dt)> fn)
620
630
: fn_(fn) {}
621
- any operator ()(const SemanticValues& sv, any& dt) {
631
+ any operator ()(SemanticValues& sv, any& dt) {
632
+ return call<R>(fn_, sv, dt);
633
+ }
634
+ std::function<R (SemanticValues& sv, any& dt)> fn_;
635
+ };
636
+
637
+ template <typename R>
638
+ struct TypeAdaptor_csv_dt {
639
+ TypeAdaptor_csv_dt (std::function<R (const SemanticValues& sv, any& dt)> fn)
640
+ : fn_(fn) {}
641
+ any operator ()(SemanticValues& sv, any& dt) {
622
642
return call<R>(fn_, sv, dt);
623
643
}
624
644
std::function<R (const SemanticValues& sv, any& dt)> fn_;
625
645
};
626
646
627
- typedef std::function<any (const SemanticValues& sv, any& dt)> Fty;
647
+ typedef std::function<any (SemanticValues& sv, any& dt)> Fty;
648
+
649
+ template <typename F, typename R>
650
+ Fty make_adaptor (F fn, R (F::* /* mf*/ )(SemanticValues& sv) const ) {
651
+ return TypeAdaptor_sv<R>(fn);
652
+ }
628
653
629
654
template <typename F, typename R>
630
655
Fty make_adaptor (F fn, R (F::* /* mf*/ )(const SemanticValues& sv) const ) {
631
- return TypeAdaptor<R>(fn);
656
+ return TypeAdaptor_csv<R>(fn);
657
+ }
658
+
659
+ template <typename F, typename R>
660
+ Fty make_adaptor (F fn, R (F::* /* mf*/ )(SemanticValues& sv)) {
661
+ return TypeAdaptor_sv<R>(fn);
632
662
}
633
663
634
664
template <typename F, typename R>
635
665
Fty make_adaptor (F fn, R (F::* /* mf*/ )(const SemanticValues& sv)) {
636
- return TypeAdaptor<R>(fn);
666
+ return TypeAdaptor_csv<R>(fn);
667
+ }
668
+
669
+ template <typename F, typename R>
670
+ Fty make_adaptor (F fn, R (* /* mf*/ )(SemanticValues& sv)) {
671
+ return TypeAdaptor_sv<R>(fn);
637
672
}
638
673
639
674
template <typename F, typename R>
640
675
Fty make_adaptor (F fn, R (* /* mf*/ )(const SemanticValues& sv)) {
641
- return TypeAdaptor<R>(fn);
676
+ return TypeAdaptor_csv<R>(fn);
677
+ }
678
+
679
+ template <typename F, typename R>
680
+ Fty make_adaptor (F fn, R (F::* /* mf*/ )(SemanticValues& sv, any& dt) const ) {
681
+ return TypeAdaptor_sv_dt<R>(fn);
642
682
}
643
683
644
684
template <typename F, typename R>
645
685
Fty make_adaptor (F fn, R (F::* /* mf*/ )(const SemanticValues& sv, any& dt) const ) {
646
- return TypeAdaptor_c<R>(fn);
686
+ return TypeAdaptor_csv_dt<R>(fn);
687
+ }
688
+
689
+ template <typename F, typename R>
690
+ Fty make_adaptor (F fn, R (F::* /* mf*/ )(SemanticValues& sv, any& dt)) {
691
+ return TypeAdaptor_sv_dt<R>(fn);
647
692
}
648
693
649
694
template <typename F, typename R>
650
695
Fty make_adaptor (F fn, R (F::* /* mf*/ )(const SemanticValues& sv, any& dt)) {
651
- return TypeAdaptor_c<R>(fn);
696
+ return TypeAdaptor_csv_dt<R>(fn);
697
+ }
698
+
699
+ template <typename F, typename R>
700
+ Fty make_adaptor (F fn, R(* /* mf*/ )(SemanticValues& sv, any& dt)) {
701
+ return TypeAdaptor_sv_dt<R>(fn);
652
702
}
653
703
654
704
template <typename F, typename R>
655
705
Fty make_adaptor (F fn, R(* /* mf*/ )(const SemanticValues& sv, any& dt)) {
656
- return TypeAdaptor_c <R>(fn);
706
+ return TypeAdaptor_csv_dt <R>(fn);
657
707
}
658
708
659
709
Fty fn_;
@@ -1387,7 +1437,7 @@ class Holder : public Ope
1387
1437
1388
1438
void accept (Visitor& v) override ;
1389
1439
1390
- any reduce (const SemanticValues& sv, any& dt) const ;
1440
+ any reduce (SemanticValues& sv, any& dt) const ;
1391
1441
1392
1442
std::shared_ptr<Ope> ope_;
1393
1443
Definition* outer_;
@@ -2177,13 +2227,13 @@ inline size_t Holder::parse(const char* s, size_t n, SemanticValues& sv, Context
2177
2227
return len;
2178
2228
}
2179
2229
2180
- inline any Holder::reduce (const SemanticValues& sv, any& dt) const {
2230
+ inline any Holder::reduce (SemanticValues& sv, any& dt) const {
2181
2231
if (outer_->action ) {
2182
2232
return outer_->action (sv, dt);
2183
2233
} else if (sv.empty ()) {
2184
2234
return any ();
2185
2235
} else {
2186
- return sv.front ();
2236
+ return std::move ( sv.front () );
2187
2237
}
2188
2238
}
2189
2239
0 commit comments