annotate algs4-c++/src/ResizingArrayStack.hpp @ 27:80ca1973e3bd

Fleshed out Queue::generic_iterator a bit more to make it a more or less complete example of implmenting an iterator.
author Eris Caffee <discordia@eldalin.com>
date Tue, 23 Jun 2015 17:14:09 -0500
parents 310618f5e32a
children
rev   line source
discordia@18 1 // Stack built on a resizing array.
discordia@18 2
discordia@3 3 #ifndef RESIZINGARRAYSTACK_HPP
discordia@3 4 #define RESIZINGARRAYSTACK_HPP
discordia@3 5
discordia@18 6 #include <cassert>
discordia@3 7 #include <cstddef>
discordia@3 8
discordia@3 9 template <typename T>
discordia@3 10 class ResizingArrayStack {
discordia@3 11
discordia@3 12 public:
discordia@3 13
discordia@3 14 ResizingArrayStack( void );
discordia@3 15 ~ResizingArrayStack( void );
discordia@3 16
discordia@3 17 void push( T &item );
discordia@3 18 T pop( void );
discordia@3 19
discordia@3 20 bool is_empty( void );
discordia@3 21 size_t size( void );
discordia@3 22
discordia@4 23 class iterator;
discordia@4 24 friend class iterator;
discordia@4 25 class iterator {
discordia@4 26
discordia@4 27 public:
discordia@4 28
discordia@4 29 iterator( T *c, T *e );
discordia@4 30
discordia@4 31 iterator& operator++();
discordia@4 32 iterator operator++(int);
discordia@4 33
discordia@4 34 T operator*();
discordia@4 35 bool operator!=( typename ResizingArrayStack<T>::iterator );
discordia@4 36
discordia@4 37 private:
discordia@4 38
discordia@4 39 T *curr;
discordia@4 40 T *end;
discordia@4 41 };
discordia@4 42
discordia@4 43 iterator begin( void );
discordia@4 44 iterator end( void );
discordia@3 45
discordia@3 46 private:
discordia@3 47
discordia@3 48 size_t N;
discordia@3 49 size_t max;
discordia@3 50 T *data;
discordia@3 51
discordia@3 52 void resize( size_t new_max );
discordia@3 53 };
discordia@3 54
discordia@18 55 ////////////////////////////////////////////////////////////////////////////////
discordia@18 56
discordia@18 57 template <typename T>
discordia@18 58 ResizingArrayStack<T>::ResizingArrayStack( void ) :
discordia@18 59 N (0),
discordia@18 60 max(1) {
discordia@18 61 data = new T[1];
discordia@18 62 }
discordia@18 63
discordia@18 64 template <typename T>
discordia@18 65 ResizingArrayStack<T>::~ResizingArrayStack( void ) {
discordia@18 66 assert( N == 0 ); // Catch the potential memory leak.
discordia@18 67 if ( data )
discordia@18 68 delete[] data;
discordia@18 69 }
discordia@18 70
discordia@18 71 template <typename T>
discordia@18 72 void ResizingArrayStack<T>::push( T &item ) {
discordia@18 73 if ( max == N )
discordia@18 74 resize( 2 * max );
discordia@18 75 data[N++] = item;
discordia@18 76 }
discordia@18 77
discordia@18 78 template <typename T>
discordia@18 79 T ResizingArrayStack<T>::pop( void ) {
discordia@18 80 assert( N > 0 );
discordia@18 81 T item = data[N-1];
discordia@18 82 N--;
discordia@18 83
discordia@18 84 if ( N <= max/4 )
discordia@18 85 resize( max/2 );
discordia@18 86
discordia@18 87 return item;
discordia@18 88 }
discordia@18 89
discordia@18 90 template <typename T>
discordia@18 91 bool ResizingArrayStack<T>::is_empty( void ) {
discordia@18 92 return N == 0;
discordia@18 93 }
discordia@18 94
discordia@18 95 template <typename T>
discordia@18 96 size_t ResizingArrayStack<T>::size( void ) {
discordia@18 97 return N;
discordia@18 98 }
discordia@18 99
discordia@18 100 template <typename T>
discordia@18 101 void ResizingArrayStack<T>::resize( size_t new_max ) {
discordia@18 102 T *new_data = new T[new_max];
discordia@18 103 for ( size_t i = 0; i < N; ++i )
discordia@18 104 new_data[i] = data[i];
discordia@18 105 T *old_data = data;
discordia@18 106 data = new_data;
discordia@18 107 delete[] old_data;
discordia@18 108 max = new_max;
discordia@18 109 }
discordia@18 110
discordia@18 111 template <typename T>
discordia@18 112 typename ResizingArrayStack<T>::iterator ResizingArrayStack<T>::begin( void ) {
discordia@18 113 return ResizingArrayStack<T>::iterator( data+N-1, data-1 );
discordia@18 114 }
discordia@18 115
discordia@18 116 template <typename T>
discordia@18 117 typename ResizingArrayStack<T>::iterator ResizingArrayStack<T>::end( void ) {
discordia@18 118 return ResizingArrayStack<T>::iterator( data-1, data-1 );
discordia@18 119 }
discordia@18 120
discordia@18 121
discordia@18 122 ////////////////////////////////////////////////////////////////////////////////
discordia@18 123
discordia@18 124 template <typename T>
discordia@18 125 ResizingArrayStack<T>::iterator::iterator( T *c, T *e ) :
discordia@18 126 curr (c),
discordia@18 127 end (e)
discordia@18 128 {
discordia@18 129 }
discordia@18 130
discordia@18 131 template <typename T>
discordia@18 132 typename ResizingArrayStack<T>::iterator & ResizingArrayStack<T>::iterator::operator++() {
discordia@18 133 if ( this->curr > this->end ) {
discordia@18 134 this->curr -= 1;
discordia@18 135 }
discordia@18 136 return *this;
discordia@18 137 }
discordia@18 138
discordia@18 139 template <typename T>
discordia@18 140 typename ResizingArrayStack<T>::iterator ResizingArrayStack<T>::iterator::operator++( int ) {
discordia@18 141 auto t = ResizingArrayStack<T>::iterator( *this );
discordia@18 142 if ( this->curr > this->end ) {
discordia@18 143 this->curr -= 1;
discordia@18 144 }
discordia@18 145 return t;
discordia@18 146 }
discordia@18 147
discordia@18 148 template <typename T>
discordia@18 149 T ResizingArrayStack<T>::iterator::operator*() {
discordia@18 150 return *(this->curr);
discordia@18 151 }
discordia@18 152
discordia@18 153 template <typename T>
discordia@18 154 bool ResizingArrayStack<T>::iterator::operator!=( typename ResizingArrayStack<T>::iterator other ) {
discordia@18 155 return this->curr != other.curr;
discordia@18 156 }
discordia@18 157
discordia@3 158
discordia@3 159
discordia@3 160 #endif
discordia@3 161