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> 69 typedef typename indices_collection::const_iterator
index_iter;
110 typedef typename boost::filter_iterator<IndexInSet, index_iter>
ComboIter;
111 typedef typename boost::transform_iterator<ValueAccessor, ComboIter>
ValueIter;
146 size_t distanceFromEnd = 0;
148 indices_collection::reverse_iterator
pos = newCombo.rbegin();
149 for (;
pos != newCombo.rend(); ++
pos, ++distanceFromEnd) {
152 if (*
pos < (nElements - 1 - distanceFromEnd)) {
166 indices_collection::iterator forward_pos =
pos.base();
171 if (forward_pos != newCombo.begin()) {
176 for (; forward_pos != newCombo.end(); ++forward_pos, ++next_pos_value) {
177 *forward_pos = next_pos_value;
213 template <
typename T>
215 :
public boost::iterator_facade<CombinatoricIterator<T>, const Combinatoric<T>, boost::forward_traversal_tag> {
233 template <
typename T>
264 if (
choose <= totalElements) {
266 for (
size_t i = 0;
i < totalElements; ++
i) {
273 finalCombo[
i] = totalElements;
CombinatoricIterator(const Combinatoric< T > &c)
CombinatoricIterator< T > end()
indices_collection combo_
Combinatoric< T > value_type
ValueIter combo_end() const
One past the last element in the selected subset.
std::vector< index_type > indices_collection
bool operator==(const Combinatoric< T > &rhs) const
Comparison to another combination.
indices_collection::const_iterator index_iter
ValueIter remainder_begin() const
One past the last element in the non-selected subset.
T::const_iterator value_iter
ValueIter combo_begin() const
The first element in the selected subset.
Combinatoric< T > next() const
Build the next cominatoric subset after the current one.
Container::value_type value_type
ValueAccessor(const value_iter &begin)
CombinatoricGenerator(const value_iter &begin, const value_iter &end, size_t choose)
const Combinatoric< T > & dereference() const
friend class boost::iterator_core_access
Combinatoric(const value_iter &begin, const indices_collection &indices, const indices_collection &combo, bool done)
const indices_set & combo() const
Return the set of selected indices.
bool equal(CombinatoricIterator const &other) const
indices_collection indices_
boost::filter_iterator< IndexInSet, index_iter > ComboIter
bool operator()(const index_type &index) const
const value_type & operator()(index_type const &index) const
T::const_iterator value_iter
ValueAccessor valueAccessor_
ValueIter remainder_end() const
The first element in the non-selected subset.
CombinatoricIterator< T > iterator
indices_collection::iterator index_iter
std::vector< index_type > indices_collection
std::unique_ptr< CombinatoricIterator< T > > CombIterPtr
boost::transform_iterator< ValueAccessor, ComboIter > ValueIter
std::set< index_type > indices_set
iterator::value_type::ValueIter combo_iterator
std::set< index_type > indices_set
CombinatoricIterator< T > begin()
IndexInSet(const indices_set &combo, bool negate)