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 const Bufferable *first = this;
78 for(; first->prev_in_buffer; first=first->prev_in_buffer) ;
80 unsigned total_size = 0;
81 for(const Bufferable *b=first; b; b=b->next_in_buffer)
82 total_size += b->get_data_size();
84 if(total_size!=buffer->get_size())
86 buffer->data(total_size, 0);
87 // Resizing the buffer invalidates its contents.
88 for(const Bufferable *b=first; b; b=b->next_in_buffer)