diff --git a/include/sg14/inplace_vector.h b/include/sg14/inplace_vector.h index 253e70d..2a73879 100644 --- a/include/sg14/inplace_vector.h +++ b/include/sg14/inplace_vector.h @@ -250,13 +250,15 @@ class inplace_vector : ipvbase_assignable, ipvbase_t { } std::destroy(data() + n, data() + size_); set_size_(n); + } else if (n > N) { + SG14_INPLACE_VECTOR_THROW(std::bad_alloc()); } else { size_t m = size_; for (size_t i = 0; i < m; ++i) { (*this)[i] = value; } for (size_t i = m; i < n; ++i) { - push_back(value); + unchecked_push_back(value); } } } @@ -324,9 +326,11 @@ class inplace_vector : ipvbase_assignable, ipvbase_t { constexpr void resize(size_type n) { if (n < size_) { erase(begin() + n, end()); + } else if (n > N) { + SG14_INPLACE_VECTOR_THROW(std::bad_alloc()); } else { for (size_t i = n - size_; i != 0; --i) { - emplace_back(); + unchecked_emplace_back(); } } } @@ -334,9 +338,11 @@ class inplace_vector : ipvbase_assignable, ipvbase_t { constexpr void resize(size_type n, const value_type& value) { if (n < size_) { erase(begin() + n, end()); + } else if (n > N) { + SG14_INPLACE_VECTOR_THROW(std::bad_alloc()); } else { for (size_t i = n - size_; i != 0; --i) { - push_back(value); + unchecked_push_back(value); } } } diff --git a/test/inplace_vector_test.cpp b/test/inplace_vector_test.cpp index c17d206..c939f2b 100644 --- a/test/inplace_vector_test.cpp +++ b/test/inplace_vector_test.cpp @@ -1256,4 +1256,37 @@ TEST(inplace_vector, Comparison) #endif } +TEST(inplace_vector, Reserve) +{ + sg14::inplace_vector v = {1,2,3}; + v.reserve(0); + EXPECT_EQ(v.capacity(), 10u); + v.reserve(5); + EXPECT_EQ(v.capacity(), 10u); + v.reserve(10); + EXPECT_EQ(v.capacity(), 10u); + ASSERT_THROW(v.reserve(11), std::bad_alloc); + v.shrink_to_fit(); + EXPECT_EQ(v.capacity(), 10u); + EXPECT_EQ(v, (sg14::inplace_vector{1,2,3})); +} + +TEST(inplace_vector, Resize) +{ + sg14::inplace_vector v; + v.resize(2); + EXPECT_EQ(v, (sg14::inplace_vector{"", ""})); + v.resize(1, "a"); + EXPECT_EQ(v, (sg14::inplace_vector{""})); + v.resize(3, "b"); + EXPECT_EQ(v, (sg14::inplace_vector{"", "b", "b"})); + v.resize(4); + EXPECT_EQ(v, (sg14::inplace_vector{"", "b", "b", ""})); + v.resize(2, "c"); + EXPECT_EQ(v, (sg14::inplace_vector{"", "b"})); + ASSERT_THROW(v.resize(5), std::bad_alloc); + ASSERT_THROW(v.resize(6, "d"), std::bad_alloc); + EXPECT_EQ(v, (sg14::inplace_vector{"", "b"})); // unchanged +} + #endif // __cplusplus >= 201703