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