/* * DataTreeCore.h * * Created on: 5 Mar 2017 * Author: wentzelc */ #ifndef REDACORE_DATATREECORE_H_ #define REDACORE_DATATREECORE_H_ // Standard C/C++ Libraries #include // redA Libraries #include "CharBufferCore.h" //--------------------------------------------------------------------------- typedef enum { jtNull = 0, jtBool = 1, jtInt = 2, jtFloat = 3, jtString = 4, jtArray = 5, jtObject = 6 } EDataType; //--------------------------------------------------------------------------- // Structure prototypes typedef struct SDataMember TDataMember; // One Config Members struct SDataMember { char * Name; unsigned short NameLen; EDataType Type; TDataMember * FirstChild; char * Value; unsigned short Len; TDataMember * Next; }; //--------------------------------------------------------------------------- class CDataTree { private: TDataMember * RootMember; // Manage Members TDataMember * CreateMember( const char * Name, const int Len = -1 ); bool AddMember( TDataMember * Parent, TDataMember * Member ); bool DestroyMember( TDataMember ** Member ); bool DestroyValue( TDataMember * Member ); // Find Member TDataMember * GetRootMember() { return RootMember; }; TDataMember ** GetMemberPtr( TDataMember * BaseMember, const char * Path, bool Create, TDataMember ** Parent = NULL ); // Set Member value bool SetValue( TDataMember * Member, EDataType Type, const char * Value = NULL, int Len = -1 ); bool SetValuePtr( TDataMember * Member, EDataType Type, char * Value, int Len ); public: CDataTree(); ~CDataTree(); EDataType GetType( TDataMember * BaseMember, const char * Path ); TDataMember * GetMember( TDataMember * BaseMember, const char * Path, bool Create = false ); TDataMember * GetIndexChild( TDataMember * Parent, const int Index ); TDataMember * GetFirstChild( TDataMember * Parent, const char * Path, bool Create = false ); inline TDataMember * GetFirstChild( TDataMember * Parent ) { return ((Parent)? Parent->FirstChild : NULL); }; inline TDataMember * GetNextChild( TDataMember * PrevChild ) { return ((PrevChild)? PrevChild->Next : NULL); }; 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 int GetLen( TDataMember * BaseMember, const char * Path ); const long GetInt( TDataMember * BaseMember, const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL ); const double GetFloat( TDataMember * BaseMember, const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL ); const bool GetBool( TDataMember * BaseMember, const char * Path, bool Default = false, bool Create = false ); bool SetObject( TDataMember * BaseMember, const char * Path ); bool SetArray( TDataMember * BaseMember, const char * Path ); bool SetStr( TDataMember * BaseMember, const char * Path, const char * Value = NULL, const int Len = -1 ); // Use Len param if Value contains NULL values bool SetInt( TDataMember * BaseMember, const char * Path, const long Value, const char * Mask = NULL ); bool SetFloat( TDataMember * BaseMember, const char * Path, const double Value, const char * Mask = NULL ); bool SetBool( TDataMember * BaseMember, const char * Path, const bool Value ); bool SetNull( TDataMember * BaseMember, const char * Path ); bool Delete( TDataMember * BaseMember, const char * Path ); bool DeleteAll(); friend class CJSONparse; }; #endif /* REDACORE_DATATREECORE_H_ */