Refactored get_init_array() and get_zero_array() to get_init_array(char); Made all free functions inline
This commit is contained in:
parent
c0d0bb5bad
commit
a0230a7e27
27
inc/format.h
27
inc/format.h
@ -20,7 +20,7 @@ namespace detail {
|
|||||||
|
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr int get_output_len() {
|
constexpr inline int get_output_len() {
|
||||||
constexpr auto parse_result = parse_string<s>();
|
constexpr auto parse_result = parse_string<s>();
|
||||||
static_assert(parse_result.is_valid, "Syntax error in format string");
|
static_assert(parse_result.is_valid, "Syntax error in format string");
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ constexpr int get_output_len() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <fmt_node_t fmt_node, typename T>
|
template <fmt_node_t fmt_node, typename T>
|
||||||
constexpr void check_fmt_params() {
|
constexpr inline void check_fmt_params() {
|
||||||
static_assert(fmt_node.length > fmt_node.precision + 1,
|
static_assert(fmt_node.length > fmt_node.precision + 1,
|
||||||
"Insufficient length for desired precision");
|
"Insufficient length for desired precision");
|
||||||
}
|
}
|
||||||
@ -40,19 +40,21 @@ constexpr void check_fmt_params() {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// TODO: Error handling
|
||||||
template <std::integral arg_t>
|
template <std::integral arg_t>
|
||||||
constexpr void format_arg(char* dest, fmt_data_t fmt_data, arg_t arg) {
|
constexpr inline void format_arg(char* dest, fmt_data_t fmt_data, arg_t arg) {
|
||||||
|
// constexpr auto error_array = get_init_array<fmt_data.length>('f');
|
||||||
|
|
||||||
detail::format_integral(dest, arg, fmt_data);
|
detail::format_integral(dest, arg, fmt_data);
|
||||||
};
|
};
|
||||||
|
// TODO: Error handling
|
||||||
template <std::floating_point arg_t>
|
template <std::floating_point arg_t>
|
||||||
constexpr void format_arg(char* dest, fmt_data_t fmt_data, arg_t) {
|
constexpr inline void format_arg(char* dest, fmt_data_t fmt_data, arg_t) {
|
||||||
*(dest) = 'f';
|
*(dest) = 'f';
|
||||||
*(dest + fmt_data.length - fmt_data.precision - 1) = '.';
|
*(dest + fmt_data.length - fmt_data.precision - 1) = '.';
|
||||||
};
|
};
|
||||||
// TODO: Error handling
|
// TODO: Error handling
|
||||||
constexpr void format_arg(char* dest, fmt_data_t fmt_data, const char* arg) {
|
constexpr inline void format_arg(char* dest, fmt_data_t fmt_data, const char* arg) {
|
||||||
const std::size_t len = const_strlen(arg);
|
const std::size_t len = const_strlen(arg);
|
||||||
if (len > fmt_data.length) return;
|
if (len > fmt_data.length) return;
|
||||||
|
|
||||||
@ -68,20 +70,21 @@ constexpr void format_arg(char* dest, fmt_data_t fmt_data, const char* arg) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// End of recursion
|
||||||
template <auto ast>
|
template <auto ast>
|
||||||
constexpr void format_args(char*) {
|
constexpr inline void format_args(char*) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template <auto fmt_data_array, typename first_arg_t, typename... args_t>
|
template <auto fmt_data_array, typename first_arg_t, typename... args_t>
|
||||||
constexpr void format_args(char* dest, first_arg_t first_arg, args_t... args) {
|
constexpr inline void format_args(char* dest, first_arg_t first_arg, args_t... args) {
|
||||||
format_arg(dest + fmt_data_array[0].position, fmt_data_array[0], first_arg);
|
format_arg(dest + fmt_data_array[0].position, fmt_data_array[0], first_arg);
|
||||||
format_args<drop_first(fmt_data_array)>(dest, args...);
|
format_args<drop_first(fmt_data_array)>(dest, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template <auto ast>
|
template <auto ast>
|
||||||
consteval std::array<char, get_ast_output_len<ast>()> get_preproc_string() {
|
consteval inline std::array<char, get_ast_output_len<ast>()> get_preproc_string() {
|
||||||
auto result = get_zero_array<get_ast_output_len<ast>()>();
|
auto result = get_init_array<get_ast_output_len<ast>()>('0');
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
@ -107,7 +110,7 @@ consteval std::array<char, get_ast_output_len<ast>()> get_preproc_string() {
|
|||||||
|
|
||||||
|
|
||||||
template <detail::ConstString s, typename... args_t>
|
template <detail::ConstString s, typename... args_t>
|
||||||
constexpr auto format(args_t... args) {
|
constexpr inline auto format(args_t... args) {
|
||||||
constexpr auto ast = detail::parse_string<s>().value;
|
constexpr auto ast = detail::parse_string<s>().value;
|
||||||
constexpr auto fmt_data = detail::get_fmt_data<ast>();
|
constexpr auto fmt_data = detail::get_fmt_data<ast>();
|
||||||
|
|
||||||
|
|||||||
@ -47,9 +47,6 @@ constexpr inline void copy2(char* dst, const char* src) {
|
|||||||
|
|
||||||
template <typename UInt>
|
template <typename UInt>
|
||||||
constexpr inline void format_decimal(char* out, UInt value, int size) {
|
constexpr inline void format_decimal(char* out, UInt value, int size) {
|
||||||
// TODO: Error handling (Maybe calculate "ffff..." as a constant expression
|
|
||||||
// and then set the out pointer with a branchless statement)
|
|
||||||
|
|
||||||
out += size;
|
out += size;
|
||||||
while (value >= 100) {
|
while (value >= 100) {
|
||||||
out -= 2;
|
out -= 2;
|
||||||
|
|||||||
18
inc/parse.h
18
inc/parse.h
@ -48,7 +48,7 @@ namespace detail {
|
|||||||
|
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr unsigned count_braces() {
|
constexpr inline unsigned count_braces() {
|
||||||
unsigned result = 0;
|
unsigned result = 0;
|
||||||
|
|
||||||
for (unsigned i = 0; i < s.size(); ++i) {
|
for (unsigned i = 0; i < s.size(); ++i) {
|
||||||
@ -59,7 +59,7 @@ constexpr unsigned count_braces() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr unsigned strlen_braces() {
|
constexpr inline unsigned strlen_braces() {
|
||||||
unsigned result = 0;
|
unsigned result = 0;
|
||||||
|
|
||||||
bool brace_open = false;
|
bool brace_open = false;
|
||||||
@ -81,7 +81,7 @@ constexpr unsigned strlen_braces() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr int get_ast_len() {
|
constexpr inline int get_ast_len() {
|
||||||
return (s.size() - strlen_braces<s>() + count_braces<s>());
|
return (s.size() - strlen_braces<s>() + count_braces<s>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,13 +94,13 @@ constexpr int get_ast_len() {
|
|||||||
|
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr bool is_digit(unsigned i) {
|
constexpr inline bool is_digit(unsigned i) {
|
||||||
return (s[i] > 47) && (s[i] < 58);
|
return (s[i] > 47) && (s[i] < 58);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr parse_result_t<unsigned> parse_number(unsigned i) {
|
constexpr inline parse_result_t<unsigned> parse_number(unsigned i) {
|
||||||
unsigned number = 0;
|
unsigned number = 0;
|
||||||
|
|
||||||
if (!is_digit<s>(i)) {
|
if (!is_digit<s>(i)) {
|
||||||
@ -117,7 +117,7 @@ constexpr parse_result_t<unsigned> parse_number(unsigned i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr parse_result_t<FormatType> parse_type(unsigned i) {
|
constexpr inline parse_result_t<FormatType> parse_type(unsigned i) {
|
||||||
switch (s[i]) {
|
switch (s[i]) {
|
||||||
case 's':
|
case 's':
|
||||||
return {true, ++i, FormatType::s};
|
return {true, ++i, FormatType::s};
|
||||||
@ -159,7 +159,7 @@ constexpr parse_result_t<FormatType> parse_type(unsigned i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr parse_result_t<fmt_node_t> parse_fmt_string(unsigned i) {
|
constexpr inline parse_result_t<fmt_node_t> parse_fmt_string(unsigned i) {
|
||||||
fmt_node_t result;
|
fmt_node_t result;
|
||||||
|
|
||||||
if (s[i] == '0') {
|
if (s[i] == '0') {
|
||||||
@ -193,7 +193,7 @@ constexpr parse_result_t<fmt_node_t> parse_fmt_string(unsigned i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr parse_result_t<fmt_node_t> parse_braces(unsigned i) {
|
constexpr inline parse_result_t<fmt_node_t> parse_braces(unsigned i) {
|
||||||
if (s[i] == '}') {
|
if (s[i] == '}') {
|
||||||
++i;
|
++i;
|
||||||
return {true, i, {}};
|
return {true, i, {}};
|
||||||
@ -214,7 +214,7 @@ constexpr parse_result_t<fmt_node_t> parse_braces(unsigned i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <ConstString s>
|
template <ConstString s>
|
||||||
constexpr parse_result_t<string_result_t<get_ast_len<s>()>> parse_string() {
|
constexpr inline parse_result_t<string_result_t<get_ast_len<s>()>> parse_string() {
|
||||||
parse_result_t<string_result_t<get_ast_len<s>()>> result;
|
parse_result_t<string_result_t<get_ast_len<s>()>> result;
|
||||||
result.is_valid = true;
|
result.is_valid = true;
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
|
|
||||||
constexpr std::size_t const_pow(std::size_t base, std::size_t pow) {
|
constexpr inline std::size_t const_pow(std::size_t base, std::size_t pow) {
|
||||||
if (pow == 0)
|
if (pow == 0)
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else
|
||||||
@ -18,34 +18,44 @@ constexpr std::size_t const_pow(std::size_t base, std::size_t pow) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//template <std::size_t t_n>
|
||||||
|
//constexpr std::array<char, t_n> get_zero_array() {
|
||||||
|
// std::array<char, t_n> result;
|
||||||
|
//
|
||||||
|
// for (auto& c : result)
|
||||||
|
// c = '0';
|
||||||
|
//
|
||||||
|
// return result;
|
||||||
|
//}
|
||||||
|
|
||||||
template <std::size_t t_n>
|
template <std::size_t t_n>
|
||||||
constexpr std::array<char, t_n> get_zero_array() {
|
constexpr inline std::array<char, t_n> get_init_array(char val) {
|
||||||
std::array<char, t_n> result;
|
std::array<char, t_n> result;
|
||||||
|
|
||||||
for (auto& c : result)
|
for (auto& c : result)
|
||||||
c = '0';
|
c = val;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <fmt_node_t fmt_node>
|
//template <fmt_node_t fmt_node>
|
||||||
constexpr std::array<char, fmt_node.length> get_init_array() {
|
//constexpr std::array<char, fmt_node.length> get_init_array() {
|
||||||
std::array<char, fmt_node.length> result;
|
// std::array<char, fmt_node.length> result;
|
||||||
|
//
|
||||||
if constexpr (fmt_node.has_zero_padding) {
|
// if constexpr (fmt_node.has_zero_padding) {
|
||||||
for (auto& c : result)
|
// for (auto& c : result)
|
||||||
c = '0';
|
// c = '0';
|
||||||
} else {
|
// } else {
|
||||||
for (auto& c : result)
|
// for (auto& c : result)
|
||||||
c = ' ';
|
// c = ' ';
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
return result;
|
// return result;
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
template <auto ast>
|
template <auto ast>
|
||||||
consteval std::size_t count_ast_format_nodes() {
|
consteval inline std::size_t count_ast_format_nodes() {
|
||||||
std::size_t result = 0;
|
std::size_t result = 0;
|
||||||
|
|
||||||
for (const auto& node : ast)
|
for (const auto& node : ast)
|
||||||
@ -56,7 +66,7 @@ consteval std::size_t count_ast_format_nodes() {
|
|||||||
|
|
||||||
|
|
||||||
template <auto ast>
|
template <auto ast>
|
||||||
consteval std::array<fmt_data_t, count_ast_format_nodes<ast>()> get_fmt_data() {
|
consteval inline std::array<fmt_data_t, count_ast_format_nodes<ast>()> get_fmt_data() {
|
||||||
std::array<fmt_data_t, count_ast_format_nodes<ast>()> result = {};
|
std::array<fmt_data_t, count_ast_format_nodes<ast>()> result = {};
|
||||||
|
|
||||||
std::size_t position = 0;
|
std::size_t position = 0;
|
||||||
@ -84,7 +94,7 @@ consteval std::array<fmt_data_t, count_ast_format_nodes<ast>()> get_fmt_data() {
|
|||||||
|
|
||||||
|
|
||||||
template <typename elem_t, std::size_t t_n>
|
template <typename elem_t, std::size_t t_n>
|
||||||
consteval std::array<elem_t, t_n - 1>
|
consteval inline std::array<elem_t, t_n - 1>
|
||||||
drop_first(std::array<elem_t, t_n> array) {
|
drop_first(std::array<elem_t, t_n> array) {
|
||||||
static_assert(t_n > 0,
|
static_assert(t_n > 0,
|
||||||
"Can't drop first element of array with no elements");
|
"Can't drop first element of array with no elements");
|
||||||
@ -98,7 +108,7 @@ drop_first(std::array<elem_t, t_n> array) {
|
|||||||
|
|
||||||
|
|
||||||
template <auto t_ast>
|
template <auto t_ast>
|
||||||
consteval int get_ast_output_len() {
|
consteval inline int get_ast_output_len() {
|
||||||
unsigned result = 0;
|
unsigned result = 0;
|
||||||
|
|
||||||
for (const auto& ast_node : t_ast) {
|
for (const auto& ast_node : t_ast) {
|
||||||
@ -111,7 +121,7 @@ consteval int get_ast_output_len() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr std::size_t const_strlen(const char* arg) {
|
constexpr inline std::size_t const_strlen(const char* arg) {
|
||||||
if (std::is_constant_evaluated()) {
|
if (std::is_constant_evaluated()) {
|
||||||
return *arg ? 1 + const_strlen(arg + 1) : 0;
|
return *arg ? 1 + const_strlen(arg + 1) : 0;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user