#ifndef MULTI_INDEX_HH #define MULTI_INDEX_HH #include <vector> /** \brief A multi-index */ class MultiIndex : public std::vector<unsigned int> { // The range of each component unsigned int limit_; public: /** \brief Constructor with a given range for each digit * \param n Number of digits */ MultiIndex(unsigned int n, unsigned int limit) : std::vector<unsigned int>(n), limit_(limit) { std::fill(this->begin(), this->end(), 0); } /** \brief Increment the MultiIndex */ MultiIndex& operator++() { for (size_t i=0; i<size(); i++) { // Augment digit (*this)[i]++; // If there is no carry-over we can stop here if ((*this)[i]<limit_) break; (*this)[i] = 0; } return *this; } /** \brief Compute how many times you can call operator++ before getting to (0,...,0) again */ size_t cycle() const { size_t result = 1; for (size_t i=0; i<size(); i++) result *= limit_; return result; } }; #endif