40 if(m_buffer_pos + input_size >= m_main_block_mod + m_final_minimum) {
41 size_t to_copy = std::min<size_t>(m_buffer.size() - m_buffer_pos, input_size);
43 copy_mem(&m_buffer[m_buffer_pos], input, to_copy);
44 m_buffer_pos += to_copy;
47 input_size -= to_copy;
49 size_t total_to_consume =
50 round_down(std::min(m_buffer_pos, m_buffer_pos + input_size - m_final_minimum), m_main_block_mod);
54 m_buffer_pos -= total_to_consume;
56 copy_mem(m_buffer.data(), m_buffer.data() + total_to_consume, m_buffer_pos);
59 if(input_size >= m_final_minimum) {
60 size_t full_blocks = (input_size - m_final_minimum) / m_main_block_mod;
61 size_t to_copy = full_blocks * m_main_block_mod;
67 input_size -= to_copy;
71 copy_mem(&m_buffer[m_buffer_pos], input, input_size);
72 m_buffer_pos += input_size;
79 if(m_buffer_pos < m_final_minimum) {
80 throw Invalid_State(
"Buffered filter end_msg without enough input");
83 size_t spare_blocks = (m_buffer_pos - m_final_minimum) / m_main_block_mod;
86 size_t spare_bytes = m_main_block_mod * spare_blocks;
88 buffered_final(&m_buffer[spare_bytes], m_buffer_pos - spare_bytes);