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 + -
显示快捷键?