Chris@16
|
1 /*
|
Chris@16
|
2 *
|
Chris@16
|
3 * Copyright (c) 1998-2002
|
Chris@16
|
4 * John Maddock
|
Chris@16
|
5 *
|
Chris@16
|
6 * Use, modification and distribution are subject to the
|
Chris@16
|
7 * Boost Software License, Version 1.0. (See accompanying file
|
Chris@16
|
8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
9 *
|
Chris@16
|
10 */
|
Chris@16
|
11
|
Chris@16
|
12 /*
|
Chris@16
|
13 * LOCATION: see http://www.boost.org for most recent version.
|
Chris@16
|
14 * FILE regex_raw_buffer.hpp
|
Chris@16
|
15 * VERSION see <boost/version.hpp>
|
Chris@16
|
16 * DESCRIPTION: Raw character buffer for regex code.
|
Chris@16
|
17 * Note this is an internal header file included
|
Chris@16
|
18 * by regex.hpp, do not include on its own.
|
Chris@16
|
19 */
|
Chris@16
|
20
|
Chris@16
|
21 #ifndef BOOST_REGEX_RAW_BUFFER_HPP
|
Chris@16
|
22 #define BOOST_REGEX_RAW_BUFFER_HPP
|
Chris@16
|
23
|
Chris@16
|
24 #ifndef BOOST_REGEX_CONFIG_HPP
|
Chris@16
|
25 #include <boost/regex/config.hpp>
|
Chris@16
|
26 #endif
|
Chris@16
|
27
|
Chris@16
|
28 #include <algorithm>
|
Chris@16
|
29 #include <cstddef>
|
Chris@16
|
30
|
Chris@16
|
31 namespace boost{
|
Chris@16
|
32 namespace re_detail{
|
Chris@16
|
33
|
Chris@16
|
34 #ifdef BOOST_MSVC
|
Chris@16
|
35 #pragma warning(push)
|
Chris@16
|
36 #pragma warning(disable: 4103)
|
Chris@16
|
37 #endif
|
Chris@16
|
38 #ifdef BOOST_HAS_ABI_HEADERS
|
Chris@16
|
39 # include BOOST_ABI_PREFIX
|
Chris@16
|
40 #endif
|
Chris@16
|
41 #ifdef BOOST_MSVC
|
Chris@16
|
42 #pragma warning(pop)
|
Chris@16
|
43 #endif
|
Chris@16
|
44
|
Chris@16
|
45 struct empty_padding{};
|
Chris@16
|
46
|
Chris@16
|
47 union padding
|
Chris@16
|
48 {
|
Chris@16
|
49 void* p;
|
Chris@16
|
50 unsigned int i;
|
Chris@16
|
51 };
|
Chris@16
|
52
|
Chris@16
|
53 template <int N>
|
Chris@16
|
54 struct padding3
|
Chris@16
|
55 {
|
Chris@16
|
56 enum{
|
Chris@16
|
57 padding_size = 8,
|
Chris@16
|
58 padding_mask = 7
|
Chris@16
|
59 };
|
Chris@16
|
60 };
|
Chris@16
|
61
|
Chris@16
|
62 template<>
|
Chris@16
|
63 struct padding3<2>
|
Chris@16
|
64 {
|
Chris@16
|
65 enum{
|
Chris@16
|
66 padding_size = 2,
|
Chris@16
|
67 padding_mask = 1
|
Chris@16
|
68 };
|
Chris@16
|
69 };
|
Chris@16
|
70
|
Chris@16
|
71 template<>
|
Chris@16
|
72 struct padding3<4>
|
Chris@16
|
73 {
|
Chris@16
|
74 enum{
|
Chris@16
|
75 padding_size = 4,
|
Chris@16
|
76 padding_mask = 3
|
Chris@16
|
77 };
|
Chris@16
|
78 };
|
Chris@16
|
79
|
Chris@16
|
80 template<>
|
Chris@16
|
81 struct padding3<8>
|
Chris@16
|
82 {
|
Chris@16
|
83 enum{
|
Chris@16
|
84 padding_size = 8,
|
Chris@16
|
85 padding_mask = 7
|
Chris@16
|
86 };
|
Chris@16
|
87 };
|
Chris@16
|
88
|
Chris@16
|
89 template<>
|
Chris@16
|
90 struct padding3<16>
|
Chris@16
|
91 {
|
Chris@16
|
92 enum{
|
Chris@16
|
93 padding_size = 16,
|
Chris@16
|
94 padding_mask = 15
|
Chris@16
|
95 };
|
Chris@16
|
96 };
|
Chris@16
|
97
|
Chris@16
|
98 enum{
|
Chris@16
|
99 padding_size = padding3<sizeof(padding)>::padding_size,
|
Chris@16
|
100 padding_mask = padding3<sizeof(padding)>::padding_mask
|
Chris@16
|
101 };
|
Chris@16
|
102
|
Chris@16
|
103 //
|
Chris@16
|
104 // class raw_storage
|
Chris@16
|
105 // basically this is a simplified vector<unsigned char>
|
Chris@16
|
106 // this is used by basic_regex for expression storage
|
Chris@16
|
107 //
|
Chris@16
|
108
|
Chris@16
|
109 class BOOST_REGEX_DECL raw_storage
|
Chris@16
|
110 {
|
Chris@16
|
111 public:
|
Chris@16
|
112 typedef std::size_t size_type;
|
Chris@16
|
113 typedef unsigned char* pointer;
|
Chris@16
|
114 private:
|
Chris@16
|
115 pointer last, start, end;
|
Chris@16
|
116 public:
|
Chris@16
|
117
|
Chris@16
|
118 raw_storage();
|
Chris@16
|
119 raw_storage(size_type n);
|
Chris@16
|
120
|
Chris@16
|
121 ~raw_storage()
|
Chris@16
|
122 {
|
Chris@16
|
123 ::operator delete(start);
|
Chris@16
|
124 }
|
Chris@16
|
125
|
Chris@16
|
126 void BOOST_REGEX_CALL resize(size_type n);
|
Chris@16
|
127
|
Chris@16
|
128 void* BOOST_REGEX_CALL extend(size_type n)
|
Chris@16
|
129 {
|
Chris@16
|
130 if(size_type(last - end) < n)
|
Chris@16
|
131 resize(n + (end - start));
|
Chris@101
|
132 pointer result = end;
|
Chris@16
|
133 end += n;
|
Chris@16
|
134 return result;
|
Chris@16
|
135 }
|
Chris@16
|
136
|
Chris@16
|
137 void* BOOST_REGEX_CALL insert(size_type pos, size_type n);
|
Chris@16
|
138
|
Chris@16
|
139 size_type BOOST_REGEX_CALL size()
|
Chris@16
|
140 {
|
Chris@16
|
141 return end - start;
|
Chris@16
|
142 }
|
Chris@16
|
143
|
Chris@16
|
144 size_type BOOST_REGEX_CALL capacity()
|
Chris@16
|
145 {
|
Chris@16
|
146 return last - start;
|
Chris@16
|
147 }
|
Chris@16
|
148
|
Chris@16
|
149 void* BOOST_REGEX_CALL data()const
|
Chris@16
|
150 {
|
Chris@16
|
151 return start;
|
Chris@16
|
152 }
|
Chris@16
|
153
|
Chris@16
|
154 size_type BOOST_REGEX_CALL index(void* ptr)
|
Chris@16
|
155 {
|
Chris@16
|
156 return static_cast<pointer>(ptr) - static_cast<pointer>(data());
|
Chris@16
|
157 }
|
Chris@16
|
158
|
Chris@16
|
159 void BOOST_REGEX_CALL clear()
|
Chris@16
|
160 {
|
Chris@16
|
161 end = start;
|
Chris@16
|
162 }
|
Chris@16
|
163
|
Chris@16
|
164 void BOOST_REGEX_CALL align()
|
Chris@16
|
165 {
|
Chris@16
|
166 // move end up to a boundary:
|
Chris@16
|
167 end = start + (((end - start) + padding_mask) & ~padding_mask);
|
Chris@16
|
168 }
|
Chris@16
|
169 void swap(raw_storage& that)
|
Chris@16
|
170 {
|
Chris@16
|
171 std::swap(start, that.start);
|
Chris@16
|
172 std::swap(end, that.end);
|
Chris@16
|
173 std::swap(last, that.last);
|
Chris@16
|
174 }
|
Chris@16
|
175 };
|
Chris@16
|
176
|
Chris@16
|
177 inline raw_storage::raw_storage()
|
Chris@16
|
178 {
|
Chris@16
|
179 last = start = end = 0;
|
Chris@16
|
180 }
|
Chris@16
|
181
|
Chris@16
|
182 inline raw_storage::raw_storage(size_type n)
|
Chris@16
|
183 {
|
Chris@16
|
184 start = end = static_cast<pointer>(::operator new(n));
|
Chris@16
|
185 BOOST_REGEX_NOEH_ASSERT(start)
|
Chris@16
|
186 last = start + n;
|
Chris@16
|
187 }
|
Chris@16
|
188
|
Chris@16
|
189
|
Chris@16
|
190 #ifdef BOOST_MSVC
|
Chris@16
|
191 #pragma warning(push)
|
Chris@16
|
192 #pragma warning(disable: 4103)
|
Chris@16
|
193 #endif
|
Chris@16
|
194 #ifdef BOOST_HAS_ABI_HEADERS
|
Chris@16
|
195 # include BOOST_ABI_SUFFIX
|
Chris@16
|
196 #endif
|
Chris@16
|
197 #ifdef BOOST_MSVC
|
Chris@16
|
198 #pragma warning(pop)
|
Chris@16
|
199 #endif
|
Chris@16
|
200
|
Chris@16
|
201 } // namespace re_detail
|
Chris@16
|
202 } // namespace boost
|
Chris@16
|
203
|
Chris@16
|
204 #endif
|
Chris@16
|
205
|
Chris@16
|
206
|
Chris@16
|
207
|
Chris@16
|
208
|
Chris@16
|
209
|
Chris@16
|
210
|