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 
~raw_storage()121    ~raw_storage()
122    {
123       ::operator delete(start);
124    }
125 
126    void BOOST_REGEX_CALL resize(size_type n);
127 
extend(size_type n)128    void* BOOST_REGEX_CALL extend(size_type n)
129    {
130       if(size_type(last - end) < n)
131          resize(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 
size()139    size_type BOOST_REGEX_CALL size()
140    {
141       return size_type(end - start);
142    }
143 
capacity()144    size_type BOOST_REGEX_CALL capacity()
145    {
146       return size_type(last - start);
147    }
148 
data() const149    void* BOOST_REGEX_CALL data()const
150    {
151       return start;
152    }
153 
index(void * ptr)154    size_type BOOST_REGEX_CALL index(void* ptr)
155    {
156       return size_type(static_cast<pointer>(ptr) - static_cast<pointer>(data()));
157    }
158 
clear()159    void BOOST_REGEX_CALL clear()
160    {
161       end = start;
162    }
163 
align()164    void BOOST_REGEX_CALL align()
165    {
166       // move end up to a boundary:
167       end = start + (((end - start) + padding_mask) & ~padding_mask);
168    }
swap(raw_storage & that)169    void swap(raw_storage& that)
170    {
171       std::swap(start, that.start);
172       std::swap(end, that.end);
173       std::swap(last, that.last);
174   }
175 };
176 
raw_storage()177 inline raw_storage::raw_storage()
178 {
179    last = start = end = 0;
180 }
181 
raw_storage(size_type n)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