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.

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?

UserRevisionLine numberNew 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