@@ -677,4 +677,187 @@ IS_SAME(
677
677
);
678
678
// / [accumulate]
679
679
)
680
+
681
+ HIDE(
682
+ // / [min_element]
683
+ using nums = metal::numbers<4 , 42 , 17 , -7 , 0 >;
684
+
685
+ using comp_lt = metal::lambda<metal::less>;
686
+ IS_SAME (metal::min_element<nums, comp_lt>, metal::number<-7 >);
687
+
688
+ using comp_gt = metal::lambda<metal::greater>;
689
+ IS_SAME (metal::min_element<nums, comp_gt>, metal::number<42 >);
690
+
691
+ using vals = metal::list<const char [3 ], char [1 ], char [1 ], char [3 ], const char [1 ]>;
692
+
693
+ template <typename x, typename y>
694
+ using smaller = metal::number<(sizeof (x) < sizeof(y))>;
695
+ IS_SAME (metal::min_element<vals, metal::lambda<smaller>>, char [1 ]);
696
+
697
+ template <typename x, typename y>
698
+ using larger = metal::number<(sizeof (x) > sizeof (y))>;
699
+ IS_SAME (metal::min_element<vals, metal::lambda<larger>>, const char [3 ]);
700
+ // / [min_element]
701
+ )
702
+
703
+ HIDE (
704
+ template <template <class ...> class tmpl , class ... args>
705
+ using is_sfinae_friendly = metal::is_invocable<metal::lambda<tmpl>, args...>;
706
+
707
+ using some_extra_argument = int ;
708
+
709
+ using attempt_to_instantiate = is_sfinae_friendly<
710
+ metal::detail::_min_element<metal::lambda<std::is_void>>::template combiner,
711
+ void , some_extra_argument, char
712
+ >;
713
+ )
714
+
715
+ HIDE(
716
+ template <class , class >
717
+ using good_comp = metal::false_;
718
+
719
+ static_assert (
720
+ metal::is_invocable<
721
+ metal::lambda<metal::min_element>,
722
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
723
+ metal::lambda<good_comp>
724
+ >{}, " " );
725
+ )
726
+
727
+ HIDE(
728
+ template <class ...>
729
+ using good_comp = metal::false_;
730
+
731
+ static_assert (
732
+ metal::is_invocable<
733
+ metal::lambda<metal::min_element>,
734
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
735
+ metal::lambda<good_comp>
736
+ >{}, " " );
737
+ )
738
+
739
+ HIDE(
740
+ template <class , class ...>
741
+ using good_comp = metal::false_;
742
+
743
+ static_assert (
744
+ metal::is_invocable<
745
+ metal::lambda<metal::min_element>,
746
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
747
+ metal::lambda<good_comp>
748
+ >{}, " " );
749
+ )
750
+
751
+ HIDE(
752
+ template <class , class >
753
+ struct good_lazy_comp {
754
+ using type = metal::false_;
755
+ };
756
+
757
+ template <class ... args>
758
+ using good_comp = typename good_lazy_comp<args...>::type;
759
+
760
+ static_assert (
761
+ metal::is_invocable<
762
+ metal::lambda<metal::min_element>,
763
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
764
+ metal::lambda<good_comp>
765
+ >{}, " " );
766
+ )
767
+
768
+ HIDE(
769
+ template <class , class , class ...>
770
+ struct good_lazy_comp {
771
+ template <class ...>
772
+ using type = metal::false_;
773
+ };
774
+
775
+ template <class ... args>
776
+ using good_comp = typename good_lazy_comp<args...>::template type<args...>;
777
+
778
+ static_assert (
779
+ metal::is_invocable<
780
+ metal::lambda<metal::min_element>,
781
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
782
+ metal::lambda<good_comp>
783
+ >{}, " " );
784
+ )
785
+
786
+ HIDE(
787
+ template <class >
788
+ struct bad_lazy_comp {
789
+ using type = metal::false_;
790
+ };
791
+
792
+ template <class ... args>
793
+ using bad_comp = typename bad_lazy_comp<args...>::type;
794
+
795
+ static_assert (
796
+ !metal::is_invocable<
797
+ metal::lambda<metal::min_element>,
798
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
799
+ metal::lambda<bad_comp>
800
+ >{}, " " );
801
+ )
802
+
803
+ HIDE(
804
+ template <class >
805
+ using bad_comp = metal::false_;
806
+
807
+ static_assert (
808
+ !metal::is_invocable<
809
+ metal::lambda<metal::min_element>,
810
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
811
+ metal::lambda<bad_comp>
812
+ >{}, " " );
813
+ )
814
+
815
+ HIDE(
816
+ template <class , class , class >
817
+ using bad_comp = metal::false_;
818
+
819
+ static_assert (
820
+ !metal::is_invocable<
821
+ metal::lambda<metal::min_element>,
822
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
823
+ metal::lambda<bad_comp>
824
+ >{}, " " );
825
+ )
826
+
827
+ HIDE(
828
+ template <class , class , class , class ...>
829
+ using bad_comp = metal::false_;
830
+
831
+ static_assert (
832
+ !metal::is_invocable<
833
+ metal::lambda<metal::min_element>,
834
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
835
+ metal::lambda<bad_comp>
836
+ >{}, " " );
837
+ )
838
+
839
+ HIDE(
840
+ template <class , class >
841
+ struct bad_comp ;
842
+
843
+ static_assert (
844
+ !metal::is_invocable<
845
+ metal::lambda<metal::min_element>,
846
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
847
+ metal::lambda<bad_comp>
848
+ >{}, " " );
849
+ )
850
+
851
+ HIDE(
852
+ template <class , class >
853
+ struct bad_comp {};
854
+
855
+ static_assert (
856
+ !metal::is_invocable<
857
+ metal::lambda<metal::min_element>,
858
+ metal::numbers<4 , 42 , 17 , -7 , 0 >,
859
+ metal::lambda<bad_comp>
860
+ >{}, " " );
861
+ )
862
+
680
863
#endif
0 commit comments