タスク: T=buffer を指定した shared_ptr。ここで、バッファには動的な量のバイト (最後に uint8_t[]) があります。
allocate_shared は、この順序が保持されることを保証しますか: [shared_ptr data][object][additional butbuffer]
他の方法では機能しないため、たとえば: [object][shared_ptr data][additional butbuffer]
他の実装のアイデア?
template <class T>
class addon_allocator : public boost::noncopyable
{
public :
typedef T value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
public :
template<typename U> struct rebind
{
typedef addon_allocator<U> other;
};
public :
explicit addon_allocator( std::size_t size )
:m_size( size )
{
}
~addon_allocator()
{
}
addon_allocator(const addon_allocator<T>& other)
:m_size(other.m_size)
{
}
template <class U>
explicit addon_allocator(const addon_allocator<U>& other)
:m_size(other.get_addon_size())
{
}
pointer address(reference r)
{
return &r;
}
const_pointer address(const_reference r)
{
return &r;
}
pointer allocate(size_type cnt, typename std::allocator<void>::const_pointer = 0)
{
assert( cnt == 1 );
return reinterpret_cast<pointer>(
::operator new(sizeof(T) + m_size)
);
}
void deallocate(pointer p, size_type)
{
::operator delete(p);
}
std::size_t get_addon_size() const
{
return m_size;
}
private:
const std::size_t m_size;
};
class buffer : public boost::noncopyable
{
public:
buffer( std::size_t size )
:m_size(size)
{
}
const std::size_t m_size;
uint8_t m_data[];
static boost::shared_ptr<buffer> create(std::size_t size)
{
boost::allocate_shared<buffer>(
addon_allocator<buffer>(size),
size
);
}
};