1 #ifndef GAUDIKERNEL_SMARTRANGES_H 2 #define GAUDIKERNEL_SMARTRANGES_H 1 16 #include "boost/iterator/iterator_facade.hpp" 17 #include "boost/iterator/filter_iterator.hpp" 18 #include "boost/iterator/transform_iterator.hpp" 44 template <
class ITERATOR,
class MASK>
46 :
public boost::iterator_facade<masked_iterator<ITERATOR,MASK>,
47 typename std::iterator_traits<ITERATOR>::value_type,
48 boost::forward_traversal_tag,
49 typename std::iterator_traits<ITERATOR>::reference,
50 typename std::iterator_traits<ITERATOR>::difference_type>
107 template <
class ITERATOR,
class INDICES>
109 public boost::iterator_facade<index_iterator<ITERATOR,INDICES>,
110 typename std::iterator_traits<ITERATOR>::value_type,
111 boost::forward_traversal_tag,
112 typename std::iterator_traits<ITERATOR>::reference,
113 typename std::iterator_traits<ITERATOR>::difference_type>
119 , m_size (
std::distance ( b , e ) )
120 , m_indices ( indices )
126 , m_size (
std::distance ( b , e ) )
127 , m_indices ( indices )
140 friend class boost::iterator_core_access ;
143 if (
m_index < m_indices.size() )
153 ITERATOR it = m_begin ;
154 if (
m_index < m_indices.size() )
163 (
m_index == m_indices.size() ) &&
205 template <
class PREDICATE,
class CONTAINER>
212 return { ITER( p , c.begin() ) , ITER ( p , c.end () ) } ;
243 template <
class FUNCTOR,
class CONTAINER>
250 return { ITER ( c.begin() , f ) , ITER ( c.end () , f ) } ;
278 template<
class MASK,
class CONTAINER>
280 Gaudi::Range_<typename Gaudi::details::container<CONTAINER>::Container,
284 typedef Gaudi::details::masked_iterator<typename Gaudi::details::container<CONTAINER>::Iterator,MASK> ITER ;
285 if ( m.size() > c.size() ) { m.resize( c.size() ) ; }
286 return { ITER (
std::move(m) , c.begin() ) , ITER () } ;
316 template<
class INDICES,
class CONTAINER>
318 Gaudi::Range_<typename Gaudi::details::container<CONTAINER>::Container,
325 typedef Gaudi::details::index_iterator<typename Gaudi::details::container<CONTAINER>::Iterator,INDICES> ITER ;
326 return { ITER (
std::move(m) , c.begin() , c.end() ) , ITER () } ;
333 #endif // GAUDIKERNEL_SMARTRANGES_H index_iterator(const INDICES &indices, ITERATOR b, ITERATOR e)
Gaudi::Range_< typename Gaudi::details::container< CONTAINER >::Container, Gaudi::details::masked_iterator< typename Gaudi::details::container< CONTAINER >::Iterator, MASK > > make_mask_range(MASK m, const CONTAINER &c)
create "masking" range with mask
masked_iterator(const MASK &mask, ITERATOR b)
bool equal(const masked_iterator &other) const
std::iterator_traits< ITERATOR >::reference dereference() const
"index" iterator iterates ober "indiced" intries in the cotainer/range
bool equal(const index_iterator &other) const
"masked" iterator iterates ober "masked" intries in the cotainner/range
This file has been imported from LoKi project "C++ ToolKit for Smart and Friendly Physics Analysis" ...
index_iterator(INDICES &&indices, ITERATOR b, ITERATOR e)
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
masked_iterator(MASK &&mask, ITERATOR b)
Gaudi::Range_< typename Gaudi::details::container< CONTAINER >::Container, boost::transform_iterator< FUNCTOR, typename Gaudi::details::container< CONTAINER >::Iterator > > make_transform_range(FUNCTOR f, const CONTAINER &c)
create "transform" range with functors
Useful class for representation of "sequence" of the objects through the range of valid iterators...
std::iterator_traits< ITERATOR >::reference dereference() const
Gaudi::Range_< typename Gaudi::details::container< CONTAINER >::Container, Gaudi::details::index_iterator< typename Gaudi::details::container< CONTAINER >::Iterator, INDICES > > make_index_range(INDICES m, const CONTAINER &c)
create "index" range with indices
friend class boost::iterator_core_access
Gaudi::Range_< typename Gaudi::details::container< CONTAINER >::Container, boost::filter_iterator< PREDICATE, typename Gaudi::details::container< CONTAINER >::Iterator > > make_filter_range(PREDICATE p, const CONTAINER &c)
create a filtering range with predicate
Helper functions to set/get the application return code.