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