file_iterator_tests.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 187 行
CPP
187 行
/*============================================================================= Copyright (c) 2003 Giovanni Bajo http://spirit.sourceforge.net/ Use, modification and distribution is subject to 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)=============================================================================*/#include <boost/detail/lightweight_test.hpp>#include <cstdio>#include <iostream>#include <boost/concept_check.hpp>#include <boost/spirit/include/classic_file_iterator.hpp>// This checks for a namespace related problem in VC8// The problem can be avoided by not using "using namespace std;" in the// Spirit headersnamespace vc8_bug_1 { struct plus {}; }namespace vc8_bug_2 { using namespace vc8_bug_1; struct test : plus {}; }using namespace std;using namespace BOOST_SPIRIT_CLASSIC_NS;namespace {static const char* TMP_FILE = "file_iter.tmp";bool CreateTempFile(void){ FILE* f = fopen(TMP_FILE, "wb"); if (!f) return false; for (int i=0;i<256;i++) { unsigned char ci = (unsigned char)i; if (fwrite(&ci,1,1,f) == 0) { fclose(f); return false; } } fclose(f); return true;}template <typename ITER>void RunTest(void){ // Check constructor opening a file ITER a(TMP_FILE); BOOST_TEST(!!a); // Assert dereference (twice: derefence // must not move the iterator) BOOST_TEST(*a == 0); BOOST_TEST(*a == 0); // Check random access BOOST_TEST(a[123] == 123); // Check copy constructor and operator== ITER c(a); BOOST_TEST(c == a); BOOST_TEST(!(c != a)); // Check assignment operator ITER d; d = a; BOOST_TEST(d == a); BOOST_TEST(!(d != a)); // Check make_end() ITER b(a.make_end()); BOOST_TEST(!!b); BOOST_TEST(a != b); BOOST_TEST(a+256 == b); BOOST_TEST(a == b-256); // Check copy constructor on non-trivial position BOOST_TEST(*ITER(a+67) == 67); // Check increment ++a; ++a; a++; a++; BOOST_TEST(*a == 4); BOOST_TEST(a == c+4); // Check decrement --a; --a; a--; a--; BOOST_TEST(*a == 0); BOOST_TEST(a == c); // Check end iterator increment/decrement --b; b--; BOOST_TEST(*b == 254); BOOST_TEST(a+254 == b); ++b; b++; BOOST_TEST(a+256 == b); // Check order a += 128; BOOST_TEST(c < a); BOOST_TEST(a < b); BOOST_TEST(a > c); BOOST_TEST(b > a); // Check assignment a = b; BOOST_TEST(a == b); a = c; BOOST_TEST(a == c); // Check weak order BOOST_TEST(a <= c); BOOST_TEST(a >= c); BOOST_TEST(a <= b); BOOST_TEST(!(a >= b)); // Check increment through end a += 255; BOOST_TEST(a != b); ++a; BOOST_TEST(a == b); ++a; BOOST_TEST(a != b);}///////////////////////////////////////////////////////////////////////////////}typedef unsigned char character_t;typedef file_iterator<character_t, fileiter_impl::std_file_iterator<character_t> > iter;BOOST_CLASS_REQUIRE(iter, boost, RandomAccessIteratorConcept);#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS typedef file_iterator<character_t, fileiter_impl::mmap_file_iterator<character_t> > iterwin; BOOST_CLASS_REQUIRE(iterwin, boost, RandomAccessIteratorConcept);#endif#ifdef BOOST_SPIRIT_FILEITERATOR_POSIX typedef file_iterator<character_t, fileiter_impl::mmap_file_iterator<character_t> > iterposix; BOOST_CLASS_REQUIRE(iterposix, boost, RandomAccessIteratorConcept);#endifint main(void){ if (!CreateTempFile()) { cerr << "ERROR: Cannot create temporary file file_iter.tmp" << endl; return 2; } cerr << "Testing standard iterator" << endl; RunTest<iter>();#ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS cerr << "Testing Windows iterator" << endl; RunTest<iterwin>();#endif#ifdef BOOST_SPIRIT_FILEITERATOR_POSIX cerr << "Testing POSIX iterator" << endl; RunTest<iterposix>();#endif // Check if the file handles were closed correctly BOOST_TEST(remove(TMP_FILE) == 0); return boost::report_errors();}#ifdef BOOST_NO_EXCEPTIONSnamespace boost { void throw_exception(std::exception const& e) { BOOST_EROR("throw_exception"); }}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?