26 #ifndef TINYBIND_INCLUDED 27 #define TINYBIND_INCLUDED 51 enum MemberSerializeFlags {
52 MemberSerializeFlagsNone = 0,
63 Tag(
char const * tagOne = NULL ) {
68 Tag(
char const * tagOne,
char const * tagTwo ) {
73 Tag(
char const * tagOne,
char const * tagTwo,
char const * tagThree ) {
98 return binding->intoXml( elemOut, dataIn, params );
107 return binding->fromXml( elemIn, dataOut, params );
115 MemberSerializeFlags flags_;
119 void setFlags( MemberSerializeFlags f ) {
128 virtual char const * tag(
int which = 0) {
return tag_.tag_[which]; }
132 virtual bool isAttributeMember() = 0;
139 template<
class T,
class MT>
143 virtual MT
const & getMemberValue( T
const * thisPtr ) = 0;
144 virtual void setMemberValue( T * thisPtr, MT
const & mv ) = 0;
148 template<
class T,
class MT>
153 void (T::*setter_)(MT);
155 virtual MT
const & getMemberValue( T
const * thisPtr ) {
157 mv = (
const_cast<T*
>(thisPtr)->*getter_)();
161 virtual void setMemberValue( T * thisPtr, MT
const & mv ) {
162 (thisPtr->*setter_)(mv);
167 template<
class T,
class MT>
171 MT
const & (T::*getter_)();
172 void (T::*setter_)(MT
const &);
174 virtual MT
const & getMemberValue( T
const * thisPtr ) {
175 return (thisPtr->*getter_)();
178 virtual void setMemberValue( T * thisPtr, MT
const & mv ) {
179 (thisPtr->*setter_)(mv);
183 template<
class T,
class MT>
188 virtual MT
const & getMemberValue( T
const * thisPtr ) {
return thisPtr->*memberPtr_; }
189 virtual void setMemberValue( T * thisPtr, MT
const & mv ) {
197 template<
class T,
class MT>
208 template<
class T,
class MT>
212 MT & (T::*memberRefFunc_)();
213 virtual MT
const & getMemberValue( T
const * thisPtr ) {
return (const_cast<T*>(thisPtr)->*memberRefFunc_)(); }
214 virtual void setMemberValue( T * thisPtr, MT
const & mv ) {
215 (thisPtr->*memberRefFunc_)() = mv;
220 template<
class T,
class MT>
227 mvPolicy_ = mvPolicy;
232 MT & mv =
const_cast<MT &
>(mvPolicy_->getMemberValue(thisPtr));
235 mvPolicy_->setMemberValue(thisPtr, mv);
244 MT
const & mv = mvPolicy_->getMemberValue(thisPtr);
246 std::string oldValue = elem->
Value();
253 virtual bool isAttributeMember() {
return true; }
257 template<
class T,
class MT,
class FromXmlPolicy,
class MemberValuePolicy>
261 FromXmlPolicy xmlPolicy_;
262 MemberValuePolicy mvPolicy_;
272 template<
class T,
class MT>
279 mvPolicy_ = mvPolicy;
288 mvPolicy_->setMemberValue(thisPtr, mv);
300 MT
const & mv = mvPolicy_->getMemberValue(thisPtr);
311 virtual bool isAttributeMember() {
return false; }
316 ConvertToString( T
const & t );
320 ConvertFromString(
char const * strIn, T * dataOut );
322 template<
class T,
class MT>
329 mvPolicy_ = mvPolicy;
336 if( attributeValue && *attributeValue ) {
337 ConvertFromString( attributeValue, &mv );
338 mvPolicy_->setMemberValue(thisPtr, mv);
347 MT
const & mv = mvPolicy_->getMemberValue(thisPtr);
348 char const * attributeValue = ConvertToString( mv );
353 virtual bool isAttributeMember() {
return true; }
356 template<
class T,
class MT>
362 MH_Type * mph =
new MH_Type();
363 mph->mvPolicy_.memberPtr_ = mp;
364 return &mph->xmlPolicy_;
367 template<
class T,
class MT>
373 MH_Type * mph =
new MH_Type();
374 mph->mvPolicy_.memberRefFunc_ = mp;
375 return &mph->xmlPolicy_;
378 template<
class T,
class MT>
384 MH_Type * mph =
new MH_Type();
385 mph->mvPolicy_.getter_ = getter;
386 mph->mvPolicy_.setter_ = setter;
387 return &mph->xmlPolicy_;
390 template<
class T,
class MT>
396 MH_Type * mph =
new MH_Type();
397 mph->mvPolicy_.getter_ = (MT (T::*)())getter;
398 mph->mvPolicy_.setter_ = setter;
399 return &mph->xmlPolicy_;
402 template<
class T,
class MT>
404 MT
const & (T::*getter)(),
405 void (T::*setter)(MT
const &))
410 MH_Type * mph =
new MH_Type();
411 mph->mvPolicy_.getter_ = getter;
412 mph->mvPolicy_.setter_ = setter;
413 return &mph->xmlPolicy_;
417 template<
class T,
class MT>
423 MH_Type * mph =
new MH_Type();
424 mph->mvPolicy_.memberPtr_ = mp;
425 return &mph->xmlPolicy_;
429 template<
class T,
class MT>
433 typedef MemberArrayHolder<T, MT> MemberValuePolicy;
435 MH_Type * mph =
new MH_Type();
436 mph->mvPolicy_.memberPtr_ = mp;
437 mph->mvPolicy_.len = len;
438 return &mph->xmlPolicy_;
442 template<
class T,
class MT>
443 IMemberHolder<T> * MemberAttribute( MT (T::*getter)(),
void (T::*setter)(MT) )
448 MH_Type * mph =
new MH_Type();
449 mph->mvPolicy_.getter_ = getter;
450 mph->mvPolicy_.setter_ = setter;
451 return &mph->xmlPolicy_;
454 template<
class T,
class MT>
455 IMemberHolder<T> * MemberAttribute( MT (T::*getter)()
const,
void (T::*setter)(MT) )
460 MH_Type * mph =
new MH_Type();
461 mph->mvPolicy_.getter_ = (MT (T::*)())getter;
462 mph->mvPolicy_.setter_ = setter;
463 return &mph->xmlPolicy_;
466 template<
class T,
class MT>
468 MT
const & (T::*getter)(),
469 void (T::*setter)(MT
const &))
474 MH_Type * mph =
new MH_Type();
475 mph->mvPolicy_.getter_ = getter;
476 mph->mvPolicy_.setter_ = setter;
477 return &mph->xmlPolicy_;
482 template<
class T,
class MT>
488 MH_Type * mph =
new MH_Type();
489 mph->mvPolicy_.memberPtr_ = mp;
490 return &mph->xmlPolicy_;
493 template<
class T,
class MT>
499 MH_Type * mph =
new MH_Type();
500 mph->mvPolicy_.getter_ = getter;
501 mph->mvPolicy_.setter_ = setter;
502 return &mph->xmlPolicy_;
505 template<
class T,
class MT>
507 MT
const & (T::*getter)(),
508 void (T::*setter)(MT
const &))
513 MH_Type * mph =
new MH_Type();
514 mph->mvPolicy_.getter_ = getter;
515 mph->mvPolicy_.setter_ = setter;
516 return &mph->xmlPolicy_;
519 template<
class T,
class MT>
525 MH_Type * mph =
new MH_Type();
526 mph->mvPolicy_.memberRefFunc_ = mp;
527 return &mph->xmlPolicy_;
536 std::vector<IMemberHolder<T> *> members_;
541 return members_.empty();
546 mph->flags_ = MemberSerializeFlagsNone;
548 members_.push_back( mph );
555 for(
size_t i = 0; i < members_.size(); i++ ) {
560 if( mph->isAttributeMember() ) {
561 ret = mph->fromXml( elem, data );
566 ret = mph->fromXml( *child, data );
569 if( mph->isAttributeMember() ) {
570 }
else if( !error ) {
575 if( mph->isAttributeMember() ){
589 for(
size_t i = 0; i < members_.size(); i++ ) {
591 mph->intoXml( elem, &data );
606 ConvertFromString( nodedata->
Value(), data );
618 template<
class T,
class VecT>
623 char const * subTag_;
625 char const * sizeAttributeName_;
627 :subTag_(st), useSubTag_(useSubTag), sizeAttributeName_(sizeAttributeName)
636 if( sizeAttributeName_ ) {
638 ConvertFromString( elem.
Attribute(sizeAttributeName_), &sz );
646 bool ret = binding->fromXml( *child, value, params );
647 data->push_back(*value);
658 if( sizeAttributeName_ ) {
659 elem->
SetAttribute( sizeAttributeName_, ConvertToString( data.size() ) );
661 for(
typename VecT::const_iterator i = data.begin(); i != data.end(); i++ ) {
662 T
const & value = *i;
671 if( ! binding->intoXml( &child, value, params ) ) {
680 template<
class T,
class VecT>
685 char const * subTag_;
687 char const * sizeAttributeName_;
689 :subTag_(st), useSubTag_(useSubTag), sizeAttributeName_(sizeAttributeName)
698 if( sizeAttributeName_ ) {
700 ConvertFromString( elem.
Attribute(sizeAttributeName_), &sz );
708 bool ret = binding->fromXml( *child, value, params );
709 data->push_back(value);
720 if( sizeAttributeName_ ) {
721 elem->
SetAttribute( sizeAttributeName_, ConvertToString( data.size() ) );
723 for(
typename VecT::const_iterator i = data.begin(); i != data.end(); i++ ) {
724 T
const * value = *i;
736 if( ! binding->intoXml( &child, *value, params ) ) {
761 template<
class T,
class VecT>
769 template<
class T,
class VecT>
Definition: tinybind.h:323
Definition: tinybind.h:209
Definition: tinybind.h:140
TiXmlText * ToText() const
Cast to a more defined type. Will return null not of the requested type.
Definition: tinyxml.h:516
Definition: tinybind.h:56
Definition: tinybind.h:533
Definition: tinybind.h:41
XML text.
Definition: tinyxml.h:848
Definition: tinybind.h:35
TiXmlElement * NextSiblingElement() const
Convenience function to get through elements.
Definition: tinyxml.cpp:412
Definition: tinybind.h:221
const char * Attribute(const char *name) const
Given an attribute name, Attribute() returns the value for the attribute of that name, or null if none exists.
Definition: tinyxml.cpp:472
const char * Value() const
The meaning of 'value' changes for the specific type of TiXmlNode.
Definition: tinyxml.h:356
Definition: tinybind.h:258
Definition: tinybind.h:273
Definition: tinybind.h:599
Definition: tinybind.h:149
TiXmlNode * FirstChild() const
The first child of this node. Will be null if there are no children.
Definition: tinyxml.h:384
TiXmlNode * InsertEndChild(const TiXmlNode &addThis)
Add a new node related to this.
Definition: tinyxml.cpp:190
Definition: tinybind.h:112
TiXmlElement * FirstChildElement() const
Convenience function to get through elements.
Definition: tinyxml.cpp:383
Definition: tinybind.h:681
Definition: tinybind.h:80
Definition: tinybind.h:184
void SetAttribute(const char *name, const char *value)
Sets an attribute of name to a given value.
Definition: tinyxml.cpp:539
The element is a container class.
Definition: tinyxml.h:698
Definition: tinybind.h:168
The parent class for everything in the Document Object Model.
Definition: tinyxml.h:289
Definition: tinybind.h:85
Definition: tinybind.h:619
void SetValue(const char *_value)
Changes the value of the node.
Definition: tinyxml.h:367