GemaCoreLib
The GeMA Core library
gmDiscontinuityAccessor.h
Go to the documentation of this file.
1 /************************************************************************
2 **
3 ** Copyright (C) 2014 by Carlos Augusto Teixera Mendes
4 ** All rights reserved.
5 **
6 ** This file is part of the "GeMA" software. It's use should respect
7 ** the terms in the license agreement that can be found together
8 ** with this source code.
9 ** It is provided AS IS, with NO WARRANTY OF ANY KIND,
10 ** INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR
11 ** A PARTICULAR PURPOSE.
12 **
13 ************************************************************************/
14 
25 #ifndef _GEMA_DISCONTINUITY_ACCESSOR_H_
26 #define _GEMA_DISCONTINUITY_ACCESSOR_H_
27 
28 #include "gmAccessorProxy.h"
29 
30 #include "gmDiscontinuity.h"
32 
33 #include <unitConverter.h>
34 
35 
36 #include <assert.h>
37 
38 
48 {
49 public:
52 
53  // Wrapped functions. For descriptions, see GmValueAccessor documentation
54  const double* value(const GmDiscontinuity* d) const
55  {
56  return _ac->value(queryIndex(d));
57  }
58 
59  double scalarValue(const GmDiscontinuity* d) const
60  {
61  return _ac->scalarValue(queryIndex(d));
62  }
63 
64  void matrixValue(const GmDiscontinuity* d, GmCRMatrix& mat) const
65  {
66  _ac->matrixValue(queryIndex(d), mat);
67  }
68 
69  void vectorValue(const GmDiscontinuity* d, GmCRVector& vec) const
70  {
71  _ac->vectorValue(queryIndex(d), vec);
72  }
73 
74  bool setValue (const GmDiscontinuity* d, const double* value) { return _ac->setValue(queryIndex(d), value); }
75  bool setScalarValue (const GmDiscontinuity* d, double value) { return _ac->setScalarValue(queryIndex(d), value); }
76  bool setScalarValueAtDim(const GmDiscontinuity* d, int dim, double value) { return _ac->setScalarValueAtDim(queryIndex(d), dim, value); }
77  bool setValueAsDef (const GmDiscontinuity* d) { return _ac->setValueAsDef(queryIndex(d)); }
78  bool setFunctionValue (const GmDiscontinuity* d, GmUserFunction* functionDef) { Q_UNUSED(d); Q_UNUSED(functionDef); return logUserFunctionError(); }
79  bool setFunctionValue (const GmDiscontinuity* d, GmUserFunctionEvaluator* functionEval) { Q_UNUSED(d); Q_UNUSED(functionEval); return logUserFunctionError(); }
80 
81  QString valueStr(const GmDiscontinuity* d, bool evalFunctions, bool printDefAsNil,
82  int fieldWidth = 0, char format = 'g', int precision = -1) const
83  {
84  return _ac->valueStr(queryIndex(d), evalFunctions, printDefAsNil, fieldWidth, format, precision, NULL);
85  }
86 
87  bool setFunctionFromName(const GmDiscontinuity* d, QString userFunctionId, QString& err)
88  {
89  Q_UNUSED(d); Q_UNUSED(userFunctionId);
90  err = QObject::tr("Discontinuity accessor does not accept function values.");
91  return false;
92  }
93 
94  bool setValueFromVariant(const GmDiscontinuity* d, const QVariant& v, bool acceptMissingDimension, QString& err)
95  {
96  return _ac->setValueFromVariant(queryIndex(d), v, acceptMissingDimension, err);
97  }
98 
99  bool isDefValue(const GmDiscontinuity* d) const { return _ac->isDefValue(queryIndex(d)); }
100  bool isFunction(const GmDiscontinuity* d) const { return _ac->isFunction(queryIndex(d)); }
101  QString functionId(const GmDiscontinuity* d) const { return _ac->functionId(queryIndex(d)); }
102 
103 protected:
106  {
107  // We can only log a message if the accessor is a GmValueAccessorBase instance
108  GmValueAccessorBase* bac = dynamic_cast<GmValueAccessorBase*>(_ac);
109  if(bac)
110  gmWarnMsg(bac->_logger, QObject::tr("Discontinuity accessor does not accept function values."));
111  return false;
112  }
113 
115  virtual int queryIndex(const GmDiscontinuity* d) const = 0;
116 };
117 
120 {
121 public:
124 
125 protected:
127  virtual int queryIndex(const GmDiscontinuity* d) const { assert(d); return d->index(); }
128 };
129 
132 {
133 public:
135  GmPropertyDiscontinuityAccessor(GmValueAccessor* ac, int psetIndex) : GmDiscontinuityAccessor(ac), _pset(psetIndex) {}
136 
137 protected:
139  virtual int queryIndex(const GmDiscontinuity* d) const { assert(d); return d->propertyIndex(_pset); }
140 
141 private:
142  int _pset;
143 };
144 
145 
152 {
153 public:
155  : _dim(dim), _unit(desiredUnit), _conv(conv), _convData(NULL)
156  {
157  if(conv)
158  _convData = new GmTLBuffer<double, true>(dim);
159  }
160 
163  {
164  delete _conv;
165  delete _convData;
166  }
167 
173  Unit unit() const { return Unit(_unit); }
174 
176  bool hasUnitConversion() const { return _conv; }
177 
179  int valueSize() const { return _dim; }
180 
191  const double* value(const GmCompact2DSegmentCellIntersection* ci, int i) const
192  {
193  const double* p = ci->rawCartCoord(i);
194  return _conv ? _conv->convertArray(p, _dim, _convData->localBuffer()) : p;
195  }
196 
200  void vectorValue(const GmCompact2DSegmentCellIntersection* ci, int i, GmCRVector& vec) const
201  {
202  vec.setMemory(value(ci, i), valueSize());
203  }
204 
205 private:
206  int _dim;
210 };
211 
212 
213 
214 #endif
215 
virtual int queryIndex(const GmDiscontinuity *d) const
A virtual function that given a cell returns the index that should be accessed.
Definition: gmDiscontinuityAccessor.h:127
A simple accessor used to access 2d segment cell intersection data with possible unit conversion from...
Definition: gmDiscontinuityAccessor.h:151
virtual int queryIndex(const GmDiscontinuity *d) const
A virtual function that given a cell returns the index that should be accessed.
Definition: gmDiscontinuityAccessor.h:139
int index() const
Returns this discontinuity index in the father set.
Definition: gmDiscontinuity.h:42
const double * value(const GmCompact2DSegmentCellIntersection *ci, int i) const
Returns the coordinate value associated with the givenc segment cell intersection object 'ci'....
Definition: gmDiscontinuityAccessor.h:191
GmPropertyDiscontinuityAccessor(GmValueAccessor *ac, int psetIndex)
Constructor. Takes ownership of the accessor.
Definition: gmDiscontinuityAccessor.h:135
bool logUserFunctionError()
Logs an error since discontinuity accessors can not work with functions.
Definition: gmDiscontinuityAccessor.h:105
Class responsible for evaluating a UserFunction over a node / cell.
Definition: gmUserFunction.h:148
void vectorValue(const GmCompact2DSegmentCellIntersection *ci, int i, GmCRVector &vec) const
Similar to value(), but returning the result as a CONST vector. Bear in mind that the resulting vecto...
Definition: gmDiscontinuityAccessor.h:200
GmDiscontinuityAccessor(GmValueAccessor *ac)
Constructor. Takes ownership of the accessor.
Definition: gmDiscontinuityAccessor.h:51
GmTLBuffer< double, true > * _convData
Per thread local buffer used to store converted data. Null if _conv == NULL.
Definition: gmDiscontinuityAccessor.h:209
void setMemory(const double *data, int nlin)
Exchanges the memory area used by the vector. Same caveats explained in the class documentation apply...
Definition: gmVector.h:100
QString tr(const char *sourceText, const char *disambiguation, int n)
int _dim
The coordinate dimension.
Definition: gmDiscontinuityAccessor.h:206
~GmSegmentCell2DIntersectionCoordAccessor()
Destructor.
Definition: gmDiscontinuityAccessor.h:162
Interface class for accessing and setting values from an "indexable" collection of values.
Definition: gmValueAccessor.h:59
bool hasUnitConversion() const
Returns true if this accessor perfroms unit conversions, false if not.
Definition: gmDiscontinuityAccessor.h:176
Declaration of the GmSegmentCellIntersection class & friends.
UnitConverter * _conv
Unit converter.
Definition: gmDiscontinuityAccessor.h:208
The geometric representation for a single discontinuity from the Discontinuity set....
Definition: gmDiscontinuity.h:35
Unit unit() const
Returns the unit in which data returned by the accessor is expressed.
Definition: gmDiscontinuityAccessor.h:173
Extends GmDiscontinuityAccessor to handle property accessors.
Definition: gmDiscontinuityAccessor.h:131
#define GMC_API_EXPORT
Macro for controling if the class is being exported (GEMA_CORE_LIB defined) or imported (GEMA_CORE_LI...
Definition: gmCoreConfig.h:35
An auxiliary vector WRAPPER that binds the vector to a CONST memory area with data already initialize...
Definition: gmVector.h:69
A (much more) compact version of GmSegmentCellIntersection for 2d intersections only....
Definition: gmSegmentCellIntersection.h:105
QString _unit
The unit in which data is being returned.
Definition: gmDiscontinuityAccessor.h:207
int valueSize() const
Returns the size of the array returned by value()
Definition: gmDiscontinuityAccessor.h:179
The GmDiscontinuityAccessor class is a proxy object to a value accesor implementing a more convenient...
Definition: gmDiscontinuityAccessor.h:47
GmAttributeDiscontinuityAccessor(GmValueAccessor *ac)
Constructor. Takes ownership of the accessor.
Definition: gmDiscontinuityAccessor.h:123
virtual int propertyIndex(int propertySet) const
Given a property set number, returns the line of the property set that contains property values for t...
Definition: gmDiscontinuity.h:61
const double * rawCartCoord(int i) const
Same as cartCoord(i) but returning a pointer to the internal buffer. No cdata copy to construct a GmV...
Definition: gmSegmentCellIntersection.h:165
An auxiliary matrix WRAPPER that binds the matrix to a CONST memory area with data already inicialize...
Definition: gmMatrix.h:100
An implementation of basic attributes and functions that should be common for most value accessor imp...
Definition: gmValueAccessor.h:364
Class used to store the definition of a user function and its parameters.
Definition: gmUserFunction.h:78
Implementation of the GmAccessorProxy class Moved from gmCellAccessor.h.
Helper class with common code for several classes that wrap a value accessor, provinding a slitly dif...
Definition: gmAccessorProxy.h:38
Extends GmDiscontinuityAccessor to handle attribute accessors.
Definition: gmDiscontinuityAccessor.h:119
const GmLogCategory & _logger
The logger object used to report errors while accessing or setting data.
Definition: gmValueAccessor.h:407
Declaration of the GmDiscontinuity class.