3 #include "bufferable.h"
10 Bufferable::Bufferable():
18 Bufferable::~Bufferable()
23 void Bufferable::use_buffer(Buffer *buf, Bufferable *prev)
25 if(prev && buf!=prev->buffer)
26 throw invalid_argument("Bufferable::use_buffer");
34 prev_in_buffer = prev;
36 prev_in_buffer->next_in_buffer = this;
39 update_buffer_offset();
42 void Bufferable::unlink_from_buffer()
45 prev_in_buffer->next_in_buffer = next_in_buffer;
48 next_in_buffer->prev_in_buffer = prev_in_buffer;
49 next_in_buffer->update_buffer_offset();
55 void Bufferable::update_buffer_offset()
59 offset = prev_in_buffer->buffer_offset+prev_in_buffer->get_data_size();
61 unsigned align = get_alignment();
63 offset -= offset%align;
64 if(offset!=buffer_offset)
66 buffer_offset = offset;
72 next_in_buffer->update_buffer_offset();
74 /* Do not resize the buffer here, as the offsets may change multiple times
75 before the buffer is actually used */
78 void Bufferable::update_buffer_data() const
80 if(buffer_offset+get_data_size()>=buffer->get_size())
82 const Bufferable *last = this;
83 for(; last->next_in_buffer; last=last->next_in_buffer) ;
85 unsigned total_size = last->buffer_offset+last->get_data_size();
87 if(total_size>buffer->get_size())
89 buffer->data(total_size, 0);
90 /* Resizing the buffer invalidates its contents. Non-dirty data may
91 be in use, so reupload it. */
92 for(const Bufferable *b=last; b; b=b->prev_in_buffer)