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.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers darray.cpp Source File

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