Refactored simple content and child-handling into mixin classes.
[shibboleth/cpp-xmltooling.git] / xmltooling / base.h
index 43903d8..7e7eefa 100644 (file)
     }
 
 /**
- * Declares abstract get/set methods for named XML element content.
+ * Declares aliased get/set methods for named XML element content.
  * 
  * @param proper    the proper name to label the element's content
  */
 #define DECL_XMLOBJECT_CONTENT(proper) \
     XMLTOOLING_DOXYGEN(Returns proper.) \
-    virtual const XMLCh* get##proper() const=0; \
-    XMLTOOLING_DOXYGEN(Sets proper.) \
-    virtual void set##proper(const XMLCh* proper)=0
+    const XMLCh* get##proper() const { \
+        return getTextContent(); \
+    } \
+    XMLTOOLING_DOXYGEN(Sets or clears proper.) \
+    void set##proper(const XMLCh* proper) { \
+        setTextContent(proper); \
+    }
 
 /**
- * Implements get/set methods and a private member for named XML element content.
- * 
- * @param proper    the proper name to label the element's content
+ * Implements marshalling/unmarshalling for element content.
  */
-#define IMPL_XMLOBJECT_CONTENT(proper) \
-    private: \
-        XMLCh* m_##proper; \
-    public: \
-        const XMLCh* get##proper() const { \
-            return m_##proper; \
-        } \
-        void set##proper(const XMLCh* proper) { \
-            m_##proper = prepareForAssignment(m_##proper,proper); \
-        } \
+#define IMPL_XMLOBJECT_CONTENT \
     protected: \
         void marshallElementContent(DOMElement* domElement) const { \
-            if(get##proper()) { \
-                domElement->appendChild(domElement->getOwnerDocument()->createTextNode(get##proper())); \
+            if(getTextContent()) { \
+                domElement->appendChild(domElement->getOwnerDocument()->createTextNode(getTextContent())); \
             } \
         } \
         void processElementContent(const XMLCh* elementContent) { \
-            set##proper(elementContent); \
+            setTextContent(elementContent); \
         }
 
 
  * @param desc      documentation for class
  */
 #define DECL_XMLOBJECT_SIMPLE(linkage,cname,proper,desc) \
-    BEGIN_XMLOBJECT(linkage,cname,xmltooling::XMLObject,desc); \
+    BEGIN_XMLOBJECT(linkage,cname,xmltooling::SimpleElement,desc); \
         DECL_XMLOBJECT_CONTENT(proper); \
     END_XMLOBJECT
 
  * 
  * @param linkage   linkage specifier for the class
  * @param cname     the name of the XMLObject specialization
- * @param proper    the proper name to label the element's content
  */
-#define DECL_XMLOBJECTIMPL_SIMPLE(linkage,cname,proper) \
+#define DECL_XMLOBJECTIMPL_SIMPLE(linkage,cname) \
     class linkage cname##Impl \
         : public cname, \
+            public xmltooling::AbstractSimpleElement, \
+            public xmltooling::AbstractChildlessElement, \
             public xmltooling::AbstractDOMCachingXMLObject, \
             public xmltooling::AbstractValidatingXMLObject, \
             public xmltooling::AbstractXMLObjectMarshaller, \
     public: \
         virtual ~cname##Impl() {} \
         cname##Impl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType) \
-            : xmltooling::AbstractXMLObject(nsURI, localName, prefix, schemaType), m_##proper(NULL) { \
+            : xmltooling::AbstractXMLObject(nsURI, localName, prefix, schemaType) { \
         } \
         cname##Impl(const cname##Impl& src) \
             : xmltooling::AbstractXMLObject(src), \
+                xmltooling::AbstractSimpleElement(src), \
                 xmltooling::AbstractDOMCachingXMLObject(src), \
-                xmltooling::AbstractValidatingXMLObject(src), \
-                m_##proper(XMLString::replicate(src.m_##proper)) { \
-        } \
+                xmltooling::AbstractValidatingXMLObject(src) {} \
         IMPL_XMLOBJECT_CLONE(cname) \
-        IMPL_XMLOBJECT_CONTENT(proper) \
+        IMPL_XMLOBJECT_CONTENT \
     }
     
 /**
  * 
  * @param linkage   linkage specifier for the class
  * @param cname     the name of the XMLObject specialization
- * @param proper    the proper name to label the element's content
  */
-#define XMLOBJECTVALIDATOR_SIMPLE(linkage,cname,proper) \
+#define XMLOBJECTVALIDATOR_SIMPLE(linkage,cname) \
     BEGIN_XMLOBJECTVALIDATOR(linkage,cname); \
-        XMLOBJECTVALIDATOR_REQUIRE(cname,proper); \
+        XMLOBJECTVALIDATOR_REQUIRE(cname,TextContent); \
     END_XMLOBJECTVALIDATOR
 
 #include <utility>