blob: 845582d4d86c34923195d4571c75e9f9c2e9d6d6 [file] [log] [blame]
/*
*
* 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));
}