regex_workaround.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 203 行
HPP
203 行
/* * * Copyright (c) 1998-2005 * 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_workarounds.cpp * VERSION see <boost/version.hpp> * DESCRIPTION: Declares Misc workarounds. */#ifndef BOOST_REGEX_WORKAROUND_HPP#define BOOST_REGEX_WORKAROUND_HPP#include <new>#include <cstring>#include <cstdlib>#include <cstddef>#include <cassert>#include <cstdio>#include <climits>#include <string>#include <stdexcept>#include <iterator>#include <algorithm>#include <iosfwd>#include <vector>#include <map>#include <boost/limits.hpp>#include <boost/assert.hpp>#include <boost/cstdint.hpp>#include <boost/throw_exception.hpp>#include <boost/scoped_ptr.hpp>#include <boost/scoped_array.hpp>#include <boost/shared_ptr.hpp>#include <boost/mpl/bool_fwd.hpp>#ifndef BOOST_NO_STD_LOCALE# include <locale>#endif#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{ using ::sprintf; using ::strcpy; using ::strcat; using ::strlen;}#endifnamespace boost{ namespace re_detail{#ifdef BOOST_NO_STD_DISTANCEtemplate <class T>std::ptrdiff_t distance(const T& x, const T& y){ return y - x; }#elseusing std::distance;#endif}}#ifdef BOOST_REGEX_NO_BOOL# define BOOST_REGEX_MAKE_BOOL(x) static_cast<bool>((x) ? true : false)#else# define BOOST_REGEX_MAKE_BOOL(x) static_cast<bool>(x)#endif/***************************************************************************** * * Fix broken broken namespace support: * ****************************************************************************/#if defined(BOOST_NO_STDC_NAMESPACE) && defined(__cplusplus)namespace std{ using ::ptrdiff_t; using ::size_t; using ::abs; using ::memset; using ::memcpy;}#endif/***************************************************************************** * * helper functions pointer_construct/pointer_destroy: * ****************************************************************************/#ifdef __cplusplusnamespace boost{ namespace re_detail{#ifdef BOOST_MSVC#pragma warning (push)#pragma warning (disable : 4100)#endiftemplate <class T>inline void pointer_destroy(T* p){ p->~T(); (void)p; }#ifdef BOOST_MSVC#pragma warning (pop)#endiftemplate <class T>inline void pointer_construct(T* p, const T& t){ new (p) T(t); }}} // namespaces#endif/***************************************************************************** * * helper function copy: * ****************************************************************************/#ifdef __cplusplusnamespace boost{ namespace re_detail{#if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && defined(_CPPLIB_VER) && defined(BOOST_DINKUMWARE_STDLIB) && !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) // // MSVC 8 will either emit warnings or else refuse to compile // code that makes perfectly legitimate use of std::copy, when // the OutputIterator type is a user-defined class (apparently all user // defined iterators are "unsafe"). This code works around that: // template<class InputIterator, class OutputIterator> inline OutputIterator copy( InputIterator first, InputIterator last, OutputIterator dest ) { return stdext::unchecked_copy(first, last, dest); } template<class InputIterator1, class InputIterator2> inline bool equal( InputIterator1 first, InputIterator1 last, InputIterator2 with ) { return stdext::unchecked_equal(first, last, with); }#else using std::copy; using std::equal; #endif #if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__ // use safe versions of strcpy etc: using ::strcpy_s; using ::strcat_s;#else inline std::size_t strcpy_s( char *strDestination, std::size_t sizeInBytes, const char *strSource ) { if(std::strlen(strSource)+1 > sizeInBytes) return 1; std::strcpy(strDestination, strSource); return 0; } inline std::size_t strcat_s( char *strDestination, std::size_t sizeInBytes, const char *strSource ) { if(std::strlen(strSource) + std::strlen(strDestination) + 1 > sizeInBytes) return 1; std::strcat(strDestination, strSource); return 0; }#endif inline void overflow_error_if_not_zero(std::size_t i) { if(i) { std::overflow_error e("String buffer too small"); boost::throw_exception(e); } }}} // namespaces#endif // __cplusplus#endif // include guard
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?