139 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			139 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //
 | ||
|  | // recycling_allocator.hpp
 | ||
|  | // ~~~~~~~~~~~~~~~~~~~~~~~
 | ||
|  | //
 | ||
|  | // Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 | ||
|  | //
 | ||
|  | // 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 ASIO_RECYCLING_ALLOCATOR_HPP
 | ||
|  | #define ASIO_RECYCLING_ALLOCATOR_HPP
 | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 | ||
|  | # pragma once
 | ||
|  | #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 | ||
|  | 
 | ||
|  | #include "asio/detail/config.hpp"
 | ||
|  | #include "asio/detail/recycling_allocator.hpp"
 | ||
|  | 
 | ||
|  | #include "asio/detail/push_options.hpp"
 | ||
|  | 
 | ||
|  | namespace asio { | ||
|  | 
 | ||
|  | /// An allocator that caches memory blocks in thread-local storage for reuse.
 | ||
|  | /**
 | ||
|  |  * The @recycling_allocator uses a simple strategy where a limited number of | ||
|  |  * small memory blocks are cached in thread-local storage, if the current | ||
|  |  * thread is running an @c io_context or is part of a @c thread_pool. | ||
|  |  */ | ||
|  | template <typename T> | ||
|  | class recycling_allocator | ||
|  | { | ||
|  | public: | ||
|  |   /// The type of object allocated by the recycling allocator.
 | ||
|  |   typedef T value_type; | ||
|  | 
 | ||
|  |   /// Rebind the allocator to another value_type.
 | ||
|  |   template <typename U> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     /// The rebound @c allocator type.
 | ||
|  |     typedef recycling_allocator<U> other; | ||
|  |   }; | ||
|  | 
 | ||
|  |   /// Default constructor.
 | ||
|  |   ASIO_CONSTEXPR recycling_allocator() ASIO_NOEXCEPT | ||
|  |   { | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Converting constructor.
 | ||
|  |   template <typename U> | ||
|  |   ASIO_CONSTEXPR recycling_allocator( | ||
|  |       const recycling_allocator<U>&) ASIO_NOEXCEPT | ||
|  |   { | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Equality operator. Always returns true.
 | ||
|  |   ASIO_CONSTEXPR bool operator==( | ||
|  |       const recycling_allocator&) const ASIO_NOEXCEPT | ||
|  |   { | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Inequality operator. Always returns false.
 | ||
|  |   ASIO_CONSTEXPR bool operator!=( | ||
|  |       const recycling_allocator&) const ASIO_NOEXCEPT | ||
|  |   { | ||
|  |     return false; | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Allocate memory for the specified number of values.
 | ||
|  |   T* allocate(std::size_t n) | ||
|  |   { | ||
|  |     return detail::recycling_allocator<T>().allocate(n); | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Deallocate memory for the specified number of values.
 | ||
|  |   void deallocate(T* p, std::size_t n) | ||
|  |   { | ||
|  |     detail::recycling_allocator<T>().deallocate(p, n); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | /// A proto-allocator that caches memory blocks in thread-local storage for
 | ||
|  | /// reuse.
 | ||
|  | /**
 | ||
|  |  * The @recycling_allocator uses a simple strategy where a limited number of | ||
|  |  * small memory blocks are cached in thread-local storage, if the current | ||
|  |  * thread is running an @c io_context or is part of a @c thread_pool. | ||
|  |  */ | ||
|  | template <> | ||
|  | class recycling_allocator<void> | ||
|  | { | ||
|  | public: | ||
|  |   /// No values are allocated by a proto-allocator.
 | ||
|  |   typedef void value_type; | ||
|  | 
 | ||
|  |   /// Rebind the allocator to another value_type.
 | ||
|  |   template <typename U> | ||
|  |   struct rebind | ||
|  |   { | ||
|  |     /// The rebound @c allocator type.
 | ||
|  |     typedef recycling_allocator<U> other; | ||
|  |   }; | ||
|  | 
 | ||
|  |   /// Default constructor.
 | ||
|  |   ASIO_CONSTEXPR recycling_allocator() ASIO_NOEXCEPT | ||
|  |   { | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Converting constructor.
 | ||
|  |   template <typename U> | ||
|  |   ASIO_CONSTEXPR recycling_allocator( | ||
|  |       const recycling_allocator<U>&) ASIO_NOEXCEPT | ||
|  |   { | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Equality operator. Always returns true.
 | ||
|  |   ASIO_CONSTEXPR bool operator==( | ||
|  |       const recycling_allocator&) const ASIO_NOEXCEPT | ||
|  |   { | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   /// Inequality operator. Always returns false.
 | ||
|  |   ASIO_CONSTEXPR bool operator!=( | ||
|  |       const recycling_allocator&) const ASIO_NOEXCEPT | ||
|  |   { | ||
|  |     return false; | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace asio
 | ||
|  | 
 | ||
|  | #include "asio/detail/pop_options.hpp"
 | ||
|  | 
 | ||
|  | #endif // ASIO_RECYCLING_ALLOCATOR_HPP
 |