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
00001 // Author: Chris Yan 00002 // Date: March 9, 2011 00003 // File: darray.cpp 00004 // Desc: Implementation for the darray class. 00005 ///////////////////////////////////////////////////////////////////////// 00006 #ifndef __WHYNOMBEDTEMPLATES 00007 #define __WHYNOMBEDTEMPLATES 00008 #include "darray.h" 00009 #include <cassert> 00010 00011 template<typename T> 00012 darray<T>::darray() 00013 { 00014 cap = 0; 00015 length = 0; 00016 arr = 0; 00017 } 00018 00019 template<typename T> 00020 darray<T>::darray( const darray& d):cap(d.cap),length(d.length),arr(0) 00021 { 00022 arr = new T[cap]; 00023 for( int i = 0; i < length; ++i) 00024 arr[i] = d.arr[i]; 00025 } 00026 00027 template<typename T> 00028 darray<T>::~darray() 00029 { 00030 delete[] this->arr; 00031 cap = length = 0; 00032 arr = 0; 00033 } 00034 00035 template<typename T> 00036 const T& darray<T>::operator [] (unsigned int idx) const 00037 { 00038 assert( idx < length ); 00039 return arr[idx]; 00040 } 00041 00042 template<typename T> 00043 T& darray<T>::operator [] (unsigned int idx) 00044 { 00045 assert( idx < length ); 00046 return arr[idx]; 00047 } 00048 00049 template<typename T> 00050 void darray<T>::pop_back() 00051 { 00052 assert( length > 0 ); 00053 --length; 00054 } 00055 00056 template<typename T> 00057 void darray<T>::push_back( const T& entry ) 00058 { 00059 if( length < cap ) 00060 arr[length++] = entry; 00061 else 00062 { 00063 T* temp = new T[length + 5]; 00064 00065 for( int i = 0; i < length; ++i ) 00066 temp[i] = arr[i]; 00067 00068 temp[length] = entry; 00069 delete[] arr; 00070 arr = temp; 00071 cap += 5; 00072 ++length; 00073 std::cout << "nAddress of Arr: " << &arr << '\n'; 00074 } 00075 } 00076 00077 template<typename T> 00078 darray<T>& darray<T>::operator = (const darray &d) 00079 { 00080 if(this != &d) 00081 { 00082 //delete[] this; 00083 this = d; 00084 } 00085 return *this; 00086 } 00087 00088 00089 template<typename T> 00090 void darray<T>::reserve(unsigned newcap) 00091 { 00092 if(cap >= newcap) 00093 return; 00094 00095 T* temp = new T[newcap]; 00096 for( int i = 0; i < length; ++i ) 00097 temp[i] = arr[i]; 00098 00099 delete[] arr; 00100 arr = temp; 00101 cap = newcap; 00102 } 00103 00104 //operator += () 00105 00106 /* 00107 darray operator + (const darray& d1, const darray& d2) 00108 { 00109 darray temp; 00110 temp += d1; 00111 temp += d2; 00112 return temp; 00113 } 00114 */ 00115 00116 /* 00117 std::ostream& operator << (std::ostream& out, const darray& d) 00118 { 00119 out << '('; 00120 int i; 00121 for( i = 0; i < (d.length-1); ++i ) 00122 out << d.arr[i] << ' '; 00123 return out << d.arr[i] << ')'; 00124 } 00125 */ 00126 00127 template <typename T> 00128 void darray<T>::sort(darray<T>& elems) 00129 { 00130 for(int top=elems.size()-1; top>0; --top) 00131 for(int k=0; k<top; ++k) 00132 if(elems[k] > elems[k+1]) 00133 swap(elems[k], elems[k+1]); 00134 } 00135 00136 template <typename T> 00137 void darray<T>::swap(T& elem1, T& elem2) 00138 { 00139 T temp = elem1; 00140 elem1 = elem2; 00141 elem2 = temp; 00142 } 00143 00144 #endif
Generated on Mon Jul 18 2022 21:09:04 by 1.7.2