Important Update:

- Implemented basic child element navigation:
  GetFirstChild(), GetNextChild(), GetIndexChild()
- Bug fix: Faulty name comparison using length
This commit is contained in:
Charl Wentzel
2017-04-06 06:56:03 +02:00
parent 23db2539d9
commit 9b42d516a1
2 changed files with 49 additions and 2 deletions

View File

@@ -242,7 +242,7 @@ TDataMember ** CDataTree::GetMemberPtr( TDataMember * BaseMember, const char *
// Find next parent // Find next parent
Child = &(Member->FirstChild); Child = &(Member->FirstChild);
while (*Child && ((*Child)->NameLen != KeyLen) && strncasecmp( (*Child)->Name, Key, KeyLen )) { while (*Child && (((*Child)->NameLen != KeyLen) || strncasecmp( (*Child)->Name, Key, KeyLen ))) {
Child = &((*Child)->Next); Child = &((*Child)->Next);
} }
if (!*Child && Create) { if (!*Child && Create) {
@@ -273,6 +273,50 @@ TDataMember * CDataTree::GetMember( TDataMember * BaseMember, const char * Path
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
TDataMember * CDataTree::GetFirstChild( TDataMember * Parent )
{
// Get Parent
if (!Parent)
Parent = RootMember;
// Return child
return Parent->FirstChild;
}
//---------------------------------------------------------------------------
TDataMember * CDataTree::GetNextChild( TDataMember * PrevChild )
{
// Validate
if (!PrevChild)
return NULL;
// Return next child
return PrevChild->Next;
}
//---------------------------------------------------------------------------
TDataMember * CDataTree::GetIndexChild( TDataMember * Parent, const int Index )
{
TDataMember * Child;
int Count;
// Get Parent
if (!Parent)
Parent = RootMember;
// Get Indexed child
Count = 0;
Child = Parent->FirstChild;
while (Child && (Count < Index)) {
Child = Child->Next;
Count++;
}
// Return child
return Child;
}
//---------------------------------------------------------------------------
bool CDataTree::Delete( TDataMember * BaseMember, const char * Path ) bool CDataTree::Delete( TDataMember * BaseMember, const char * Path )
{ {
TDataMember * Parent; TDataMember * Parent;

View File

@@ -67,7 +67,10 @@ public:
EDataType GetType( TDataMember * BaseMember, const char * Path ); EDataType GetType( TDataMember * BaseMember, const char * Path );
TDataMember * GetMember( TDataMember * BaseMember, const char * Path, bool Create = false ); TDataMember * GetMember( TDataMember * BaseMember, const char * Path, bool Create = false );
TDataMember * GetFirstChild( TDataMember * BaseMember, const char * Path, bool Create = false );
TDataMember * GetFirstChild( TDataMember * Parent );
TDataMember * GetNextChild( TDataMember * PrevChild );
TDataMember * GetIndexChild( TDataMember * Parent, const int Index );
const char * GetStr( TDataMember * BaseMember, const char * Path, const char * Default = NULL, bool Create = false ); const char * GetStr( TDataMember * BaseMember, const char * Path, const char * Default = NULL, bool Create = false );
const char * GetStr( TDataMember * BaseMember, const char * Path, int &Len, const char * Default = NULL, bool Create = false ); const char * GetStr( TDataMember * BaseMember, const char * Path, int &Len, const char * Default = NULL, bool Create = false );