diff --git a/include/duckhandy/implem/reversed_sized_array_bt.hpp b/include/duckhandy/implem/reversed_sized_array_bt.hpp index 41b4ce8..257c80d 100644 --- a/include/duckhandy/implem/reversed_sized_array_bt.hpp +++ b/include/duckhandy/implem/reversed_sized_array_bt.hpp @@ -18,6 +18,7 @@ #ifndef idFC25566D624140559C54B39FFFE52F04 #define idFC25566D624140559C54B39FFFE52F04 +#include "../variadic_repeat_bt.hpp" #include #include #if !defined(INT_CONV_WITHOUT_HELPERS) @@ -37,13 +38,16 @@ namespace dhandy { using iterator = T*; constexpr ReversedSizedArray() = default; + constexpr ReversedSizedArray (const ReversedSizedArray&) = default; + constexpr ReversedSizedArray (ReversedSizedArray&&) = default; + template constexpr explicit ReversedSizedArray (Items&&... items); ~ReversedSizedArray() = default; constexpr std::size_t size() const { return S - (m_curr + 1); } constexpr bool empty() const { return m_curr + 1 == S; } constexpr const T operator[] (std::size_t idx) const { if (idx >= size()) throw std::out_of_range("Out of bound array access"); return m_data[idx + m_curr + 1]; } constexpr T& operator[] (std::size_t idx) { if (idx >= size()) throw std::out_of_range("Out of bound array access"); return m_data[idx + m_curr + 1]; } - constexpr void push_front (const T& itm) { if (size() == S) throw std::length_error("ReversedSizedArray is full"); m_data[m_curr--] = itm; } + constexpr void push_front (const T& itm) { /*if (size() == S) throw std::length_error("ReversedSizedArray is full");*/ m_data[m_curr--] = itm; } constexpr const T* data() const { return m_data + m_curr + 1; } constexpr const T* base_ptr() const { return m_data; } constexpr iterator begin() { return m_data + m_curr + 1; } @@ -67,6 +71,9 @@ namespace dhandy { #endif private: + template + constexpr explicit ReversedSizedArray (bt::variadic_repeat, Items&&... items); + T m_data[S]; std::size_t m_curr {S - 1}; }; @@ -78,6 +85,24 @@ namespace dhandy { } } //namespace implem + template + template + inline constexpr ReversedSizedArray::ReversedSizedArray (Items&&... items) : + ReversedSizedArray( + bt::make_variadic_repeat{}, + std::forward(items)... + ) + { } + + template + template + constexpr ReversedSizedArray::ReversedSizedArray (bt::variadic_repeat, Items&&... items) : + m_data{ItemsFill..., std::forward(items)...}, + m_curr(S - 1 - sizeof...(Items)) + { + static_assert(sizeof...(ItemsFill) + sizeof...(Items) == S, "Wrong number of input elements"); + } + #if !defined(INT_CONV_WITHOUT_HELPERS) template inline diff --git a/include/duckhandy/variadic_repeat_bt.hpp b/include/duckhandy/variadic_repeat_bt.hpp new file mode 100644 index 0000000..8c5262d --- /dev/null +++ b/include/duckhandy/variadic_repeat_bt.hpp @@ -0,0 +1,41 @@ +/* Copyright 2016-2024 Michele Santullo + * This file is part of "duckhandy". + * + * "duckhandy" is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * "duckhandy" is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with "duckhandy". If not, see . + */ + +#include + +namespace dhandy::bt { +template +struct variadic_repeat { +}; + +namespace detail { + template + struct VariadicRepeatBuilder; + + template + struct VariadicRepeatBuilder<0, T, V0, V...> { + typedef variadic_repeat type; + }; + + template + struct VariadicRepeatBuilder : public VariadicRepeatBuilder { + }; +} //namespace detail + +template +using make_variadic_repeat = typename detail::VariadicRepeatBuilder::type; +} //namespace dhandy::bt