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);
110 const std::vector<Size>& getModulus()
const;
140 Size getSize()
const;
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>
292 typedef void (*MutatorFunction) (Variant&,
const Variant&);
300 typedef std::pair<SiteIterator, VariantVector>
Site;
336 Enumerator(Container& container, MutatorFunction mutator);
351 void addVariants(
const SiteIterator& it,
const VariantVector& variants)
353 variant_sites_.push_back(Site(it, variants));
354 position_ = variant_sites_;
361 typename SiteList::iterator var_it;
362 var_it = std::find(variant_sites_.begin(), variant_sites_.end(), Site(it, variants));
363 if (var_it != variant_sites_.end())
365 variant_sites_.erase(var_it);
367 position_ = variant_sites_;
376 typename SiteList::iterator it;
377 for (it = variant_sites_.begin(); it != variant_sites_.end(); ++it)
379 total *= it->second.size();
387 Container& getCurrent();
393 void createCombination(
const Position index);
400 void createCombination(
const EnumeratorIndex& index);
441 typedef EnumeratorIndex
456 position_(enumerator.variant_sites_),
473 return (bound_ == 0);
498 return (bound_ != 0);
505 past_the_end_ =
false;
511 past_the_end_ =
false;
522 past_the_end_ =
true;
527 return past_the_end_;
533 return bound_->getCurrent();
540 return bound_->getCurrent();
551 past_the_end_ =
true;
558 if (!bound_->is_valid_position_
559 || (position_ != bound_->position_))
561 bound_->createCombination(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>
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> 687 #endif // BALL_CONCEPT_ENUMERATOR_H
std::pair< SiteIterator, VariantVector > Site
Enumerator< Container, SiteIterator, Variant > * ContainerPointer
IteratorTraits_(const ContainerType &enumerator)
ForwardIterator< Enumerator< Container, SiteIterator, Variant >, Container, EnumeratorIndex *, IteratorTraits_ > Iterator
IteratorPosition & getPosition()
bool operator!=(const EnumeratorIndex &rhs) const
EnumeratorIndex position_
const ValueType & getData() const
EnumeratorIndex position_
std::list< Site > SiteList
static ConstForwardIterator end(const Container &container)
ContainerPointer getContainer()
BALL_EXPORT std::ostream & operator<<(std::ostream &os, const Exception::GeneralException &e)
ContainerConstPointer getContainer() const
EnumeratorIndex IteratorPosition
BALL_EXPORT bool operator>(const String &s1, const String &s2)
void mutate_(SiteIterator &it, const Variant &v)
Enumerator< Container, SiteIterator, Variant > ContainerType
std::vector< Variant > VariantVector
BALL_EXPORT bool operator!=(const String &s1, const String &s2)
const Enumerator< Container, SiteIterator, Variant > * ContainerConstPointer
void addVariants(const SiteIterator &it, const VariantVector &variants)
void createCombination(const Position index)
BALL_EXPORT bool operator>=(const String &s1, const String &s2)
BALL_EXPORT bool operator==(const String &s1, const String &s2)
ConstForwardIterator< Enumerator< Container, SiteIterator, Variant >, Container, EnumeratorIndex *, IteratorTraits_ > ConstIterator
const IteratorPosition & getPosition() const
static ForwardIterator end(const Container &container)
BALL_EXPORT bool operator<=(const String &s1, const String &s2)
-*- Mode: C++; tab-width: 2; -*-
static ConstForwardIterator begin(const Container &container)
const EnumeratorIndex & operator=(const EnumeratorIndex &rhs)
Position operator[](Position pos) const
static void defaultAssign_(Variant &a, const Variant &b)
static ForwardIterator begin(const Container &container)
void deleteVariants(const SiteIterator &it, const VariantVector &variants)
bool operator==(const EnumeratorIndex &rhs) const
BALL_EXPORT bool operator<(const String &s1, const String &s2)