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