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 if(offset!=buffer_offset)
63 buffer_offset = offset;
69 next_in_buffer->update_buffer_offset();
71 /* Do not resize the buffer here, as the offsets may change multiple times
72 before the buffer is actually used */
75 void Bufferable::update_buffer_data() const
77 if(buffer_offset+get_data_size()>=buffer->get_size())
79 const Bufferable *last = this;
80 for(; last->next_in_buffer; last=last->next_in_buffer) ;
82 unsigned total_size = last->buffer_offset+last->get_data_size();
84 if(total_size>buffer->get_size())
86 buffer->data(total_size, 0);
87 /* Resizing the buffer invalidates its contents. Non-dirty data may
88 be in use, so reupload it. */
89 for(const Bufferable *b=last; b; b=b->prev_in_buffer)