// // File: stdio_stack.h // Authors: Rakesh Barve // // Defining a stack based on bte_stdio separately specifically // for use in block collection class and related apps. // The reason we don't want to use ami_stack is because // then the stack would be implemented as a BTE_STREAM, which // may have large block size etc. which is undesirable for // stacks related to block collections since such a stack is only // a meta data structure accessed no more than once every block // is created or destroyed. // // $Id: stdio_stack.h,v 1.7 2003/04/17 19:57:25 jan Exp $ // #ifndef _STDIO_STACK_H #define _STDIO_STACK_H // Get definitions for working with Unix and Windows #include "u/nvasil/tpie/portability.h" #include "u/nvasil/tpie/bte_stream_stdio.h" template class stdio_stack : public BTE_stream_stdio { public: stdio_stack(char *path, BTE_stream_type type = BTE_WRITE_STREAM); ~stdio_stack(void); BTE_err push(const T &t); BTE_err pop(T **t); }; template stdio_stack::stdio_stack(char *path, BTE_stream_type type) : BTE_stream_stdio(path, type) { } template stdio_stack::~stdio_stack(void) { } template BTE_err stdio_stack::push(const T &t) { BTE_err ae; TPIE_OS_OFFSET slen; ae = truncate((slen = stream_len())+1); if (ae != BTE_ERROR_NO_ERROR) { return ae; } ae = seek(slen); if (ae != BTE_ERROR_NO_ERROR) { return ae; } return write_item(t); } template BTE_err stdio_stack::pop(T **t) { BTE_err ae; TPIE_OS_OFFSET slen; slen = stream_len(); ae = seek(slen-1); if (ae != BTE_ERROR_NO_ERROR) { return ae; } ae = read_item(t); if (ae != BTE_ERROR_NO_ERROR) { return ae; } return truncate(slen-1); } #endif // _stdio_stack_H