#ifndef INCLUDED_BOBCAT_MEMORYSTREAM_
#define INCLUDED_BOBCAT_MEMORYSTREAM_

#include <iosfwd>
#include <iostream>

#include <bobcat/memorybuf>

namespace FBB
{

struct MemoryStream: private MemoryBuf, public std::iostream
{
    using MemoryBuf::id;
    using MemoryBuf::info;
    using MemoryBuf::maxEnd; 
    using MemoryBuf::truncate; 
    using std::iostream::exceptions;
    
    MemoryStream();                                                     // 1

    MemoryStream(std::string const &bufSize, bool erase,                // 2
            std::ios::openmode openMode = std::ios::in | std::ios::out,
            size_t access = 0600);

    MemoryStream(std::string const &bufSize,                            // .f
            std::ios::openmode openMode = std::ios::in | std::ios::out,
            size_t access = 0600);

    MemoryStream(int id, bool erase,                                   // 3
            std::ios::openmode openMode = std::ios::in | std::ios::out);

    MemoryStream(int id,                                                // .f
            std::ios::openmode openMode = std::ios::in | std::ios::out);

    void open(char const *bufSize, bool erase,                         // .f
            std::ios::openmode openMode = std::ios::in | std::ios::out,
            size_t access = 0600);

    void open(char const *bufSize,                                       // .f
            std::ios::openmode openMode = std::ios::in | std::ios::out,
            size_t access = 0600);

    void open(int id, bool erase,                                       // .f
            std::ios::openmode openMode = std::ios::in | std::ios::out);

    void open(int id,                                                    // .f
            std::ios::openmode openMode = std::ios::in | std::ios::out);

    void setErase(bool erase);                                         // .f
};


inline MemoryStream::MemoryStream(std::string const &bufSize,
                                  std::ios::openmode openMode, size_t access)
:
    MemoryStream(bufSize, false, openMode, access)
{}

inline MemoryStream::MemoryStream(int id, std::ios::openmode openMode)
:
    MemoryStream(id, false, openMode)       // 3.cc
{}

inline void MemoryStream::open(char const *bufSize, bool erase, 
                               std::ios::openmode openMode, size_t access)
{
    static_cast<MemoryBuf &>(*this) = 
                            MemoryBuf{ bufSize, erase, openMode, access };
}

inline void MemoryStream::open(char const *bufSize,
                               std::ios::openmode openMode, size_t access)
{
    open(bufSize, false, openMode, access);
}

inline void MemoryStream::open(int id, bool erase,
                               std::ios::openmode openMode)
{
    static_cast<MemoryBuf &>(*this) = MemoryBuf{ id, erase, openMode };
}

inline void MemoryStream::open(int id, std::ios::openmode openMode)
{
    open(id, false, openMode);
}

inline void MemoryStream::setErase(bool erase)
{
    static_cast<MemoryBuf &>(*this).setErase(erase);
}










} // FBB
#endif







