From c9218f7f17611151e5398b50795e38cf7153c7a2 Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Wed, 16 Dec 2015 13:02:30 +0100 Subject: [PATCH] added: a helper for interleaving vectors --- src/Utility/Utilities.C | 15 +++++++++++++++ src/Utility/Utilities.h | 9 +++++++++ 2 files changed, 24 insertions(+) diff --git a/src/Utility/Utilities.C b/src/Utility/Utilities.C index cc2f565f..36e1ba5b 100644 --- a/src/Utility/Utilities.C +++ b/src/Utility/Utilities.C @@ -400,3 +400,18 @@ void utl::merge (std::vector& a1, const std::vector& a2, if (std::find(k1.begin(),k1.end(),k2[i]) == k1.end()) a1.push_back(a2[i]); } + + +void utl::interleave(const std::vector& v1, const std::vector& v2, + std::vector& out, size_t n1, size_t n2) + +{ + out.resize(v1.size()+v2.size()); + auto it_v1 = v1.begin(); + auto it_v2 = v2.begin(); + for (auto it_out = out.begin(); it_out != out.end(); + it_out += n1+n2, it_v1 += n1, it_v2 += n2) { + std::copy(it_v1, it_v1+n1, it_out); + std::copy(it_v2, it_v2+n2, it_out+n1); + } +} diff --git a/src/Utility/Utilities.h b/src/Utility/Utilities.h index d0f5e9c5..3f646fb0 100644 --- a/src/Utility/Utilities.h +++ b/src/Utility/Utilities.h @@ -152,6 +152,15 @@ namespace utl const std::vector& in, std::vector& out, size_t offset_in = 0, int shift_idx = 0); + //! \brief Interleave vectors + //! \param[in] v1 The first array + //! \param[in] v2 The second array + //! \param[out] out The output array + //! \param[in] n1 Number of entries per node in first vector + //! \param[in] n2 Number of entries per node in second vector + void interleave(const std::vector& v1, const std::vector& v2, + std::vector& out, size_t n1 = 1, size_t n2 = 1); + //! \brief Searches for a real value in an ordered array of reals. //! \param[in] a The array of real values //! \param[in] v The value to search for