// Copyright {Jagger Software Limited} 2003 #ifndef IO_FILE_ITERATOR_INCLUDED #define IO_FILE_ITERATOR_INCLUDED #include #include namespace io { class FILE_iterator // <> : public ::std::iterator<::std::random_access_iterator_tag, char> { public: // types typedef ::std::size_t size_type; typedef ::std::ptrdiff_t difference_type; public: // 'tors FILE_iterator(); explicit FILE_iterator(FILE *); // compiler generated copy c'tor ok // compiler generated non virtual d'tor ok public: // assignment // compiler generated copy assignment ok public: // primitive comparison int compare(const FILE_iterator &) const; public: // dereference class reference; reference operator*(); char operator*() const; public: // subscripting reference operator[](size_type); char operator[](size_type) const; reference operator[](difference_type); char operator[](difference_type) const; public: // movement FILE_iterator & operator+=(size_type); FILE_iterator & operator+=(difference_type); FILE_iterator & operator-=(size_type); FILE_iterator & operator-=(difference_type); FILE_iterator & operator++(); const FILE_iterator operator++(int); FILE_iterator & operator--(); const FILE_iterator operator--(int); difference_type operator-(const FILE_iterator &) const; private: // implementation bool is_end_sentinel() const; bool is_at_end() const; difference_type distance_to_start_of_stream() const; difference_type distance_to_end_of_stream() const; private: // validation void check_not_end_sentinel() const; void check_same_stream_as(const FILE_iterator &) const; private: // state FILE * stream; long current_position, end_position; }; // idiomatic comparisons bool operator==(const FILE_iterator &, const FILE_iterator &); bool operator!=(const FILE_iterator &, const FILE_iterator &); bool operator< (const FILE_iterator &, const FILE_iterator &); bool operator> (const FILE_iterator &, const FILE_iterator &); bool operator<=(const FILE_iterator &, const FILE_iterator &); bool operator>=(const FILE_iterator &, const FILE_iterator &); // idiomatic movement const FILE_iterator operator+(const FILE_iterator &, FILE_iterator::size_type); const FILE_iterator operator+(FILE_iterator::size_type, const FILE_iterator &); const FILE_iterator operator+(const FILE_iterator &, FILE_iterator::difference_type); const FILE_iterator operator+(FILE_iterator::difference_type, const FILE_iterator &); const FILE_iterator operator-(const FILE_iterator &, FILE_iterator::size_type); const FILE_iterator operator-(FILE_iterator::size_type, const FILE_iterator &); const FILE_iterator operator-(const FILE_iterator &, FILE_iterator::difference_type); const FILE_iterator operator-(FILE_iterator::difference_type, const FILE_iterator &); } namespace io { class FILE_iterator::reference { public: // 'tor reference(FILE *, long); // compiler generated copy c'tor ok // compiler generated non virtual d'tor ok // compiler generated copy assignment ok public: // dereference void operator=(char); operator char() const; private: // state FILE * stream; long position; }; } #endif //------------------------------------------------- // Example of use #if 0 #include "io/FILE_iterator.hpp" #include "ownership/array_deleter.hpp" #include "ownership/scoped.hpp" #include "ownership/fcloser.hpp" #include #include #include using namespace ::io; using namespace ::ownership; using namespace ::std; int main(int argc, char * argv[]) { scoped stream(fopen(argv[1], "rb")); const size_t file_size = file_size(stream.get()); scoped source(new char[file_size]); copy(FILE_iterator(stream.get()), end, source.get()); //... return 0; } #endif