Merge branch 'maint' into next
[diffractometer.git] / src / Matrix.h
blobe3fbaf98fca6086685c4c20cebef05a867daac61
1 #ifndef _MATRIX_H_
2 #define _MATRIX_H_
4 template<class T>
5 struct Matrix
7 Matrix(void)
9 this->xdim = 0;
10 this->ydim = 0;
11 this->data = NULL;
12 this->_own_data = true;
15 Matrix(size_t xdim, size_t ydim)
17 this->xdim = xdim;
18 this->ydim = ydim;
19 this->data = new T[xdim * ydim];
20 this->_own_data = true;
23 Matrix(Matrix const & m)
25 this->xdim = m.xdim;
26 this->ydim = m.ydim;
27 _own_data = m._own_data;
28 if(_own_data){
29 this->data = new T[this->xdim * this->ydim];
30 ::memcpy(this->data, m.data, sizeof(*m.data) * this->xdim * this->ydim);
31 } else {
32 this->data = m.data;
36 Matrix & operator= (Matrix const & m)
38 this->xdim = m.xdim;
39 this->ydim = m.ydim;
40 this->_own_data = m._own_data;
41 if(this->_own_data){
42 this->data = new T[this->xdim * this->ydim];
43 ::memcpy(this->data, m.data, sizeof(*m.data) * this->xdim * this->ydim);
44 } else {
45 this->data = m.data;
47 return *this;
50 virtual ~Matrix(void)
52 if(_own_data){
53 this->xdim = 0;
54 this->ydim = 0;
55 if(this->data){
56 delete[] this->data;
57 this->data = NULL;
62 void resize(size_t xdim, size_t ydim)
64 if(this->_own_data){
65 if(xdim != this->xdim
66 || ydim != this->ydim){
67 if(this->data)
68 delete[] this->data;
69 this->data = new T[xdim * ydim];
70 this->xdim = xdim;
71 this->ydim = ydim;
76 void clear(void)
78 if(this->xdim && this->ydim && this->data)
79 ::memset(this->data, 0, sizeof(T) * this->xdim * this->ydim);
82 void attach_to_buffer(T *data, size_t xdim, size_t ydim)
84 if(_own_data && this->data)
85 delete[] this->data;
86 this->xdim = xdim;
87 this->ydim = ydim;
88 this->data = data;
89 this->_own_data = false;
92 void attach_to_const_buffer(const T * data, size_t xdim, size_t ydim)
94 if(_own_data && this->data)
95 delete[] this->data;
96 this->xdim = xdim;
97 this->ydim = ydim;
98 this->data = const_cast<T *>(data);
99 this->_own_data = false;
102 void set_data_from_buffer(T const *data, size_t xdim, size_t ydim)
104 ::memcpy(this->data, data, xdim * ydim * sizeof(T));
107 public:
109 size_t xdim;
110 size_t ydim;
111 T *data;
113 private:
115 bool _own_data;
117 #endif