118 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			118 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Boost.Range library | ||
|  | // | ||
|  | //  Copyright Neil Groves 2010. Use, modification and | ||
|  | //  distribution is subject to 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) | ||
|  | // | ||
|  | // For more information, see http://www.boost.org/libs/range/ | ||
|  | // | ||
|  | #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_BUFFER_HPP_INCLUDED | ||
|  | #define BOOST_RANGE_DETAIL_ANY_ITERATOR_BUFFER_HPP_INCLUDED | ||
|  | 
 | ||
|  | #include <boost/array.hpp> | ||
|  | #include <boost/assert.hpp> | ||
|  | #include <boost/static_assert.hpp> | ||
|  | #include <boost/noncopyable.hpp> | ||
|  | 
 | ||
|  | namespace boost | ||
|  | { | ||
|  |     template<std::size_t StackBufferSize> | ||
|  |     class any_iterator_buffer | ||
|  |         : noncopyable | ||
|  |     { | ||
|  |         BOOST_STATIC_ASSERT(( StackBufferSize > 0 )); | ||
|  |     public: | ||
|  |         any_iterator_buffer() | ||
|  |             : m_ptr() | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |         ~any_iterator_buffer() | ||
|  |         { | ||
|  |             delete [] m_ptr; | ||
|  |         } | ||
|  | 
 | ||
|  |         void* allocate(std::size_t bytes) | ||
|  |         { | ||
|  |             BOOST_ASSERT( !m_ptr ); | ||
|  |             if (bytes <= StackBufferSize) | ||
|  |                 return m_buffer.data(); | ||
|  | 
 | ||
|  |             m_ptr = new char[bytes]; | ||
|  |             return m_ptr; | ||
|  |         } | ||
|  | 
 | ||
|  |         void deallocate() | ||
|  |         { | ||
|  |             delete [] m_ptr; | ||
|  |             m_ptr = 0; | ||
|  |         } | ||
|  | 
 | ||
|  |     private: | ||
|  |         // Rationale: | ||
|  |         // Do not use inheritance from noncopyable because this causes | ||
|  |         // the concepts to erroneous detect the derived any_iterator | ||
|  |         // as noncopyable. | ||
|  |         any_iterator_buffer(const any_iterator_buffer&); | ||
|  |         void operator=(const any_iterator_buffer&); | ||
|  | 
 | ||
|  |         char* m_ptr; | ||
|  |         boost::array<char, StackBufferSize> m_buffer; | ||
|  |     }; | ||
|  | 
 | ||
|  |     class any_iterator_heap_only_buffer | ||
|  |         : noncopyable | ||
|  |     { | ||
|  |     public: | ||
|  |         any_iterator_heap_only_buffer() | ||
|  |             : m_ptr() | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |         ~any_iterator_heap_only_buffer() | ||
|  |         { | ||
|  |             delete [] m_ptr; | ||
|  |         } | ||
|  | 
 | ||
|  |         void* allocate(std::size_t bytes) | ||
|  |         { | ||
|  |             BOOST_ASSERT( !m_ptr ); | ||
|  |             m_ptr = new char[bytes]; | ||
|  |             return m_ptr; | ||
|  |         } | ||
|  | 
 | ||
|  |         void deallocate() | ||
|  |         { | ||
|  |             delete [] m_ptr; | ||
|  |             m_ptr = 0; | ||
|  |         } | ||
|  | 
 | ||
|  |     private: | ||
|  |         char* m_ptr; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<std::size_t StackBufferSize> | ||
|  |     class any_iterator_stack_only_buffer | ||
|  |     { | ||
|  |         BOOST_STATIC_ASSERT(( StackBufferSize > 0 )); | ||
|  |     public: | ||
|  |         void* allocate(std::size_t bytes) | ||
|  |         { | ||
|  |             BOOST_ASSERT( bytes <= m_buffer.size() ); | ||
|  |             return m_buffer.data(); | ||
|  |         } | ||
|  | 
 | ||
|  |         void deallocate() | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |     private: | ||
|  |         boost::array<char, StackBufferSize> m_buffer; | ||
|  |     }; | ||
|  | 
 | ||
|  |     typedef any_iterator_buffer<64> any_iterator_default_buffer; | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // include guard |