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:
Sun May 22 06:14:18 2016 +0000
Revision:
0:efe9b1f01090
Child:
1:54b07f0d5ba1
1

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 0:efe9b1f01090 6 // 2016/05/22, 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 0:efe9b1f01090 23 ~Array() { delete[] v_; } // destructor
MikamiUitOpen 0:efe9b1f01090 24 inline void Fill(T val); // fill with same value
MikamiUitOpen 0:efe9b1f01090 25 void SetSize(int i); // setting size
MikamiUitOpen 0:efe9b1f01090 26 int Length() const { return size_; } // get size of array
MikamiUitOpen 0:efe9b1f01090 27 Array<T>& operator=(const Array<T>& a); // assignment
MikamiUitOpen 0:efe9b1f01090 28 inline T& operator[](int i); // assignment by element
MikamiUitOpen 0:efe9b1f01090 29 inline const T& operator[](int n) const; // get element
MikamiUitOpen 0:efe9b1f01090 30 operator const T* () const { return v_; } // type conversion
MikamiUitOpen 0:efe9b1f01090 31 operator T* () const { return v_; } // type conversion
MikamiUitOpen 0:efe9b1f01090 32
MikamiUitOpen 0:efe9b1f01090 33 private:
MikamiUitOpen 0:efe9b1f01090 34 T *v_;
MikamiUitOpen 0:efe9b1f01090 35 int size_; // size of array
MikamiUitOpen 0:efe9b1f01090 36
MikamiUitOpen 0:efe9b1f01090 37 void Range(int pos) const; // range checking for Array
MikamiUitOpen 0:efe9b1f01090 38 void Copy(const Array<T>& v_src); // copy of object
MikamiUitOpen 0:efe9b1f01090 39 inline void ArrayNew(const int i); // routine for constructor
MikamiUitOpen 0:efe9b1f01090 40 static void MemoryAssignError(); // error message
MikamiUitOpen 0:efe9b1f01090 41 };
MikamiUitOpen 0:efe9b1f01090 42
MikamiUitOpen 0:efe9b1f01090 43 //-----------------------------------------------------------------------
MikamiUitOpen 0:efe9b1f01090 44 // implementation of generic array class
MikamiUitOpen 0:efe9b1f01090 45 //-----------------------------------------------------------------------
MikamiUitOpen 0:efe9b1f01090 46
MikamiUitOpen 0:efe9b1f01090 47 // constructor with initialization
MikamiUitOpen 0:efe9b1f01090 48 template <class T> inline Array<T>::Array(int i, T initialValue)
MikamiUitOpen 0:efe9b1f01090 49 {
MikamiUitOpen 0:efe9b1f01090 50 ArrayNew(i);
MikamiUitOpen 0:efe9b1f01090 51 Fill(initialValue);
MikamiUitOpen 0:efe9b1f01090 52 }
MikamiUitOpen 0:efe9b1f01090 53
MikamiUitOpen 0:efe9b1f01090 54 template <class T> void Array<T>::SetSize(int i)
MikamiUitOpen 0:efe9b1f01090 55 {
MikamiUitOpen 0:efe9b1f01090 56 delete[] v_;
MikamiUitOpen 0:efe9b1f01090 57 v_ = new T[size_ = i];
MikamiUitOpen 0:efe9b1f01090 58 }
MikamiUitOpen 0:efe9b1f01090 59
MikamiUitOpen 0:efe9b1f01090 60 // fill with same value
MikamiUitOpen 0:efe9b1f01090 61 template <class T> void Array<T>::Fill(T val)
MikamiUitOpen 0:efe9b1f01090 62 {
MikamiUitOpen 0:efe9b1f01090 63 for (int n=0; n<size_; n++) v_[n] = val;
MikamiUitOpen 0:efe9b1f01090 64 }
MikamiUitOpen 0:efe9b1f01090 65
MikamiUitOpen 0:efe9b1f01090 66 template <class T> Array<T>& Array<T>::operator=(const Array<T>& a)
MikamiUitOpen 0:efe9b1f01090 67 {
MikamiUitOpen 0:efe9b1f01090 68 if (this != &a) // prohibition of self-assignment
MikamiUitOpen 0:efe9b1f01090 69 {
MikamiUitOpen 0:efe9b1f01090 70 delete [] v_;
MikamiUitOpen 0:efe9b1f01090 71 Copy(a);
MikamiUitOpen 0:efe9b1f01090 72 }
MikamiUitOpen 0:efe9b1f01090 73 return *this;
MikamiUitOpen 0:efe9b1f01090 74 }
MikamiUitOpen 0:efe9b1f01090 75
MikamiUitOpen 0:efe9b1f01090 76 template <class T> inline T& Array<T>::operator[](int i)
MikamiUitOpen 0:efe9b1f01090 77 {
MikamiUitOpen 0:efe9b1f01090 78 #ifdef DEBUG_ARRAY_CHECK
MikamiUitOpen 0:efe9b1f01090 79 Range(i); // out of bound ?
MikamiUitOpen 0:efe9b1f01090 80 #endif
MikamiUitOpen 0:efe9b1f01090 81 return v_[i];
MikamiUitOpen 0:efe9b1f01090 82 }
MikamiUitOpen 0:efe9b1f01090 83
MikamiUitOpen 0:efe9b1f01090 84 template <class T> inline const T& Array<T>::operator[](int i) const
MikamiUitOpen 0:efe9b1f01090 85 {
MikamiUitOpen 0:efe9b1f01090 86 #ifdef DEBUG_ARRAY_CHECK
MikamiUitOpen 0:efe9b1f01090 87 Range(i); // out of bounds ?
MikamiUitOpen 0:efe9b1f01090 88 #endif
MikamiUitOpen 0:efe9b1f01090 89 return v_[i];
MikamiUitOpen 0:efe9b1f01090 90 }
MikamiUitOpen 0:efe9b1f01090 91
MikamiUitOpen 0:efe9b1f01090 92 template <class T> void Array<T>::Range(int pos) const
MikamiUitOpen 0:efe9b1f01090 93 {
MikamiUitOpen 0:efe9b1f01090 94 if ((pos < 0) || (pos >= size_))
MikamiUitOpen 0:efe9b1f01090 95 {
MikamiUitOpen 0:efe9b1f01090 96 fprintf(stderr, "\r\nOut of range\r\n");
MikamiUitOpen 0:efe9b1f01090 97 while (true);
MikamiUitOpen 0:efe9b1f01090 98 }
MikamiUitOpen 0:efe9b1f01090 99 }
MikamiUitOpen 0:efe9b1f01090 100
MikamiUitOpen 0:efe9b1f01090 101 template <class T> void Array<T>::Copy(const Array<T>& v_src)
MikamiUitOpen 0:efe9b1f01090 102 {
MikamiUitOpen 0:efe9b1f01090 103 v_ = new T[size_ = v_src.size_];
MikamiUitOpen 0:efe9b1f01090 104 for (int i=0; i<size_; i++) v_[i] = v_src.v_[i];
MikamiUitOpen 0:efe9b1f01090 105 }
MikamiUitOpen 0:efe9b1f01090 106
MikamiUitOpen 0:efe9b1f01090 107 // routine for constructor
MikamiUitOpen 0:efe9b1f01090 108 template <class T> void Array<T>::ArrayNew(int i)
MikamiUitOpen 0:efe9b1f01090 109 {
MikamiUitOpen 0:efe9b1f01090 110 set_new_handler(Array<T>::MemoryAssignError);
MikamiUitOpen 0:efe9b1f01090 111 v_ = new T[size_ = i];
MikamiUitOpen 0:efe9b1f01090 112 }
MikamiUitOpen 0:efe9b1f01090 113
MikamiUitOpen 0:efe9b1f01090 114 // Message of "Can't allocate to memory!"
MikamiUitOpen 0:efe9b1f01090 115 template <class T> void Array<T>::MemoryAssignError()
MikamiUitOpen 0:efe9b1f01090 116 {
MikamiUitOpen 0:efe9b1f01090 117 fprintf(stderr, "Can't allocate to memory!\r\n");
MikamiUitOpen 0:efe9b1f01090 118 while(true);
MikamiUitOpen 0:efe9b1f01090 119 }
MikamiUitOpen 0:efe9b1f01090 120 }
MikamiUitOpen 0:efe9b1f01090 121 #endif // MIKAMI_ARRAY_HPP