19 #if _MSVC_LANG < 201703L
20 #error This libary requires C++17 Standard (Visual Studio 2017).
24 #if __cplusplus < 201703
25 #error This library requires C++17 Standard (GNU g++ version 8.0 or clang++ version 8.0 above)
64 template<
typename Type>
70 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
74 using container_t = ContainerType<EleType, Types...>;
76 if constexpr(types::is_shrink_to_fit_available_v<container_t>
77 && types::is_capacity_available_v<container_t>)
81 container.shrink_to_fit();
85 if(container.capacity() > (container.size() *
factor + container.size()/
factor))
86 container.shrink_to_fit();
94 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
98 size_t left_size =
left.size();
99 size_t right_size =
right.size();
102 if (left_size == right_size)
108 for (
size_t i = 0; i < left_size; ++i)
121 size_t size = left_size < right_size ? left_size : right_size;
123 for (
size_t i = 0; i <
size; ++i)
131 return left_size < right_size ? -1 : 1;
138 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
140 compare_sets_size(
const ContainerType<EleType, Types...>& left,
const ContainerType<EleType, Types...>& right)
142 size_t left_size =
left.size();
143 size_t right_size =
right.size();
146 if (left_size == right_size)
152 for (
size_t i = 0; i < left_size; ++i)
165 return left_size < right_size ? -1 : 1;
169 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
171 operator == (
const ContainerType<EleType, Types...>& left,
const ContainerType<EleType, Types...>& right)
184 for(
size_t i= 0; i <
size; ++i)
195 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
197 operator != (
const ContainerType<EleType, Types...>& left,
const ContainerType<EleType, Types...>& right)
202 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
209 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
216 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
223 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
230 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
232 compare_less_size(
const ContainerType<EleType, Types...>& left,
const ContainerType<EleType, Types...>& right)
237 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
244 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
246 compare_greater_size(
const ContainerType<EleType, Types...>& left,
const ContainerType<EleType, Types...>& right)
251 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
258 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
260 operator < (
const ContainerType<EleType, Types...>& left,
const ContainerType<EleType, Types...>& right)
265 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
267 operator > (
const ContainerType<EleType, Types...>& left,
const ContainerType<EleType, Types...>& right)
272 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
274 operator <= (
const ContainerType<EleType, Types...>& left,
const ContainerType<EleType, Types...>& right)
279 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
281 operator >= (
const ContainerType<EleType, Types...>& left,
const ContainerType<EleType, Types...>& right)
286 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
288 is_in_container(
const EleType& ele,
const ContainerType<EleType, Types...>& container)
290 return std::binary_search(container.cbegin(), container.cend(), ele);
293 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
297 if(container.empty())
return false;
299 for(
const auto& e: container)
301 if(e == ele)
return true;
307 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
309 is_sorted(
const ContainerType<EleType, Types...>& container,
313 using container_t =
const ContainerType<EleType, Types...>&;
315 if(container.empty())
return true;
317 if constexpr(tpf::types::is_container_type_v<EleType>)
319 auto sort_predicate = [&order, &method](
const auto&
left,
const auto&
right)
345 for(
const auto& e: container)
348 size_t size = container.size();
350 for(
size_t i=1; i<
size; ++i)
353 if(!sort_predicate(tpf::get_element<container_t>(container, i-1),
354 tpf::get_element<container_t>(container, i)))
362 size_t size = container.size();
364 for(
size_t i = 1; i <
size; ++i)
366 if(tpf::get_element<container_t>(container, i-1) > tpf::get_element<container_t>(container, i))
374 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
380 if(container.empty())
return false;
384 if constexpr(tpf::types::is_container_type_v<EleType>)
386 auto sort_predicate = [&order, &method](
const auto&
left,
const auto&
right)
412 bool bNeedToSort =
false;
414 for(
auto& e: container)
420 if(!bNeedToSort)
return false;
423 std::sort(container.begin(), container.end(), sort_predicate);
424 container.erase(std::unique(container.begin(), container.end()), container.end());
430 std::sort(container.begin(), container.end());
431 container.erase(std::unique(container.begin(), container.end()), container.end());
437 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
438 ContainerType<EleType>
sort(ContainerType<EleType, Types...> container,
446 template<
template<
typename,
typename...>
class ContainerType,
447 typename EleType,
typename RightContainerType,
typename... Types>
449 union_in_place(ContainerType<EleType, Types...>& left, RightContainerType&& right)
451 if constexpr(std::is_rvalue_reference_v<
decltype(
right)>)
454 std::make_move_iterator(
right.begin()),
455 std::make_move_iterator(
right.end()));
465 template<
template<
typename,
typename...>
class ContainerType,
466 typename EleType,
typename RightContainerType1,
typename RightContainerType2,
typename... Types>
470 RightContainerType1&& right1, RightContainerType2&& right2)
472 if constexpr(std::is_rvalue_reference_v<
decltype(right1)>)
474 std::make_move_iterator(right1.begin()),
475 std::make_move_iterator(right1.end()));
477 left.insert(
left.end(), right1.cbegin(), right1.cend());
479 if constexpr(std::is_rvalue_reference_v<
decltype(right2)>)
481 std::make_move_iterator(right2.begin()),
482 std::make_move_iterator(right2.end()));
484 left.insert(
left.end(), right2.cbegin(), right2.cend());
489 template<
template<
typename,
typename...>
class ContainerType,
490 typename EleType,
typename RightContainerType,
typename... Types>
493 union_sets(ContainerType<EleType, Types...> left, RightContainerType&& right)
495 union_sets_in_place(
left, std::forward<RightContainerType>(
right));
499 template<
template<
typename,
typename...>
class ContainerType,
500 typename EleType,
typename RightContainerType1,
typename RightContainerType2,
typename... Types>
503 ContainerType<EleType, Types...>>
505 RightContainerType1&& right1, RightContainerType2&& right2)
507 if constexpr(std::is_rvalue_reference_v<
decltype(right1)>)
509 std::make_move_iterator(right1.begin()),
510 std::make_move_iterator(right1.end()));
512 left.insert(
left.end(), right1.cbegin(), right1.cend());
514 if constexpr(std::is_rvalue_reference_v<
decltype(right2)>)
516 std::make_move_iterator(right2.begin()),
517 std::make_move_iterator(right2.end()));
519 left.insert(
left.end(), right2.cbegin(), right2.cend());
524 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
525 typename... Types1,
typename... Types2>
526 ContainerType<EleType, Types1...>
union_flat(
const ContainerType<ContainerType<EleType, Types1...>, Types2...>& sets)
528 ContainerType<EleType, Types1...>
set;
530 for(
const auto& s: sets)
531 set.insert(
set.begin(), s.cbegin(), s.cend());
533 union_sets_in_place(
set);
return set;
536 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
537 ContainerType<EleType, Types...>
intersection(
const ContainerType<EleType, Types...>& left,
538 const ContainerType<EleType, Types...>& right)
543 ContainerType<EleType, Types...> container;
545 for(
const auto& s:
left)
548 container.push_back(s);
554 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
555 ContainerType<EleType, Types...>
intersection(
const ContainerType<EleType, Types...>& left,
556 const ContainerType<EleType, Types...>& right1,
const ContainerType<EleType, Types...>& right2)
558 if(
left.empty() || right1.empty() || right2.empty())
561 ContainerType<EleType, Types...> container;
563 for(
const auto& s:
left)
566 container.push_back(s);
572 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
573 ContainerType<EleType, Types...>
difference(
const ContainerType<EleType, Types...>& left,
574 const ContainerType<EleType, Types...>& right)
576 ContainerType<EleType, Types...> container;
578 for(
const auto& s:
left)
581 container.push_back(s);
587 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
588 ContainerType<EleType, Types...>
difference(
const ContainerType<EleType, Types...>& left,
589 const ContainerType<EleType, Types...>& right1,
const ContainerType<EleType, Types...>& right2)
591 ContainerType<EleType, Types...> container;
593 for(
const auto& s:
left)
596 container.push_back(s);
604 template<
template<
typename,
typename...>
class ContainerType,
605 typename EleType,
typename... Types,
typename... OuterTypes>
606 void build_subsets(ContainerType<ContainerType<EleType, Types...>, OuterTypes...>& SS,
607 ContainerType<EleType, Types...> R, ContainerType<EleType, Types...> S,
size_t count)
609 using set_t = ContainerType<EleType, Types...>;
610 using sets_t = ContainerType<ContainerType<EleType, Types...>, OuterTypes...>;
612 if (
count > S.size()) {
return; }
613 else if (
count == 0 && !R.empty())
615 SS.emplace_back(std::move(R));
return;
617 else if (S.size() ==
count)
619 R.insert(R.end(), std::make_move_iterator(S.begin()),
620 std::make_move_iterator(S.end()));
622 SS.emplace_back(std::move(R));
629 R.emplace_back(
int{});
631 while (
count <= S.size())
642 template<
template<
typename,
typename...>
class ContainerType,
typename EleType,
typename... Types>
643 void build_permutations(ContainerType<EleType, Types...>& L, ContainerType<EleType, Types...>& R,
size_t r);
645 template<
template<
typename,
typename...>
class ContainerType,
646 typename EleType,
typename... Types,
typename... OuterTypes>
647 void build_permutations(ContainerType<ContainerType<EleType, Types...>, OuterTypes...>& permutations,
648 ContainerType<EleType, Types...>& L, ContainerType<EleType, Types...>& R,
size_t r);
650 template<
template<
typename,
typename...>
class ContainerType,
typename EleType,
typename... Types>
653 template<
template<
typename,
typename...>
class ContainerType,
654 typename EleType,
typename... Types,
typename... OuterTypes>
656 ContainerType<EleType, Types...>& L, ContainerType<EleType, Types...>& R,
size_t r);
658 template<
template<
typename,
typename...>
class ContainerType,
659 typename EleType,
typename... Types,
typename... OuterTypes>
661 ContainerType<EleType, Types...>& L, ContainerType<EleType, Types...>& R,
size_t r)
663 using set_t = ContainerType<EleType, Types...>;
664 using sets_t = ContainerType<ContainerType<EleType, Types...>, OuterTypes...>;
665 using smart_set_t = std::shared_ptr<set_t>;
666 using smart_sets_t = std::shared_ptr<sets_t>;
668 if(r==0 || L.empty())
670 permutations.emplace_back(R);
674 size_t size = L.size();
677 R.emplace_back(EleType{});
683 auto r_pop_back = [](
auto ptr) { ptr->pop_back(); };
684 using r_type_t = std::remove_reference_t<
decltype(R)>;
687 std::unique_ptr<r_type_t,
decltype(r_pop_back)>
688 clean_up(&R, r_pop_back);
690 using future_t = std::future<sets_t>;
691 using futures_t = std::vector<future_t>;
695 for(
size_t i_th = 0; i_th <
size; ++i_th)
701 copied_L.erase(copied_L.begin()+i_th);
716 L = copied_L, R = R, r=r]()
mutable
723 futures.emplace_back(std::async(std::launch::async,
go_parallel));
728 for(
auto& f: futures)
732 permutations.insert(permutations.end(),
733 std::make_move_iterator(lps.begin()),
734 std::make_move_iterator(lps.end()));
740 template<
template<
typename,
typename...>
class ContainerType,
741 typename EleType,
typename... Types,
typename... OuterTypes>
742 void build_permutations(ContainerType<ContainerType<EleType, Types...>, OuterTypes...>& permutations,
743 ContainerType<EleType, Types...>& L, ContainerType<EleType, Types...>& R)
745 using set_t = ContainerType<EleType, Types...>;
746 using sets_t = ContainerType<ContainerType<EleType, Types...>, OuterTypes...>;
747 using smart_set_t = std::shared_ptr<set_t>;
748 using smart_sets_t = std::shared_ptr<sets_t>;
752 permutations.emplace_back(R);
756 size_t size = L.size();
759 R.emplace_back(EleType{});
765 auto r_pop_back = [](
auto ptr) { ptr->pop_back(); };
766 using r_type_t = std::remove_reference_t<
decltype(R)>;
769 std::unique_ptr<r_type_t,
decltype(r_pop_back)>
770 clean_up(&R, r_pop_back);
772 for(
size_t i_th = 0; i_th <
size; ++i_th)
778 copied_L.erase(copied_L.begin()+i_th);
790 template<
template<
typename,
typename...>
class ContainerType,
791 typename EleType,
typename... Types,
typename... OuterTypes>
792 void build_permutations(ContainerType<ContainerType<EleType, Types...>, OuterTypes...>& permutations,
793 ContainerType<EleType, Types...>& L, ContainerType<EleType, Types...>& R,
size_t r)
795 using set_t = ContainerType<EleType, Types...>;
796 using sets_t = ContainerType<ContainerType<EleType, Types...>, OuterTypes...>;
797 using smart_set_t = std::shared_ptr<set_t>;
798 using smart_sets_t = std::shared_ptr<sets_t>;
800 if(r == 0 || L.empty())
802 permutations.emplace_back(R);
806 size_t size = L.size();
809 R.emplace_back(EleType{});
815 auto r_pop_back = [](
auto ptr) { ptr->pop_back(); };
816 using r_type_t = std::remove_reference_t<
decltype(R)>;
819 std::unique_ptr<r_type_t,
decltype(r_pop_back)>
820 clean_up(&R, r_pop_back);
822 for(
size_t i_th = 0; i_th <
size; ++i_th)
828 copied_L.erase(copied_L.begin()+i_th);
841 template<
template<
typename,
typename...>
class ContainerType,
842 typename EleType,
typename... Types,
typename... OuterTypes>
844 ContainerType<EleType, Types...>& L, ContainerType<EleType, Types...>& R,
size_t r)
846 using set_t = ContainerType<EleType, Types...>;
847 using sets_t = ContainerType<ContainerType<EleType, Types...>, OuterTypes...>;
848 using smart_set_t = std::shared_ptr<set_t>;
849 using smart_sets_t = std::shared_ptr<sets_t>;
851 if(r == 0 || L.empty())
860 permutations.emplace_back(S);
864 size_t size = L.size();
867 R.emplace_back(EleType{});
873 auto r_pop_back = [](
auto ptr) { ptr->pop_back(); };
874 using r_type_t = std::remove_reference_t<
decltype(R)>;
877 std::unique_ptr<r_type_t,
decltype(r_pop_back)>
878 clean_up(&R, r_pop_back);
880 for(
size_t i_th = 0; i_th <
size; ++i_th)
886 copied_L.erase(copied_L.begin()+i_th);
899 template<
template<
typename,
typename...>
class ContainerType,
typename EleType,
typename... Types>
902 using set_t = ContainerType<EleType, Types...>;
903 using smart_set_t = std::shared_ptr<set_t>;
911 size_t size = L.size();
914 R.emplace_back(EleType{});
920 auto r_pop_back = [](
auto ptr) { ptr->pop_back(); };
921 using r_type_t = std::remove_reference_t<
decltype(R)>;
924 std::unique_ptr<r_type_t,
decltype(r_pop_back)>
925 clean_up(&R, r_pop_back);
927 using future_t = std::future<void>;
928 using futures_t = std::vector<future_t>;
932 for(
size_t i_th = 0; i_th <
size; ++i_th)
938 copied_L.erase(copied_L.begin()+i_th);
948 smart_set_t shared_L{
new set_t{copied_L}};
949 smart_set_t shared_R{
new set_t{R}};
956 futures.emplace_back(std::async(std::launch::async,
go_parallel));
961 for(
auto& f: futures)
969 template<
template<
typename,
typename...>
class ContainerType,
typename EleType,
typename... Types>
972 using set_t = ContainerType<EleType, Types...>;
973 using smart_set_t = std::shared_ptr<set_t>;
981 size_t size = L.size();
984 R.emplace_back(EleType{});
990 auto r_pop_back = [](
auto ptr) { ptr->pop_back(); };
991 using r_type_t = std::remove_reference_t<
decltype(R)>;
994 std::unique_ptr<r_type_t,
decltype(r_pop_back)>
995 clean_up(&R, r_pop_back);
997 for(
size_t i_th = 0; i_th <
size; ++i_th)
1003 copied_L.erase(copied_L.begin()+i_th);
1014 template<
template<
typename,
typename...>
class ContainerType,
typename EleType,
typename... Types>
1015 void build_permutations(ContainerType<EleType, Types...>& L, ContainerType<EleType, Types...>& R,
size_t r)
1017 using set_t = ContainerType<EleType, Types...>;
1018 using smart_set_t = std::shared_ptr<set_t>;
1020 if(r == 0 || L.empty())
1026 size_t size = L.size();
1029 R.emplace_back(EleType{});
1035 auto r_pop_back = [](
auto ptr) { ptr->pop_back(); };
1036 using r_type_t = std::remove_reference_t<
decltype(R)>;
1039 std::unique_ptr<r_type_t,
decltype(r_pop_back)>
1040 clean_up(&R, r_pop_back);
1042 for(
size_t i_th = 0; i_th <
size; ++i_th)
1048 copied_L.erase(copied_L.begin()+i_th);
1059 template<
template<
typename,
typename...>
class ContainerType,
typename EleType,
typename... Types>
1062 using set_t = ContainerType<EleType, Types...>;
1063 using smart_set_t = std::shared_ptr<set_t>;
1069 for(
auto e: L) R.push_back(e);
1074 size_t size = L.size();
1077 R.emplace_back(EleType{});
1083 auto r_pop_back = [](
auto ptr) { ptr->pop_back(); };
1084 using r_type_t = std::remove_reference_t<
decltype(R)>;
1087 std::unique_ptr<r_type_t,
decltype(r_pop_back)>
1088 clean_up(&R, r_pop_back);
1090 for(
size_t i_th = 0; i_th <
size; ++i_th)
1096 copied_L.erase(copied_L.begin()+i_th);
1109 template<
typename ThreadCountType,
typename NType,
typename RType>
1116 set_t L; L.reserve(n);
1117 for(
size_t i= 0; i < (size_t)n; ++i)
1118 L.emplace_back((
short)i);
1120 set_t R; R.reserve(n);
1134 }
catch(
const std::exception& e)
1138 return permutations;
1141 template<
typename NType,
typename RType>
1148 set_t L; L.reserve(n);
1149 for(
size_t i= 0; i < (size_t)n; ++i)
1150 L.emplace_back((NType)i);
1152 set_t R; R.reserve(n);
1162 }
catch(
const std::exception& e)
1166 return permutations;
1169 template<
typename NType,
typename RType>
1176 set_t L; L.reserve(n);
1177 for(
size_t i= 0; i < (size_t)n; ++i)
1178 L.emplace_back((NType)i);
1180 set_t R; R.reserve(n);
1190 }
catch(
const std::exception& e)
1194 return permutations;
1199 template<
typename ThreadCountType,
typename NType,
typename RType>
1206 set_t L; L.reserve(n);
1207 for(
size_t i= 0; i < (size_t)n; ++i)
1208 L.emplace_back((NType)i);
1210 set_t R; R.reserve(n);
1221 }
catch(
const std::exception& e)
1228 template<
typename NType,
typename RType>
1235 set_t L; L.reserve(n);
1236 for(
size_t i= 0; i < (size_t)n; ++i)
1237 L.emplace_back((NType)i);
1239 set_t R; R.reserve(n);
1247 }
catch(
const std::exception& e)
1256 template<
template<
typename,
typename...>
class ContainerType,
1257 typename EleType,
typename... Types>
1258 ContainerType<ContainerType<EleType, Types...>>
1261 using set_t = ContainerType<EleType>;
1262 using sets_t = ContainerType<ContainerType<EleType>>;
1266 if (
count == 0 || S.empty())
1268 subsets.emplace_back(
set_t{});
1272 constexpr size_t limit = std::numeric_limits<size_t>::max();
1278 subsets.emplace_back(
set_t{});
1279 size_t size = S.size();
1287 #if defined(_GLIBCXX_PARALLEL)
1288 #pragma omp parallel for
1289 for (
size_t i = 1; i <
size; ++i)
1294 #elif defined(_MSC_VER)
1298 #elif defined(__ICL)
1301 for (
size_t i = 1; i <
size; ++i)
1307 subsets.emplace_back(S);
1311 assert(
count <= S.size());
1322 template<
template<
typename,
typename...>
class ReturnContainer = std::vector,
1323 template<
typename,
typename...>
class SetContainer = std::list,
typename... ContainerTails,
1324 typename EleType = int,
typename CountType =
int>
1325 ReturnContainer<ReturnContainer<EleType>>
1327 SetContainer<EleType, ContainerTails...> exclude_set,
1328 SetContainer<EleType, ContainerTails...> from_set, CountType r)
1333 template<
typename EleType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
1337 if(container.empty())
return tpf::type_max_v<size_t>;
1339 EleType
minimum = tpf::type_max_v<EleType>;
1341 auto iterator = container.cend();
1343 for(
auto itr = container.cbegin(); itr != container.cend(); std::advance(itr, 1))
1347 iterator = itr;
minimum = *itr;
1351 return (iterator != container.cend()) ?
1352 std::distance(container.cbegin(), iterator) : tpf::type_max_v<size_t>;
1355 template<
typename EleType,
typename IndexType,
template<
typename,
typename...>
class ContainerType,
typename... Types>
1358 const std::vector<IndexType>& exclude_set)
1360 if(container.empty())
return tpf::type_max_v<size_t>;
1362 EleType
minimum = tpf::type_max_v<EleType>;
1364 auto iterator = container.cend();
1366 for(
auto itr = container.cbegin(); itr != container.cend(); std::advance(itr, 1))
1368 auto index = std::distance(container.cbegin(), itr);
1374 iterator = itr;
minimum = *itr;
1378 return (iterator != container.cend()) ?
1379 std::distance(container.cbegin(), iterator) : tpf::type_max_v<size_t>;
void go_parallel(Policy &&policy, IteratorBegin &&begin, IteratorEnd &&end, Callback &&callback)
bool parallel_for(CallbackType &&callback, PolicyType &&policy, BeginType begin_index, EndType end_index)
typename enable_if< predicate, ReturnType >::type enable_if_t
constexpr size_t InvalidIndex
void build_subsets(ContainerType< ContainerType< EleType, Types... >, OuterTypes... > &SS, ContainerType< EleType, Types... > R, ContainerType< EleType, Types... > S, size_t count)
void build_permutations_remainder(ContainerType< EleType, Types... > &L, ContainerType< EleType, Types... > &R, size_t r)
void build_permutations(ContainerType< EleType, Types... > &L, ContainerType< EleType, Types... > &R, size_t r)
Implements set operations.
std::enable_if_t< std::is_same_v< ContainerType< EleType, Types... >, remove_cv_ref_t< RightContainerType > > > union_in_place(ContainerType< EleType, Types... > &left, RightContainerType &&right)
auto build_permutations(ThreadCountType thread_count, NType n, RType r)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > operator>(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > is_sorted(const ContainerType< EleType, Types... > &container, sort_order order=sort_order::ascending, sort_method method=sort_method::size)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > compare_less_equal_dictionary(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, size_t > minimum_value_index(const ContainerType< EleType, Types... > &container)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > compare_less_size(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > is_in_container(const EleType &ele, const ContainerType< EleType, Types... > &container)
constexpr auto count_of_subsets(Type element_count)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, int > compare_sets_size(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > is_in_unsorted_container(const EleType &ele, const ContainerType< EleType, Types... > &container)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > operator!=(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
ContainerType< EleType, Types... > intersection(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
ContainerType< ContainerType< EleType, Types... > > build_subsets(const ContainerType< EleType, Types... > &S, size_t count=InvalidIndex)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, int > compare_sets_dictionary(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > compare_greater_equal_dictionary(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
std::enable_if_t< std::is_same_v< ContainerType< EleType, Types... >, remove_cv_ref_t< RightContainerType > >, ContainerType< EleType, Types... > > union_sets(ContainerType< EleType, Types... > left, RightContainerType &&right)
ContainerType< EleType, Types... > difference(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > compare_greater_equal_size(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > compare_greater_dictionary(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > compare_less_equal_size(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > compare_less_dictionary(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, void > smart_shrink_to_fit(ContainerType< EleType, Types... > &container, size_t factor=2)
ReturnContainer< ReturnContainer< EleType > > enumerate_combination_with_exclude(SetContainer< EleType, ContainerTails... > exclude_set, SetContainer< EleType, ContainerTails... > from_set, CountType r)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > operator>=(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
ContainerType< EleType > sort(ContainerType< EleType, Types... > container, sort_order order=sort_order::ascending, sort_method method=sort_method::size)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > sort_in_place(ContainerType< EleType, Types... > &container, sort_order order=sort_order::ascending, sort_method method=sort_method::size)
ContainerType< EleType, Types1... > union_flat(const ContainerType< ContainerType< EleType, Types1... >, Types2... > &sets)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > operator==(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > compare_greater_size(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
auto build_permutations_remainder(NType n, RType r)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > operator<(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
types::enable_if_container_type_t< ContainerType< EleType, Types... >, bool > operator<=(const ContainerType< EleType, Types... > &left, const ContainerType< EleType, Types... > &right)
auto build_permutations_flat(ThreadCountType thread_count, NType n, RType r)
hidden::enable_if_container_type_t< Type, ReturnType > enable_if_container_type_t
auto pop_front(ContainerType< Type, Types... > &container)
Includes subnamespace conversion.
constexpr unsigned long long two_power_n(Type n)
auto minimum(Type_1 a, Type_2 b)
typename SetTagType::set_t set_t
std::remove_cv_t< std::remove_reference_t< Type > > remove_cv_ref_t
Remove const volatile reference from Type.
typename SetTagType::sets_t sets_t
std::atomic< int > thread_count
std::atomic< int > thread_count
Stream output operators << are implemented.
Type functions are implemented.