X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2Fbase.h;h=5ae111c5a3e4eecd756ce0f97015c99dd2bf049b;hb=73308303d23af62494bfeef0c0d5224c344c6d6f;hp=0f8bf1b38742af147f1dd9a2b3280fe5ea5f3774;hpb=98230c69fc0b8730c9db7178de125cda90ea1509;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/base.h b/xmltooling/base.h index 0f8bf1b..5ae111c 100644 --- a/xmltooling/base.h +++ b/xmltooling/base.h @@ -1366,6 +1366,35 @@ set##proper(src.get##proper()) /** + * Implements cloning of a child attribute in a foreign namespace, for use in copy constructor or + * deferred clone methods. + * + * proper the proper name of the attribute to clone + */ +#define IMPL_CLONE_FOREIGN_ATTRIB(proper) \ + set##proper(src.get##proper()); \ + if (src.m_##proper##Prefix) \ + m_##proper##Prefix = xercesc::XMLString::replicate(src.m_##proper##Prefix) + +/** + * Implements cloning of an integer child attribute, for use in copy constructor or + * deferred clone methods. + * + * proper the proper name of the attribute to clone + */ +#define IMPL_CLONE_INTEGER_ATTRIB(proper) \ + set##proper(src.m_##proper) + +/** + * Implements cloning of a boolean child attribute, for use in copy constructor or + * deferred clone methods. + * + * proper the proper name of the attribute to clone + */ +#define IMPL_CLONE_BOOLEAN_ATTRIB(proper) \ + proper(src.m_##proper) + +/** * Implements cloning of a child object, for use in copy constructor or * deferred clone methods. * @@ -1388,14 +1417,16 @@ /** * Implements cloning of an untyped child collection, for use in copy constructor or * deferred clone methods. + * + * proper the proper name of the child type to clone */ -#define IMPL_CLONE_XMLOBJECT_CHILDREN() \ +#define IMPL_CLONE_XMLOBJECT_CHILDREN(proper) \ static void (VectorOf(XMLObject)::* XMLObject_push_back)(XMLObject* const&) = &VectorOf(XMLObject)::push_back; \ - VectorOf(XMLObject) cXMLObject = getUnknownXMLObjects(); \ + VectorOf(XMLObject) c##proper = get##proper##s(); \ std::for_each( \ - src.m_UnknownXMLObjects.begin(), src.m_UnknownXMLObjects.end(), \ + src.m_##proper##s.begin(), src.m_##proper##s.end(), \ boost::lambda::if_(boost::lambda::_1 != ((XMLObject*)nullptr)) \ - [boost::lambda::bind(XMLObject_push_back, boost::ref(cXMLObject), boost::lambda::bind(&XMLObject::clone, boost::lambda::_1))] \ + [boost::lambda::bind(XMLObject_push_back, boost::ref(c##proper), boost::lambda::bind(&XMLObject::clone, boost::lambda::_1))] \ ) /** @@ -1430,6 +1461,52 @@ ) /** + * Opens an iteration loop over all of the children of an object. + */ +#define IMPL_CLONE_CHILDBAG_BEGIN \ + for (list::const_iterator _bagit = src.m_children.begin(); _bagit != src.m_children.end(); ++_bagit) { + +/** + * Closes an iteration loop over all of the children of an object. + */ +#define IMPL_CLONE_CHILDBAG_END } + +/** + * Implements cloning of a typed child in a bag iteration loop based on a cast check. + * + * @param proper the proper name of the child type to clone + */ +#define IMPL_CLONE_TYPED_CHILD_IN_BAG(proper) \ + proper* _##proper##cast = dynamic_cast(*_bagit); \ + if (_##proper##cast) { \ + get##proper##s().push_back(_##proper##cast->clone##proper()); \ + continue; \ + } + +/** + * Implements cloning of a typed child in a forign namespace in a bag iteration loop based on a cast check. + * + * @param proper the proper name of the child type to clone + * @param ns the namespace of the child type + */ +#define IMPL_CLONE_TYPED_FOREIGN_CHILD_IN_BAG(proper,ns) \ + ns::proper* _##proper##cast = dynamic_cast(*_bagit); \ + if (_##proper##cast) { \ + get##proper##s().push_back(_##proper##cast->clone##proper()); \ + continue; \ + } + +/** + * Implements cloning of an XMLObject child in a bag iteration loop. + * + * @param proper the proper name of the child to clone + */ +#define IMPL_CLONE_XMLOBJECT_CHILD_IN_BAG(proper) \ + if (*_bagit) { \ + get##proper##s().push_back((*_bagit)->clone()); \ + } + +/** * Declares an XMLObject specialization with a simple content model and type, * handling it as string data. *