180 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			180 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | ////////////////////////////////////////////////////////////////////////////// | ||
|  | // | ||
|  | // (C) Copyright Ion Gaztanaga 2014-2015. 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/container for documentation. | ||
|  | // | ||
|  | ////////////////////////////////////////////////////////////////////////////// | ||
|  | 
 | ||
|  | #ifndef BOOST_CONTAINER_NEW_ALLOCATOR_HPP | ||
|  | #define BOOST_CONTAINER_NEW_ALLOCATOR_HPP | ||
|  | 
 | ||
|  | #ifndef BOOST_CONFIG_HPP | ||
|  | #  include <boost/config.hpp> | ||
|  | #endif | ||
|  | 
 | ||
|  | #if defined(BOOST_HAS_PRAGMA_ONCE) | ||
|  | #  pragma once | ||
|  | #endif | ||
|  | 
 | ||
|  | #include <boost/container/detail/config_begin.hpp> | ||
|  | #include <boost/container/detail/workaround.hpp> | ||
|  | #include <boost/container/throw_exception.hpp> | ||
|  | #include <cstddef> | ||
|  | 
 | ||
|  | //!\file | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace container { | ||
|  | 
 | ||
|  | /// @cond | ||
|  | 
 | ||
|  | template<bool Value> | ||
|  | struct new_allocator_bool | ||
|  | {  static const bool value = Value;  }; | ||
|  | 
 | ||
|  | template<class T> | ||
|  | class new_allocator; | ||
|  | 
 | ||
|  | /// @endcond | ||
|  | 
 | ||
|  | //! Specialization of new_allocator for void types | ||
|  | template<> | ||
|  | class new_allocator<void> | ||
|  | { | ||
|  |    public: | ||
|  |    typedef void                                 value_type; | ||
|  |    typedef void *                               pointer; | ||
|  |    typedef const void*                          const_pointer; | ||
|  |    //!A integral constant of type bool with value true | ||
|  |    typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) propagate_on_container_move_assignment; | ||
|  |    //!A integral constant of type bool with value true | ||
|  |    typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) is_always_equal; | ||
|  |    // reference-to-void members are impossible | ||
|  | 
 | ||
|  |    //!Obtains an new_allocator that allocates | ||
|  |    //!objects of type T2 | ||
|  |    template<class T2> | ||
|  |    struct rebind | ||
|  |    { | ||
|  |       typedef new_allocator< T2> other; | ||
|  |    }; | ||
|  | 
 | ||
|  |    //!Default constructor | ||
|  |    //!Never throws | ||
|  |    new_allocator() BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {} | ||
|  | 
 | ||
|  |    //!Constructor from other new_allocator. | ||
|  |    //!Never throws | ||
|  |    new_allocator(const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {} | ||
|  | 
 | ||
|  |    //!Constructor from related new_allocator. | ||
|  |    //!Never throws | ||
|  |    template<class T2> | ||
|  |    new_allocator(const new_allocator<T2> &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {} | ||
|  | 
 | ||
|  |    //!Swaps two allocators, does nothing | ||
|  |    //!because this new_allocator is stateless | ||
|  |    friend void swap(new_allocator &, new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {} | ||
|  | 
 | ||
|  |    //!An new_allocator always compares to true, as memory allocated with one | ||
|  |    //!instance can be deallocated by another instance | ||
|  |    friend bool operator==(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {  return true;   } | ||
|  | 
 | ||
|  |    //!An new_allocator always compares to false, as memory allocated with one | ||
|  |    //!instance can be deallocated by another instance | ||
|  |    friend bool operator!=(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {  return false;   } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | //! This class is a reduced STL-compatible allocator that allocates memory using operator new | ||
|  | template<class T> | ||
|  | class new_allocator | ||
|  | { | ||
|  |    public: | ||
|  |    typedef T                                    value_type; | ||
|  |    typedef T *                                  pointer; | ||
|  |    typedef const T *                            const_pointer; | ||
|  |    typedef T &                                  reference; | ||
|  |    typedef const T &                            const_reference; | ||
|  |    typedef std::size_t                          size_type; | ||
|  |    typedef std::ptrdiff_t                       difference_type; | ||
|  |    //!A integral constant of type bool with value true | ||
|  |    typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) propagate_on_container_move_assignment; | ||
|  |    //!A integral constant of type bool with value true | ||
|  |    typedef BOOST_CONTAINER_IMPDEF(new_allocator_bool<true>) is_always_equal; | ||
|  | 
 | ||
|  |    //!Obtains an new_allocator that allocates | ||
|  |    //!objects of type T2 | ||
|  |    template<class T2> | ||
|  |    struct rebind | ||
|  |    { | ||
|  |       typedef new_allocator<T2> other; | ||
|  |    }; | ||
|  | 
 | ||
|  |    //!Default constructor | ||
|  |    //!Never throws | ||
|  |    new_allocator() BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {} | ||
|  | 
 | ||
|  |    //!Constructor from other new_allocator. | ||
|  |    //!Never throws | ||
|  |    new_allocator(const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {} | ||
|  | 
 | ||
|  |    //!Constructor from related new_allocator. | ||
|  |    //!Never throws | ||
|  |    template<class T2> | ||
|  |    new_allocator(const new_allocator<T2> &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {} | ||
|  | 
 | ||
|  |    //!Allocates memory for an array of count elements. | ||
|  |    //!Throws std::bad_alloc if there is no enough memory | ||
|  |    pointer allocate(size_type count) | ||
|  |    { | ||
|  | 	   if(BOOST_UNLIKELY(count > this->max_size())) | ||
|  | 	      throw_bad_alloc(); | ||
|  | 	   return static_cast<T*>(::operator new(count*sizeof(T))); | ||
|  |    } | ||
|  | 
 | ||
|  |    //!Deallocates previously allocated memory. | ||
|  |    //!Never throws | ||
|  |    void deallocate(pointer ptr, size_type) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |      { ::operator delete((void*)ptr); } | ||
|  | 
 | ||
|  |    //!Returns the maximum number of elements that could be allocated. | ||
|  |    //!Never throws | ||
|  |    size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {  return size_type(-1)/sizeof(T);   } | ||
|  | 
 | ||
|  |    //!Swaps two allocators, does nothing | ||
|  |    //!because this new_allocator is stateless | ||
|  |    friend void swap(new_allocator &, new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {} | ||
|  | 
 | ||
|  |    //!An new_allocator always compares to true, as memory allocated with one | ||
|  |    //!instance can be deallocated by another instance | ||
|  |    friend bool operator==(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {  return true;   } | ||
|  | 
 | ||
|  |    //!An new_allocator always compares to false, as memory allocated with one | ||
|  |    //!instance can be deallocated by another instance | ||
|  |    friend bool operator!=(const new_allocator &, const new_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | ||
|  |    {  return false;   } | ||
|  | }; | ||
|  | 
 | ||
|  | }  //namespace container { | ||
|  | }  //namespace boost { | ||
|  | 
 | ||
|  | #include <boost/container/detail/config_end.hpp> | ||
|  | 
 | ||
|  | #endif   //BOOST_CONTAINER_NEW_ALLOCATOR_HPP |