rivet is hosted by Hepforge, IPPP Durham
Rivet 4.0.0
Container utils

Functions

template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
unsigned int Rivet::count (const CONTAINER &c)
 Return number of true elements in the container c .
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
unsigned int Rivet::count (const CONTAINER &c, const FN &f)
 Return number of elements in the container c for which f(x) is true.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
bool Rivet::any (const CONTAINER &c)
 Return true if x is true for any x in container c, otherwise false.
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
bool Rivet::any (const CONTAINER &c, const FN &f)
 Return true if f(x) is true for any x in container c, otherwise false.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
bool Rivet::all (const CONTAINER &c)
 Return true if x is true for all x in container c, otherwise false.
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
bool Rivet::all (const CONTAINER &c, const FN &f)
 Return true if f(x) is true for all x in container c, otherwise false.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
bool Rivet::none (const CONTAINER &c)
 Return true if x is false for all x in container c, otherwise false.
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
bool Rivet::none (const CONTAINER &c, const FN &f)
 Return true if f(x) is false for all x in container c, otherwise false.
 
template<typename CONTAINER1 , typename CONTAINER2 , typename FN = typename std::decay_t<CONTAINER2>::value_type( const typename std::decay_t<CONTAINER1>::value_type::ParticleBase&), typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER1>> && is_citerable_v<std::decay_t<CONTAINER2>> >>
const CONTAINER2 & Rivet::transform (const CONTAINER1 &in, CONTAINER2 &out, FN &&f)
 
template<typename CONTAINER1 , typename RTN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER1>> >>
std::vector< RTN > Rivet::transform (const CONTAINER1 &in, const std::function< RTN(typename CONTAINER1::value_type::ParticleBase)> &f)
 
template<typename CONTAINER1 , typename T , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER1>> >>
Rivet::accumulate (const CONTAINER1 &in, const T &init, const FN &f)
 A single-container-arg version of std::accumulate, aka reduce.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER::value_type Rivet::sum (const CONTAINER &c)
 Generic sum function, adding x for all x in container c.
 
template<typename CONTAINER , typename T , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
Rivet::sum (const CONTAINER &c, const T &start)
 
template<typename CONTAINER , typename T , typename FN = T(const typename std::decay_t<CONTAINER>::value_type&), typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
Rivet::sum (CONTAINER &&c, FN &&fn, const T &start=T())
 Generic sum function, adding fn(x) for all x in container c, starting with start.
 
template<typename CONTAINER , typename T , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
T & Rivet::isum (const CONTAINER &c, T &out)
 
template<typename CONTAINER , typename FN , typename T , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
T & Rivet::isum (const CONTAINER &c, const FN &f, T &out)
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::idiscard (CONTAINER &c, const FN &f)
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::idiscard (CONTAINER &c, const typename CONTAINER::value_type &y)
 Version with element-equality comparison in place of a function.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::idiscard_if_any (CONTAINER &c, const CONTAINER &ys)
 Version with several element-equality comparisons in place of a function.
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::discard (const CONTAINER &c, const FN &f)
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::discard (const CONTAINER &c, const typename CONTAINER::value_type &y)
 Version with element-equality comparison in place of a function.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::discard_if_any (const CONTAINER &c, const CONTAINER &ys)
 Version with several element-equality comparisons in place of a function.
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::discard (const CONTAINER &c, const FN &f, CONTAINER &out)
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::discard (const CONTAINER &c, const typename CONTAINER::value_type &y, CONTAINER &out)
 Version with element-equality comparison in place of a function.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::discard_if_any (const CONTAINER &c, const CONTAINER &ys, CONTAINER &out)
 Version with several element-equality comparisons in place of a function.
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::iselect (CONTAINER &c, const FN &f)
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::iselect_if_any (CONTAINER &c, const CONTAINER &ys)
 Version with several element-equality comparisons in place of a function.
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::select (const CONTAINER &c, const FN &f)
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::select_if_any (const CONTAINER &c, const CONTAINER &ys)
 Version with several element-equality comparisons in place of a function.
 
template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::select (const CONTAINER &c, const FN &f, CONTAINER &out)
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::select_if_any (const CONTAINER &c, const CONTAINER &ys, CONTAINER &out)
 Version with several element-equality comparisons in place of a function.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::slice (const CONTAINER &c, int i, int j)
 Slice of the container elements cf. Python's [i:j] syntax.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::slice (const CONTAINER &c, int i)
 Tail slice of the container elements cf. Python's [i:] syntax.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::head (const CONTAINER &c, int n)
 Head slice of the n first container elements.
 
template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::tail (const CONTAINER &c, int n)
 Tail slice of the n last container elements.
 
double Rivet::min (const vector< double > &in, double errval=DBL_NAN)
 Find the minimum value in the vector.
 
double Rivet::max (const vector< double > &in, double errval=DBL_NAN)
 Find the maximum value in the vector.
 
pair< double, double > Rivet::minmax (const vector< double > &in, double errval=DBL_NAN)
 Find the minimum and maximum values in the vector.
 
int Rivet::min (const vector< int > &in, int errval=-1)
 Find the minimum value in the vector.
 
int Rivet::max (const vector< int > &in, int errval=-1)
 Find the maximum value in the vector.
 
pair< int, int > Rivet::minmax (const vector< int > &in, int errval=-1)
 Find the minimum and maximum values in the vector.
 

Detailed Description

Function Documentation

◆ discard() [1/2]

