From 32ae9a2d3d2fda3148ffd9b7e6c58d05ba91e4ad Mon Sep 17 00:00:00 2001 From: Patrick Date: Mon, 29 Jul 2024 18:31:05 +0200 Subject: [PATCH] fixed swap() --- include/const_vector.hpp | 8 ++++---- include/helper.h | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/include/const_vector.hpp b/include/const_vector.hpp index 79b2b89..ec67b78 100644 --- a/include/const_vector.hpp +++ b/include/const_vector.hpp @@ -527,13 +527,13 @@ namespace cc { template constexpr const_vector::reference const_vector::emplace_back(Args&&... args) { - emplace(end(), std::forward(args)...); + return *emplace(cend(), std::forward(args)...); } template constexpr void const_vector::pop_back() { - _erase_no_move(end() - 1, end()); + std::destroy_n(end() - 1, 1); --_size; } @@ -541,9 +541,9 @@ namespace cc { template constexpr void const_vector::swap(const_vector &other) { - if (_size > other._len || other._size > N) throw std::exception(); + if (_size > other._len || other._size > N) throw std::invalid_argument("Cannot swap elements, one does not fit into the other"); - cc::helper::swap_iter_range(begin(), end(), std::end(_arr), other.begin(), other.end(), std::end(other._arr)); + cc::helper::swap_iter_range(begin(), end(), other.begin(), other.end()); std::swap(_size, other._size); } diff --git a/include/helper.h b/include/helper.h index ec91fa2..7abc3f1 100644 --- a/include/helper.h +++ b/include/helper.h @@ -15,10 +15,10 @@ namespace cc::helper { template constexpr std::size_t array_size(const T(&)[N]) { return N; } - template - requires ((InputIt1::value_type == InputIt2::value_type) - && std::indirectly_writable && std::indirectly_readable - && std::indirectly_writable && std::indirectly_readable) + template + requires std::is_same_v::value_type, typename std::iterator_traits::value_type> + && std::indirectly_writable::value_type> && std::indirectly_readable + && std::indirectly_writable::value_type> && std::indirectly_readable constexpr void swap_iter_range(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) { auto dist1 = std::distance(first1, last1); @@ -31,7 +31,7 @@ namespace cc::helper { auto swap_dist = std::min(dist1, dist2); - std::swap_ranges(first1, std::next(first1, swap_dist), first2, std::next(first2, swap_dist)); + std::swap_ranges(first1, std::next(first1, swap_dist), first2); std::advance(first1, swap_dist); std::advance(first2, swap_dist); @@ -43,10 +43,10 @@ namespace cc::helper { } } - template - requires ((InputIt1::value_type == InputIt2::value_type) - && std::indirectly_writable && std::indirectly_readable - && std::indirectly_writable && std::indirectly_readable) + template + requires std::is_same_v::value_type, typename std::iterator_traits::value_type> + && std::indirectly_writable::value_type> && std::indirectly_readable + && std::indirectly_writable::value_type> && std::indirectly_readable constexpr void swap(InputIt1 first1, InputIt1 last1, InputIt1 end1, InputIt2 first2, InputIt2 last2, InputIt2 end2) { auto max_dist = std::min(std::distance(first1, end1), std::distance(first2, end2));