00001 /*MT* 00002 00003 MediaTomb - http://www.mediatomb.cc/ 00004 00005 base_stack.h - this file is part of MediaTomb. 00006 00007 Copyright (C) 2005 Gena Batyan <bgeradz@mediatomb.cc>, 00008 Sergey 'Jin' Bostandzhyan <jin@mediatomb.cc> 00009 00010 Copyright (C) 2006-2010 Gena Batyan <bgeradz@mediatomb.cc>, 00011 Sergey 'Jin' Bostandzhyan <jin@mediatomb.cc>, 00012 Leonhard Wimmer <leo@mediatomb.cc> 00013 00014 MediaTomb is free software; you can redistribute it and/or modify 00015 it under the terms of the GNU General Public License version 2 00016 as published by the Free Software Foundation. 00017 00018 MediaTomb is distributed in the hope that it will be useful, 00019 but WITHOUT ANY WARRANTY; without even the implied warranty of 00020 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00021 GNU General Public License for more details. 00022 00023 You should have received a copy of the GNU General Public License 00024 version 2 along with MediaTomb; if not, write to the Free Software 00025 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. 00026 00027 $Id: base_stack.h 2081 2010-03-23 20:18:00Z lww $ 00028 */ 00029 00031 00032 #ifndef __ZMMF_BASE_STACK_H__ 00033 #define __ZMMF_BASE_STACK_H__ 00034 00035 #include "zmm/zmm.h" 00036 #include "memory.h" 00037 00038 namespace zmm 00039 { 00040 00041 template <typename T> 00042 class BaseStack : public Object 00043 { 00044 public: 00045 BaseStack(int initialCapacity, T emptyType) : Object() 00046 { 00047 capacity = initialCapacity; 00048 this->emptyType = emptyType; 00049 count = 0; 00050 data = (T *)MALLOC(capacity * sizeof(T)); 00051 } 00052 00053 ~BaseStack() 00054 { 00055 FREE(this->data); 00056 } 00057 00058 inline int getCapacity() 00059 { 00060 return capacity; 00061 } 00062 00063 inline int size() 00064 { 00065 return count; 00066 } 00067 00068 inline bool isEmpty() 00069 { 00070 return (count == 0); 00071 } 00072 00073 inline void push(T element) 00074 { 00075 if (count == capacity) 00076 resize(count + 1); 00077 data[count++] = element; 00078 } 00079 00080 void resize(int requiredSize) 00081 { 00082 if(requiredSize > capacity) 00083 { 00084 #ifdef TOMBDEBUG 00085 int oldCapacity = capacity; 00086 #endif 00087 capacity = count + (count / 2); 00088 if(requiredSize > capacity) 00089 capacity = requiredSize; 00090 data = (T *)REALLOC(data, capacity * sizeof(T)); 00091 #ifdef TOMBDEBUG 00092 log_debug("resizing %d -> %d\n", oldCapacity, capacity); 00093 #endif 00094 } 00095 } 00096 00097 inline T pop() 00098 { 00099 if (this->count < 1) 00100 return emptyType; 00101 return this->data[--this->count]; 00102 } 00103 protected: 00104 T *data; 00105 T emptyType; 00106 int capacity; 00107 int count; 00108 }; 00109 } 00110 00111 #endif // __ZMMF_BASE_STACK_H__
1.6.1