xsi_dataarray2D.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 __XSIDATAARRAY2D_H__
    00018 #define __XSIDATAARRAY2D_H__
    00019
    00020 #include <sicppsdk.h>
    00021 #include <xsi_icenodecontext.h>
    00022 #include <xsi_indexset.h>
    00023 #include <xsi_dataarray.h>
    00024
    00025 #include <xsi_vector2f.h>
    00026 #include <xsi_vector3f.h>
    00027 #include <xsi_vector4f.h>
    00028 #include <xsi_quaternionf.h>
    00029 #include <xsi_rotationf.h>
    00030 #include <xsi_matrix3f.h>
    00031 #include <xsi_matrix4f.h>
    00032 #include <xsi_color4f.h>
    00033
    00034 namespace XSI {
    00035
    00036 class ICENodeContext;
    00037
    00038 class CBaseDataArray2D : public CBaseDataArray
    00039 {
    00040     public:
    00041     friend class ICENodeContext;
    00042
    00043     CBaseDataArray2D() : m_bIsSubArrayConstant(false) {}
    00044
    00045     protected:
    00046     SICPPSDK_INLINE CStatus AcquireInputDataArray( XSI::siICENodeDataType in_arrayDataType, ULONG in_nInputPortID, ULONG in_nInstanceIndex );
    00047     SICPPSDK_INLINE CStatus CopyFromInputDataArray( XSI::siICENodeDataType in_arrayDataType, ULONG in_nInputPortID, ULONG in_nInstanceIndex );
    00048     SICPPSDK_INLINE CStatus AcquireOutputDataArray( XSI::siICENodeDataType in_arrayDataType );
    00049     SICPPSDK_INLINE CStatus ReleaseDataArray( );
    00050     SICPPSDK_INLINE CStatus GetSubArray( ULONG in_nArrayIndex, void*& out_ppData, ULONG& out_nCount, ULONG& out_nStartBit ) const;
    00051     SICPPSDK_INLINE CStatus ResizeSubArray( ULONG in_nArrayIndex, ULONG in_nSize, void*& out_ppData, ULONG& out_nCount, ULONG& out_nStartBit );
    00052     SICPPSDK_INLINE bool GetSubArrayConstant() const;
    00053     SICPPSDK_INLINE bool& GetSubArrayConstantRef();
    00054
    00055     SICPPSDK_INLINE CStatus SetCustomTypeData2D( ULONG in_nAccessIndex, ULONG in_nIndex, const unsigned char* in_pData, ULONG in_nSize );
    00056     SICPPSDK_INLINE CStatus GetCustomTypeData2D( ULONG in_nAccessIndex, ULONG in_nIndex, const unsigned char** out_ppData, ULONG& out_nSize ) const;
    00057     SICPPSDK_INLINE CStatus GetCustomTypeData2D( ULONG in_nAccessIndex, ULONG in_nIndex, unsigned char** out_ppData, ULONG& out_nSize ) const;
    00058     SICPPSDK_INLINE unsigned char* ResizeCustomTypeData2D( ULONG in_nAccessIndex, ULONG in_nArrayIndex, ULONG in_nSize );
    00059
    00060     SICPPSDK_INLINE CStatus SetStringData2D( ULONG in_nAccessIndex, ULONG in_nIndex, const wchar_t* in_pData, ULONG in_nCount );
    00061     SICPPSDK_INLINE CStatus GetStringData2D( ULONG in_nAccessIndex, ULONG in_nIndex, const wchar_t** out_ppData, ULONG& out_nCount ) const;
    00062     SICPPSDK_INLINE CStatus GetStringData2D( ULONG in_nAccessIndex, ULONG in_nIndex, wchar_t** out_ppData, ULONG& out_nCount ) const;
    00063     SICPPSDK_INLINE wchar_t* ResizeStringData2D( ULONG in_nAccessIndex, ULONG in_nArrayIndex, ULONG in_nCount );
    00064
    00065     private:
    00066     bool m_bIsSubArrayConstant;
    00067 };
    00068
    00069 SICPPSDK_INLINE CStatus CBaseDataArray2D::AcquireInputDataArray( XSI::siICENodeDataType in_arrayDataType, ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    00070 {
    00071     return m_ctxt.AcquireInputDataArray2D( *this, in_arrayDataType, in_nInputPortID, in_nInstanceIndex );
    00072 }
    00073
    00074 SICPPSDK_INLINE CStatus CBaseDataArray2D::CopyFromInputDataArray( XSI::siICENodeDataType in_arrayDataType, ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    00075 {
    00076     return m_ctxt.CopyFromInputDataArray2D( *this, in_arrayDataType, in_nInputPortID, in_nInstanceIndex );
    00077 }
    00078
    00079 SICPPSDK_INLINE CStatus CBaseDataArray2D::AcquireOutputDataArray( XSI::siICENodeDataType in_arrayDataType )
    00080 {
    00081     return m_ctxt.AcquireOutputDataArray2D( *this, in_arrayDataType );
    00082 }
    00083
    00084 SICPPSDK_INLINE CStatus CBaseDataArray2D::ReleaseDataArray( )
    00085 {
    00086     return m_ctxt.ReleaseDataArray( *this );
    00087 }
    00088
    00089 SICPPSDK_INLINE CStatus CBaseDataArray2D::ResizeSubArray( ULONG in_nArrayIndex, ULONG in_nSize, void*& out_ppData, ULONG& out_nCount, ULONG& out_nStartBit )
    00090 {
    00091     return m_ctxt.ResizeSubArray( *this, in_nArrayIndex, in_nSize, out_ppData, out_nCount, out_nStartBit );
    00092 }
    00093
    00094 SICPPSDK_INLINE CStatus CBaseDataArray2D::GetSubArray( ULONG in_nArrayIndex, void*& out_ppData, ULONG& out_nCount, ULONG& out_nStartBit ) const
    00095 {
    00096     return m_ctxt.GetSubArray( (CBaseDataArray2D&)*this, in_nArrayIndex, out_ppData, out_nCount, out_nStartBit );
    00097 }
    00098
    00099 SICPPSDK_INLINE bool& CBaseDataArray2D::GetSubArrayConstantRef()
    00100 {
    00101     return m_bIsSubArrayConstant;
    00102 }
    00103
    00104 SICPPSDK_INLINE bool CBaseDataArray2D::GetSubArrayConstant() const
    00105 {
    00106     return m_bIsSubArrayConstant;
    00107 }
    00108
    00109 SICPPSDK_INLINE CStatus CBaseDataArray2D::SetCustomTypeData2D( ULONG in_nAccessIndex, ULONG in_nIndex, const unsigned char* in_pData, ULONG in_nSize )
    00110 {
    00111     return m_ctxt.SetCustomTypeData2D( *this, in_nAccessIndex, in_nIndex, in_pData, in_nSize );
    00112 }
    00113
    00114 SICPPSDK_INLINE CStatus CBaseDataArray2D::GetCustomTypeData2D( ULONG in_nAccessIndex, ULONG in_nIndex, const unsigned char** out_ppData, ULONG& out_nSize ) const
    00115 {
    00116     return m_ctxt.GetCustomTypeData2D( (CBaseDataArray&)*this, in_nAccessIndex, in_nIndex, out_ppData, out_nSize );
    00117 }
    00118
    00119 SICPPSDK_INLINE CStatus CBaseDataArray2D::GetCustomTypeData2D( ULONG in_nAccessIndex, ULONG in_nIndex, unsigned char** out_ppData, ULONG& out_nSize ) const
    00120 {
    00121     return m_ctxt.GetCustomTypeData2D( (CBaseDataArray&)*this, in_nAccessIndex, in_nIndex, out_ppData, out_nSize );
    00122 }
    00123
    00124 SICPPSDK_INLINE unsigned char* CBaseDataArray2D::ResizeCustomTypeData2D( ULONG in_nAccessIndex, ULONG in_nArrayIndex, ULONG in_nSize )
    00125 {
    00126     return m_ctxt.ResizeCustomTypeData2D( *this, in_nAccessIndex, in_nArrayIndex, in_nSize );
    00127 }
    00128
    00129 SICPPSDK_INLINE CStatus CBaseDataArray2D::SetStringData2D( ULONG in_nAccessIndex, ULONG in_nIndex, const wchar_t* in_pData, ULONG in_nCount )
    00130 {
    00131     return m_ctxt.SetStringData2D( *this, in_nAccessIndex, in_nIndex, in_pData, in_nCount );
    00132 }
    00133
    00134 SICPPSDK_INLINE CStatus CBaseDataArray2D::GetStringData2D( ULONG in_nAccessIndex, ULONG in_nIndex, const wchar_t** out_ppData, ULONG& out_nCount ) const
    00135 {
    00136     return m_ctxt.GetStringData2D( (CBaseDataArray&)*this, in_nAccessIndex, in_nIndex, out_ppData, out_nCount );
    00137 }
    00138
    00139 SICPPSDK_INLINE CStatus CBaseDataArray2D::GetStringData2D( ULONG in_nAccessIndex, ULONG in_nIndex, wchar_t** out_ppData, ULONG& out_nCount ) const
    00140 {
    00141     return m_ctxt.GetStringData2D( (CBaseDataArray&)*this, in_nAccessIndex, in_nIndex, out_ppData, out_nCount );
    00142 }
    00143
    00144 SICPPSDK_INLINE wchar_t* CBaseDataArray2D::ResizeStringData2D( ULONG in_nAccessIndex, ULONG in_nArrayIndex, ULONG in_nCount )
    00145 {
    00146     return m_ctxt.ResizeStringData2D( *this, in_nAccessIndex, in_nArrayIndex, in_nCount );
    00147 }
    00148
    00149 //*****************************************************************************
    00222 //*****************************************************************************
    00223
    00224 template <class T>
    00225 class CDataArray2D : public CBaseDataArray2D
    00226 {
    00227     public:
    00228
    00245     typedef T TData;
    00246
    00247     //*****************************************************************************
    00253     //*****************************************************************************
    00254
    00255     class Accessor
    00256     {
    00257         public:
    00258         friend class CDataArray2D<T>;
    00259
    00262         Accessor( ) : m_pData(NULL), m_nCount(0), m_bIsConstant(false)
    00263         {
    00264         }
    00265
    00268         Accessor( const Accessor& in_accessor )
    00269         {
    00270             *this = in_accessor;
    00271         }
    00272
    00277         Accessor& operator=( const Accessor& in_accessor )
    00278         {
    00279             m_pData = in_accessor.m_pData;
    00280             m_nCount = in_accessor.m_nCount;
    00281             m_bIsConstant = in_accessor.m_bIsConstant;
    00282             return *this;
    00283         }
    00284
    00288         ULONG GetCount() const
    00289         {
    00290             return m_nCount;
    00291         }
    00292
    00298         const T& operator[]( ULONG in_nIndex ) const
    00299         {
    00300             return m_pData[ m_bIsConstant ? 0 : in_nIndex ];
    00301         }
    00302
    00361         T& operator[]( ULONG in_nIndex )
    00362         {
    00363             return m_pData[ m_bIsConstant ? 0 : in_nIndex ];
    00364         }
    00365
    00366         private:
    00367         void*& GetDataRef()
    00368         {
    00369             return (void*&)m_pData;
    00370         }
    00371
    00372         ULONG& GetCountRef()
    00373         {
    00374             return m_nCount;
    00375         }
    00376
    00377         void SetAsConstant( bool in_bConst )
    00378         {
    00379             m_bIsConstant = in_bConst;
    00380         }
    00381
    00382         T* m_pData;
    00383         ULONG m_nCount;
    00384         bool m_bIsConstant;
    00385     };
    00386
    00392     SICPPSDK_INLINE CDataArray2D( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
    00393
    00397     SICPPSDK_INLINE CDataArray2D( ICENodeContext& in_ctxt ) ;
    00398
    00401     SICPPSDK_INLINE CDataArray2D( ) ;
    00402
    00405     SICPPSDK_INLINE ~CDataArray2D( );
    00406
    00423     SICPPSDK_INLINE CStatus CopyFrom( ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
    00424
    00430     SICPPSDK_INLINE Accessor operator[]( ULONG in_nArrayIndex ) const;
    00431
    00438     SICPPSDK_INLINE Accessor Resize( ULONG in_nArrayIndex, ULONG in_nSize );
    00439
    00443     SICPPSDK_INLINE ULONG GetCount() const;
    00444
    00448     SICPPSDK_INLINE bool IsConstant() const;
    00449
    00450 private:
    00451     SICPPSDK_INLINE Accessor Get( ULONG in_nArrayIndex ) const;
    00452     SICPPSDK_INLINE void Clear();
    00453     static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( );
    00454 };
    00455
    00456 template< class T >
    00457 SICPPSDK_INLINE CDataArray2D<T>::CDataArray2D( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    00458 {
    00459     m_ctxt = in_ctxt;
    00460
    00461     AcquireInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
    00462 }
    00463
    00464 template< class T >
    00465 SICPPSDK_INLINE CDataArray2D<T>::CDataArray2D( ICENodeContext& in_ctxt )
    00466 {
    00467     m_ctxt = in_ctxt;
    00468
    00469     AcquireOutputDataArray( GetDefaultType() );
    00470 }
    00471
    00472 template< class T >
    00473 SICPPSDK_INLINE CDataArray2D<T>::~CDataArray2D( )
    00474 {
    00475     ReleaseDataArray( );
    00476 }
    00477
    00478 template< class T >
    00479 SICPPSDK_INLINE CDataArray2D<T>::CDataArray2D( )
    00480 {
    00481 }
    00482
    00483 template< class T >
    00484 SICPPSDK_INLINE CStatus CDataArray2D<T>::CopyFrom( ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    00485 {
    00486     return CopyFromInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
    00487 }
    00488
    00489 template< class T >
    00490 SICPPSDK_INLINE typename CDataArray2D<T>::Accessor CDataArray2D<T>::Get( ULONG in_nArrayIndex ) const
    00491 {
    00492     Accessor a;
    00493     ULONG nNotused;
    00494     GetSubArray( in_nArrayIndex, a.GetDataRef(), (ULONG&)a.GetCountRef(), nNotused );
    00495     a.SetAsConstant( GetSubArrayConstant() );
    00496
    00497     return a;
    00498 }
    00499
    00500 template< class T >
    00501 SICPPSDK_INLINE typename CDataArray2D<T>::Accessor CDataArray2D<T>::operator[]( ULONG in_nArrayIndex ) const
    00502 {
    00503     return Get( in_nArrayIndex );
    00504 }
    00505
    00506 template< class T >
    00507 SICPPSDK_INLINE typename CDataArray2D<T>::Accessor CDataArray2D<T>::Resize( ULONG in_nArrayIndex, ULONG in_nSize )
    00508 {
    00509     ULONG nNotused;
    00510     Accessor a;
    00511     ResizeSubArray( in_nArrayIndex, in_nSize, a.GetDataRef(), (ULONG&)a.GetCountRef(), nNotused );
    00512     a.SetAsConstant( GetSubArrayConstant() );
    00513     return a;
    00514 }
    00515
    00516 template< class T >
    00517 SICPPSDK_INLINE void CDataArray2D<T>::Clear()
    00518 {
    00519     ReleaseDataArray( );
    00520     m_nHandle = UINT_MAX;
    00521     m_nCount = 0;
    00522     m_bIsConstant = false;
    00523     m_bIsSubArrayConstant = false;
    00524 }
    00525
    00526 template< class T >
    00527 SICPPSDK_INLINE ULONG CDataArray2D<T>::GetCount() const
    00528 {
    00529     return m_nCount;
    00530 }
    00531
    00532 template< class T >
    00533 SICPPSDK_INLINE bool CDataArray2D<T>::IsConstant() const
    00534 {
    00535     return m_bIsConstant;
    00536 }
    00537
    00538 //*****************************************************************************
    00539 // NB: Do not use the Doxygen \class tag for this template!!!
    00546 //*****************************************************************************
    00547
    00548 template <>
    00549 class CDataArray2D<bool> : public CBaseDataArray2D
    00550 {
    00551     public:
    00552     //*****************************************************************************
    00559     //*****************************************************************************
    00560     class Accessor
    00561     {
    00562         public:
    00563         friend class CDataArray2D<bool>;
    00564
    00567         Accessor( ) : m_nStartbit(0), m_bIsConstant(false)
    00568         {
    00569         }
    00570
    00573         Accessor( const Accessor& in_accessor )
    00574         {
    00575             *this = in_accessor;
    00576         }
    00577
    00582         Accessor& operator=( const Accessor& in_accessor )
    00583         {
    00584             m_bitset = in_accessor.m_bitset;
    00585             m_nStartbit = in_accessor.m_nStartbit;
    00586             m_bIsConstant = in_accessor.m_bIsConstant;
    00587             return *this;
    00588         }
    00589
    00595         const bool operator[] ( ULONG in_nIndex ) const
    00596         {
    00597             ULONG nIndex = m_nStartbit + (m_bitset.GetCount() == UINT_MAX ? 0 : in_nIndex);
    00598             return m_bitset.GetBit( nIndex );
    00599         }
    00600
    00607         CStatus Set( ULONG in_nIndex, bool in_bVal )
    00608         {
    00609             return m_bitset.SetBit( m_nStartbit + in_nIndex, in_bVal );
    00610         }
    00611
    00615         ULONG GetCount() const
    00616         {
    00617             return m_bitset.GetCount( );
    00618         }
    00619
    00620         private:
    00621
    00622         void SetAsConstant( bool in_bConst )
    00623         {
    00624             m_bIsConstant = in_bConst;
    00625         }
    00626
    00627         ULONG m_nStartbit;
    00628         CBitsetHelper m_bitset;
    00629         bool m_bIsConstant;
    00630     };
    00631
    00637     SICPPSDK_INLINE CDataArray2D( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
    00638
    00642     SICPPSDK_INLINE CDataArray2D( ICENodeContext& in_ctxt ) ;
    00643
    00646     SICPPSDK_INLINE CDataArray2D( ) ;
    00647
    00650     SICPPSDK_INLINE ~CDataArray2D( );
    00651
    00668     SICPPSDK_INLINE CStatus CopyFrom( ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
    00669
    00675     SICPPSDK_INLINE Accessor operator[]( ULONG in_nArrayIndex ) const;
    00676
    00683     SICPPSDK_INLINE Accessor Resize( ULONG in_nArrayIndex, ULONG in_nSize );
    00684
    00688     SICPPSDK_INLINE ULONG GetCount() const;
    00689
    00693     SICPPSDK_INLINE bool IsConstant() const;
    00694
    00695 private:
    00696     SICPPSDK_INLINE Accessor Get( ULONG in_nArrayIndex ) const;
    00697     static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( );
    00698 };
    00699
    00700 SICPPSDK_INLINE CDataArray2D<bool>::CDataArray2D( )
    00701 {
    00702 }
    00703
    00704 SICPPSDK_INLINE CDataArray2D<bool>::CDataArray2D( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    00705 {
    00706     m_ctxt = in_ctxt;
    00707
    00708     AcquireInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
    00709 }
    00710
    00711 SICPPSDK_INLINE CDataArray2D<bool>::CDataArray2D( ICENodeContext& in_ctxt )
    00712 {
    00713     m_ctxt = in_ctxt;
    00714
    00715     AcquireOutputDataArray( GetDefaultType() );
    00716 }
    00717
    00718 SICPPSDK_INLINE CDataArray2D<bool>::~CDataArray2D( )
    00719 {
    00720     ReleaseDataArray( );
    00721 }
    00722
    00723 SICPPSDK_INLINE CStatus CDataArray2D<bool>::CopyFrom( ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    00724 {
    00725     return CopyFromInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
    00726 }
    00727
    00728 SICPPSDK_INLINE CDataArray2D<bool>::Accessor CDataArray2D<bool>::Get( ULONG in_nArrayIndex ) const
    00729 {
    00730     Accessor a;
    00731     GetSubArray( in_nArrayIndex, (void*&)a.m_bitset.GetArrayRef(), (ULONG&)a.m_bitset.GetCountRef(), a.m_nStartbit );
    00732     a.SetAsConstant( GetSubArrayConstant() );
    00733     return a;
    00734 }
    00735
    00736 SICPPSDK_INLINE CDataArray2D<bool>::Accessor CDataArray2D<bool>::operator[]( ULONG in_nArrayIndex ) const
    00737 {
    00738     return Get( in_nArrayIndex );
    00739 }
    00740
    00741 SICPPSDK_INLINE CDataArray2D<bool>::Accessor CDataArray2D<bool>::Resize( ULONG in_nArrayIndex, ULONG in_nSize )
    00742 {
    00743     Accessor a;
    00744     ResizeSubArray( in_nArrayIndex, in_nSize, (void*&)a.m_bitset.GetArrayRef(), (ULONG&)a.m_bitset.GetCountRef(), a.m_nStartbit );
    00745     a.SetAsConstant( GetSubArrayConstant() );
    00746     return a;
    00747 }
    00748
    00749 SICPPSDK_INLINE ULONG CDataArray2D<bool>::GetCount() const
    00750 {
    00751     return m_nCount;
    00752 }
    00753
    00754 SICPPSDK_INLINE bool CDataArray2D<bool>::IsConstant() const
    00755 {
    00756     return m_bIsConstant;
    00757 }
    00758
    00759 //*****************************************************************************
    00766 //*****************************************************************************
    00767 class CDataArray2DCustomType : public CBaseDataArray2D
    00768 {
    00769     public:
    00770
    00771     typedef unsigned char TData;
    00772
    00773     //*****************************************************************************
    00778     //*****************************************************************************
    00779
    00780     class Accessor
    00781     {
    00782         public:
    00783         friend class CDataArray2DCustomType;
    00784
    00787         Accessor( ) : m_nAccessIndex(0), m_nCount(0), m_bIsConstant(false), m_pParent(NULL)
    00788         {
    00789         }
    00790
    00793         Accessor( const Accessor& in_accessor )
    00794         {
    00795             *this = in_accessor;
    00796         }
    00797
    00802         Accessor& operator=( const Accessor& in_accessor )
    00803         {
    00804             m_nCount = in_accessor.m_nCount;
    00805             m_nAccessIndex = in_accessor.m_nAccessIndex;
    00806             m_bIsConstant = in_accessor.m_bIsConstant;
    00807             m_pParent = in_accessor.m_pParent;
    00808             return *this;
    00809         }
    00810
    00819         SICPPSDK_INLINE CStatus SetData( ULONG in_nIndex, const TData* in_pData, ULONG in_nSize );
    00820
    00832         SICPPSDK_INLINE CStatus GetData( ULONG in_nIndex, const TData** out_ppData, ULONG& out_nSize  ) const;
    00833
    00845         SICPPSDK_INLINE CStatus GetData( ULONG in_nIndex, TData** out_ppData, ULONG& out_nSize  ) const;
    00846
    00853         SICPPSDK_INLINE TData* Resize( ULONG in_nIndex, ULONG in_nSize );
    00854
    00858         ULONG GetCount() const
    00859         {
    00860             return m_nCount;
    00861         }
    00862
    00863         private:
    00864         void SetAsConstant( bool in_bConst )
    00865         {
    00866             m_bIsConstant = in_bConst;
    00867         }
    00868
    00869         void SetIndex( ULONG in_nIndex )
    00870         {
    00871             m_nAccessIndex = in_nIndex;
    00872         }
    00873
    00874         void SetParent( CDataArray2DCustomType* in_pParent )
    00875         {
    00876             m_pParent = in_pParent;
    00877         }
    00878
    00879         ULONG& GetCountRef()
    00880         {
    00881             return m_nCount;
    00882         }
    00883
    00884         ULONG m_nAccessIndex;
    00885         ULONG m_nCount;
    00886         bool m_bIsConstant;
    00887         CDataArray2DCustomType* m_pParent;
    00888     };
    00889
    00895     SICPPSDK_INLINE CDataArray2DCustomType( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
    00896
    00900     SICPPSDK_INLINE CDataArray2DCustomType( ICENodeContext& in_ctxt ) ;
    00901
    00904     SICPPSDK_INLINE CDataArray2DCustomType( ) ;
    00905
    00908     SICPPSDK_INLINE ~CDataArray2DCustomType( );
    00909
    00926     SICPPSDK_INLINE CStatus CopyFrom( ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
    00927
    00933     SICPPSDK_INLINE Accessor operator[]( ULONG in_nArrayIndex ) const;
    00934
    00941     SICPPSDK_INLINE Accessor Resize( ULONG in_nArrayIndex, ULONG in_nSize );
    00942
    00946     SICPPSDK_INLINE ULONG GetCount() const;
    00947
    00951     SICPPSDK_INLINE bool IsConstant() const;
    00952
    00953 private:
    00954     SICPPSDK_INLINE Accessor Get( ULONG in_nArrayIndex ) const;
    00955     SICPPSDK_INLINE void Clear();
    00956     static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( );
    00957 };
    00958
    00959 SICPPSDK_INLINE CDataArray2DCustomType::CDataArray2DCustomType( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    00960 {
    00961     m_ctxt = in_ctxt;
    00962
    00963     AcquireInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
    00964 }
    00965
    00966 SICPPSDK_INLINE CDataArray2DCustomType::CDataArray2DCustomType( ICENodeContext& in_ctxt )
    00967 {
    00968     m_ctxt = in_ctxt;
    00969
    00970     AcquireOutputDataArray( GetDefaultType() );
    00971 }
    00972
    00973 SICPPSDK_INLINE CDataArray2DCustomType::~CDataArray2DCustomType( )
    00974 {
    00975     ReleaseDataArray( );
    00976 }
    00977
    00978 SICPPSDK_INLINE CDataArray2DCustomType::CDataArray2DCustomType( )
    00979 {
    00980 }
    00981
    00982 SICPPSDK_INLINE CStatus CDataArray2DCustomType::CopyFrom( ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    00983 {
    00984     return CopyFromInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
    00985 }
    00986
    00987 SICPPSDK_INLINE CDataArray2DCustomType::Accessor CDataArray2DCustomType::Get( ULONG in_nArrayIndex ) const
    00988 {
    00989     ULONG nNotused;
    00990     void* pNotused;
    00991
    00992     Accessor a;
    00993     GetSubArray( in_nArrayIndex, pNotused, (ULONG&)a.GetCountRef(), nNotused );
    00994     a.SetParent( (CDataArray2DCustomType*)this );
    00995     a.SetAsConstant( GetSubArrayConstant() );
    00996     a.SetIndex( in_nArrayIndex );
    00997     return a;
    00998 }
    00999
    01000 SICPPSDK_INLINE CDataArray2DCustomType::Accessor CDataArray2DCustomType::operator[]( ULONG in_nArrayIndex ) const
    01001 {
    01002     return Get( in_nArrayIndex );
    01003 }
    01004
    01005 SICPPSDK_INLINE CDataArray2DCustomType::Accessor CDataArray2DCustomType::Resize( ULONG in_nArrayIndex, ULONG in_nSize )
    01006 {
    01007     ULONG nNotused;
    01008     void* pNotused;
    01009
    01010     Accessor a;
    01011     ResizeSubArray( in_nArrayIndex, in_nSize, pNotused, (ULONG&)a.GetCountRef(), nNotused );
    01012     a.SetParent( (CDataArray2DCustomType*)this );
    01013     a.SetAsConstant( GetSubArrayConstant() );
    01014     a.SetIndex( in_nArrayIndex );
    01015     return a;
    01016 }
    01017
    01018 SICPPSDK_INLINE void CDataArray2DCustomType::Clear()
    01019 {
    01020     ReleaseDataArray( );
    01021     m_nHandle = UINT_MAX;
    01022     m_nCount = 0;
    01023     m_bIsConstant = false;
    01024 }
    01025
    01026 SICPPSDK_INLINE ULONG CDataArray2DCustomType::GetCount() const
    01027 {
    01028     return m_nCount;
    01029 }
    01030
    01031 SICPPSDK_INLINE bool CDataArray2DCustomType::IsConstant() const
    01032 {
    01033     return m_bIsConstant;
    01034 }
    01035
    01036 SICPPSDK_INLINE CStatus CDataArray2DCustomType::Accessor::SetData( ULONG in_nIndex, const TData* in_pData, ULONG in_nSize )
    01037 {
    01038     return m_pParent->SetCustomTypeData2D( m_nAccessIndex, in_nIndex, in_pData, in_nSize );
    01039 }
    01040
    01041 SICPPSDK_INLINE CStatus CDataArray2DCustomType::Accessor::GetData( ULONG in_nIndex, const TData** out_ppData, ULONG& out_nSize  ) const
    01042 {
    01043     return m_pParent->GetCustomTypeData2D( m_nAccessIndex, in_nIndex, out_ppData, out_nSize );
    01044 }
    01045
    01046 SICPPSDK_INLINE CStatus CDataArray2DCustomType::Accessor::GetData( ULONG in_nIndex, TData** out_ppData, ULONG& out_nSize  ) const
    01047 {
    01048     return m_pParent->GetCustomTypeData2D( m_nAccessIndex, in_nIndex, out_ppData, out_nSize );
    01049 }
    01050
    01051 SICPPSDK_INLINE CDataArray2DCustomType::TData* CDataArray2DCustomType::Accessor::Resize( ULONG in_nIndex, ULONG in_nSize )
    01052 {
    01053     return m_pParent->ResizeCustomTypeData2D( m_nAccessIndex, in_nIndex, in_nSize );
    01054 }
    01055
    01056 //*****************************************************************************
    01063 //*****************************************************************************
    01064 class CDataArray2DString : public CBaseDataArray2D
    01065 {
    01066     public:
    01067
    01068     typedef wchar_t TData;
    01069
    01070     //*****************************************************************************
    01075     //*****************************************************************************
    01076
    01077     class Accessor
    01078     {
    01079         public:
    01080         friend class CDataArray2DString;
    01081
    01084         Accessor( ) : m_nAccessIndex(0), m_nCount(0), m_bIsConstant(false), m_pParent(NULL)
    01085         {
    01086         }
    01087
    01090         Accessor( const Accessor& in_accessor )
    01091         {
    01092             *this = in_accessor;
    01093         }
    01094
    01099         Accessor& operator=( const Accessor& in_accessor )
    01100         {
    01101             m_nCount = in_accessor.m_nCount;
    01102             m_nAccessIndex = in_accessor.m_nAccessIndex;
    01103             m_bIsConstant = in_accessor.m_bIsConstant;
    01104             m_pParent = in_accessor.m_pParent;
    01105             return *this;
    01106         }
    01107
    01113         SICPPSDK_INLINE CStatus SetData( ULONG in_nIndex, const CString& in_str );
    01114
    01120         SICPPSDK_INLINE CStatus GetData( ULONG in_nIndex, CString& out_str ) const;
    01121
    01127         SICPPSDK_INLINE CString operator[]( ULONG in_nIndex ) const;
    01128
    01136         SICPPSDK_INLINE CStatus SetData( ULONG in_nIndex, const TData* in_pStr, ULONG in_nSize );
    01137
    01151         SICPPSDK_INLINE CStatus GetData( ULONG in_nIndex, const TData** out_ppStr, ULONG& out_nCount ) const;
    01152
    01166         SICPPSDK_INLINE CStatus GetData( ULONG in_nIndex, TData** out_ppStr, ULONG& out_nCount ) const;
    01167
    01174         SICPPSDK_INLINE TData* Resize( ULONG in_nIndex, ULONG in_nCount );
    01175
    01179         ULONG GetCount() const
    01180         {
    01181             return m_nCount;
    01182         }
    01183
    01184         private:
    01185         void SetAsConstant( bool in_bConst )
    01186         {
    01187             m_bIsConstant = in_bConst;
    01188         }
    01189
    01190         void SetIndex( ULONG in_nIndex )
    01191         {
    01192             m_nAccessIndex = in_nIndex;
    01193         }
    01194
    01195         void SetParent( CDataArray2DString* in_pParent )
    01196         {
    01197             m_pParent = in_pParent;
    01198         }
    01199
    01200         ULONG& GetCountRef()
    01201         {
    01202             return m_nCount;
    01203         }
    01204
    01205         ULONG m_nAccessIndex;
    01206         ULONG m_nCount;
    01207         bool m_bIsConstant;
    01208         CDataArray2DString* m_pParent;
    01209     };
    01210
    01216     SICPPSDK_INLINE CDataArray2DString( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
    01217
    01221     SICPPSDK_INLINE CDataArray2DString( ICENodeContext& in_ctxt ) ;
    01222
    01225     SICPPSDK_INLINE CDataArray2DString( ) ;
    01226
    01229     SICPPSDK_INLINE ~CDataArray2DString( );
    01230
    01247     SICPPSDK_INLINE CStatus CopyFrom( ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
    01248
    01254     SICPPSDK_INLINE Accessor operator[]( ULONG in_nArrayIndex ) const;
    01255
    01262     SICPPSDK_INLINE Accessor Resize( ULONG in_nArrayIndex, ULONG in_nCount );
    01263
    01267     SICPPSDK_INLINE ULONG GetCount() const;
    01268
    01272     SICPPSDK_INLINE bool IsConstant() const;
    01273
    01274 private:
    01275     SICPPSDK_INLINE Accessor Get( ULONG in_nArrayIndex ) const;
    01276     SICPPSDK_INLINE void Clear();
    01277     static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( );
    01278 };
    01279
    01280 SICPPSDK_INLINE CDataArray2DString::CDataArray2DString( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    01281 {
    01282     m_ctxt = in_ctxt;
    01283
    01284     AcquireInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
    01285 }
    01286
    01287 SICPPSDK_INLINE CDataArray2DString::CDataArray2DString( ICENodeContext& in_ctxt )
    01288 {
    01289     m_ctxt = in_ctxt;
    01290
    01291     AcquireOutputDataArray( GetDefaultType() );
    01292 }
    01293
    01294 SICPPSDK_INLINE CDataArray2DString::~CDataArray2DString( )
    01295 {
    01296     ReleaseDataArray( );
    01297 }
    01298
    01299 SICPPSDK_INLINE CDataArray2DString::CDataArray2DString( )
    01300 {
    01301 }
    01302
    01303 SICPPSDK_INLINE CStatus CDataArray2DString::CopyFrom( ULONG in_nInputPortID, ULONG in_nInstanceIndex )
    01304 {
    01305     return CopyFromInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
    01306 }
    01307
    01308 SICPPSDK_INLINE CDataArray2DString::Accessor CDataArray2DString::Get( ULONG in_nArrayIndex ) const
    01309 {
    01310     ULONG nNotused;
    01311     void* pNotused;
    01312
    01313     Accessor a;
    01314     GetSubArray( in_nArrayIndex, pNotused, (ULONG&)a.GetCountRef(), nNotused );
    01315     a.SetParent( (CDataArray2DString*)this );
    01316     a.SetAsConstant( GetSubArrayConstant() );
    01317     a.SetIndex( in_nArrayIndex );
    01318     return a;
    01319 }
    01320
    01321 SICPPSDK_INLINE CDataArray2DString::Accessor CDataArray2DString::operator[]( ULONG in_nArrayIndex ) const
    01322 {
    01323     return Get( in_nArrayIndex );
    01324 }
    01325
    01326 SICPPSDK_INLINE CDataArray2DString::Accessor CDataArray2DString::Resize( ULONG in_nArrayIndex, ULONG in_nSize )
    01327 {
    01328     ULONG nNotused;
    01329     void* pNotused;
    01330
    01331     Accessor a;
    01332     ResizeSubArray( in_nArrayIndex, in_nSize, pNotused, (ULONG&)a.GetCountRef(), nNotused );
    01333     a.SetParent( (CDataArray2DString*)this );
    01334     a.SetAsConstant( GetSubArrayConstant() );
    01335     a.SetIndex( in_nArrayIndex );
    01336     return a;
    01337 }
    01338
    01339 SICPPSDK_INLINE void CDataArray2DString::Clear()
    01340 {
    01341     ReleaseDataArray( );
    01342     m_nHandle = UINT_MAX;
    01343     m_nCount = 0;
    01344     m_bIsConstant = false;
    01345 }
    01346
    01347 SICPPSDK_INLINE ULONG CDataArray2DString::GetCount() const
    01348 {
    01349     return m_nCount;
    01350 }
    01351
    01352 SICPPSDK_INLINE bool CDataArray2DString::IsConstant() const
    01353 {
    01354     return m_bIsConstant;
    01355 }
    01356
    01357 SICPPSDK_INLINE CStatus CDataArray2DString::Accessor::SetData( ULONG in_nIndex, const CString& in_str )
    01358 {
    01359     return m_pParent->SetStringData2D( m_nAccessIndex, in_nIndex, in_str.GetWideString(), in_str.Length() );
    01360 }
    01361
    01362 SICPPSDK_INLINE CStatus CDataArray2DString::Accessor::GetData( ULONG in_nIndex, CString& out_str ) const
    01363 {
    01364     const wchar_t* pzStr;
    01365     ULONG nSize;
    01366     CStatus st = m_pParent->GetStringData2D( m_nAccessIndex, in_nIndex, &pzStr, nSize );
    01367     out_str = CString(pzStr,nSize);
    01368     return st;
    01369 }
    01370
    01371 SICPPSDK_INLINE CString CDataArray2DString::Accessor::operator[]( ULONG i ) const
    01372 {
    01373     CString str;
    01374     GetData( i, str );
    01375     return str;
    01376 }
    01377
    01378 SICPPSDK_INLINE CStatus CDataArray2DString::Accessor::SetData( ULONG in_nIndex, const TData* in_pData, ULONG in_nSize )
    01379 {
    01380     return m_pParent->SetStringData2D( m_nAccessIndex, in_nIndex, in_pData, in_nSize );
    01381 }
    01382
    01383 SICPPSDK_INLINE CStatus CDataArray2DString::Accessor::GetData( ULONG in_nIndex, const TData** out_ppData, ULONG& out_nSize  ) const
    01384 {
    01385     return m_pParent->GetStringData2D( m_nAccessIndex, in_nIndex, out_ppData, out_nSize );
    01386 }
    01387
    01388 SICPPSDK_INLINE CStatus CDataArray2DString::Accessor::GetData( ULONG in_nIndex, TData** out_ppData, ULONG& out_nSize  ) const
    01389 {
    01390     return m_pParent->GetStringData2D( m_nAccessIndex, in_nIndex, out_ppData, out_nSize );
    01391 }
    01392
    01393 SICPPSDK_INLINE CDataArray2DString::TData* CDataArray2DString::Accessor::Resize( ULONG in_nIndex, ULONG in_nSize )
    01394 {
    01395     return m_pParent->ResizeStringData2D( m_nAccessIndex, in_nIndex, in_nSize );
    01396 }
    01397
    01398 // Explicit template instances
    01476 typedef CDataArray2D< float > CDataArray2DFloat;
    01477 typedef CDataArray2D< LONG > CDataArray2DLong;
    01478 typedef CDataArray2D< bool > CDataArray2DBool;
    01479 typedef CDataArray2D< XSI::MATH::CVector2f > CDataArray2DVector2f;
    01480 typedef CDataArray2D< XSI::MATH::CVector3f > CDataArray2DVector3f;
    01481 typedef CDataArray2D< XSI::MATH::CVector4f > CDataArray2DVector4f;
    01482 typedef CDataArray2D< XSI::MATH::CQuaternionf > CDataArray2DQuaternionf;
    01483 typedef CDataArray2D< XSI::MATH::CRotationf > CDataArray2DRotationf;
    01484 typedef CDataArray2D< XSI::MATH::CMatrix3f > CDataArray2DMatrix3f;
    01485 typedef CDataArray2D< XSI::MATH::CMatrix4f > CDataArray2DMatrix4f;
    01486 typedef CDataArray2D< XSI::MATH::CColor4f > CDataArray2DColor4f;
    01487 typedef XSI::CDataArray2D< XSI::MATH::CShape> CDataArray2DShape;
    01488
    01489 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DFloat::GetDefaultType( ){return siICENodeDataFloat;}
    01490 SICPPSDK_INLINE siICENodeDataType CDataArray2DBool::GetDefaultType( ){return siICENodeDataBool;}
    01491 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DLong::GetDefaultType( ){return siICENodeDataLong;}
    01492 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DVector2f::GetDefaultType( ){return siICENodeDataVector2;}
    01493 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DVector3f::GetDefaultType( ){return siICENodeDataVector3;}
    01494 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DVector4f::GetDefaultType( ){return siICENodeDataVector4;}
    01495 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DQuaternionf::GetDefaultType( ){return siICENodeDataQuaternion;}
    01496 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DMatrix3f::GetDefaultType( ){return siICENodeDataMatrix33;}
    01497 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DMatrix4f::GetDefaultType( ){return siICENodeDataMatrix44;}
    01498 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DColor4f::GetDefaultType( ){return siICENodeDataColor4;}
    01499 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DRotationf::GetDefaultType( ){return siICENodeDataRotation;}
    01500 template<> SICPPSDK_INLINE XSI::siICENodeDataType CDataArray2DShape::GetDefaultType( ){return siICENodeDataShape;}
    01501 SICPPSDK_INLINE XSI::siICENodeDataType CDataArray2DCustomType::GetDefaultType( ){return siICENodeDataCustomType;}
    01502 SICPPSDK_INLINE XSI::siICENodeDataType CDataArray2DString::GetDefaultType( ){return siICENodeDataString;}
    01503 }; // XSI
    01504
    01505 #endif // __XSIDATAARRAY2D_H__