Skip to content

Commit bcf89cf

Browse files
committed
Refactor enums, StringView, Span printing & streams
1 parent a78c58d commit bcf89cf

8 files changed

Lines changed: 49 additions & 44 deletions

File tree

include/EnumHelpers.hpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ namespace EnumHelpers {
103103
Signed ? static_cast<Ut>(cxpr::StrViewToI64(sub.substringview_fromlen(equal_idx + 1))) :
104104
static_cast<Ut>(cxpr::StrViewToU64(sub.substringview_fromlen(equal_idx + 1)))
105105
);
106-
current_val = from_enum(value) + UnderlyingTypeT<T>{ 1 };
106+
current_val = from_enum(value) + Ut{ 1 };
107107
return Pair{ sub.substringview_fromlen(
108108
first_nospace_idx,
109109
(last_nospace_idx < equal_idx ? last_nospace_idx : equal_idx) - first_nospace_idx
@@ -132,7 +132,7 @@ namespace EnumHelpers {
132132
for (const auto& [k, v] : enum_array) {
133133
const bool inserted = map.insert(v, k);
134134
if (is_constant_evaluated()) {
135-
// this allocation is here for the same reason as the one at line 178
135+
// this allocation is here for the same reason as the one as below in enum_to_str_view
136136
if (!inserted) { new int[static_cast<size_t>(from_enum(v))]; }
137137
}
138138
}
@@ -223,7 +223,7 @@ Optional<T> enum_parse(StringView v) {
223223
return p.second();
224224
});
225225
}
226-
template <typename T>
226+
template <Enum T>
227227
constexpr bool enum_has_value(StringView ename) {
228228
if constexpr (EnumHelpers::EnumSupportsMap<T>) {
229229
constexpr const auto& enum_map = EnumHelpers::EnumMapProvider<T>::enum_array;
@@ -235,7 +235,7 @@ constexpr bool enum_has_value(StringView ename) {
235235
return true; // lie about "None" support because not all enums are "fancy" and we don't want a static_assert fail on those.
236236
}
237237
}
238-
template <typename T>
238+
template <Enum T>
239239
constexpr T get_enum_none() {
240240
if constexpr (requires { T::None; }) {
241241
return T::None;
@@ -256,8 +256,7 @@ template <EnumHelpers::EnumSupportsMap T>
256256
constexpr auto for_each_enum() {
257257
return ForEachEnum<T>{};
258258
}
259-
template <EnumHelpers::EnumSupportsMap T, typename Functor>
260-
requires(requires { declval<Functor>()(declval<T>()); })
259+
template <EnumHelpers::EnumSupportsMap T, CallableWith<T> Functor>
261260
constexpr auto for_each_enum(Functor func) {
262261
using Res = InvokeResultT<Functor, T>;
263262
if constexpr (IsVoid<Res>::value) {

include/Logger.hpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,6 @@ class LoggingFormat {
3333
static Result<LoggingFormat, LoggingError> from_string(StringView format);
3434
String format_message(StringView message, LogLevel level, StringView logger_name) const;
3535
};
36-
#ifdef __INTELLISENSE__
37-
constexpr bool is_intellisense = true;
38-
#else
39-
constexpr bool is_intellisense = false;
40-
#endif
4136
template <typename... Args>
4237
using LoggerStringParam = ConditionalT<is_intellisense, StringView, FormatString<sizeof...(Args)>>;
4338

include/Macros.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,8 @@
3838

3939

4040
#define USE_NEW_TUPLE 1
41+
#ifdef __INTELLISENSE__
42+
constexpr bool is_intellisense = true;
43+
#else
44+
constexpr bool is_intellisense = false;
45+
#endif

include/Span.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "Utility.hpp"
44
#include "Iterator.hpp"
55
#include "Pair.hpp"
6+
#include "PrintInfo.hpp"
67
namespace ARLib {
78
template <typename T>
89
class Span {
@@ -51,4 +52,19 @@ class Span {
5152
}
5253
constexpr bool operator==(const Span& other) const noexcept = default;
5354
};
55+
56+
template <Printable T>
57+
struct PrintInfo<Span<T>> {
58+
const Span<T>& m_span;
59+
PrintInfo(const Span<T>& span) : m_span(span) {}
60+
String repr() const {
61+
String result = "["_s;
62+
for (size_t i = 0; i < m_span.size(); i++) {
63+
result += print_conditional(m_span[i]);
64+
if (i != m_span.size() - 1) { result += ", "; }
65+
}
66+
result += "]";
67+
return result;
68+
}
69+
};
5470
} // namespace ARLib

include/Stream.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ class StringStream : public CharacterStream {
153153
class StringViewStream : public CharacterStream {
154154
size_t m_pos{ 0 };
155155
StringView m_view;
156+
Span<char> _writeable_span();
156157
public:
157158
class LinesViewIterator {
158159
MaybeOwned<StringViewStream> m_stream;

include/StringView.hpp

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ template <typename T>
99
class Vector;
1010
// this class is not necessarily null-terminated
1111
class StringView {
12-
char* m_start_mut = nullptr;
1312
const char* m_start = nullptr;
1413
size_t m_size = 0;
1514
[[noreturn]] static void cxpr_error() {
@@ -26,13 +25,13 @@ class StringView {
2625
constexpr StringView(const char* begin, const char* end) :
2726
m_start(begin), m_size(static_cast<size_t>(end - begin)) {}
2827
constexpr StringView(char* begin, const char* end) :
29-
m_start_mut(begin), m_start(begin), m_size(static_cast<size_t>(end - begin)) {}
28+
m_start(begin), m_size(static_cast<size_t>(end - begin)) {}
3029
template <typename T>
3130
requires IsSameV<T, const char*>
3231
constexpr StringView(T buf, size_t size) : m_start(buf), m_size(size) {}
3332
template <typename T>
3433
requires IsSameV<T, char*>
35-
constexpr StringView(T buf, size_t size) : m_start_mut(buf), m_start(buf), m_size(size) {}
34+
constexpr StringView(T buf, size_t size) : m_start(buf), m_size(size) {}
3635
template <size_t N>
3736
constexpr StringView(const char (&buf)[N]) : m_start(buf), m_size(strlen(buf)) {}
3837
template <typename T>
@@ -42,35 +41,30 @@ class StringView {
4241
}
4342
template <typename T>
4443
requires IsSameV<T, char*>
45-
constexpr StringView(T buf) : m_start_mut(buf), m_start(buf) {
44+
constexpr StringView(T buf) : m_start(buf) {
4645
m_size = strlen(buf);
4746
}
4847
constexpr StringView(Iterator<char> begin, Iterator<char> end) :
4948
m_start(begin.ptr()), m_size(static_cast<size_t>(end.ptr() - begin.ptr())) {}
5049
constexpr StringView(ConstIterator<char> begin, ConstIterator<char> end) :
5150
m_start(begin.ptr()), m_size(static_cast<size_t>(end.ptr() - begin.ptr())) {}
5251
explicit StringView(const String& ref) : m_start(ref.data()) { m_size = ref.length(); }
53-
explicit StringView(String& ref) : m_start_mut(ref.rawptr()), m_start(ref.data()) { m_size = ref.length(); }
5452
constexpr StringView(const StringView& view) = default;
5553
constexpr StringView(StringView&& view) noexcept {
56-
m_start_mut = view.m_start_mut;
5754
m_start = view.m_start;
5855
m_size = view.m_size;
5956
view.m_start = nullptr;
6057
view.m_size = 0;
6158
}
6259
constexpr StringView& operator=(const StringView& view) noexcept {
6360
if (this == &view) return *this;
64-
m_start_mut = view.m_start_mut;
6561
m_start = view.m_start;
6662
m_size = view.m_size;
6763
return *this;
6864
}
6965
constexpr StringView& operator=(StringView&& view) noexcept {
70-
m_start_mut = view.m_start_mut;
7166
m_start = view.m_start;
7267
m_size = view.m_size;
73-
view.m_start_mut = nullptr;
7468
view.m_start = nullptr;
7569
view.m_size = 0;
7670
return *this;
@@ -101,18 +95,12 @@ class StringView {
10195
}
10296
constexpr bool empty() const { return size() == 0; }
10397
[[nodiscard]] Ordering operator<=>(const StringView& other) const;
98+
constexpr char first() const { return m_start[0]; }
99+
constexpr char last() const { return m_start[m_size - 1]; }
104100
constexpr char operator[](size_t index) const noexcept { return m_start[index]; }
105101
constexpr const char& index(size_t index) const noexcept { return m_start[index]; }
106-
constexpr char& index(size_t index) noexcept {
107-
HARD_ASSERT(m_start_mut, "This stringview is not mutable")
108-
return m_start_mut[index];
109-
}
110102
[[nodiscard]] constexpr StringView substring(size_t size) {
111-
if (m_start_mut) {
112-
return StringView{ m_start_mut, size };
113-
} else {
114-
return StringView{ m_start, size };
115-
}
103+
return StringView{ m_start, size };
116104
}
117105
[[nodiscard]] constexpr size_t index_of(const char* c, size_t start = 0) const {
118106
if (m_size == 0 || start >= m_size) return npos;
@@ -133,10 +121,6 @@ class StringView {
133121
[[nodiscard]] constexpr size_t size() const { return m_size; }
134122
[[nodiscard]] constexpr size_t length() const { return m_size; }
135123
[[nodiscard]] constexpr const char* data() const { return m_start; }
136-
[[nodiscard]] constexpr char* rawptr() {
137-
HARD_ASSERT(m_start_mut, "This stringview is not mutable")
138-
return m_start_mut;
139-
}
140124
[[nodiscard]] constexpr ConstIterator<char> begin() const { return ConstIterator<char>{ m_start }; }
141125
[[nodiscard]] constexpr ConstIterator<char> end() const { return ConstIterator<char>{ m_start + m_size }; }
142126
[[nodiscard]] String str() const { return { m_start, length() }; }
@@ -145,11 +129,7 @@ class StringView {
145129
size_t ssize = size();
146130
if (first > ssize) return {};
147131
if (last > ssize) return StringView{ m_start + first, m_size - first };
148-
if (m_start_mut) {
149-
return StringView{ m_start_mut + first, m_start + last };
150-
} else {
151-
return StringView{ m_start + first, m_start + last };
152-
}
132+
return StringView{ m_start + first, m_start + last };
153133
}
154134
constexpr StringView substringview_fromlen(size_t first = 0, size_t len = npos) const {
155135
if (is_constant_evaluated()) { check_offset(first); }

source/Logger.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ String LoggingFormat::format_message(StringView message, LogLevel level, StringV
9797
output.append(enum_to_str_view(level));
9898
break;
9999
case LoggingFormatSpecifier::LogLevelShort:
100-
output.append(enum_to_str_view(level)[0]);
100+
output.append(enum_to_str_view(level).first());
101101
break;
102102
case LoggingFormatSpecifier::LoggerName:
103103
output.append(logger_name);

source/Stream.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -302,33 +302,41 @@ StringViewStream::LinesViewIterator StringViewStream::LinesViewIterator::operato
302302
++(*this);
303303
return copy;
304304
}
305+
Span<char> StringViewStream::_writeable_span() {
306+
// this const_cast is fine because the pointer underlying the StringView is writable when created
307+
// it's just necessary because the StringView itself doesn't allow modifications.
308+
return Span<char>{ const_cast<char*>(m_view.data()), m_view.size() };
309+
}
305310
Result<size_t> StringViewStream::write(Span<const uint8_t> buffer) {
306311
StringView bufview{ reinterpret_cast<const char*>(buffer.data()), buffer.size_bytes() };
312+
auto writeable_span = _writeable_span();
307313
int64_t to_write = static_cast<int64_t>(bufview.size());
308314
int64_t space_left = static_cast<int64_t>(m_view.size() - m_pos);
309315
if (auto needed_space = to_write - space_left; needed_space > 0) {
310316
return Error{ "Cannot write to StringViewStream: not enough space" };
311317
}
312-
for (size_t i = 0; to_write > 0; --to_write, ++m_pos, ++i) { m_view.index(m_pos) = bufview[i]; }
318+
for (size_t i = 0; to_write > 0; --to_write, ++m_pos, ++i) { writeable_span[m_pos] = bufview[i]; }
313319
return static_cast<size_t>(to_write);
314320
}
315321
Result<size_t> StringViewStream::write(Span<const char> buffer) {
316322
StringView bufview{ buffer.data(), buffer.size_bytes() };
323+
auto writeable_span = _writeable_span();
317324
int64_t to_write = static_cast<int64_t>(bufview.size());
318325
int64_t space_left = static_cast<int64_t>(m_view.size() - m_pos);
319326
if (auto needed_space = to_write - space_left; needed_space > 0) {
320327
return Error{ "Cannot write to StringViewStream: not enough space" };
321328
}
322-
for (size_t i = 0; to_write > 0; --to_write, ++m_pos, ++i) { m_view.index(m_pos) = bufview[i]; }
329+
for (size_t i = 0; to_write > 0; --to_write, ++m_pos, ++i) { writeable_span[m_pos] = bufview[i]; }
323330
return static_cast<size_t>(to_write);
324331
}
325332
Result<size_t> StringViewStream::write(StringView bufview) {
326-
int64_t to_write = static_cast<int64_t>(bufview.size());
333+
int64_t to_write = static_cast<int64_t>(bufview.size());
334+
auto writeable_span = _writeable_span();
327335
int64_t space_left = static_cast<int64_t>(m_view.size() - m_pos);
328336
if (auto needed_space = to_write - space_left; needed_space > 0) {
329337
return Error{ "Cannot write to StringViewStream: not enough space" };
330338
}
331-
for (size_t i = 0; to_write > 0; --to_write, ++m_pos, ++i) { m_view.index(m_pos) = bufview[i]; }
339+
for (size_t i = 0; to_write > 0; --to_write, ++m_pos, ++i) { writeable_span[m_pos] = bufview[i]; }
332340
return static_cast<size_t>(to_write);
333341
}
334342
Result<Vector<uint8_t>> StringViewStream::read(size_t n) {
@@ -344,12 +352,13 @@ Result<Vector<uint8_t>> StringViewStream::read() {
344352
return Vector<uint8_t>{ ptr, m_view.size() };
345353
}
346354
Result<size_t> StringViewStream::write_string(StringView buffer) {
355+
auto writeable_span = _writeable_span();
347356
int64_t to_write = static_cast<int64_t>(buffer.size());
348357
int64_t space_left = static_cast<int64_t>(m_view.size() - m_pos);
349358
if (auto needed_space = to_write - space_left; needed_space > 0) {
350359
return Error{ "Cannot write to StringViewStream: not enough space" };
351360
}
352-
for (size_t i = 0; to_write > 0; --to_write, ++m_pos, ++i) { m_view.index(m_pos) = buffer[i]; }
361+
for (size_t i = 0; to_write > 0; --to_write, ++m_pos, ++i) { writeable_span[m_pos] = buffer[i]; }
353362
return static_cast<size_t>(to_write);
354363
}
355364
Result<String> StringViewStream::read_string() {

0 commit comments

Comments
 (0)