1 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) 2 // (C) Copyright 2004-2007 Jonathan Turkanis 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) 5 6 // See http://www.boost.org/libs/iostreams for documentation. 7 8 #ifndef BOOST_IOSTREAMS_TEST_FILES_HPP_INCLUDED 9 #define BOOST_IOSTREAMS_TEST_FILES_HPP_INCLUDED 10 11 #include <cctype> // toupper, tolower 12 #include <cstdio> // tmpname, TMP_MAX, remove 13 #include <cstdlib> // rand, toupper, tolower (VC6) 14 #include <fstream> 15 #include <string> 16 #include <boost/filesystem/operations.hpp> 17 #include "./constants.hpp" 18 19 #ifdef BOOST_NO_STDC_NAMESPACE 20 # undef toupper 21 # undef tolower 22 # undef remove 23 # undef rand 24 namespace std { 25 using ::toupper; using ::tolower; using ::remove; using ::rand; 26 } 27 #endif 28 29 namespace boost { namespace iostreams { namespace test { 30 31 // Represents a temp file, deleted upon destruction. 32 class temp_file { 33 public: 34 35 // Constructs a temp file which does not initially exist. temp_file()36 temp_file() { set_name(); } ~temp_file()37 ~temp_file() { (void)std::remove(name_.c_str()); } name() const38 const ::std::string name() const { return name_; } operator const::std::string() const39 operator const ::std::string() const { return name_; } 40 private: set_name()41 void set_name() { 42 name_ = boost::filesystem::unique_path().string(); 43 } 44 45 ::std::string name_; 46 }; 47 48 struct test_file : public temp_file { test_fileboost::iostreams::test::test_file49 test_file() 50 { 51 BOOST_IOS::openmode mode = 52 BOOST_IOS::out | BOOST_IOS::binary; 53 ::std::ofstream f(name().c_str(), mode); 54 const ::std::string n(name()); 55 const char* buf = narrow_data(); 56 for (int z = 0; z < data_reps; ++z) 57 f.write(buf, data_length()); 58 } 59 }; 60 61 62 struct uppercase_file : public temp_file { uppercase_fileboost::iostreams::test::uppercase_file63 uppercase_file() 64 { 65 BOOST_IOS::openmode mode = 66 BOOST_IOS::out | BOOST_IOS::binary; 67 ::std::ofstream f(name().c_str(), mode); 68 const char* buf = narrow_data(); 69 for (int z = 0; z < data_reps; ++z) 70 for (int w = 0; w < data_length(); ++w) 71 f.put((char) std::toupper(buf[w])); 72 } 73 }; 74 75 struct lowercase_file : public temp_file { lowercase_fileboost::iostreams::test::lowercase_file76 lowercase_file() 77 { 78 BOOST_IOS::openmode mode = 79 BOOST_IOS::out | BOOST_IOS::binary; 80 ::std::ofstream f(name().c_str(), mode); 81 const char* buf = narrow_data(); 82 for (int z = 0; z < data_reps; ++z) 83 for (int w = 0; w < data_length(); ++w) 84 f.put((char) std::tolower(buf[w])); 85 } 86 }; 87 88 //----------------------------------------------------------------------------// 89 90 } } } // End namespaces test, iostreams, boost. 91 92 #endif // #ifndef BOOST_IOSTREAMS_TEST_FILES_HPP_INCLUDED 93