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
@@ -465,7 +465,7 @@ template<typename T>
465
465
auto Typeid () -> decltype(auto ) {
466
466
#ifdef CPP2_NO_RTTI
467
467
Type.expects (
468
- !" 'any' dynamic casting is disabled with -fno-rtti" , // more likely to appear on console
468
+ !" 'any' dynamic casting is disabled with -fno-rtti" , // more likely to appear on console
469
469
" 'any' dynamic casting is disabled with -fno-rtti" // make message available to hooked handlers
470
470
);
471
471
#else
@@ -655,12 +655,19 @@ class out {
655
655
// -----------------------------------------------------------------------
656
656
//
657
657
#if defined(_MSC_VER) && !defined(__clang_major__)
658
- #define CPP2_FORCE_INLINE __forceinline
659
- #define CPP2_FORCE_INLINE_LAMBDA [[msvc::forceinline]]
658
+ #define CPP2_FORCE_INLINE __forceinline
659
+ #define CPP2_FORCE_INLINE_LAMBDA [[msvc::forceinline]]
660
+ #define CPP2_FORCE_INLINE_LAMBDA_CLANG /* empty */
660
661
#define CPP2_LAMBDA_NO_DISCARD
661
662
#else
662
- #define CPP2_FORCE_INLINE __attribute__ ((always_inline))
663
- #define CPP2_FORCE_INLINE_LAMBDA __attribute__ ((always_inline))
663
+ #define CPP2_FORCE_INLINE __attribute__ ((always_inline))
664
+ #if defined (__clang__)
665
+ #define CPP2_FORCE_INLINE_LAMBDA /* empty */
666
+ #define CPP2_FORCE_INLINE_LAMBDA_CLANG __attribute__ ((always_inline))
667
+ #else
668
+ #define CPP2_FORCE_INLINE_LAMBDA __attribute__ ((always_inline))
669
+ #define CPP2_FORCE_INLINE_LAMBDA_CLANG /* empty */
670
+ #endif
664
671
665
672
#if defined(__clang_major__)
666
673
// Also check __cplusplus, only to satisfy Clang -pedantic-errors
@@ -681,84 +688,26 @@ class out {
681
688
#endif
682
689
683
690
684
- // Note: [&] is because a nested UFCS might be viewed as trying to capture 'this'
685
-
686
- #define CPP2_UFCS (FUNCNAME,PARAM1,...) \
687
- [&] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
688
- if constexpr (requires{ CPP2_FORWARD (obj).FUNCNAME (CPP2_FORWARD (params)...); }) { \
689
- return CPP2_FORWARD (obj).FUNCNAME (CPP2_FORWARD (params)...); \
690
- } else { \
691
- return FUNCNAME (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
692
- } \
693
- }(PARAM1, __VA_ARGS__)
694
-
695
- #define CPP2_UFCS_0 (FUNCNAME,PARAM1 ) \
696
- [&] CPP2_LAMBDA_NO_DISCARD (auto && obj) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
697
- if constexpr (requires{ CPP2_FORWARD (obj).FUNCNAME (); }) { \
698
- return CPP2_FORWARD (obj).FUNCNAME (); \
699
- } else { \
700
- return FUNCNAME (CPP2_FORWARD (obj)); \
701
- } \
702
- }(PARAM1)
703
-
704
- #define CPP2_UFCS_REMPARENS (...) __VA_ARGS__
705
-
706
- #define CPP2_UFCS_TEMPLATE (FUNCNAME,TEMPARGS,PARAM1,...) \
707
- [&] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
708
- if constexpr (requires{ CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (params)...); }) { \
709
- return CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (params)...); \
691
+ #define CPP2_UFCS_ (LAMBDADEFCAPT,TEMPKW,...) \
692
+ [LAMBDADEFCAPT] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA_CLANG \
693
+ noexcept (requires { requires requires { CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); }; \
694
+ requires noexcept (CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...)); } \
695
+ || requires { requires !requires { CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); }; \
696
+ requires noexcept (__VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...)); }) \
697
+ CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) \
698
+ requires requires { CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); } \
699
+ || requires { __VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); } { \
700
+ if constexpr (requires{ CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); }) { \
701
+ return CPP2_FORWARD (obj).TEMPKW __VA_ARGS__ (CPP2_FORWARD (params)...); \
710
702
} else { \
711
- return FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
703
+ return __VA_ARGS__ (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
712
704
} \
713
- }(PARAM1, __VA_ARGS__)
714
-
715
- #define CPP2_UFCS_TEMPLATE_0 (FUNCNAME,TEMPARGS,PARAM1 ) \
716
- [&] CPP2_LAMBDA_NO_DISCARD (auto && obj) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
717
- if constexpr (requires{ CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (); }) { \
718
- return CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (); \
719
- } else { \
720
- return FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (obj)); \
721
- } \
722
- }(PARAM1)
723
-
724
-
725
- // But for non-local lambdas [&] is not allowed
726
-
727
- #define CPP2_UFCS_NONLOCAL (FUNCNAME,PARAM1,...) \
728
- [] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
729
- if constexpr (requires{ CPP2_FORWARD (obj).FUNCNAME (CPP2_FORWARD (params)...); }) { \
730
- return CPP2_FORWARD (obj).FUNCNAME (CPP2_FORWARD (params)...); \
731
- } else { \
732
- return FUNCNAME (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
733
- } \
734
- }(PARAM1, __VA_ARGS__)
735
-
736
- #define CPP2_UFCS_0_NONLOCAL (FUNCNAME,PARAM1 ) \
737
- [] CPP2_LAMBDA_NO_DISCARD (auto && obj) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
738
- if constexpr (requires{ CPP2_FORWARD (obj).FUNCNAME (); }) { \
739
- return CPP2_FORWARD (obj).FUNCNAME (); \
740
- } else { \
741
- return FUNCNAME (CPP2_FORWARD (obj)); \
742
- } \
743
- }(PARAM1)
744
-
745
- #define CPP2_UFCS_TEMPLATE_NONLOCAL (FUNCNAME,TEMPARGS,PARAM1,...) \
746
- [] CPP2_LAMBDA_NO_DISCARD (auto && obj, auto && ...params) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
747
- if constexpr (requires{ CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (params)...); }) { \
748
- return CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (params)...); \
749
- } else { \
750
- return FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (obj), CPP2_FORWARD (params)...); \
751
- } \
752
- }(PARAM1, __VA_ARGS__)
705
+ }
753
706
754
- #define CPP2_UFCS_TEMPLATE_0_NONLOCAL (FUNCNAME,TEMPARGS,PARAM1 ) \
755
- [] CPP2_LAMBDA_NO_DISCARD (auto && obj) CPP2_FORCE_INLINE_LAMBDA -> decltype (auto ) { \
756
- if constexpr (requires{ CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (); }) { \
757
- return CPP2_FORWARD (obj).template FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (); \
758
- } else { \
759
- return FUNCNAME CPP2_UFCS_REMPARENS TEMPARGS (CPP2_FORWARD (obj)); \
760
- } \
761
- }(PARAM1)
707
+ #define CPP2_UFCS (...) CPP2_UFCS_(&,,__VA_ARGS__)
708
+ #define CPP2_UFCS_TEMPLATE (...) CPP2_UFCS_(&,template ,__VA_ARGS__)
709
+ #define CPP2_UFCS_NONLOCAL (...) CPP2_UFCS_(,,__VA_ARGS__)
710
+ #define CPP2_UFCS_TEMPLATE_NONLOCAL (...) CPP2_UFCS_(,template ,__VA_ARGS__)
762
711
763
712
764
713
// -----------------------------------------------------------------------
@@ -827,17 +776,17 @@ auto is( X const& ) -> bool {
827
776
828
777
template < typename C, typename X >
829
778
requires (
830
- ( std::is_base_of_v<X, C> ||
831
- ( std::is_polymorphic_v<C> && std::is_polymorphic_v<X>)
779
+ ( std::is_base_of_v<X, C> ||
780
+ ( std::is_polymorphic_v<C> && std::is_polymorphic_v<X>)
832
781
) && !std::is_same_v<C,X>)
833
782
auto is ( X const & x ) -> bool {
834
783
return Dynamic_cast<C const *>(&x) != nullptr ;
835
784
}
836
785
837
786
template < typename C, typename X >
838
787
requires (
839
- ( std::is_base_of_v<X, C> ||
840
- ( std::is_polymorphic_v<C> && std::is_polymorphic_v<X>)
788
+ ( std::is_base_of_v<X, C> ||
789
+ ( std::is_polymorphic_v<C> && std::is_polymorphic_v<X>)
841
790
) && !std::is_same_v<C,X>)
842
791
auto is ( X const * x ) -> bool {
843
792
return Dynamic_cast<C const *>(x) != nullptr ;
@@ -1425,7 +1374,7 @@ inline auto to_string(std::string const& s) -> std::string const&
1425
1374
1426
1375
template <typename T>
1427
1376
inline auto to_string (T const & sv) -> std::string
1428
- requires (std::is_convertible_v<T, std::string_view>
1377
+ requires (std::is_convertible_v<T, std::string_view>
1429
1378
&& !std::is_convertible_v<T, const char *>)
1430
1379
{
1431
1380
return std::string{sv};
0 commit comments