Listing 2: Interfaces for class MergeFile and PreSort

/*
 *  mfile.h
 */

#if !defined __MFILE_H
#define __MFILE_H
#include <stdio.h>      /* tmpnam(), rename() */
#include "insort.h"
#include "ffstream.h"

class MergeFile   {
    PDATA _pbuf;    /* -> i/o buffer */
    PDATA _ppos;    /* buffer put pointer */
    PDATA _gpos;    /* buffer get pointer */
    PDATA _lpos;    /* last item put */
    char _tmpf[ L_tmpnam ];  /* tempfile name */
    const char *_fn;  /* -> file name */
    ffstream *Mf;   /* associated stream */
    const char * _fmode;     /* ffstream file mode */
    int _tmpfile;  /* !0 if temp file used */
    int _eofile;    /* end of stream data */
    size_t _items;  /* buffer item count */
    size_t _actual_runs, _null_runs;
    const int _width;     /* sizeof items, bytes */
    const int _maxitems;  /* Max #items /buffer */
    const int _holdtmps;  /* keep temp files (debug) */

  protected:
    void _resetp()  /* reset buffer pointers */
        { _gpos = _ppos = _lpos = _pbuf; }
    void _advp( PDATA &p )  /* advance buf pointer */
        { (char*) p += _width;  }
    virtual void _flushb(); /* flush buffer */
    virtual void _fillb(); /* fill buffer */
    PCDATA _getb();
    int _is_empty() const { return (_items == 0);  }

  public:
    friend class PreSort;
    enum io_mode { in, out };
    MergeFile( const int wd, const size_t blen,
               const char *mode = "w+b" );
    virtual ~MergeFile();
    size_t Actual() const { return _actual_runs; }
    size_t Null() const   { return _null_runs; }
    void Actual(size_t n) { _actual_runs = n; }
    void Null(size_t n)   { _null_runs = n; }
    PCDATA Nextg();
    PCDATA Lastp() const { return (PCDATA) _lpos; }
    PCDATA Get();
    PCDATA Put(PCDATA);
    const char *Fname() const { return _fn; }
    size_t Items() const { return _items; }
    int RenameOutput( const char * );
    void ResetIOMode(io_mode);
    int EndOfFile() const { return _eofile;  }
    void AttachStream( ffstream * );
    operator int ()     //assert valid object
        { return (_pbuf != 0) && *Mf; }
    int operator == (MergeFile & p)
        { return &p == this; }  //for container lib
};

class PreSort   {
    MergeFile *Sf;    /* Source file */
    const InternalSort *Ins;
    PPCDATA _psbuf;   /* presort buffer */
    PPCDATA _psb;     /* -> presort buffer */
  protected:
    void _putsbuf(PCDATA p) { *_psb++ = p; }
    PCDATA _getsbuf() { return *_psb++;  }
    void _setsbuf() { _psb = _psbuf; }
  public:
    PreSort( MergeFile&, const InternalSort& );
    ~PreSort() { if( _psbuf )
                    delete _psbuf;  }
    operator int ()     //assert valid object
        {   return _psbuf != 0; }
    size_t GenerateRun( MergeFile *dest, int& comp );
    int EndOfFile() const { return Sf->EndOfFile(); }
};
#endif
// End of File