// Description: Binary file
#ifndef PASTELSYS_BINARYFILE_H
#define PASTELSYS_BINARYFILE_H
#include "pastel/sys/mytypes.h"
#include <string>
#include <fstream>
namespace Pastel
{
    class FileNotFoundException
    {
    public:
        FileNotFoundException(
            const std::string& that)
            : message_(that)
        {
        }
        const std::string& what() const
        {
            return message_;
        }
    private:
        std::string message_;
    };
    class BinaryFile
    {
    public:
        BinaryFile();
        BinaryFile(const std::string& fileName,
            bool read, bool write);
        ~BinaryFile();
        void open(const std::string& fileName,
            bool read, bool write);
        void close();
        void setEndian(bool little);
        bool isOpen();
        bool isInEnd() const;
        BinaryFile& operator>>(int8& val);
        BinaryFile& operator>>(uint8& val);
        BinaryFile& operator>>(int16& val);
        BinaryFile& operator>>(uint16& val);
        BinaryFile& operator>>(int32& val);
        BinaryFile& operator>>(uint32& val);
        BinaryFile& operator>>(real32& val);
        BinaryFile& operator>>(real64& val);
        BinaryFile& operator<<(int8 val);
        BinaryFile& operator<<(uint8 val);
        BinaryFile& operator<<(int16 val);
        BinaryFile& operator<<(uint16 val);
        BinaryFile& operator<<(int32 val);
        BinaryFile& operator<<(uint32 val);
        BinaryFile& operator<<(real32 val);
        BinaryFile& operator<<(real64 val);
        BinaryFile& operator<<(const std::string& text);
        BinaryFile& operator<<(const char* nullString);
        BinaryFile& operator<<(void (*callBack)(BinaryFile&));
        void ignore(integer count);
        void flush();
        void write(const char* str, integer count);
        void read(char* str, integer count);
        void setOffset(integer offset);
        integer getOffset();
    private:
        BinaryFile(const BinaryFile&);
        BinaryFile& operator=(const BinaryFile&);
        std::fstream stream_;
        bool littleEndian_;
    };
    void binaryLittleEndian(BinaryFile& file);
    void binaryBigEndian(BinaryFile& file);
}
#include "pastel/sys/binaryfile/binaryfile.hpp"
#endif