diff options
Diffstat (limited to 'tools/toolutils/attributeelementchoicelist.cpp')
| -rw-r--r-- | tools/toolutils/attributeelementchoicelist.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/tools/toolutils/attributeelementchoicelist.cpp b/tools/toolutils/attributeelementchoicelist.cpp new file mode 100644 index 0000000..974ac21 --- /dev/null +++ b/tools/toolutils/attributeelementchoicelist.cpp @@ -0,0 +1,137 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#include "toolutils/attributeelementchoicelist.h" +#include "datamodel/dmelement.h" + + +typedef CUtlRBTree< CDmElement *, int > ElementDict_t; + + +//----------------------------------------------------------------------------- +// returns the choice string that AddElementsRecursively would have returned +//----------------------------------------------------------------------------- +const char *GetChoiceString( CDmElement *pElement ) +{ + return pElement->GetName(); +} + +//----------------------------------------------------------------------------- +// Recursively adds all elements referred to this element into the list of elements +//----------------------------------------------------------------------------- +void AddElementsRecursively_R( CDmElement *pElement, ElementChoiceList_t &list, ElementDict_t &dict, const char *pElementType ) +{ + if ( !pElement ) + return; + + if ( dict.Find( pElement ) != dict.InvalidIndex() ) + return; + + dict.Insert( pElement ); + + if ( pElement->IsA( pElementType ) ) + { + int nIndex = list.AddToTail( ); + ElementChoice_t &entry = list[nIndex]; + entry.m_pValue = pElement; + entry.m_pChoiceString = GetChoiceString( pElement ); + } + + for ( CDmAttribute *pAttribute = pElement->FirstAttribute(); pAttribute; pAttribute = pAttribute->NextAttribute() ) + { + char const *attributeName = pAttribute->GetName( ); + DmAttributeType_t attrType = pAttribute->GetType( ); + if ( attrType == AT_ELEMENT ) + { + CDmElement *pChild = pElement->GetValueElement< CDmElement >( attributeName ); + AddElementsRecursively_R( pChild, list, dict, pElementType ); + } + else if ( attrType == AT_ELEMENT_ARRAY ) + { + const CDmrElementArray<CDmElement> children( pElement, attributeName ); + uint n = children.Count(); + for ( uint i = 0; i < n; ++i ) + { + CDmElement *pChild = children[ i ]; + AddElementsRecursively_R( pChild, list, dict, pElementType ); + } + } + } +} + + +//----------------------------------------------------------------------------- +// Recursively adds all elements referred to this element into the list of elements +//----------------------------------------------------------------------------- +void AddElementsRecursively_R( CDmElement *pElement, DmeHandleVec_t &list, ElementDict_t &dict, const char *pElementType ) +{ + if ( !pElement ) + return; + + if ( dict.Find( pElement ) != dict.InvalidIndex() ) + return; + + dict.Insert( pElement ); + + if ( pElement->IsA( pElementType ) ) + { + int nIndex = list.AddToTail( ); + list[nIndex] = pElement; + } + + for ( CDmAttribute *pAttribute = pElement->FirstAttribute(); pAttribute; pAttribute = pAttribute->NextAttribute() ) + { + char const *attributeName = pAttribute->GetName( ); + DmAttributeType_t attrType = pAttribute->GetType( ); + if ( attrType == AT_ELEMENT ) + { + CDmElement *pChild = pElement->GetValueElement< CDmElement >( attributeName ); + AddElementsRecursively_R( pChild, list, dict, pElementType ); + } + else if ( attrType == AT_ELEMENT_ARRAY ) + { + const CDmrElementArray<CDmElement> children( pElement, attributeName ); + uint n = children.Count(); + for ( uint i = 0; i < n; ++i ) + { + CDmElement *pChild = children[ i ]; + AddElementsRecursively_R( pChild, list, dict, pElementType ); + } + } + } +} + + +//----------------------------------------------------------------------------- +// Recursively adds all elements referred to this element into the list of elements +//----------------------------------------------------------------------------- +void AddElementsRecursively( CDmElement *obj, ElementChoiceList_t &list, const char *pElementType ) +{ + if ( !pElementType ) + { + pElementType = g_pDataModel->GetString( CDmElement::GetStaticTypeSymbol() ); + } + + ElementDict_t dict( 0, 0, DefLessFunc( CDmElement * ) ); + AddElementsRecursively_R( obj, list, dict, pElementType ); +} + + +//----------------------------------------------------------------------------- +// Recursively adds all elements of the specified type under pElement into the vector +//----------------------------------------------------------------------------- +void AddElementsRecursively( CDmElement *pElement, DmeHandleVec_t &list, const char *pElementType ) +{ + if ( !pElementType ) + { + pElementType = g_pDataModel->GetString( CDmElement::GetStaticTypeSymbol() ); + } + + ElementDict_t dict( 0, 0, DefLessFunc( CDmElement * ) ); + AddElementsRecursively_R( pElement, list, dict, pElementType ); +} |