//===-- llvm/ADT/CombinationGenerator.h ------------------------*- C++ -*--===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// Combination generator. /// /// Example: given input {{0, 1}, {2}, {3, 4}} it will produce the following /// combinations: {0, 2, 3}, {0, 2, 4}, {1, 2, 3}, {1, 2, 4}. /// /// It is useful to think of input as vector-of-vectors, where the /// outer vector is the variable space, and inner vector is choice space. /// The number of choices for each variable can be different. /// /// As for implementation, it is useful to think of this as a weird number, /// where each digit (==variable) may have different base (==number of choices). /// Thus modelling of 'produce next combination' is exactly analogous to the /// incrementing of an number - increment lowest digit (pick next choice for the /// variable), and if it wrapped to the beginning then increment next digit. /// //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_COMBINATIONGENERATOR_H #define LLVM_ADT_COMBINATIONGENERATOR_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLFunctionalExtras.h" #include "llvm/ADT/SmallVector.h" #include <cassert> #include <cstring> namespace llvm { template <typename choice_type, typename choices_storage_type, int variable_smallsize> class CombinationGenerator { … }; } // namespace llvm #endif