aboutsummaryrefslogtreecommitdiff
path: root/libk/stdlib.h
diff options
context:
space:
mode:
Diffstat (limited to 'libk/stdlib.h')
-rw-r--r--libk/stdlib.h37
1 files changed, 28 insertions, 9 deletions
diff --git a/libk/stdlib.h b/libk/stdlib.h
index a336586..7213384 100644
--- a/libk/stdlib.h
+++ b/libk/stdlib.h
@@ -2,15 +2,32 @@
#include <string.h>
+template <typename T, bool reverse = false>
+class Iterator {
+public:
+ T next() { return buffer[reverse ? pos-- : pos++]; }
+ operator bool() const { return reverse ? (pos >= 0) : (pos < length); }
+
+ explicit Iterator(T* b, size_t l) : buffer(b), length(l) {
+ if (reverse)
+ pos = length - 1;
+ };
+
+private:
+ ssize_t pos = 0;
+ T* const buffer;
+ const size_t length;
+};
+
class Console {
- public:
- virtual ~Console() = default;
- virtual void write(char c) = 0;
- virtual void write(ViewIterator& msg) = 0;
- virtual void update_cursor() = 0;
-
- static void set(Console* ptr);
- static Console* get();
+public:
+ virtual ~Console() = default;
+ virtual void write(char c) = 0;
+ virtual void write(ViewIterator& msg) = 0;
+ virtual void update_cursor() = 0;
+
+ static void set(Console* ptr);
+ static Iterator<Console*> begin();
};
template <typename T>
@@ -37,7 +54,9 @@ void print_c(Console* console, const T& a, const Args&... x) {
template <typename T, typename... Args>
void printk(const T& a, const Args&... x) {
- if (auto* c = Console::get()) {
+ auto iter = Console::begin();
+ while (iter) {
+ auto* c = iter.next();
print_c(c, a, x...);
c->update_cursor();
}