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_offsets();
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_offsets();
55 void Bufferable::update_buffer_offsets()
59 offset = prev_in_buffer->buffer_offset+prev_in_buffer->get_data_size();
61 if(offset!=buffer_offset)
63 buffer_offset = offset;
68 next_in_buffer->update_buffer_offsets();
71 void Bufferable::update_buffer_data() const
73 const Bufferable *first = this;
74 for(; first->prev_in_buffer; first=first->prev_in_buffer) ;
76 unsigned total_size = 0;
77 for(const Bufferable *b=first; b; b=b->next_in_buffer)
78 total_size += b->get_data_size();
80 buffer->data(total_size, 0);
81 for(const Bufferable *b=first; b; b=b->next_in_buffer)
83 buffer->sub_data(b->buffer_offset, b->get_data_size(), b->get_data());