30domain_t find_domain(
const std::string &s)
33 return s.find(
'.') == std::string::npos ? domain_t::d_int
35 return domain_t::d_string;
44 register_symbol<real::abs> (
"FABS", 1);
45 register_symbol<real::add> (
"FADD", 1);
46 register_symbol<real::aq> (
"FAQ", 1);
47 register_symbol<real::cos> (
"FCOS", 1);
48 register_symbol<real::div> (
"FDIV", 1);
49 register_symbol<real::idiv> (
"FIDIV", 1);
50 register_symbol<real::ife> (
"FIFE", 2);
51 register_symbol<real::ifl> (
"FIFL", 2);
52 register_symbol<real::ifz> (
"FIFZ", 1);
53 register_symbol<real::length> (
"FLENGTH", 2);
54 register_symbol<real::ln> (
"FLN", 1);
55 register_symbol<real::max> (
"FMAX", 1);
56 register_symbol<real::mod> (
"FMOD", 1);
57 register_symbol<real::mul> (
"FMUL", 1);
58 register_symbol<real::integer>(
"REAL", 1);
59 register_symbol<real::sigmoid>(
"FSIGMOID", 1);
60 register_symbol<real::sin> (
"FSIN", 1);
61 register_symbol<real::sqrt> (
"FSQRT", 1);
62 register_symbol<real::sub> (
"FSUB", 1);
64 register_symbol<integer::add> (
"ADD", 1);
65 register_symbol<integer::div> (
"DIV", 1);
66 register_symbol<integer::ife> (
"IFE", 2);
67 register_symbol<integer::ifl> (
"IFL", 2);
68 register_symbol<integer::ifz> (
"IFZ", 1);
69 register_symbol<integer::mod> (
"MOD", 1);
70 register_symbol<integer::mul> (
"MUL", 1);
71 register_symbol<integer::number>(
"INT", 1);
72 register_symbol<integer::shl> (
"SHL", 1);
73 register_symbol<integer::sub> (
"SUB", 1);
75 register_symbol<str::ife>(
"SIFE", 2);
115 Expects(!name.empty());
118 if (
const auto it = factory_.find(name); it != factory_.end())
120 while (c.size() < it->second.args)
123 return it->second.make(c);
126 switch (find_domain(name))
128 case domain_t::d_double:
129 return std::make_unique<constant<double>>(name, c[0]);
130 case domain_t::d_int:
131 return std::make_unique<constant<int>>(name, c[0]);
132 case domain_t::d_string:
133 return std::make_unique<constant<std::string>>(name, c[0]);
157 Expects(d == domain_t::d_double || d == domain_t::d_int);
161 case domain_t::d_double:
162 return std::make_unique<real::integer>(cvect{c}, min, max);
163 case domain_t::d_int:
164 return std::make_unique<integer::number>(cvect{c}, min, max);
176 const auto it(factory_.find(name));
178 return it == factory_.end() ? 1 : it->second.args;
193 return factory_.erase(name) == 1;
symbol_factory()
The factory is preloaded with a number of common symbols.
std::size_t args(const std::string &) const
bool unregister_symbol(const std::string &)
Unregister the symbol from the factory.
std::unique_ptr< symbol > make(const std::string &, cvect={0})
Creates a specific instance of a symbol.
The main namespace for the project.
domain_t
In an environment where a symbol such as '+' may have many different meanings, it's useful to specify...
std::size_t category_t
A category provide operations which supplement or supersede those of the domain but which are restric...