xsi_iceattributedataarray.h Source File
 
 
 
xsi_iceattributedataarray.h
Go to the documentation of this file.
00001 //*****************************************************************************
00011 //*****************************************************************************
00012 
00013 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00014 #pragma once
00015 #endif
00016 
00017 #ifndef __XSIICEATTRIBUTEDATAARRAY_H__
00018 #define __XSIICEATTRIBUTEDATAARRAY_H__
00019 
00020 #include <sicppsdk.h>
00021 #include <xsi_iceattribute.h>
00022 #include <xsi_vector2f.h>
00023 #include <xsi_vector3f.h>
00024 #include <xsi_vector4f.h>
00025 #include <xsi_quaternionf.h>
00026 #include <xsi_rotationf.h>
00027 #include <xsi_matrix3f.h>
00028 #include <xsi_matrix4f.h>
00029 #include <xsi_color4f.h>
00030 #include <xsi_shape.h>
00031 #include <xsi_indexset.h>
00032 #include <xsi_bitarray.h>
00033 
00034 namespace XSI {
00035 
00036 //*****************************************************************************
00069 //*****************************************************************************
00070 
00071 class SICPPSDKDECL CBaseICEAttributeDataArray
00072 {
00073 public:
00074         friend class ICEAttribute;
00075 
00076         CBaseICEAttributeDataArray( XSI::siICENodeDataType in_dataType, XSI::siICENodeStructureType in_structType )
00077                 :       m_nCount(0),
00078                         m_bIsConstant(false),
00079                         m_nAccessIndex(UINT_MAX),
00080                         m_nHandle(ULONG_MAX),
00081                         m_pData(NULL),
00082                         m_structType( in_structType ),
00083                         m_dataType( in_dataType ),
00084                         m_pParent(NULL)
00085         {}
00086 
00090         ULONG GetCount() const
00091         {
00092                 return m_nCount;
00093         }
00094 
00098         bool IsConstant() const
00099         {
00100                 return m_bIsConstant;
00101         }
00102 
00106         XSI::siICENodeDataType GetDataType() const
00107         {
00108                 return m_dataType;
00109         }
00110 
00114         XSI::siICENodeStructureType GetStructureType() const
00115         {
00116                 return m_pParent ? m_pParent->GetStructureType( ) : m_structType;
00117         }
00118 
00119         virtual ~CBaseICEAttributeDataArray()
00120         {
00121                 m_attrib.ReleaseDataArray( *this );
00122         }
00123 
00124 protected:
00125         const void* GetDataPtr( ) const
00126         {
00127                 return (const void*)m_pData;
00128         }
00129 
00130         ULONG GetHandle() const
00131         {
00132                 return m_pParent ? m_pParent->GetHandle( ) : m_nHandle;
00133         }
00134 
00135         ULONG GetAccessIndex() const
00136         {
00137                 return m_pParent ? m_pParent->GetAccessIndex( ) : m_nAccessIndex;
00138         }
00139 
00140         void*& GetDataRef( )
00141         {
00142                 return m_pData;
00143         }
00144 
00145         ULONG& GetHandleRef()
00146         {
00147                 return m_nHandle;
00148         }
00149 
00150         ULONG& GetCountRef()
00151         {
00152                 return m_nCount;
00153         }
00154 
00155         ICEAttribute& GetICEAttributeRef()
00156         {
00157                 return m_attrib;
00158         }
00159 
00160         const ICEAttribute& GetICEAttributeRef() const
00161         {
00162                 return m_attrib;
00163         }
00164 
00165         CBitsetHelper& GetBitsetRef()
00166         {
00167                 return m_bitset;
00168         }
00169 
00170         bool& GetConstantRef()
00171         {
00172                 return m_bIsConstant;
00173         }
00174 
00175         void SetParent( CBaseICEAttributeDataArray* in_pParent )
00176         {
00177                 m_pParent = in_pParent;
00178         }
00179 
00180         const CBaseICEAttributeDataArray* GetParent() const
00181         {
00182                 return m_pParent;
00183         }
00184 
00185         CBaseICEAttributeDataArray* GetParent()
00186         {
00187                 return m_pParent;
00188         }
00189 
00190         ULONG& GetAccessIndexRef()
00191         {
00192                 return m_nAccessIndex;
00193         }
00194 
00195         const ULONG& GetAccessIndexRef() const
00196         {
00197                 return m_nAccessIndex;
00198         }
00199 
00200 
00201 protected:
00202         CStatus SetSubArrayElement( CBaseICEAttributeDataArray& in_dataArray2D, ULONG in_arrayIndex, ULONG in_subArrayIndex, void* in_value, ULONG in_size )
00203         {
00204                 return m_attrib.SetArrayElementInternal( in_dataArray2D, in_arrayIndex, in_subArrayIndex, in_value, in_size );
00205         }
00206 
00207         CStatus GetSubArrayElement( const CBaseICEAttributeDataArray& in_dataArray2D, ULONG in_arrayIndex, ULONG in_subArrayIndex, void** out_value, ULONG& out_nSize ) const
00208         {
00209                 return m_attrib.GetArrayElementInternal(  in_dataArray2D, in_arrayIndex, in_subArrayIndex, out_value, out_nSize );
00210         }
00211 
00212         CStatus GetSubDataArray( ULONG in_index, CBaseICEAttributeDataArray& out_dataArray ) const
00213         {
00214                 CStatus st = m_attrib.GetSubDataArray( *(CBaseICEAttributeDataArray*)this, in_index, out_dataArray );
00215                 assert( st == CStatus::OK );
00216                 return st;
00217         }
00218 
00219         CStatus SetSubDataArray( CBaseICEAttributeDataArray& io_dataArray2D, CBaseICEAttributeDataArray* io_pSubDataArray, ULONG in_index, void* in_pData, ULONG in_count )
00220         {
00221                 return m_attrib.SetSubDataArray(io_dataArray2D, io_pSubDataArray, in_index, in_pData, in_count);
00222         }
00223 
00224         CStatus SetStringSubDataArray( CBaseICEAttributeDataArray& io_dataArray2D, CBaseICEAttributeDataArray* io_pSubDataArray, ULONG in_index, const wchar_t** in_ppData, ULONG in_count )
00225         {
00226                 CStatus st = m_attrib.SetStringSubDataArray(io_dataArray2D, io_pSubDataArray, in_index, in_ppData, in_count);
00227                 assert( st == CStatus::OK );
00228                 return st;
00229         }
00230 
00231         CStatus SetCustomTypeSubDataArray( CBaseICEAttributeDataArray& in_dataArray2D, CBaseICEAttributeDataArray* io_pSubDataArray, ULONG in_index, const unsigned char** in_ppData, ULONG in_count, ULONG in_fixedElemSize )
00232         {
00233                 CStatus st = m_attrib.SetCustomTypeSubDataArray( in_dataArray2D, io_pSubDataArray, in_index, in_ppData, in_count, in_fixedElemSize);
00234                 assert( st == CStatus::OK );
00235                 return st;
00236         }
00237 
00238         CStatus SetCustomTypeSubDataArray( CBaseICEAttributeDataArray& in_dataArray2D, CBaseICEAttributeDataArray* io_pSubDataArray, ULONG in_index, const unsigned char** in_ppData, ULONG in_count, ULONG* in_pElemSizes )
00239         {
00240                 CStatus st = m_attrib.SetCustomTypeSubDataArray(in_dataArray2D, io_pSubDataArray, in_index, in_ppData, in_count, in_pElemSizes);
00241                 assert( st == CStatus::OK );
00242                 return st;
00243         }
00244 
00245 
00246         CStatus SetBoolSubDataArray( CBaseICEAttributeDataArray& io_dataArray2D, CBaseICEAttributeDataArray* io_pSubDataArray, ULONG in_offset, const XSI::CBitArray& in_bitArray )
00247         {
00248                 return m_attrib.SetBoolSubDataArray(io_dataArray2D, io_pSubDataArray, in_offset, in_bitArray );
00249         }
00250 
00251         CStatus ResizeSubDataArray( CBaseICEAttributeDataArray& in_dataArray2D, ULONG in_index, ULONG in_size, CBaseICEAttributeDataArray& out_dataArray )
00252         {
00253                 if( m_attrib.IsReadonly() )
00254                         return CStatus::AccessDenied; 
00255 
00256                 CStatus st = m_attrib.ResizeSubDataArray(in_dataArray2D, in_index, in_size, out_dataArray );
00257                 assert( st == CStatus::OK );
00258                 return st;
00259         }
00260 
00261         CStatus SetDataArray2D( ULONG in_offset, void* in_pData, ULONG in_nbSubArrays, ULONG* in_pSubArraySizes )
00262         {
00263                 return m_attrib.SetDataArrayInternal( *(CBaseICEAttributeDataArray*)this, NULL, in_offset, in_pData, in_nbSubArrays, in_pSubArraySizes, true );
00264         }
00265 
00266 
00267         CStatus SetStringDataArray2D( ULONG in_offset, const wchar_t*** in_pppData, ULONG in_count, ULONG* in_pSubArraySizes )
00268         {
00269                 return m_attrib.SetCharDataArrayInternal( *(CBaseICEAttributeDataArray*)this, NULL, in_offset, in_pppData, in_count, in_pSubArraySizes, NULL, 0, true );
00270         }
00271 
00272         CStatus SetCustomTypeDataArray2D( ULONG in_offset, const unsigned char*** in_pppData, ULONG in_count, ULONG* in_pSubArraySizes, ULONG** in_ppElemSizes )
00273         {
00274                 return m_attrib.SetCharDataArrayInternal( *(CBaseICEAttributeDataArray*)this, NULL, in_offset, in_pppData, in_count, in_pSubArraySizes, in_ppElemSizes, 0, true );
00275         }
00276 
00277         CStatus SetCustomTypeDataArray2D( ULONG in_offset, const unsigned char*** in_pppData, ULONG in_count, ULONG* in_pSubArraySizes, ULONG in_fixedElemSize )
00278         {
00279                 return m_attrib.SetCharDataArrayInternal( *(CBaseICEAttributeDataArray*)this, NULL, in_offset, in_pppData, in_count, in_pSubArraySizes, NULL, in_fixedElemSize, true );
00280         }
00281 
00282         CStatus GetCustomTypeData( ULONG in_index, const unsigned char** out_ppData, ULONG& out_nSize ) const
00283         {
00284                 if ( GetStructureType() == XSI::siICENodeStructureSingle )
00285                 {
00286                         return m_attrib.GetCustomTypeData( (CBaseICEAttributeDataArray&)*this, in_index, out_ppData, out_nSize );
00287                 }
00288                 return m_attrib.GetCustomTypeData2D( *(CBaseICEAttributeDataArray*)GetParent(), GetAccessIndexRef(), in_index, out_ppData, out_nSize );
00289         }
00290 
00291         CStatus GetStringData( ULONG in_index, const wchar_t** out_ppData, ULONG& out_nSize ) const
00292         {
00293                 if ( GetStructureType() == XSI::siICENodeStructureSingle )
00294                 {
00295                         return m_attrib.GetStringData( (CBaseICEAttributeDataArray&)*this, in_index, out_ppData, out_nSize );
00296                 }
00297                 return m_attrib.GetStringData2D( *(CBaseICEAttributeDataArray*)GetParent(), GetAccessIndexRef(), in_index, out_ppData, out_nSize );
00298         }
00299 
00300         CStatus SetStringData( ULONG in_index, const wchar_t* in_pData, ULONG in_size )
00301         {
00302                 if ( GetStructureType() == XSI::siICENodeStructureSingle )
00303                 {
00304                         return m_attrib.SetStringData( (CBaseICEAttributeDataArray&)*this, in_index, in_pData, in_size );
00305                 }
00306                 return m_attrib.SetStringData2D( *(CBaseICEAttributeDataArray*)GetParent(), GetAccessIndexRef(), in_index, in_pData, in_size );
00307         }
00308 
00309         CStatus SetArrayElement( ULONG in_index, void* in_value, ULONG in_size )
00310         {
00311                 return m_attrib.SetArrayElementInternal(  (CBaseICEAttributeDataArray&)*this, in_index, ULONG_MAX, in_value, in_size );
00312         }
00313 
00314         CStatus GetArrayElement( ULONG in_index, void** out_value, ULONG& out_nSize ) const
00315         {
00316                 return m_attrib.GetArrayElementInternal(  (CBaseICEAttributeDataArray&)*this, in_index, ULONG_MAX, out_value, out_nSize );
00317         }
00318 
00319         CStatus SetDataArray( ULONG in_offset, void* in_pData, ULONG in_count )
00320         {
00321                 return m_attrib.SetDataArrayInternal( (CBaseICEAttributeDataArray&)*this, NULL, in_offset, in_pData, in_count, NULL, false );
00322         }
00323 
00324         CStatus SetStringDataArray( ULONG in_offset, const wchar_t** in_ppData, ULONG in_count )
00325         {
00326                 return m_attrib.SetCharDataArrayInternal( (CBaseICEAttributeDataArray&)*this, NULL, in_offset, in_ppData, in_count, NULL, NULL, 0, false );
00327         }
00328 
00329 
00330         CStatus SetCustomTypeDataArray( ULONG in_offset, const unsigned char** in_ppData, ULONG in_count, ULONG in_fixedElemSize )
00331         {
00332                 return m_attrib.SetCharDataArrayInternal( (CBaseICEAttributeDataArray&)*this, NULL, in_offset, in_ppData, in_count, NULL, NULL, in_fixedElemSize, false );
00333         }
00334 
00335         CStatus SetCustomTypeDataArray( ULONG in_offset, const unsigned char** in_ppData, ULONG in_count, ULONG* in_pElementSizes )
00336         {
00337                 return m_attrib.SetCharDataArrayInternal( (CBaseICEAttributeDataArray&)*this, NULL, in_offset, in_ppData, in_count, NULL, in_pElementSizes, 0, false );
00338         }
00339 
00340 
00341         CStatus SetBoolDataArray( ULONG in_offset, const XSI::CBitArray& in_bitArray )
00342         {
00343                 return m_attrib.SetBoolDataArray( (CBaseICEAttributeDataArray&)*this, in_offset, in_bitArray );
00344         }
00345 
00346 
00347         ULONG                   m_nCount;
00348         CBitsetHelper   m_bitset;
00349         bool                    m_bIsConstant;
00350 
00351 private:
00352         ULONG                                           m_nAccessIndex;
00353         ULONG                                           m_nHandle;
00354         void*                                           m_pData;
00355         XSI::siICENodeStructureType     m_structType;
00356         XSI::siICENodeDataType          m_dataType;
00357         ICEAttribute                            m_attrib;
00358         CBaseICEAttributeDataArray*     m_pParent;
00359 };
00360 
00361 //*****************************************************************************
00422 //*****************************************************************************
00423 template<class T>
00424 class CICEAttributeDataArray : public CBaseICEAttributeDataArray
00425 {
00426 public:
00427 
00429         CICEAttributeDataArray( ) : CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle ) {}
00430 
00432         ~CICEAttributeDataArray( ) {}
00433 
00439         const T& operator[]( ULONG in_index ) const
00440         {
00441                 if (in_index >=  GetCount() ) 
00442                 {
00443                         static T defVal;
00444                         return defVal;
00445                 }
00446 
00447                 const T* pData = GetDataAccessor(in_index);
00448                 return *pData;
00449         }
00450 
00457         T& operator[]( ULONG in_index )
00458         {
00459                 if (in_index >=  GetCount() || GetICEAttributeRef().IsReadonly() ) 
00460                 {
00461                         static T defVal;
00462                         return defVal;
00463                 }
00464 
00465                 T* pData = (T*)GetDataAccessor(in_index);
00466                 return *pData;
00467         }
00468 
00478         CStatus SetData( ULONG in_index, const T& in_value );
00479 
00532         CStatus SetArray( const T* in_pArray, ULONG in_count );
00533 
00534 private:
00535         static XSI::siICENodeDataType GetDefaultType( );
00536         const T* GetDataAccessor(ULONG in_index) const;
00537 
00538 };
00539 
00540 //*****************************************************************************
00541 // NB: Do not use the Doxygen \class tag for this template!!!
00546 //*****************************************************************************
00547 template<>
00548 class SICPPSDKDECL CICEAttributeDataArray<bool> : public CBaseICEAttributeDataArray
00549 {
00550 public:
00552         CICEAttributeDataArray<bool>( ) :
00553                 CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle )
00554         {}
00555 
00557         ~CICEAttributeDataArray<bool>( ) {}
00558 
00564         const bool operator[]( ULONG in_index ) const;
00565 
00566 
00575         CStatus SetData( ULONG in_index, bool in_bVal );
00576 
00586         CStatus SetArray( const bool* in_pArray, ULONG in_count );
00587 
00588 private:
00589         static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( )
00590         {
00591                 return siICENodeDataBool;
00592         }
00593 };
00594 
00595 //*****************************************************************************
00630 //*****************************************************************************
00631 
00632 class SICPPSDKDECL CICEAttributeDataArrayCustomType : public CBaseICEAttributeDataArray
00633 {
00634         public:
00635         typedef unsigned char TData;
00636 
00639         SICPPSDK_INLINE CICEAttributeDataArrayCustomType( ) : CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle )
00640         {}
00641 
00644         SICPPSDK_INLINE ~CICEAttributeDataArrayCustomType( )
00645         {}
00646 
00656         SICPPSDK_INLINE CStatus GetData( ULONG in_index, const TData** out_ppData, ULONG& out_nSize  ) const;
00657 
00854         CStatus SetArray( const TData** in_ppData, ULONG in_count, ULONG in_fixedElemSize );
00855 
00866         CStatus SetArray( const TData** in_ppData, ULONG in_count, ULONG* in_pElementSizes );
00867 
00868 private:
00869         static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( )
00870         {
00871                 return siICENodeDataCustomType;
00872         }
00873 };
00874 
00875 CStatus CICEAttributeDataArrayCustomType::GetData( ULONG in_index, const TData** out_ppData, ULONG& out_nSize  ) const
00876 {
00877         return GetCustomTypeData( in_index, out_ppData, out_nSize );
00878 }
00879 
00880 //*****************************************************************************
00914 //*****************************************************************************
00915 
00916 class SICPPSDKDECL CICEAttributeDataArrayString : public CBaseICEAttributeDataArray
00917 {
00918         public:
00919         typedef wchar_t TData;
00920 
00923         SICPPSDK_INLINE CICEAttributeDataArrayString( ) : CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle )
00924         {}
00925 
00928         SICPPSDK_INLINE ~CICEAttributeDataArrayString( )
00929         {}
00930 
00943         SICPPSDK_INLINE CStatus GetData( ULONG in_index, const TData** out_ppStr, ULONG& out_nCount ) const;
00944 
00950         SICPPSDK_INLINE CStatus GetData( ULONG in_index, CString& out_str ) const;
00951 
00960         SICPPSDK_INLINE CStatus SetData( ULONG in_index, const CString& in_str );
00961 
00967         SICPPSDK_INLINE CString operator[]( ULONG in_index ) const;
00968 
01029         CStatus SetArray( const TData** in_ppData, ULONG in_count );
01030 
01031 private:
01032         static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( )
01033         {
01034                 return siICENodeDataString;
01035         }
01036 };
01037 
01038 CStatus CICEAttributeDataArrayString::GetData( ULONG in_index, const TData** out_ppStr, ULONG& out_nCount ) const
01039 {
01040         if( in_index >=  GetCount() )
01041                 return CStatus::InvalidArgument; 
01042 
01043         const ICEAttribute& attr = GetICEAttributeRef();
01044 
01045         return GetStringData( in_index, out_ppStr, out_nCount );
01046 }
01047 
01048 SICPPSDK_INLINE CStatus CICEAttributeDataArrayString::GetData( ULONG in_index, CString& out_str ) const
01049 {
01050         const wchar_t* pzStr;
01051         ULONG nSize;
01052         CStatus st = GetStringData( in_index, &pzStr, nSize );
01053         if (st == CStatus::OK)
01054                 out_str = CString( pzStr, nSize );
01055         return st;
01056 }
01057 
01058 SICPPSDK_INLINE CStatus CICEAttributeDataArrayString::SetData( ULONG in_index, const CString& in_str )
01059 {
01060         if( in_index >=  GetCount() )
01061                 return CStatus::InvalidArgument; 
01062 
01063         const ICEAttribute& attr = GetICEAttributeRef();
01064         if( attr.IsReadonly() )
01065                 return CStatus::AccessDenied; 
01066 
01067         return CBaseICEAttributeDataArray::SetStringData( in_index, in_str.GetWideString(), in_str.Length() );
01068 }
01069 
01070 SICPPSDK_INLINE CString CICEAttributeDataArrayString::operator[]( ULONG i ) const
01071 {
01072         CString str;
01073         CStatus st = GetData( i, str );
01074         assert( st == CStatus::OK );
01075         return str;
01076 }
01077 
01155 typedef XSI::CICEAttributeDataArray< float > CICEAttributeDataArrayFloat;
01156 typedef XSI::CICEAttributeDataArray< LONG > CICEAttributeDataArrayLong;
01157 typedef XSI::CICEAttributeDataArray< bool > CICEAttributeDataArrayBool;
01158 typedef XSI::CICEAttributeDataArray< XSI::MATH::CVector2f > CICEAttributeDataArrayVector2f;
01159 typedef XSI::CICEAttributeDataArray< XSI::MATH::CVector3f > CICEAttributeDataArrayVector3f;
01160 typedef XSI::CICEAttributeDataArray< XSI::MATH::CVector4f > CICEAttributeDataArrayVector4f;
01161 typedef XSI::CICEAttributeDataArray< XSI::MATH::CQuaternionf > CICEAttributeDataArrayQuaternionf;
01162 typedef XSI::CICEAttributeDataArray< XSI::MATH::CRotationf > CICEAttributeDataArrayRotationf;
01163 typedef XSI::CICEAttributeDataArray< XSI::MATH::CMatrix3f > CICEAttributeDataArrayMatrix3f;
01164 typedef XSI::CICEAttributeDataArray< XSI::MATH::CMatrix4f > CICEAttributeDataArrayMatrix4f;
01165 typedef XSI::CICEAttributeDataArray< XSI::MATH::CColor4f > CICEAttributeDataArrayColor4f;
01166 typedef XSI::CICEAttributeDataArray< XSI::MATH::CShape> CICEAttributeDataArrayShape;
01167 
01168 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayFloat::GetDefaultType( ){return siICENodeDataFloat;}
01169 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayLong::GetDefaultType( ){return siICENodeDataLong;}
01170 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayVector2f::GetDefaultType( ){return siICENodeDataVector2;}
01171 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayVector3f::GetDefaultType( ){return siICENodeDataVector3;}
01172 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayVector4f::GetDefaultType( ){return siICENodeDataVector4;}
01173 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayQuaternionf::GetDefaultType( ){return siICENodeDataQuaternion;}
01174 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayMatrix3f::GetDefaultType( ){return siICENodeDataMatrix33;}
01175 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayMatrix4f::GetDefaultType( ){return siICENodeDataMatrix44;}
01176 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayColor4f::GetDefaultType( ){return siICENodeDataColor4;}
01177 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayRotationf::GetDefaultType( ){return siICENodeDataRotation;}
01178 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayShape::GetDefaultType( ){return siICENodeDataShape;}
01179 
01180 };
01181 
01182 #endif // __XSIICEATTRIBUTEDATAARRAY_H__