From 84203ee817c84f7305cf33fad07ea443bd987f2d Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Mon, 24 Oct 2016 00:48:15 +0200 Subject: [PATCH] Fix broken build when using the get_at() way wrapper. --- include/vectorwrapper/vectorwrapper.hpp | 14 ++++++++++---- include/vectorwrapper/vectorwrapper.inl | 18 +++++++++++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/include/vectorwrapper/vectorwrapper.hpp b/include/vectorwrapper/vectorwrapper.hpp index 5ecd234..cce5979 100644 --- a/include/vectorwrapper/vectorwrapper.hpp +++ b/include/vectorwrapper/vectorwrapper.hpp @@ -167,6 +167,9 @@ namespace vwr { template VecBase& operator/= ( const VecBase& parOther ); private: + template + void assign_values (const bt::index_seq&, Args... parArgs); + vector_type m_wrapped; }; @@ -189,12 +192,15 @@ namespace vwr { private: static_assert(HasGetAtMethod>::value, "You must provide a get_at() static method for this vector_type"); typedef typename VectorWrapperInfo::scalar_type scalar_type; - using get_at_func = decltype(&VectorWrapperInfo::get_at)(std::size_t, scalar_type&); - static_assert(not std::is_rvalue_reference::type>::value, "rvalue ref return types not implemented"); - static_assert(std::is_lvalue_reference::type>::value, "Read-only vectors not implemented"); + typedef T vector_type; + using get_at_func = decltype(&VectorWrapperInfo::get_at)(std::size_t, vector_type&); + using get_at_rettype = typename std::result_of::type; + + static_assert(not std::is_rvalue_reference::value, "rvalue ref return types not implemented"); + static_assert(std::is_lvalue_reference::value, "Read-only vectors not implemented"); public: - static typename VectorWrapperInfo::scalar_type& get_at ( T& parVec, std::size_t parIndex ); + static get_at_rettype get_at ( T& parVec, std::size_t parIndex ); }; template struct Vec1Promotion; diff --git a/include/vectorwrapper/vectorwrapper.inl b/include/vectorwrapper/vectorwrapper.inl index 08d700f..6d0f438 100644 --- a/include/vectorwrapper/vectorwrapper.inl +++ b/include/vectorwrapper/vectorwrapper.inl @@ -41,10 +41,18 @@ namespace vwr { VecGetter::get_at(m_wrapped, 0) = parX; VecGetter::get_at(m_wrapped, 1) = parY; - const scalar_type args[sizeof...(Args)] = {parArgs...}; - for (std::size_t z = 0; z < sizeof...(Args); ++z) { - VecGetter::get_at(m_wrapped, z + 2) = args[z]; - } + assign_values(bt::index_range<2, dimensions>(), std::forward(parArgs)...); + } + + template + template + void VecBase::assign_values (const bt::index_seq&, Args... parArgs) { + static_assert(sizeof...(I) == sizeof...(Args), "Argument count and indices count mismatch"); + + std::initializer_list t { + (VecGetter::get_at(m_wrapped, I) = parArgs)... + }; + static_cast(t); } template @@ -143,7 +151,7 @@ namespace vwr { } template - typename VectorWrapperInfo::scalar_type& VecGetter::get_at (T& parVec, std::size_t parIndex) { + auto VecGetter::get_at (T& parVec, std::size_t parIndex) -> get_at_rettype { assert(parIndex < VectorWrapperInfo::dimensions); return VectorWrapperInfo::get_at(parIndex, parVec); }