Aleph-w  1.5a.2
Biblioteca general de algoritmos y estructuras de datos
 Todo Clases Archivos Funciones Variables 'typedefs' Enumeraciones Amigas Grupos Páginas
tpl_dynMat.H
1 #ifndef TPL_DYNMAT_H
2 #define TPL_DYNMAT_H
3 
4 # include <ahDry.H>
5 # include <tpl_dynArray.H>
6 
7 namespace Aleph {
8 
42  template <typename T>
43 class DynMatrix
44 {
45  size_t n = 0;
46  size_t m = 0;
47 
48  DynArray<T> * array_ptr = NULL;
49 
50  mutable T Zero = T();
51 
52  const T & read_array_entry(const size_t i) const
53  {
54  const T * entry_ptr = array_ptr->test(i);
55 
56  return entry_ptr == NULL ? Zero : *entry_ptr;
57  }
58 
59  T & write_array_entry(const size_t i, const T & data)
60  {
61  T & ref = array_ptr->touch(i) = data;
62 
63  return ref;
64  }
65 
66  size_t get_index(const size_t i, const size_t j) const
67  {
68  return i*m + j;
69  }
70 
71 public:
72 
73  void set_default_initial_value(const T & value)
74  {
75  array_ptr->set_default_initial_value(value);
76  }
77 
78  void swap(DynMatrix & mat)
79  {
80  std::swap(n, mat.n);
81  std::swap(m, mat.m);
82  std::swap(Zero, mat.Zero);
83  std::swap(array_ptr, mat.array_ptr);
84  }
85 
87  void set_dimension(const size_t __n, const size_t __m)
88  {
89  if (array_ptr != NULL) // se verifica porque puede llamarse desde el ctor
90  delete array_ptr;
91 
92  n = __n;
93  m = __m;
94  size_t d, s, b;
95  const size_t N = n*m;
96  DynArray<T>::compute_sizes(N, d, s, b);
97 
98  array_ptr = new DynArray<T> (d, s, b);
99  array_ptr->set_default_initial_value(Zero);
100  }
101 
103  void allocate()
104  {
105  array_ptr->reserve(n*m);
106  }
107 
118  DynMatrix(const size_t __n, const size_t __m, const T & zero = T())
119  : n(__n), m(__m), array_ptr(NULL), Zero(zero)
120  {
121  set_dimension(n, m);
122  }
123 
124  ~DynMatrix()
125  {
126  if (array_ptr)
127  delete array_ptr;
128  }
129 
138  DynMatrix(const DynMatrix<T> & mat)
139  : DynMatrix(mat.n, mat.m, mat.Zero)
140  {
141  *array_ptr = *mat.array_ptr;
142  }
143 
144  DynMatrix(DynMatrix<T> && mat)
145  {
146  swap(mat);
147  }
148 
157  {
158  if (this == &mat)
159  return *this;
160 
161  n = mat.n;
162  m = mat.m;
163  array_ptr->copy_array_exactly(*this, mat);
164 
165  return *this;
166  }
167 
169  {
170  swap(mat);
171  return *this;
172  }
173 
174  bool operator == (const DynMatrix<T> & mat) const
175  {
176  const size_t N = n*m;
177  for (int i = 0; i < N; ++i)
178  if (read_array_entry(i) != mat.read_array_entry(i))
179  return false;
180 
181  return true;
182  }
183 
185  const size_t & rows() const { return n; }
186 
188  const size_t & cols() const { return m; }
189 
191  const T & read(const size_t i, const size_t j) const
192  {
193  I(i < n and j < m);
194 
195  return read_array_entry(get_index(i, j));
196  }
197 
205  T & write(const size_t i, const size_t j, const T & data)
206  {
207  I(i < n and j < m);
208 
209  return write_array_entry(get_index(i, j), data);
210  }
211 
213  T & access(const size_t i, const size_t j)
214  {
215  return array_ptr->access(get_index(i, j));
216  }
217 
218  T & operator () (const size_t i, const size_t j)
219  {
220  return access(i, j);
221  }
222 
223  T & access(const size_t i, const size_t j) const
224  {
225  return array_ptr->access(get_index(i, j));
226  }
227 
228  T & operator () (const size_t i, const size_t j) const
229  {
230  return access(i, j);
231  }
232 
233  template <class Operation>
234  bool traverse(Operation & operation) const
235  {
236  return array_ptr->traverse(operation);
237  }
238 
239  template <class Operation>
240  bool traverse(Operation & operation)
241  {
242  return array_ptr->traverse(operation);
243  }
244 
245  template <class Operation>
246  bool traverse(Operation && operation = Operation()) const
247  {
248  return traverse<Operation>(operation);
249  }
250 
251  template <class Operation>
252  bool traverse(Operation && operation = Operation())
253  {
254  return traverse<Operation>(operation);
255  }
256 
257  Functional_Methods(T);
258 };
259 
260 } // end namespace Aleph
261 
262 #endif // TPL_DYNMAT_H
const T & read(const size_t i, const size_t j) const
Lee el valor de la i fila j columna.
Definition: tpl_dynMat.H:191
DynMatrix(const DynMatrix< T > &mat)
Definition: tpl_dynMat.H:138
Definition: tpl_dynMat.H:43
DynMatrix< T > & operator=(const DynMatrix< T > &mat)
Definition: tpl_dynMat.H:156
DynMatrix(const size_t __n, const size_t __m, const T &zero=T())
Definition: tpl_dynMat.H:118
static void compute_sizes(const size_t n, size_t &d, size_t &s, size_t &b)
Definition: tpl_dynArray.H:123
const size_t & rows() const
Retorna la cantidad de filas de la matriz.
Definition: tpl_dynMat.H:185
void set_dimension(const size_t __n, const size_t __m)
Reajusta la dimensión del arreglo.
Definition: tpl_dynMat.H:87
T & access(const size_t i, const size_t j)
acceso sin verificación de entrada esparcida
Definition: tpl_dynMat.H:213
Definition: tpl_dynArray.H:70
T & write(const size_t i, const size_t j, const T &data)
Definition: tpl_dynMat.H:205
void allocate()
Asegura que toda la memoria del arreglo esté apartada.
Definition: tpl_dynMat.H:103
const size_t & cols() const
Retorna la cantidad de columnas de la matriz.
Definition: tpl_dynMat.H:188

Leandro Rabindranath León