5#ifndef BALL_CONCEPT_ENUMERATOR_H
6#define BALL_CONCEPT_ENUMERATOR_H
12#ifndef BALL_COMMON_EXCEPTION_H
16#ifndef BALL_COMMON_RTTI_H
20#ifndef BALL_CONCEPT_FORWARDITERATOR_H
46 :
private std::vector<Position>
77 template <
typename Variant,
typename VariantIterator>
78 EnumeratorIndex(
const std::list<std::pair<VariantIterator, std::vector<Variant> > >& variant_list);
100 template <
typename Variant,
typename VariantIterator>
101 const EnumeratorIndex& operator = (
const std::list<std::pair<VariantIterator, std::vector<Variant> > >& variant_list);
203 std::vector<Size> modulus_;
205 std::vector<Size> base_multipliers_;
209 template <
typename Variant,
typename VariantIterator>
212 modulus_(variant_list.size()),
213 base_multipliers_(variant_list.size())
219 template <
typename Variant,
typename VariantIterator>
221 (
const std::list<std::pair<VariantIterator, std::vector<Variant> > >& variant_list)
223 resize(variant_list.size());
224 modulus_.resize(variant_list.size());
225 base_multipliers_.resize(variant_list.size());
230 typename std::list<std::pair<VariantIterator, std::vector<Variant> > >::const_iterator list_it = variant_list.begin();
231 for (i = (
Size)(size() - 1); i >= 0; i--, list_it++)
234 modulus_[i] = (
Size)list_it->second.size();
236 base_multipliers_[i] = multiplier;
237 multiplier *= modulus_[i];
272 template <
class Container,
class SiteIterator,
class Variant>
300 typedef std::pair<SiteIterator, VariantVector>
Site;
361 typename SiteList::iterator var_it;
376 typename SiteList::iterator it;
379 total *= it->second.size();
428 friend class Enumerator<Container, SiteIterator, Variant>;
533 return bound_->getCurrent();
540 return bound_->getCurrent();
558 if (!
bound_->is_valid_position_
577 void mutate_(SiteIterator& it,
const Variant& v)
589 template <
typename Container,
typename SiteIterator,
typename Variant>
591 :
container_(const_cast<Container&>(
RTTI::getDefault<Container>())),
596 template <
typename Container,
typename SiteIterator,
typename Variant>
603 template <
typename Container,
typename SiteIterator,
typename Variant>
607 : container_(container),
613 template <
typename Container,
typename SiteIterator,
typename Variant>
620 template <
typename Container,
typename SiteIterator,
typename Variant>
634 template <
typename Container,
typename SiteIterator,
typename Variant>
646 mutate_(it->first, it->second[index[i]]);
652 template <
typename Container,
typename SiteIterator,
typename Variant>
659 template <
typename Container,
typename SiteIterator,
typename Variant>
666 template <
typename Container,
typename VariantConstIterator,
typename Variant>
673 template <
typename Container,
typename VariantConstIterator,
typename Variant>
681# ifndef BALL_NO_INLINE_FUNCTIONS
682# include <BALL/CONCEPT/enumerator.iC>
static ConstForwardIterator begin(const Container &container)
static ConstForwardIterator end(const Container &container)
IncompatibleIndex(const char *file, int line)
Size getModulus(Position pos) const
Position operator[](Position pos) const
const EnumeratorIndex & operator=(const EnumeratorIndex &rhs)
const std::vector< Size > & getModulus() const
const IteratorPosition & getPosition() const
IteratorTraits_(const ContainerType &enumerator)
ContainerPointer getContainer()
ContainerConstPointer getContainer() const
bool operator!=(const IteratorTraits_ &traits) const
const Enumerator< Container, SiteIterator, Variant > * ContainerConstPointer
Enumerator< Container, SiteIterator, Variant > ContainerType
IteratorPosition & getPosition()
Enumerator< Container, SiteIterator, Variant > * ContainerPointer
bool operator==(const IteratorTraits_ &traits) const
EnumeratorIndex position_
EnumeratorIndex IteratorPosition
const ValueType & getData() const
ForwardIterator< Enumerator< Container, SiteIterator, Variant >, Container, EnumeratorIndex *, IteratorTraits_ > Iterator
std::vector< Variant > VariantVector
void createCombination(const EnumeratorIndex &index)
std::pair< SiteIterator, VariantVector > Site
void mutate_(SiteIterator &it, const Variant &v)
Enumerator(Container &container, MutatorFunction mutator)
ConstForwardIterator< Enumerator< Container, SiteIterator, Variant >, Container, EnumeratorIndex *, IteratorTraits_ > ConstIterator
std::list< Site > SiteList
void createCombination(const Position index)
friend class IteratorTraits_
void addVariants(const SiteIterator &it, const VariantVector &variants)
Enumerator(Container &container)
ConstIterator begin() const
void deleteVariants(const SiteIterator &it, const VariantVector &variants)
static void defaultAssign_(Variant &a, const Variant &b)
ConstIterator end() const
void(* MutatorFunction)(Variant &, const Variant &)
EnumeratorIndex position_
static ForwardIterator begin(const Container &container)
static ForwardIterator end(const Container &container)