www.pudn.com > ReadingPeopleTracker-1.28.rar > Stack.h
/////////////////////////////////////////////////////////////////////////////// // // // Stack.h Stack class which holds unsigned char* elements // // // // Author : Nils T Siebel (nts) // // Created : Mon Jan 21 21:46:48 GMT 2002 // // Revision : 1.0 of Mon Jan 21 22:32:49 GMT 2002 // // Copyright : The University of Reading // // // // Changes: // // nts: rev 1.0: initial working revision Mon Jan 21 22:32:49 GMT 2002 // // // /////////////////////////////////////////////////////////////////////////////// #ifndef __STACK_H__ #define __STACK_H__ #include#include "tracker_defines_types_and_helpers.h" // for MARK, CLEAR_MARK, DEFAULT_STACKSIZE namespace ReadingPeopleTracker { static const char *Stack_Revision = "@(#) Stack.h, rev 1.0 of Mon Jan 21 22:32:49 GMT 2002, Author Nils T Siebel, Copyright (c) 2002 The University of Reading"; typedef unsigned char *cptr; class Stack { unsigned char **data_stack; unsigned char **stackptr; unsigned char **stacktop; public: Stack(unsigned int size = DEFAULT_STACKSIZE) { data_stack = new unsigned char*[size]; stackptr = data_stack; stacktop = &data_stack[size]; } ~Stack () { delete data_stack; } inline bool is_empty() const { return (stackptr == data_stack); } inline void push(const cptr &p) { assert (stackptr < stacktop); // if not we must increase `size' (or DEFAULT_STACKSIZE) if (stackptr < stacktop) *(stackptr++) = p; } inline void pop(cptr &p) { assert (stackptr > data_stack); // avoid stack underflow if (stackptr > data_stack) p = *(--stackptr); } inline void test(const cptr &p) { if (*(p) == MARK) { push(p); *(p) = CLEAR_MARK; } } }; } // namespace ReadingPeopleTracker #endif