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;
167 return std::make_pair(number,
true);
170 std::copy_n(my_buffer.data() + my_current, remaining, output);
175 const auto buffer_size = get_buffer_size();
176 if (my_available < buffer_size) {
177 my_current = my_available;
178 return std::make_pair(original - number,
false);
182 while (number >= buffer_size) {
183 my_overall += my_available;
184 my_available = refill(output);
186 output += my_available;
187 number -= my_available;
188 if (my_available < buffer_size) {
189 my_current = my_available;
190 return std::make_pair(original - number,
false);
195 my_overall += my_available;
196 my_available = refill();
198 const auto to_use = std::min(my_available, number);
199 std::copy_n(my_buffer.data(), to_use, output);
206 bool exhausted = (to_use == my_available);
208 return std::make_pair(original - number, !exhausted);