template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::discard ( const CONTAINER &  c,
const FN &  f 
)
inline

Filter a collection by copy, removing the subset that passes the supplied function

Todo:
Use const std::function<bool(typename CONTAINER::value_type)>... but need polymorphism for ParticleBase

<

Todo:
More efficient would be copy_if with back_inserter...

References Rivet::idiscard().

◆ discard() [2/2]

template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::discard ( const CONTAINER &  c,
const FN &  f,
CONTAINER &  out 
)
inline

Filter a collection by copy into a supplied container, removing the subset that passes the supplied function

Note
New container will be replaced, not appended to
Todo:
Use const std::function<bool(typename CONTAINER::value_type)>... but need polymorphism for ParticleBase

References Rivet::discard().

◆ head()

template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::head ( const CONTAINER &  c,
int  n 
)
inline

Head slice of the n first container elements.

Negative n means to take the head excluding the n -element tail

References Rivet::slice().

◆ idiscard()

template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::idiscard ( CONTAINER &  c,
const FN &  f 
)
inline

Filter a collection in-place, removing the subset that passes the supplied function

Todo:
Use const std::function<bool(typename CONTAINER::value_type)>... but need polymorphism for ParticleBase

◆ iselect()

template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::iselect ( CONTAINER &  c,
const FN &  f 
)
inline

Filter a collection in-place, keeping the subset that passes the supplied function

Todo:
Use const std::function<bool(typename CONTAINER::value_type)>... but need polymorphism for ParticleBase

References Rivet::idiscard().

◆ isum() [1/2]

template<typename CONTAINER , typename FN , typename T , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
T & Rivet::isum ( const CONTAINER &  c,
const FN &  f,
T &  out 
)
inline

In-place generic sum function, adding fn(x) on to container out for all x in container c

Note
It's more more flexible here to not use CONTAINER::value_type, allowing implicit casting to T.

◆ isum() [2/2]

template<typename CONTAINER , typename T , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
T & Rivet::isum ( const CONTAINER &  c,
T &  out 
)
inline

In-place generic sum function, adding x on to container out for all x in container c

Note
It's more more flexible here to not use CONTAINER::value_type, allowing implicit casting to T.

◆ select() [1/2]

template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::select ( const CONTAINER &  c,
const FN &  f 
)
inline

Filter a collection by copy, keeping the subset that passes the supplied function

Todo:
Use const std::function<bool(typename CONTAINER::value_type)>... but need polymorphism for ParticleBase

<

Todo:
More efficient would be copy_if with back_inserter ... but is that equally container agnostic?

References Rivet::iselect().

◆ select() [2/2]

template<typename CONTAINER , typename FN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER & Rivet::select ( const CONTAINER &  c,
const FN &  f,
CONTAINER &  out 
)
inline

Filter a collection by copy into a supplied container, keeping the subset that passes the supplied function

Note
New container will be replaced, not appended to
Todo:
Use const std::function<bool(typename CONTAINER::value_type)>... but need polymorphism for ParticleBase

References Rivet::select().

◆ slice() [1/2]

template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::slice ( const CONTAINER &  c,
int  i 
)
inline

Tail slice of the container elements cf. Python's [i:] syntax.

Single-index specialisation of slice(c, i, j)

References Rivet::slice().

◆ slice() [2/2]

template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::slice ( const CONTAINER &  c,
int  i,
int  j 
)
inline

Slice of the container elements cf. Python's [i:j] syntax.

The element at the j index is not included in the returned container. i and j can be negative, treated as backward offsets from the end of the container.

Referenced by Rivet::head(), Rivet::DressedLepton::photons(), Rivet::slice(), and Rivet::tail().

◆ sum() [1/2]

template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER::value_type Rivet::sum ( const CONTAINER &  c)
inline

Generic sum function, adding x for all x in container c.

Note
Default-constructs the return type – not always possible! Supply an explicit start value if necessary.

◆ sum() [2/2]

template<typename CONTAINER , typename T , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
T Rivet::sum ( const CONTAINER &  c,
const T &  start 
)
inline

Generic sum function, adding x for all x in container c, starting with start

Note
It's more more flexible here to not use CONTAINER::value_type, allowing implicit casting to T.

◆ tail()

template<typename CONTAINER , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER>> >>
CONTAINER Rivet::tail ( const CONTAINER &  c,
int  n 
)
inline

Tail slice of the n last container elements.

Negative n means to take the tail from after the n th element

References Rivet::slice().

◆ transform() [1/2]

template<typename CONTAINER1 , typename RTN , typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER1>> >>
std::vector< RTN > Rivet::transform ( const CONTAINER1 &  in,
const std::function< RTN(typename CONTAINER1::value_type::ParticleBase)> &  f 
)
inline

A single-container-arg, return-value version of std::transform, aka map

Todo:
Make the function template polymorphic... or specific to ParticleBase

◆ transform() [2/2]

template<typename CONTAINER1 , typename CONTAINER2 , typename FN = typename std::decay_t<CONTAINER2>::value_type( const typename std::decay_t<CONTAINER1>::value_type::ParticleBase&), typename = std::enable_if_t< is_citerable_v<std::decay_t<CONTAINER1>> && is_citerable_v<std::decay_t<CONTAINER2>> >>
const CONTAINER2 & Rivet::transform ( const CONTAINER1 &  in,
CONTAINER2 &  out,
FN &&  f 
)
inline

A single-container-arg version of std::transform

Todo:
Make the function template specific to ParticleBase or introduce C++20 concepts