source: flair-src/trunk/lib/FlairCore/src/Matrix.cpp @ 214

Last change on this file since 214 was 214, checked in by Sanahuja Guillaume, 3 years ago

matrix

File size: 6.1 KB
Line 
1// %flair:license{
2// This file is part of the Flair framework distributed under the
3// CECILL-C License, Version 1.0.
4// %flair:license}
5//  created:    2018/01/30
6//  filename:   Matrix.cpp
7//
8//  author:     Guillaume Sanahuja
9//              Copyright Heudiasyc UMR UTC/CNRS 7253
10//
11//  version:    $Id: $
12//
13//  purpose:    Class defining a matrix
14//
15/*********************************************************************/
16
17#include "Matrix.h"
18#include "Matrix_impl.h"
19#include <typeinfo>
20#include <string.h>
21
22using std::string;
23
24namespace flair {
25namespace core {
26/*! \class MatrixElement
27*/
28class MatrixElement : public IODataElement {
29public:
30  MatrixElement(const Matrix *matrix, string name, uint32_t row,
31                  uint32_t col)
32      : IODataElement(matrix, name) {
33    this->matrix = matrix;
34    this->row = row;
35    this->col = col;
36    if (row >= matrix->Rows() || col >= matrix->Cols()) {
37      matrix->Err("index (%i,%i) out of bound, max (%i,%i)\n", row, col,
38                  matrix->Rows() - 1, matrix->Cols() - 1);
39      size = 0;
40    } else {
41      try {
42        ScalarType const &scalarType = dynamic_cast<ScalarType const &>(
43            matrix->GetDataType().GetElementDataType());
44        size = scalarType.GetSize();
45      } catch (std::bad_cast e) {
46        matrix->Err("type not handled\n");
47        size = 0;
48      }
49    }
50  }
51
52  ~MatrixElement() {}
53
54  void CopyData(char *dst) const {
55    if (typeid(matrix->GetDataType().GetElementDataType()) ==
56        typeid(FloatType)) {
57      float value = matrix->Value(row, col);
58      memcpy(dst, &value, sizeof(value));
59    } else if (typeid(matrix->GetDataType().GetElementDataType()) ==
60               typeid(SignedIntegerType)) {
61      switch (matrix->GetDataType().GetElementDataType().GetSize()) {
62      case 1: {
63        int8_t int8Value = matrix->Value(row, col);
64        memcpy(dst, &int8Value, 1);
65      } break;
66      case 2: {
67        int16_t int16Value = matrix->Value(row, col);
68        memcpy(dst, &int16Value, 2);
69      } break;
70      }
71    } else if (typeid(matrix->GetDataType().GetElementDataType()) ==
72               typeid(UnsignedIntegerType)) {
73      switch (matrix->GetDataType().GetElementDataType().GetSize()) {
74      case 1: {
75        uint8_t uint8Value = matrix->Value(row, col);
76        memcpy(dst, &uint8Value, 1);
77      } break;
78      case 2: {
79        uint16_t uint16Value = matrix->Value(row, col);
80        memcpy(dst, &uint16Value, 2);
81      } break;
82      }
83    }
84  }
85
86  DataType const &GetDataType(void) const {
87    return matrix->GetDataType().GetElementDataType();
88  }
89
90private:
91  const Matrix *matrix;
92  uint32_t row, col;
93};
94
95Matrix::Matrix(const Object *parent, uint32_t rows, uint32_t cols,
96                   ScalarType const &elementDataType, string name, uint32_t n)
97    : io_data(parent, name, n), dataType(rows, cols, elementDataType) {
98  pimpl_ = new Matrix_impl(this, rows, cols, elementDataType, n);
99
100  for (uint32_t i = 0; i < rows; i++) {
101    for (uint32_t j = 0; j < cols; j++) {
102      AppendLogDescription(pimpl_->descriptor->ElementName(i, j),
103                           elementDataType);
104      SetValue(i, j, 0);
105    }
106  }
107}
108
109Matrix::Matrix(const Object *parent, const cvmatrix_descriptor *descriptor,
110                   ScalarType const &elementDataType, string name, uint32_t n)
111    : io_data(parent, name, n),
112      dataType(descriptor->Rows(), descriptor->Cols(), elementDataType) {
113  pimpl_ = new Matrix_impl(this, descriptor, elementDataType, n);
114
115  for (uint32_t i = 0; i < descriptor->Rows(); i++) {
116    for (uint32_t j = 0; j < descriptor->Cols(); j++) {
117      AppendLogDescription(descriptor->ElementName(i, j), elementDataType);
118      SetValue(i, j, 0);
119    }
120  }
121}
122
123Matrix::~Matrix() { delete pimpl_; }
124
125IODataElement *Matrix::Element(uint32_t row, uint32_t col) const {
126  return new MatrixElement(this, Name(row, col), row, col);
127}
128
129IODataElement *Matrix::Element(uint32_t index) const {
130  if (Rows() == 1) {
131    return new MatrixElement(this, Name(0, index), 0, index);
132  } else if (Cols() == 1) {
133    return new MatrixElement(this, Name(index, 0), index, 0);
134  } else {
135    Err("matrix is not 1D\n");
136    return nullptr;
137  }
138}
139
140float Matrix::Value(uint32_t row, uint32_t col) const {
141  float value;
142
143  if (row >= (uint32_t)pimpl_->descriptor->Rows() ||
144      col >= (uint32_t)pimpl_->descriptor->Cols()) {
145    Warn("index (%i,%i) out of bound, max (%i,%i)\n", row, col,
146         pimpl_->descriptor->Rows() - 1, pimpl_->descriptor->Cols() - 1);
147    return 0;
148  }
149
150  GetMutex();
151  value = pimpl_->ValueNoMutex(row, col);
152  ReleaseMutex();
153
154  return value;
155}
156
157float Matrix::ValueNoMutex(uint32_t row, uint32_t col) const {
158  if (row >= (uint32_t)pimpl_->descriptor->Rows() ||
159      col >= (uint32_t)pimpl_->descriptor->Cols()) {
160    Warn("index (%i,%i) out of bound, max (%i,%i)\n", row, col,
161         pimpl_->descriptor->Rows() - 1, pimpl_->descriptor->Cols() - 1);
162    return 0;
163  }
164
165  return pimpl_->ValueNoMutex(row, col);
166}
167
168void Matrix::SetValue(uint32_t row, uint32_t col, float value) {
169  if (row >= (uint32_t)pimpl_->descriptor->Rows() ||
170      col >= (uint32_t)pimpl_->descriptor->Cols()) {
171    Warn("index (%i,%i) out of bound, max (%i,%i)\n", row, col,
172         pimpl_->descriptor->Rows() - 1, pimpl_->descriptor->Cols() - 1);
173  } else {
174    GetMutex();
175    pimpl_->SetValueNoMutex(row, col,value);
176    ReleaseMutex();
177  }
178}
179
180void Matrix::SetValueNoMutex(uint32_t row, uint32_t col, float value) {
181  if (row >= (uint32_t)pimpl_->descriptor->Rows() ||
182      col >= (uint32_t)pimpl_->descriptor->Cols()) {
183    Warn("index (%i,%i) out of bound, max (%i,%i)\n", row, col,
184         pimpl_->descriptor->Rows() - 1, pimpl_->descriptor->Cols() - 1);
185  } else {
186    pimpl_->SetValueNoMutex(row, col,value);
187  }
188}
189
190void Matrix::CopyDatas(char *dst) const {
191  GetMutex();
192  memcpy(dst, pimpl_->datas, dataType.GetSize());
193  ReleaseMutex();
194}
195
196uint32_t Matrix::Rows(void) const { return pimpl_->descriptor->Rows(); }
197
198uint32_t Matrix::Cols(void) const { return pimpl_->descriptor->Cols(); }
199
200string Matrix::Name(uint32_t row, uint32_t col) const {
201  return pimpl_->descriptor->ElementName(row, col);
202}
203
204} // end namespace core
205} // end namespace flair
Note: See TracBrowser for help on using the repository browser.