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
 |