diff --git a/src/cell.hpp b/src/cell.hpp index 11f938f52f3e4e69a35f9a3eb951ca2fce95cbd6..6cadd28d70435672cd64a57cfd3b57ba22da6299 100644 --- a/src/cell.hpp +++ b/src/cell.hpp @@ -242,4 +242,3 @@ cable_segment* cell::add_cable(cell::index_type parent, Args ...args) } // namespace mc } // namespace nest - diff --git a/src/util/rangeutil.hpp b/src/util/rangeutil.hpp index 46101e3eef8160124d73d60e730c31d34c85f7c1..7d13aa0bd8c352b91de574f621f56eeeab87be4d 100644 --- a/src/util/rangeutil.hpp +++ b/src/util/rangeutil.hpp @@ -7,10 +7,12 @@ #include <algorithm> #include <iterator> +#include <numeric> #include <util/meta.hpp> #include <util/range.hpp> #include <util/transform.hpp> +#include <util/meta.hpp> namespace nest { namespace mc { @@ -60,18 +62,42 @@ Container& append(Container &c, const Seq& seq) { // Assign sequence to a container template <typename AssignableContainer, typename Seq> -AssignableContainer& assign(AssignableContainer& c, const Seq& seq) { +enable_if_t< + std::is_copy_constructible<typename AssignableContainer::value_type>::value, + AssignableContainer& +> +assign(AssignableContainer& c, const Seq& seq) { auto canon = canonical_view(seq); c.assign(std::begin(canon), std::end(canon)); return c; } + +// This version of assing is needed for assigning segment_ptr's (i.e., +// unique_ptr's) with Clang + +template<typename AssignableContainer, typename Seq> +enable_if_t< + !std::is_copy_constructible<typename AssignableContainer::value_type>::value && + std::is_move_constructible<typename AssignableContainer::value_type>::value, + AssignableContainer& +> +assign(AssignableContainer& c, const Seq& seq) +{ + auto citer = c.begin(); + for (auto s : canonical_view(seq)) { + *citer = std::move(s); + } + + return c; +} + + // Assign sequence to a container with transform `proj` template <typename AssignableContainer, typename Seq, typename Proj> AssignableContainer& assign_by(AssignableContainer& c, const Seq& seq, const Proj& proj) { - auto canon = canonical_view(transform_view(seq, proj)); - c.assign(std::begin(canon), std::end(canon)); + assign(c, transform_view(seq, proj)); return c; }