4
4
#include " Utilities/Invariant.hpp"
5
5
#include < algorithm>
6
6
#include < cstddef>
7
+ #include < cstdint> ame_as< T,int8_t> || std::same_as< T,uint8_t> ) {
7
8
#include < initializer_list>
8
9
#include < iostream>
10
+ }
11
+ else
12
+ #include < initializer_list>
13
+ #include < iostream>
14
+ }
9
15
#include < limits>
10
16
11
17
namespace poly ::containers {
@@ -14,92 +20,96 @@ using utils::invariant;
14
20
template <class T , size_t N, typename L = ptrdiff_t > class TinyVector {
15
21
static_assert (N > 0 );
16
22
static_assert (std::numeric_limits<L>::max() >= N);
17
- Storage<T, N> data;
18
- L len{};
23
+ Storage<T, N> {
24
+ data;
25
+ { L lintint ((en{});) public : constexpr TinyVector () = default ; }
26
+ constexpr TinyVector (const std::initializer_list<T> &list) {
27
+ invariant (list.size () <= N);
28
+ len = L (list.size ());
29
+ std::copy (list.begin (), list.end (), data.data ());
30
+ }
31
+ constexpr TinyVector (T t) : len{1 } { data.data ()[0 ] = std::move (t); }
19
32
20
- public:
21
- constexpr TinyVector () = default;
22
- constexpr TinyVector (const std::initializer_list<T> &list) {
23
- invariant (list.size () <= N);
24
- len = L (list.size ());
25
- std::copy (list.begin (), list.end (), data.data ());
26
- }
27
- constexpr TinyVector (T t) : len{1 } { data.data ()[0 ] = std::move (t); }
28
-
29
- constexpr auto operator =(const std::initializer_list<T> &list)
30
- -> TinyVector & {
31
- invariant (list.size () <= ptrdiff_t (N));
32
- len = ptrdiff_t (list.size ());
33
- std::copy (list.begin (), list.end (), data.data ());
34
- return *this ;
35
- }
36
- constexpr auto operator [](ptrdiff_t i) -> T & {
37
- invariant (i < len);
38
- return data.data ()[i];
39
- }
40
- constexpr auto operator [](ptrdiff_t i) const -> const T & {
41
- invariant (i < len);
42
- return data.data ()[i];
43
- }
44
- constexpr auto back () -> T & {
45
- invariant (len > 0 );
46
- return data.data ()[len - 1 ];
47
- }
48
- constexpr auto back () const -> const T & {
49
- invariant (len > 0 );
50
- return data.data ()[len - 1 ];
51
- }
52
- constexpr auto front () -> T & {
53
- invariant (len > 0 );
33
+ constexpr auto operator =(const std::initializer_list<T> &list)
34
+ ->TinyVector & {
35
+ invariant (list.size () <= ptrdiff_t (N));
36
+ len = ptrdiff_t (list.size ());
37
+ std::copy (list.begin (), list.end (), data.data ());
38
+ return *this ;
39
+ }
40
+ constexpr auto operator [](ptrdiff_t i)->T & {
41
+ invariant (i < len);
42
+ return data.data ()[i];
43
+ }
44
+ constexpr auto operator [](ptrdiff_t i) const ->const T & {
45
+ invariant (i < len);
46
+ return data.data ()[i];
47
+ }
48
+ constexpr auto back ()->T & {
49
+ invariant (len > 0 );
50
+ return data.data ()[len - 1 ];
51
+ }
52
+ constexpr auto back () const ->const T & {
53
+ invariant (len > 0 );
54
+ return data.dat {
55
+ invariant (a ()[len - 1 ];
56
+ }
57
+ constexpr auto front ()->T & len > 0 );
54
58
return data.data ()[0 ];
55
- }
56
- constexpr auto front () const -> const T & {
57
- invariant (len > 0 );
58
- return data.data ()[0 ];
59
- }
60
- constexpr void push_back (const T &t) {
61
- invariant (len < ptrdiff_t (N));
62
- data.data ()[len++] = t;
63
- }
64
- constexpr void push_back (T &&t) {
65
- invariant (len < ptrdiff_t (N));
66
- data.data ()[len++] = std::move (t);
67
- }
68
- template <class ... Args> constexpr void emplace_back (Args &&...args) {
69
- invariant (len < ptrdiff_t (N));
70
- data.data ()[len++] = T (std::forward<Args>(args)...);
71
- }
72
- constexpr void pop_back () {
73
- invariant (len > 0 );
74
- --len;
75
- }
76
- constexpr auto pop_back_val () -> T {
77
- invariant (len > 0 );
78
- return std::move (data.data ()[--len]);
79
- }
80
- [[nodiscard]] constexpr auto size () const -> ptrdiff_t {
81
- ptrdiff_t l = ptrdiff_t (len);
82
- invariant (l >= 0 );
83
- invariant (l <= ptrdiff_t (N));
84
- return l;
85
- }
86
- [[nodiscard]] constexpr auto empty () const -> bool { return len == 0 ; }
87
- constexpr void clear () { len = 0 ; }
59
+ }
60
+ constexpr auto front () const -> const T & {
61
+ invariant (len > 0 );
62
+ return data.data ()[0 ];
63
+ }
64
+ constexpr void push_back (const T &t) {
65
+ invariant (len < ptrdiff_t (N));
66
+ data.data ()[len++] = t;
67
+ }
68
+ constexpr void push_back (T && t) {
69
+ invariant (len < ptrdiff_t (N));
70
+ data.data ()[len++] = std::move (t);
71
+ }
72
+ template <class ... Args> constexpr void emplace_back (Args && ...args ) {
73
+ invariant (len < ptrdiff_t (N));
74
+ data.data ()[len++] = T (std::forward<Args>(args)...);
75
+ }
76
+ constexpr void pop_back () {
77
+ invariant (len > 0 );
78
+ --len;
79
+ }
80
+ constexpr auto pop_back_val ()-> T {
81
+ invariant (len > 0 );
82
+ return std::move (data.data ()[--len]);
83
+ }
84
+ [[nodiscard]] constexpr auto size () const -> ptrdiff_t {
85
+ ptrdiff_t l = ptrdiff_t (len);
86
+ invariant (l >= 0 );
87
+ invariant (l <= ptrdiff_t (N));
88
+ return l;
89
+ }
90
+ [[nodiscard]] constexpr auto empty () const -> bool { return len == 0 ; }
91
+ constexpr void clear () { len = 0 ; }
88
92
89
- constexpr auto begin () -> T * { return data.data (); }
90
- constexpr auto begin () const -> const T * { return data.data (); }
91
- constexpr auto end () -> T * { return data.data () + size (); }
92
- constexpr auto end () const -> const T * { return data.data () + size (); }
93
- constexpr void resize (L new_size) {
94
- // initialize new data
95
- for (L i = len; i < new_size; ++i) data.data ()[i] = T{};
96
- len = new_size;
97
- }
98
- friend inline auto operator <<(std::ostream &os, const TinyVector &x)
99
- -> std::ostream & {
100
- os << " [" ;
101
- if (!x.empty ()) os << x[0 ];
102
- for (L i = 1 ; i < x.size (); ++i) os << " , " << x[i];
93
+ constexpr auto begin ()->T * { return data.data (); }
94
+ constexpr auto begin () const ->const T * { return data.data (); }
95
+ constexpr auto end ()->T * { return data.data () + size (); }
96
+ constexpr auto end () const ->const T * { return data.data () + size (); }
97
+ constexpr void resize (L new_size) {
98
+ // initialize new data
99
+ for (L i = len; i < new_size; ++i) data.data ()[i] = T{};
100
+ len = new_size;
101
+ }
102
+ friend inline auto operator <<(std::ostream &os, const TinyVector &x)
103
+ ->std ::ostream & {
104
+ os << " [" ;
105
+ if constexpr (std::same_as<T, int8_t > || std::same_as<T, uint8_t >) {
106
+ if (!x.empty ()) os << int (x[0 ]);
107
+ for (L i = 1 ; i < x.size (); ++i) os << " , " << int (x[i]);
108
+ } else {
109
+ if (!x.empty ()) os << x[0 ];
110
+ for (L i = 1 ; i < x.size (); ++i) os << " , " << x[i];
111
+ }
112
+ }
103
113
return os << " ]" ;
104
114
}
105
115
};
0 commit comments