// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) // (C) Copyright 2004-2007 Jonathan Turkanis // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) // See http://www.boost.org/libs/iostreams/ for documentation. #ifndef BOOST_IOSTREAMS_TEST_PUTBACK_HPP_INCLUDED #define BOOST_IOSTREAMS_TEST_PUTBACK_HPP_INCLUDED #include #include #include #include "detail/constants.hpp" #include "detail/temp_file.hpp" using boost::iostreams::test::chunk_size; bool putback_test_one(std::istream& is) { try { do { char buf[chunk_size]; is.read(buf, chunk_size); if (is.gcount() < static_cast(chunk_size)) break; is.putback('a'); if (is.get() != 'a') return false; } while (!is.eof()); return true; } catch (std::exception&) { return false; } } bool putback_test_two(std::istream& is) { try { do { char buf[chunk_size]; is.read(buf, chunk_size); if (is.gcount() < static_cast(chunk_size)) break; is.putback('a'); is.putback('b'); is.putback('c'); is.putback('d'); if ( is.get() != 'd' || is.get() != 'c' || is.get() != 'b' || is.get() != 'a' ) { return false; } } while (!is.eof()); return true; } catch (std::exception&) { return false; } } template bool putback_test_three(Source& src) { try { while (true) { char buf[chunk_size]; if (boost::iostreams::read(src, buf, chunk_size) < chunk_size) break; boost::iostreams::putback(src, 'a'); if (boost::iostreams::get(src) != 'a') return false; } return true; } catch (std::exception&) { return false; } } template bool putback_test_four(Source& src) { try { while (true) { char buf[chunk_size]; if (boost::iostreams::read(src, buf, chunk_size) < chunk_size) break; boost::iostreams::putback(src, 'a'); boost::iostreams::putback(src, 'b'); boost::iostreams::putback(src, 'c'); boost::iostreams::putback(src, 'd'); if ( boost::iostreams::get(src) != 'd' || boost::iostreams::get(src) != 'c' || boost::iostreams::get(src) != 'b' || boost::iostreams::get(src) != 'a' ) { return false; } } return true; } catch (std::exception&) { return false; } } void putback_test() { using namespace std; using namespace boost; using namespace boost::iostreams; using namespace boost::iostreams::test; test_file test; { filtering_istream is; is.set_device_buffer_size(0); is.push(file_source(test.name())); BOOST_CHECK_MESSAGE( putback_test_one(is), "failed putting back to unbuffered filtering_istream" ); } { filtering_istream is; is.set_pback_size(4); is.push(file_source(test.name())); BOOST_CHECK_MESSAGE( putback_test_two(is), "failed putting back to buffered filtering_istream" ); } { filtering_istream is; is.set_device_buffer_size(0); is.push(file_source(test.name())); BOOST_CHECK_MESSAGE( putback_test_three(is), "failed putting back to unbuffered filtering_istream" ); } { filtering_istream is; is.set_pback_size(4); is.push(file_source(test.name())); BOOST_CHECK_MESSAGE( putback_test_four(is), "failed putting back to buffered filtering_istream" ); } { filtering_istreambuf sb; sb.set_device_buffer_size(0); sb.push(file_source(test.name())); BOOST_CHECK_MESSAGE( putback_test_three(sb), "failed putting back to unbuffered filtering_istream" ); } { filtering_istreambuf sb; sb.set_pback_size(4); sb.push(file_source(test.name())); BOOST_CHECK_MESSAGE( putback_test_four(sb), "failed putting back to buffered filtering_istream" ); } } #endif // #ifndef BOOST_IOSTREAMS_TEST_PUTBACK_HPP_INCLUDED