restrict_test.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 687 行 · 第 1/2 页
CPP
687 行
// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)// (C) Copyright 2005-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.// Allow this file to be used by slice_test.hpp. It is important not to // replace BOOST_RESTRICT with BOOST_IOSTREAMS_RESTRICT here, since that// would interfere with the oepration of the header // <boost/iostreams/restrict.hpp>#ifndef BOOST_RESTRICT# define BOOST_RESTRICT restrict# define BOOST_RESTRICT_HEADER <boost/iostreams/restrict.hpp>#endif#include BOOST_RESTRICT_HEADER#include <algorithm> // equal.#include <cctype>#include <iterator> // back_inserter.#include <vector>#include <boost/iostreams/copy.hpp>#include <boost/iostreams/device/file.hpp>#include <boost/iostreams/device/null.hpp>#include <boost/iostreams/filtering_stream.hpp>#include <boost/test/test_tools.hpp>#include <boost/test/unit_test.hpp>#include "detail/closable.hpp"#include "detail/constants.hpp"#include "detail/filters.hpp"#include "detail/operation_sequence.hpp"#include "detail/sequence.hpp"#include "detail/temp_file.hpp"#include "detail/verification.hpp"using namespace std;using namespace boost::iostreams;using namespace boost::iostreams::test;using boost::unit_test::test_suite;namespace io = boost::iostreams;const char pad_char = '\n';const int small_padding = 50;const int large_padding = default_device_buffer_size + 50;void write_padding(std::ofstream& out, int len){ for (int z = 0; z < len; ++z) out.put(pad_char);}struct restricted_test_file : public temp_file { restricted_test_file(int padding, bool half_open = false) { BOOST_IOS::openmode mode = BOOST_IOS::out | BOOST_IOS::binary; ::std::ofstream f(name().c_str(), mode); write_padding(f, padding); const char* buf = narrow_data(); for (int z = 0; z < data_reps; ++z) f.write(buf, data_length()); if (!half_open) write_padding(f, padding); }};struct restricted_test_sequence : public std::vector<char> { restricted_test_sequence(int padding, bool half_open = false) { for (int z = 0; z < padding; ++z) push_back(pad_char); const char* buf = narrow_data(); for (int w = 0; w < data_reps; ++w) insert(end(), buf, buf + data_length()); if (!half_open) for (int x = 0; x < padding; ++x) push_back(pad_char); }};struct restricted_uppercase_file : public temp_file { restricted_uppercase_file(int padding, bool half_open = false) { BOOST_IOS::openmode mode = BOOST_IOS::out | BOOST_IOS::binary; ::std::ofstream f(name().c_str(), mode); write_padding(f, padding); const char* buf = narrow_data(); for (int z = 0; z < data_reps; ++z) for (int w = 0; w < data_length(); ++w) f.put((char) std::toupper(buf[w])); if (!half_open) write_padding(f, padding); }};struct restricted_lowercase_file : public temp_file { restricted_lowercase_file(int padding, bool half_open = false) { BOOST_IOS::openmode mode = BOOST_IOS::out | BOOST_IOS::binary; ::std::ofstream f(name().c_str(), mode); write_padding(f, padding); const char* buf = narrow_data(); for (int z = 0; z < data_reps; ++z) for (int w = 0; w < data_length(); ++w) f.put((char) std::tolower(buf[w])); if (!half_open) write_padding(f, padding); }};// Can't have a restricted view of a non-seekble output filter.struct tolower_seekable_filter : public seekable_filter { typedef char char_type; struct category : output_seekable, filter_tag { }; template<typename Sink> bool put(Sink& s, char c) { return boost::iostreams::put(s, (char) std::tolower(c)); } template<typename Sink> std::streampos seek(Sink& s, stream_offset off, BOOST_IOS::seekdir way) { return boost::iostreams::seek(s, off, way); }};void read_device(){ { restricted_test_file src1(small_padding); test_file src2; stream_offset off = small_padding, len = data_reps * data_length(); filtering_istream first( BOOST_RESTRICT(file_source(src1.name(), in_mode), off, len)); ifstream second(src2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from restriction<Device> with small padding" ); } { restricted_test_file src1(large_padding); test_file src2; stream_offset off = large_padding, len = data_reps * data_length(); filtering_istream first( BOOST_RESTRICT(file_source(src1.name(), in_mode), off, len)); ifstream second(src2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from restriction<Device> with large padding" ); } { restricted_test_file src1(small_padding, true); test_file src2; stream_offset off = small_padding; filtering_istream first( BOOST_RESTRICT(file_source(src1.name(), in_mode), off)); ifstream second(src2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from half-open restriction<Device> " "with small padding" ); } { restricted_test_file src1(large_padding, true); test_file src2; stream_offset off = large_padding; filtering_istream first( BOOST_RESTRICT(file_source(src1.name(), in_mode), off)); ifstream second(src2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from half-open restriction<Device> " "with large padding" ); }}void read_direct_device(){ { test_sequence<char> first; restricted_test_sequence src(small_padding); array_source array_src(&src[0], &src[0] + src.size()); stream_offset off = small_padding, len = data_reps * data_length(); filtering_istream second(BOOST_RESTRICT(array_src, off, len)); BOOST_CHECK_MESSAGE( compare_container_and_stream(first, second), "failed reading from restriction<Direct>" ); } { test_sequence<char> first; restricted_test_sequence src(small_padding, true); array_source array_src(&src[0], &src[0] + src.size()); stream_offset off = small_padding; filtering_istream second(BOOST_RESTRICT(array_src, off)); BOOST_CHECK_MESSAGE( compare_container_and_stream(first, second), "failed reading from half-open restriction<Direct>" ); }}void read_filter(){ { restricted_test_file src1(small_padding); uppercase_file src2; stream_offset off = small_padding, len = data_reps * data_length(); filtering_istream first; first.push(BOOST_RESTRICT(toupper_filter(), off, len)); first.push(file_source(src1.name(), in_mode)); ifstream second(src2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from restriction<Filter> with small padding" ); } { restricted_test_file src1(large_padding); uppercase_file src2; stream_offset off = large_padding, len = data_reps * data_length(); filtering_istream first; first.push(BOOST_RESTRICT(toupper_filter(), off, len)); first.push(file_source(src1.name(), in_mode)); ifstream second(src2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from restriction<Filter> with large padding" ); } { restricted_test_file src1(small_padding, true); uppercase_file src2; stream_offset off = small_padding; filtering_istream first; first.push(BOOST_RESTRICT(toupper_filter(), off)); first.push(file_source(src1.name(), in_mode)); ifstream second(src2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from half-open restriction<Filter> " "with small padding" ); } { restricted_test_file src1(large_padding, true); uppercase_file src2; stream_offset off = large_padding; filtering_istream first; first.push(BOOST_RESTRICT(toupper_filter(), off)); first.push(file_source(src1.name(), in_mode)); ifstream second(src2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed reading from half-open restriction<Filter> " "with large padding" ); }}void write_device() { { restricted_uppercase_file dest1(small_padding); restricted_test_file dest2(small_padding); stream_offset off = small_padding, len = data_reps * data_length(); filtering_ostream out( BOOST_RESTRICT(file(dest1.name(), BOOST_IOS::binary), off, len)); write_data_in_chunks(out); out.reset(); ifstream first(dest1.name().c_str(), in_mode); ifstream second(dest2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed writing to restriction<Device> with small padding" ); } { restricted_uppercase_file dest1(large_padding); restricted_test_file dest2(large_padding); stream_offset off = large_padding, len = data_reps * data_length(); filtering_ostream out (BOOST_RESTRICT(file(dest1.name(), BOOST_IOS::binary), off, len)); write_data_in_chunks(out); out.reset(); ifstream first(dest1.name().c_str(), in_mode); ifstream second(dest2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed writing to restriction<Device> with large padding" ); } { restricted_uppercase_file dest1(small_padding, true); restricted_test_file dest2(small_padding, true); stream_offset off = small_padding; filtering_ostream out (BOOST_RESTRICT(file(dest1.name(), BOOST_IOS::binary), off)); write_data_in_chunks(out); out.reset(); ifstream first(dest1.name().c_str(), in_mode); ifstream second(dest2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed writing to half-open restriction<Device> " "with small padding" ); } { restricted_uppercase_file dest1(large_padding, true); restricted_test_file dest2(large_padding, true); stream_offset off = large_padding; filtering_ostream out (BOOST_RESTRICT(file(dest1.name(), BOOST_IOS::binary), off)); write_data_in_chunks(out); out.reset(); ifstream first(dest1.name().c_str(), in_mode); ifstream second(dest2.name().c_str(), in_mode); BOOST_CHECK_MESSAGE( compare_streams_in_chunks(first, second), "failed writing to half-open restriction<Device> "
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?