comparison DEPENDENCIES/generic/include/boost/spirit/home/qi/numeric/numeric_utils.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 /*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
3 Copyright (c) 2011 Jan Frederick Eick
4
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 ==============================================================================*/
8 #if !defined(BOOST_SPIRIT_NUMERIC_UTILS_APRIL_17_2006_0830AM)
9 #define BOOST_SPIRIT_NUMERIC_UTILS_APRIL_17_2006_0830AM
10
11 #if defined(_MSC_VER)
12 #pragma once
13 #endif
14
15 #include <boost/spirit/home/support/assert_msg.hpp>
16 #include <boost/spirit/home/qi/detail/assign_to.hpp>
17 #include <boost/spirit/home/qi/numeric/detail/numeric_utils.hpp>
18 #include <boost/assert.hpp>
19 #include <boost/mpl/assert.hpp>
20
21 namespace boost { namespace spirit { namespace qi
22 {
23 ///////////////////////////////////////////////////////////////////////////
24 // Extract the prefix sign (- or +), return true if a '-' was found
25 ///////////////////////////////////////////////////////////////////////////
26 template <typename Iterator>
27 inline bool
28 extract_sign(Iterator& first, Iterator const& last)
29 {
30 (void)last; // silence unused warnings
31 BOOST_ASSERT(first != last); // precondition
32
33 // Extract the sign
34 bool neg = *first == '-';
35 if (neg || (*first == '+'))
36 {
37 ++first;
38 return neg;
39 }
40 return false;
41 }
42
43 ///////////////////////////////////////////////////////////////////////////
44 // Low level unsigned integer parser
45 ///////////////////////////////////////////////////////////////////////////
46 template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits
47 , bool Accumulate = false>
48 struct extract_uint
49 {
50 // check template parameter 'Radix' for validity
51 BOOST_SPIRIT_ASSERT_MSG(
52 Radix >= 2 && Radix <= 36,
53 not_supported_radix, ());
54
55 template <typename Iterator>
56 inline static bool call(Iterator& first, Iterator const& last, T& attr_)
57 {
58 if (first == last)
59 return false;
60
61 typedef detail::extract_int<
62 T
63 , Radix
64 , MinDigits
65 , MaxDigits
66 , detail::positive_accumulator<Radix>
67 , Accumulate>
68 extract_type;
69
70 Iterator save = first;
71 if (!extract_type::parse(first, last,
72 detail::cast_unsigned<T>::call(attr_)))
73 {
74 first = save;
75 return false;
76 }
77 return true;
78 }
79
80 template <typename Iterator, typename Attribute>
81 inline static bool call(Iterator& first, Iterator const& last, Attribute& attr_)
82 {
83 // this case is called when Attribute is not T
84 T attr_local;
85 if (call(first, last, attr_local))
86 {
87 traits::assign_to(attr_local, attr_);
88 return true;
89 }
90 return false;
91 }
92 };
93
94 ///////////////////////////////////////////////////////////////////////////
95 // Low level signed integer parser
96 ///////////////////////////////////////////////////////////////////////////
97 template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>
98 struct extract_int
99 {
100 // check template parameter 'Radix' for validity
101 BOOST_SPIRIT_ASSERT_MSG(
102 Radix == 2 || Radix == 8 || Radix == 10 || Radix == 16,
103 not_supported_radix, ());
104
105 template <typename Iterator>
106 inline static bool call(Iterator& first, Iterator const& last, T& attr_)
107 {
108 if (first == last)
109 return false;
110
111 typedef detail::extract_int<
112 T, Radix, MinDigits, MaxDigits>
113 extract_pos_type;
114
115 typedef detail::extract_int<
116 T, Radix, MinDigits, MaxDigits, detail::negative_accumulator<Radix> >
117 extract_neg_type;
118
119 Iterator save = first;
120 bool hit = extract_sign(first, last);
121 if (hit)
122 hit = extract_neg_type::parse(first, last, attr_);
123 else
124 hit = extract_pos_type::parse(first, last, attr_);
125
126 if (!hit)
127 {
128 first = save;
129 return false;
130 }
131 return true;
132 }
133
134 template <typename Iterator, typename Attribute>
135 inline static bool call(Iterator& first, Iterator const& last, Attribute& attr_)
136 {
137 // this case is called when Attribute is not T
138 T attr_local;
139 if (call(first, last, attr_local))
140 {
141 traits::assign_to(attr_local, attr_);
142 return true;
143 }
144 return false;
145 }
146 };
147 }}}
148
149 #endif