Listing 2: XInDataBuf and XoutDataBuf

// My header
#include "IndexedFile.h"


namespace Util {

//
// XIODataStreambuf - accepts all base class default operations
//
template<typename Key, typename Compare, typename KeyTraits, size_t PageSize>
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XIODataStreambuf::XIODataStreambuf(
                  char* buf, size_t size, size_t len)
  : _buf(reinterpret_cast<XDR_Char*>(buf)),
      _size(size / sizeof(XDR_Char)),
      _len(len / sizeof(XDR_Char))
{
      // Set up the get and put areas
      setg(_buf, _buf, _buf+_len);
      setp(_buf+len, _buf+size);
}


template<typename Key, typename Compare, typename KeyTraits, size_t PageSize>
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XIODataStreambuf::~XIODataStreambuf()
{
      // empty
}


template<typename Key, typename Compare, typename KeyTraits, size_t PageSize>
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XIODataStreambuf::pos_type 
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XIODataStreambuf::seekoff(
            off_type off, std::ios_base::seekdir dir,
            std::ios_base::openmode which)
{
      if (which & std::ios_base::in and
            which & std::ios_base::out and 
            dir & std::ios_base::cur) return -1; // not valid

      pos_type rtn;
      if (which & std::ios_base::in) {
            int curoff = gptr() - eback();
            int newoff;
            if (dir & std::ios_base::beg) newoff = 0;
            else if (dir & std::ios_base::cur) newoff = curoff;
            else newoff = egptr() - eback();
            if (newoff + off < 0 or newoff + off > egptr() - eback()) return -1;
            if (newoff + off != curoff) gbump(newoff - curoff + off);
            rtn = newoff + off;
      }
      if (which & std::ios_base::out) {
            int curoff = pptr() - pbase();
            int newoff;
            if (dir & std::ios_base::beg) newoff = 0;
            else if (dir & std::ios_base::cur) newoff = curoff;
            else newoff = epptr() - pbase();
            if (newoff + off < 0 or newoff + off > epptr() - pbase()) return -1;
            if (newoff + off != curoff) pbump(newoff - curoff + off);
            rtn = newoff + off;
      }
      return rtn;
}


template<typename Key, typename Compare, typename KeyTraits, size_t PageSize>
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XIODataStreambuf::pos_type 
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XIODataStreambuf::seekpos(
            pos_type pos, std::ios_base::openmode which)
{
      return seekoff(pos, std::ios_base::beg, which);
}


//
// XOutDataBuf - the XDR_Stream class
//
template<typename Key, typename Compare, typename KeyTraits, size_t PageSize>
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XOutDataBuf::XOutDataBuf(
                  oXDR_Stream& xstrm,
                  char* buf, 
                  size_t size)
  : _refstrm(xstrm),
      _xstreambuf(buf, size, 0)
{
      // Initialize the base class
      init(&_xstreambuf);

      // Copy the formating, and polymorphic support information
      copyfmt(xstrm);
      obj2id() = xstrm.obj2id();
      type2id() = xstrm.type2id();
}



template<typename Key, typename Compare, typename KeyTraits, size_t PageSize>
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XOutDataBuf::~XOutDataBuf()
{
      // copy the formating data back
      _refstrm.copyfmt(*this);
      _refstrm.obj2id() = obj2id();
      _refstrm.type2id() = type2id();
}


//
// XInDataBuf - the XDR_Stream class
//
template<typename Key, typename Compare, typename KeyTraits, size_t PageSize>
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XInDataBuf::XInDataBuf(
                  iXDR_Stream& xstrm,
                  char* buf, 
                  size_t len)
  : _refstrm(xstrm),
      _xstreambuf(buf, len, len)
{
      // Initialize the base class
      init(&_xstreambuf);

      // Copy the formating, and polymorphic support information
      copyfmt(xstrm);
      id2obj() = xstrm.id2obj();
      id2type() = xstrm.id2type();
}



template<typename Key, typename Compare, typename KeyTraits, size_t PageSize>
BtreeIndex<Key,Compare,KeyTraits,PageSize>::XInDataBuf::~XInDataBuf()
{
      // copy the formating data back
      _refstrm.copyfmt(*this);
      _refstrm.id2obj() = id2obj();
      _refstrm.id2type() = id2type();
}


} //> namespace