123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- /*=============================================================================
- 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 headers
- namespace 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);
- #endif
- int 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_EXCEPTIONS
- namespace boost {
- void throw_exception(std::exception const& e)
- {
- BOOST_EROR("throw_exception");
- }
- }
- #endif
|