mirror of
https://github.com/boostorg/detail.git
synced 2025-06-28 21:41:07 +02:00
Compare commits
1 Commits
svn-branch
...
svn-branch
Author | SHA1 | Date | |
---|---|---|---|
b5c12a40a9 |
@ -1,100 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------------
|
|
||||||
// boost blank.hpp header file
|
|
||||||
// See http://www.boost.org for updates, documentation, and revision history.
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Copyright (c) 2003
|
|
||||||
// Eric Friedman
|
|
||||||
//
|
|
||||||
// Distributed under 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)
|
|
||||||
|
|
||||||
#ifndef BOOST_BLANK_HPP
|
|
||||||
#define BOOST_BLANK_HPP
|
|
||||||
|
|
||||||
#include "boost/blank_fwd.hpp"
|
|
||||||
|
|
||||||
#include <iosfwd> // for std::basic_ostream forward declare
|
|
||||||
|
|
||||||
#include "boost/detail/templated_streams.hpp"
|
|
||||||
#include "boost/mpl/bool.hpp"
|
|
||||||
#include "boost/type_traits/is_empty.hpp"
|
|
||||||
#include "boost/type_traits/is_pod.hpp"
|
|
||||||
#include "boost/type_traits/is_stateless.hpp"
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
struct blank
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
// type traits specializations
|
|
||||||
//
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct is_pod< blank >
|
|
||||||
: mpl::true_
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct is_empty< blank >
|
|
||||||
: mpl::true_
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct is_stateless< blank >
|
|
||||||
: mpl::true_
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
// relational operators
|
|
||||||
//
|
|
||||||
|
|
||||||
inline bool operator==(const blank&, const blank&)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator<=(const blank&, const blank&)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator>=(const blank&, const blank&)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator!=(const blank&, const blank&)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator<(const blank&, const blank&)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator>(const blank&, const blank&)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// streaming support
|
|
||||||
//
|
|
||||||
BOOST_TEMPLATED_STREAM_TEMPLATE(E,T)
|
|
||||||
inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<(
|
|
||||||
BOOST_TEMPLATED_STREAM(ostream, E,T)& out
|
|
||||||
, const blank&
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// (output nothing)
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // BOOST_BLANK_HPP
|
|
@ -1,22 +0,0 @@
|
|||||||
//-----------------------------------------------------------------------------
|
|
||||||
// boost blank_fwd.hpp header file
|
|
||||||
// See http://www.boost.org for updates, documentation, and revision history.
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Copyright (c) 2003
|
|
||||||
// Eric Friedman
|
|
||||||
//
|
|
||||||
// Distributed under 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)
|
|
||||||
|
|
||||||
#ifndef BOOST_BLANK_FWD_HPP
|
|
||||||
#define BOOST_BLANK_FWD_HPP
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
struct blank;
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // BOOST_BLANK_FWD_HPP
|
|
@ -1,41 +0,0 @@
|
|||||||
// boost/cstdlib.hpp header ------------------------------------------------//
|
|
||||||
|
|
||||||
// Copyright Beman Dawes 2001. Distributed under 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org/libs/utility/cstdlib.html for documentation.
|
|
||||||
|
|
||||||
// Revision History
|
|
||||||
// 26 Feb 01 Initial version (Beman Dawes)
|
|
||||||
|
|
||||||
#ifndef BOOST_CSTDLIB_HPP
|
|
||||||
#define BOOST_CSTDLIB_HPP
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
|
|
||||||
namespace boost
|
|
||||||
{
|
|
||||||
// The intent is to propose the following for addition to namespace std
|
|
||||||
// in the C++ Standard Library, and to then deprecate EXIT_SUCCESS and
|
|
||||||
// EXIT_FAILURE. As an implementation detail, this header defines the
|
|
||||||
// new constants in terms of EXIT_SUCCESS and EXIT_FAILURE. In a new
|
|
||||||
// standard, the constants would be implementation-defined, although it
|
|
||||||
// might be worthwhile to "suggest" (which a standard is allowed to do)
|
|
||||||
// values of 0 and 1 respectively.
|
|
||||||
|
|
||||||
// Rationale for having multiple failure values: some environments may
|
|
||||||
// wish to distinguish between different classes of errors.
|
|
||||||
// Rationale for choice of values: programs often use values < 100 for
|
|
||||||
// their own error reporting. Values > 255 are sometimes reserved for
|
|
||||||
// system detected errors. 200/201 were suggested to minimize conflict.
|
|
||||||
|
|
||||||
const int exit_success = EXIT_SUCCESS; // implementation-defined value
|
|
||||||
const int exit_failure = EXIT_FAILURE; // implementation-defined value
|
|
||||||
const int exit_exception_failure = 200; // otherwise uncaught exception
|
|
||||||
const int exit_test_failure = 201; // report_error or
|
|
||||||
// report_critical_error called.
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright 2003-2007 Joaqu<71>n M L<>pez Mu<4D>oz.
|
/* Copyright 2003-2005 Joaqu<71>n M L<>pez Mu<4D>oz.
|
||||||
* Distributed under the Boost Software License, Version 1.0.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
* http://www.boost.org/LICENSE_1_0.txt)
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
@ -30,21 +30,13 @@ namespace detail{
|
|||||||
namespace allocator{
|
namespace allocator{
|
||||||
|
|
||||||
/* partial_std_allocator_wrapper inherits the functionality of a std
|
/* partial_std_allocator_wrapper inherits the functionality of a std
|
||||||
* allocator while providing a templatized ctor and other bits missing
|
* allocator while providing a templatized ctor.
|
||||||
* in some stdlib implementation or another.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
class partial_std_allocator_wrapper:public std::allocator<Type>
|
class partial_std_allocator_wrapper:public std::allocator<Type>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/* Oddly enough, STLport does not define std::allocator<void>::value_type
|
|
||||||
* when configured to work without partial template specialization.
|
|
||||||
* No harm in supplying the definition here unconditionally.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef Type value_type;
|
|
||||||
|
|
||||||
partial_std_allocator_wrapper(){};
|
partial_std_allocator_wrapper(){};
|
||||||
|
|
||||||
template<typename Other>
|
template<typename Other>
|
||||||
|
@ -1,8 +1,3 @@
|
|||||||
// Copyright 2005 Caleb Epstein
|
|
||||||
// Copyright 2006 John Maddock
|
|
||||||
// Distributed under the Boost Software License, Version 1.0. (See accompany-
|
|
||||||
// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997
|
* Copyright (c) 1997
|
||||||
* Silicon Graphics Computer Systems, Inc.
|
* Silicon Graphics Computer Systems, Inc.
|
||||||
@ -42,15 +37,9 @@
|
|||||||
# error Unknown machine endianness detected.
|
# error Unknown machine endianness detected.
|
||||||
# endif
|
# endif
|
||||||
# define BOOST_BYTE_ORDER __BYTE_ORDER
|
# define BOOST_BYTE_ORDER __BYTE_ORDER
|
||||||
#elif defined(_BIG_ENDIAN)
|
|
||||||
# define BOOST_BIG_ENDIAN
|
|
||||||
# define BOOST_BYTE_ORDER 4321
|
|
||||||
#elif defined(_LITTLE_ENDIAN)
|
|
||||||
# define BOOST_LITTLE_ENDIAN
|
|
||||||
# define BOOST_BYTE_ORDER 1234
|
|
||||||
#elif defined(__sparc) || defined(__sparc__) \
|
#elif defined(__sparc) || defined(__sparc__) \
|
||||||
|| defined(_POWER) || defined(__powerpc__) \
|
|| defined(_POWER) || defined(__powerpc__) \
|
||||||
|| defined(__ppc__) || defined(__hpux) \
|
|| defined(__ppc__) || defined(__hppa) \
|
||||||
|| defined(_MIPSEB) || defined(_POWER) \
|
|| defined(_MIPSEB) || defined(_POWER) \
|
||||||
|| defined(__s390__)
|
|| defined(__s390__)
|
||||||
# define BOOST_BIG_ENDIAN
|
# define BOOST_BIG_ENDIAN
|
||||||
@ -58,11 +47,7 @@
|
|||||||
#elif defined(__i386__) || defined(__alpha__) \
|
#elif defined(__i386__) || defined(__alpha__) \
|
||||||
|| defined(__ia64) || defined(__ia64__) \
|
|| defined(__ia64) || defined(__ia64__) \
|
||||||
|| defined(_M_IX86) || defined(_M_IA64) \
|
|| defined(_M_IX86) || defined(_M_IA64) \
|
||||||
|| defined(_M_ALPHA) || defined(__amd64) \
|
|| defined(_M_ALPHA)
|
||||||
|| defined(__amd64__) || defined(_M_AMD64) \
|
|
||||||
|| defined(__x86_64) || defined(__x86_64__) \
|
|
||||||
|| defined(_M_X64)
|
|
||||||
|
|
||||||
# define BOOST_LITTLE_ENDIAN
|
# define BOOST_LITTLE_ENDIAN
|
||||||
# define BOOST_BYTE_ORDER 1234
|
# define BOOST_BYTE_ORDER 1234
|
||||||
#else
|
#else
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
|
|
||||||
// (C) Copyright Matthias Troyerk 2006.
|
|
||||||
// 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).
|
|
||||||
//
|
|
||||||
// See http://www.boost.org/libs/type_traits for most recent version including documentation.
|
|
||||||
|
|
||||||
#ifndef BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED
|
|
||||||
#define BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED
|
|
||||||
|
|
||||||
#include <boost/type_traits/has_trivial_constructor.hpp>
|
|
||||||
|
|
||||||
namespace boost { namespace detail {
|
|
||||||
|
|
||||||
/// type trait to check for a default constructor
|
|
||||||
///
|
|
||||||
/// The default implementation just checks for a trivial constructor.
|
|
||||||
/// Using some compiler magic it might be possible to provide a better default
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
struct has_default_constructor
|
|
||||||
: public has_trivial_constructor<T>
|
|
||||||
{};
|
|
||||||
|
|
||||||
} } // namespace boost::detail
|
|
||||||
|
|
||||||
|
|
||||||
#endif // BOOST_DETAIL_HAS_DEFAULT_CONSTRUCTOR_HPP_INCLUDED
|
|
@ -1,89 +0,0 @@
|
|||||||
// boost/identifier.hpp ----------------------------------------------------//
|
|
||||||
|
|
||||||
// Copyright Beman Dawes 2006
|
|
||||||
|
|
||||||
// Distributed under 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)
|
|
||||||
|
|
||||||
// See documentation at http://www.boost.org/libs/utility
|
|
||||||
|
|
||||||
#ifndef BOOST_IDENTIFIER_HPP
|
|
||||||
#define BOOST_IDENTIFIER_HPP
|
|
||||||
|
|
||||||
#include <boost/utility/enable_if.hpp>
|
|
||||||
#include <boost/type_traits/is_base_of.hpp>
|
|
||||||
#include <iosfwd>
|
|
||||||
|
|
||||||
namespace boost
|
|
||||||
{
|
|
||||||
namespace detail
|
|
||||||
{
|
|
||||||
// class template identifier ---------------------------------------------//
|
|
||||||
|
|
||||||
// Always used as a base class so that different instantiations result in
|
|
||||||
// different class types even if instantiated with the same value type T.
|
|
||||||
|
|
||||||
// Expected usage is that T is often an integer type, best passed by
|
|
||||||
// value. There is no reason why T can't be a possibly larger class such as
|
|
||||||
// std::string, best passed by const reference.
|
|
||||||
|
|
||||||
// This implementation uses pass by value, based on expected common uses.
|
|
||||||
|
|
||||||
template <typename T, typename D>
|
|
||||||
class identifier
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef T value_type;
|
|
||||||
|
|
||||||
const value_type value() const { return m_value; }
|
|
||||||
void assign( value_type v ) { m_value = v; }
|
|
||||||
|
|
||||||
bool operator==( const D & rhs ) const { return m_value == rhs.m_value; }
|
|
||||||
bool operator!=( const D & rhs ) const { return m_value != rhs.m_value; }
|
|
||||||
bool operator< ( const D & rhs ) const { return m_value < rhs.m_value; }
|
|
||||||
bool operator<=( const D & rhs ) const { return m_value <= rhs.m_value; }
|
|
||||||
bool operator> ( const D & rhs ) const { return m_value > rhs.m_value; }
|
|
||||||
bool operator>=( const D & rhs ) const { return m_value >= rhs.m_value; }
|
|
||||||
|
|
||||||
typedef void (*unspecified_bool_type)(D); // without the D, unspecified_bool_type
|
|
||||||
static void unspecified_bool_true(D){} // conversion allows relational operators
|
|
||||||
// between different identifier types
|
|
||||||
|
|
||||||
operator unspecified_bool_type() const { return m_value == value_type() ? 0 : unspecified_bool_true; }
|
|
||||||
bool operator!() const { return m_value == value_type(); }
|
|
||||||
|
|
||||||
// constructors are protected so that class can only be used as a base class
|
|
||||||
protected:
|
|
||||||
identifier() {}
|
|
||||||
explicit identifier( value_type v ) : m_value(v) {}
|
|
||||||
|
|
||||||
#if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 // 1300 == VC++ 7.0 bug workaround
|
|
||||||
private:
|
|
||||||
#endif
|
|
||||||
T m_value;
|
|
||||||
};
|
|
||||||
|
|
||||||
//#ifndef BOOST_NO_SFINAE
|
|
||||||
|
|
||||||
// template <class Ostream, class Id>
|
|
||||||
// typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >,
|
|
||||||
// Ostream & >::type operator<<( Ostream & os, const Id & id )
|
|
||||||
// {
|
|
||||||
// return os << id.value();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// template <class Istream, class Id>
|
|
||||||
// typename enable_if< is_base_of< identifier< typename Id::value_type, Id >, Id >,
|
|
||||||
// Istream & >::type operator>>( Istream & is, Id & id )
|
|
||||||
// {
|
|
||||||
// typename Id::value_type v;
|
|
||||||
// is >> v;
|
|
||||||
// id.value( v );
|
|
||||||
// return is;
|
|
||||||
// }
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
} // namespace detail
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // BOOST_IDENTIFIER_HPP
|
|
@ -388,27 +388,27 @@ typename is_pointer_help<V>::type reference_to_pointer_helper(V&);
|
|||||||
outer_no_type reference_to_pointer_helper(...);
|
outer_no_type reference_to_pointer_helper(...);
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
struct reference_to_pointer_impl
|
struct is_reference_to_pointer
|
||||||
{
|
{
|
||||||
static T t;
|
static T t;
|
||||||
BOOST_STATIC_CONSTANT(
|
BOOST_STATIC_CONSTANT(
|
||||||
bool, value
|
bool, value
|
||||||
= (sizeof((reference_to_pointer_helper)(t)) == sizeof(inner_yes_type))
|
= (is_reference<T>::value
|
||||||
|
&& sizeof((reference_to_pointer_helper)(t)) == sizeof(inner_yes_type))
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef mpl::bool_<value> type;
|
typedef mpl::bool_<value> type;
|
||||||
};
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
struct is_reference_to_pointer
|
|
||||||
: mpl::eval_if<is_reference<T>, reference_to_pointer_impl<T>, mpl::false_>::type
|
|
||||||
{
|
|
||||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_pointer,(T))
|
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_pointer,(T))
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
struct is_reference_to_function_pointer
|
struct is_reference_to_function_pointer
|
||||||
: mpl::eval_if<is_reference<T>, is_pointer_to_function_aux<T>, mpl::false_>::type
|
: mpl::if_<
|
||||||
|
is_reference<T>
|
||||||
|
, is_pointer_to_function_aux<T>
|
||||||
|
, mpl::bool_<false>
|
||||||
|
>::type
|
||||||
{
|
{
|
||||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_function_pointer,(T))
|
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_reference_to_function_pointer,(T))
|
||||||
};
|
};
|
||||||
|
@ -27,70 +27,38 @@
|
|||||||
# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement
|
# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement
|
||||||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
|
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange
|
# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
|
|
||||||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER InterlockedCompareExchangePointer
|
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER InterlockedCompareExchangePointer
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER InterlockedExchangePointer
|
# define BOOST_INTERLOCKED_EXCHANGE_POINTER InterlockedExchangePointer
|
||||||
|
|
||||||
#elif defined(_WIN32_WCE)
|
|
||||||
|
|
||||||
// under Windows CE we still have old-style Interlocked* functions
|
|
||||||
|
|
||||||
extern "C" long __cdecl InterlockedIncrement( long* );
|
|
||||||
extern "C" long __cdecl InterlockedDecrement( long* );
|
|
||||||
extern "C" long __cdecl InterlockedCompareExchange( long*, long, long );
|
|
||||||
extern "C" long __cdecl InterlockedExchange( long*, long );
|
|
||||||
extern "C" long __cdecl InterlockedExchangeAdd( long*, long );
|
|
||||||
|
|
||||||
# define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement
|
|
||||||
# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement
|
|
||||||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
|
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange
|
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
|
|
||||||
|
|
||||||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
|
|
||||||
((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long*)(dest),(long)(exchange),(long)(compare)))
|
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
|
|
||||||
((void*)BOOST_INTERLOCKED_EXCHANGE((long*)(dest),(long)(exchange)))
|
|
||||||
|
|
||||||
#elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN )
|
#elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN )
|
||||||
|
|
||||||
extern "C" long __cdecl _InterlockedIncrement( long volatile * );
|
extern "C" long __cdecl _InterlockedIncrement( long volatile * );
|
||||||
extern "C" long __cdecl _InterlockedDecrement( long volatile * );
|
extern "C" long __cdecl _InterlockedDecrement( long volatile * );
|
||||||
extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );
|
extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );
|
||||||
extern "C" long __cdecl _InterlockedExchange( long volatile *, long);
|
extern "C" long __cdecl _InterlockedExchange( long volatile *, long);
|
||||||
extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long);
|
|
||||||
|
|
||||||
# pragma intrinsic( _InterlockedIncrement )
|
# pragma intrinsic( _InterlockedIncrement )
|
||||||
# pragma intrinsic( _InterlockedDecrement )
|
# pragma intrinsic( _InterlockedDecrement )
|
||||||
# pragma intrinsic( _InterlockedCompareExchange )
|
# pragma intrinsic( _InterlockedCompareExchange )
|
||||||
# pragma intrinsic( _InterlockedExchange )
|
# pragma intrinsic( _InterlockedExchange )
|
||||||
# pragma intrinsic( _InterlockedExchangeAdd )
|
|
||||||
|
|
||||||
# if defined(_M_IA64) || defined(_M_AMD64)
|
# if defined(_M_IA64) || defined(_M_AMD64)
|
||||||
|
|
||||||
extern "C" void* __cdecl _InterlockedCompareExchangePointer( void* volatile *, void*, void* );
|
extern "C" void* __cdecl _InterlockedCompareExchangePointer( void* volatile *, void*, void* );
|
||||||
extern "C" void* __cdecl _InterlockedExchangePointer( void* volatile *, void* );
|
extern "C" void* __cdecl _InterlockedExchangePointer( void* volatile *, void* );
|
||||||
|
|
||||||
# pragma intrinsic( _InterlockedCompareExchangePointer )
|
# pragma intrinsic( _InterlockedCompareExchangePointer )
|
||||||
# pragma intrinsic( _InterlockedExchangePointer )
|
# pragma intrinsic( _InterlockedExchangePointer )
|
||||||
|
|
||||||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer
|
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer
|
# define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer
|
||||||
|
|
||||||
# else
|
# else
|
||||||
|
|
||||||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
|
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
|
||||||
((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
|
((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
|
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
|
||||||
((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange)))
|
((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange)))
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement
|
# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement
|
||||||
# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement
|
# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement
|
||||||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
|
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange
|
# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
|
|
||||||
|
|
||||||
#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ )
|
#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ )
|
||||||
|
|
||||||
@ -104,8 +72,6 @@ extern "C" __declspec(dllimport) long __stdcall InterlockedIncrement( long volat
|
|||||||
extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * );
|
extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * );
|
||||||
extern "C" __declspec(dllimport) long __stdcall InterlockedCompareExchange( long volatile *, long, long );
|
extern "C" __declspec(dllimport) long __stdcall InterlockedCompareExchange( long volatile *, long, long );
|
||||||
extern "C" __declspec(dllimport) long __stdcall InterlockedExchange( long volatile *, long );
|
extern "C" __declspec(dllimport) long __stdcall InterlockedExchange( long volatile *, long );
|
||||||
extern "C" __declspec(dllimport) long __stdcall InterlockedExchangeAdd( long volatile *, long );
|
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
@ -114,8 +80,6 @@ extern "C" __declspec(dllimport) long __stdcall InterlockedExchangeAdd( long vol
|
|||||||
# define BOOST_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement
|
# define BOOST_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement
|
||||||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange
|
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange
|
# define BOOST_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE_ADD ::boost::detail::InterlockedExchangeAdd
|
|
||||||
|
|
||||||
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
|
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
|
||||||
((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
|
((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
|
||||||
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
|
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
|
||||||
|
@ -4,15 +4,13 @@
|
|||||||
#ifndef IS_INCREMENTABLE_DWA200415_HPP
|
#ifndef IS_INCREMENTABLE_DWA200415_HPP
|
||||||
# define IS_INCREMENTABLE_DWA200415_HPP
|
# define IS_INCREMENTABLE_DWA200415_HPP
|
||||||
|
|
||||||
|
# include <boost/type_traits/detail/bool_trait_def.hpp>
|
||||||
# include <boost/type_traits/detail/template_arity_spec.hpp>
|
# include <boost/type_traits/detail/template_arity_spec.hpp>
|
||||||
# include <boost/type_traits/remove_cv.hpp>
|
# include <boost/type_traits/remove_cv.hpp>
|
||||||
# include <boost/mpl/aux_/lambda_support.hpp>
|
# include <boost/mpl/aux_/lambda_support.hpp>
|
||||||
# include <boost/mpl/bool.hpp>
|
# include <boost/mpl/bool.hpp>
|
||||||
# include <boost/detail/workaround.hpp>
|
# include <boost/detail/workaround.hpp>
|
||||||
|
|
||||||
// Must be the last include
|
|
||||||
# include <boost/type_traits/detail/bool_trait_def.hpp>
|
|
||||||
|
|
||||||
namespace boost { namespace detail {
|
namespace boost { namespace detail {
|
||||||
|
|
||||||
// is_incrementable<T> metafunction
|
// is_incrementable<T> metafunction
|
||||||
@ -119,6 +117,5 @@ BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_postfix_incrementable)
|
|||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
# include <boost/type_traits/detail/bool_trait_undef.hpp>
|
|
||||||
|
|
||||||
#endif // IS_INCREMENTABLE_DWA200415_HPP
|
#endif // IS_INCREMENTABLE_DWA200415_HPP
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
// Copyright <20> 2001 Ronald Garcia, Indiana University (garcia@osl.iu.edu)
|
// Copyright <20> 2001 Ronald Garcia, Indiana University (garcia@osl.iu.edu)
|
||||||
// Andrew Lumsdaine, Indiana University (lums@osl.iu.edu).
|
// Andrew Lumsdaine, Indiana University (lums@osl.iu.edu). Permission to copy,
|
||||||
// Distributed under the Boost Software License, Version 1.0. (See accompany-
|
// use, modify, sell and distribute this software is granted provided this
|
||||||
// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
// copyright notice appears in all copies. This software is provided "as is"
|
||||||
|
// without express or implied warranty, and with no claim as to its suitability
|
||||||
|
// for any purpose.
|
||||||
|
|
||||||
#ifndef BOOST_UTF8_CODECVT_FACET_HPP
|
#ifndef BOOST_UTF8_CODECVT_FACET_HPP
|
||||||
#define BOOST_UTF8_CODECVT_FACET_HPP
|
#define BOOST_UTF8_CODECVT_FACET_HPP
|
||||||
@ -90,7 +92,7 @@
|
|||||||
namespace std {
|
namespace std {
|
||||||
#if defined(__LIBCOMO__)
|
#if defined(__LIBCOMO__)
|
||||||
using ::mbstate_t;
|
using ::mbstate_t;
|
||||||
#elif defined(BOOST_DINKUMWARE_STDLIB) && !defined(__BORLANDC__)
|
#elif defined(BOOST_DINKUMWARE_STDLIB)
|
||||||
using ::mbstate_t;
|
using ::mbstate_t;
|
||||||
#elif defined(__SGI_STL_PORT)
|
#elif defined(__SGI_STL_PORT)
|
||||||
#elif defined(BOOST_NO_STDC_NAMESPACE)
|
#elif defined(BOOST_NO_STDC_NAMESPACE)
|
||||||
@ -160,7 +162,7 @@ protected:
|
|||||||
virtual std::codecvt_base::result do_unshift(
|
virtual std::codecvt_base::result do_unshift(
|
||||||
std::mbstate_t&,
|
std::mbstate_t&,
|
||||||
char * from,
|
char * from,
|
||||||
char * /*to*/,
|
char * to,
|
||||||
char * & next
|
char * & next
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
|
@ -1,43 +0,0 @@
|
|||||||
#ifndef INDIRECT_REFERENCE_DWA200415_HPP
|
|
||||||
# define INDIRECT_REFERENCE_DWA200415_HPP
|
|
||||||
|
|
||||||
//
|
|
||||||
// Copyright David Abrahams 2004. Use, modification and distribution is
|
|
||||||
// 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)
|
|
||||||
//
|
|
||||||
// typename indirect_reference<P>::type provides the type of *p.
|
|
||||||
//
|
|
||||||
// http://www.boost.org/libs/iterator/doc/pointee.html
|
|
||||||
//
|
|
||||||
|
|
||||||
# include <boost/detail/is_incrementable.hpp>
|
|
||||||
# include <boost/iterator/iterator_traits.hpp>
|
|
||||||
# include <boost/type_traits/remove_cv.hpp>
|
|
||||||
# include <boost/mpl/eval_if.hpp>
|
|
||||||
# include <boost/pointee.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
namespace detail
|
|
||||||
{
|
|
||||||
template <class P>
|
|
||||||
struct smart_ptr_reference
|
|
||||||
{
|
|
||||||
typedef typename boost::pointee<P>::type& type;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class P>
|
|
||||||
struct indirect_reference
|
|
||||||
: mpl::eval_if<
|
|
||||||
detail::is_incrementable<P>
|
|
||||||
, iterator_reference<P>
|
|
||||||
, detail::smart_ptr_reference<P>
|
|
||||||
>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // INDIRECT_REFERENCE_DWA200415_HPP
|
|
@ -1,27 +0,0 @@
|
|||||||
// -------------------------------------
|
|
||||||
//
|
|
||||||
// (C) Copyright Gennaro Prota 2003.
|
|
||||||
//
|
|
||||||
// Distributed under 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)
|
|
||||||
//
|
|
||||||
// ------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef BOOST_NON_TYPE_HPP_GP_20030417
|
|
||||||
#define BOOST_NON_TYPE_HPP_GP_20030417
|
|
||||||
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
// Just a simple "envelope" for non-type template parameters. Useful
|
|
||||||
// to work around some MSVC deficiencies.
|
|
||||||
|
|
||||||
template <typename T, T n>
|
|
||||||
struct non_type { };
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
@ -1,16 +0,0 @@
|
|||||||
// -*- C++ -*- forwarding header.
|
|
||||||
// (C) Copyright Jeremy Siek 2004
|
|
||||||
// Distributed under 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)
|
|
||||||
|
|
||||||
#ifndef BOOST_CSTDDEF_HPP
|
|
||||||
#define BOOST_CSTDDEF_HPP
|
|
||||||
|
|
||||||
#if defined(__sgi) && !defined(__GNUC__)
|
|
||||||
# include <stddef.h>
|
|
||||||
#else
|
|
||||||
# include <cstddef>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,43 +0,0 @@
|
|||||||
// (C) Copyright Jeremy Siek 2000.
|
|
||||||
// Distributed under 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)
|
|
||||||
|
|
||||||
// This header replaces the implementation of ct_if that preceded the
|
|
||||||
// introduction of Boost.MPL with a facade that defers to that reviewed and
|
|
||||||
// accepted library.
|
|
||||||
|
|
||||||
// Author: Ronald Garcia
|
|
||||||
// Date: 20 October, 2006
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef BOOST_CT_IF_HPP
|
|
||||||
#define BOOST_CT_IF_HPP
|
|
||||||
|
|
||||||
|
|
||||||
// A stub implementation in terms of Boost.MPL
|
|
||||||
|
|
||||||
#include <boost/mpl/if.hpp>
|
|
||||||
#include <boost/mpl/not.hpp>
|
|
||||||
#include <boost/mpl/and.hpp>
|
|
||||||
// true_type and false_type are used by applications of ct_if
|
|
||||||
#include <boost/type_traits/integral_constant.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
template <class A, class B>
|
|
||||||
struct ct_and : boost::mpl::and_<A,B> {};
|
|
||||||
|
|
||||||
template <class A>
|
|
||||||
struct ct_not : mpl::not_<A> {};
|
|
||||||
|
|
||||||
template <bool cond, class A, class B>
|
|
||||||
struct ct_if : mpl::if_c<cond,A,B> {};
|
|
||||||
|
|
||||||
template <class cond, class A, class B>
|
|
||||||
struct ct_if_t : mpl::if_<cond,A,B> {};
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // BOOST_CT_IF_HPP
|
|
||||||
|
|
@ -1,116 +0,0 @@
|
|||||||
// -------------------------------------
|
|
||||||
// integer_log2.hpp
|
|
||||||
//
|
|
||||||
// Gives the integer part of the logarithm, in base 2, of a
|
|
||||||
// given number. Behavior is undefined if the argument is <= 0.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// (C) Copyright Gennaro Prota 2003 - 2004.
|
|
||||||
//
|
|
||||||
// Distributed under 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)
|
|
||||||
//
|
|
||||||
// ------------------------------------------------------
|
|
||||||
//
|
|
||||||
// $Id$
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef BOOST_INTEGER_LOG2_HPP_GP_20030301
|
|
||||||
#define BOOST_INTEGER_LOG2_HPP_GP_20030301
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
#include <climits>
|
|
||||||
#endif
|
|
||||||
#include "boost/limits.hpp"
|
|
||||||
#include "boost/config.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
namespace detail {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
int integer_log2_impl(T x, int n) {
|
|
||||||
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
while (x != 1) {
|
|
||||||
|
|
||||||
const T t = x >> n;
|
|
||||||
if (t) {
|
|
||||||
result += n;
|
|
||||||
x = t;
|
|
||||||
}
|
|
||||||
n /= 2;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// helper to find the maximum power of two
|
|
||||||
// less than p (more involved than necessary,
|
|
||||||
// to avoid PTS)
|
|
||||||
//
|
|
||||||
template <int p, int n>
|
|
||||||
struct max_pow2_less {
|
|
||||||
|
|
||||||
enum { c = 2*n < p };
|
|
||||||
|
|
||||||
BOOST_STATIC_CONSTANT(int, value =
|
|
||||||
c ? (max_pow2_less< c*p, 2*c*n>::value) : n);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct max_pow2_less<0, 0> {
|
|
||||||
|
|
||||||
BOOST_STATIC_CONSTANT(int, value = 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
// this template is here just for Borland :(
|
|
||||||
// we could simply rely on numeric_limits but sometimes
|
|
||||||
// Borland tries to use numeric_limits<const T>, because
|
|
||||||
// of its usual const-related problems in argument deduction
|
|
||||||
// - gps
|
|
||||||
template <typename T>
|
|
||||||
struct width {
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
BOOST_STATIC_CONSTANT(int, value = sizeof(T) * CHAR_BIT);
|
|
||||||
#else
|
|
||||||
BOOST_STATIC_CONSTANT(int, value = (std::numeric_limits<T>::digits));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
} // detail
|
|
||||||
|
|
||||||
|
|
||||||
// ---------
|
|
||||||
// integer_log2
|
|
||||||
// ---------------
|
|
||||||
//
|
|
||||||
template <typename T>
|
|
||||||
int integer_log2(T x) {
|
|
||||||
|
|
||||||
assert(x > 0);
|
|
||||||
|
|
||||||
const int n = detail::max_pow2_less<
|
|
||||||
detail::width<T> :: value, 4
|
|
||||||
> :: value;
|
|
||||||
|
|
||||||
return detail::integer_log2_impl(x, n);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
@ -1,18 +0,0 @@
|
|||||||
// (C) Copyright David Abrahams 2001.
|
|
||||||
// Distributed under 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)
|
|
||||||
|
|
||||||
#ifndef BOOST_TYPE_DWA20010120_HPP
|
|
||||||
# define BOOST_TYPE_DWA20010120_HPP
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
// Just a simple "type envelope". Useful in various contexts, mostly to work
|
|
||||||
// around some MSVC deficiencies.
|
|
||||||
template <class T>
|
|
||||||
struct type {};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // BOOST_TYPE_DWA20010120_HPP
|
|
@ -1,29 +0,0 @@
|
|||||||
// Boost.Signals library
|
|
||||||
|
|
||||||
// Copyright Douglas Gregor 2001-2003. Use, modification and
|
|
||||||
// distribution is 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)
|
|
||||||
|
|
||||||
// For more information, see http://www.boost.org/libs/signals
|
|
||||||
|
|
||||||
#ifndef BOOST_VISIT_EACH_HPP
|
|
||||||
#define BOOST_VISIT_EACH_HPP
|
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
template<typename Visitor, typename T>
|
|
||||||
inline void visit_each(Visitor& visitor, const T& t, long)
|
|
||||||
{
|
|
||||||
visitor(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Visitor, typename T>
|
|
||||||
inline void visit_each(Visitor& visitor, const T& t)
|
|
||||||
{
|
|
||||||
visit_each(visitor, t, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // BOOST_VISIT_EACH_HPP
|
|
@ -1,269 +0,0 @@
|
|||||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
|
||||||
// utf8_codecvt_facet.cpp
|
|
||||||
|
|
||||||
// Copyright <20> 2001 Ronald Garcia, Indiana University (garcia@osl.iu.edu)
|
|
||||||
// Andrew Lumsdaine, Indiana University (lums@osl.iu.edu).
|
|
||||||
// Use, modification and distribution is 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)
|
|
||||||
|
|
||||||
// Please see the comments in <boost/detail/utf8_codecvt_facet.hpp> to
|
|
||||||
// learn how this file should be used.
|
|
||||||
|
|
||||||
#include <boost/detail/utf8_codecvt_facet.hpp>
|
|
||||||
|
|
||||||
#include <cstdlib> // for multi-byte converson routines
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include <boost/limits.hpp>
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
|
|
||||||
// If we don't have wstring, then Unicode support
|
|
||||||
// is not available anyway, so we don't need to even
|
|
||||||
// compiler this file. This also fixes the problem
|
|
||||||
// with mingw, which can compile this file, but will
|
|
||||||
// generate link error when building DLL.
|
|
||||||
#ifndef BOOST_NO_STD_WSTRING
|
|
||||||
|
|
||||||
BOOST_UTF8_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
|
||||||
// implementation for wchar_t
|
|
||||||
|
|
||||||
// Translate incoming UTF-8 into UCS-4
|
|
||||||
std::codecvt_base::result utf8_codecvt_facet::do_in(
|
|
||||||
std::mbstate_t& /*state*/,
|
|
||||||
const char * from,
|
|
||||||
const char * from_end,
|
|
||||||
const char * & from_next,
|
|
||||||
wchar_t * to,
|
|
||||||
wchar_t * to_end,
|
|
||||||
wchar_t * & to_next
|
|
||||||
) const {
|
|
||||||
// Basic algorithm: The first octet determines how many
|
|
||||||
// octets total make up the UCS-4 character. The remaining
|
|
||||||
// "continuing octets" all begin with "10". To convert, subtract
|
|
||||||
// the amount that specifies the number of octets from the first
|
|
||||||
// octet. Subtract 0x80 (1000 0000) from each continuing octet,
|
|
||||||
// then mash the whole lot together. Note that each continuing
|
|
||||||
// octet only uses 6 bits as unique values, so only shift by
|
|
||||||
// multiples of 6 to combine.
|
|
||||||
while (from != from_end && to != to_end) {
|
|
||||||
|
|
||||||
// Error checking on the first octet
|
|
||||||
if (invalid_leading_octet(*from)){
|
|
||||||
from_next = from;
|
|
||||||
to_next = to;
|
|
||||||
return std::codecvt_base::error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The first octet is adjusted by a value dependent upon
|
|
||||||
// the number of "continuing octets" encoding the character
|
|
||||||
const int cont_octet_count = get_cont_octet_count(*from);
|
|
||||||
const wchar_t octet1_modifier_table[] = {
|
|
||||||
0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
|
|
||||||
};
|
|
||||||
|
|
||||||
// The unsigned char conversion is necessary in case char is
|
|
||||||
// signed (I learned this the hard way)
|
|
||||||
wchar_t ucs_result =
|
|
||||||
(unsigned char)(*from++) - octet1_modifier_table[cont_octet_count];
|
|
||||||
|
|
||||||
// Invariants :
|
|
||||||
// 1) At the start of the loop, 'i' continuing characters have been
|
|
||||||
// processed
|
|
||||||
// 2) *from points to the next continuing character to be processed.
|
|
||||||
int i = 0;
|
|
||||||
while(i != cont_octet_count && from != from_end) {
|
|
||||||
|
|
||||||
// Error checking on continuing characters
|
|
||||||
if (invalid_continuing_octet(*from)) {
|
|
||||||
from_next = from;
|
|
||||||
to_next = to;
|
|
||||||
return std::codecvt_base::error;
|
|
||||||
}
|
|
||||||
|
|
||||||
ucs_result *= (1 << 6);
|
|
||||||
|
|
||||||
// each continuing character has an extra (10xxxxxx)b attached to
|
|
||||||
// it that must be removed.
|
|
||||||
ucs_result += (unsigned char)(*from++) - 0x80;
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the buffer ends with an incomplete unicode character...
|
|
||||||
if (from == from_end && i != cont_octet_count) {
|
|
||||||
// rewind "from" to before the current character translation
|
|
||||||
from_next = from - (i+1);
|
|
||||||
to_next = to;
|
|
||||||
return std::codecvt_base::partial;
|
|
||||||
}
|
|
||||||
*to++ = ucs_result;
|
|
||||||
}
|
|
||||||
from_next = from;
|
|
||||||
to_next = to;
|
|
||||||
|
|
||||||
// Were we done converting or did we run out of destination space?
|
|
||||||
if(from == from_end) return std::codecvt_base::ok;
|
|
||||||
else return std::codecvt_base::partial;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::codecvt_base::result utf8_codecvt_facet::do_out(
|
|
||||||
std::mbstate_t& /*state*/,
|
|
||||||
const wchar_t * from,
|
|
||||||
const wchar_t * from_end,
|
|
||||||
const wchar_t * & from_next,
|
|
||||||
char * to,
|
|
||||||
char * to_end,
|
|
||||||
char * & to_next
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
// RG - consider merging this table with the other one
|
|
||||||
const wchar_t octet1_modifier_table[] = {
|
|
||||||
0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
|
|
||||||
};
|
|
||||||
|
|
||||||
wchar_t max_wchar = (std::numeric_limits<wchar_t>::max)();
|
|
||||||
while (from != from_end && to != to_end) {
|
|
||||||
|
|
||||||
// Check for invalid UCS-4 character
|
|
||||||
if (*from > max_wchar) {
|
|
||||||
from_next = from;
|
|
||||||
to_next = to;
|
|
||||||
return std::codecvt_base::error;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cont_octet_count = get_cont_octet_out_count(*from);
|
|
||||||
|
|
||||||
// RG - comment this formula better
|
|
||||||
int shift_exponent = (cont_octet_count) * 6;
|
|
||||||
|
|
||||||
// Process the first character
|
|
||||||
*to++ = static_cast<char>(octet1_modifier_table[cont_octet_count] +
|
|
||||||
(unsigned char)(*from / (1 << shift_exponent)));
|
|
||||||
|
|
||||||
// Process the continuation characters
|
|
||||||
// Invariants: At the start of the loop:
|
|
||||||
// 1) 'i' continuing octets have been generated
|
|
||||||
// 2) '*to' points to the next location to place an octet
|
|
||||||
// 3) shift_exponent is 6 more than needed for the next octet
|
|
||||||
int i = 0;
|
|
||||||
while (i != cont_octet_count && to != to_end) {
|
|
||||||
shift_exponent -= 6;
|
|
||||||
*to++ = static_cast<char>(0x80 + ((*from / (1 << shift_exponent)) % (1 << 6)));
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
// If we filled up the out buffer before encoding the character
|
|
||||||
if(to == to_end && i != cont_octet_count) {
|
|
||||||
from_next = from;
|
|
||||||
to_next = to - (i+1);
|
|
||||||
return std::codecvt_base::partial;
|
|
||||||
}
|
|
||||||
*from++;
|
|
||||||
}
|
|
||||||
from_next = from;
|
|
||||||
to_next = to;
|
|
||||||
// Were we done or did we run out of destination space
|
|
||||||
if(from == from_end) return std::codecvt_base::ok;
|
|
||||||
else return std::codecvt_base::partial;
|
|
||||||
}
|
|
||||||
|
|
||||||
// How many char objects can I process to get <= max_limit
|
|
||||||
// wchar_t objects?
|
|
||||||
int utf8_codecvt_facet::do_length(
|
|
||||||
BOOST_CODECVT_DO_LENGTH_CONST std::mbstate_t &,
|
|
||||||
const char * from,
|
|
||||||
const char * from_end,
|
|
||||||
std::size_t max_limit
|
|
||||||
#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))
|
|
||||||
) const throw()
|
|
||||||
#else
|
|
||||||
) const
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
// RG - this code is confusing! I need a better way to express it.
|
|
||||||
// and test cases.
|
|
||||||
|
|
||||||
// Invariants:
|
|
||||||
// 1) last_octet_count has the size of the last measured character
|
|
||||||
// 2) char_count holds the number of characters shown to fit
|
|
||||||
// within the bounds so far (no greater than max_limit)
|
|
||||||
// 3) from_next points to the octet 'last_octet_count' before the
|
|
||||||
// last measured character.
|
|
||||||
int last_octet_count=0;
|
|
||||||
std::size_t char_count = 0;
|
|
||||||
const char* from_next = from;
|
|
||||||
// Use "<" because the buffer may represent incomplete characters
|
|
||||||
while (from_next+last_octet_count <= from_end && char_count <= max_limit) {
|
|
||||||
from_next += last_octet_count;
|
|
||||||
last_octet_count = (get_octet_count(*from_next));
|
|
||||||
++char_count;
|
|
||||||
}
|
|
||||||
return static_cast<int>(from_next-from_end);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int utf8_codecvt_facet::get_octet_count(
|
|
||||||
unsigned char lead_octet
|
|
||||||
){
|
|
||||||
// if the 0-bit (MSB) is 0, then 1 character
|
|
||||||
if (lead_octet <= 0x7f) return 1;
|
|
||||||
|
|
||||||
// Otherwise the count number of consecutive 1 bits starting at MSB
|
|
||||||
// assert(0xc0 <= lead_octet && lead_octet <= 0xfd);
|
|
||||||
|
|
||||||
if (0xc0 <= lead_octet && lead_octet <= 0xdf) return 2;
|
|
||||||
else if (0xe0 <= lead_octet && lead_octet <= 0xef) return 3;
|
|
||||||
else if (0xf0 <= lead_octet && lead_octet <= 0xf7) return 4;
|
|
||||||
else if (0xf8 <= lead_octet && lead_octet <= 0xfb) return 5;
|
|
||||||
else return 6;
|
|
||||||
}
|
|
||||||
BOOST_UTF8_END_NAMESPACE
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
template<std::size_t s>
|
|
||||||
int get_cont_octet_out_count_impl(wchar_t word){
|
|
||||||
if (word < 0x80) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (word < 0x800) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// note the following code will generate on some platforms where
|
|
||||||
// wchar_t is defined as UCS2. The warnings are superfluous as
|
|
||||||
// the specialization is never instantitiated with such compilers.
|
|
||||||
template<>
|
|
||||||
int get_cont_octet_out_count_impl<4>(wchar_t word){
|
|
||||||
if (word < 0x80) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (word < 0x800) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (word < 0x10000) {
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
if (word < 0x200000) {
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
if (word < 0x4000000) {
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace anonymous
|
|
||||||
|
|
||||||
BOOST_UTF8_BEGIN_NAMESPACE
|
|
||||||
// How many "continuing octets" will be needed for this word
|
|
||||||
// == total octets - 1.
|
|
||||||
int utf8_codecvt_facet::get_cont_octet_out_count(
|
|
||||||
wchar_t word
|
|
||||||
) const {
|
|
||||||
return get_cont_octet_out_count_impl<sizeof(wchar_t)>(word);
|
|
||||||
}
|
|
||||||
BOOST_UTF8_END_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
Reference in New Issue
Block a user