The spica renderer
stack.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef _SPICA_QUEUE_H_
6 #define _SPICA_QUEUE_H_
7 
8 #include <cstdlib>
9 #include <cstring>
10 
11 #include "common.h"
12 
13 namespace spica {
14 
15  template <class T>
16  class Stack {
17  private:
18  static const int kInitSize = 512;
19 
20  int _pos;
21  int _size;
22  T* _data;
23 
24  public:
25  Stack()
26  : _pos(0)
27  , _size(kInitSize)
28  , _data(new T[kInitSize])
29  {
30  }
31 
32  Stack(const Stack<T>& stk)
33  : _pos(0)
34  , _size(0)
35  , _data(NULL)
36  {
37  this->operator=(stk);
38  }
39 
40  Stack(Stack<T>&& stk)
41  : _pos(0)
42  , _size(0)
43  , _data(NULL)
44  {
45  this->operator=(std::move(stk));
46  }
47 
48  ~Stack()
49  {
50  delete[] _data;
51  }
52 
53  Stack<T>& operator=(const Stack<T>& stk) {
54  release();
55 
56  this->_pos = stk._pos;
57  this->_size = stk._size;
58  this->_data = new T[stk._size];
59  memcpy(_data, stk._data, sizeof(T) * stk._size);
60 
61  return *this;
62  }
63 
64  Stack<T>& operator=(Stack<T>&& stk) {
65  release();
66 
67  this->_pos = stk._pos;
68  this->_size = stk._size;
69  this->_data = stk._data;
70  stk._data = nullptr;
71 
72  return *this;
73  }
74 
75  void push(const T& v) {
76  if (_pos == _size) {
77  T* tmp = new T[_size * 2];
78  memcpy(tmp, _data, sizeof(T) * _size);
79  delete[] _data;
80  _data = tmp;
81  _size = _size * 2;
82  }
83 
84  _data[_pos++] = v;
85  }
86 
87  T pop() {
88  Assertion(_pos > 0, "No item remains!!");
89  return std::move(_data[--_pos]);
90  }
91 
92  void clear() {
93  _pos = 0;
94  }
95 
96  private:
97  void release() {
98  _pos = 0;
99  _size = 0;
100  delete[] _data;
101  _data = NULL;
102  }
103 
104  };
105 
106 } // namespace spica
107 
108 #endif // _SPICA_QUEUE_H_
109