You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
210 lines
3.6 KiB
210 lines
3.6 KiB
/* |
|
* |
|
* Copyright (c) 1998-2002 |
|
* John Maddock |
|
* |
|
* Use, modification and distribution are subject to the |
|
* Boost Software License, Version 1.0. (See accompanying file |
|
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
|
* |
|
*/ |
|
|
|
/* |
|
* LOCATION: see http://www.boost.org for most recent version. |
|
* FILE regex_raw_buffer.hpp |
|
* VERSION see <boost/version.hpp> |
|
* DESCRIPTION: Raw character buffer for regex code. |
|
* Note this is an internal header file included |
|
* by regex.hpp, do not include on its own. |
|
*/ |
|
|
|
#ifndef BOOST_REGEX_RAW_BUFFER_HPP |
|
#define BOOST_REGEX_RAW_BUFFER_HPP |
|
|
|
#ifndef BOOST_REGEX_CONFIG_HPP |
|
#include <boost/regex/config.hpp> |
|
#endif |
|
|
|
#include <algorithm> |
|
#include <cstddef> |
|
|
|
namespace boost{ |
|
namespace re_detail{ |
|
|
|
#ifdef BOOST_MSVC |
|
#pragma warning(push) |
|
#pragma warning(disable: 4103) |
|
#endif |
|
#ifdef BOOST_HAS_ABI_HEADERS |
|
# include BOOST_ABI_PREFIX |
|
#endif |
|
#ifdef BOOST_MSVC |
|
#pragma warning(pop) |
|
#endif |
|
|
|
struct empty_padding{}; |
|
|
|
union padding |
|
{ |
|
void* p; |
|
unsigned int i; |
|
}; |
|
|
|
template <int N> |
|
struct padding3 |
|
{ |
|
enum{ |
|
padding_size = 8, |
|
padding_mask = 7 |
|
}; |
|
}; |
|
|
|
template<> |
|
struct padding3<2> |
|
{ |
|
enum{ |
|
padding_size = 2, |
|
padding_mask = 1 |
|
}; |
|
}; |
|
|
|
template<> |
|
struct padding3<4> |
|
{ |
|
enum{ |
|
padding_size = 4, |
|
padding_mask = 3 |
|
}; |
|
}; |
|
|
|
template<> |
|
struct padding3<8> |
|
{ |
|
enum{ |
|
padding_size = 8, |
|
padding_mask = 7 |
|
}; |
|
}; |
|
|
|
template<> |
|
struct padding3<16> |
|
{ |
|
enum{ |
|
padding_size = 16, |
|
padding_mask = 15 |
|
}; |
|
}; |
|
|
|
enum{ |
|
padding_size = padding3<sizeof(padding)>::padding_size, |
|
padding_mask = padding3<sizeof(padding)>::padding_mask |
|
}; |
|
|
|
// |
|
// class raw_storage |
|
// basically this is a simplified vector<unsigned char> |
|
// this is used by basic_regex for expression storage |
|
// |
|
|
|
class BOOST_REGEX_DECL raw_storage |
|
{ |
|
public: |
|
typedef std::size_t size_type; |
|
typedef unsigned char* pointer; |
|
private: |
|
pointer last, start, end; |
|
public: |
|
|
|
raw_storage(); |
|
raw_storage(size_type n); |
|
|
|
~raw_storage() |
|
{ |
|
::operator delete(start); |
|
} |
|
|
|
void BOOST_REGEX_CALL resize(size_type n); |
|
|
|
void* BOOST_REGEX_CALL extend(size_type n) |
|
{ |
|
if(size_type(last - end) < n) |
|
resize(n + (end - start)); |
|
register pointer result = end; |
|
end += n; |
|
return result; |
|
} |
|
|
|
void* BOOST_REGEX_CALL insert(size_type pos, size_type n); |
|
|
|
size_type BOOST_REGEX_CALL size() |
|
{ |
|
return end - start; |
|
} |
|
|
|
size_type BOOST_REGEX_CALL capacity() |
|
{ |
|
return last - start; |
|
} |
|
|
|
void* BOOST_REGEX_CALL data()const |
|
{ |
|
return start; |
|
} |
|
|
|
size_type BOOST_REGEX_CALL index(void* ptr) |
|
{ |
|
return static_cast<pointer>(ptr) - static_cast<pointer>(data()); |
|
} |
|
|
|
void BOOST_REGEX_CALL clear() |
|
{ |
|
end = start; |
|
} |
|
|
|
void BOOST_REGEX_CALL align() |
|
{ |
|
// move end up to a boundary: |
|
end = start + (((end - start) + padding_mask) & ~padding_mask); |
|
} |
|
void swap(raw_storage& that) |
|
{ |
|
std::swap(start, that.start); |
|
std::swap(end, that.end); |
|
std::swap(last, that.last); |
|
} |
|
}; |
|
|
|
inline raw_storage::raw_storage() |
|
{ |
|
last = start = end = 0; |
|
} |
|
|
|
inline raw_storage::raw_storage(size_type n) |
|
{ |
|
start = end = static_cast<pointer>(::operator new(n)); |
|
BOOST_REGEX_NOEH_ASSERT(start) |
|
last = start + n; |
|
} |
|
|
|
|
|
#ifdef BOOST_MSVC |
|
#pragma warning(push) |
|
#pragma warning(disable: 4103) |
|
#endif |
|
#ifdef BOOST_HAS_ABI_HEADERS |
|
# include BOOST_ABI_SUFFIX |
|
#endif |
|
#ifdef BOOST_MSVC |
|
#pragma warning(pop) |
|
#endif |
|
|
|
} // namespace re_detail |
|
} // namespace boost |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|