aboutsummaryrefslogtreecommitdiff
path: root/kernel/kstd
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-03-20 15:22:37 +0100
committerFelix Morgner <felix.morgner@ost.ch>2026-03-20 15:22:37 +0100
commit8ae0f5a9a83aa58f2bd9eacfb51369b0bf966809 (patch)
treeb6de15d463081a7209f57bd78e54541fc2382d32 /kernel/kstd
parente92343922bc8dce0c5653b83789498d4c97ade62 (diff)
downloadteachos-8ae0f5a9a83aa58f2bd9eacfb51369b0bf966809.tar.xz
teachos-8ae0f5a9a83aa58f2bd9eacfb51369b0bf966809.zip
kstd/format: use tagged union to reduce template bloat
Diffstat (limited to 'kernel/kstd')
-rw-r--r--kernel/kstd/print.cpp80
1 files changed, 74 insertions, 6 deletions
diff --git a/kernel/kstd/print.cpp b/kernel/kstd/print.cpp
index db03816..beee2e5 100644
--- a/kernel/kstd/print.cpp
+++ b/kernel/kstd/print.cpp
@@ -127,13 +127,81 @@ namespace kstd::os
if (index < args.size())
{
auto const & arg = args[index];
- if (arg.format_function)
+ switch (arg.type)
{
- arg.format_function(arg.value_pointer, parse_context, context);
- }
- else
- {
- context.push("{?}");
+ case kstd::bits::format::arg_type::boolean:
+ {
+ auto fmt = kstd::formatter<bool>{};
+ auto const parsed = fmt.parse(parse_context);
+ parse_context.advance_to(parsed);
+ fmt.format(arg.value.boolean, context);
+ break;
+ }
+ case kstd::bits::format::arg_type::character:
+ {
+ auto fmt = kstd::formatter<char>{};
+ auto const parsed = fmt.parse(parse_context);
+ parse_context.advance_to(parsed);
+ fmt.format(arg.value.character, context);
+ break;
+ }
+ case kstd::bits::format::arg_type::integer:
+ {
+ auto fmt = kstd::formatter<long long>{};
+ auto const parsed = fmt.parse(parse_context);
+ parse_context.advance_to(parsed);
+ fmt.format(arg.value.integer, context);
+ break;
+ }
+ case kstd::bits::format::arg_type::unsigned_integer:
+ {
+ auto fmt = kstd::formatter<unsigned long long>{};
+ auto const parsed = fmt.parse(parse_context);
+ parse_context.advance_to(parsed);
+ fmt.format(arg.value.unsigned_integer, context);
+ break;
+ }
+ case kstd::bits::format::arg_type::string_view:
+ {
+ auto fmt = kstd::formatter<std::string_view>{};
+ auto const parsed = fmt.parse(parse_context);
+ parse_context.advance_to(parsed);
+ fmt.format(arg.value.string_view, context);
+ break;
+ }
+ case kstd::bits::format::arg_type::c_string:
+ {
+ auto fmt = kstd::formatter<char const *>{};
+ auto const parsed = fmt.parse(parse_context);
+ parse_context.advance_to(parsed);
+ fmt.format(arg.value.c_string, context);
+ break;
+ }
+ case kstd::bits::format::arg_type::pointer:
+ {
+ auto fmt = kstd::formatter<void const *>{};
+ auto const parsed = fmt.parse(parse_context);
+ parse_context.advance_to(parsed);
+ fmt.format(arg.value.pointer, context);
+ break;
+ }
+ case kstd::bits::format::arg_type::user_defined:
+ {
+ if (arg.value.user_defined.format)
+ {
+ arg.value.user_defined.format(arg.value.user_defined.pointer, parse_context, context);
+ }
+ else
+ {
+ context.push("{?}");
+ }
+ break;
+ }
+ default:
+ {
+ context.push("{fmt-err: unknown-type}");
+ break;
+ }
}
}
else