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
							 |