From 870d5eb77665553f1800045877b1a4d577657bff Mon Sep 17 00:00:00 2001 From: Vasileios Karakasis <karakasis@cscs.ch> Date: Sun, 16 Oct 2016 17:04:23 +0200 Subject: [PATCH] Fixes Clang 7.0 failure to compile. * Container assignment requires that the elements of the target container are copy constructible, whereas `unique_ptr`s in Clang 7.0 are only move constructible, preventing `rangeutil.hpp` from compiling. * Includes correct header (`<numeric>`) that provides `std::accumulate()`. --- src/cell.hpp | 1 - src/util/rangeutil.hpp | 32 +++++++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/cell.hpp b/src/cell.hpp index 11f938f5..6cadd28d 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 46101e3e..7d13aa0b 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; } -- GitLab