file_iterator.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 239 行
HPP
239 行
/*============================================================================= Copyright (c) 2003 Giovanni Bajo Copyright (c) 2003 Thomas Witt Copyright (c) 2003 Hartmut Kaiser 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)=============================================================================*//////////////////////////////////////////////////////////////////////////////////// File Iterator structure//// The new structure is designed on layers. The top class (used by the user)// is file_iterator, which implements a full random access iterator through// the file, and some specific member functions (constructor that opens// the file, make_end() to generate the end iterator, operator bool to check// if the file was opened correctly).//// file_iterator implements the random access iterator interface by the means// of boost::iterator_adaptor, that is inhering an object created with it.// iterator_adaptor gets a low-level file iterator implementation (with just// a few member functions) and a policy (that basically describes to it how// the low-level file iterator interface is). The advantage is that// with boost::iterator_adaptor only 5 functions are needed to implement// a fully conformant random access iterator, instead of dozens of functions// and operators.//// There are two low-level file iterators implemented in this module. The// first (std_file_iterator) uses cstdio stream functions (fopen/fread), which// support full buffering, and is available everywhere (it's standard C++).// The second (mmap_file_iterator) is currently available only on Windows// platforms, and uses memory mapped files, which gives a decent speed boost.///////////////////////////////////////////////////////////////////////////////////// TODO LIST://// - In the Win32 mmap iterator, we could check if keeping a handle to the// opened file is really required. If it's not, we can just store the file// length (for make_end()) and save performance. Notice that this should be// tested under different Windows versions, the behaviour might change.// - Add some error support (by the means of some exceptions) in case of// low-level I/O failure./////////////////////////////////////////////////////////////////////////////////#ifndef BOOST_SPIRIT_FILE_ITERATOR_HPP#define BOOST_SPIRIT_FILE_ITERATOR_HPP#include <string>#include <boost/config.hpp>#include <boost/iterator_adaptors.hpp>#include <boost/spirit/core/safe_bool.hpp>#if !defined(BOOST_SPIRIT_FILEITERATOR_STD)# if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) \ && !defined(BOOST_DISABLE_WIN32)# define BOOST_SPIRIT_FILEITERATOR_WINDOWS# elif defined(BOOST_HAS_UNISTD_H)extern "C"{# include <unistd.h>}# ifdef _POSIX_MAPPED_FILES# define BOOST_SPIRIT_FILEITERATOR_POSIX# endif // _POSIX_MAPPED_FILES# endif // BOOST_HAS_UNISTD_H# if !defined(BOOST_SPIRIT_FILEITERATOR_WINDOWS) && \ !defined(BOOST_SPIRIT_FILEITERATOR_POSIX)# define BOOST_SPIRIT_FILEITERATOR_STD# endif#endif // BOOST_SPIRIT_FILEITERATOR_STD///////////////////////////////////////////////////////////////////////////////namespace boost { namespace spirit {///////////////////////////////////////////////////////////////////////////////namespace fileiter_impl { // Forward declarations template <typename CharT = char> class std_file_iterator;#if !defined(BOOST_SPIRIT_FILEITERATOR_STD) template <typename CharT = char> class mmap_file_iterator;#endif///////////////////////////////////////////////////////////////////////////////} // namespace fileiter_impltemplate < typename CharT = char, typename BaseIterator =#ifndef BOOST_SPIRIT_FILEITERATOR_WINDOWS fileiter_impl::std_file_iterator<CharT>#else fileiter_impl::mmap_file_iterator<CharT>#endif> class file_iterator;///////////////////////////////////////////////////////////////////////////////namespace fileiter_impl { ///////////////////////////////////////////////////////////////////////// // // file_iter_generator // // Template meta-function to invoke boost::iterator_adaptor // NOTE: This cannot be moved into the implementation file because of // a bug of MSVC 7.0 and previous versions (base classes types are // looked up at compilation time, not instantion types, and // file_iterator would break). // /////////////////////////////////////////////////////////////////////////#if !defined(BOOST_ITERATOR_ADAPTORS_VERSION) || \ BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200#error "Please use at least Boost V1.31.0 while compiling the file_iterator class!"#else // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200 template <typename CharT, typename BaseIteratorT> struct file_iter_generator { public: typedef BaseIteratorT adapted_t; typedef typename adapted_t::value_type value_type; typedef boost::iterator_adaptor < file_iterator<CharT, BaseIteratorT>, adapted_t, value_type const, std::random_access_iterator_tag, boost::use_default, signed long > type; };#endif // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200///////////////////////////////////////////////////////////////////////////////} /* namespace impl *//////////////////////////////////////////////////////////////////////////////////// file_iterator//// Iterates through an opened file.//// The main iterator interface is implemented by the iterator_adaptors// library, which wraps a conforming iterator interface around the// impl::BaseIterator class. This class merely derives the iterator_adaptors// generated class to implement the custom constructors and make_end()// member function./////////////////////////////////////////////////////////////////////////////////template<typename CharT, typename BaseIteratorT>class file_iterator : public fileiter_impl::file_iter_generator<CharT, BaseIteratorT>::type, public safe_bool<file_iterator<CharT, BaseIteratorT> >{private: typedef typename fileiter_impl::file_iter_generator<CharT, BaseIteratorT>::type base_t; typedef typename fileiter_impl::file_iter_generator<CharT, BaseIteratorT>::adapted_t adapted_t;public: file_iterator() {} file_iterator(std::string fileName) : base_t(adapted_t(fileName)) {} file_iterator(const base_t& iter) : base_t(iter) {} inline file_iterator& operator=(const base_t& iter); file_iterator make_end(void); // operator bool. This borrows a trick from boost::shared_ptr to avoid // to interfere with arithmetic operations. bool operator_bool(void) const { return this->base(); }private: friend class ::boost::iterator_core_access; typename base_t::reference dereference() const { return this->base_reference().get_cur_char(); } void increment() { this->base_reference().next_char(); } void decrement() { this->base_reference().prev_char(); } void advance(typename base_t::difference_type n) { this->base_reference().advance(n); } template < typename OtherDerivedT, typename OtherIteratorT, typename V, typename C, typename R, typename D > typename base_t::difference_type distance_to( iterator_adaptor<OtherDerivedT, OtherIteratorT, V, C, R, D> const &x) const { return x.base().distance(this->base_reference()); }};///////////////////////////////////////////////////////////////////////////////}} /* namespace boost::spirit *////////////////////////////////////////////////////////////////////////////////#include "impl/file_iterator.ipp" /* implementation */#endif /* BOOST_SPIRIT_FILE_ITERATOR_HPP */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?