PageRenderTime 57ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 2ms

/exprtk.hpp

http://exprtk.codeplex.com
C++ Header | 10925 lines | 9219 code | 1577 blank | 129 comment | 1589 complexity | d77335b11214244e1477262350bde5de MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. ****************************************************************
  3. * C++ Mathematical Expression Toolkit Library *
  4. * *
  5. * Author: Arash Partow (1999-2013) *
  6. * URL: http://www.partow.net/programming/exprtk/index.html *
  7. * *
  8. * Copyright notice: *
  9. * Free use of the C++ Mathematical Expression Toolkit Library *
  10. * is permitted under the guidelines and in accordance with the *
  11. * most current version of the Common Public License. *
  12. * http://www.opensource.org/licenses/cpl1.0.php *
  13. * *
  14. * Example expressions: *
  15. * (00) (y+x/y)*(x-y/x) *
  16. * (01) (x^2/sin(2*pi/y))-x/2 *
  17. * (02) sqrt(1-(x^2)) *
  18. * (03) 1-sin(2*x)+cos(pi/y) *
  19. * (04) a*exp(2*t)+c *
  20. * (05) if(((x+2)==3)and((y+5)<=9),1+w,2/z) *
  21. * (06) if(avg(x,y)<=x+y,x-y,x*y)+2*pi/x *
  22. * (07) z:=x+sin(2*pi/y) *
  23. * (08) u:=2*(pi*z)/(w:=x+cos(y/pi)) *
  24. * (09) clamp(-1,sin(2*pi*x)+cos(y/2*pi),+1) *
  25. * (10) inrange(-2,m,+2)==if(({-2<=m} and [m<=+2]),1,0) *
  26. * (11) (12.34sin(x)cos(2y)7+1)==(12.34*sin(x)*cos(2*y)*7+1) *
  27. * (12) (x ilike 's*ri?g') and [y<(3z^7+w)] *
  28. * *
  29. ****************************************************************
  30. */
  31. #ifndef INCLUDE_EXPRTK_HPP
  32. #define INCLUDE_EXPRTK_HPP
  33. #include <algorithm>
  34. #include <cctype>
  35. #include <cmath>
  36. #include <deque>
  37. #include <limits>
  38. #include <list>
  39. #include <map>
  40. #include <set>
  41. #include <stack>
  42. #include <stdexcept>
  43. #include <string>
  44. #ifndef exprtk_enable_all_optimizations
  45. # define exprtk_lean_and_mean
  46. # ifdef exprtk_lean_and_mean_numeric_only
  47. # ifndef exprtk_lean_and_mean
  48. # define exprtk_lean_and_mean
  49. # endif
  50. # ifndef exprtk_disable_string_capabilities
  51. # define exprtk_disable_string_capabilities
  52. # endif
  53. # endif
  54. # ifdef exprtk_lean_and_mean
  55. # ifndef exprtk_disable_extended_operator_optimizations
  56. # define exprtk_disable_extended_operator_optimizations
  57. # endif
  58. # ifndef exprtk_disable_extended_optimisations
  59. # define exprtk_disable_extended_optimisations
  60. # endif
  61. # endif
  62. #endif
  63. namespace exprtk
  64. {
  65. namespace details
  66. {
  67. inline bool is_whitespace(const char c)
  68. {
  69. return (' ' == c) || ('\n' == c) ||
  70. ('\r' == c) || ('\t' == c) ||
  71. ('\b' == c) || ('\v' == c) ||
  72. ('\f' == c) ;
  73. }
  74. inline bool is_operator_char(const char c)
  75. {
  76. return ('+' == c) || ('-' == c) ||
  77. ('*' == c) || ('/' == c) ||
  78. ('^' == c) || ('<' == c) ||
  79. ('>' == c) || ('=' == c) ||
  80. (',' == c) || ('!' == c) ||
  81. ('(' == c) || (')' == c) ||
  82. ('[' == c) || (']' == c) ||
  83. ('{' == c) || ('}' == c) ||
  84. ('%' == c) || (':' == c) ||
  85. ('?' == c);
  86. }
  87. inline bool is_letter(const char c)
  88. {
  89. return (('a' <= c) && (c <= 'z')) || (('A' <= c) && (c <= 'Z'));
  90. }
  91. inline bool is_digit(const char c)
  92. {
  93. return ('0' <= c) && (c <= '9');
  94. }
  95. inline bool is_letter_or_digit(const char c)
  96. {
  97. return is_letter(c) || is_digit(c);
  98. }
  99. inline bool is_left_bracket(const char c)
  100. {
  101. return ('(' == c) || ('[' == c) || ('{' == c);
  102. }
  103. inline bool is_right_bracket(const char c)
  104. {
  105. return (')' == c) || (']' == c) || ('}' == c);
  106. }
  107. inline bool is_bracket(const char c)
  108. {
  109. return is_left_bracket(c) || is_right_bracket(c);
  110. }
  111. inline bool is_sign(const char c)
  112. {
  113. return ('+' == c) || ('-' == c);
  114. }
  115. inline bool is_invalid(const char c)
  116. {
  117. return !is_whitespace(c) &&
  118. !is_operator_char(c) &&
  119. !is_letter(c) &&
  120. !is_digit(c) &&
  121. ('.' != c) &&
  122. ('_' != c) &&
  123. ('$' != c) &&
  124. ('\'' != c);
  125. }
  126. inline bool imatch(const char c1, const char c2)
  127. {
  128. return std::tolower(c1) == std::tolower(c2);
  129. }
  130. inline bool imatch(const std::string& s1, const std::string& s2)
  131. {
  132. if (s1.size() == s2.size())
  133. {
  134. for (std::size_t i = 0; i < s1.size(); ++i)
  135. {
  136. if (std::tolower(s1[i]) != std::tolower(s2[i]))
  137. {
  138. return false;
  139. }
  140. }
  141. return true;
  142. }
  143. return false;
  144. }
  145. inline bool is_valid_sf_symbol(const std::string& symbol)
  146. {
  147. //Special function: $f12 or $F34
  148. return (symbol.size() == 4) &&
  149. ('$' == symbol[0]) &&
  150. imatch('f',symbol[1]) &&
  151. is_digit(symbol[2]) &&
  152. is_digit(symbol[3]);
  153. }
  154. inline std::string to_str(int i)
  155. {
  156. if (0 == i)
  157. return std::string("0");
  158. std::string result;
  159. bool negative = (i < 0);
  160. if (negative) i *= -1;
  161. while (i)
  162. {
  163. char digit = '0' + char(i % 10);
  164. result = (digit + result);
  165. i /= 10;
  166. }
  167. if (negative)
  168. result = "-" + result;
  169. return result;
  170. }
  171. struct ilesscompare
  172. {
  173. inline bool operator()(const std::string& s1, const std::string& s2) const
  174. {
  175. const std::size_t length = std::min(s1.size(),s2.size());
  176. for (std::size_t i = 0; i < length; ++i)
  177. {
  178. if (std::tolower(s1[i]) > std::tolower(s2[i]))
  179. return false;
  180. else if (std::tolower(s1[i]) < std::tolower(s2[i]))
  181. return true;
  182. }
  183. return s1.size() < s2.size();
  184. }
  185. };
  186. static const std::string reserved_words[] =
  187. {
  188. "and", "false", "for", "if", "ilike", "in", "like", "nand", "nor", "not",
  189. "or", "shl", "shr", "true", "while", "xor"
  190. };
  191. static const std::size_t reserved_words_size = sizeof(reserved_words) / sizeof(std::string);
  192. static const std::string reserved_symbols[] =
  193. {
  194. "abs", "acos", "and", "asin", "atan", "atan2", "avg", "ceil", "clamp",
  195. "cos", "cosh", "cot", "csc", "deg2grad", "deg2rad", "equal", "erf", "erfc",
  196. "exp", "false", "floor", "for", "frac", "grad2deg", "hyp", "if", "ilike",
  197. "in", "inrange", "like", "log", "log10", "logn", "max", "min", "mod", "mul",
  198. "nand", "nor", "not", "not_equal", "or", "pow", "rad2deg", "root", "round",
  199. "roundn", "sec", "sgn", "shl", "shr", "sin", "sinh", "sqrt", "sum", "tan",
  200. "tanh", "true", "trunc", "while", "xor"
  201. };
  202. static const std::size_t reserved_symbols_size = sizeof(reserved_symbols) / sizeof(std::string);
  203. inline bool is_reserved_word(const std::string& symbol)
  204. {
  205. for (std::size_t i = 0; i < reserved_words_size; ++i)
  206. {
  207. if (imatch(symbol,reserved_words[i]))
  208. {
  209. return true;
  210. }
  211. }
  212. return false;
  213. }
  214. inline bool is_reserved_symbol(const std::string& symbol)
  215. {
  216. for (std::size_t i = 0; i < reserved_symbols_size; ++i)
  217. {
  218. if (imatch(symbol,reserved_symbols[i]))
  219. {
  220. return true;
  221. }
  222. }
  223. return false;
  224. }
  225. struct cs_match { static inline bool cmp(const char c0, const char c1) { return c0 == c1; } };
  226. struct cis_match { static inline bool cmp(const char c0, const char c1) { return std::tolower(c0) == std::tolower(c1); } };
  227. template <typename Iterator, typename Compare>
  228. inline bool match_impl(const Iterator pattern_begin,
  229. const Iterator pattern_end,
  230. const Iterator data_begin,
  231. const Iterator data_end,
  232. const typename std::iterator_traits<Iterator>::value_type& zero_or_more,
  233. const typename std::iterator_traits<Iterator>::value_type& zero_or_one)
  234. {
  235. if (0 == std::distance(data_begin,data_end)) return false;
  236. Iterator d_itr = data_begin;
  237. Iterator p_itr = pattern_begin;
  238. Iterator c_itr = data_begin;
  239. Iterator m_itr = data_begin;
  240. while ((data_end != d_itr) && (zero_or_more != (*p_itr)))
  241. {
  242. if ((!Compare::cmp((*p_itr),(*d_itr))) && (zero_or_one != (*p_itr)))
  243. {
  244. return false;
  245. }
  246. ++p_itr;
  247. ++d_itr;
  248. }
  249. while (data_end != d_itr)
  250. {
  251. if (zero_or_more == (*p_itr))
  252. {
  253. if (pattern_end == (++p_itr))
  254. {
  255. return true;
  256. }
  257. m_itr = p_itr;
  258. c_itr = d_itr;
  259. ++c_itr;
  260. }
  261. else if ((Compare::cmp((*p_itr),(*d_itr))) || (zero_or_one == (*p_itr)))
  262. {
  263. ++p_itr;
  264. ++d_itr;
  265. }
  266. else
  267. {
  268. p_itr = m_itr;
  269. d_itr = c_itr++;
  270. }
  271. }
  272. while ((p_itr != pattern_end) && (zero_or_more == (*p_itr))) ++p_itr;
  273. return (p_itr == pattern_end);
  274. }
  275. inline bool wc_match(const std::string& wild_card,
  276. const std::string& str)
  277. {
  278. return match_impl<const char*,cs_match>(wild_card.data(),
  279. wild_card.data() + wild_card.size(),
  280. str.data(),
  281. str.data() + str.size(),
  282. '*',
  283. '?');
  284. }
  285. inline bool wc_imatch(const std::string& wild_card,
  286. const std::string& str)
  287. {
  288. return match_impl<const char*,cis_match>(wild_card.data(),
  289. wild_card.data() + wild_card.size(),
  290. str.data(),
  291. str.data() + str.size(),
  292. '*',
  293. '?');
  294. }
  295. static const double pow10[] = {
  296. 1.0,
  297. 10.0,
  298. 100.0,
  299. 1000.0,
  300. 10000.0,
  301. 100000.0,
  302. 1000000.0,
  303. 10000000.0,
  304. 100000000.0,
  305. 1000000000.0,
  306. 10000000000.0,
  307. 100000000000.0,
  308. 1000000000000.0,
  309. 10000000000000.0,
  310. 100000000000000.0,
  311. 1000000000000000.0,
  312. 10000000000000000.0,
  313. };
  314. namespace numeric
  315. {
  316. namespace constant
  317. {
  318. static const double e = 2.718281828459045235360;
  319. static const double pi = 3.141592653589793238462;
  320. static const double pi_2 = 1.570796326794896619231;
  321. static const double pi_4 = 0.785398163397448309616;
  322. static const double pi_180 = 0.017453292519943295769;
  323. static const double _1_pi = 0.318309886183790671538;
  324. static const double _2_pi = 0.636619772367581343076;
  325. static const double _180_pi = 57.295779513082320876798;
  326. }
  327. namespace details
  328. {
  329. struct unknown_type_tag {};
  330. struct real_type_tag {};
  331. struct int_type_tag {};
  332. template <typename T>
  333. struct number_type { typedef unknown_type_tag type; };
  334. #define exprtk_register_real_type_tag(T)\
  335. template<> struct number_type<T> { typedef real_type_tag type; };
  336. #define exprtk_register_int_type_tag(T)\
  337. template<> struct number_type<T> { typedef int_type_tag type; };
  338. exprtk_register_real_type_tag(double)
  339. exprtk_register_real_type_tag(long double)
  340. exprtk_register_real_type_tag(float)
  341. exprtk_register_int_type_tag(short)
  342. exprtk_register_int_type_tag(int)
  343. exprtk_register_int_type_tag(long long int)
  344. exprtk_register_int_type_tag(unsigned short)
  345. exprtk_register_int_type_tag(unsigned int)
  346. exprtk_register_int_type_tag(unsigned long long int)
  347. #undef exprtk_register_real_type_tag
  348. #undef exprtk_register_int_type_tag
  349. template <typename T>
  350. inline T equal_impl(const T& v0, const T& v1, real_type_tag)
  351. {
  352. static const T epsilon = T(0.00000000001);
  353. return (std::abs(v0 - v1) <= (std::max(T(1),std::max(std::abs(v0),std::abs(v1))) * epsilon)) ? T(1) : T(0);
  354. }
  355. template <typename T>
  356. inline T equal_impl(const T& v0, const T& v1, int_type_tag)
  357. {
  358. return (v0 == v1) ? 1 : 0;
  359. }
  360. template <typename T>
  361. inline T nequal_impl(const T& v0, const T& v1, real_type_tag)
  362. {
  363. static const T epsilon = T(0.0000000001);
  364. return (std::abs(v0 - v1) > (std::max(T(1),std::max(std::abs(v0),std::abs(v1))) * epsilon)) ? T(1) : T(0);
  365. }
  366. template <typename T>
  367. inline T nequal_impl(const T& v0, const T& v1, int_type_tag)
  368. {
  369. return (v0 != v1) ? 1 : 0;
  370. }
  371. template <typename T>
  372. inline T modulus_impl(const T& v0, const T& v1, real_type_tag)
  373. {
  374. return std::fmod(v0,v1);
  375. }
  376. template <typename T>
  377. inline T modulus_impl(const T& v0, const T& v1, int_type_tag)
  378. {
  379. return v0 % v1;
  380. }
  381. template <typename T>
  382. inline T pow_impl(const T& v0, const T& v1, real_type_tag)
  383. {
  384. return std::pow(v0,v1);
  385. }
  386. template <typename T>
  387. inline T pow_impl(const T& v0, const T& v1, int_type_tag)
  388. {
  389. return std::pow(static_cast<double>(v0),static_cast<double>(v1));
  390. }
  391. template <typename T>
  392. inline T logn_impl(const T& v0, const T& v1, real_type_tag)
  393. {
  394. return std::log(v0) / std::log(v1);
  395. }
  396. template <typename T>
  397. inline T logn_impl(const T& v0, const T& v1, int_type_tag)
  398. {
  399. return static_cast<T>(logn_impl<double>(static_cast<double>(v0),static_cast<double>(v1),real_type_tag()));
  400. }
  401. template <typename T>
  402. inline T root_impl(const T& v0, const T& v1, real_type_tag)
  403. {
  404. return std::pow(v0,T(1)/v1);
  405. }
  406. template <typename T>
  407. inline T root_impl(const T& v0, const T& v1, int_type_tag)
  408. {
  409. return root_impl<double>(static_cast<double>(v0),static_cast<double>(v1),real_type_tag());
  410. }
  411. template <typename T>
  412. inline T roundn_impl(const T& v0, const T& v1, real_type_tag)
  413. {
  414. return T(std::floor((v0 * pow10[(int)std::floor(v1)]) + T(0.5)) / T(pow10[(int)std::floor(v1)]));
  415. }
  416. template <typename T>
  417. inline T roundn_impl(const T& v0, const T&, int_type_tag)
  418. {
  419. return v0;
  420. }
  421. template <typename T>
  422. inline T hyp_impl(const T& v0, const T& v1, real_type_tag)
  423. {
  424. return std::sqrt((v0 * v0) + (v1 * v1));
  425. }
  426. template <typename T>
  427. inline T hyp_impl(const T& v0, const T& v1, int_type_tag)
  428. {
  429. return static_cast<T>(std::sqrt(static_cast<double>((v0 * v0) + (v1 * v1))));
  430. }
  431. template <typename T>
  432. inline T atan2_impl(const T& v0, const T& v1, real_type_tag)
  433. {
  434. return std::atan2(v0,v1);
  435. }
  436. template <typename T>
  437. inline T atan2_impl(const T&, const T&, int_type_tag)
  438. {
  439. return 0;
  440. }
  441. template <typename T>
  442. inline T shr_impl(const T& v0, const T& v1, real_type_tag)
  443. {
  444. return v0 * (T(1) / std::pow(T(2),static_cast<T>(static_cast<int>(v1))));
  445. }
  446. template <typename T>
  447. inline T shr_impl(const T& v0, const T& v1, int_type_tag)
  448. {
  449. return v0 >> v1;
  450. }
  451. template <typename T>
  452. inline T shl_impl(const T& v0, const T& v1, real_type_tag)
  453. {
  454. return v0 * std::pow(T(2),static_cast<T>(static_cast<int>(v1)));
  455. }
  456. template <typename T>
  457. inline T shl_impl(const T& v0, const T& v1, int_type_tag)
  458. {
  459. return v0 << v1;
  460. }
  461. template <typename T>
  462. inline T sgn_impl(const T& v, real_type_tag)
  463. {
  464. if (v > T(0.0)) return T(+1.0);
  465. else if (v < T(0.0)) return T(-1.0);
  466. else return T( 0.0);
  467. }
  468. template <typename T>
  469. inline T sgn_impl(const T& v, int_type_tag)
  470. {
  471. if (v > T(0)) return T(+1);
  472. else if (v < T(0)) return T(-1);
  473. else return T( 0);
  474. }
  475. template <typename T>
  476. inline T xor_impl(const T& v0, const T& v1, real_type_tag)
  477. {
  478. return v0 != v1;
  479. }
  480. template <typename T>
  481. inline T xor_impl(const T& v0, const T& v1, int_type_tag)
  482. {
  483. return v0 ^ v1;
  484. }
  485. template <typename T>
  486. inline T erf_impl(T v, real_type_tag)
  487. {
  488. #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
  489. //Note: This should not be required for mscv 11.+
  490. T a1 = T(+0.254829592);
  491. T a2 = T(-0.284496736);
  492. T a3 = T(+1.421413741);
  493. T a4 = T(-1.453152027);
  494. T a5 = T(+1.061405429);
  495. T p = T( 0.327591100);
  496. T sign = T(1.0);
  497. if (v < 0)
  498. {
  499. sign = -1;
  500. v = abs(v);
  501. }
  502. T t = T(1.0) / (T(1.0) + p * v);
  503. T y = T(1.0) - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * std::exp(-v * v);
  504. return sign * y;
  505. #else
  506. return ::erf(v);
  507. #endif
  508. }
  509. template <typename T>
  510. inline T erf_impl(T v, int_type_tag)
  511. {
  512. return erf_impl(static_cast<double>(v),real_type_tag());
  513. }
  514. template <typename T>
  515. inline T erfc_impl(T v, real_type_tag)
  516. {
  517. #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
  518. return T(1.0) - erf_impl(v,real_type_tag());
  519. #else
  520. return ::erfc(v);
  521. #endif
  522. }
  523. template <typename T>
  524. inline T erfc_impl(T v, int_type_tag)
  525. {
  526. return erfc_impl(static_cast<double>(v),real_type_tag());
  527. }
  528. template <typename T> inline T abs_impl(const T v, real_type_tag) { return std::abs (v); }
  529. template <typename T> inline T acos_impl(const T v, real_type_tag) { return std::acos (v); }
  530. template <typename T> inline T asin_impl(const T v, real_type_tag) { return std::asin (v); }
  531. template <typename T> inline T atan_impl(const T v, real_type_tag) { return std::atan (v); }
  532. template <typename T> inline T ceil_impl(const T v, real_type_tag) { return std::ceil (v); }
  533. template <typename T> inline T cos_impl(const T v, real_type_tag) { return std::cos (v); }
  534. template <typename T> inline T cosh_impl(const T v, real_type_tag) { return std::cosh (v); }
  535. template <typename T> inline T exp_impl(const T v, real_type_tag) { return std::exp (v); }
  536. template <typename T> inline T floor_impl(const T v, real_type_tag) { return std::floor(v); }
  537. template <typename T> inline T log_impl(const T v, real_type_tag) { return std::log (v); }
  538. template <typename T> inline T log10_impl(const T v, real_type_tag) { return std::log10(v); }
  539. template <typename T> inline T neg_impl(const T v, real_type_tag) { return -v; }
  540. template <typename T> inline T pos_impl(const T v, real_type_tag) { return +v; }
  541. template <typename T> inline T round_impl(const T v, real_type_tag) { return std::floor(v + T(0.5)); }
  542. template <typename T> inline T sin_impl(const T v, real_type_tag) { return std::sin (v); }
  543. template <typename T> inline T sinh_impl(const T v, real_type_tag) { return std::sinh (v); }
  544. template <typename T> inline T sqrt_impl(const T v, real_type_tag) { return std::sqrt (v); }
  545. template <typename T> inline T tan_impl(const T v, real_type_tag) { return std::tan (v); }
  546. template <typename T> inline T tanh_impl(const T v, real_type_tag) { return std::tanh (v); }
  547. template <typename T> inline T cot_impl(const T v, real_type_tag) { return T(1) / std::tan(v); }
  548. template <typename T> inline T sec_impl(const T v, real_type_tag) { return T(1) / std::cos(v); }
  549. template <typename T> inline T csc_impl(const T v, real_type_tag) { return T(1) / std::sin(v); }
  550. template <typename T> inline T r2d_impl(const T v, real_type_tag) { return (v * T(numeric::constant::_180_pi)); }
  551. template <typename T> inline T d2r_impl(const T v, real_type_tag) { return (v * T(numeric::constant::pi_180)); }
  552. template <typename T> inline T d2g_impl(const T v, real_type_tag) { return (v * T(20.0/9.0)); }
  553. template <typename T> inline T g2d_impl(const T v, real_type_tag) { return (v * T(9.0/20.0)); }
  554. template <typename T> inline T notl_impl(const T v, real_type_tag) { return (v != T(0) ? T(0) : T(1)); }
  555. template <typename T> inline T frac_impl(const T v, real_type_tag) { return (v - static_cast<long long>(v)); }
  556. template <typename T> inline T trunc_impl(const T v, real_type_tag) { return T(static_cast<long long>(v)); }
  557. template <typename T> inline T abs_impl(const T v, int_type_tag) { return std::abs (v); }
  558. template <typename T> inline T exp_impl(const T v, int_type_tag) { return std::exp (v); }
  559. template <typename T> inline T log_impl(const T v, int_type_tag) { return std::log (v); }
  560. template <typename T> inline T log10_impl(const T v, int_type_tag) { return std::log10(v); }
  561. template <typename T> inline T neg_impl(const T v, int_type_tag) { return -v; }
  562. template <typename T> inline T pos_impl(const T v, int_type_tag) { return +v; }
  563. template <typename T> inline T ceil_impl(const T v, int_type_tag) { return v; }
  564. template <typename T> inline T floor_impl(const T v, int_type_tag) { return v; }
  565. template <typename T> inline T round_impl(const T v, int_type_tag) { return v; }
  566. template <typename T> inline T notl_impl(const T v, int_type_tag) { return !v; }
  567. template <typename T> inline T sqrt_impl(const T v, int_type_tag) { return std::sqrt (v); }
  568. template <typename T> inline T frac_impl(const T v, int_type_tag) { return T(0); }
  569. template <typename T> inline T trunc_impl(const T v, int_type_tag) { return v; }
  570. template <typename T> inline T acos_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  571. template <typename T> inline T asin_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  572. template <typename T> inline T atan_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  573. template <typename T> inline T cos_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  574. template <typename T> inline T cosh_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  575. template <typename T> inline T sin_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  576. template <typename T> inline T sinh_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  577. template <typename T> inline T tan_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  578. template <typename T> inline T tanh_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  579. template <typename T> inline T cot_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  580. template <typename T> inline T sec_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  581. template <typename T> inline T csc_impl(const T , int_type_tag) { return std::numeric_limits<T>::quiet_NaN(); }
  582. template <typename T>
  583. inline bool is_integer_impl(const T& v, real_type_tag)
  584. {
  585. return (T(0.0) == std::fmod(v,T(1.0)));
  586. }
  587. template <typename T>
  588. inline bool is_integer_impl(const T&, int_type_tag)
  589. {
  590. return true;
  591. }
  592. }
  593. template <typename Type>
  594. struct numeric_info { enum { length = 0, size = 32, bound_length = 0, min_exp = 0, max_exp = 0 }; };
  595. template<> struct numeric_info<int> { enum { length = 10, size = 16, bound_length = 9}; };
  596. template<> struct numeric_info<float> { enum { min_exp = -38, max_exp = +38}; };
  597. template<> struct numeric_info<double> { enum { min_exp = -308, max_exp = +308}; };
  598. template<> struct numeric_info<long double> { enum { min_exp = -308, max_exp = +308}; };
  599. template <typename T>
  600. inline T equal(const T v0, const T v1)
  601. {
  602. typename details::number_type<T>::type num_type;
  603. return details::equal_impl(v0,v1,num_type);
  604. }
  605. template <typename T>
  606. inline T nequal(const T v0, const T v1)
  607. {
  608. typename details::number_type<T>::type num_type;
  609. return details::nequal_impl(v0,v1,num_type);
  610. }
  611. template <typename T>
  612. inline T modulus(const T v0, const T v1)
  613. {
  614. typename details::number_type<T>::type num_type;
  615. return details::modulus_impl(v0,v1,num_type);
  616. }
  617. template <typename T>
  618. inline T pow(const T v0, const T v1)
  619. {
  620. typename details::number_type<T>::type num_type;
  621. return details::pow_impl(v0,v1,num_type);
  622. }
  623. template <typename T>
  624. inline T logn(const T v0, const T v1)
  625. {
  626. typename details::number_type<T>::type num_type;
  627. return details::logn_impl(v0,v1,num_type);
  628. }
  629. template <typename T>
  630. inline T root(const T v0, const T v1)
  631. {
  632. typename details::number_type<T>::type num_type;
  633. return details::root_impl(v0,v1,num_type);
  634. }
  635. template <typename T>
  636. inline T roundn(const T v0, const T v1)
  637. {
  638. typename details::number_type<T>::type num_type;
  639. return details::roundn_impl(v0,v1,num_type);
  640. }
  641. template <typename T>
  642. inline T hyp(const T v0, const T v1)
  643. {
  644. typename details::number_type<T>::type num_type;
  645. return details::hyp_impl(v0,v1,num_type);
  646. }
  647. template <typename T>
  648. inline T atan2(const T v0, const T v1)
  649. {
  650. typename details::number_type<T>::type num_type;
  651. return details::atan2_impl(v0,v1,num_type);
  652. }
  653. template <typename T>
  654. inline T shr(const T v0, const T v1)
  655. {
  656. typename details::number_type<T>::type num_type;
  657. return details::shr_impl(v0,v1,num_type);
  658. }
  659. template <typename T>
  660. inline T shl(const T v0, const T v1)
  661. {
  662. typename details::number_type<T>::type num_type;
  663. return details::shl_impl(v0,v1,num_type);
  664. }
  665. template <typename T>
  666. inline T xor_opr(const T v0, const T v1)
  667. {
  668. typename details::number_type<T>::type num_type;
  669. return details::xor_impl(v0,v1,num_type);
  670. }
  671. template <typename T>
  672. inline bool is_integer(const T v)
  673. {
  674. typename details::number_type<T>::type num_type;
  675. return details::is_integer_impl(v,num_type);
  676. }
  677. template <typename T, unsigned int N>
  678. struct fast_exp
  679. {
  680. static inline T result(T v)
  681. {
  682. unsigned int k = N;
  683. T l = T(1);
  684. while (k)
  685. {
  686. if (k & 1)
  687. {
  688. l *= v;
  689. --k;
  690. }
  691. v *= v;
  692. k >>= 1;
  693. }
  694. return l;
  695. }
  696. };
  697. template <typename T> struct fast_exp<T,10> { static inline T result(T v) { T v_5 = fast_exp<T,5>::result(v); return v_5 * v_5; } };
  698. template <typename T> struct fast_exp<T, 9> { static inline T result(T v) { return fast_exp<T,8>::result(v) * v; } };
  699. template <typename T> struct fast_exp<T, 8> { static inline T result(T v) { T v_4 = fast_exp<T,4>::result(v); return v_4 * v_4; } };
  700. template <typename T> struct fast_exp<T, 7> { static inline T result(T v) { return fast_exp<T,6>::result(v) * v; } };
  701. template <typename T> struct fast_exp<T, 6> { static inline T result(T v) { T v_3 = fast_exp<T,3>::result(v); return v_3 * v_3; } };
  702. template <typename T> struct fast_exp<T, 5> { static inline T result(T v) { return fast_exp<T,4>::result(v) * v; } };
  703. template <typename T> struct fast_exp<T, 4> { static inline T result(T v) { T v_2 = v * v; return v_2 * v_2; } };
  704. template <typename T> struct fast_exp<T, 3> { static inline T result(T v) { return v * v * v; } };
  705. template <typename T> struct fast_exp<T, 2> { static inline T result(T v) { return v * v; } };
  706. template <typename T> struct fast_exp<T, 1> { static inline T result(T v) { return v; } };
  707. template <typename T> struct fast_exp<T, 0> { static inline T result(T ) { return T(1); } };
  708. #define exprtk_define_unary_function(FunctionName) \
  709. template <typename T> \
  710. inline T FunctionName (const T v) \
  711. { \
  712. typename details::number_type<T>::type num_type; \
  713. return details:: FunctionName##_impl(v,num_type); \
  714. }
  715. exprtk_define_unary_function(abs )
  716. exprtk_define_unary_function(acos )
  717. exprtk_define_unary_function(asin )
  718. exprtk_define_unary_function(atan )
  719. exprtk_define_unary_function(ceil )
  720. exprtk_define_unary_function(cos )
  721. exprtk_define_unary_function(cosh )
  722. exprtk_define_unary_function(exp )
  723. exprtk_define_unary_function(floor)
  724. exprtk_define_unary_function(log )
  725. exprtk_define_unary_function(log10)
  726. exprtk_define_unary_function(neg )
  727. exprtk_define_unary_function(pos )
  728. exprtk_define_unary_function(round)
  729. exprtk_define_unary_function(sin )
  730. exprtk_define_unary_function(sinh )
  731. exprtk_define_unary_function(sqrt )
  732. exprtk_define_unary_function(tan )
  733. exprtk_define_unary_function(tanh )
  734. exprtk_define_unary_function(cot )
  735. exprtk_define_unary_function(sec )
  736. exprtk_define_unary_function(csc )
  737. exprtk_define_unary_function(r2d )
  738. exprtk_define_unary_function(d2r )
  739. exprtk_define_unary_function(d2g )
  740. exprtk_define_unary_function(g2d )
  741. exprtk_define_unary_function(notl )
  742. exprtk_define_unary_function(sgn )
  743. exprtk_define_unary_function(erf )
  744. exprtk_define_unary_function(erfc )
  745. exprtk_define_unary_function(frac )
  746. exprtk_define_unary_function(trunc)
  747. #undef exprtk_define_unary_function
  748. }
  749. template <typename Iterator, typename Type>
  750. static inline bool string_to_type_converter_impl_ref(Iterator& itr, const Iterator end, Type& result)
  751. {
  752. if (end == itr) return false;
  753. Type t = 0;
  754. bool negative = false;
  755. if ('+' == (*itr))
  756. ++itr;
  757. else if ('-' == (*itr))
  758. {
  759. ++itr;
  760. negative = true;
  761. }
  762. if (end == itr)
  763. return false;
  764. unsigned int digit_count = 0;
  765. while ((end != itr) && ('0' == (*itr))) ++itr;
  766. bool return_result = true;
  767. while (end != itr)
  768. {
  769. const unsigned char digit = (*itr - '0');
  770. if (digit > 9)
  771. {
  772. return_result = false;
  773. break;
  774. }
  775. if ((++digit_count) <= numeric::numeric_info<Type>::bound_length)
  776. {
  777. t *= 10;
  778. t += digit;
  779. }
  780. else
  781. {
  782. typedef unsigned long long int base_type;
  783. static const base_type max_limit = +std::numeric_limits<Type>::max();
  784. static const base_type min_limit = -std::numeric_limits<Type>::min();
  785. base_type tmp = static_cast<base_type>(t) * 10 + digit;
  786. if (negative && static_cast<base_type>(tmp) > min_limit)
  787. return_result = false;
  788. else if (static_cast<base_type>(tmp) > max_limit)
  789. return_result = false;
  790. t = static_cast<Type>(tmp);
  791. }
  792. ++itr;
  793. }
  794. result = static_cast<Type>((negative) ? -t : t);
  795. return return_result;
  796. }
  797. template <typename Iterator, typename T>
  798. static inline bool parse_nan(Iterator& itr, const Iterator end, T& t)
  799. {
  800. typedef typename std::iterator_traits<Iterator>::value_type type;
  801. static const std::size_t nan_length = 3;
  802. if (std::distance(itr,end) != static_cast<int>(nan_length))
  803. return false;
  804. if (static_cast<type>('n') == (*itr))
  805. {
  806. if ((static_cast<type>('a') != *(itr + 1)) || (static_cast<type>('n') != *(itr + 2)))
  807. {
  808. return false;
  809. }
  810. }
  811. else if ((static_cast<type>('A') != *(itr + 1)) || (static_cast<type>('N') != *(itr + 2)))
  812. {
  813. return false;
  814. }
  815. t = std::numeric_limits<T>::quiet_NaN();
  816. return true;
  817. }
  818. template <typename Iterator, typename T>
  819. static inline bool parse_inf(Iterator& itr, const Iterator end, T& t, bool negative)
  820. {
  821. static const char inf_uc[] = "INFINITY";
  822. static const char inf_lc[] = "infinity";
  823. static const std::size_t inf_length = 8;
  824. const std::size_t length = std::distance(itr,end);
  825. if ((3 != length) && (inf_length != length))
  826. return false;
  827. const char* inf_itr = ('i' == (*itr)) ? inf_lc : inf_uc;
  828. while (end != itr)
  829. {
  830. if (*inf_itr == static_cast<char>(*itr))
  831. {
  832. ++itr;
  833. ++inf_itr;
  834. continue;
  835. }
  836. else
  837. return false;
  838. }
  839. if (negative)
  840. t = -std::numeric_limits<T>::infinity();
  841. else
  842. t = std::numeric_limits<T>::infinity();
  843. return true;
  844. }
  845. template <typename Iterator, typename T>
  846. inline bool string_to_real(Iterator& itr_external, const Iterator end, T& t)
  847. {
  848. if (end == itr_external)
  849. return false;
  850. Iterator itr = itr_external;
  851. double d = 0.0;
  852. bool negative = false;
  853. if ('+' == (*itr))
  854. ++itr;
  855. else if ('-' == (*itr))
  856. {
  857. ++itr;
  858. negative = true;
  859. }
  860. if (end == itr)
  861. return false;
  862. if (('I' <= (*itr)) && ((*itr) <= 'n'))
  863. {
  864. if (('i' == (*itr)) || ('I' == (*itr)))
  865. {
  866. return parse_inf(itr,end,t,negative);
  867. }
  868. else if (('n' == (*itr)) || ('N' == (*itr)))
  869. {
  870. return parse_nan(itr,end,t);
  871. }
  872. else
  873. return false;
  874. }
  875. bool instate = false;
  876. int pre_decimal = 0;
  877. if ('.' != (*itr))
  878. {
  879. const Iterator curr = itr;
  880. while ((end != itr) && ('0' == (*itr))) ++itr;
  881. const Iterator post_zero_cull_itr = itr;
  882. unsigned char digit = 0;
  883. #define parse_digit_1 \
  884. if ((digit = static_cast<unsigned char>((*itr) - '0')) < 10) { d *= 10.0; d += digit; } else break; if (end == ++itr) break; \
  885. #define parse_digit_2 \
  886. if ((digit = static_cast<unsigned char>((*itr) - '0')) < 10) { d *= 10.0; d += digit; } else break; ++itr;\
  887. while (end != itr)
  888. {
  889. parse_digit_1
  890. parse_digit_1
  891. parse_digit_1
  892. parse_digit_1
  893. parse_digit_1
  894. parse_digit_1
  895. parse_digit_1
  896. parse_digit_2
  897. }
  898. #undef parse_digit_1
  899. #undef parse_digit_2
  900. if (curr != itr) instate = true;
  901. pre_decimal = static_cast<int>(std::distance(post_zero_cull_itr,itr));
  902. }
  903. int exponent = 0;
  904. if (end != itr)
  905. {
  906. if ('.' == (*itr))
  907. {
  908. ++itr;
  909. const Iterator curr = itr;
  910. unsigned char digit = 0;
  911. #define parse_digit_1 \
  912. if ((digit = static_cast<unsigned char>((*itr) - '0')) < 10) { d *= 10.0; d += digit; } else break; if (end == ++itr) break; \
  913. #define parse_digit_2 \
  914. if ((digit = static_cast<unsigned char>((*itr) - '0')) < 10) { d *= 10.0; d += digit; } else break; ++itr;\
  915. while (end != itr)
  916. {
  917. parse_digit_1
  918. parse_digit_1
  919. parse_digit_1
  920. parse_digit_1
  921. parse_digit_1
  922. parse_digit_1
  923. parse_digit_1
  924. parse_digit_2
  925. }
  926. #undef parse_digit_1
  927. #undef parse_digit_2
  928. if (curr != itr) instate = true;
  929. exponent -= static_cast<int>(std::distance(curr,itr));
  930. }
  931. if (end != itr)
  932. {
  933. typename std::iterator_traits<Iterator>::value_type c = (*itr);
  934. if (('e' == c) || ('E' == c))
  935. {
  936. ++itr;
  937. int exp = 0;
  938. if (!string_to_type_converter_impl_ref(itr,end,exp))
  939. {
  940. if (end == itr)
  941. return false;
  942. else
  943. c = (*itr);
  944. }
  945. if (
  946. (exp < numeric::numeric_info<T>::min_exp) ||
  947. (numeric::numeric_info<T>::max_exp < exp)
  948. )
  949. return false;
  950. exponent += exp;
  951. }
  952. if (('f' == c) || ('F' == c) || ('l' == c) || ('L' == c))
  953. ++itr;
  954. else if ('#' == c)
  955. {
  956. ++itr;
  957. if (end == itr)
  958. return false;
  959. if ((10.0 != d) || (exponent != -1))
  960. return false;
  961. if (('I' <= (*itr)) && ((*itr) <= 'n'))
  962. {
  963. if (('i' == (*itr)) || ('I' == (*itr)))
  964. {
  965. return parse_inf(itr,end,t,negative);
  966. }
  967. else if (('n' == (*itr)) || ('N' == (*itr)))
  968. {
  969. return parse_nan(itr,end,t);
  970. }
  971. else
  972. return false;
  973. }
  974. return false;
  975. }
  976. }
  977. }
  978. if ((end != itr) || (!instate))
  979. return false;
  980. if (0 != exponent)
  981. {
  982. if (
  983. (std::numeric_limits<T>::max_exponent10 < (exponent + pre_decimal)) ||
  984. (std::numeric_limits<T>::min_exponent10 > (exponent + pre_decimal))
  985. )
  986. {
  987. return false;
  988. }
  989. const int e = std::abs(exponent);
  990. static const double fract10[] =
  991. {
  992. 0.0,
  993. 1.0E+001, 1.0E+002, 1.0E+003, 1.0E+004, 1.0E+005, 1.0E+006, 1.0E+007, 1.0E+008, 1.0E+009, 1.0E+010,
  994. 1.0E+011, 1.0E+012, 1.0E+013, 1.0E+014, 1.0E+015, 1.0E+016, 1.0E+017, 1.0E+018, 1.0E+019, 1.0E+020,
  995. 1.0E+021, 1.0E+022, 1.0E+023, 1.0E+024, 1.0E+025, 1.0E+026, 1.0E+027, 1.0E+028, 1.0E+029, 1.0E+030,
  996. 1.0E+031, 1.0E+032, 1.0E+033, 1.0E+034, 1.0E+035, 1.0E+036, 1.0E+037, 1.0E+038, 1.0E+039, 1.0E+040,
  997. 1.0E+041, 1.0E+042, 1.0E+043, 1.0E+044, 1.0E+045, 1.0E+046, 1.0E+047, 1.0E+048, 1.0E+049, 1.0E+050,
  998. 1.0E+051, 1.0E+052, 1.0E+053, 1.0E+054, 1.0E+055, 1.0E+056, 1.0E+057, 1.0E+058, 1.0E+059, 1.0E+060,
  999. 1.0E+061, 1.0E+062, 1.0E+063, 1.0E+064, 1.0E+065, 1.0E+066, 1.0E+067, 1.0E+068, 1.0E+069, 1.0E+070,
  1000. 1.0E+071, 1.0E+072, 1.0E+073, 1.0E+074, 1.0E+075, 1.0E+076, 1.0E+077, 1.0E+078, 1.0E+079, 1.0E+080,
  1001. 1.0E+081, 1.0E+082, 1.0E+083, 1.0E+084, 1.0E+085, 1.0E+086, 1.0E+087, 1.0E+088, 1.0E+089, 1.0E+090,
  1002. 1.0E+091, 1.0E+092, 1.0E+093, 1.0E+094, 1.0E+095, 1.0E+096, 1.0E+097, 1.0E+098, 1.0E+099, 1.0E+100,
  1003. 1.0E+101, 1.0E+102, 1.0E+103, 1.0E+104, 1.0E+105, 1.0E+106, 1.0E+107, 1.0E+108, 1.0E+109, 1.0E+110,
  1004. 1.0E+111, 1.0E+112, 1.0E+113, 1.0E+114, 1.0E+115, 1.0E+116, 1.0E+117, 1.0E+118, 1.0E+119, 1.0E+120,
  1005. 1.0E+121, 1.0E+122, 1.0E+123, 1.0E+124, 1.0E+125, 1.0E+126, 1.0E+127, 1.0E+128, 1.0E+129, 1.0E+130,
  1006. 1.0E+131, 1.0E+132, 1.0E+133, 1.0E+134, 1.0E+135, 1.0E+136, 1.0E+137, 1.0E+138, 1.0E+139, 1.0E+140,
  1007. 1.0E+141, 1.0E+142, 1.0E+143, 1.0E+144, 1.0E+145, 1.0E+146, 1.0E+147, 1.0E+148, 1.0E+149, 1.0E+150,
  1008. 1.0E+151, 1.0E+152, 1.0E+153, 1.0E+154, 1.0E+155, 1.0E+156, 1.0E+157, 1.0E+158, 1.0E+159, 1.0E+160,
  1009. 1.0E+161, 1.0E+162, 1.0E+163, 1.0E+164, 1.0E+165, 1.0E+166, 1.0E+167, 1.0E+168, 1.0E+169, 1.0E+170,
  1010. 1.0E+171, 1.0E+172, 1.0E+173, 1.0E+174, 1.0E+175, 1.0E+176, 1.0E+177, 1.0E+178, 1.0E+179, 1.0E+180,
  1011. 1.0E+181, 1.0E+182, 1.0E+183, 1.0E+184, 1.0E+185, 1.0E+186, 1.0E+187, 1.0E+188, 1.0E+189, 1.0E+190,
  1012. 1.0E+191, 1.0E+192, 1.0E+193, 1.0E+194, 1.0E+195, 1.0E+196, 1.0E+197, 1.0E+198, 1.0E+199, 1.0E+200,
  1013. 1.0E+221, 1.0E+222, 1.0E+223, 1.0E+224, 1.0E+225, 1.0E+226, 1.0E+227, 1.0E+228, 1.0E+229, 1.0E+230,
  1014. 1.0E+231, 1.0E+232, 1.0E+233, 1.0E+234, 1.0E+235, 1.0E+236, 1.0E+237, 1.0E+238, 1.0E+239, 1.0E+240,
  1015. 1.0E+241, 1.0E+242, 1.0E+243, 1.0E+244, 1.0E+245, 1.0E+246, 1.0E+247, 1.0E+248, 1.0E+249, 1.0E+250,
  1016. 1.0E+251, 1.0E+252, 1.0E+253, 1.0E+254, 1.0E+255, 1.0E+256, 1.0E+257, 1.0E+258, 1.0E+259, 1.0E+260,
  1017. 1.0E+261, 1.0E+262, 1.0E+263, 1.0E+264, 1.0E+265, 1.0E+266, 1.0E+267, 1.0E+268, 1.0E+269, 1.0E+270,
  1018. 1.0E+271, 1.0E+272, 1.0E+273, 1.0E+274, 1.0E+275, 1.0E+276, 1.0E+277, 1.0E+278, 1.0E+279, 1.0E+280,
  1019. 1.0E+281, 1.0E+282, 1.0E+283, 1.0E+284, 1.0E+285, 1.0E+286, 1.0E+287, 1.0E+288, 1.0E+289, 1.0E+290,
  1020. 1.0E+291, 1.0E+292, 1.0E+293, 1.0E+294, 1.0E+295, 1.0E+296, 1.0E+297, 1.0E+298, 1.0E+299, 1.0E+300,
  1021. 1.0E+301, 1.0E+302, 1.0E+303, 1.0E+304, 1.0E+305, 1.0E+306, 1.0E+307, 1.0E+308
  1022. };
  1023. static const std::size_t fract10_size = sizeof(fract10) / sizeof(double);
  1024. if (d != 0.0)
  1025. {
  1026. if (static_cast<std::size_t>(e) < fract10_size)
  1027. {
  1028. if (exponent > 0)
  1029. d *= fract10[e];
  1030. else
  1031. d /= fract10[e];
  1032. }
  1033. else
  1034. d *= std::pow(10.0, 1.0 * exponent);
  1035. }
  1036. }
  1037. t = static_cast<T>((negative) ? -d : d);
  1038. return true;
  1039. }
  1040. template <typename T>
  1041. inline bool string_to_real(const std::string& s, T& t)
  1042. {
  1043. const char* begin = s.data();
  1044. const char* end = s.data() + s.size();
  1045. return string_to_real(begin,end,t);
  1046. }
  1047. } // namespace details
  1048. namespace lexer
  1049. {
  1050. struct token
  1051. {
  1052. enum token_type
  1053. {
  1054. e_none = 0,
  1055. e_error = 1,
  1056. e_err_symbol = 2,
  1057. e_err_number = 3,
  1058. e_err_string = 4,
  1059. e_err_sfunc = 5,
  1060. e_eof = 6,
  1061. e_number = 7,
  1062. e_symbol = 8,
  1063. e_string = 9,
  1064. e_assign = 10,
  1065. e_shr = 11,
  1066. e_shl = 12,
  1067. e_lte = 13,
  1068. e_ne = 14,
  1069. e_gte = 15,
  1070. e_lt = '<',
  1071. e_gt = '>',
  1072. e_eq = '=',
  1073. e_rbracket = ')',
  1074. e_lbracket = '(',
  1075. e_rsqrbracket = ']',
  1076. e_lsqrbracket = '[',
  1077. e_rcrlbracket = '}',
  1078. e_lcrlbracket = '{',
  1079. e_comma = ',',
  1080. e_add = '+',
  1081. e_sub = '-',
  1082. e_div = '/',
  1083. e_mul = '*',
  1084. e_mod = '%',
  1085. e_pow = '^',
  1086. e_colon = ':'
  1087. };
  1088. token()
  1089. : type(e_none),
  1090. value(""),
  1091. position(std::numeric_limits<std::size_t>::max())
  1092. {}
  1093. void clear()
  1094. {
  1095. type = e_none;
  1096. value = "";
  1097. position = std::numeric_limits<std::size_t>::max();
  1098. }
  1099. template <typename Iterator>
  1100. inline token& set_operator(const token_type tt, const Iterator begin, const Iterator end, const Iterator base_begin = Iterator(0))
  1101. {
  1102. type = tt;
  1103. value.assign(begin,end);
  1104. if (base_begin)
  1105. position = std::distance(base_begin,begin);
  1106. return *this;
  1107. }
  1108. template <typename Iterator>
  1109. inline token& set_symbol(const Iterator begin, const Iterator end, const Iterator base_begin = Iterator(0))
  1110. {
  1111. type = e_symbol;
  1112. value.assign(begin,end);
  1113. if (base_begin)
  1114. position = std::distance(base_begin,begin);

Large files files are truncated, but you can click here to view the full file