C++20 Port #5
|
@ -515,6 +515,15 @@ export namespace core {
|
|||
return hash_code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Swaps the values of `element` in `a` and `b` around using copy semantics.
|
||||
*/
|
||||
template<typename element> constexpr void swap(element & a, element & b) {
|
||||
element const temp = a;
|
||||
a = b;
|
||||
b = temp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Streams the data from `input` to `output`, using `buffer` as temporary transfer space.
|
||||
*
|
||||
|
@ -550,6 +559,34 @@ export namespace core {
|
|||
return written;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to format and print `value` as an unsigned integer out to `output`.
|
||||
*
|
||||
* The returned [expected] can be used to introspect if `output` encountered any issues during
|
||||
* printing, otherwise it will contain the number of characters used to print `value` as text.
|
||||
*/
|
||||
expected<usize, io_error> print_unsigned(writable const & output, u64 value) {
|
||||
if (value == 0) return output(slice{"0"}.as_bytes());
|
||||
|
||||
u8 buffer[20]{0};
|
||||
usize buffer_count{0};
|
||||
|
||||
while (value != 0) {
|
||||
constexpr usize radix{10};
|
||||
|
||||
buffer[buffer_count] = static_cast<u8>((value % radix) + '0');
|
||||
value = (value / radix);
|
||||
buffer_count += 1;
|
||||
}
|
||||
|
||||
usize const half_buffer_count{buffer_count / 2};
|
||||
|
||||
for (usize i = 0; i < half_buffer_count; i += 1)
|
||||
swap(buffer[i], buffer[buffer_count - i - 1]);
|
||||
|
||||
return output(slice{buffer, buffer_count});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a reference to a shared [allocator] which will always return `nullptr` on calls to
|
||||
* [allocator::reallocate].
|
||||
|
|
Loading…
Reference in New Issue