Thursday, 15 August 2013

c++ - Copy a fixed number of bytes into an std::deque -



c++ - Copy a fixed number of bytes into an std::deque<char> -

i'm making class buffers binary info read std::cin; need limited ability back-track through stream. in more detail, when read n bytes stream, want able rewind n bytes in stream.

currently, append buffer appending individual characters std::deque, expect there improve way re-create chunks of info std::istream std::deque.

basically there way improve (remove?) while loop in load function below?

currently have:

#include<algorithm> #include<deque> class bufferedstdin{ public: bufferedstdin(): m_buffer(), m_cursor(0){ } // re-create info out internal buffer client's array // format dictated external interface requirement void read(char* dest, size_t n){ load(n) std::copy( m_buffer.begin(), m_buffer.begin()+n, dest ); m_cursor+=n; } // go backwards in stream; homecoming number of bytes moved. // @retval < input arg n indicates can't rewind far asked size_t rewind(size_t n){ int final_pos=m_cursor-n; if( final_pos < 0 ){ // can't go far client wants, go start of buffer size_t moved=m_cursor; m_cursor=0; homecoming moved; } else{ // can client wants m_cursor=final_pos; homecoming n; } } void load(n){ m_buffer.erase( m_buffer.begin(), m_buffer.begin()+m_cursor); m_cursor=0; while( m_buffer.size()<n){ char c; std::cin.get(c); m_buffer.push_back(c); } } // snip: other functions allow clients @ m_buffer std::deque<char> m_buffer; size_t m_cursor; }

maybe not more efficient, shorter:

void load(size_t n) { m_buffer.erase( m_buffer.begin(), m_buffer.begin()+m_cursor); m_cursor=0; if(m_buffer.size() < n) std::copy_n(std::istream_iterator<char>(std::cin), n - m_buffer.size(), std::back_inserter(m_buffer)); }

c++ std

No comments:

Post a Comment