* Finished adding features to TextStream

* Finished Documentation of TextStream
This commit is contained in:
Antidote 2013-01-27 12:13:09 -08:00
parent f644c7d1a3
commit 2e53be3baa
4 changed files with 160 additions and 19 deletions

View File

@ -19,6 +19,7 @@
#include <string>
/*! \class BinaryReader
* \brief A Stream class for reading binary data
*
* A Class for reading binary data from a file or memory stream,
* all work is done using a memory buffer, and not read directly from the disk

View File

@ -19,6 +19,7 @@
#include <string>
/*! \class BinaryWriter
* \brief A Stream class for writing binary data
*
* A Class for writing binary data to a file or memory stream,
* all work is done using a memory buffer, and not written directly to the disk

View File

@ -1,34 +1,132 @@
#ifndef __FILESTREAM_HPP__
#define __FILESTREAM_HPP__
#ifndef __TEXTSTREAM_HPP__
#define __TEXTSTREAM_HPP__
#include "Stream.hpp"
#include <string>
#include <vector>
// TODO (Phil#1#): Need to actually use AccessMode
/*! \class TextStream
* \brief A Class for reading or writing Text data.
*
* TextStream is a class for reading/writing TextData.<br />
* It is currently incomplete, but usable, so use with caution.<br/>
* Since it's incomplete it may not behave exactly as expected.
*/
class TextStream : public Stream
{
public:
enum FileMode { Open, Create, OpenOrCreate = Open|Create, Truncate, Append };
enum AccessMode { ReadOnly, WriteOnly, ReadWrite };
TextStream(const std::string& filename, FileMode fileMode = Open, AccessMode accessMode = ReadWrite);
public:
/*! \enum TextMode
* \brief Specifies how the file is opened.
*/
enum TextMode
{
Open, //!< The file is opened if it exists.
Create, //!< Create the file if it does not exist.
OpenOrCreate = Open|Create, //!< If the file does not exist when opening the file it is created
Truncate, //!< All the data currently that is in the file is erased.
Append //!< After opening the file the current line is set to the end of the buffer
};
void save(const std::string& filename = "");
std::string readLine();
void writeLine(const std::string& str);
/*! \enum AccessMode
* \brief Specifies how the Stream can be interacted with.
*/
enum AccessMode
{
ReadOnly, //!< The Stream can only be read from.
WriteOnly,//!< The Stream can only be written to.
ReadWrite //!< The Stream can be read from or written to.
};
/*! \brief This constructor opens the file and loads all the lines. */
TextStream(const std::string& filename, TextMode fileMode = Open, AccessMode accessMode = ReadWrite);
/*! \brief Creates a new buffer and saves all lines to the specified file.
* \param filename The file, including path to save to.
*/
void save(const std::string& filename = "");
/*! \brief Reads the line at the current address.
*
* \return std::string The line read.
*/
std::string readLine();
/*! \brief Writes a line to the buffer
*
* \param str The string to write.
*/
void writeLine(const std::string& str);
/*! \brief Reads a given amount of lines relative to the current address
*
* \param numLines The amount of lines to read.
* \return std::vector<std::string> The lines read.
*/
std::vector<std::string> readLines(Uint32 numLines);
void writeLines(std::vector<std::string> lines);
/*! \brief Reads a given list of lines relative to the current address
*
* \param lines The lines to write.
*/
void writeLines(std::vector<std::string> lines);
/*! \brief Reads all the lines in the current buffer.
*
* \return The lines read.
*/
std::vector<std::string> readAllLines();
std::string readLineAt(Uint32 line);
/*! \brief Reads a line at the given address.
*
* \param line The line to read.
* \return std::string The lines read.
*/
std::string readLineAt(Uint32 line);
void setCurrentLine(Uint32 line);
Uint32 currentLine() const;
/*! \brief Sets the current line in the Stream.
*
* \param line The line to seek to.
*/
void setCurrentLine(Uint32 line);
/*! \brief Returns the current line in the stream.
*
* \return Uint32 The current line in the stream.
*/
Uint32 currentLine() const;
/*! \brief Sets the AccessMode of the Stream.
*
* \param mode The mode to set.
*/
void setAccessMode(AccessMode mode);
/*! \brief Returns the AccessMode of the Stream.
*
* \return AccessModeThe mode to set.
*/
AccessMode accessMode() const;
/*! \brief Sets the Textmode of the Stream.
*
* \param mode The mode to set.
*/
void setTextMode(TextMode mode);
/*! \brief Returns the TextMode of the Stream.
*
* \return TextMode The mode to set.
*/
TextMode textMode() const;
bool isOpenForReading() const;
bool isOpenForWriting() const;
private:
void loadLines();
std::string m_filename;
FileMode m_filemode;
TextMode m_textmode;
AccessMode m_accessmode;
std::vector<std::string> m_lines;

View File

@ -4,9 +4,9 @@
#include "InvalidOperationException.hpp"
#include "IOException.hpp"
TextStream::TextStream(const std::string& filename, FileMode fileMode, AccessMode accessMode) :
TextStream::TextStream(const std::string& filename, TextMode fileMode, AccessMode accessMode) :
m_filename(filename),
m_filemode(fileMode),
m_textmode(fileMode),
m_accessmode(accessMode),
m_currentLine(0)
{
@ -82,16 +82,20 @@ void TextStream::save(const std::string& filename)
std::string TextStream::readLine()
{
if (m_accessmode != ReadOnly || m_accessmode != ReadWrite)
throw InvalidOperationException("Stream not open for reading");
if (m_currentLine > m_lines.size())
throw IOException("Position past stream bounds");
return m_lines[m_currentLine++];
}
void TextStream::writeLine(const std::string& str)
{
if (m_currentLine > m_lines.size() && !m_autoResize)
throw IOException("Position past stream bounds");
if (m_accessmode != WriteOnly || m_accessmode != ReadWrite)
throw InvalidOperationException("Stream not open for reading");
else if (m_currentLine > m_lines.size())
{
m_lines.push_back(str);
@ -104,12 +108,21 @@ void TextStream::writeLine(const std::string& str)
void TextStream::writeLines(std::vector<std::string> strings)
{
if (m_accessmode != WriteOnly || m_accessmode != ReadWrite)
throw InvalidOperationException("Stream not open for reading");
for (std::string s: strings)
writeLine(s);
}
std::vector<std::string> TextStream::readLines(Uint32 numLines)
{
if (m_accessmode != ReadOnly || m_accessmode != ReadWrite)
throw InvalidOperationException("Stream not open for reading");
if (numLines > m_lines.size())
throw InvalidOperationException("numLines exceeds the number of stored strings.");
Uint32 currentLine = m_currentLine;
std::vector<std::string> ret;
@ -121,14 +134,21 @@ std::vector<std::string> TextStream::readLines(Uint32 numLines)
std::string TextStream::readLineAt(Uint32 line)
{
if (m_accessmode != ReadOnly || m_accessmode != ReadWrite)
throw InvalidOperationException("Stream not open for reading");
if (line <= 0)
throw InvalidOperationException("A line cannot be zero indexed");
if ((line - 1) >= m_lines.size())
throw IOException("Line index out of range");
return m_lines[line - 1];
}
std::vector<std::string> TextStream::readAllLines()
{
if (m_accessmode != ReadOnly || m_accessmode != ReadWrite)
throw InvalidOperationException("Stream not open for reading");
return m_lines;
}
@ -144,6 +164,27 @@ Uint32 TextStream::currentLine() const
return m_currentLine + 1;
}
void TextStream::setAccessMode(AccessMode mode)
{
m_accessmode = mode;
}
TextStream::AccessMode TextStream::accessMode() const
{
return m_accessmode;
}
void TextStream::setTextMode(TextMode mode)
{
m_textmode = mode;
}
TextStream::TextMode TextStream::textMode() const
{
return m_textmode;
}
// PRIVATE FUNCTIONS
void TextStream::loadLines()
{
while (!atEnd())