159 std::pair<std::size_t, bool>
extract(std::size_t number, Type_* output) {
160 const std::size_t original = number;
163 const std::size_t remaining = my_available - my_current;
164 if (number < remaining) {
165 std::copy_n(my_buffer.data() + my_current, number, output);
166 my_current += number;
168 return std::make_pair(number,
true);
171 std::copy_n(my_buffer.data() + my_current, remaining, output);
176 const auto buffer_size = get_buffer_size();
177 if (my_available < buffer_size) {
178 my_current = my_available;
180 return std::make_pair(original - number,
false);
184 while (number >= buffer_size) {
185 my_overall += my_available;
186 my_available = refill(output);
188 output += my_available;
189 number -= my_available;
190 if (my_available < buffer_size) {
191 my_current = my_available;
193 return std::make_pair(original - number,
false);
198 my_overall += my_available;
199 my_available = refill();
201 const auto to_use = std::min(my_available, number);
202 std::copy_n(my_buffer.data(), to_use, output);
209 bool exhausted = (to_use == my_available);
212 return std::make_pair(original - number, !exhausted);
236 const auto original = number;
241 const std::size_t remaining = my_available - my_current;
242 if (number <= remaining) {
243 std::copy_n(my_buffer.data() + my_current, number, output);
244 my_current += number - 1;
249 std::copy_n(my_buffer.data() + my_current, remaining, output);
254 const auto buffer_size = get_buffer_size();
255 if (my_available < buffer_size) {
256 assert(my_available > 0);
257 my_current = my_available - 1;
259 return original - number;
264 while (number > buffer_size) {
265 my_overall += my_available;
266 my_available = refill(output);
268 output += my_available;
269 number -= my_available;
271 if (my_available < buffer_size) {
274 assert(remaining > 0);
275 my_buffer[0] = *(output - 1);
276 my_overall += my_available;
281 return original - number;
286 my_overall += my_available;
287 my_available = refill();
294 const auto to_use = std::min(my_available, number);
295 std::copy_n(my_buffer.data(), to_use, output);
297 my_current = to_use - 1;
301 assert(remaining > 0);
302 my_buffer[0] = *(output - 1);
309 return original - number;