1 #ifndef RecoTauTag_RecoTau_CombinatoricGenerator_h
2 #define RecoTauTag_RecoTau_CombinatoricGenerator_h
4 #include <boost/iterator/iterator_facade.hpp>
5 #include <boost/iterator/filter_iterator.hpp>
6 #include <boost/iterator/transform_iterator.hpp>
48 namespace reco {
namespace tau {
70 typedef typename indices_collection::const_iterator
index_iter;
86 class ValueAccessor :
public std::unary_function<index_type const&, const value_type&>
111 typedef typename boost::filter_iterator<IndexInSet, index_iter>
ComboIter;
112 typedef typename boost::transform_iterator<ValueAccessor, ComboIter>
ValueIter;
140 size_t distanceFromEnd = 0;
142 indices_collection::reverse_iterator
pos = newCombo.rbegin();
143 for(; pos != newCombo.rend(); ++
pos, ++distanceFromEnd)
147 if( *pos < (nElements - 1 - distanceFromEnd) )
162 indices_collection::iterator forward_pos = pos.base();
167 if (forward_pos != newCombo.begin()) {
172 for (; forward_pos != newCombo.end(); ++forward_pos, ++next_pos_value) {
173 *forward_pos = next_pos_value;
212 CombinatoricIterator<T>,
213 const Combinatoric<T>,
214 boost::forward_traversal_tag>
271 size_t totalElements = end-
begin;
273 if (choose <= totalElements) {
275 for(
size_t i=0;
i < totalElements; ++
i)
280 for(
size_t i=0;
i < choose; ++
i)
284 finalCombo[
i] = totalElements;
288 begin, allIndices, initialCombo,
false)));
291 begin, allIndices, finalCombo,
true)));
CombinatoricIterator(const Combinatoric< T > &c)
CombinatoricIterator< T > end()
indices_collection combo_
Combinatoric< T > value_type
std::vector< index_type > indices_collection
indices_collection::const_iterator index_iter
const Combinatoric< T > & dereference() const
T::const_iterator value_iter
ValueIter combo_end() const
One past the last element in the selected subset.
ValueAccessor(const value_iter &begin)
CombinatoricGenerator(const value_iter &begin, const value_iter &end, size_t choose)
friend class boost::iterator_core_access
std::auto_ptr< CombinatoricIterator< T > > CombIterPtr
bool equal(CombinatoricIterator const &other) const
indices_collection indices_
Container::value_type value_type
boost::filter_iterator< IndexInSet, index_iter > ComboIter
T::const_iterator value_iter
ValueAccessor valueAccessor_
ValueIter remainder_begin() const
One past the last element in the non-selected subset.
bool operator()(const index_type &index) const
ValueIter remainder_end() const
The first element in the non-selected subset.
ValueIter combo_begin() const
The first element in the selected subset.
Combinatoric< T > next() const
Build the next cominatoric subset after the current one.
const indices_set & combo() const
Return the set of selected indices.
Combinatoric(const value_iter &begin, const indices_collection &indices, indices_collection combo, bool done)
CombinatoricIterator< T > iterator
indices_collection::iterator index_iter
std::vector< index_type > indices_collection
boost::transform_iterator< ValueAccessor, ComboIter > ValueIter
bool operator==(const Combinatoric< T > &rhs) const
Comparison to another combination.
std::set< index_type > indices_set
const value_type & operator()(index_type const &index) const
iterator::value_type::ValueIter combo_iterator
std::set< index_type > indices_set
CombinatoricIterator< T > begin()
IndexInSet(const indices_set &combo, bool negate)