diff options
Diffstat (limited to 'libk/string.h')
-rw-r--r-- | libk/string.h | 106 |
1 files changed, 31 insertions, 75 deletions
diff --git a/libk/string.h b/libk/string.h index 0675cea..03c0942 100644 --- a/libk/string.h +++ b/libk/string.h @@ -1,5 +1,4 @@ #pragma once -#include <type_traits.h> #include <types.h> /** @@ -8,13 +7,15 @@ */ constexpr size_t strlen(const char* str) { size_t len = 0; - while (str[len]) + while (str[len] != '\0') ++len; return len; } -/* reverse: reverse string s in place */ -constexpr void reverse(char s[], int strlen) { +/** + * Reverse array in place + */ +constexpr void reverse(char s[], size_t strlen) { int i, j; char c; @@ -25,57 +26,29 @@ constexpr void reverse(char s[], int strlen) { } } -/* itoa: convert n to characters in s */ -template <typename T, int base = 10> -constexpr size_t itoa(T n, char s[]) { - const bool is_negative = (n < 0); - if constexpr (!is_unsigned<T>()) { - if (n < 0) - n = -n; - } - - int i = 0; - do { /* generate digits in reverse order */ - s[i++] = "0123456789abcdef"[n % base]; /* get next digit */ - } while ((n /= base) > 0); /* delete it */ - - if (is_negative) - s[i++] = '-'; - - s[i] = '\0'; - - reverse(s, i); - return i; -} - class ViewIterator { public: - virtual char next() = 0; - virtual operator bool() const = 0; -}; - -class StringView { -public: - class Iterator : public ViewIterator { - friend class StringView; + char next() { return buffer[reverse ? pos-- : pos++]; } + operator bool() const { return reverse ? (pos >= 0) : (pos < length); } - public: - char next() override { return p->buffer[pos++]; } - operator bool() const override { return (pos < p->m_length); } - - private: - Iterator(const StringView* s) : p(s) {} - - size_t pos = 0; - const StringView* p; + explicit ViewIterator(const char* b, size_t l, bool r = false) : buffer(b), length(l), reverse(r) { + if (reverse) + pos = length - 1; }; - friend class Iterator; +private: + ssize_t pos = 0; + const char* const buffer; // const pointer to const char* + const size_t length; + const bool reverse; +}; +class StringView { +public: StringView(const char* d) : buffer{d}, m_length{strlen(d)} {} StringView(const char* d, size_t l) : buffer{d}, m_length{l} {} - Iterator begin() const { return Iterator(this); } + auto begin() const { return ViewIterator(buffer, m_length); } private: const char* const buffer; @@ -84,42 +57,25 @@ private: class IntegerView { public: - template <typename T> - struct HexFormat { - T n; + struct HexFormat_int32 { + int32_t n; }; - - class Iterator : public ViewIterator { - friend class IntegerView; - - public: - char next() override { return _p->buffer[pos++]; }; - operator bool() const override { return (pos < _p->length); } - - private: - Iterator(const IntegerView* v) : _p(v) {} - - size_t pos = 0; - const IntegerView* _p; + struct HexFormat_uint32 { + uint32_t n; }; - IntegerView(int32_t n) { length = itoa(n, buffer); } - - template <typename T> - IntegerView(HexFormat<T> f) { - buffer[0] = '0'; - buffer[1] = 'x'; - length = itoa<T, 16>(f.n, buffer + 2) + 2; - } + IntegerView(int32_t n); + IntegerView(HexFormat_int32 f); + IntegerView(HexFormat_uint32 f); - Iterator begin() const { return Iterator(this); } + auto begin() const { return ViewIterator(buffer, length, true); } private: - char buffer[128]; + char buffer[32]; size_t length = 0; }; -using hex = IntegerView::HexFormat<int32_t>; -using uhex = IntegerView::HexFormat<uint32_t>; +using hex = IntegerView::HexFormat_int32; +using uhex = IntegerView::HexFormat_uint32; -using hex_addr = IntegerView::HexFormat<uint64_t>; // TODO causes crash +// using hex_addr = IntegerView::HexFormat<uint64_t>; // TODO causes crash |