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
 | 
