103 if (my_current < my_available) {
108 safe_update_position(my_overall, my_available, my_overall_failed);
110 const auto buffer_size = get_buffer_size();
111 if (my_available == buffer_size) {
112 my_available = refill();
117 return my_available > 0;
166 std::pair<std::size_t, bool>
extract(std::size_t number, Type_* output) {
167 const std::size_t original = number;
170 const std::size_t remaining = my_available - my_current;
171 if (number < remaining) {
172 std::copy_n(my_buffer.data() + my_current, number, output);
173 my_current += number;
175 return std::make_pair(number,
true);
178 std::copy_n(my_buffer.data() + my_current, remaining, output);
183 const auto buffer_size = get_buffer_size();
184 if (my_available < buffer_size) {
185 my_current = my_available;
187 return std::make_pair(original - number,
false);
191 while (number >= buffer_size) {
192 safe_update_position(my_overall, my_available, my_overall_failed);
193 my_available = refill(output);
195 output += my_available;
196 number -= my_available;
197 if (my_available < buffer_size) {
198 my_current = my_available;
200 return std::make_pair(original - number,
false);
205 safe_update_position(my_overall, my_available, my_overall_failed);
206 my_available = refill();
208 const auto to_use = std::min(my_available, number);
209 std::copy_n(my_buffer.data(), to_use, output);
216 bool exhausted = (to_use == my_available);
219 return std::make_pair(original - number, !exhausted);