Fixed issues with minus on integers
This commit is contained in:
parent
0557bd1651
commit
ba86cc40a5
18
inc/format.h
18
inc/format.h
@ -33,21 +33,32 @@ constexpr int get_output_len() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: See if this is possible with <charconv>
|
// TODO: See if this is possible with <charconv>
|
||||||
|
// TODO: Steal some code from fmtlib
|
||||||
template <fmt_node_t fmt_node, std::integral arg_t>
|
template <fmt_node_t fmt_node, std::integral arg_t>
|
||||||
constexpr std::array<char, fmt_node.length> format_arg(arg_t arg) {
|
constexpr std::array<char, fmt_node.length> format_arg(arg_t arg) {
|
||||||
check_fmt_params<fmt_node, arg_t>();
|
check_fmt_params<fmt_node, arg_t>();
|
||||||
|
|
||||||
auto result = get_init_array<fmt_node>();
|
auto result = get_init_array<fmt_node>();
|
||||||
|
|
||||||
for (unsigned i = 1; (i <= result.size()) && arg > 0; ++i) {
|
unsigned offset = 0;
|
||||||
result[result.size() - i] = arg % 10 + 48;
|
|
||||||
arg = arg / 10;
|
// TODO: Does making this branchless make it more efficient?
|
||||||
|
if (arg < 0) {
|
||||||
|
result[0] = '-';
|
||||||
|
arg = -arg;
|
||||||
|
++offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = result.size() - 1; (i >= offset) && (arg > 0); --i) {
|
||||||
|
result[i] = arg % 10 + 48;
|
||||||
|
arg = arg / 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: See if this is possible with <charconv>
|
// TODO: See if this is possible with <charconv>
|
||||||
|
// TODO: Steal some code from fmtlib
|
||||||
template <fmt_node_t fmt_node, std::floating_point arg_t>
|
template <fmt_node_t fmt_node, std::floating_point arg_t>
|
||||||
constexpr std::array<char, fmt_node.length> format_arg(arg_t arg) {
|
constexpr std::array<char, fmt_node.length> format_arg(arg_t arg) {
|
||||||
check_fmt_params<fmt_node, arg_t>();
|
check_fmt_params<fmt_node, arg_t>();
|
||||||
@ -76,6 +87,7 @@ constexpr std::array<char, fmt_node.length> format_arg(arg_t arg) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Steal some code from fmtlib
|
||||||
template <fmt_node_t fmt_node>
|
template <fmt_node_t fmt_node>
|
||||||
constexpr std::array<char, fmt_node.length> format_arg(const char* arg) {
|
constexpr std::array<char, fmt_node.length> format_arg(const char* arg) {
|
||||||
check_fmt_params<fmt_node, const char*>();
|
check_fmt_params<fmt_node, const char*>();
|
||||||
|
|||||||
@ -4,8 +4,6 @@
|
|||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include "parse_types.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
|
|||||||
10
src/main.cpp
10
src/main.cpp
@ -3,16 +3,8 @@
|
|||||||
#include <Logger.h>
|
#include <Logger.h>
|
||||||
|
|
||||||
|
|
||||||
class Uart {
|
|
||||||
public:
|
|
||||||
void write(char c) {
|
|
||||||
std::cout << c;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
constexpr auto formatted = format<"Test: {:012.5} {} {:034}">(142.4334, "abc", 1234);
|
constexpr auto formatted = format<"Test: {:012.5} {} {:8}">(142.4334, "abc", -1234);
|
||||||
|
|
||||||
for (const auto& c : formatted)
|
for (const auto& c : formatted)
|
||||||
std::cout << c;
|
std::cout << c;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user