Mass++ Common Libraries v2.7.5
 All Classes Namespaces Files Functions Variables Enumerations Macros
DataPoints.cpp
Go to the documentation of this file.
1 
12 #include "stdafx.h"
13 #include "DataPoints.h"
14 
15 
16 using namespace kome::core;
17 
18 
19 #include <crtdbg.h>
20 #ifdef _DEBUG
21  #define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )
22  #define malloc( s ) _malloc_dbg( s, _NORMAL_BLOCK, __FILE__, __LINE__ )
23 #endif // _DEBUG
24 
25 
26 
27 #define FIRST_ARRAY_SIZE 256
28 
29 
30 // constructor
31 DataPoints::DataPoints( ArrayType type ) : m_type( type ) {
32  // initialize
33  if( type == FLOAT ) {
34  m_xArray.fltarry = NULL;
35  m_yArray.fltarry = NULL;
36  }
37  else{
38  m_xArray.dblarry = NULL;
39  m_yArray.dblarry = NULL;
40  }
41 
42  // clear
43  onClearPoints();
44 }
45 
46 // copy constructor
47 DataPoints::DataPoints( const DataPoints& dps ) : kome::core::XYData( dps ) {
48  // initialize
49  m_type = dps.m_type;
50  m_length = dps.m_length;
52 
53  // create array
54  if( m_arraySize == 0 ) { // empty array
55  if( m_type == FLOAT ) { // float
56  m_xArray.fltarry = NULL;
57  m_yArray.fltarry = NULL;
58  }
59  else { // double
60  m_xArray.dblarry = NULL;
61  m_yArray.dblarry = NULL;
62  }
63  }
64  else {
65  if( m_type == FLOAT ) { // float
66  m_xArray.fltarry = new float[ m_arraySize ];
67  memcpy( m_xArray.fltarry, dps.m_xArray.fltarry, sizeof( float ) * m_arraySize );
68 
69  m_yArray.fltarry = new float[ m_arraySize ];
70  memcpy( m_yArray.fltarry, dps.m_yArray.fltarry, sizeof( float ) * m_arraySize );
71  }
72  else { // double
73  m_xArray.dblarry = new double[ m_arraySize ];
74  memcpy( m_xArray.dblarry, dps.m_xArray.dblarry, sizeof( double ) * m_arraySize );
75 
76  m_yArray.dblarry = new double[ m_arraySize ];
77  memcpy( m_yArray.dblarry, dps.m_yArray.dblarry, sizeof( double ) * m_arraySize );
78  }
79  }
80 }
81 
82 // destructor
84  onClearPoints();
85 }
86 
87 // substitution operator
89  // initialize
90  m_type = other.m_type;
91  m_length = other.m_length;
92  m_arraySize = other.m_arraySize;
93 
94  // create array
95  if( m_arraySize == 0 ) { // empty array
96  if( m_type == FLOAT ) { // float
97  m_xArray.fltarry = NULL;
98  m_yArray.fltarry = NULL;
99  }
100  else { // double
101  m_xArray.dblarry = NULL;
102  m_yArray.dblarry = NULL;
103  }
104  }
105  else {
106  if( m_type == FLOAT ) { // float
107  m_xArray.fltarry = new float[ m_arraySize ];
108  memcpy( m_xArray.fltarry, other.m_xArray.fltarry, sizeof( float ) * m_arraySize );
109 
110  m_yArray.fltarry = new float[ m_arraySize ];
111  memcpy( m_yArray.fltarry, other.m_yArray.fltarry, sizeof( float ) * m_arraySize );
112  }
113  else { // double
114  m_xArray.dblarry = new double[ m_arraySize ];
115  memcpy( m_xArray.dblarry, other.m_xArray.dblarry, sizeof( double ) * m_arraySize );
116 
117  m_yArray.dblarry = new double[ m_arraySize ];
118  memcpy( m_yArray.dblarry, other.m_yArray.dblarry, sizeof( double ) * m_arraySize );
119  }
120  }
121  return *this;
122 }
123 
124 // get x data array
126  if( m_type == FLOAT ) {
127  return m_xArray.fltarry;
128  }
129  return m_xArray.dblarry;
130 }
131 
132 // get y data array
134  if( m_type == FLOAT ) {
135  return m_yArray.fltarry;
136  }
137  return m_yArray.dblarry;
138 }
139 
140 // clear data points
142  // delete array
143  if( m_type == FLOAT ) {
144  if( m_xArray.fltarry != NULL ) {
145  delete[] m_xArray.fltarry;
146  }
147  if( m_yArray.fltarry != NULL ) {
148  delete[] m_yArray.fltarry;
149  }
150  m_xArray.fltarry = NULL;
151  m_yArray.fltarry = NULL;
152  }
153  else {
154  if( m_xArray.dblarry != NULL ) {
155  delete[] m_xArray.dblarry;
156  }
157  if( m_yArray.dblarry != NULL ) {
158  delete[] m_yArray.dblarry;
159  }
160  m_xArray.dblarry = NULL;
161  m_yArray.dblarry = NULL;
162  }
163 
164  // set size
165  m_arraySize = 0;
166  m_length = 0;
167 }
168 
169 // add point
170 void DataPoints::onAddPoint( const double x, const double y ) {
171  // check array size
172  if( m_length >= m_arraySize ) {
173  changeSize( MAX( FIRST_ARRAY_SIZE, m_arraySize * 2 ) );
174  }
175 
176  // store data
177  if( m_type == FLOAT ) { // float
178  m_xArray.fltarry[ m_length ] = (float)x;
179  m_yArray.fltarry[ m_length ] = (float)y;
180  }
181  else { // double
182  m_xArray.dblarry[ m_length ] = x;
183  m_yArray.dblarry[ m_length ] = y;
184  }
185 
186  // update length
187  m_length++;
188 }
189 
190 // insert point
191 void DataPoints::onInsertPoint( const unsigned int index, const double x, const double y ) {
192  // check array size
193  if( m_length >= m_arraySize ) {
194  changeSize( MAX( FIRST_ARRAY_SIZE, m_arraySize * 2 ) );
195  }
196 
197  // insert
198  int idx = (int)MIN( index, m_length );
199  if( m_type == FLOAT ) { // float
200  // move
201  for( int i = (int)m_length - 1; i >= idx; i-- ) {
202  m_xArray.fltarry[ i + 1 ] = m_xArray.fltarry[ i ];
203  m_yArray.fltarry[ i + 1 ] = m_yArray.fltarry[ i ];
204  }
205 
206  // insert
207  m_xArray.fltarry[ idx ] = (float)x;
208  m_yArray.fltarry[ idx ] = (float)y;
209  }
210  else { // double
211  // move
212  for( int i = (int)m_length - 1; i >= idx; i-- ) {
213  m_xArray.dblarry[ i + 1 ] = m_xArray.dblarry[ i ];
214  m_yArray.dblarry[ i + 1 ] = m_yArray.dblarry[ i ];
215  }
216 
217  // insert
218  m_xArray.dblarry[ idx ] = x;
219  m_yArray.dblarry[ idx ] = y;
220  }
221 
222  // update length
223  m_length++;
224 }
225 
226 // delete point
227 void DataPoints::onDeletePoint( const unsigned int index ) {
228  // length
229  m_length--;
230 
231  // delete
232  if( m_type == FLOAT ) { // float
233  for( unsigned int i = index; i < m_length; i++ ) {
234  m_xArray.fltarry[ i ] = m_xArray.fltarry[ i + 1 ];
235  m_yArray.fltarry[ i ] = m_yArray.fltarry[ i + 1 ];
236  }
237  }
238  else { // double
239  for( unsigned int i = index; i < m_length; i++ ) {
240  m_xArray.dblarry[ i ] = m_xArray.dblarry[ i + 1 ];
241  m_yArray.dblarry[ i ] = m_yArray.dblarry[ i + 1 ];
242  }
243  }
244 }
245 
246 // get the number of points
247 unsigned int DataPoints::onGetLength() {
248  return m_length;
249 }
250 
251 // get x
252 double DataPoints::onGetX( const unsigned int index ) {
253  if( m_type == FLOAT ) {
254  return (double)m_xArray.fltarry[ index ];
255  }
256  return m_xArray.dblarry[ index ];
257 }
258 
259 // get y
260 double DataPoints::onGetY( const unsigned int index ) {
261  if( m_type == FLOAT ) {
262  return (double)m_yArray.fltarry[ index ];
263  }
264  return m_yArray.dblarry[ index ];
265 }
266 
267 // reserve
268 void DataPoints::onReserve( const unsigned int num ) {
269  // necessary size
270  unsigned size = m_length + num;
271 
272  // change size
273  if( size > m_arraySize ) {
274  changeSize( size );
275  }
276 }
277 
278 // change the size of data array
279 void DataPoints::changeSize( const unsigned int size ) {
280  // check size
281  if( m_arraySize == size ) {
282  return;
283  }
284  if( size == 0 ) {
285  onClearPoints();
286  return;
287  }
288 
289  // the number of points to be copied
290  unsigned copyNum = MIN( size, m_length );
291 
292  // create new array and copy data
293  if( m_type == FLOAT ) { // float
294  // create array
295  float* xArray = new float[ size ];
296  float* yArray = new float[ size ];
297 
298  // copy
299  if( copyNum > 0 ) {
300  unsigned int copySize = copyNum * sizeof( float );
301  memcpy( xArray, m_xArray.fltarry, copySize );
302  memcpy( yArray, m_yArray.fltarry, copySize );
303  }
304 
305  // delete
306  if( m_xArray.fltarry != NULL ) {
307  delete[] m_xArray.fltarry;
308  }
309  m_xArray.fltarry = xArray;
310 
311  if( m_yArray.fltarry != NULL ) {
312  delete[] m_yArray.fltarry;
313  }
314  m_yArray.fltarry = yArray;
315  }
316  else { // double
317  // create array
318  double* xArray = new double[ size ];
319  double* yArray = new double[ size ];
320 
321  // copy
322  if( copyNum > 0 ) {
323  unsigned int copySize = copyNum * sizeof( double );
324  memcpy( xArray, m_xArray.dblarry, copySize );
325  memcpy( yArray, m_yArray.dblarry, copySize );
326  }
327 
328  // delete
329  if( m_xArray.dblarry != NULL ) {
330  delete[] m_xArray.dblarry;
331  }
332  m_xArray.dblarry = xArray;
333 
334  if( m_yArray.dblarry != NULL ) {
335  delete[] m_yArray.dblarry;
336  }
337  m_yArray.dblarry = yArray;
338  }
339 
340  // array size
341  m_arraySize = size;
342 }
abstraction class of two dimention coordinate data
Definition: XYData.h:34
DataPoints(ArrayType type=DOUBLE)
constructor
Definition: DataPoints.cpp:31
data points data of profile management class
Definition: DataPoints.h:25
virtual double onGetX(const unsigned int index)
This method is called by getX method. (override method)
Definition: DataPoints.cpp:252
virtual void onInsertPoint(const unsigned int index, const double x, const double y)
This method is called by insertPoint method. (override method)
Definition: DataPoints.cpp:191
virtual unsigned int onGetLength()
this method is called by getLength method (override method)
Definition: DataPoints.cpp:247
virtual void onDeletePoint(const unsigned int index)
This method is called by deletePoint method. (override method)
Definition: DataPoints.cpp:227
void * getYData()
gets the pointer of y data array
Definition: DataPoints.cpp:133
ArrayType
the type of array
Definition: DataPoints.h:31
virtual void onReserve(const unsigned int num)
This method is called by reserve method. (override method)
Definition: DataPoints.cpp:268
unsigned int m_length
Definition: DataPoints.h:89
void changeSize(const unsigned int size)
change the array of data
Definition: DataPoints.cpp:279
unsigned int m_arraySize
Definition: DataPoints.h:86
#define MIN(x, y)
Definition: CoreMacros.h:30
#define NULL
Definition: CoreMacros.h:18
virtual double onGetY(const unsigned int index)
This method is called by getY method. (override method)
Definition: DataPoints.cpp:260
void * getXData()
gets the pointer of x data array
Definition: DataPoints.cpp:125
#define MAX(x, y)
Definition: CoreMacros.h:27
DataPoints & operator=(const DataPoints &other)
substitution operator
Definition: DataPoints.cpp:88
virtual ~DataPoints()
destructor
Definition: DataPoints.cpp:83
virtual void onClearPoints()
This method is called by clearPoints method. (override method)
Definition: DataPoints.cpp:141
virtual void onAddPoint(const double x, const double y)
This method is called by addPoint method. (override method)
Definition: DataPoints.cpp:170
interfaces of DataPoints class