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;
98 const indices_collection&
indices,
99 const indices_collection&
combo,
110 typedef typename boost::filter_iterator<IndexInSet, index_iter>
ComboIter;
111 typedef typename boost::transform_iterator<ValueAccessor, ComboIter>
ValueIter;
138 indices_collection newCombo(
combo_);
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()) {
173 index_type next_pos_value = (*pos) + 1;
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> {
222 friend class boost::iterator_core_access;
233 template <
typename T>
259 indices_collection initialCombo(choose);
260 indices_collection finalCombo(choose);
262 size_t totalElements = end -
begin;
264 if (choose <= totalElements) {
265 indices_collection allIndices(totalElements);
266 for (
size_t i = 0;
i < totalElements; ++
i) {
273 finalCombo[
i] = totalElements;
283 beginning_ = CombIterPtr(
286 ending_ = CombIterPtr(
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.
Container::value_type value_type
ValueAccessor(const value_iter &begin)
CombinatoricGenerator(const value_iter &begin, const value_iter &end, size_t choose)
Combinatoric(const value_iter &begin, const indices_collection &indices, const indices_collection &combo, bool done)
bool equal(CombinatoricIterator const &other) const
indices_collection indices_
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.
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
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)