sp

Dependents:   WAV

Committer:
phungductung
Date:
Fri Jun 07 05:06:42 2019 +0000
Revision:
0:4e245f4bc8ac
spkt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phungductung 0:4e245f4bc8ac 1 //-----------------------------------------------------------------------
phungductung 0:4e245f4bc8ac 2 // Generic Array class
phungductung 0:4e245f4bc8ac 3 // If you define "#define DEBUG_ARRAY_CHECK",
phungductung 0:4e245f4bc8ac 4 // range check of index is available.
phungductung 0:4e245f4bc8ac 5 //
phungductung 0:4e245f4bc8ac 6 // 2016/08/15, Copyright (c) 2016 MIKAMI, Naoki
phungductung 0:4e245f4bc8ac 7 //-----------------------------------------------------------------------
phungductung 0:4e245f4bc8ac 8
phungductung 0:4e245f4bc8ac 9 #include "mbed.h"
phungductung 0:4e245f4bc8ac 10 #include <new> // for new, delete, and set_new_handler()
phungductung 0:4e245f4bc8ac 11
phungductung 0:4e245f4bc8ac 12 #ifndef MIKAMI_ARRAY_HPP
phungductung 0:4e245f4bc8ac 13 #define MIKAMI_ARRAY_HPP
phungductung 0:4e245f4bc8ac 14
phungductung 0:4e245f4bc8ac 15 namespace Mikami
phungductung 0:4e245f4bc8ac 16 {
phungductung 0:4e245f4bc8ac 17 template <class T> class Array
phungductung 0:4e245f4bc8ac 18 {
phungductung 0:4e245f4bc8ac 19 public:
phungductung 0:4e245f4bc8ac 20 explicit Array(int i = 1) { ArrayNew(i); } // default constructor
phungductung 0:4e245f4bc8ac 21 Array(const Array<T>& a) { Copy(a); } // copy constructor
phungductung 0:4e245f4bc8ac 22 inline Array(int i, T initialValue); // constructor with initialization
phungductung 0:4e245f4bc8ac 23 inline Array(int i, const T val[]); // constructor with assignment built-in array
phungductung 0:4e245f4bc8ac 24 ~Array() { delete[] v_; } // destructor
phungductung 0:4e245f4bc8ac 25 inline void Fill(T val); // fill with same value
phungductung 0:4e245f4bc8ac 26 inline void Assign(const T val[]); // assign built-in array
phungductung 0:4e245f4bc8ac 27 void SetSize(int i); // setting size
phungductung 0:4e245f4bc8ac 28 int Length() const { return size_; } // get size of array
phungductung 0:4e245f4bc8ac 29 Array<T>& operator=(const Array<T>& a); // assignment
phungductung 0:4e245f4bc8ac 30 inline T& operator[](int i); // assignment by element
phungductung 0:4e245f4bc8ac 31 inline const T& operator[](int n) const; // get element
phungductung 0:4e245f4bc8ac 32 operator const T* () const { return v_; } // type conversion
phungductung 0:4e245f4bc8ac 33 operator T* () const { return v_; } // type conversion
phungductung 0:4e245f4bc8ac 34
phungductung 0:4e245f4bc8ac 35 private:
phungductung 0:4e245f4bc8ac 36 T *v_;
phungductung 0:4e245f4bc8ac 37 int size_; // size of array
phungductung 0:4e245f4bc8ac 38
phungductung 0:4e245f4bc8ac 39 void Range(int pos) const; // range checking for Array
phungductung 0:4e245f4bc8ac 40 void Copy(const Array<T>& v_src); // copy of object
phungductung 0:4e245f4bc8ac 41 inline void ArrayNew(const int i); // routine for constructor
phungductung 0:4e245f4bc8ac 42 static void MemoryAssignError(); // error message
phungductung 0:4e245f4bc8ac 43 };
phungductung 0:4e245f4bc8ac 44
phungductung 0:4e245f4bc8ac 45 //-----------------------------------------------------------------------
phungductung 0:4e245f4bc8ac 46 // implementation of generic array class
phungductung 0:4e245f4bc8ac 47 //-----------------------------------------------------------------------
phungductung 0:4e245f4bc8ac 48
phungductung 0:4e245f4bc8ac 49 // constructor with initialization
phungductung 0:4e245f4bc8ac 50 template <class T> Array<T>::Array(int i, T initialValue)
phungductung 0:4e245f4bc8ac 51 {
phungductung 0:4e245f4bc8ac 52 ArrayNew(i);
phungductung 0:4e245f4bc8ac 53 Fill(initialValue);
phungductung 0:4e245f4bc8ac 54 }
phungductung 0:4e245f4bc8ac 55
phungductung 0:4e245f4bc8ac 56 // constructor with assignment built-in array
phungductung 0:4e245f4bc8ac 57 template <class T> Array<T>::Array(int i, const T val[])
phungductung 0:4e245f4bc8ac 58 {
phungductung 0:4e245f4bc8ac 59 ArrayNew(i);
phungductung 0:4e245f4bc8ac 60 Assign(val);
phungductung 0:4e245f4bc8ac 61 }
phungductung 0:4e245f4bc8ac 62
phungductung 0:4e245f4bc8ac 63 template <class T> void Array<T>::SetSize(int i)
phungductung 0:4e245f4bc8ac 64 {
phungductung 0:4e245f4bc8ac 65 delete[] v_;
phungductung 0:4e245f4bc8ac 66 v_ = new T[size_ = i];
phungductung 0:4e245f4bc8ac 67 }
phungductung 0:4e245f4bc8ac 68
phungductung 0:4e245f4bc8ac 69 // fill with same value
phungductung 0:4e245f4bc8ac 70 template <class T> void Array<T>::Fill(T val)
phungductung 0:4e245f4bc8ac 71 {
phungductung 0:4e245f4bc8ac 72 for (int n=0; n<size_; n++) v_[n] = val;
phungductung 0:4e245f4bc8ac 73 }
phungductung 0:4e245f4bc8ac 74
phungductung 0:4e245f4bc8ac 75 // assign built-in array
phungductung 0:4e245f4bc8ac 76 template <class T> void Array<T>::Assign(const T val[])
phungductung 0:4e245f4bc8ac 77 {
phungductung 0:4e245f4bc8ac 78 for (int n=0; n<size_; n++) v_[n] = val[n];
phungductung 0:4e245f4bc8ac 79 }
phungductung 0:4e245f4bc8ac 80
phungductung 0:4e245f4bc8ac 81 template <class T> Array<T>& Array<T>::operator=(const Array<T>& a)
phungductung 0:4e245f4bc8ac 82 {
phungductung 0:4e245f4bc8ac 83 if (this != &a) // prohibition of self-assignment
phungductung 0:4e245f4bc8ac 84 {
phungductung 0:4e245f4bc8ac 85 delete [] v_;
phungductung 0:4e245f4bc8ac 86 Copy(a);
phungductung 0:4e245f4bc8ac 87 }
phungductung 0:4e245f4bc8ac 88 return *this;
phungductung 0:4e245f4bc8ac 89 }
phungductung 0:4e245f4bc8ac 90
phungductung 0:4e245f4bc8ac 91 template <class T> inline T& Array<T>::operator[](int i)
phungductung 0:4e245f4bc8ac 92 {
phungductung 0:4e245f4bc8ac 93 #ifdef DEBUG_ARRAY_CHECK
phungductung 0:4e245f4bc8ac 94 Range(i); // out of bound ?
phungductung 0:4e245f4bc8ac 95 #endif
phungductung 0:4e245f4bc8ac 96 return v_[i];
phungductung 0:4e245f4bc8ac 97 }
phungductung 0:4e245f4bc8ac 98
phungductung 0:4e245f4bc8ac 99 template <class T> inline const T& Array<T>::operator[](int i) const
phungductung 0:4e245f4bc8ac 100 {
phungductung 0:4e245f4bc8ac 101 #ifdef DEBUG_ARRAY_CHECK
phungductung 0:4e245f4bc8ac 102 Range(i); // out of bounds ?
phungductung 0:4e245f4bc8ac 103 #endif
phungductung 0:4e245f4bc8ac 104 return v_[i];
phungductung 0:4e245f4bc8ac 105 }
phungductung 0:4e245f4bc8ac 106
phungductung 0:4e245f4bc8ac 107 template <class T> void Array<T>::Range(int pos) const
phungductung 0:4e245f4bc8ac 108 {
phungductung 0:4e245f4bc8ac 109 if ((pos < 0) || (pos >= size_))
phungductung 0:4e245f4bc8ac 110 {
phungductung 0:4e245f4bc8ac 111 fprintf(stderr, "\r\nOut of range\r\n");
phungductung 0:4e245f4bc8ac 112 while (true);
phungductung 0:4e245f4bc8ac 113 }
phungductung 0:4e245f4bc8ac 114 }
phungductung 0:4e245f4bc8ac 115
phungductung 0:4e245f4bc8ac 116 template <class T> void Array<T>::Copy(const Array<T>& v_src)
phungductung 0:4e245f4bc8ac 117 {
phungductung 0:4e245f4bc8ac 118 v_ = new T[size_ = v_src.size_];
phungductung 0:4e245f4bc8ac 119 for (int n=0; n<size_; n++) v_[n] = v_src.v_[n];
phungductung 0:4e245f4bc8ac 120 }
phungductung 0:4e245f4bc8ac 121
phungductung 0:4e245f4bc8ac 122 // routine for constructor
phungductung 0:4e245f4bc8ac 123 template <class T> void Array<T>::ArrayNew(int i)
phungductung 0:4e245f4bc8ac 124 {
phungductung 0:4e245f4bc8ac 125 set_new_handler(Array<T>::MemoryAssignError);
phungductung 0:4e245f4bc8ac 126 v_ = new T[size_ = i];
phungductung 0:4e245f4bc8ac 127 }
phungductung 0:4e245f4bc8ac 128
phungductung 0:4e245f4bc8ac 129 // Message of "Can't allocate to memory!"
phungductung 0:4e245f4bc8ac 130 template <class T> void Array<T>::MemoryAssignError()
phungductung 0:4e245f4bc8ac 131 {
phungductung 0:4e245f4bc8ac 132 fprintf(stderr, "Can't allocate to memory!\r\n");
phungductung 0:4e245f4bc8ac 133 while(true);
phungductung 0:4e245f4bc8ac 134 }
phungductung 0:4e245f4bc8ac 135 }
phungductung 0:4e245f4bc8ac 136 #endif // MIKAMI_ARRAY_HPP