A library to manipulate 2D arrays, and output them to an LED Dot Matrix Display. The display must be wired up using a shift register combined with a nor latch.
Matrix.h@1:44819562ea31, 2012-02-13 (annotated)
- Committer:
- EricWieser
- Date:
- Mon Feb 13 23:20:30 2012 +0000
- Revision:
- 1:44819562ea31
- Parent:
- 0:1deae5ffe9ed
Template ALL THE THINGS
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EricWieser | 0:1deae5ffe9ed | 1 | #include <cassert> |
EricWieser | 0:1deae5ffe9ed | 2 | #include "Locations.h" |
EricWieser | 0:1deae5ffe9ed | 3 | |
EricWieser | 0:1deae5ffe9ed | 4 | #ifndef Matrix_H |
EricWieser | 0:1deae5ffe9ed | 5 | #define Matrix_H |
EricWieser | 0:1deae5ffe9ed | 6 | template <class T> class Matrix { |
EricWieser | 0:1deae5ffe9ed | 7 | private: |
EricWieser | 1:44819562ea31 | 8 | //Internal data |
EricWieser | 0:1deae5ffe9ed | 9 | T* _data; |
EricWieser | 0:1deae5ffe9ed | 10 | int _width; |
EricWieser | 0:1deae5ffe9ed | 11 | int _height; |
EricWieser | 0:1deae5ffe9ed | 12 | |
EricWieser | 1:44819562ea31 | 13 | //Unsafe cell accessors |
EricWieser | 1:44819562ea31 | 14 | const T& item(int x, int y) const { return _data[y*_width + x]; } |
EricWieser | 1:44819562ea31 | 15 | T& item(int x, int y) { return _data[y*_width + x]; } |
EricWieser | 0:1deae5ffe9ed | 16 | |
EricWieser | 1:44819562ea31 | 17 | //Initializer |
EricWieser | 1:44819562ea31 | 18 | void init() { _data = new T[_width*_height]; } |
EricWieser | 0:1deae5ffe9ed | 19 | public: |
EricWieser | 1:44819562ea31 | 20 | //Construct an empty matrix |
EricWieser | 1:44819562ea31 | 21 | Matrix(int width, int height) : _width(width), _height(height) { init(); } |
EricWieser | 0:1deae5ffe9ed | 22 | |
EricWieser | 1:44819562ea31 | 23 | //Construct a matrix from a 2D array |
EricWieser | 0:1deae5ffe9ed | 24 | template <int w, int h> |
EricWieser | 0:1deae5ffe9ed | 25 | Matrix(T (&array)[h][w]) : _width(w), _height(h) { |
EricWieser | 0:1deae5ffe9ed | 26 | init(); |
EricWieser | 0:1deae5ffe9ed | 27 | |
EricWieser | 1:44819562ea31 | 28 | for(int x = 0; x < w; x++) |
EricWieser | 1:44819562ea31 | 29 | for(int y = 0; y < h; y++) |
EricWieser | 0:1deae5ffe9ed | 30 | item(x, y) = array[y][x]; |
EricWieser | 0:1deae5ffe9ed | 31 | } |
EricWieser | 0:1deae5ffe9ed | 32 | |
EricWieser | 1:44819562ea31 | 33 | //Copy constructor |
EricWieser | 0:1deae5ffe9ed | 34 | Matrix(const Matrix<T> &that) : _width(that._width), _height(that._height) { |
EricWieser | 0:1deae5ffe9ed | 35 | init(); |
EricWieser | 0:1deae5ffe9ed | 36 | |
EricWieser | 1:44819562ea31 | 37 | for(int i = 0; i < _width; i++) |
EricWieser | 1:44819562ea31 | 38 | for(int j = 0; j < _height; j++) |
EricWieser | 0:1deae5ffe9ed | 39 | this->item(i, j) = that.item(i, j); |
EricWieser | 0:1deae5ffe9ed | 40 | } |
EricWieser | 0:1deae5ffe9ed | 41 | |
EricWieser | 1:44819562ea31 | 42 | //Destructor - clean up pointers |
EricWieser | 1:44819562ea31 | 43 | ~Matrix() { delete [] _data; } |
EricWieser | 0:1deae5ffe9ed | 44 | |
EricWieser | 1:44819562ea31 | 45 | //Size accessors |
EricWieser | 1:44819562ea31 | 46 | int getWidth() const { return _width; } |
EricWieser | 0:1deae5ffe9ed | 47 | int getHeight() const { return _height; } |
EricWieser | 0:1deae5ffe9ed | 48 | |
EricWieser | 1:44819562ea31 | 49 | //Bounds checking |
EricWieser | 0:1deae5ffe9ed | 50 | bool contains(int x, int y) const { |
EricWieser | 0:1deae5ffe9ed | 51 | return x >= 0 && x < _width && y >= 0 && y < _height; |
EricWieser | 0:1deae5ffe9ed | 52 | } |
EricWieser | 0:1deae5ffe9ed | 53 | bool containsRect(int x, int y, int w, int h) const { |
EricWieser | 0:1deae5ffe9ed | 54 | return x >= 0 && x + w <= _width && y >= 0 && y + h <= _height; |
EricWieser | 0:1deae5ffe9ed | 55 | } |
EricWieser | 0:1deae5ffe9ed | 56 | |
EricWieser | 1:44819562ea31 | 57 | //Safe cell accessors |
EricWieser | 1:44819562ea31 | 58 | const T& operator() (int x, int y) const { assert(contains(x, y)); return item(x, y); } |
EricWieser | 1:44819562ea31 | 59 | T& operator() (int x, int y) { assert(contains(x, y)); return item(x, y); } |
EricWieser | 1:44819562ea31 | 60 | const T& operator[] (const Location<int> &p) const { return (*this)(p.x, p.y); } |
EricWieser | 1:44819562ea31 | 61 | T& operator[] (const Location<int> &p) { return (*this)(p.x, p.y); } |
EricWieser | 0:1deae5ffe9ed | 62 | |
EricWieser | 1:44819562ea31 | 63 | //Row and column accessors |
EricWieser | 0:1deae5ffe9ed | 64 | T* column(int x) const { |
EricWieser | 1:44819562ea31 | 65 | assert(x >= 0 && x <= _width); |
EricWieser | 0:1deae5ffe9ed | 66 | T* col = new T[_height]; |
EricWieser | 0:1deae5ffe9ed | 67 | for(int j = 0; j < _height; j++) { |
EricWieser | 0:1deae5ffe9ed | 68 | col[j] = this->item(x, j); |
EricWieser | 0:1deae5ffe9ed | 69 | } |
EricWieser | 0:1deae5ffe9ed | 70 | return col; |
EricWieser | 0:1deae5ffe9ed | 71 | } |
EricWieser | 0:1deae5ffe9ed | 72 | T* row(int y) const { |
EricWieser | 0:1deae5ffe9ed | 73 | assert(y >= 0 && y <= _height); |
EricWieser | 0:1deae5ffe9ed | 74 | T* row = new T[_width]; |
EricWieser | 0:1deae5ffe9ed | 75 | for(int i = 0; i < _width; i++) { |
EricWieser | 0:1deae5ffe9ed | 76 | row[i] = this->item(i, y); |
EricWieser | 0:1deae5ffe9ed | 77 | } |
EricWieser | 0:1deae5ffe9ed | 78 | return row; |
EricWieser | 0:1deae5ffe9ed | 79 | } |
EricWieser | 0:1deae5ffe9ed | 80 | |
EricWieser | 1:44819562ea31 | 81 | //Cut out a rectangle from an existing matrix |
EricWieser | 1:44819562ea31 | 82 | Matrix<T> slice(int x, int y, int w, int h) const { |
EricWieser | 1:44819562ea31 | 83 | assert(containsRect(x, y, w, h)); |
EricWieser | 1:44819562ea31 | 84 | |
EricWieser | 1:44819562ea31 | 85 | Matrix<T> m = Matrix<T>(w, h); |
EricWieser | 1:44819562ea31 | 86 | |
EricWieser | 1:44819562ea31 | 87 | for(int i = 0; i < w; i++) |
EricWieser | 1:44819562ea31 | 88 | for(int j = 0; j < h; j++) |
EricWieser | 1:44819562ea31 | 89 | m.item(i, j) = this->item(x + i, y + j); |
EricWieser | 1:44819562ea31 | 90 | |
EricWieser | 1:44819562ea31 | 91 | return m; |
EricWieser | 1:44819562ea31 | 92 | } |
EricWieser | 1:44819562ea31 | 93 | |
EricWieser | 1:44819562ea31 | 94 | //Copy the data in the rectangle (sx, sy, w, h) from "that" to "this" at (dx, dy) |
EricWieser | 1:44819562ea31 | 95 | void overlay(const Matrix<T> &that, int sx, int sy, int w, int h, int dx, int dy) { |
EricWieser | 1:44819562ea31 | 96 | assert(containsRect(dx, dy, w, h) && that.containsRect(sx, sy, w, h)); |
EricWieser | 1:44819562ea31 | 97 | |
EricWieser | 1:44819562ea31 | 98 | for(int x = 0; x < w; x++) { |
EricWieser | 1:44819562ea31 | 99 | for(int y = 0; y < h; y++) { |
EricWieser | 1:44819562ea31 | 100 | this->item(dx + x, dy + y) = that.item(sx + x, sy + y); |
EricWieser | 1:44819562ea31 | 101 | } |
EricWieser | 1:44819562ea31 | 102 | } |
EricWieser | 1:44819562ea31 | 103 | } |
EricWieser | 1:44819562ea31 | 104 | |
EricWieser | 1:44819562ea31 | 105 | //Empty the matrix |
EricWieser | 0:1deae5ffe9ed | 106 | void clear() { |
EricWieser | 0:1deae5ffe9ed | 107 | for(int x = 0; x < _width; x++) |
EricWieser | 1:44819562ea31 | 108 | for(int y = 0; y < _height; y++) |
EricWieser | 1:44819562ea31 | 109 | this->item(x, y) = T(); |
EricWieser | 0:1deae5ffe9ed | 110 | } |
EricWieser | 0:1deae5ffe9ed | 111 | }; |
EricWieser | 0:1deae5ffe9ed | 112 | #endif |