884 {
885 static constexpr auto lt = nt::comparators::lessThan<T...>();
886 static constexpr auto eq = nt::comparators::equal<T...>();
887 auto ret = create_empty_vector<VEC_T, FUNC_T>();
888
889
890
891 if (vec.empty()) {
892 return ret;
893 }
894 auto min_element = vec[0];
895 auto max_element = vec[0];
896
897 for (const auto& e : vec) {
898 if (lt(e, min_element)) {
899 min_element = e;
900 }
901
902 if (lt(max_element, e)) {
903 max_element = e;
904 }
905 }
906
907 if (eq(min_element, max_element)) {
908 ret.push_back(
909 fun_c(vec)
910 );
911 return ret;
912 }
913
914 std::vector<VEC_T> buff{};
915 buff.reserve(vec.size());
916
917
918
919 auto process = [&]() {
920 buff.clear();
921 VEC_T next_min_element{};
922 next_min_element = max_element;
923
924 for (const auto& e : vec) {
925 if (eq(min_element, e)) {
926 buff.push_back(e);
927 } else if (lt(min_element, e) && lt(e, next_min_element)) {
928 next_min_element = e;
929 }
930
931 }
932
933 min_element = next_min_element;
934
935
936 ret.push_back(fun_c(buff));
937 };
938
939 while (lt(min_element, max_element)) {
940 process();
941
942 }
943
944 process();
945
946
947 return ret;
948 }