#ifndef INCLUDED_BOBCAT_OFDSTREAMBUF_
#define INCLUDED_BOBCAT_OFDSTREAMBUF_

#include <streambuf>

namespace FBB
{    

class OFdStreambuf: public std::streambuf
{
    public:
            // Mode defines what to do with the file descriptor at
            // destruction-time or when the default open is
            // called. CLOSE_FD will close the fd, KEEP_FD will leave the
            // fd as-is. When open is called with a Mode argument, then
            // the provided argument is used for the actual fd. The Mode
            // specified at the constructor is therefore only used for the
            // mode-less open() call and for the destructor.
        enum Mode
        {
            CLOSE_FD,
            KEEP_FD,
        };

    private:
        Mode        d_mode;
        size_t      d_n;
        int         d_fd;
        char       *d_buffer;

    public:
        OFdStreambuf();
        explicit OFdStreambuf(Mode mode);
        explicit OFdStreambuf(int fd, size_t n = 1);
        OFdStreambuf(int fd, Mode mode, size_t n = 1);

        OFdStreambuf(OFdStreambuf const &other) = delete;

        virtual ~OFdStreambuf();

        OFdStreambuf &operator=(OFdStreambuf const &other) = delete;


        void open(int fd, Mode mode, size_t n = 1);
        void open(int fd, size_t n = 1);                    // .f

        int fd() const;                                     // .f
        void close();                                       // .f

    protected:
        int pSync();                                        // .f

    private:
        int sync() override;
        int overflow(int c) override;

        void cleanup(Mode mode);
};

#include "close.f"
#include "fd.f"
#include "open.f"
#include "psync.f"

} // FBB

#endif






