Skip to content
Snippets Groups Projects
multiindex.hh 1.12 KiB
#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