chore: KDIS datatypes
[KDIS.git] / KDIS / DataTypes / GridAxisIrregular.cpp
blob3e8274a3b4f36a0fc91f167364988192a8dc4169
1 /*********************************************************************
2 Copyright 2013 Karl Jones
3 All rights reserved.
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
8 1. Redistributions of source code must retain the above copyright notice, this
9 list of conditions and the following disclaimer.
10 2. Redistributions in binary form must reproduce the above copyright notice,
11 this list of conditions and the following disclaimer in the documentation
12 and/or other materials provided with the distribution.
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 For Further Information Please Contact me at
26 Karljj1@yahoo.com
27 http://p.sf.net/kdis/UserGuide
28 *********************************************************************/
30 #include "./GridAxisIrregular.h"
32 using namespace std;
33 using namespace KDIS;
34 using namespace DATA_TYPE;
36 //////////////////////////////////////////////////////////////////////////
37 // protected:
38 //////////////////////////////////////////////////////////////////////////
40 void GridAxisIrregular::calculatePadding()
42 // Calculate padding needed to be on a 64 bit boundary.
43 m_vui16Padding.clear();
44 KUINT8 NumPadding = m_ui16NumPoints % 4;
46 // Add the padding
47 KUINT16 Padding = 0;
48 for( KUINT8 i = 0; i < NumPadding; ++i )
50 m_vui16Padding.push_back( Padding );
54 //////////////////////////////////////////////////////////////////////////
55 // Public:
56 //////////////////////////////////////////////////////////////////////////
58 GridAxisIrregular::GridAxisIrregular() :
59 m_f64CoordScaleXi( 0 ),
60 m_f64CoordOffsetXi( 0 )
64 //////////////////////////////////////////////////////////////////////////
66 GridAxisIrregular::GridAxisIrregular( KDataStream & stream )
68 Decode( stream );
71 //////////////////////////////////////////////////////////////////////////
73 GridAxisIrregular::GridAxisIrregular( KFLOAT64 InitialXi, KFLOAT64 FinalXi, KUINT16 PointsXi, KUINT8 InterleafFactor,
74 KUINT8 AxisType, KDataStream & stream ) :
75 GridAxisRegular( InitialXi, FinalXi, PointsXi, InterleafFactor, AxisType, stream )
77 stream >> m_f64CoordScaleXi
78 >> m_f64CoordOffsetXi;
80 KUINT16 ui16TmpVal = 0;
81 for( KUINT16 i = 0; i < m_ui16NumPoints; ++i )
83 stream >> ui16TmpVal;
84 m_vXiValues.push_back( ui16TmpVal );
87 // Calculate the padding that needs to be extracted. 64 bit boundary
88 KUINT8 NumPadding = m_ui16NumPoints % 4;
89 for( KUINT8 i = 0; i < NumPadding; ++i )
91 stream >> ui16TmpVal;
92 m_vui16Padding.push_back( ui16TmpVal );
96 //////////////////////////////////////////////////////////////////////////
98 GridAxisIrregular::GridAxisIrregular( KFLOAT64 InitialXi, KFLOAT64 FinalXi, KUINT16 PointsXi, KUINT8 InterleafFactor,
99 KUINT8 AxisType, KUINT16 InitialIndexXi, KFLOAT64 CoordinateScaleXi,
100 KFLOAT64 CoordinateOffsetXi, const vector<KUINT16> & XiValues ) :
101 GridAxisRegular( InitialXi, FinalXi, PointsXi, InterleafFactor, AxisType, XiValues.size(), InitialIndexXi ),
102 m_f64CoordScaleXi( CoordinateScaleXi ),
103 m_f64CoordOffsetXi( CoordinateOffsetXi ),
104 m_vXiValues( XiValues )
106 calculatePadding();
109 //////////////////////////////////////////////////////////////////////////
111 GridAxisIrregular::~GridAxisIrregular()
115 //////////////////////////////////////////////////////////////////////////
117 void GridAxisIrregular::SetCoordinateScaleXi( KFLOAT64 Xi )
119 m_f64CoordScaleXi = Xi;
122 //////////////////////////////////////////////////////////////////////////
124 KFLOAT64 GridAxisIrregular::GetCoordinateScaleXi() const
126 return m_f64CoordScaleXi;
129 //////////////////////////////////////////////////////////////////////////
131 void GridAxisIrregular::SetCoordinateOffsetXi( KFLOAT64 Xi )
133 m_f64CoordOffsetXi = Xi;
136 //////////////////////////////////////////////////////////////////////////
138 KFLOAT64 GridAxisIrregular::GetCoordinateOffsetXi() const
140 return m_f64CoordOffsetXi;
143 //////////////////////////////////////////////////////////////////////////
145 void GridAxisIrregular::AddXiValue( KUINT16 Xi )
147 m_vXiValues.push_back( Xi );
148 m_ui16NumPoints = m_vXiValues.size();
149 calculatePadding();
152 //////////////////////////////////////////////////////////////////////////
154 void GridAxisIrregular::SetXiValues( const std::vector<KUINT16> & Xi )
156 m_vXiValues = Xi;
157 m_ui16NumPoints = m_vXiValues.size();
158 calculatePadding();
161 //////////////////////////////////////////////////////////////////////////
163 const std::vector<KUINT16> & GridAxisIrregular::GetXiValues() const
165 return m_vXiValues;
168 //////////////////////////////////////////////////////////////////////////
170 void GridAxisIrregular::ClearXiValues()
172 m_vXiValues.clear();
173 m_ui16NumPoints = 0;
174 calculatePadding();
177 //////////////////////////////////////////////////////////////////////////
179 KBOOL GridAxisIrregular::IsGridRegular() const
181 return false;
184 //////////////////////////////////////////////////////////////////////////
186 KUINT16 GridAxisIrregular::GetLength()
188 KUINT16 ui16Length = GRID_AXIS_IRREGULAR;
189 ui16Length += m_vXiValues.size() * 2;
190 ui16Length += m_vui16Padding.size() * 2;
191 return ui16Length;
194 //////////////////////////////////////////////////////////////////////////
196 KString GridAxisIrregular::GetAsString() const
198 KStringStream ss;
200 ss << "Grid Axis Irregular:"
201 << "\n\tDomain Initial Xi: " << m_f64DomainInitialXi
202 << "\n\tDomain Final Xi: " << m_f64DomainFinalXi
203 << "\n\tDomain Points Xi: " << m_ui16DomainPointsXi
204 << "\n\tInterleaf Factor: " << ( KUINT16 )m_ui8InterleafFactor
205 << "\n\tAxis Type: " << ( KUINT16 )m_ui8AxisType
206 << "\n\tNumber Of Points: " << m_ui16NumPoints
207 << "\n\tInitial Index: " << m_ui16InitialIndex
208 << "\n\tCoordinate Scale Xi: " << m_f64CoordScaleXi
209 << "\n\tCoordinate Offset Xi: " << m_f64CoordOffsetXi
210 << "\n\tXi Values:";
212 vector<KUINT16>::const_iterator citr = m_vXiValues.begin();
213 vector<KUINT16>::const_iterator citrEnd = m_vXiValues.end();
215 for( ; citr != citrEnd; ++citr )
217 ss << "\n\t" << *citr;
220 ss << "\n";
222 return ss.str();
225 //////////////////////////////////////////////////////////////////////////
227 void GridAxisIrregular::Decode( KDataStream & stream )
229 if( stream.GetBufferSize() < GRID_AXIS_IRREGULAR )throw KException( __FUNCTION__, NOT_ENOUGH_DATA_IN_BUFFER );
231 m_vXiValues.clear();
232 m_vui16Padding.clear();
234 GridAxisRegular::Decode( stream );
236 stream >> m_f64CoordScaleXi
237 >> m_f64CoordOffsetXi;
239 KUINT16 ui16TmpVal = 0;
240 for( KUINT16 i = 0; i < m_ui16NumPoints; ++i )
242 stream >> ui16TmpVal;
243 m_vXiValues.push_back( ui16TmpVal );
246 // Calculate the padding that needs to be extracted. 64 bit boundary
247 KUINT8 NumPadding = m_ui16NumPoints % 4;
248 for( KUINT8 i = 0; i < NumPadding; ++i )
250 stream >> ui16TmpVal;
251 m_vui16Padding.push_back( ui16TmpVal );
255 //////////////////////////////////////////////////////////////////////////
257 KDataStream GridAxisIrregular::Encode() const
259 KDataStream stream;
261 GridAxisIrregular::Encode( stream );
263 return stream;
266 //////////////////////////////////////////////////////////////////////////
268 void GridAxisIrregular::Encode( KDataStream & stream ) const
270 GridAxisRegular::Encode( stream );
272 stream << m_f64CoordScaleXi
273 << m_f64CoordOffsetXi;
275 vector<KUINT16>::const_iterator citr = m_vXiValues.begin();
276 vector<KUINT16>::const_iterator citrEnd = m_vXiValues.end();
278 for( ; citr != citrEnd; ++citr )
280 stream << *citr;
283 // Padding
284 citr = m_vui16Padding.begin();
285 citrEnd = m_vui16Padding.end();
287 for( ; citr != citrEnd; ++citr )
289 stream << *citr;
293 //////////////////////////////////////////////////////////////////////////
295 KBOOL GridAxisIrregular::operator == ( const GridAxisIrregular & Value ) const
297 if( GridAxisRegular::operator != ( Value ) ) return false;
298 if( m_f64CoordScaleXi != Value.m_f64CoordScaleXi ) return false;
299 if( m_f64CoordOffsetXi != Value.m_f64CoordOffsetXi ) return false;
300 if( m_vXiValues != Value.m_vXiValues ) return false;
301 return true;
304 //////////////////////////////////////////////////////////////////////////
306 KBOOL GridAxisIrregular::operator != ( const GridAxisIrregular & Value ) const
308 return !( *this == Value );
311 //////////////////////////////////////////////////////////////////////////