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 const Buffer *old_buffer = Buffer::current(buffer->get_type());
86 if(offset+get_data_size()>=buffer->get_size())
88 const Bufferable *last = this;
89 for(; last->next_in_buffer; last=last->next_in_buffer) ;
91 unsigned total_size = last->offset+last->get_data_size();
93 if(total_size>buffer->get_size())
95 buffer->data(total_size, 0);
96 /* Resizing the buffer invalidates its contents. Non-dirty data may
97 be in use, so reupload it. */
98 for(const Bufferable *b=last; b; b=b->prev_in_buffer)
106 old_buffer->bind_to(buffer->get_type());