Important Update:
- Implemented basic child element navigation: GetFirstChild(), GetNextChild(), GetIndexChild() - Bug fix: Faulty name comparison using length
This commit is contained in:
@@ -242,7 +242,7 @@ TDataMember ** CDataTree::GetMemberPtr( TDataMember * BaseMember, const char *
|
||||
|
||||
// Find next parent
|
||||
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);
|
||||
}
|
||||
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 )
|
||||
{
|
||||
TDataMember * Parent;
|
||||
|
||||
@@ -67,7 +67,10 @@ public:
|
||||
|
||||
EDataType GetType( TDataMember * BaseMember, const char * Path );
|
||||
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, int &Len, const char * Default = NULL, bool Create = false );
|
||||
|
||||
Reference in New Issue
Block a user