An mbed-friendly version of dynamic arrays Main difference in the code from my original version is the inability to use template files with the mbed compiler.
darray.cpp@0:537664265ba6, 2014-01-27 (annotated)
- Committer:
- Fuzball
- Date:
- Mon Jan 27 08:20:47 2014 +0000
- Revision:
- 0:537664265ba6
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Fuzball | 0:537664265ba6 | 1 | // Author: Chris Yan |
Fuzball | 0:537664265ba6 | 2 | // Date: March 9, 2011 |
Fuzball | 0:537664265ba6 | 3 | // File: darray.cpp |
Fuzball | 0:537664265ba6 | 4 | // Desc: Implementation for the darray class. |
Fuzball | 0:537664265ba6 | 5 | ///////////////////////////////////////////////////////////////////////// |
Fuzball | 0:537664265ba6 | 6 | #ifndef __WHYNOMBEDTEMPLATES |
Fuzball | 0:537664265ba6 | 7 | #define __WHYNOMBEDTEMPLATES |
Fuzball | 0:537664265ba6 | 8 | #include "darray.h" |
Fuzball | 0:537664265ba6 | 9 | #include <cassert> |
Fuzball | 0:537664265ba6 | 10 | |
Fuzball | 0:537664265ba6 | 11 | template<typename T> |
Fuzball | 0:537664265ba6 | 12 | darray<T>::darray() |
Fuzball | 0:537664265ba6 | 13 | { |
Fuzball | 0:537664265ba6 | 14 | cap = 0; |
Fuzball | 0:537664265ba6 | 15 | length = 0; |
Fuzball | 0:537664265ba6 | 16 | arr = 0; |
Fuzball | 0:537664265ba6 | 17 | } |
Fuzball | 0:537664265ba6 | 18 | |
Fuzball | 0:537664265ba6 | 19 | template<typename T> |
Fuzball | 0:537664265ba6 | 20 | darray<T>::darray( const darray& d):cap(d.cap),length(d.length),arr(0) |
Fuzball | 0:537664265ba6 | 21 | { |
Fuzball | 0:537664265ba6 | 22 | arr = new T[cap]; |
Fuzball | 0:537664265ba6 | 23 | for( int i = 0; i < length; ++i) |
Fuzball | 0:537664265ba6 | 24 | arr[i] = d.arr[i]; |
Fuzball | 0:537664265ba6 | 25 | } |
Fuzball | 0:537664265ba6 | 26 | |
Fuzball | 0:537664265ba6 | 27 | template<typename T> |
Fuzball | 0:537664265ba6 | 28 | darray<T>::~darray() |
Fuzball | 0:537664265ba6 | 29 | { |
Fuzball | 0:537664265ba6 | 30 | delete[] this->arr; |
Fuzball | 0:537664265ba6 | 31 | cap = length = 0; |
Fuzball | 0:537664265ba6 | 32 | arr = 0; |
Fuzball | 0:537664265ba6 | 33 | } |
Fuzball | 0:537664265ba6 | 34 | |
Fuzball | 0:537664265ba6 | 35 | template<typename T> |
Fuzball | 0:537664265ba6 | 36 | const T& darray<T>::operator [] (unsigned int idx) const |
Fuzball | 0:537664265ba6 | 37 | { |
Fuzball | 0:537664265ba6 | 38 | assert( idx < length ); |
Fuzball | 0:537664265ba6 | 39 | return arr[idx]; |
Fuzball | 0:537664265ba6 | 40 | } |
Fuzball | 0:537664265ba6 | 41 | |
Fuzball | 0:537664265ba6 | 42 | template<typename T> |
Fuzball | 0:537664265ba6 | 43 | T& darray<T>::operator [] (unsigned int idx) |
Fuzball | 0:537664265ba6 | 44 | { |
Fuzball | 0:537664265ba6 | 45 | assert( idx < length ); |
Fuzball | 0:537664265ba6 | 46 | return arr[idx]; |
Fuzball | 0:537664265ba6 | 47 | } |
Fuzball | 0:537664265ba6 | 48 | |
Fuzball | 0:537664265ba6 | 49 | template<typename T> |
Fuzball | 0:537664265ba6 | 50 | void darray<T>::pop_back() |
Fuzball | 0:537664265ba6 | 51 | { |
Fuzball | 0:537664265ba6 | 52 | assert( length > 0 ); |
Fuzball | 0:537664265ba6 | 53 | --length; |
Fuzball | 0:537664265ba6 | 54 | } |
Fuzball | 0:537664265ba6 | 55 | |
Fuzball | 0:537664265ba6 | 56 | template<typename T> |
Fuzball | 0:537664265ba6 | 57 | void darray<T>::push_back( const T& entry ) |
Fuzball | 0:537664265ba6 | 58 | { |
Fuzball | 0:537664265ba6 | 59 | if( length < cap ) |
Fuzball | 0:537664265ba6 | 60 | arr[length++] = entry; |
Fuzball | 0:537664265ba6 | 61 | else |
Fuzball | 0:537664265ba6 | 62 | { |
Fuzball | 0:537664265ba6 | 63 | T* temp = new T[length + 5]; |
Fuzball | 0:537664265ba6 | 64 | |
Fuzball | 0:537664265ba6 | 65 | for( int i = 0; i < length; ++i ) |
Fuzball | 0:537664265ba6 | 66 | temp[i] = arr[i]; |
Fuzball | 0:537664265ba6 | 67 | |
Fuzball | 0:537664265ba6 | 68 | temp[length] = entry; |
Fuzball | 0:537664265ba6 | 69 | delete[] arr; |
Fuzball | 0:537664265ba6 | 70 | arr = temp; |
Fuzball | 0:537664265ba6 | 71 | cap += 5; |
Fuzball | 0:537664265ba6 | 72 | ++length; |
Fuzball | 0:537664265ba6 | 73 | std::cout << "nAddress of Arr: " << &arr << '\n'; |
Fuzball | 0:537664265ba6 | 74 | } |
Fuzball | 0:537664265ba6 | 75 | } |
Fuzball | 0:537664265ba6 | 76 | |
Fuzball | 0:537664265ba6 | 77 | template<typename T> |
Fuzball | 0:537664265ba6 | 78 | darray<T>& darray<T>::operator = (const darray &d) |
Fuzball | 0:537664265ba6 | 79 | { |
Fuzball | 0:537664265ba6 | 80 | if(this != &d) |
Fuzball | 0:537664265ba6 | 81 | { |
Fuzball | 0:537664265ba6 | 82 | //delete[] this; |
Fuzball | 0:537664265ba6 | 83 | this = d; |
Fuzball | 0:537664265ba6 | 84 | } |
Fuzball | 0:537664265ba6 | 85 | return *this; |
Fuzball | 0:537664265ba6 | 86 | } |
Fuzball | 0:537664265ba6 | 87 | |
Fuzball | 0:537664265ba6 | 88 | |
Fuzball | 0:537664265ba6 | 89 | template<typename T> |
Fuzball | 0:537664265ba6 | 90 | void darray<T>::reserve(unsigned newcap) |
Fuzball | 0:537664265ba6 | 91 | { |
Fuzball | 0:537664265ba6 | 92 | if(cap >= newcap) |
Fuzball | 0:537664265ba6 | 93 | return; |
Fuzball | 0:537664265ba6 | 94 | |
Fuzball | 0:537664265ba6 | 95 | T* temp = new T[newcap]; |
Fuzball | 0:537664265ba6 | 96 | for( int i = 0; i < length; ++i ) |
Fuzball | 0:537664265ba6 | 97 | temp[i] = arr[i]; |
Fuzball | 0:537664265ba6 | 98 | |
Fuzball | 0:537664265ba6 | 99 | delete[] arr; |
Fuzball | 0:537664265ba6 | 100 | arr = temp; |
Fuzball | 0:537664265ba6 | 101 | cap = newcap; |
Fuzball | 0:537664265ba6 | 102 | } |
Fuzball | 0:537664265ba6 | 103 | |
Fuzball | 0:537664265ba6 | 104 | //operator += () |
Fuzball | 0:537664265ba6 | 105 | |
Fuzball | 0:537664265ba6 | 106 | /* |
Fuzball | 0:537664265ba6 | 107 | darray operator + (const darray& d1, const darray& d2) |
Fuzball | 0:537664265ba6 | 108 | { |
Fuzball | 0:537664265ba6 | 109 | darray temp; |
Fuzball | 0:537664265ba6 | 110 | temp += d1; |
Fuzball | 0:537664265ba6 | 111 | temp += d2; |
Fuzball | 0:537664265ba6 | 112 | return temp; |
Fuzball | 0:537664265ba6 | 113 | } |
Fuzball | 0:537664265ba6 | 114 | */ |
Fuzball | 0:537664265ba6 | 115 | |
Fuzball | 0:537664265ba6 | 116 | /* |
Fuzball | 0:537664265ba6 | 117 | std::ostream& operator << (std::ostream& out, const darray& d) |
Fuzball | 0:537664265ba6 | 118 | { |
Fuzball | 0:537664265ba6 | 119 | out << '('; |
Fuzball | 0:537664265ba6 | 120 | int i; |
Fuzball | 0:537664265ba6 | 121 | for( i = 0; i < (d.length-1); ++i ) |
Fuzball | 0:537664265ba6 | 122 | out << d.arr[i] << ' '; |
Fuzball | 0:537664265ba6 | 123 | return out << d.arr[i] << ')'; |
Fuzball | 0:537664265ba6 | 124 | } |
Fuzball | 0:537664265ba6 | 125 | */ |
Fuzball | 0:537664265ba6 | 126 | |
Fuzball | 0:537664265ba6 | 127 | template <typename T> |
Fuzball | 0:537664265ba6 | 128 | void darray<T>::sort(darray<T>& elems) |
Fuzball | 0:537664265ba6 | 129 | { |
Fuzball | 0:537664265ba6 | 130 | for(int top=elems.size()-1; top>0; --top) |
Fuzball | 0:537664265ba6 | 131 | for(int k=0; k<top; ++k) |
Fuzball | 0:537664265ba6 | 132 | if(elems[k] > elems[k+1]) |
Fuzball | 0:537664265ba6 | 133 | swap(elems[k], elems[k+1]); |
Fuzball | 0:537664265ba6 | 134 | } |
Fuzball | 0:537664265ba6 | 135 | |
Fuzball | 0:537664265ba6 | 136 | template <typename T> |
Fuzball | 0:537664265ba6 | 137 | void darray<T>::swap(T& elem1, T& elem2) |
Fuzball | 0:537664265ba6 | 138 | { |
Fuzball | 0:537664265ba6 | 139 | T temp = elem1; |
Fuzball | 0:537664265ba6 | 140 | elem1 = elem2; |
Fuzball | 0:537664265ba6 | 141 | elem2 = temp; |
Fuzball | 0:537664265ba6 | 142 | } |
Fuzball | 0:537664265ba6 | 143 | |
Fuzball | 0:537664265ba6 | 144 | #endif |