1 /***************************************************************** 2 | 3 | Neptune - Stack 4 | 5 | Copyright (c) 2002-2008, Axiomatic Systems, LLC. 6 | All rights reserved. 7 | 8 | Redistribution and use in source and binary forms, with or without 9 | modification, are permitted provided that the following conditions are met: 10 | * Redistributions of source code must retain the above copyright 11 | notice, this list of conditions and the following disclaimer. 12 | * Redistributions in binary form must reproduce the above copyright 13 | notice, this list of conditions and the following disclaimer in the 14 | documentation and/or other materials provided with the distribution. 15 | * Neither the name of Axiomatic Systems nor the 16 | names of its contributors may be used to endorse or promote products 17 | derived from this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY 20 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 | DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY 23 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 26 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 | 30 ****************************************************************/ 31 32 #ifndef _NPT_STACK_H_ 33 #define _NPT_STACK_H_ 34 35 /*---------------------------------------------------------------------- 36 | includes 37 +---------------------------------------------------------------------*/ 38 #include "NptResults.h" 39 #include "NptTypes.h" 40 #include "NptList.h" 41 42 /*---------------------------------------------------------------------- 43 | NPT_Stack 44 +---------------------------------------------------------------------*/ 45 template <typename T> 46 class NPT_Stack : public NPT_List<T> 47 { 48 public: 49 // methods Push(const T & value)50 NPT_Result Push(const T& value) { 51 // NOTE: we must use the this-> accessor here because the standard 52 // requires it when the member to look up is in a parent template 53 return this->Add(value); 54 } 55 Peek(T & value)56 NPT_Result Peek(T& value) { 57 // NOTE: we must use the this-> accessor here because the standard 58 // requires it when the member to look up is in a parent template 59 if (this->m_ItemCount == 0) return NPT_ERROR_NO_SUCH_ITEM; 60 value = this->m_Tail->m_Data; 61 return NPT_SUCCESS; 62 } 63 Pop(T & value)64 NPT_Result Pop(T& value) { 65 // NOTE: we must use the this-> accessor here because the standard 66 // requires it when the member to look up is in a parent template 67 if (this->m_ItemCount == 0) return NPT_ERROR_NO_SUCH_ITEM; 68 typename NPT_List<T>::Iterator tail = this->GetLastItem(); 69 value = *tail; 70 return this->Erase(tail); 71 } 72 }; 73 74 #endif // _NPT_STACK_H_ 75