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
							 |