diff --git a/cwIo.cpp b/cwIo.cpp index bf80c4e..a7ff354 100644 --- a/cwIo.cpp +++ b/cwIo.cpp @@ -173,7 +173,7 @@ namespace cw // for each serial port cfg for(unsigned i=0; iserialN; ++i) { - const object_t* e = cfgL->list_ele(i); + const object_t* e = cfgL->child_ele(i); serialPort_t* r = p->serialA + i; if( e == nullptr ) @@ -281,7 +281,7 @@ namespace cw for(unsigned i=0; iaudioCfgN; ++i) { audioCfg_t* r = p->audioCfgA + i; - if((node = deviceL->list_ele(i)) == nullptr ) + if((node = deviceL->child_ele(i)) == nullptr ) { if(( rc = node->getv( "enableFl", r->enableFl, diff --git a/cwObject.cpp b/cwObject.cpp index be1a9b1..1929325 100644 --- a/cwObject.cpp +++ b/cwObject.cpp @@ -86,7 +86,9 @@ namespace cw rc_t _objTypeValueFromBool( const object_t* o, unsigned tid, void* dst ) { return getObjectValue(o->u.b,tid,dst,o->type->label); } rc_t _objTypeValueFromNonValue( const object_t* o, unsigned tid, void* dst ) - { return cwLogError(kInvalidArgRC, "There is no conversion from '%s' to '%s'.", _objTypeIdToLabel(tid), o->type->label); } + { + return cwLogError(kInvalidArgRC, "There is no conversion from '%s' to '%s'.", _objTypeIdToLabel(tid), o->type->label); + } rc_t _objTypeValueFromString( const object_t* o, unsigned tid, void* dst ) { @@ -124,8 +126,8 @@ namespace cw void _objTypePrintUInt16( const object_t* o, print_ctx_t& c ) { printf("%i",o->u.u16); } void _objTypePrintInt32( const object_t* o, print_ctx_t& c ) { printf("%i",o->u.i32); } void _objTypePrintUInt32( const object_t* o, print_ctx_t& c ) { printf("%i",o->u.u32); } - void _objTypePrintInt64( const object_t* o, print_ctx_t& c ) { printf("%lli",o->u.i64); } - void _objTypePrintUInt64( const object_t* o, print_ctx_t& c ) { printf("%lli",o->u.u64); } + void _objTypePrintInt64( const object_t* o, print_ctx_t& c ) { printf("%li",o->u.i64); } + void _objTypePrintUInt64( const object_t* o, print_ctx_t& c ) { printf("%li",o->u.u64); } void _objTypePrintBool( const object_t* o, print_ctx_t& c ) { printf("%s",o->u.b ? "true" : "false"); } void _objTypePrintFloat( const object_t* o, print_ctx_t& c ) { printf("%f",o->u.f); } void _objTypePrintDouble( const object_t* o, print_ctx_t& c ) { printf("%f",o->u.d); } @@ -277,6 +279,7 @@ namespace cw { kFloatTId, "float", 0, _objTypeFree, _objTypeValueFromFloat, _objTypePrintFloat, _objTypeToStringFloat }, { kDoubleTId, "double", 0, _objTypeFree, _objTypeValueFromDouble, _objTypePrintDouble, _objTypeToStringDouble }, { kStringTId, "string", 0, _objTypeFreeString, _objTypeValueFromString, _objTypePrintString, _objTypeToStringString }, + { kCStringTId, "cstring", 0, _objTypeFree, _objTypeValueFromString, _objTypePrintString, _objTypeToStringString }, { kVectTId, "vect", 0, _objTypeFree, _objTypeValueFromVect, _objTypePrintVect, _objTypeToStringVect }, { kPairTId, "pair", kContainerFl | kValueContainerFl, _objTypeFree, _objTypeValueFromNonValue, _objTypePrintPair, _objTypeToStringPair }, { kListTId, "list", kContainerFl | kValueContainerFl, _objTypeFree, _objTypeValueFromNonValue, _objTypePrintList, _objTypeToStringList }, @@ -460,7 +463,7 @@ cw::rc_t cw::object_t::value( uint64_t& v ) const { return type->value(this,kUIn cw::rc_t cw::object_t::value( float& v ) const { return type->value(this,kFloatTId,&v); } cw::rc_t cw::object_t::value( double& v ) const { return type->value(this,kDoubleTId,&v); } cw::rc_t cw::object_t::value( char*& v ) const { return type->value(this,kStringTId,&v); } -cw::rc_t cw::object_t::value( const char*& v ) const { return type->value(this,kStringTId,&v); } +cw::rc_t cw::object_t::value( const char*& v ) const { return type->value(this,kCStringTId,&v); } const char* cw::object_t::pair_label() const { @@ -510,9 +513,9 @@ struct cw::object_str* cw::object_t::find( const char* label, unsigned flags ) return const_cast(((const object_t*)this)->find(label,flags)); } -const struct cw::object_str* cw::object_t::list_ele( unsigned idx ) const +const struct cw::object_str* cw::object_t::child_ele( unsigned idx ) const { - if( is_list() ) + if( is_container() ) { unsigned i = 0; for(object_t* o=u.children; o!=nullptr; o=o->sibling,++i) @@ -522,9 +525,9 @@ const struct cw::object_str* cw::object_t::list_ele( unsigned idx ) const return nullptr; } -struct cw::object_str* cw::object_t::list_ele( unsigned idx ) +struct cw::object_str* cw::object_t::child_ele( unsigned idx ) { - return const_cast(((const object_t*)this)->list_ele(idx)); + return const_cast(((const object_t*)this)->child_ele(idx)); } @@ -574,9 +577,53 @@ cw::object_t* cw::newObject( float v, object_t* parent) cw::object_t* cw::newObject( double v, object_t* parent) { return _objCreateValueNode( parent, v ); } +cw::object_t* cw::newObject( char* v, object_t* parent) +{ return _objCreateValueNode( parent, v ); } + cw::object_t* cw::newObject( const char* v, object_t* parent) { return _objCreateValueNode( parent, v ); } + +cw::object_t* cw::newPairObject( const char* label, std::uint8_t v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, std::int8_t v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, std::uint16_t v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, std::int16_t v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, std::uint32_t v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, std::int32_t v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, std::uint64_t v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, std::int64_t v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, bool v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, float v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, double v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, char* v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + +cw::object_t* cw::newPairObject( const char* label, const char* v, object_t* parent) +{ return _objCreatePairNode( parent, label, v ); } + + cw::rc_t cw::objectFromString( const char* s, object_t*& objRef ) { lex::handle_t lexH; diff --git a/cwObject.h b/cwObject.h index 8ba8fe4..026aafb 100644 --- a/cwObject.h +++ b/cwObject.h @@ -23,11 +23,12 @@ namespace cw kDoubleTId = 0x00001000, kBoolTId = 0x00002000, kStringTId = 0x00004000, - kVectTId = 0x00008000, - kPairTId = 0x00010000, - kListTId = 0x00020000, - kDictTId = 0x00040000, - kRootTId = 0x00080000, + kCStringTId = 0x00008000, // static string (don't delete) + kVectTId = 0x00010000, + kPairTId = 0x00020000, + kListTId = 0x00040000, + kDictTId = 0x00080000, + kRootTId = 0x00100000, kHexFl = 0x10000000, kIdentFl = 0x20000000 @@ -139,8 +140,8 @@ namespace cw const struct object_str* find( const char* label, unsigned flags=0 ) const; struct object_str* find( const char* label, unsigned flags=0 ); - const struct object_str* list_ele( unsigned idx ) const; - struct object_str* list_ele( unsigned idx ); + const struct object_str* child_ele( unsigned idx ) const; + struct object_str* child_ele( unsigned idx ); // Set flag 'kNoRecurseFl' to no recurse into the object in search of the value. // Set flag 'kOptional' if the label is optional and may not exist. @@ -170,7 +171,11 @@ namespace cw rc = getv(std::forward(args)...); return rc; } - + + template< typename T > + struct object_str* insertPair( const char* label, const T& v ) + { return newPairObject(label, v, this); } + unsigned to_string( char* buf, unsigned bufByteN ) const; void print(const print_ctx_t* c=NULL) const; @@ -187,7 +192,23 @@ namespace cw object_t* newObject( bool v, object_t* parent=nullptr); object_t* newObject( float v, object_t* parent=nullptr); object_t* newObject( double v, object_t* parent=nullptr); + object_t* newObject( char* v, object_t* parent=nullptr); object_t* newObject( const char* v, object_t* parent=nullptr); + + // Return a pointer to the value node. + object_t* newPairObject( const char* label, std::uint8_t v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, std::int8_t v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, std::int16_t v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, std::uint16_t v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, std::int32_t v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, std::uint32_t v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, std::int64_t v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, std::uint64_t v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, bool v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, float v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, double v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, char* v, object_t* parent=nullptr); + object_t* newPairObject( const char* label, const char* v, object_t* parent=nullptr); rc_t objectFromString( const char* s, object_t*& objRef ); rc_t objectFromFile( const char* fn, object_t*& objRef ); diff --git a/cwObjectTemplate.h b/cwObjectTemplate.h index 161a99f..abec400 100644 --- a/cwObjectTemplate.h +++ b/cwObjectTemplate.h @@ -12,6 +12,7 @@ namespace cw template< typename T > object_t* _objSetLeafValue( object_t* obj, T value ) { + cwLogError(kObjAllocFailRC,"Unhandled object type at leaf node."); return NULL; } @@ -25,15 +26,78 @@ namespace cw return obj; } + template<> object_t* _objSetLeafValue( object_t* obj, uint8_t value ) + { + if( obj != NULL ) + { + obj->u.u8 = value; + obj->type = _objIdToType(kUInt8TId); + } + return obj; + } + + + template<> object_t* _objSetLeafValue( object_t* obj, int16_t value ) + { + if( obj != NULL ) + { + obj->u.i16 = value; + obj->type = _objIdToType(kInt16TId); + } + return obj; + } + + template<> object_t* _objSetLeafValue( object_t* obj, uint16_t value ) + { + if( obj != NULL ) + { + obj->u.u16 = value; + obj->type = _objIdToType(kUInt16TId); + } + return obj; + } + + template<> object_t* _objSetLeafValue( object_t* obj, int32_t value ) { if( obj != NULL ) { obj->u.i32 = value; - obj->type = _objIdToType(kInt32TId); + obj->type = _objIdToType(kInt32TId); } return obj; } + + template<> object_t* _objSetLeafValue( object_t* obj, uint32_t value ) + { + if( obj != NULL ) + { + obj->u.u32 = value; + obj->type = _objIdToType(kUInt32TId); + } + return obj; + } + + template<> object_t* _objSetLeafValue( object_t* obj, int64_t value ) + { + if( obj != NULL ) + { + obj->u.i64 = value; + obj->type = _objIdToType(kInt64TId); + } + return obj; + } + + template<> object_t* _objSetLeafValue( object_t* obj, uint64_t value ) + { + if( obj != NULL ) + { + obj->u.u64 = value; + obj->type = _objIdToType(kUInt64TId); + } + return obj; + } + template<> object_t* _objSetLeafValue( object_t* obj, double value ) { @@ -64,10 +128,21 @@ namespace cw } return obj; } + + template<> object_t* _objSetLeafValue( object_t* obj, const char* value ) + { + if( obj != NULL ) + { + obj->u.str = (char*)value; + obj->type = _objIdToType(kCStringTId); + } + return obj; + } template< typename T > object_t*_objCreateValueNode( object_t* obj, T value, const char* msg=nullptr, unsigned flags=0 ) { + cwLogError(kObjAllocFailRC,"Unhandled type at value node."); return NULL; } @@ -104,9 +179,24 @@ namespace cw template<> object_t* _objCreateValueNode< char*>( object_t* parent, char* value, const char* msg, unsigned flags ) { return _objAppendLeftMostNode( parent, _objSetLeafValue( _objAllocate(), value ) ); } + template<> object_t* _objCreateValueNode( object_t* parent, const char* value, const char* msg, unsigned flags ) + { return _objAppendLeftMostNode( parent, _objSetLeafValue( _objAllocate(), value ) ); } + template<> object_t* _objCreateValueNode( object_t* parent, bool value, const char* msg, unsigned flags ) { return _objAppendLeftMostNode( parent, _objSetLeafValue( _objAllocate(), value ) ); } + + template< typename T > + object_t*_objCreatePairNode( object_t* parentObj, const char* label, const T& value, const char* msg=nullptr, unsigned flags=0 ) + { + object_t* pair = _objAppendLeftMostNode(parentObj, _objAllocate( kPairTId, parentObj) ); + + _objCreateValueNode( pair, label, msg, flags ); + return _objCreateValueNode( pair, value, msg, flags ); + + } + + template< typename T > rc_t getObjectValue( const T& src, unsigned tid, void* dst, const char* typeLabel ) {