* idem for the state and status.
[diffractometer.git] / src / Matrix.h
blobc0df7f354d7c4f831f171cfc157126f1db3ec913
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 virtual ~Matrix(void)
38 if(_own_data){
39 this->xdim = 0;
40 this->ydim = 0;
41 if(this->data){
42 delete[] this->data;
43 this->data = NULL;
48 void resize(size_t xdim, size_t ydim)
50 if(this->_own_data){
51 if(xdim != this->xdim
52 || ydim != this->ydim){
53 if(this->data)
54 delete[] this->data;
55 this->data = new T[xdim * ydim];
56 this->xdim = xdim;
57 this->ydim = ydim;
62 void clear(void)
64 if(this->xdim && this->ydim && this->data)
65 ::memset(this->data, 0, sizeof(T) * this->xdim * this->ydim);
68 void attach_to_buffer(T *data, size_t xdim, size_t ydim)
70 if(_own_data && this->data)
71 delete[] this->data;
72 this->xdim = xdim;
73 this->ydim = ydim;
74 this->data = data;
75 this->_own_data = false;
78 void attach_to_const_buffer(const T * data, size_t xdim, size_t ydim)
80 if(_own_data && this->data)
81 delete[] this->data;
82 this->xdim = xdim;
83 this->ydim = ydim;
84 this->data = const_cast<T *>(data);
85 this->_own_data = false;
88 void set_data_from_buffer(T const *data, size_t xdim, size_t ydim)
90 ::memcpy(this->data, data, xdim * ydim * sizeof(T));
93 public:
95 size_t xdim;
96 size_t ydim;
97 T *data;
99 private:
101 bool _own_data;
103 #endif