/*
 *
 * 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)
 *
 * This file implements the fileview class
 */

#include "fileview.hpp"
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
#include <istream>
#include <stdexcept>

struct fileview::implementation
{
   std::vector<char> m_data;
};


// construct:
fileview::fileview()
{
   pimpl.reset(new implementation());
}

fileview::fileview(const boost::filesystem::path& p)
{
   pimpl.reset(new implementation());
   open(p);
}

fileview::~fileview()
{
}

fileview::fileview(const fileview& that)
{
}

fileview& fileview::operator=(const fileview& that)
{
   pimpl = that.pimpl;
   return *this;
}

void fileview::close()
{
   cow();
   pimpl->m_data.clear();
}

void fileview::open(const boost::filesystem::path& p)
{
   cow();
   std::ifstream is(p.native_file_string().c_str());
   if(!is)
   {
      std::string msg("Bad file name: ");
      msg += p.native_file_string();
      std::runtime_error e(msg);
      boost::throw_exception(e);
   }
   std::istreambuf_iterator<char> in(is);
   std::istreambuf_iterator<char> end;
   std::copy(in, end, std::back_inserter(pimpl->m_data));
}

// iterators:
fileview::const_iterator         fileview::begin() const
{
   return pimpl->m_data.size() ? &(pimpl->m_data[0]) : 0;
}

fileview::const_iterator         fileview::end() const
{
   return begin() + pimpl->m_data.size();
}

#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
fileview::const_reverse_iterator fileview::rbegin() const
{
   return const_reverse_iterator(end());
}

fileview::const_reverse_iterator fileview::rend() const
{
   return const_reverse_iterator(begin());
}
#endif

// capacity:
fileview::size_type fileview::size() const
{
   return pimpl->m_data.size();
}

fileview::size_type fileview::max_size() const
{
   return pimpl->m_data.max_size();
}

bool      fileview::empty() const
{
   return pimpl->m_data.empty();
}

// element access:
fileview::const_reference fileview::operator[](fileview::size_type n) const
{
   return pimpl->m_data[n];
}

fileview::const_reference fileview::at(size_type n) const
{
   return pimpl->m_data.at(n);
}

fileview::const_reference fileview::front() const
{
   return pimpl->m_data.front();
}

fileview::const_reference fileview::back() const
{
   return pimpl->m_data.back();
}

void fileview::swap(fileview& that)
{
   pimpl.swap(that.pimpl);
}

void fileview::cow()
{
   if(!pimpl.unique())
      pimpl.reset(new implementation(*pimpl));
}
