/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Copyright (c) 1989-1999 Microsoft Corporation Module Name: arraycls.hxx Abstract: Contains definitions for base type related code generation class definitions. Notes: History: GregJen Sep-30-1993 Created. ----------------------------------------------------------------------------*/ #ifndef __ARRAYCLS_HXX__ #define __ARRAYCLS_HXX__ #pragma warning ( disable : 4238 4239 ) #include "nulldefs.h" extern "C" { #include } #include "fldattr.hxx" #include "ndrcls.hxx" // // Ndr routines used by array and union classes for generation of attribute // (size_is, length_is, switch_is, etc.) descriptions. // void GenNdrFormatAttributeDescription( CCB * pCCB, expr_node* pMinExpr, expr_node* pSizeExpr, BOOL IsPointer, BOOL IsUnion, BOOL IsVaryingArray, BOOL IsMultiDArray, BOOL fGenCorrelationDesc, unsigned char uFlags = 0 ); void GenNdrFormatComplexAttributeDescription( CCB * pCCB, expr_node * pMinExpr, expr_node * pSizeExpr, long StackTopDisplacement, char * PrintPrefix, BOOL IsPointer ); class CG_CONF_ATTRIBUTE; class FIELD_ATTRIBUTE_INFO; // for now, define CG_ACT here. typedef enum _cgact { CG_ACT_MARSHALL, CG_ACT_SIZING, CG_ACT_UNMARSHALL, CG_ACT_FREE, CG_ACT_FOLLOWER_MARSHALL, CG_ACT_FOLLOWER_SIZING, CG_ACT_FOLLOWER_UNMARSHALL, CG_ACT_FOLLOWER_FREE, CG_ACT_OUT_ALLOCATE } CG_ACT; // for now, put these info classes here: class CG_CONF_ATTRIBUTE { private: expr_node * pMinIsExpr; expr_node * pSizeIsExpr; public: CG_CONF_ATTRIBUTE( FIELD_ATTR_INFO * pFAInfo ) { pMinIsExpr = pFAInfo->pMinIsExpr; pSizeIsExpr = pFAInfo->pSizeIsExpr; } CG_CONF_ATTRIBUTE( CG_CONF_ATTRIBUTE * pNode ) { *this = *pNode; } expr_node * GetMinIsExpr() { return pMinIsExpr; } expr_node * GetSizeIsExpr() { return pSizeIsExpr; } // // Ndr format string routine. // void GenFormatStringConformanceDescription( CCB * pCCB, BOOL IsPointer, BOOL IsMultiDArray ); }; class CG_VARY_ATTRIBUTE { private: expr_node * pFirstIsExpr; expr_node * pLengthIsExpr; protected: CG_VARY_ATTRIBUTE( const CG_VARY_ATTRIBUTE & Node ) { *this = Node; } public: CG_VARY_ATTRIBUTE( FIELD_ATTR_INFO * pFAInfo ) { pFirstIsExpr = pFAInfo->pFirstIsExpr; pLengthIsExpr = pFAInfo->pLengthIsExpr; } CG_VARY_ATTRIBUTE( CG_VARY_ATTRIBUTE * pNode ) { *this = *pNode; } expr_node * GetFirstIsExpr() { return pFirstIsExpr; } expr_node * GetLengthIsExpr() { return pLengthIsExpr; } // // Ndr format string routine. // void GenFormatStringVarianceDescription( CCB * pCCB, BOOL IsPointer, BOOL IsVaryingArray, BOOL IsMultiDArray ); }; #include "ptrcls.hxx" ///////////////////////////////////////////////////////////////////////////// // the array type code generation class. ///////////////////////////////////////////////////////////////////////////// // // This is the base class for all the array CG classes // class CG_ARRAY : public CG_NDR, public CG_CONF_ATTRIBUTE, public CG_CLONEABLE { private: unsigned short Dimensions; BOOL fHasFollower; BOOL fIsInMultiDim; BOOL fIsDupedSizePtr; BOOL fForcedComplex; PTRTYPE PtrKind; RESOURCE * pIndexResource; RESOURCE * pPtrResource; RESOURCE * pSizeResource; RESOURCE * pLengthResource; RESOURCE * pFirstResource; RESOURCE * pMinResource; RESOURCE * pInLocalResource; long ElementDescriptionOffset; node_cs_char * pCSUserType; // user type for cs_char arrays protected: CG_ARRAY( const CG_ARRAY & Node ) : CG_NDR( Node ), CG_CONF_ATTRIBUTE( Node ) { Dimensions = Node.Dimensions; fHasFollower = Node.fHasFollower; fIsInMultiDim = Node.fIsInMultiDim; fIsDupedSizePtr = Node.fIsDupedSizePtr; fForcedComplex = Node.fForcedComplex; PtrKind = Node.PtrKind; pIndexResource = NULL; if ( NULL != Node.pIndexResource ) pIndexResource = (RESOURCE*)( Node.pIndexResource->Clone() ); pPtrResource = NULL; if ( NULL != Node.pPtrResource ) pPtrResource = (RESOURCE*)( Node.pPtrResource->Clone() ); pSizeResource = NULL; if ( NULL != Node.pSizeResource ) pSizeResource = (RESOURCE*)( Node.pSizeResource->Clone() ); pLengthResource = NULL; if ( NULL != Node.pLengthResource ) pLengthResource = (RESOURCE*)( Node.pLengthResource->Clone() ); pFirstResource = NULL; if ( NULL != Node.pFirstResource ) pFirstResource = (RESOURCE*)( Node.pFirstResource->Clone() ); pMinResource = NULL; if ( NULL != Node.pMinResource ) pMinResource = (RESOURCE*)( Node.pMinResource->Clone() ); pInLocalResource = NULL; if ( NULL != Node.pInLocalResource ) pInLocalResource = (RESOURCE*)( Node.pInLocalResource->Clone() ); ElementDescriptionOffset = Node.ElementDescriptionOffset; pCSUserType = Node.pCSUserType; } public: // // The constructor. // CG_ARRAY( node_skl * pBT,// array in typegraph FIELD_ATTR_INFO * pFA, unsigned short Dim,// number of dimensions XLAT_SIZE_INFO & Info // wire alignment, etc ) : CG_NDR( pBT, Info ), CG_CONF_ATTRIBUTE( pFA ), fForcedComplex( FALSE ) { SetDimensions( Dim ); ResetHasFollower(); SetIndexResource( 0 ); SetPtrResource( 0 ); SetSizeResource( 0 ); SetLengthResource( 0 ); SetFirstResource( 0 ); SetMinResource( 0 ); SetInLocalResource( 0 ); SetIsInMultiDim( FALSE ); SetElementDescriptionOffset(-1); SetIsDupedSizePtr( FALSE ); SetCSUserType( 0 ); } virtual CG_CLASS * Clone() { return new CG_ARRAY(*this); } virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); } BOOL IsForcedComplex() { return fForcedComplex; }; void ForceComplex() { fForcedComplex = TRUE ; }; // // Get and set methods. // PTRTYPE GetPtrType() { return PtrKind; } PTRTYPE SetPtrType( PTRTYPE p ) { return (PtrKind = p); } RESOURCE * SetInLocalResource( RESOURCE * pR ) { return pInLocalResource = pR; } RESOURCE * GetInLocalResource() { return pInLocalResource; } RESOURCE * SetPtrResource( RESOURCE * pR ) { return pPtrResource = pR; } RESOURCE * GetPtrResource() { return pPtrResource; } RESOURCE * SetMinResource( RESOURCE * pR ) { return pMinResource = pR; } RESOURCE * GetMinResource() { return pMinResource; } RESOURCE * SetSizeResource( RESOURCE * pR ) { return pSizeResource = pR; } RESOURCE * GetSizeResource() { return pSizeResource; } RESOURCE * SetLengthResource( RESOURCE * pR ) { return pLengthResource = pR; } RESOURCE * GetLengthResource() { return pLengthResource; } RESOURCE * SetFirstResource( RESOURCE * pR ) { return pFirstResource = pR; } RESOURCE * GetFirstResource() { return pFirstResource; } RESOURCE * SetIndexResource( RESOURCE * pR ) { return pIndexResource = pR; } RESOURCE * GetIndexResource() { return pIndexResource; } void SetElementDescriptionOffset( long Offset ) { ElementDescriptionOffset = Offset; } long GetElementDescriptionOffset() { return ElementDescriptionOffset; } void ResetHasFollower() { fHasFollower = 0; } BOOL SetHasFollower() { fHasFollower = 1; return TRUE; } BOOL HasFollower() { return (BOOL)( fHasFollower == 1); } unsigned short SetDimensions( unsigned short Dim ) { return ( Dimensions = Dim ); } unsigned short GetDimensions() { return Dimensions; } void SetIsInMultiDim( BOOL fSet ) { fIsInMultiDim = fSet; } BOOL IsInMultiDim() { return fIsInMultiDim; } void SetIsDupedSizePtr( BOOL fSet ) { fIsDupedSizePtr = fSet; } BOOL IsDupedSizePtr() { return fIsDupedSizePtr; } void SetCSUserType( node_cs_char *p ) { pCSUserType = p; } node_cs_char * GetCSUserType( ) { return pCSUserType; } PNAME GetCSUserTypeName() { if ( !pCSUserType ) return NULL; return pCSUserType->GetUserTypeName(); } long GetCSElementSize() { MIDL_ASSERT( NULL != pCSUserType ); return pCSUserType->GetElementSize(); } virtual BOOL IsArray() { return TRUE; } virtual BOOL IsFixedArray() { return FALSE; } // // Is this a multidimensional array with > 1 dimension conformant and/or // varying. // BOOL IsMultiConfOrVar(); // // Is the array complex by Ndr Engine standards. // virtual BOOL IsComplex(); // // Ndr format string generation method. Redefined by all classes which // inherit CG_ARRAY. // virtual void GenNdrFormat( CCB * ) { MIDL_ASSERT(0); } // // Handles common steps for array Ndr format string generation. // BOOL GenNdrFormatArrayProlog( CCB * pCCB ); // // Generates the format string for the layout. // BOOL GenNdrFormatArrayLayout( CCB * pCCB ); // // Generates the pointer layout. // virtual void GenNdrFormatArrayPointerLayout( CCB * pCCB, BOOL fNoPP ); // // Generate the format string description for a complex array. Shared // by all array classes. // void GenNdrFormatComplex( CCB * pCCB ); // // Generate the FC_CSARRAY prolog if this is an international char array // void GenNdrCSArrayProlog( CCB *pCCB ); virtual BOOL ShouldFreeOffline(); virtual void GenFreeInline( CCB * pCCB ); // // Determine an array's element size. // long GetElementSize(); virtual long FixedBufferSize( CCB * ) { return -1; } virtual CG_STATUS MarshallAnalysis( ANALYSIS_INFO * pAna ); virtual CG_STATUS FollowerMarshallAnalysis( ANALYSIS_INFO * pAna ); virtual CG_STATUS UnMarshallAnalysis( ANALYSIS_INFO * pAna ); virtual CG_STATUS S_OutLocalAnalysis( ANALYSIS_INFO * pAna ); virtual CG_STATUS FollowerUnMarshallAnalysis( ANALYSIS_INFO * pAna ); virtual BOOL NeedsMaxCountMarshall() { return FALSE; } virtual BOOL NeedsFirstAndLengthMarshall() { return FALSE; } virtual BOOL NeedsExplicitFirst() { return FALSE; } BOOL HasPointer(); expr_node * FinalFirstExpression( CCB * pCCB ); expr_node * FinalSizeExpression( CCB * pCCB ); expr_node * FinalLengthExpression( CCB * pCCB ); CG_STATUS DimByDimMarshallAnalysis( ANALYSIS_INFO * pAna ); CG_STATUS DimByDimUnMarshallAnalysis( ANALYSIS_INFO * pAna ); CG_NDR * GetBasicCGClass(); virtual BOOL IsBlockCopyPossible(); BOOL IsArrayOfRefPointers(); BOOL MustBeAllocatedOnUnMarshall( CCB * pCCB ); virtual CG_STATUS S_GenInitOutLocals( CCB * pCCB ); virtual CG_STATUS GenRefChecks( CCB * pCCB ); virtual CG_STATUS RefCheckAnalysis( ANALYSIS_INFO * pAna ); virtual CG_STATUS InLocalAnalysis( ANALYSIS_INFO * pAna ); virtual CG_STATUS S_GenInitInLocals( CCB * pCCB ); }; // // This class corresponds to a vanilla array type. // class CG_FIXED_ARRAY : public CG_ARRAY { private: public: // // The constructor. // CG_FIXED_ARRAY( node_skl * pBT, // array in typegraph FIELD_ATTR_INFO * pFA, unsigned short dim, // dimensions XLAT_SIZE_INFO & Info // wire align. ) : CG_ARRAY( pBT, pFA, dim, Info ) { } virtual CG_CLASS * Clone() { return new CG_FIXED_ARRAY(*this); } // // TYPEDESC generation routine // virtual CG_STATUS GetTypeDesc(TYPEDESC * &ptd, CCB * pCCB); virtual ID_CG GetCGID() { return ID_CG_ARRAY; } virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); } // // Get and set methods. // // // Generate the format string. // void GenNdrFormat( CCB * pCCB ); long FixedBufferSize( CCB * pCCB ); BOOL InterpreterMustFree( CCB * ) { return TRUE; } unsigned long GetNumOfElements() { MIDL_ASSERT( GetSizeIsExpr()->IsConstant() ); return (ulong) GetSizeIsExpr()->GetValue(); } virtual BOOL IsFixedArray() { return TRUE; } virtual BOOL HasAFixedBufferSize() { return TRUE; } virtual expr_node * PresentedSizeExpression( CCB * pCCB ); virtual expr_node * PresentedLengthExpression( CCB * ) { return GetSizeIsExpr(); } virtual expr_node * PresentedFirstExpression( CCB * ) { return new expr_constant( 0L ); } virtual CG_STATUS MarshallAnalysis( ANALYSIS_INFO * pAna ); virtual CG_STATUS FollowerMarshallAnalysis( ANALYSIS_INFO * pAna ); virtual bool IsHomogeneous(FORMAT_CHARACTER format) { if ( ((CG_NDR *)GetChild())->IsSimpleType() ) { MIDL_ASSERT( dynamic_cast(GetChild() ) ); return ((CG_BASETYPE *)GetChild())->IsHomogeneous(format); } return FALSE; } }; // // This class corresponds to a conformant array type. // class CG_CONFORMANT_ARRAY : public CG_ARRAY { private: public: // // The constructor. // CG_CONFORMANT_ARRAY( node_skl * pBT, // array in typegraph FIELD_ATTR_INFO * pFA, // attribute data unsigned short dim, // dimensions XLAT_SIZE_INFO & Info // wire alignment ) : CG_ARRAY( pBT, pFA, dim, Info ) { } CG_CONFORMANT_ARRAY( CG_SIZE_POINTER * pCG // pointer node to clone from ) : CG_ARRAY( pCG->GetType(), &FIELD_ATTR_INFO(), 1, XLAT_SIZE_INFO( (CG_NDR *) pCG->GetChild()) ) { *((CG_NDR *)this) = *((CG_NDR *)pCG); *((CG_CONF_ATTRIBUTE *)this) = *((CG_CONF_ATTRIBUTE *)pCG); SetSizesAndAlignments( XLAT_SIZE_INFO( (CG_NDR*) pCG->GetChild() )); SetIsDupedSizePtr( TRUE ); SetCSUserType( pCG->GetCSUserType() ); } virtual CG_CLASS * Clone() { return new CG_CONFORMANT_ARRAY(*this); } virtual ID_CG GetCGID() { return ID_CG_CONF_ARRAY; } virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); } // // TYPEDESC generation routine // virtual CG_STATUS GetTypeDesc(TYPEDESC * &ptd, CCB * pCCB); // // Get and set methods. // // // Generate the format string. // void GenNdrFormat( CCB * pCCB ); virtual BOOL NeedsMaxCountMarshall() { return TRUE; } virtual expr_node * PresentedSizeExpression( CCB * pCCB ); }; // // This class corresponds to a varying array type. // class CG_VARYING_ARRAY : public CG_ARRAY, public CG_VARY_ATTRIBUTE { private: protected: CG_VARYING_ARRAY( const CG_VARYING_ARRAY & Node ) : CG_ARRAY( Node ) , CG_VARY_ATTRIBUTE( Node ) { } public: // // The constructor. // CG_VARYING_ARRAY( node_skl * pBT, // array in typegraph FIELD_ATTR_INFO * pFA, // attribute data unsigned short dim, // dimensions XLAT_SIZE_INFO & Info // wire alignment ) : CG_ARRAY( pBT, pFA, dim, Info ), CG_VARY_ATTRIBUTE( pFA ) { } virtual CG_CLASS * Clone() { return new CG_VARYING_ARRAY(*this); } virtual ID_CG GetCGID() { return ID_CG_VAR_ARRAY; } virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); } BOOL IsVarying() { return TRUE; } virtual BOOL IsFixedArray() { return TRUE; } // // Get and set methods. // // // Generate the format string. // void GenNdrFormat( CCB * pCCB ); unsigned long GetNumOfElements() { MIDL_ASSERT( GetSizeIsExpr()->IsConstant() ); return (ulong) GetSizeIsExpr()->GetValue(); } virtual BOOL NeedsFirstAndLengthMarshall() { return TRUE; } virtual BOOL NeedsExplicitFirst() { return TRUE; } virtual expr_node * PresentedLengthExpression( CCB * pCCB ); virtual expr_node * PresentedFirstExpression( CCB * pCCB ); virtual CG_STATUS MarshallAnalysis( ANALYSIS_INFO * pAna ); }; // // This class corresponds to a conformant varying array type. // class CG_CONFORMANT_VARYING_ARRAY : public CG_ARRAY, public CG_VARY_ATTRIBUTE { private: public: // // The constructor. // CG_CONFORMANT_VARYING_ARRAY( node_skl * pBT, // array in typegraph FIELD_ATTR_INFO * pFA, // attribute data unsigned short dim, // dimensions XLAT_SIZE_INFO & Info // wire alignment ) : CG_ARRAY( pBT, pFA, dim, Info ), CG_VARY_ATTRIBUTE( pFA ) { } CG_CONFORMANT_VARYING_ARRAY( CG_SIZE_LENGTH_POINTER * pCG // pointer node to clone from ) : // // We must pass in a null node_skl type so // that the code generator can identify this // as a manufactured conformant array. // CG_ARRAY( pCG->GetType(), &FIELD_ATTR_INFO(), 1, XLAT_SIZE_INFO( (CG_NDR *) pCG->GetChild()) ), CG_VARY_ATTRIBUTE( pCG ) { *((CG_NDR *)this) = *((CG_NDR *)pCG); *((CG_CONF_ATTRIBUTE *)this) = *((CG_CONF_ATTRIBUTE *)pCG); SetSizesAndAlignments( XLAT_SIZE_INFO( (CG_NDR*) pCG->GetChild() )); SetIsDupedSizePtr( TRUE ); SetCSUserType( pCG->GetCSUserType() ); } virtual CG_CLASS * Clone() { return new CG_CONFORMANT_VARYING_ARRAY(*this); } virtual ID_CG GetCGID() { return ID_CG_CONF_VAR_ARRAY; } virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); } // // Get and set methods. // // // Generate the format string. // void GenNdrFormat( CCB * pCCB ); virtual BOOL NeedsMaxCountMarshall() { return TRUE; } virtual BOOL NeedsFirstAndLengthMarshall() { return TRUE; } virtual BOOL NeedsExplicitFirst() { return TRUE; } virtual expr_node * PresentedSizeExpression( CCB * pCCB ); virtual expr_node * PresentedLengthExpression( CCB * pCCB ); virtual expr_node * PresentedFirstExpression( CCB * pCCB ); }; // // This class corresponds to a string array type. // class CG_STRING_ARRAY : public CG_ARRAY { private: protected: CG_STRING_ARRAY( const CG_STRING_ARRAY & Node ) : CG_ARRAY( Node ) { } public: // // The constructor. // CG_STRING_ARRAY( node_skl * pBT, // array in typegraph FIELD_ATTR_INFO * pFA, // attribute data unsigned short dim, // dimensions XLAT_SIZE_INFO & Info // wire alignment ) : CG_ARRAY( pBT, pFA, dim, Info ) { } virtual CG_CLASS * Clone() { return new CG_STRING_ARRAY(*this); } virtual ID_CG GetCGID() { return ID_CG_STRING_ARRAY; } virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); } BOOL IsVarying() { return TRUE; } virtual BOOL IsFixed() { return TRUE; } BOOL IsStringableStruct() { CG_NDR * pChild = (CG_NDR *) GetChild(); return (pChild->GetCGID() != ID_CG_BT); } // // // Get and set methods. // // // Generate the format string. // void GenNdrFormat( CCB * pCCB ); virtual expr_node * PresentedSizeExpression( CCB * pCCB ); virtual CG_STATUS MarshallAnalysis( ANALYSIS_INFO * pAna ); }; // // This class corresponds to a conformant varying array type. // class CG_CONFORMANT_STRING_ARRAY : public CG_ARRAY { private: public: // // The constructor. // CG_CONFORMANT_STRING_ARRAY( node_skl * pBT, // array in typegraph FIELD_ATTR_INFO * pFA, // attribute data unsigned short dim, // dimensions XLAT_SIZE_INFO & Info // wire alignment ) : CG_ARRAY( pBT, pFA, dim, Info ) { } virtual CG_CLASS * Clone() { return new CG_CONFORMANT_STRING_ARRAY(*this); } virtual ID_CG GetCGID() { return ID_CG_CONF_STRING_ARRAY; } virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); } BOOL IsStringableStruct() { CG_NDR * pChild = (CG_NDR *) GetChild(); return (pChild->GetCGID() != ID_CG_BT); } BOOL IsComplex() { return IsStringableStruct(); } // // Get and set methods. // // // Generate the format string. // void GenNdrFormat( CCB * pCCB ); virtual expr_node * PresentedSizeExpression( CCB * pCCB ); }; // // New 64bit NDR arrays types // #define DECLARE_COMPLEX_ARRAY_CG_CLASS( NEWTYPE, BASETYPE ) \ class NEWTYPE : public BASETYPE \ { \ protected: \ NEWTYPE( const NEWTYPE & Node ) : \ BASETYPE( Node ) {} \ public: \ NEWTYPE( node_skl *pType, \ FIELD_ATTR_INFO * pFA, \ unsigned short dim, \ XLAT_SIZE_INFO & Info ) : \ BASETYPE( pType, \ pFA, \ dim, \ Info ) \ { \ ForceComplex(); \ } \ virtual CG_CLASS* Clone() { return new NEWTYPE(*this); } \ virtual void Visit( CG_VISITOR *pVisitor ) { pVisitor->Visit( this ); } \ }; \ // Fixed arrays DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_COMPLEX_FIXED_ARRAY, CG_FIXED_ARRAY ) DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_FORCED_COMPLEX_FIXED_ARRAY, CG_COMPLEX_FIXED_ARRAY ) DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_FULL_COMPLEX_FIXED_ARRAY, CG_COMPLEX_FIXED_ARRAY ) // Conformant arrays DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_COMPLEX_CONFORMANT_ARRAY, CG_CONFORMANT_ARRAY ) DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_FORCED_COMPLEX_CONFORMANT_ARRAY, CG_COMPLEX_CONFORMANT_ARRAY ) DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_FULL_COMPLEX_CONFORMANT_ARRAY, CG_COMPLEX_CONFORMANT_ARRAY ) // Varying arrays DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_COMPLEX_VARYING_ARRAY, CG_VARYING_ARRAY ) DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_FORCED_COMPLEX_VARYING_ARRAY, CG_COMPLEX_VARYING_ARRAY ) DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_FULL_COMPLEX_VARYING_ARRAY, CG_COMPLEX_VARYING_ARRAY ) // conformant varying arrays DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_COMPLEX_CONFORMANT_VARYING_ARRAY, CG_CONFORMANT_VARYING_ARRAY ) DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_FORCED_COMPLEX_CONFORMANT_VARYING_ARRAY, CG_COMPLEX_CONFORMANT_VARYING_ARRAY ) DECLARE_COMPLEX_ARRAY_CG_CLASS( CG_FULL_COMPLEX_CONFORMANT_VARYING_ARRAY, CG_COMPLEX_CONFORMANT_VARYING_ARRAY ) #endif // __ARRAYCLS_HXX__