Skip to content

Commit ec09767

Browse files
authored
move implementation into beman::inplace_vector namespace (#100)
* Rename namespace for consistency * Move from_range into details namespace * Add missing resize tests
1 parent b01eab4 commit ec09767

File tree

12 files changed

+164
-99
lines changed

12 files changed

+164
-99
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ Contributions are welcome.
4949

5050
#include <beman/inplace_vector/inplace_vector.hpp>
5151

52-
using namespace beman;
52+
using namespace beman::inplace_vector;
5353

5454
/**
5555
* Generates fibonacci sequence using inplace_vector.
@@ -93,21 +93,21 @@ Note this is not part of the standard Library and should not be relied on once
9393
`constexpr` requirement stabilize.
9494
9595
Example Usage:
96-
`static_assert(beman::has_constexpr_support<beman::inplace_vector<int, 5>>)`.
96+
`static_assert(beman::has_constexpr_support<beman::inplace_vector::inplace_vector<int, 5>>)`.
9797
9898
### Freestanding
9999
100-
`beman::freestanding::inplace_vector` implements a minimal freestanding version of the specification,
100+
`beman::inplace_vector::freestanding::inplace_vector` implements a minimal freestanding version of the specification,
101101
which marks all potentially throwing functions as `= deleted`.
102102
This is useful for platforms without exception support, as it will generate a compile-time error
103103
instead of a potential runtime error when trying to use a throwing function.
104104
105105
``` C++
106-
beman::inplace_vector<int, 1> iv;
106+
beman::inplace_vector::inplace_vector<int, 1> iv;
107107
iv.resize(0); // OK
108108
iv.resize(10); // will throw or abort
109109
110-
beman::freestanding::inplace_vector<int, 1> fs_iv;
110+
beman::inplace_vector::freestanding::inplace_vector<int, 1> fs_iv;
111111
fs_iv.resize(0); // will generate a compile-time error
112112
fs_iv.resize(10); // will generate a compile-time error
113113
```

examples/fibonacci.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#include <beman/inplace_vector/inplace_vector.hpp>
66

7-
using namespace beman;
7+
using namespace beman::inplace_vector;
88

99
/**
1010
* Generates fibonacci sequence using inplace_vector.

include/beman/inplace_vector/inplace_vector.hpp

Lines changed: 33 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,11 @@
3737
#endif
3838
#endif
3939

40-
// beman::from_range_t
41-
namespace beman {
40+
// Private utilities
41+
namespace beman::inplace_vector::details {
42+
4243
struct from_range_t {};
4344
inline constexpr from_range_t from_range;
44-
}; // namespace beman
45-
46-
// Private utilities
47-
namespace beman::details::inplace_vector {
4845

4946
// clang-format off
5047
// Smallest unsigned integer that can represent values in [0, N].
@@ -80,10 +77,7 @@ concept lessthan_comparable = requires(const T &a, const T &b) {
8077
{ a < b } -> std::convertible_to<bool>;
8178
};
8279

83-
} // namespace beman::details::inplace_vector
84-
8580
// Types implementing the `inplace_vector`'s storage
86-
namespace beman::details::inplace_vector {
8781
namespace storage {
8882

8983
// Storage for zero elements.
@@ -271,22 +265,20 @@ struct inplace_vector_base : private storage::storage_for<T, N> {
271265
// element access
272266

273267
constexpr reference operator[](size_type n) {
274-
return details::inplace_vector::index(*this, n);
268+
return details::index(*this, n);
275269
}
276270
constexpr const_reference operator[](size_type n) const {
277-
return details::inplace_vector::index(*this, n);
278-
}
279-
constexpr reference front() {
280-
return details::inplace_vector::index(*this, size_type(0));
271+
return details::index(*this, n);
281272
}
273+
constexpr reference front() { return details::index(*this, size_type(0)); }
282274
constexpr const_reference front() const {
283-
return details::inplace_vector::index(*this, size_type(0));
275+
return details::index(*this, size_type(0));
284276
}
285277
constexpr reference back() {
286-
return details::inplace_vector::index(*this, size() - size_type(1));
278+
return details::index(*this, size() - size_type(1));
287279
}
288280
constexpr const_reference back() const {
289-
return details::inplace_vector::index(*this, size() - size_type(1));
281+
return details::index(*this, size() - size_type(1));
290282
}
291283

292284
// [containers.sequences.inplace_vector.data], data access
@@ -361,7 +353,7 @@ struct inplace_vector_base : private storage::storage_for<T, N> {
361353
return unchecked_emplace_back(std::forward<T &&>(x));
362354
}
363355

364-
template <details::inplace_vector::container_compatible_range<T> R>
356+
template <details::container_compatible_range<T> R>
365357
constexpr std::ranges::borrowed_iterator_t<R> try_append_range(R &&rg)
366358
requires(std::constructible_from<T, std::ranges::range_reference_t<R>>)
367359
{
@@ -428,7 +420,7 @@ struct inplace_vector_base : private storage::storage_for<T, N> {
428420

429421
constexpr friend auto operator<=>(const inplace_vector_base &x,
430422
const inplace_vector_base &y)
431-
requires(beman::details::inplace_vector::lessthan_comparable<T>)
423+
requires(details::lessthan_comparable<T>)
432424
{
433425
if constexpr (std::three_way_comparable<T>) {
434426
return std::lexicographical_compare_three_way(x.begin(), x.end(),
@@ -514,19 +506,17 @@ struct inplace_vector_base : private storage::storage_for<T, N> {
514506
}
515507
};
516508

517-
} // namespace beman::details::inplace_vector
509+
} // namespace beman::inplace_vector::details
518510

519-
namespace beman {
511+
namespace beman::inplace_vector {
520512

521513
template <typename IV>
522514
concept has_constexpr_support =
523-
details::inplace_vector::satify_constexpr<typename IV::value_type,
524-
IV::capacity()>;
515+
details::satify_constexpr<typename IV::value_type, IV::capacity()>;
525516

526517
/// Dynamically-resizable fixed-N vector with inplace storage.
527518
template <class T, size_t N>
528-
struct inplace_vector
529-
: public details::inplace_vector::inplace_vector_base<T, N> {
519+
struct inplace_vector : public details::inplace_vector_base<T, N> {
530520
using value_type = T;
531521
using pointer = T *;
532522
using const_pointer = const T *;
@@ -563,7 +553,7 @@ struct inplace_vector
563553
return this->back();
564554
}
565555

566-
template <details::inplace_vector::container_compatible_range<T> R>
556+
template <details::container_compatible_range<T> R>
567557
constexpr void append_range(R &&rg)
568558
requires(std::constructible_from<T, std::ranges::range_reference_t<R>>)
569559
{
@@ -614,7 +604,7 @@ struct inplace_vector
614604
return pos;
615605
}
616606

617-
template <details::inplace_vector::container_compatible_range<T> R>
607+
template <details::container_compatible_range<T> R>
618608
constexpr iterator insert_range(const_iterator position, R &&rg)
619609
requires(std::constructible_from<T, std::ranges::range_reference_t<R>> &&
620610
std::movable<T>)
@@ -672,7 +662,7 @@ struct inplace_vector
672662
this->clear();
673663
insert(this->begin(), first, last);
674664
}
675-
template <details::inplace_vector::container_compatible_range<T> R>
665+
template <details::container_compatible_range<T> R>
676666
constexpr void assign_range(R &&rg)
677667
requires(std::constructible_from<T, std::ranges::range_reference_t<R>> &&
678668
std::movable<T>)
@@ -738,13 +728,13 @@ struct inplace_vector
738728
if (pos >= this->size()) [[unlikely]] {
739729
BEMAN_IV_THROW_OR_ABORT(std::out_of_range("inplace_vector::at"));
740730
}
741-
return details::inplace_vector::index(*this, pos);
731+
return details::index(*this, pos);
742732
}
743733
constexpr const_reference at(size_type pos) const {
744734
if (pos >= this->size()) [[unlikely]] {
745735
BEMAN_IV_THROW_OR_ABORT(std::out_of_range("inplace_vector::at"));
746736
}
747-
return details::inplace_vector::index(*this, pos);
737+
return details::index(*this, pos);
748738
}
749739

750740
// [containers.sequences.inplace_vector.cons], construct/copy/destroy
@@ -780,8 +770,8 @@ struct inplace_vector
780770
insert(this->begin(), first, last);
781771
}
782772

783-
template <details::inplace_vector::container_compatible_range<T> R>
784-
constexpr inplace_vector(beman::from_range_t, R &&rg)
773+
template <details::container_compatible_range<T> R>
774+
constexpr inplace_vector(details::from_range_t, R &&rg)
785775
requires(std::constructible_from<T, std::ranges::range_reference_t<R>> &&
786776
std::movable<T>)
787777
{
@@ -791,8 +781,7 @@ struct inplace_vector
791781

792782
namespace freestanding {
793783
template <class T, size_t N>
794-
struct inplace_vector
795-
: public details::inplace_vector::inplace_vector_base<T, N> {
784+
struct inplace_vector : public details::inplace_vector_base<T, N> {
796785
using value_type = T;
797786
using pointer = T *;
798787
using const_pointer = const T *;
@@ -818,7 +807,7 @@ struct inplace_vector
818807
requires(std::constructible_from<T, T &&>)
819808
= delete;
820809

821-
template <details::inplace_vector::container_compatible_range<T> R>
810+
template <details::container_compatible_range<T> R>
822811
constexpr void append_range(R &&rg)
823812
requires(std::constructible_from<T, std::ranges::range_reference_t<R>>)
824813
= delete;
@@ -835,7 +824,7 @@ struct inplace_vector
835824
std::movable<T>)
836825
= delete;
837826

838-
template <details::inplace_vector::container_compatible_range<T> R>
827+
template <details::container_compatible_range<T> R>
839828
constexpr iterator insert_range(const_iterator position, R &&rg)
840829
requires(std::constructible_from<T, std::ranges::range_reference_t<R>> &&
841830
std::movable<T>)
@@ -871,7 +860,7 @@ struct inplace_vector
871860
requires(std::constructible_from<T, std::iter_reference_t<InputIterator>> &&
872861
std::movable<T>)
873862
= delete;
874-
template <details::inplace_vector::container_compatible_range<T> R>
863+
template <details::container_compatible_range<T> R>
875864
constexpr void assign_range(R &&rg)
876865
requires(std::constructible_from<T, std::ranges::range_reference_t<R>> &&
877866
std::movable<T>)
@@ -925,8 +914,8 @@ struct inplace_vector
925914
std::movable<T>)
926915
= delete;
927916

928-
template <details::inplace_vector::container_compatible_range<T> R>
929-
constexpr inplace_vector(beman::from_range_t, R &&rg)
917+
template <details::container_compatible_range<T> R>
918+
constexpr inplace_vector(beman::inplace_vector::details::from_range_t, R &&rg)
930919
requires(std::constructible_from<T, std::ranges::range_reference_t<R>> &&
931920
std::movable<T>)
932921
= delete;
@@ -935,25 +924,24 @@ struct inplace_vector
935924
} // namespace freestanding
936925

937926
template <typename T, std::size_t N, typename U = T>
938-
constexpr std::size_t
939-
erase(details::inplace_vector::inplace_vector_base<T, N> &c, const U &value) {
927+
constexpr std::size_t erase(details::inplace_vector_base<T, N> &c,
928+
const U &value) {
940929
auto it = std::remove(c.begin(), c.end(), value);
941930
auto r = std::distance(it, c.end());
942931
c.erase(it, c.end());
943932
return r;
944933
}
945934

946935
template <typename T, std::size_t N, typename Predicate>
947-
constexpr std::size_t
948-
erase_if(details::inplace_vector::inplace_vector_base<T, N> &c,
949-
Predicate pred) {
936+
constexpr std::size_t erase_if(details::inplace_vector_base<T, N> &c,
937+
Predicate pred) {
950938
auto it = std::remove_if(c.begin(), c.end(), pred);
951939
auto r = std::distance(it, c.end());
952940
c.erase(it, c.end());
953941
return r;
954942
}
955943

956-
} // namespace beman
944+
} // namespace beman::inplace_vector
957945

958946
#undef IV_EXPECT
959947

tests/beman/inplace_vector/compare.test.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <cmath>
55
#include <compare>
66

7-
using namespace beman;
7+
using namespace beman::inplace_vector;
88

99
template <class T>
1010
concept has_threeway = requires(const T &t) {
@@ -13,7 +13,7 @@ concept has_threeway = requires(const T &t) {
1313

1414
template <class T>
1515
concept lessthan_comparable =
16-
beman::details::inplace_vector::lessthan_comparable<T>;
16+
beman::inplace_vector::details::lessthan_comparable<T>;
1717

1818
template <typename T> struct vec_list {
1919
T empty;

tests/beman/inplace_vector/constexpr.test.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ struct Some {
3131
};
3232
static_assert(std::is_trivial_v<Some>);
3333

34-
using beman::has_constexpr_support;
35-
using beman::inplace_vector;
34+
using beman::inplace_vector::has_constexpr_support;
35+
using beman::inplace_vector::inplace_vector;
3636

3737
static_assert(has_constexpr_support<inplace_vector<int, 50>>);
3838
static_assert(has_constexpr_support<inplace_vector<Some, 50>>);
@@ -45,8 +45,8 @@ static_assert(!has_constexpr_support<inplace_vector<std::unique_ptr<int>, 50>>);
4545

4646
#define TEST(NAME) \
4747
static_assert(std::invoke([]() { \
48-
NAME<beman::inplace_vector<int, 20>>(); \
49-
NAME<beman::inplace_vector<Some, 20>>(); \
48+
NAME<beman::inplace_vector::inplace_vector<int, 20>>(); \
49+
NAME<beman::inplace_vector::inplace_vector<Some, 20>>(); \
5050
return true; \
5151
}), \
5252
"##NAME");
@@ -70,7 +70,7 @@ template <typename IV> constexpr void test_constructors() {
7070
IV v(arr.begin(), arr.end());
7171
}
7272
{
73-
IV v(beman::from_range_t{}, arr);
73+
IV v(beman::inplace_vector::details::from_range_t{}, arr);
7474
}
7575
{
7676
IV other{0, 1};
@@ -269,8 +269,8 @@ TEST(test_op_comp);
269269

270270
template <typename IV> constexpr void test_erase() {
271271
IV v{0, 1, 2, 3, 3, 5};
272-
(void)beman::erase(v, 3);
273-
(void)beman::erase_if(v, [](auto v) { return v < 3; });
272+
(void)beman::inplace_vector::erase(v, 3);
273+
(void)beman::inplace_vector::erase_if(v, [](auto v) { return v < 3; });
274274
}
275275
TEST(test_erase)
276276

@@ -298,7 +298,7 @@ static_assert(!has_constexpr_support<inplace_vector<Complex, 50>>);
298298

299299
template <typename T> constexpr void speical_test_empty() {
300300
static_assert(!std::is_trivially_default_constructible_v<T>);
301-
using IV = beman::inplace_vector<T, 0>;
301+
using IV = beman::inplace_vector::inplace_vector<T, 0>;
302302

303303
std::array<T, 10> arr;
304304
arr.fill(T{50});

tests/beman/inplace_vector/constructors.test.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,30 +115,32 @@ TYPED_TEST(Constructors, CopyRanges) {
115115
auto reference = this->unique();
116116

117117
{
118-
IV device(beman::from_range, reference);
118+
IV device(beman::inplace_vector::details::from_range, reference);
119119
EXPECT_EQ(device, reference);
120120
}
121121

122122
if (IV::capacity() == 0)
123123
return;
124124

125125
{
126-
IV device(beman::from_range, reference | std::ranges::views::take(1));
126+
IV device(beman::inplace_vector::details::from_range,
127+
reference | std::ranges::views::take(1));
127128
EXPECT_EQ(device, IV{reference.front()});
128129
}
129130

130131
{
131132
auto mid = std::midpoint(0ul, reference.size());
132-
IV device(beman::from_range, reference | std::ranges::views::take(mid));
133+
IV device(beman::inplace_vector::details::from_range,
134+
reference | std::ranges::views::take(mid));
133135
EXPECT_EQ(device, IV(reference.begin(), reference.begin() + mid));
134136
}
135137
}
136138

137139
TYPED_TEST(Constructors, freestandingConversion) {
138140
using T = TestFixture::T;
139141

140-
using IV = beman::inplace_vector<T, 5>;
141-
using FS = beman::freestanding::inplace_vector<T, 5>;
142+
using IV = beman::inplace_vector::inplace_vector<T, 5>;
143+
using FS = beman::inplace_vector::freestanding::inplace_vector<T, 5>;
142144

143145
static_assert(std::is_constructible_v<FS, FS>);
144146
static_assert(std::is_constructible_v<IV, IV>);

0 commit comments

Comments
 (0)