39 template<
typename Iterator,
typename Skipper = ascii::space_type>
40 struct MpfrFloatParser : qi::grammar<Iterator, mpfr_float(), boost::spirit::ascii::space_type>
42 MpfrFloatParser() : MpfrFloatParser::base_type(root_rule_,
"MpfrFloatParser")
45 namespace phx = boost::phoenix;
52 root_rule_.name(
"mpfr_float");
53 root_rule_ = mpfr_rules_.number_string_
56 (mpfr_float & B, std::string
const& P)
59 auto prev_prec = DefaultPrecision();
60 auto asdf =
max(prev_prec,LowestMultiplePrecision());
61 auto digits =
max(P.size(),
static_cast<decltype(P.size())
>(asdf));
64 B = mpfr_float(P,digits);
72 using namespace qi::labels;
73 qi::on_error<qi::fail>
76 val(
"mpfr_float parser could not complete parsing. Expecting ")<<
79 construct<std::string>(_3,_2)<<
84 qi::rule<Iterator, mpfr_float(), Skipper > root_rule_;
85 rules::LongNum<Iterator> mpfr_rules_;
89 template<
typename Iterator,
typename Skipper = ascii::space_type>
90 struct MpfrComplexParser : qi::grammar<Iterator, mpfr_complex(), boost::spirit::ascii::space_type>
92 MpfrComplexParser() : MpfrComplexParser::base_type(root_rule_,
"MpfrComplexParser")
95 namespace phx = boost::phoenix;
101 (mpfr_float_ >> mpfr_float_)
104 (mpfr_complex & B, mpfr_float
const& P, mpfr_float
const& Q)
106 auto prev_prec = DefaultPrecision();
107 auto digits =
max(P.precision(),Q.precision());
119 qi::rule<Iterator, mpfr_complex(), Skipper > root_rule_;
120 MpfrFloatParser<Iterator> mpfr_float_;
123 template <
typename Iterator>
124 static bool parse(Iterator first, Iterator last,
double& c)
126 using boost::spirit::qi::double_;
127 using boost::spirit::qi::_1;
128 using boost::spirit::qi::phrase_parse;
129 using boost::spirit::ascii::space;
130 using boost::phoenix::ref;
133 bool r = phrase_parse(first, last,
135 double_[ref(rN) = _1]
139 if (!r || first != last)
146 template <
typename Iterator>
147 static bool parse(Iterator first, Iterator last, std::complex<double>& c)
149 using boost::spirit::qi::double_;
150 using boost::spirit::qi::_1;
151 using boost::spirit::qi::phrase_parse;
152 using boost::spirit::ascii::space;
153 using boost::phoenix::ref;
157 bool r = phrase_parse(first, last,
159 double_[ref(rN) = _1]
160 >> -(double_[ref(iN) = _1])
161 | double_[ref(rN) = _1]
165 if (!r || first != last)
167 c = std::complex<double>(rN, iN);
175 template <
typename Iterator>
176 static bool parse(Iterator first, Iterator last, mpfr_float& c)
178 using boost::spirit::qi::double_;
179 using boost::spirit::qi::_1;
180 using boost::spirit::qi::phrase_parse;
181 using boost::spirit::ascii::space;
182 using boost::phoenix::ref;
184 MpfrFloatParser<Iterator> S;
187 bool r = phrase_parse(first, last,
193 if (!r || first != last)
195 c.precision(rN.precision());
204 template <
typename Iterator>
205 static bool parse(Iterator first, Iterator last, mpfr_complex& c)
207 using boost::spirit::qi::double_;
208 using boost::spirit::qi::_1;
209 using boost::spirit::qi::phrase_parse;
210 using boost::spirit::ascii::space;
211 using boost::phoenix::ref;
213 MpfrComplexParser<Iterator> S;
216 bool r = phrase_parse(first, last,
221 if (!r || first != last)
223 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)
258 template <
typename Iterator>
259 static bool parse(Iterator first, Iterator last, std::complex<double>& c)
261 using boost::spirit::qi::double_;
262 using boost::spirit::qi::_1;
263 using boost::spirit::qi::phrase_parse;
264 using boost::spirit::ascii::space;
265 using boost::phoenix::ref;
269 bool r = phrase_parse(first, last,
271 '(' >> double_[ref(rN) = _1]
272 >> -(
',' >> double_[ref(iN) = _1]) >>
')'
273 | double_[ref(rN) = _1]
277 if (!r || first != last)
279 c = std::complex<double>(rN, iN);
T max(T const &a, T const &b, T const &c)
Three-argument form of max.
Definition mpfr_extensions.hpp:98
Provides the parsersing rules for numbers in bertini2.