Compare commits

..

2 Commits

2 changed files with 30 additions and 20 deletions

View File

@ -42,12 +42,12 @@ constexpr inline void check_fmt_params() {
template <fmt_data_t fmt_data, std::integral arg_t>
constexpr inline void format_arg(char* dest, arg_t arg) {
const_fmt_detail::format_int(dest, arg, fmt_data);
const_fmt_detail::format_int<arg_t, fmt_data>(dest, arg);
};
template <fmt_data_t fmt_data, std::floating_point arg_t>
constexpr inline void format_arg(char* dest, arg_t arg){
// const_fmt_detail::format_float(dest, arg, fmt_data);
// const_fmt_detail::format_float<arg_t, fmt_data>(dest, arg);
};
// TODO: Error handling
@ -93,7 +93,6 @@ consteval inline auto get_preproc_string() {
} else {
for (int j = 0; j < ast_node.get_node().length; ++j)
result[i++] = ast_node.get_node().has_zero_padding ? '0' : ' ';
//i += ast_node.get_node().length;
}
}

View File

@ -87,8 +87,14 @@ constexpr inline void copy2(char* dst, const char* src) {
}
template <typename uint_t>
constexpr inline void format_decimal(char* out, uint_t value, int size) {
if (count_digits(value) > size) return;
constexpr inline void format_decimal(char* out, uint_t value, int n_digits,
int size) {
if (n_digits > size) {
for (int i = 0; i < size; ++i) {
*(out++) = 'f';
}
return;
}
out += size;
while (value >= 100) {
@ -114,21 +120,27 @@ constexpr inline void format_decimal(char* out, uint_t value, int size) {
*/
template <std::unsigned_integral uint_t>
constexpr inline void format_int(char* out, uint_t value, fmt_data_t fmt_node) {
format_decimal(out, value, fmt_node.length);
template <std::unsigned_integral uint_t, fmt_data_t t_fmt_node>
constexpr inline void format_int(char* out, uint_t value) {
format_decimal(out, value, count_digits(value), t_fmt_node.length);
}
template <std::signed_integral uint_t>
constexpr inline void format_int(char* out, uint_t value, fmt_data_t fmt_node) {
auto abs_value = static_cast<uint64_t>(value);
template <std::signed_integral int_t, fmt_data_t t_fmt_node>
constexpr inline void format_int(char* out, int_t value) {
uint64_t abs_value = static_cast<uint64_t>(value);
const bool negative = value < 0;
if (negative) abs_value = 0 - abs_value;
format_decimal(out + 1 * (negative), abs_value,
fmt_node.length - 1 * (negative));
if (negative) *out = '-';
const int n_digits = count_digits(abs_value);
format_decimal(out + 1 * (negative), abs_value, n_digits,
t_fmt_node.length - 1 * (negative));
if constexpr (t_fmt_node.has_zero_padding) {
if (negative) *(out) = '-';
} else {
if (negative) *(out + t_fmt_node.length - n_digits - 1) = '-';
}
}
@ -139,12 +151,11 @@ constexpr inline void format_int(char* out, uint_t value, fmt_data_t fmt_node) {
*/
template <std::floating_point float_t>
constexpr inline void format_float(char* out, float_t value,
fmt_data_t fmt_data) {
template <std::floating_point float_t, fmt_data_t t_fmt_node>
constexpr inline void format_float(char* out, float_t value) {
*(out) = 'f';
*(out + fmt_data.length - fmt_data.precision - 1) = '.';
*(out + t_fmt_node.length - t_fmt_node.precision - 1) = '.';
}