regex_raw_buffer.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 254 行
HPP
254 行
/* * * Copyright (c) 1998-2002 * Dr 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>#endifnamespace boost{ namespace re_detail{#ifdef BOOST_HAS_ABI_HEADERS# include BOOST_ABI_PREFIX#endifstruct 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 reg_expression for expression storage//template <class Allocator>class raw_storage{public: typedef Allocator allocator_type; typedef typename boost::detail::rebind_allocator<unsigned char, allocator_type>::type alloc_inst_type; typedef typename alloc_inst_type::size_type size_type; typedef typename alloc_inst_type::pointer pointer;private: // // empty member optimisation: struct alloc_data : public alloc_inst_type { typename alloc_inst_type::pointer last; alloc_data(const Allocator& a) : alloc_inst_type(a){} } alloc_inst; pointer start, end;public: raw_storage(const Allocator& a = Allocator()); raw_storage(size_type n, const Allocator& a = Allocator()); ~raw_storage() { alloc_inst.deallocate(start, (alloc_inst.last - start)); } void BOOST_REGEX_CALL resize(size_type n); void* BOOST_REGEX_CALL extend(size_type n) { if(size_type(alloc_inst.last - end) < n) resize(n + (end - start)); register void* 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 alloc_inst.last - start; } void* BOOST_REGEX_CALL data()const { return start; } size_type BOOST_REGEX_CALL index(void* ptr) { return reinterpret_cast<unsigned char*>(ptr) - reinterpret_cast<unsigned char*>(data()); } void BOOST_REGEX_CALL clear() { end = start; } void BOOST_REGEX_CALL align() { // move end up to a boundary: end = reinterpret_cast<unsigned char*>(start) + (((reinterpret_cast<unsigned char*>(end) - reinterpret_cast<unsigned char*>(start)) + padding_mask) & ~padding_mask); } Allocator BOOST_REGEX_CALL allocator()const; void swap(raw_storage& that) { std::swap(start, that.start); std::swap(end, that.end); std::swap(alloc_inst.last, that.alloc_inst.last); std::swap(static_cast<alloc_inst_type&>(alloc_inst), static_cast<alloc_inst_type&>(that.alloc_inst)); }};template <class Allocator>raw_storage<Allocator>::raw_storage(const Allocator& a) : alloc_inst(a){ start = end = alloc_inst.allocate(1024); BOOST_REGEX_NOEH_ASSERT(start) alloc_inst.last = start + 1024;}template <class Allocator>raw_storage<Allocator>::raw_storage(size_type n, const Allocator& a) : alloc_inst(a){ start = end = alloc_inst.allocate(n); BOOST_REGEX_NOEH_ASSERT(start) alloc_inst.last = start + n;}template <class Allocator>Allocator BOOST_REGEX_CALL raw_storage<Allocator>::allocator()const{ return alloc_inst;}template <class Allocator>void BOOST_REGEX_CALL raw_storage<Allocator>::resize(size_type n){ register size_type newsize = (alloc_inst.last - start) * 2; register size_type datasize = end - start; if(newsize < n) newsize = n; // extend newsize to WORD/DWORD boundary: newsize = (newsize + padding_mask) & ~(padding_mask); // allocate and copy data: register unsigned char* ptr = alloc_inst.allocate(newsize); BOOST_REGEX_NOEH_ASSERT(ptr) std::memcpy(ptr, start, datasize); // get rid of old buffer: alloc_inst.deallocate(start, (alloc_inst.last - start)); // and set up pointers: start = ptr; end = ptr + datasize; alloc_inst.last = ptr + newsize;}template <class Allocator>void* BOOST_REGEX_CALL raw_storage<Allocator>::insert(size_type pos, size_type n){ jm_assert(pos <= size_type(end - start)); if(size_type(alloc_inst.last - end) < n) resize(n + (end - start)); register void* result = start + pos; std::memmove(start + pos + n, start + pos, (end - start) - pos); end += n; return result;}#ifdef BOOST_HAS_ABI_HEADERS# include BOOST_ABI_SUFFIX#endif} // namespace re_detail} // namespace boost#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?