Chris@16: // Boost.Range library Chris@16: // Chris@16: // Copyright Neil Groves 2010. Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // For more information, see http://www.boost.org/libs/range/ Chris@16: // Chris@16: #ifndef BOOST_RANGE_DETAIL_ANY_ITERATOR_BUFFER_HPP_INCLUDED Chris@16: #define BOOST_RANGE_DETAIL_ANY_ITERATOR_BUFFER_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: template Chris@16: class any_iterator_buffer Chris@16: : noncopyable Chris@16: { Chris@16: BOOST_STATIC_ASSERT(( StackBufferSize > 0 )); Chris@16: public: Chris@16: any_iterator_buffer() Chris@16: : m_ptr() Chris@16: { Chris@16: } Chris@16: Chris@16: ~any_iterator_buffer() Chris@16: { Chris@16: delete [] m_ptr; Chris@16: } Chris@16: Chris@16: void* allocate(std::size_t bytes) Chris@16: { Chris@16: BOOST_ASSERT( !m_ptr ); Chris@16: if (bytes <= StackBufferSize) Chris@16: return m_buffer.data(); Chris@16: Chris@16: m_ptr = new char[bytes]; Chris@16: return m_ptr; Chris@16: } Chris@16: Chris@16: void deallocate() Chris@16: { Chris@16: delete [] m_ptr; Chris@16: m_ptr = 0; Chris@16: } Chris@16: Chris@16: private: Chris@16: // Rationale: Chris@16: // Do not use inheritance from noncopyable because this causes Chris@16: // the concepts to erroneous detect the derived any_iterator Chris@16: // as noncopyable. Chris@16: any_iterator_buffer(const any_iterator_buffer&); Chris@16: void operator=(const any_iterator_buffer&); Chris@16: Chris@16: char* m_ptr; Chris@16: boost::array m_buffer; Chris@16: }; Chris@16: Chris@16: class any_iterator_heap_only_buffer Chris@16: : noncopyable Chris@16: { Chris@16: public: Chris@16: any_iterator_heap_only_buffer() Chris@16: : m_ptr() Chris@16: { Chris@16: } Chris@16: Chris@16: ~any_iterator_heap_only_buffer() Chris@16: { Chris@16: delete [] m_ptr; Chris@16: } Chris@16: Chris@16: void* allocate(std::size_t bytes) Chris@16: { Chris@16: BOOST_ASSERT( !m_ptr ); Chris@16: m_ptr = new char[bytes]; Chris@16: return m_ptr; Chris@16: } Chris@16: Chris@16: void deallocate() Chris@16: { Chris@16: delete [] m_ptr; Chris@16: m_ptr = 0; Chris@16: } Chris@16: Chris@16: private: Chris@16: char* m_ptr; Chris@16: }; Chris@16: Chris@16: template Chris@16: class any_iterator_stack_only_buffer Chris@16: { Chris@16: BOOST_STATIC_ASSERT(( StackBufferSize > 0 )); Chris@16: public: Chris@16: void* allocate(std::size_t bytes) Chris@16: { Chris@16: BOOST_ASSERT( bytes <= m_buffer.size() ); Chris@16: return m_buffer.data(); Chris@16: } Chris@16: Chris@16: void deallocate() Chris@16: { Chris@16: } Chris@16: Chris@16: private: Chris@16: boost::array m_buffer; Chris@16: }; Chris@16: Chris@16: typedef any_iterator_buffer<64> any_iterator_default_buffer; Chris@16: } // namespace boost Chris@16: Chris@16: #endif // include guard