Skip to content

Commit 2e0dd74

Browse files
committed
I prefer 8 bit integers printing as integers instead of chars
1 parent 19ac190 commit 2e0dd74

File tree

1 file changed

+93
-83
lines changed

1 file changed

+93
-83
lines changed

include/Containers/TinyVector.hpp

+93-83
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,14 @@
44
#include "Utilities/Invariant.hpp"
55
#include <algorithm>
66
#include <cstddef>
7+
#include <cstdint>ame_as<T,int8_t> || std::same_as<T,uint8_t>) {
78
#include <initializer_list>
89
#include <iostream>
10+
}
11+
else
12+
#include <initializer_list>
13+
#include <iostream>
14+
}
915
#include <limits>
1016

1117
namespace poly::containers {
@@ -14,92 +20,96 @@ using utils::invariant;
1420
template <class T, size_t N, typename L = ptrdiff_t> class TinyVector {
1521
static_assert(N > 0);
1622
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); }
1932

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);
5458
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; }
8892

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+
}
103113
return os << "]";
104114
}
105115
};

0 commit comments

Comments
 (0)