diff --git a/Src/Adaptive/FVariadicParticleContainer.hpp b/Src/Adaptive/FVariadicParticleContainer.hpp index 85cfd214b9010c074866d130044493ca3e894a82..95b28ff9cd17b2922c06726a5428e34483750d25 100644 --- a/Src/Adaptive/FVariadicParticleContainer.hpp +++ b/Src/Adaptive/FVariadicParticleContainer.hpp @@ -132,18 +132,20 @@ public: position, args...); } - template<typename Position, typename... Args, std::size_t... Is, std::size_t... Js, typename... Ts> - void push_impl(inria::index_sequence<Is...>, - inria::index_sequence<Js...>, - const Position& position, - Args... args) { - using vt = typename FBase::value_type; - constexpr auto Dim = Particle::position_t::Dim; - constexpr int missing_offset = Dim + sizeof...(args); - - this->push_back(std::get<Is>(position)..., args..., - std::tuple_element_t<missing_offset + Js, vt>{}...); - } + template<typename Position, typename... Args, std::size_t... Is, + std::size_t... Js, typename... Ts > + void push_impl(inria::index_sequence<Is...>, + inria::index_sequence<Js...>, + const Position& position, + Args... args) + { + using vt = typename FBase::value_type; + constexpr auto Dim = Particle::position_t::Dim; + constexpr int missing_offset = Dim + sizeof...(args); + + this->push_back(std::get<Is>(position)..., args..., + std::tuple_element_t<missing_offset + Js, vt>{}...); + } /** * \brief Get size to send the container diff --git a/Src/Utils/variadic_container.hpp b/Src/Utils/variadic_container.hpp index d680f65f2760132474e089c506413901e8d4c764..9561848e343d8c093e80e8dff3e31ecde6b14181 100644 --- a/Src/Utils/variadic_container.hpp +++ b/Src/Utils/variadic_container.hpp @@ -8,6 +8,7 @@ #include <stdexcept> #include <tuple> #include <type_traits> +#include <utility> #include "FOstreamTuple.hpp" @@ -191,7 +192,7 @@ public: this->assign(first, last); } - variadic_vector_impl(const variadic_vector_impl& other) { + variadic_vector_impl( variadic_vector_impl& other) { this->assign(other.begin(), other.end()); } @@ -924,7 +925,7 @@ private: */ template <typename... Values> iterator insert_impl( - const_iterator pos, + iterator pos, size_type count, Values&&... values) { @@ -956,7 +957,7 @@ public: * \return An iterator pointing to the inserted element */ template <typename ValueTuple> - iterator insert(const_iterator pos, ValueTuple&& values) { + iterator insert(iterator pos, ValueTuple&& values) { static_assert(std::tuple_size<std::decay_t<ValueTuple>>::value == sizeof...(Indices), "Given tuple does not have the right size"); return insert_impl(pos, 1, std::get<Indices>(std::forward<ValueTuple>(values))...); @@ -973,7 +974,7 @@ public: * \return An iterator pointing to the first inserted element */ template <typename ValueTuple> - iterator insert(const_iterator pos, size_type count, ValueTuple&& values) { + iterator insert(iterator pos, size_type count, ValueTuple&& values) { static_assert(std::tuple_size<std::decay_t<ValueTuple>>::value == sizeof...(Indices), "Given tuple does not have the right size"); return insert_impl(pos, count, std::get<Indices>(std::forward<ValueTuple>(values))...); @@ -1036,7 +1037,7 @@ public: template<class TupleIterator, typename std::enable_if<is_tuple_get_like<TupleIterator>::value, char>::type = 0 > - iterator insert(const_iterator pos, TupleIterator first, TupleIterator last) { + iterator insert(iterator pos, TupleIterator first, TupleIterator last) { size_type pos_idx = pos - this->begin(); size_type count = last - first; @@ -1074,7 +1075,7 @@ public: template<class ValueIterator, typename std::enable_if<! is_tuple_get_like<ValueIterator>::value, char>::type = 0 > - iterator insert(const_iterator pos, ValueIterator first, ValueIterator last) { + iterator insert(iterator pos, ValueIterator first, ValueIterator last) { auto ret_offset = pos - this->cbegin(); while(first != last) { insert(pos, *first); @@ -1183,7 +1184,7 @@ public: * * \param values Values to insert into the sub-arrays */ - void push_back(const Types&... values) { + void push_back(Types const&... values) { this->insert_impl(this->end(), 1, values...); } @@ -1291,25 +1292,26 @@ public: template<typename... Types, std::size_t... Indices> -class variadic_vector_iterator<std::tuple<Types...>, inria::index_sequence<Indices...>> +class variadic_vector_iterator<std::tuple<Types...>, inria::index_sequence<Indices...> > : public std::tuple<Types*...> { - using base_t = std::tuple<Types*...>; - using value_tuple = std::tuple<typename std::remove_const<Types>::type...>; + using base_t = std::tuple<Types*...>; + using value_tuple = std::tuple<typename std::remove_const<Types>::type...>; using const_value_tuple = std::tuple<const Types...>; public: - using difference_type = std::ptrdiff_t; - using value_type = std::tuple<Types...>; - using reference = std::tuple<Types&...>; - using pointer = void; + using difference_type = std::ptrdiff_t; + using value_type = std::tuple<Types...>; + using reference = std::tuple<Types&...>; + using pointer = void; using iterator_category = std::random_access_iterator_tag; - - using pointer_tuple = std::tuple<Types*...>; + using base_seq = inria::index_sequence<Indices...> ; + using pointer_tuple = std::tuple<Types*...>; using typename base_t::tuple; variadic_vector_iterator(base_t tup_in) : base_t(tup_in){} + variadic_vector_iterator(base_t tup_in, base_seq t) : base_t(tup_in){} /* */ // variadic_vector_iterator(base_t tup_in):(tup_in){}