12#ifndef O2_FRAMEWORK_ASOAHELPERS_H_
13#define O2_FRAMEWORK_ASOAHELPERS_H_
17#include <arrow/table.h>
26template <std::
size_t V>
28 static const constexpr auto value = V;
31template <
class F, std::size_t... Is>
34 using expander =
int[];
38template <std::
size_t N,
typename F>
41 for_(
func, std::make_index_sequence<N>());
45template <
typename T,
unsigned N,
typename... REST>
50template <
typename T,
typename... REST>
52 using type = std::tuple<REST...>;
71 return a.bin >=
b.bin;
76template <
template <
typename... Cs>
typename BP,
typename T,
typename... Cs>
77std::vector<BinningIndex>
groupTable(
const T& table,
const BP<Cs...>& binningPolicy,
int minCatSize,
int outsider)
79 arrow::Table* arrowTable = table.asArrowTable().get();
80 auto rowIterator = table.begin();
84 gsl::span<int64_t const> selectedRows;
85 std::vector<BinningIndex> groupedIndices;
88 if (table.size() == 0) {
89 return groupedIndices;
93 selectedRows = table.getSelectedRows();
96 auto persistentColumns =
typename BP<Cs...>::persistent_columns_t{};
97 constexpr auto persistentColumnsCount =
pack_size(persistentColumns);
99 auto chunksCount = arrowColumns[0]->num_chunks();
100 for (
int i = 1;
i < persistentColumnsCount;
i++) {
101 if (arrowColumns[
i]->num_chunks() != chunksCount) {
106 for (uint64_t ci = 0; ci < chunksCount; ++ci) {
108 auto chunkLength = std::get<0>(chunks)->length();
109 for_<persistentColumnsCount - 1>([&chunks, &chunkLength](
auto i) {
110 if (std::get<i.value + 1>(chunks)->length() != chunkLength) {
116 if (selectedRows[ind] >= selInd + chunkLength) {
117 selInd += chunkLength;
123 while (ai < chunkLength) {
125 ai += selectedRows[ind] - selInd;
126 selInd = selectedRows[ind];
129 auto values = binningPolicy.getBinningValues(rowIterator, arrowTable, ci, ai, ind);
131 if (
val != outsider) {
132 groupedIndices.emplace_back(
val, ind);
137 if (ind >= selectedRows.size()) {
146 if (ind == selectedRows.size()) {
154 std::stable_sort(groupedIndices.begin(), groupedIndices.end());
157 if (minCatSize > 1) {
158 auto catBegin = groupedIndices.begin();
159 while (catBegin != groupedIndices.end()) {
160 auto catEnd = std::upper_bound(catBegin, groupedIndices.end(), *catBegin,
sameCategory);
161 if (std::distance(catBegin, catEnd) < minCatSize) {
162 catEnd = groupedIndices.erase(catBegin, catEnd);
168 return groupedIndices;
172template <std::
size_t K>
175 std::vector<BinningIndex> firstCategories;
176 std::vector<BinningIndex> commonCategories;
177 std::unique_copy(groupedIndices[0].begin(), groupedIndices[0].
end(), std::back_inserter(firstCategories),
diffCategory);
179 for (
auto& cat : firstCategories) {
180 bool isCommon =
true;
181 for (
int i = 1;
i < K;
i++) {
182 if (!std::binary_search(groupedIndices[
i].begin(), groupedIndices[
i].
end(), cat,
sameCategory)) {
188 commonCategories.push_back(cat);
192 for (
int i = 0;
i < K;
i++) {
193 auto nonCatBegin = groupedIndices[
i].begin();
194 for (
auto& cat : commonCategories) {
195 auto nonCatEnd = std::lower_bound(nonCatBegin, groupedIndices[
i].
end(), cat,
sameCategory);
196 nonCatEnd = groupedIndices[
i].erase(nonCatBegin, nonCatEnd);
197 nonCatBegin = std::upper_bound(nonCatEnd, groupedIndices[
i].
end(), cat,
sameCategory);
202template <
typename...
Ts>
208 template <
typename... Tss>
213 if (((tables.size() == 0) || ...)) {
217 template <
typename... Tss>
223 std::apply([](
auto&&...
x) ->
bool {
return ((
x.size() == 0) || ...); }, *
mTables)) {
233 if (((tables.size() == 0) || ...)) {
237 template <
typename... Tss>
241 mTables = std::make_shared<std::tuple<Tss...>>(std::make_tuple(std::move(tables)...));
244 std::apply([](
auto&&...
x) ->
bool {
return ((
x.size() == 0) || ...); }, *
mTables)) {
251 constexpr auto k =
sizeof...(Ts);
252 for_<k>([&,
this](
auto i) {
266template <
typename...
Ts>
269template <
typename...
Ts>
272template <
typename...
Ts>
282 constexpr auto k =
sizeof...(Ts);
284 for_<k>([&,
this](
auto i) {
286 constexpr auto curInd = k -
i.value - 1;
288 if (*std::get<1>(std::get<curInd>(this->
mCurrent).getIndices()) != std::get<curInd>(this->
mMaxOffset)) {
290 for_<
i.value>([&,
this](
auto j) {
291 constexpr auto curJ = k -
i.value +
j.value;
292 int64_t nextInd = *std::get<1>(std::get<curJ - 1>(this->
mCurrent).getIndices());
293 if (nextInd < std::get<curJ>(this->
mMaxOffset)) {
294 std::get<curJ>(this->
mCurrent).setCursor(nextInd);
306template <
typename...
Ts>
337 constexpr auto k =
sizeof...(Ts);
338 if (((tables.size() < k) || ...)) {
342 for_<k>([&,
this](
auto i) {
344 std::get<
i.value>(this->
mCurrent).moveByIndex(
i.value);
349 constexpr auto k =
sizeof...(Ts);
351 std::apply([](
auto&&...
x) ->
bool {
return ((
x.size() < k) || ...); }, *this->
mTables)) {
355 for_<k>([&,
this](
auto i) {
357 std::get<
i.value>(this->
mCurrent).moveByIndex(
i.value);
363 constexpr auto k =
sizeof...(Ts);
365 for_<k>([&,
this](
auto i) {
367 constexpr auto curInd = k -
i.value - 1;
369 if (*std::get<1>(std::get<curInd>(this->
mCurrent).getIndices()) != std::get<curInd>(this->
mMaxOffset)) {
371 for_<
i.value>([&,
this](
auto j) {
372 constexpr auto curJ = k -
i.value +
j.value;
373 int64_t nextInd = *std::get<1>(std::get<curJ - 1>(this->
mCurrent).getIndices()) + 1;
374 if (nextInd < std::get<curJ>(this->
mMaxOffset)) {
375 std::get<curJ>(this->
mCurrent).setCursor(nextInd);
387template <
typename...
Ts>
397 constexpr auto k =
sizeof...(Ts);
399 for_<k>([&,
this](
auto i) {
401 constexpr auto curInd = k -
i.value - 1;
403 if (*std::get<1>(std::get<curInd>(this->
mCurrent).getIndices()) != std::get<curInd>(this->
mMaxOffset)) {
404 for_<
i.value>([&,
this](
auto j) {
405 constexpr auto curJ = k -
i.value +
j.value;
406 std::get<curJ>(this->
mCurrent).setCursor(0);
417template <
typename BP,
typename T,
typename...
Ts>
449 constexpr auto k =
sizeof...(Ts);
461 for (
int i = 0;
i < k;
i++) {
468 for_<k>([
this](
auto i) {
474 constexpr auto k =
sizeof...(Ts);
484 std::apply([&,
this](
auto&&...
x)
mutable {
492 for (
int i = 0;
i < k;
i++) {
499 for_<k>([
this](
auto i) {
515 uint64_t maxForTable = std::get<0>(this->
mMaxOffset);
516 uint64_t currentMax = maxForWindow < maxForTable ? maxForWindow : maxForTable;
535template <
typename BP,
typename T,
typename...
Ts>
566 constexpr auto k =
sizeof...(Ts);
567 for_<k>([&,
this](
auto i) {
578 constexpr auto k =
sizeof...(Ts);
580 bool nextCatAvailable =
true;
581 for_<k - 1>([&,
this](
auto i) {
583 constexpr auto curInd = k -
i.value - 1;
589 if (curGroupedInd < maxForWindow && curGroupedInd < std::get<curInd>(this->
mMaxOffset)) {
592 for_<
i.value>([&,
this](
auto j) {
593 constexpr auto curJ = k -
i.value +
j.value;
615 if (curGroupedInd < std::get<0>(this->
mMaxOffset)) {
618 for_<k - 1>([&,
this](
auto j) {
619 constexpr auto curJ =
j.value + 1;
634 for_<k>([&,
this](
auto m) {
637 nextCatAvailable =
false;
640 if (nextCatAvailable) {
645 this->
mIsEnd = modify && !nextCatAvailable;
649template <
typename BP,
typename T,
typename...
Ts>
681 constexpr auto k =
sizeof...(Ts);
682 for_<k>([&,
this](
auto i) {
693 constexpr auto k =
sizeof...(Ts);
695 bool nextCatAvailable =
true;
696 for_<k>([&,
this](
auto i) {
698 constexpr auto curInd = k -
i.value - 1;
702 uint64_t maxForWindow = std::get<curInd>(this->
mBeginIndices) + windowOffset;
705 if (curGroupedInd < maxForWindow && curGroupedInd < std::get<curInd>(this->
mMaxOffset)) {
707 for_<
i.value>([&,
this](
auto j) {
708 constexpr auto curJ = k -
i.value +
j.value;
729 for_<k>([&,
this](
auto s) {
730 if (s.value < this->mCurrentlyFixed) {
731 std::get<s.value>(this->mCurrentIndices) = std::get<s.value>(this->mBeginIndices) + 1;
733 std::get<s.value>(this->mCurrentIndices) = std::get<s.value>(this->mBeginIndices);
735 uint64_t curGroupedI = std::get<s.value>(this->mCurrentIndices);
749 for_<k - 1>([&,
this](
auto j) {
750 constexpr auto curJ =
j.value + 1;
766 for_<k>([&,
this](
auto m) {
769 nextCatAvailable =
false;
772 if (nextCatAvailable) {
777 this->
mIsEnd = modify && !nextCatAvailable;
783template <
typename BP,
typename T1,
typename T,
typename...
Ts>
788 CombinationsBlockSameIndexPolicyBase(
const BP& binningPolicy,
int categoryNeighbours,
const T1& outsider,
int minWindowSize) :
CombinationsIndexPolicyBase<T,
Ts...>(),
mSlidingWindowSize(categoryNeighbours + 1),
mBP(binningPolicy),
mCategoryNeighbours(categoryNeighbours),
mOutsider(outsider),
mMinWindowSize(minWindowSize),
mIsNewWindow(true) {}
789 CombinationsBlockSameIndexPolicyBase(
const BP& binningPolicy,
int categoryNeighbours,
const T1& outsider,
int minWindowSize,
const T& table,
const Ts&... tables) :
CombinationsIndexPolicyBase<T,
Ts...>(table, tables...),
mSlidingWindowSize(categoryNeighbours + 1),
mBP(binningPolicy),
mCategoryNeighbours(categoryNeighbours),
mOutsider(outsider),
mMinWindowSize(minWindowSize),
mIsNewWindow(true)
795 CombinationsBlockSameIndexPolicyBase(
const BP& binningPolicy,
int categoryNeighbours,
const T1& outsider,
int minWindowSize, T&& table,
Ts&&... tables) :
CombinationsIndexPolicyBase<T,
Ts...>(
std::forward<T>(table),
std::forward<
Ts>(tables)...),
mSlidingWindowSize(categoryNeighbours + 1),
mBP(binningPolicy),
mCategoryNeighbours(categoryNeighbours),
mOutsider(outsider),
mMinWindowSize(minWindowSize),
mIsNewWindow(true)
819 constexpr auto k =
sizeof...(Ts) + 1;
837 constexpr auto k =
sizeof...(Ts) + 1;
865 uint64_t maxForTable = std::get<0>(this->
mMaxOffset);
866 uint64_t currentMax = maxForWindow < maxForTable ? maxForWindow : maxForTable;
885template <
typename BP,
typename T1,
typename...
Ts>
916 constexpr auto k =
sizeof...(Ts);
921 for_<k>([&,
this](
auto i) {
930 constexpr auto k =
sizeof...(Ts);
932 for_<k - 1>([&,
this](
auto i) {
934 constexpr auto curInd = k -
i.value - 1;
940 if (curGroupedInd < maxForWindow && curGroupedInd < std::get<curInd>(this->
mMaxOffset)) {
942 for_<
i.value>([&,
this](
auto j) {
943 constexpr auto curJ = k -
i.value +
j.value;
961 if (curGroupedInd < std::get<0>(this->
mMaxOffset)) {
963 for_<k - 1>([&,
this](
auto j) {
964 constexpr auto curJ =
j.value + 1;
983template <
typename BP,
typename T1,
typename...
Ts>
1019 constexpr auto k =
sizeof...(Ts);
1022 uint64_t lastOffset = std::distance(this->
mGroupedIndices.begin(), lastIt);
1024 for_<k>([&,
this](
auto i) {
1027 std::get<
i.value>(this->
mMaxOffset) = lastOffset - k +
i.value + 1;
1033 constexpr auto k =
sizeof...(Ts);
1035 for_<k - 1>([&,
this](
auto i) {
1037 constexpr auto curInd = k -
i.value - 1;
1043 if (curGroupedInd < maxForWindow && curGroupedInd < std::get<curInd>(this->
mMaxOffset)) {
1045 for_<
i.value>([&,
this](
auto j) {
1046 constexpr auto curJ = k -
i.value +
j.value;
1064 if (curGroupedInd < std::get<0>(this->
mMaxOffset)) {
1066 for_<k - 1>([&,
this](
auto j) {
1067 constexpr auto curJ =
j.value + 1;
1078 for_<k>([&,
this](
auto m) {
1089template <
typename BP,
typename T1,
typename...
Ts>
1094 CombinationsBlockFullSameIndexPolicy(
const BP& binningPolicy,
int categoryNeighbours,
const T1& outsider,
const Ts&... tables) :
CombinationsBlockSameIndexPolicyBase<BP, T1,
Ts...>(binningPolicy, categoryNeighbours, outsider, 1, tables...),
mCurrentlyFixed(0)
1100 CombinationsBlockFullSameIndexPolicy(
const BP& binningPolicy,
int categoryNeighbours,
const T1& outsider,
Ts&&... tables) :
CombinationsBlockSameIndexPolicyBase<BP, T1,
Ts...>(binningPolicy, categoryNeighbours, outsider, 1,
std::forward<
Ts>(tables)...),
mCurrentlyFixed(0)
1120 constexpr auto k =
sizeof...(Ts);
1126 for_<k>([&,
this](
auto i) {
1135 constexpr auto k =
sizeof...(Ts);
1137 for_<k>([&,
this](
auto i) {
1139 constexpr auto curInd = k -
i.value - 1;
1143 uint64_t maxForWindow = this->
mBeginIndex + windowOffset;
1146 if (curGroupedInd < maxForWindow && curGroupedInd < std::get<curInd>(this->
mMaxOffset)) {
1148 for_<
i.value>([&,
this](
auto j) {
1149 constexpr auto curJ = k -
i.value +
j.value;
1168 for_<k>([&,
this](
auto s) {
1169 if (s.value < this->mCurrentlyFixed) {
1170 std::get<s.value>(this->mCurrentIndices) = this->mBeginIndex + 1;
1172 std::get<s.value>(this->mCurrentIndices) = this->mBeginIndex;
1174 uint64_t curGroupedI = std::get<s.value>(this->mCurrentIndices);
1187 for_<k - 1>([&,
this](
auto j) {
1188 constexpr auto curJ =
j.value + 1;
1195 for_<k>([&,
this](
auto j) {
1217template <
typename P>
1240 if (!this->mIsEnd) {
1255 return this->mCurrent;
1259 return (lh.mIsEnd && rh.mIsEnd) || (lh.mCurrent == rh.mCurrent);
1295template <
typename T2,
typename... T2s>
1298 return (std::same_as<T2, T2s> && ...);
1301template <
typename BP,
typename T1,
typename... T2s>
1302auto selfCombinations(
const BP& binningPolicy,
int categoryNeighbours,
const T1& outsider,
const T2s&... tables)
1304 static_assert(
isSameType<T2s...>(),
"Tables must have the same type for self combinations");
1308template <
typename BP,
typename T1,
typename T2>
1314template <
typename BP,
typename T1,
typename T2>
1317 return CombinationsGenerator<CombinationsBlockStrictlyUpperSameIndexPolicy<BP, T1, T2, T2>>(
CombinationsBlockStrictlyUpperSameIndexPolicy<BP, T1, T2, T2>(binningPolicy, categoryNeighbours, outsider, table, table));
1320template <
typename BP,
typename T1,
typename T2>
1323 return CombinationsGenerator<CombinationsBlockStrictlyUpperSameIndexPolicy<BP, T1, T2, T2, T2>>(
CombinationsBlockStrictlyUpperSameIndexPolicy<BP, T1, T2, T2, T2>(binningPolicy, categoryNeighbours, outsider));
1326template <
typename BP,
typename T1,
typename T2>
1329 return CombinationsGenerator<CombinationsBlockStrictlyUpperSameIndexPolicy<BP, T1, T2, T2, T2>>(
CombinationsBlockStrictlyUpperSameIndexPolicy<BP, T1, T2, T2, T2>(binningPolicy, categoryNeighbours, outsider, table, table, table));
1332template <
typename BP,
typename T1,
typename... T2s>
1333auto combinations(
const BP& binningPolicy,
int categoryNeighbours,
const T1& outsider,
const T2s&... tables)
1342template <
typename BP,
typename T1,
typename... T2s>
1364template <
template <
typename...>
typename P2,
typename... T2s>
1370template <
template <
typename...>
typename P2,
soa::is_table... T2s>
1376template <
typename... T2s>
1386template <
typename T2>
1392template <
typename T2>
1398template <
typename T2>
1404template <
typename T2>
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * value
GLint GLint GLsizei GLint GLenum GLenum type
GLenum GLsizei GLsizei GLint * values
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLboolean GLboolean GLboolean GLboolean a
constexpr std::size_t pack_size(pack< Ts... > const &)
template function to determine number of types in a pack
std::array< std::shared_ptr< arrow::Array >, sizeof...(Cs)> getChunks(arrow::Table *table, framework::pack< Cs... >, uint64_t ci)
std::array< arrow::ChunkedArray *, sizeof...(Cs)> getArrowColumns(arrow::Table *table, framework::pack< Cs... >)
constexpr bool isSameType()
bool diffCategory(BinningIndex const &a, BinningIndex const &b)
void syncCategories(std::array< std::vector< BinningIndex >, K > &groupedIndices)
auto selfTripleCombinations(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider)
auto tripleCombinations()
std::vector< BinningIndex > groupTable(const T &table, const BP< Cs... > &binningPolicy, int minCatSize, int outsider)
auto combinations(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, const T2s &... tables)
auto selfCombinations(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, const T2s &... tables)
void for_(F func, std::index_sequence< Is... >)
auto selfPairCombinations(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider)
void dataSizeVariesBetweenColumns()
bool sameCategory(BinningIndex const &a, BinningIndex const &b)
Defining DataPointCompositeObject explicitly as copiable.
A struct, containing the root of the expression tree.
bool operator<(const BinningIndex &rhs) const
BinningIndex(int bin_, uint64_t index_)
CombinationsBlockFullIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T &outsider, Ts &&... tables)
typename CombinationsBlockIndexPolicyBase< BP, T, Ts... >::CombinationType CombinationType
CombinationsBlockFullIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T &outsider, const Ts &... tables)
void setTables(const Ts &... tables)
CombinationsBlockFullIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T &outsider)
void setTables(Ts &&... tables)
typename NTupleType< uint64_t, sizeof...(Ts)>::type IndicesType
void setTables(Ts &&... tables)
void setTables(const Ts &... tables)
CombinationsBlockFullSameIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, Ts &&... tables)
CombinationsBlockFullSameIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider)
CombinationsBlockFullSameIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, const Ts &... tables)
typename CombinationsBlockSameIndexPolicyBase< BP, T1, Ts... >::CombinationType CombinationType
std::array< std::vector< BinningIndex >, sizeof...(Ts)> mGroupedIndices
const int mCategoryNeighbours
void setRanges(const Ts &... tables)
void setTables(Ts &&... tables)
typename CombinationsIndexPolicyBase< Ts... >::CombinationType CombinationType
CombinationsBlockIndexPolicyBase(const BP &binningPolicy, int categoryNeighbours, const T &outsider, const Ts &... tables)
IndicesType mBeginIndices
void setRanges(Ts &&... tables)
uint64_t mSlidingWindowSize
CombinationsBlockIndexPolicyBase(const BP &binningPolicy, int categoryNeighbours, const T &outsider)
int currentWindowNeighbours()
void setTables(const Ts &... tables)
typename NTupleType< uint64_t, sizeof...(Ts)>::type IndicesType
CombinationsBlockIndexPolicyBase(const BP &binningPolicy, int categoryNeighbours, const T &outsider, Ts &&... tables)
IndicesType mCurrentIndices
CombinationsBlockSameIndexPolicyBase(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, int minWindowSize)
void setTables(T &&table, Ts &&... tables)
CombinationsBlockSameIndexPolicyBase(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, int minWindowSize, const T &table, const Ts &... tables)
void setTables(const T &table, const Ts &... tables)
CombinationsBlockSameIndexPolicyBase(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, int minWindowSize, T &&table, Ts &&... tables)
IndicesType mCurrentIndices
std::vector< BinningIndex > mGroupedIndices
void setRanges(const T &table)
const int mCategoryNeighbours
typename CombinationsIndexPolicyBase< T, Ts... >::CombinationType CombinationType
int currentWindowNeighbours()
const uint64_t mSlidingWindowSize
typename NTupleType< uint64_t, sizeof...(Ts)+1 >::type IndicesType
CombinationsBlockStrictlyUpperSameIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, Ts &&... tables)
void setTables(Ts &&... tables)
void setTables(const Ts &... tables)
CombinationsBlockStrictlyUpperSameIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, const Ts &... tables)
CombinationsBlockStrictlyUpperSameIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider)
typename CombinationsBlockSameIndexPolicyBase< BP, T1, Ts... >::CombinationType CombinationType
CombinationsBlockUpperIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T &outsider, Ts &&... tables)
void setTables(Ts &&... tables)
CombinationsBlockUpperIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T &outsider, const Ts &... tables)
void setTables(const Ts &... tables)
typename CombinationsBlockIndexPolicyBase< BP, T, Ts... >::CombinationType CombinationType
CombinationsBlockUpperIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T &outsider)
void setTables(Ts &&... tables)
CombinationsBlockUpperSameIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, Ts &&... tables)
CombinationsBlockUpperSameIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider, const Ts &... tables)
void setTables(const Ts &... tables)
CombinationsBlockUpperSameIndexPolicy(const BP &binningPolicy, int categoryNeighbours, const T1 &outsider)
typename CombinationsBlockSameIndexPolicyBase< BP, T1, Ts... >::CombinationType CombinationType
CombinationsFullIndexPolicy(Ts &&... tables)
CombinationsFullIndexPolicy()
typename CombinationsIndexPolicyBase< Ts... >::CombinationType CombinationType
CombinationsFullIndexPolicy(const Ts &... tables)
CombinationType value_type
CombinationsIterator & operator++()
~CombinationsIterator()=default
CombinationType & reference
CombinationsIterator operator++(int)
CombinationsIterator(CombinationsIterator const &)=default
CombinationsIterator & operator=(CombinationsIterator const &)=default
std::forward_iterator_tag iterator_category
CombinationsIterator()=delete
CombinationType * pointer
friend bool operator==(const CombinationsIterator &lh, const CombinationsIterator &rh)
CombinationsIterator(const P &policy)
const_iterator begin() const
const_iterator end() const
~CombinationsGenerator()=default
CombinationsGenerator(const P &policy)
CombinationsIterator iterator
CombinationsGenerator()=delete
typename P::CombinationType CombinationType
std::shared_ptr< std::tuple< Ts... > > mTables
CombinationsIndexPolicyBase()
CombinationsIndexPolicyBase(Tss &&... tables)
void setTables(const Ts &... tables)
typename NTupleType< uint64_t, sizeof...(Ts)>::type IndicesType
void setTables(Tss &&... tables)
CombinationsIndexPolicyBase(const Tss &... tables)
std::tuple< typename Ts::iterator... > CombinationType
typename CombinationsIndexPolicyBase< Ts... >::CombinationType CombinationType
void setTables(const Ts &... tables)
void setRanges(const Ts &... tables)
void setTables(Ts &&... tables)
CombinationsStrictlyUpperIndexPolicy()
CombinationsStrictlyUpperIndexPolicy(Ts &&... tables)
CombinationsStrictlyUpperIndexPolicy(const Ts &... tables)
typename CombinationsIndexPolicyBase< Ts... >::CombinationType CombinationType
CombinationsUpperIndexPolicy(Ts &&... tables)
CombinationsUpperIndexPolicy()
CombinationsUpperIndexPolicy(const Ts &... tables)
std::tuple< REST... > type
typename NTupleType< T, N - 1, T, REST... >::type type