diff --git a/math/vecops/inc/ROOT/RVec.hxx b/math/vecops/inc/ROOT/RVec.hxx index 04ea8348a1f0327b8e4310d6d5365e8e4ba8db45..073b4dff2bfbf4b2a0f3e1190ac8246a4f62dca9 100644 --- a/math/vecops/inc/ROOT/RVec.hxx +++ b/math/vecops/inc/ROOT/RVec.hxx @@ -1408,6 +1408,29 @@ RVec<T> Where(const RVec<int> &c, T v1, T v2) return r; } +/// Return the concatenation of two RVecs. +/// +/// Example code, at the ROOT prompt: +/// ~~~{.cpp} +/// using namespace ROOT::VecOps; +/// RVec<float> rvf {0.f, 1.f, 2.f}; +/// RVec<int> rvi {7, 8, 9}; +/// Concatenate(rvf, rvi); +/// // (ROOT::VecOps::RVec<float>) { 2.0000000, 4.0000000, 4.0000000 } +/// ~~~ +template <typename T0, typename T1, typename Common_t = typename std::common_type<T0, T1>::type> +RVec<Common_t> Concatenate(const RVec<T0> &v0, const RVec<T1> &v1) +{ + RVec<Common_t> res; + res.reserve(v0.size() + v1.size()); + auto &resAsVect = res.AsVector(); + auto &v0AsVect = v0.AsVector(); + auto &v1AsVect = v1.AsVector(); + resAsVect.insert(resAsVect.begin(), v0AsVect.begin(), v0AsVect.end()); + resAsVect.insert(resAsVect.end(), v1AsVect.begin(), v1AsVect.end()); + return res; +} + //////////////////////////////////////////////////////////////////////////////// /// Print a RVec at the prompt: template <class T>