aboutsummaryrefslogtreecommitdiff
path: root/libk/string.h
diff options
context:
space:
mode:
Diffstat (limited to 'libk/string.h')
-rw-r--r--libk/string.h106
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