40 template<
typename Iterator,
typename Skipper = ascii::space_type>
41 struct MpfrFloatParser : qi::grammar<Iterator, real_mp(), boost::spirit::ascii::space_type>
47 namespace phx = boost::phoenix;
58 (
real_mp & B, std::string
const& P)
63 auto digits =
max(P.size(),
static_cast<decltype(P.size())
>(asdf));
65 B.precision(
static_cast<unsigned>(digits));
66 B =
real_mp(P,
static_cast<unsigned>(digits));
72 qi::on_error<qi::fail>(
84 template<
typename Iterator,
typename Skipper = ascii::space_type>
85 struct MpfrComplexParser : qi::grammar<Iterator, complex_mp(), boost::spirit::ascii::space_type>
91 namespace phx = boost::phoenix;
102 auto digits =
max(P.precision(),Q.precision());
119 template <
typename Iterator>
120 static bool parse(Iterator first, Iterator last,
double& c)
122 using boost::spirit::qi::double_;
123 using boost::spirit::qi::_1;
124 using boost::spirit::qi::phrase_parse;
125 using boost::spirit::ascii::space;
126 using boost::phoenix::ref;
129 bool r = phrase_parse(first, last,
131 double_[ref(rN) = _1]
135 if (!r || first != last)
143 template <
typename Iterator>
144 static bool parse(Iterator first, Iterator last, std::complex<double>& c)
146 using boost::spirit::qi::double_;
147 using boost::spirit::qi::_1;
148 using boost::spirit::qi::phrase_parse;
149 using boost::spirit::ascii::space;
150 using boost::phoenix::ref;
154 bool r = phrase_parse(first, last,
156 double_[ref(rN) = _1]
157 >> -(double_[ref(iN) = _1])
158 | double_[ref(rN) = _1]
162 if (!r || first != last)
164 c = std::complex<double>(rN, iN);
173 template <
typename Iterator>
176 using boost::spirit::qi::double_;
177 using boost::spirit::qi::_1;
178 using boost::spirit::qi::phrase_parse;
179 using boost::spirit::ascii::space;
180 using boost::phoenix::ref;
185 bool r = phrase_parse(first, last,
191 if (!r || first != last)
193 c.precision(rN.precision());
203 template <
typename Iterator>
206 using boost::spirit::qi::double_;
207 using boost::spirit::qi::_1;
208 using boost::spirit::qi::phrase_parse;
209 using boost::spirit::ascii::space;
210 using boost::phoenix::ref;
215 bool r = phrase_parse(first, last,
220 if (!r || first != last)
222 c.precision(rN.precision());
234 template <
typename Iterator>
235 static bool parse(Iterator first, Iterator last,
double& c)
237 using boost::spirit::qi::double_;
238 using boost::spirit::qi::_1;
239 using boost::spirit::qi::phrase_parse;
240 using boost::spirit::ascii::space;
241 using boost::phoenix::ref;
244 bool r = phrase_parse(first, last,
246 double_[ref(rN) = _1]
250 if (!r || first != last)
259 template <
typename Iterator>
260 static bool parse(Iterator first, Iterator last, std::complex<double>& c)
262 using boost::spirit::qi::double_;
263 using boost::spirit::qi::_1;
264 using boost::spirit::qi::phrase_parse;
265 using boost::spirit::ascii::space;
266 using boost::phoenix::ref;
270 bool r = phrase_parse(first, last,
272 '(' >> double_[ref(rN) = _1]
273 >> -(
',' >> double_[ref(iN) = _1]) >>
')'
274 | double_[ref(rN) = _1]
278 if (!r || first != last)
280 c = std::complex<double>(rN, iN);
Definition classic_utilities.hpp:41
void ReportParseError(std::string::const_iterator begin, std::string::const_iterator end, std::string::const_iterator err_pos, boost::spirit::info const &what, std::string const &parser_name)
Report a parse error (via FormatParseError) to the log, for use in a Spirit on_error handler.
Definition qi_files.hpp:199
bool parse(Iterator first, Iterator last, std::shared_ptr< bertini::node::Node > &func)
Parse a function expression from the iterator range into a node tree.
Definition function_parsers.hpp:46
Definition number_parsers.hpp:231
static bool parse(Iterator first, Iterator last, double &c)
Parse a double from the iterator range.
Definition number_parsers.hpp:235
Definition classic_utilities.hpp:40
T max(T const &a, T const &b, T const &c)
Three-argument form of max.
Definition mpfr_extensions.hpp:96
Definition algorithm_builder.hpp:36
bmp::number< mpc_complex_backend< 0 >, bmp::et_on > complex_mp
The arbitrary-precision complex number type.
Definition mpfr_complex.hpp:58
auto DefaultPrecision()
Get the global default precision (digits) for multiprecision numbers.
Definition mpfr_complex.hpp:135
boost::multiprecision::number< boost::multiprecision::mpfr_float_backend< 0 >, boost::multiprecision::et_on > real_mp
The arbitrary-precision real number type.
Definition mpfr_extensions.hpp:53
constexpr unsigned LowestMultiplePrecision()
The lowest multiple-precision digit count used (20).
Definition num_traits.hpp:159
Provides the parsersing rules for numbers in bertini2.
A Qi grammar parsing a complex multiprecision number (real then imaginary part).
Definition number_parsers.hpp:86
MpfrFloatParser< Iterator > mpfr_float_
The real-part parser, used for both components.
Definition number_parsers.hpp:115
MpfrComplexParser()
Construct the complex-multiprecision parser.
Definition number_parsers.hpp:88
qi::rule< Iterator, complex_mp(), Skipper > root_rule_
The grammar's root rule.
Definition number_parsers.hpp:114
A Qi grammar parsing a real multiprecision number, at a precision matching the input's digits.
Definition number_parsers.hpp:42
MpfrFloatParser()
Construct the real-multiprecision parser.
Definition number_parsers.hpp:44
rules::LongNum< Iterator > mpfr_rules_
Sub-rules matching arbitrary-length number strings.
Definition number_parsers.hpp:79
qi::rule< Iterator, real_mp(), Skipper > root_rule_
The grammar's root rule.
Definition number_parsers.hpp:78