191
191
// in our -pure-cpp2 "import std;" simulation mode... if you need this,
192
192
// use mixed mode (not -pure-cpp2) and #include all the headers you need
193
193
// including this one
194
- //
194
+ //
195
195
// #include <execution>
196
196
#endif
197
197
@@ -466,7 +466,7 @@ template<typename T>
466
466
auto Typeid () -> decltype(auto ) {
467
467
#ifdef CPP2_NO_RTTI
468
468
Type.expects (
469
- !" 'any' dynamic casting is disabled with -fno-rtti" , // more likely to appear on console
469
+ !" 'any' dynamic casting is disabled with -fno-rtti" , // more likely to appear on console
470
470
" 'any' dynamic casting is disabled with -fno-rtti" // make message available to hooked handlers
471
471
);
472
472
#else
@@ -656,12 +656,19 @@ class out {
656
656
// -----------------------------------------------------------------------
657
657
//
658
658
#if defined(_MSC_VER) && !defined(__clang_major__)
659
- #define CPP2_FORCE_INLINE __forceinline
660
- #define CPP2_FORCE_INLINE_LAMBDA [[msvc::forceinline]]
659
+ #define CPP2_FORCE_INLINE __forceinline
660
+ #define CPP2_FORCE_INLINE_LAMBDA [[msvc::forceinline]]
661
+ #define CPP2_FORCE_INLINE_LAMBDA_CLANG /* empty */
661
662
#define CPP2_LAMBDA_NO_DISCARD
662
663
#else
663
- #define CPP2_FORCE_INLINE __attribute__ ((always_inline))
664
- #define CPP2_FORCE_INLINE_LAMBDA __attribute__ ((always_inline))
664
+ #define CPP2_FORCE_INLINE __attribute__ ((always_inline))
665
+ #if defined (__clang__)
666
+ #define CPP2_FORCE_INLINE_LAMBDA /* empty */
667
+ #define CPP2_FORCE_INLINE_LAMBDA_CLANG __attribute__ ((always_inline))
668
+ #else
669
+ #define CPP2_FORCE_INLINE_LAMBDA __attribute__ ((always_inline))
670
+ #define CPP2_FORCE_INLINE_LAMBDA_CLANG /* empty */
671
+ #endif
665
672
666
673
#if defined(__clang_major__)
667
674
// Also check __cplusplus, only to satisfy Clang -pedantic-errors
@@ -687,84 +694,26 @@ class out {
687
694
#endif
688
695
689
696
690
- // Note: [&] is because a nested UFCS might be viewed as trying to capture 'this'
691
-
692
- #define CPP2_UFCS (FUNCNAME,PARAM1,...) \
693
- [&] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
694
- if constexpr (requires{ CPP2_FORWARD (obj).FUNCNAME (CPP2_FORWARD (params)...); }) { \
695
- return CPP2_FORWARD (obj).FUNCNAME (CPP2_FORWARD (params)...); \
696
- } else { \
697
- return FUNCNAME (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
698
- } \
699
- }(PARAM1, __VA_ARGS__)
700
-
701
- #define CPP2_UFCS_0 (FUNCNAME,PARAM1 ) \
702
- [&] CPP2_LAMBDA_NO_DISCARD (auto && obj) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
703
- if constexpr (requires{ CPP2_FORWARD (obj).FUNCNAME (); }) { \
704
- return CPP2_FORWARD (obj).FUNCNAME (); \
705
- } else { \
706
- return FUNCNAME (CPP2_FORWARD (obj)); \
707
- } \
708
- }(PARAM1)
709
-
710
- #define CPP2_UFCS_REMPARENS (...) __VA_ARGS__
711
-
712
- #define CPP2_UFCS_TEMPLATE (FUNCNAME,TEMPARGS,PARAM1,...) \
713
- [&] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
714
- if constexpr (requires{ CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (params)...); }) { \
715
- return CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (params)...); \
697
+ #define CPP2_UFCS_ (LAMBDADEFCAPT,TEMPKW,...) \
698
+ [LAMBDADEFCAPT] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA_CLANG \
699
+ noexcept (requires { requires requires { CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); }; \
700
+ requires noexcept (CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...)); } \
701
+ || requires { requires !requires { CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); }; \
702
+ requires noexcept (__VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...)); }) \
703
+ CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) \
704
+ requires requires { CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); } \
705
+ || requires { __VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); } { \
706
+ if constexpr (requires{ CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); }) { \
707
+ return CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); \
716
708
} else { \
717
- return FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
709
+ return __VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
718
710
} \
719
- }(PARAM1, __VA_ARGS__)
720
-
721
- #define CPP2_UFCS_TEMPLATE_0 (FUNCNAME,TEMPARGS,PARAM1 ) \
722
- [&] CPP2_LAMBDA_NO_DISCARD (auto && obj) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
723
- if constexpr (requires{ CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (); }) { \
724
- return CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (); \
725
- } else { \
726
- return FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (obj)); \
727
- } \
728
- }(PARAM1)
729
-
730
-
731
- // But for non-local lambdas [&] is not allowed
732
-
733
- #define CPP2_UFCS_NONLOCAL (FUNCNAME,PARAM1,...) \
734
- [] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
735
- if constexpr (requires{ CPP2_FORWARD (obj).FUNCNAME (CPP2_FORWARD (params)...); }) { \
736
- return CPP2_FORWARD (obj).FUNCNAME (CPP2_FORWARD (params)...); \
737
- } else { \
738
- return FUNCNAME (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
739
- } \
740
- }(PARAM1, __VA_ARGS__)
741
-
742
- #define CPP2_UFCS_0_NONLOCAL (FUNCNAME,PARAM1 ) \
743
- [] CPP2_LAMBDA_NO_DISCARD (auto && obj) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
744
- if constexpr (requires{ CPP2_FORWARD (obj).FUNCNAME (); }) { \
745
- return CPP2_FORWARD (obj).FUNCNAME (); \
746
- } else { \
747
- return FUNCNAME (CPP2_FORWARD (obj)); \
748
- } \
749
- }(PARAM1)
750
-
751
- #define CPP2_UFCS_TEMPLATE_NONLOCAL (FUNCNAME,TEMPARGS,PARAM1,...) \
752
- [] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
753
- if constexpr (requires{ CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (params)...); }) { \
754
- return CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (params)...); \
755
- } else { \
756
- return FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
757
- } \
758
- }(PARAM1, __VA_ARGS__)
711
+ }
759
712
760
- #define CPP2_UFCS_TEMPLATE_0_NONLOCAL (FUNCNAME,TEMPARGS,PARAM1 ) \
761
- [] CPP2_LAMBDA_NO_DISCARD (auto && obj) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
762
- if constexpr (requires{ CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (); }) { \
763
- return CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (); \
764
- } else { \
765
- return FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (obj)); \
766
- } \
767
- }(PARAM1)
713
+ #define CPP2_UFCS (...) CPP2_UFCS_(&,,__VA_ARGS__)
714
+ #define CPP2_UFCS_TEMPLATE (...) CPP2_UFCS_(&,template ,__VA_ARGS__)
715
+ #define CPP2_UFCS_NONLOCAL (...) CPP2_UFCS_(,,__VA_ARGS__)
716
+ #define CPP2_UFCS_TEMPLATE_NONLOCAL (...) CPP2_UFCS_(,template ,__VA_ARGS__)
768
717
769
718
770
719
// -----------------------------------------------------------------------
@@ -833,17 +782,17 @@ auto is( X const& ) -> bool {
833
782
834
783
template < typename C, typename X >
835
784
requires (
836
- ( std::is_base_of_v<X, C> ||
837
- ( std::is_polymorphic_v<C> && std::is_polymorphic_v<X>)
785
+ ( std::is_base_of_v<X, C> ||
786
+ ( std::is_polymorphic_v<C> && std::is_polymorphic_v<X>)
838
787
) && !std::is_same_v<C,X>)
839
788
auto is ( X const & x ) -> bool {
840
789
return Dynamic_cast<C const *>(&x) != nullptr ;
841
790
}
842
791
843
792
template < typename C, typename X >
844
793
requires (
845
- ( std::is_base_of_v<X, C> ||
846
- ( std::is_polymorphic_v<C> && std::is_polymorphic_v<X>)
794
+ ( std::is_base_of_v<X, C> ||
795
+ ( std::is_polymorphic_v<C> && std::is_polymorphic_v<X>)
847
796
) && !std::is_same_v<C,X>)
848
797
auto is ( X const * x ) -> bool {
849
798
return Dynamic_cast<C const *>(x) != nullptr ;
@@ -1431,7 +1380,7 @@ inline auto to_string(std::string const& s) -> std::string const&
1431
1380
1432
1381
template <typename T>
1433
1382
inline auto to_string (T const & sv) -> std::string
1434
- requires (std::is_convertible_v<T, std::string_view>
1383
+ requires (std::is_convertible_v<T, std::string_view>
1435
1384
&& !std::is_convertible_v<T, const char *>)
1436
1385
{
1437
1386
return std::string{sv};
0 commit comments