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;
37 next_in_buffer = prev_in_buffer->next_in_buffer;
38 prev_in_buffer->next_in_buffer = this;
45 void Bufferable::unlink_from_buffer()
48 prev_in_buffer->next_in_buffer = next_in_buffer;
51 next_in_buffer->prev_in_buffer = prev_in_buffer;
52 next_in_buffer->update_offset();
59 void Bufferable::update_offset()
61 unsigned new_offset = 0;
63 new_offset = prev_in_buffer->offset+prev_in_buffer->get_data_size();
65 unsigned align = get_alignment();
66 new_offset += align-1;
67 new_offset -= new_offset%align;
68 if(new_offset!=offset)
76 next_in_buffer->update_offset();
78 /* Do not resize the buffer here, as more bufferables may be added before
79 the buffer is actually used. */
82 void Bufferable::update_buffer() const
84 if(offset+get_data_size()>=buffer->get_size())
86 const Bufferable *last = this;
87 for(; last->next_in_buffer; last=last->next_in_buffer) ;
89 unsigned total_size = last->offset+last->get_data_size();
91 if(total_size>buffer->get_size())
93 buffer->data(total_size, 0);
94 /* Resizing the buffer invalidates its contents. Non-dirty data may
95 be in use, so reupload it. */
96 for(const Bufferable *b=last; b; b=b->prev_in_buffer)