Generic class libraries for 1D array and 2D array: Array and Matrix. 1次元および2次元配列用の汎用クラスライブラリ: Array と Matrix.

Dependents:   F746_SD_WavPlayer CW_Decoder_using_FFT_on_F446 F446_MySoundMachine F446_ADF_Nlms ... more

Committer:
MikamiUitOpen
Date:
Mon Jul 25 13:37:16 2016 +0000
Revision:
1:54b07f0d5ba1
Parent:
0:efe9b1f01090
Child:
2:a25dba17218c
2

Who changed what in which revision?

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