118 lines
2.7 KiB
C++
118 lines
2.7 KiB
C++
// 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/utility.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
|