23 template<IsNumber NumericType, u
int8_t ArgumentAmount>
27 m_Data = std::make_unique<Data>();
28 NumericType e =
static_cast<NumericType
>(std::numbers::e);
29 m_Data->m_SymbolTable.add_constant(
"e", e);
30 m_Data->m_SymbolTable.add_constants();
47 if (!m_ValuesRegistered) {
48 if (argNames.size() != ArgumentAmount) {
53 m_Data->m_ArgNames = argNames;
55 for (uint8_t i = 0; i < ArgumentAmount; ++i) {
56 m_Data->m_SymbolTable.add_variable(argNames[i], m_Data->m_ArgValues[i]);
58 m_ValuesRegistered =
true;
68 bool AddConstant(
const std::string& alias,
const NumericType value) {
69 return m_Data->m_SymbolTable.add_constant(alias, value);
77 void AddAlias(
const std::string& aliasName,
const std::string& aliasExpression) {
78 auto aliasFunc =
typename exprtk::function_compositor<NumericType>::function(aliasName);
80 for (
const auto& argName : m_Data->m_ArgNames) {
81 aliasFunc.var(argName);
84 aliasFunc.expression(aliasExpression);
86 if (!m_Data->m_Compositor.add(aliasFunc)) {
88 for (std::size_t i = 0; i < m_Data->m_Compositor.error_count(); ++i) {
89 exprtk::parser_error::type error = m_Data->m_Compositor.get_error(i);
100 void Parse(
const std::string& expression) {
102 m_Data->m_Expression.register_symbol_table(m_Data->m_SymbolTable);
104 static exprtk::parser<double> parser;
105 if (parser.compile(expression, m_Data->m_Expression)) {
110 for (std::size_t i = 0; i < parser.error_count(); ++i) {
111 exprtk::parser_error::type error = parser.get_error(i);
136 if (!m_ValuesRegistered) {
141 if (
sizeof...(args) != ArgumentAmount) {
148 ([&](
const auto& arg) {
149 m_Data->m_ArgValues[index++] =
static_cast<NumericType
>(arg);
152 NumericType result = m_Data->m_Expression.value();
162 std::array<NumericType, ArgumentAmount> m_ArgValues;
163 std::vector<std::string> m_ArgNames;
164 exprtk::symbol_table<NumericType> m_SymbolTable{};
165 exprtk::expression<NumericType> m_Expression;
166 exprtk::function_compositor<NumericType> m_Compositor;
167 uint8_t m_ArgAmount = ArgumentAmount;
169 Data() : m_Compositor(m_SymbolTable) {}
172 std::unique_ptr<Data> m_Data{
nullptr };
173 bool m_Valid{
false };
174 bool m_ValuesRegistered{
false };
#define CORI_CORE_ERROR_TAGGED(...)
#define CORI_CORE_WARN_TAGGED(...)
void Parse(const std::string &expression)
Parses the main mathematical expression. Can use any aliases created with AddAlias.
void RegisterValues(const std::vector< std::string > &argNames)
Registers the names of the arguments for the function. This must be called before AddAlias or Parse.
Function & operator=(const Function &)=delete
Function & operator=(Function &&other) noexcept=default
void AddAlias(const std::string &aliasName, const std::string &aliasExpression)
Creates a parameterized alias (a composited function). The alias will accept the same parameters as r...
bool AddConstant(const std::string &alias, const NumericType value)
Ads a constant to the registered values.
Function(const Function &)=delete
NumericType operator()(const IsNumber auto &... args)
Makes function object a callable. Calculates the main expression result based on the passed values....
Function(Function &&other) noexcept=default
Anything custom connected to math is in this namespace.