// 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