aboutsummaryrefslogtreecommitdiff
path: root/libk/stdlib.h
diff options
context:
space:
mode:
Diffstat (limited to 'libk/stdlib.h')
-rw-r--r--libk/stdlib.h31
1 files changed, 19 insertions, 12 deletions
diff --git a/libk/stdlib.h b/libk/stdlib.h
index 44bacf4..f031408 100644
--- a/libk/stdlib.h
+++ b/libk/stdlib.h
@@ -4,27 +4,34 @@
#include <type_traits.h>
class Console {
-public:
+ public:
virtual void write(char c) = 0;
- virtual void write(const String &msg) = 0;
- virtual void write(int n) = 0;
- virtual void write(unsigned int n) = 0;
+ virtual void write(ViewIterator& msg) = 0;
- static void set(Console *ptr);
- static Console *get();
+ static void set(Console* ptr);
+ static Console* get();
};
-template <typename T> void printk(const T &a) {
- if (auto *c = Console::get()) {
- if constexpr (is_same<T, const char *>())
- c->write(String(a));
- else
+template <typename T>
+void printk(const T& a) {
+ if (auto* c = Console::get()) {
+ if constexpr (is_same<T, char>()) {
+ c->write(a);
+ } else if constexpr (requires { StringView(a); }) {
+ StringView v(a);
+ auto iter = v.begin();
+ c->write(iter);
+ } else if constexpr (requires { IntegerView(a); }) {
+ IntegerView v(a);
+ auto iter = v.begin();
+ c->write(iter);
+ } else
c->write(a);
}
}
template <typename T, typename... Args>
-void printk(const T &a, const Args &...x) {
+void printk(const T& a, const Args&... x) {
printk(a);
printk(x...);
}