|
Boost-Commit : |
From: technews_at_[hidden]
Date: 2007-12-23 21:20:17
Author: turkanis
Date: 2007-12-23 21:20:17 EST (Sun, 23 Dec 2007)
New Revision: 42268
URL: http://svn.boost.org/trac/boost/changeset/42268
Log:
fixed #823 and added a test case
Text files modified:
branches/iostreams_dev/boost/iostreams/device/file_descriptor.hpp | 14 +++++
branches/iostreams_dev/libs/iostreams/test/detail/verification.hpp | 91 ++++++++++++++++++++++++++++++++++++++-
branches/iostreams_dev/libs/iostreams/test/file_descriptor_test.cpp | 24 ++++++++++
3 files changed, 123 insertions(+), 6 deletions(-)
Modified: branches/iostreams_dev/boost/iostreams/device/file_descriptor.hpp
==============================================================================
--- branches/iostreams_dev/boost/iostreams/device/file_descriptor.hpp (original)
+++ branches/iostreams_dev/boost/iostreams/device/file_descriptor.hpp 2007-12-23 21:20:17 EST (Sun, 23 Dec 2007)
@@ -102,8 +102,13 @@
typedef void* handle_type;
#endif
typedef char char_type;
- struct category : public source_tag, closable_tag { };
+ struct category
+ : input_seekable,
+ device_tag,
+ closable_tag
+ { };
using file_descriptor::read;
+ using file_descriptor::seek;
using file_descriptor::open;
using file_descriptor::is_open;
using file_descriptor::close;
@@ -128,8 +133,13 @@
typedef void* handle_type;
#endif
typedef char char_type;
- struct category : public sink_tag, closable_tag { };
+ struct category
+ : output_seekable,
+ device_tag,
+ closable_tag
+ { };
using file_descriptor::write;
+ using file_descriptor::seek;
using file_descriptor::open;
using file_descriptor::is_open;
using file_descriptor::close;
Modified: branches/iostreams_dev/libs/iostreams/test/detail/verification.hpp
==============================================================================
--- branches/iostreams_dev/libs/iostreams/test/detail/verification.hpp (original)
+++ branches/iostreams_dev/libs/iostreams/test/detail/verification.hpp 2007-12-23 21:20:17 EST (Sun, 23 Dec 2007)
@@ -8,6 +8,7 @@
#ifndef BOOST_IOSTREAMS_TEST_VERIFICATION_HPP_INCLUDED
#define BOOST_IOSTREAMS_TEST_VERIFICATION_HPP_INCLUDED
+#include <iostream>
#include <exception>
#include <string>
#include <string.h>
@@ -137,7 +138,7 @@
// Test seeking with ios::beg
std::streamoff off = 0;
io.seekp(0, BOOST_IOS::beg);
- for (i = 0; i < data_reps; ++i, off+= chunk_size) {
+ for (i = 0; i < data_reps; ++i, off += chunk_size) {
int j;
for (j = 0; j < chunk_size; ++j)
io.put(narrow_data()[j]);
@@ -173,7 +174,7 @@
{
int i; // old 'for' scope workaround.
- // Test seeking with ios::cu
+ // Test seeking with ios::cur
for (i = 0; i < data_reps; ++i) {
io.write(narrow_data(), chunk_size);
io.seekp(-chunk_size, BOOST_IOS::cur);
@@ -188,7 +189,7 @@
// Test seeking with ios::beg
std::streamoff off = 0;
io.seekp(0, BOOST_IOS::beg);
- for (i = 0; i < data_reps; ++i) {
+ for (i = 0; i < data_reps; ++i, off += chunk_size) {
io.write(narrow_data(), chunk_size);
io.seekp(off, BOOST_IOS::beg);
char buf[chunk_size];
@@ -203,7 +204,7 @@
io.seekp(0, BOOST_IOS::end);
off = io.tellp();
io.seekp(-off, BOOST_IOS::end);
- for (i = 0; i < data_reps; ++i) {
+ for (i = 0; i < data_reps; ++i, off -= chunk_size) {
io.write(narrow_data(), chunk_size);
io.seekp(-off, BOOST_IOS::end);
char buf[chunk_size];
@@ -216,6 +217,88 @@
return true;
}
+bool test_input_seekable(std::istream& io)
+{
+ int i; // old 'for' scope workaround.
+
+ // Test seeking with ios::cur
+ for (i = 0; i < data_reps; ++i) {
+ for (int j = 0; j < chunk_size; ++j)
+ if (io.get() != narrow_data()[j])
+ return false;
+ io.seekg(-chunk_size, BOOST_IOS::cur);
+ char buf[chunk_size];
+ io.read(buf, chunk_size);
+ if (strncmp(buf, narrow_data(), chunk_size) != 0)
+ return false;
+ }
+
+ // Test seeking with ios::beg
+ std::streamoff off = 0;
+ io.seekg(0, BOOST_IOS::beg);
+ for (i = 0; i < data_reps; ++i, off += chunk_size) {
+ for (int j = 0; j < chunk_size; ++j)
+ if (io.get() != narrow_data()[j])
+ return false;
+ io.seekg(off, BOOST_IOS::beg);
+ char buf[chunk_size];
+ io.read(buf, chunk_size);
+ if (strncmp(buf, narrow_data(), chunk_size) != 0)
+ return false;
+ }
+
+ // Test seeking with ios::end
+ io.seekg(0, BOOST_IOS::end);
+ off = io.tellg();
+ io.seekg(-off, BOOST_IOS::end);
+ for (i = 0; i < data_reps; ++i, off -= chunk_size) {
+ for (int j = 0; j < chunk_size; ++j)
+ if (io.get() != narrow_data()[j])
+ return false;
+ io.seekg(-off, BOOST_IOS::end);
+ char buf[chunk_size];
+ io.read(buf, chunk_size);
+ if (strncmp(buf, narrow_data(), chunk_size) != 0)
+ return false;
+ }
+ return true;
+}
+
+bool test_output_seekable(std::ostream& io)
+{
+ int i; // old 'for' scope workaround.
+
+ // Test seeking with ios::cur
+ for (i = 0; i < data_reps; ++i) {
+ for (int j = 0; j < chunk_size; ++j)
+ io.put(narrow_data()[j]);
+ io.seekp(-chunk_size, BOOST_IOS::cur);
+ io.write(narrow_data(), chunk_size);
+ }
+
+ // Test seeking with ios::beg
+ std::streamoff off = 0;
+ io.seekp(0, BOOST_IOS::beg);
+ for (i = 0; i < data_reps; ++i, off += chunk_size) {
+ for (int j = 0; j < chunk_size; ++j)
+ io.put(narrow_data()[j]);
+ io.seekp(off, BOOST_IOS::beg);
+ io.write(narrow_data(), chunk_size);
+ }
+
+ // Test seeking with ios::end
+ io.seekp(0, BOOST_IOS::end);
+ off = io.tellp();
+ io.seekp(-off, BOOST_IOS::end);
+ for (i = 0; i < data_reps; ++i, off -= chunk_size) {
+ for (int j = 0; j < chunk_size; ++j)
+ io.put(narrow_data()[j]);
+ io.seekp(-off, BOOST_IOS::end);
+ io.write(narrow_data(), chunk_size);
+ }
+ return true;
+}
+
} } } // End namespaces test, iostreams, boost.
#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
Modified: branches/iostreams_dev/libs/iostreams/test/file_descriptor_test.cpp
==============================================================================
--- branches/iostreams_dev/libs/iostreams/test/file_descriptor_test.cpp (original)
+++ branches/iostreams_dev/libs/iostreams/test/file_descriptor_test.cpp 2007-12-23 21:20:17 EST (Sun, 23 Dec 2007)
@@ -142,6 +142,30 @@
BOOST_CHECK(!file.is_open());
}
+ //--Test seeking with file_descriptor_source and file_descriptor_sink-----//
+
+ {
+ file_descriptor_sink sink(test1.name());
+ fdostream out(sink);
+ BOOST_CHECK(out->is_open());
+ BOOST_CHECK_MESSAGE(
+ test_output_seekable(out),
+ "failed seeking within a file_descriptor_sink"
+ );
+ out->close();
+ BOOST_CHECK(!out->is_open());
+
+ file_descriptor_source source(test1.name());
+ fdistream in(source);
+ BOOST_CHECK(in->is_open());
+ BOOST_CHECK_MESSAGE(
+ test_input_seekable(in),
+ "failed seeking within a file_descriptor_source"
+ );
+ in->close();
+ BOOST_CHECK(!in->is_open());
+ }
+
//--------------Test file_descriptor--------------------------------------//
{
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk