211 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*
 | 
						|
 *
 | 
						|
 * 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 BOOST_REGEX_DETAIL_NS{
 | 
						|
 | 
						|
#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));
 | 
						|
      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 BOOST_REGEX_DETAIL_NS
 | 
						|
} // namespace boost
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |