/*
 *
 * Copyright (c) 2003 Dr John Maddock
 * 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/shared_ptr.hpp>
#include <boost/filesystem/path.hpp>

class fileview
{
public:
   // types:
   typedef const char&                               reference;
   typedef reference                                 const_reference;
   typedef const char*                               iterator;       // See _lib.container.requirements_
   typedef iterator                                  const_iterator; // See _lib.container.requirements_
   typedef std::size_t                               size_type;
   typedef std::ptrdiff_t                            difference_type;
   typedef char                                      value_type;
   typedef const char*                               pointer;
   typedef pointer                                   const_pointer;
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
   typedef std::reverse_iterator<iterator>           reverse_iterator;
   typedef std::reverse_iterator<const_iterator>     const_reverse_iterator;
#endif

   // construct:
   fileview();
   fileview(const boost::filesystem::path& p);
   ~fileview();
   fileview(const fileview& that);
   fileview& operator=(const fileview& that);
   void close();
   void open(const boost::filesystem::path& p);

   // iterators:
   const_iterator         begin() const;
   const_iterator         end() const;
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
   const_reverse_iterator rbegin() const;
   const_reverse_iterator rend() const;
#endif

   // capacity:
   size_type size() const;
   size_type max_size() const;
   bool      empty() const;

   // element access:
   const_reference operator[](size_type n) const;
   const_reference at(size_type n) const;
   const_reference front() const;
   const_reference back() const;
   void            swap(fileview& that);

private:
   void cow();
   struct implementation;
   boost::shared_ptr<implementation> pimpl;
};