/* * 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 } EJsonDataType; //--------------------------------------------------------------------------- // One Config Members class CDataMember { char * Name = NULL; unsigned short NameLen = 0; EJsonDataType Type = jtNull; char * Value = NULL; unsigned short Len = 0; CDataMember * FirstChild = NULL; CDataMember * LastChild = NULL; CDataMember * Parent = NULL; CDataMember * PrevPeer = NULL; CDataMember * NextPeer = NULL; // Manage Members CDataMember * CreateChild( const char * Name, const int Len = -1 ); // Set Member value bool SetValue( EJsonDataType Type, const char * Value = NULL, int Len = -1 ); bool SetValuePtr( EJsonDataType pType, const char * pValue, int pLen = -1 ); public: CDataMember( const char * pName = NULL, const int pLen = -1 ); CDataMember( CDataMember * pParent, const char * pName = NULL, const int pLen = -1 ); ~CDataMember(); const char * GetName() { return Name; }; const int GetLen() { return Len; }; const char * GetChName( const char * Path ); const int GetChLen( const char * Path ); /* Check Type */ EJsonDataType GetType() { return Type; }; EJsonDataType GetChType( const char * Path ); inline bool isNull() { return (Type == jtNull); }; inline bool isBool() { return (Type == jtBool); }; inline bool isInt() { return (Type == jtInt); }; inline bool isFloat() { return (Type == jtFloat); }; inline bool isString() { return (Type == jtString); }; inline bool isArray() { return (Type == jtArray); }; inline bool isObject() { return (Type == jtObject); }; /* Navigating members */ inline CDataMember * GetFirstChild() { return GetChFirstChild( NULL, false ); }; inline CDataMember * GetElement( const int Index ) { return GetChElement( NULL, Index, false ); }; CDataMember * GetChild( const char * Path, bool Create = false ); CDataMember * GetChFirstChild( const char * Path, bool Create = false ); CDataMember * GetChElement( const char * Path, const int Index, bool Create = false ); inline CDataMember * GetParent() { return Parent; }; inline CDataMember * GetPrevPeer() { return PrevPeer; }; inline CDataMember * GetNextPeer() { return NextPeer; }; /* Read Values */ inline const char * GetStr( const char * Default = NULL ) { return GetChStr( NULL, Default, false ); }; inline const char * GetStr( int &Len, const char * Default = NULL ) { return GetChStr( NULL, Len, Default, false ); }; inline const bool GetBool( bool Default = false ) { return GetChBool( NULL, Default, false ); }; inline const long GetInt( long Default = 0, const char * Mask = NULL ) { return GetChInt( NULL, Default, false, Mask ); }; inline const double GetFloat( double Default = 0.0, const char * Mask = NULL ) { return GetChFloat( NULL, Default, false, Mask ); }; const char * GetChStr( const char * Path, const char * Default = NULL, bool Create = false ); const char * GetChStr( const char * Path, int &Len, const char * Default = NULL, bool Create = false ); const bool GetChBool( const char * Path, bool Default = false, bool Create = false ); const long GetChInt( const char * Path, long Default = 0, bool Create = false, const char * Mask = NULL ); const double GetChFloat( const char * Path, double Default = 0.0, bool Create = false, const char * Mask = NULL ); /* Modify Values */ inline bool SetNull() { return SetChNull( NULL ); }; inline bool SetObject() { return SetChObject( NULL ); }; inline bool SetArray() { return SetChArray( NULL ); }; inline bool SetBool( const bool Value ) { return SetChBool( NULL, Value ); }; inline bool SetInt( const long Value, const char * Mask = NULL ) { return SetChInt( NULL, Value, Mask ); }; inline bool SetFloat( const double Value, const char * Mask = NULL ) { return SetChFloat( NULL, Value, Mask ); }; inline bool SetStr( const char * Value = NULL, const int Len = -1 ) { return SetChStr( NULL, Value, Len ); }; bool SetChStr( const char * Path, const char * Value = NULL, const int Len = -1 ); // Use Len param if Value contains NULL values bool SetChObject( const char * Path ); bool SetChArray( const char * Path ); bool SetChNull( const char * Path ); bool SetChBool( const char * Path, const bool Value ); bool SetChInt( const char * Path, const long Value, const char * Mask = NULL ); bool SetChFloat( const char * Path, const double Value, const char * Mask = NULL ); /* Clear / Remove values */ bool Clear(); bool ClearCh( const char * Path ); bool DeleteCh( const char * Path ); /* Parsing */ friend class CJSONparse; }; #endif /* REDACORE_DATATREECORE_H_ */