/**
This file is a part of rexy's general purpose library
Copyright (C) 2022 rexy712
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef REXY_DETAIL_FORMAT_SPECS_HANDLER_HPP
#define REXY_DETAIL_FORMAT_SPECS_HANDLER_HPP
#include "../../compat/if_consteval.hpp"
namespace rexy::fmt::detail{
//Stores standard format-spec information to use later in formatting
template
struct format_specs_handler{
ParseCtx& parse_ctx;
FmtCtx& fmt_ctx;
format_specs& specs;
constexpr format_specs_handler(ParseCtx& pc, FmtCtx& fc, format_specs& s):
parse_ctx(pc),
fmt_ctx(fc),
specs(s){}
constexpr void on_width(int w);
constexpr void on_dynamic_width(void);
constexpr void on_dynamic_width(int index);
template
constexpr void on_dynamic_width(It first, It last);
constexpr void on_precision(int p);
constexpr void on_dynamic_precision(void);
constexpr void on_dynamic_precision(int index);
template
constexpr void on_dynamic_precision(It first, It last);
constexpr void on_locale(void);
constexpr void on_type_option(int o = 0);
constexpr void on_align(int al, int val);
constexpr void on_sign(int s);
constexpr void on_alt_form(void);
constexpr void on_zero_fill(void);
};
//Stores standard format-spec information to use later in formatting. Stores indices of dynamic specifiers
//to be retrieved later.
template
struct dynamic_format_specs_handler{
using specs_type = dynamic_format_specs;
ParseCtx& parse_ctx;
specs_type& specs;
constexpr dynamic_format_specs_handler(ParseCtx& pc, specs_type& s);
constexpr void on_width(int w);
constexpr void on_dynamic_width(void);
constexpr void on_dynamic_width(int index);
template
constexpr void on_dynamic_width(It first, It last);
constexpr void on_precision(int p);
constexpr void on_dynamic_precision(void);
constexpr void on_dynamic_precision(int index);
template
constexpr void on_dynamic_precision(It first, It last);
constexpr void on_locale(void);
constexpr void on_type_option(int o = 0);
constexpr void on_align(int al, int val);
constexpr void on_sign(int s);
constexpr void on_alt_form(void);
constexpr void on_zero_fill(void);
};
//Used during compile time only. Checks dynamic specifiers given types pack as template parameters.
template
struct cx_format_specs_handler : public dynamic_format_specs_handler{
using char_type = typename ParseCtx::char_type;
constexpr cx_format_specs_handler(ParseCtx& pc, dynamic_format_specs& s):
dynamic_format_specs_handler(pc, s){
REXY_if_not_consteval{
throw 0;
}
}
constexpr void on_dynamic_width(void);
constexpr void on_dynamic_width(int index);
template
constexpr void on_dynamic_width(It first, It last);
constexpr void on_dynamic_precision(void);
constexpr void on_dynamic_precision(int index);
template
constexpr void on_dynamic_precision(It first, It last);
};
template
struct format_specs_checker : public Handler{
storage_type arg_type = storage_type::none_t;
bool requires_arithmetic_presentation = false;
constexpr format_specs_checker(const Handler& h, storage_type type);
constexpr void on_precision(int p);
constexpr void on_dynamic_precision(void);
constexpr void on_dynamic_precision(int index);
template
constexpr void on_dynamic_precision(It first, It last);
constexpr void on_locale(void);
constexpr void on_sign(int s);
constexpr void on_alt_form(void);
constexpr void on_zero_fill(void);
constexpr void on_type_option(int type = 0);
private:
constexpr void check_precision(void);
constexpr void check_arithmetic_type(void);
};
}
#endif