2 * Copyright 2001-2006 Internet2
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 * Base header file definitions
21 * Must be included prior to including any other header
24 #ifndef __xmltooling_base_h__
25 #define __xmltooling_base_h__
27 #if defined (_MSC_VER) || defined(__BORLANDC__)
28 #include <xmltooling/config_pub_win32.h>
30 #include <xmltooling/config_pub.h>
34 * @namespace xmltooling
35 * Public namespace of XML Tooling library
38 // Windows and GCC4 Symbol Visibility Macros
40 #define XMLTOOL_IMPORT __declspec(dllimport)
41 #define XMLTOOL_EXPORT __declspec(dllexport)
42 #define XMLTOOL_DLLLOCAL
43 #define XMLTOOL_DLLPUBLIC
45 #define XMLTOOL_IMPORT
46 #ifdef GCC_HASCLASSVISIBILITY
47 #define XMLTOOL_EXPORT __attribute__ ((visibility("default")))
48 #define XMLTOOL_DLLLOCAL __attribute__ ((visibility("hidden")))
49 #define XMLTOOL_DLLPUBLIC __attribute__ ((visibility("default")))
51 #define XMLTOOL_EXPORT
52 #define XMLTOOL_DLLLOCAL
53 #define XMLTOOL_DLLPUBLIC
57 // Define XMLTOOL_API for DLL builds
58 #ifdef XMLTOOLING_EXPORTS
59 #define XMLTOOL_API XMLTOOL_EXPORT
61 #define XMLTOOL_API XMLTOOL_IMPORT
64 // Throwable classes must always be visible on GCC in all binaries
66 #define XMLTOOL_EXCEPTIONAPI(api) api
67 #elif defined(GCC_HASCLASSVISIBILITY)
68 #define XMLTOOL_EXCEPTIONAPI(api) XMLTOOL_EXPORT
70 #define XMLTOOL_EXCEPTIONAPI(api)
78 #define XMLTOOLING_DOXYGEN(desc) /##** desc */
80 #define XMLTOOLING_DOXYGEN(desc)
84 * Blocks copy c'tor and assignment operator for a class.
86 #define MAKE_NONCOPYABLE(type) \
89 type& operator=(const type&);
92 * Begins the declaration of an XMLObject specialization.
93 * Basic boilerplate includes a protected constructor, empty virtual destructor,
94 * and Unicode constants for the default associated element's name and prefix.
96 * @param cname the name of the class to declare
97 * @param base the base class to derive from using public virtual inheritance
99 #define BEGIN_XMLOBJECT(cname,base) \
100 class XMLTOOL_API cname : public virtual base, public virtual ValidatingXMLObject { \
104 virtual ~cname() {} \
105 XMLTOOLING_DOXYGEN(Type-specific clone method.) \
106 virtual cname* clone##cname() const=0; \
107 XMLTOOLING_DOXYGEN(Element local name) \
108 static const XMLCh LOCAL_NAME[]
111 * Ends the declaration of an XMLObject specialization.
113 #define END_XMLOBJECT }
116 * Declares abstract get/set methods for a named XML attribute.
118 * @param proper the proper name of the attribute
119 * @param upcased the upcased name of the attribute
121 #define DECL_XMLOBJECT_ATTRIB(proper,upcased) \
122 XMLTOOLING_DOXYGEN(proper attribute name) \
123 static const XMLCh upcased##_ATTRIB_NAME[]; \
124 XMLTOOLING_DOXYGEN(Returns the proper attribute.) \
125 virtual const XMLCh* get##proper() const=0; \
126 XMLTOOLING_DOXYGEN(Sets the proper attribute.) \
127 virtual void set##proper(const XMLCh* proper)=0
130 * Implements get/set methods and a private member for a named XML attribute.
132 * @param proper the proper name of the attribute
134 #define IMPL_XMLOBJECT_ATTRIB(proper) \
138 const XMLCh* get##proper() const { \
141 void set##proper(const XMLCh* proper) { \
142 m_##proper = prepareForAssignment(m_##proper,proper); \
146 * Declares abstract get/set methods for named XML element content.
148 * @param proper the proper name to label the element's content
150 #define DECL_XMLOBJECT_CONTENT(proper) \
151 XMLTOOLING_DOXYGEN(Returns proper.) \
152 virtual const XMLCh* get##proper() const=0; \
153 XMLTOOLING_DOXYGEN(Sets proper.) \
154 virtual void set##proper(const XMLCh* proper)=0
157 * Implements get/set methods and a private member for named XML element content.
159 * @param proper the proper name to label the element's content
161 #define IMPL_XMLOBJECT_CONTENT(proper) \
165 const XMLCh* get##proper() const { \
168 void set##proper(const XMLCh* proper) { \
169 m_##proper = prepareForAssignment(m_##proper,proper); \
172 void marshallElementContent(DOMElement* domElement) const { \
173 if(get##proper()) { \
174 domElement->appendChild(domElement->getOwnerDocument()->createTextNode(get##proper())); \
177 void processElementContent(const XMLCh* elementContent) { \
178 set##proper(elementContent); \
183 * Implements cloning methods for an XMLObject specialization implementation class.
185 * @param cname the name of the XMLObject specialization
187 #define IMPL_XMLOBJECT_CLONE(cname) \
188 cname* clone##cname() const { \
191 cname* clone() const { \
192 auto_ptr<XMLObject> domClone(AbstractDOMCachingXMLObject::clone()); \
193 cname##Impl* ret=dynamic_cast<cname##Impl*>(domClone.get()); \
195 domClone.release(); \
198 return new cname##Impl(*this); \
202 * Begins the declaration of an XMLObjectBuilder specialization.
203 * Basic boilerplate includes an empty virtual destructor, and
206 * @param cname the name of the XMLObject specialization
208 #define BEGIN_XMLOBJECTBUILDER(cname) \
209 XMLTOOLING_DOXYGEN(Builder for cname objects.) \
210 class XMLTOOL_API cname##Builder : public xmltooling::XMLObjectBuilder { \
212 virtual ~cname##Builder() {} \
213 XMLTOOLING_DOXYGEN(Default builder.) \
214 virtual cname* buildObject() const=0
217 * Ends the declaration of an XMLObjectBuilder specialization.
219 #define END_XMLOBJECTBUILDER }
222 * Begins the declaration of an XMLObjectBuilder specialization implementation class.
224 * @param cname the name of the XMLObject specialization
225 * @param namespaceURI the XML namespace of the default associated element
226 * @param namespacePrefix the XML namespace prefix of the default associated element
228 #define BEGIN_XMLOBJECTBUILDERIMPL(cname,namespaceURI,namespacePrefix) \
229 class XMLTOOL_DLLLOCAL cname##BuilderImpl : public cname##Builder { \
231 cname* buildObject( \
232 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const QName* schemaType=NULL \
234 cname* buildObject() const { \
235 return buildObject(namespaceURI,cname::LOCAL_NAME,namespacePrefix); \
239 * Begins the declaration of an XMLObjectBuilder specialization implementation class.
241 * @param cname the name of the XMLObject specialization
243 #define IMPL_XMLOBJECTBUILDER(cname) \
244 cname* cname##BuilderImpl::buildObject( \
245 const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType \
248 return new cname##Impl(nsURI,localName,prefix,schemaType); \
252 * Ends the declaration of an XMLObjectBuilder specialization implementation class.
254 #define END_XMLOBJECTBUILDERIMPL }
257 * Begins the declaration of a Validator specialization.
259 * @param cname the base name of the Validator specialization
261 #define BEGIN_XMLOBJECTVALIDATOR(cname) \
262 class cname##Validator : public Validator \
265 virtual ~cname##Validator() {} \
266 Validator* clone() const { \
267 return new cname##Validator(); \
269 void validate(const XMLObject* xmlObject) const
272 * Ends the declaration of a Validator specialization.
274 #define END_XMLOBJECTVALIDATOR }
279 namespace xmltooling {
282 * Template function for cloning a sequence of XMLObjects.
283 * Invokes the clone() member on each element of the input sequence and adds the copy to
284 * the output sequence. Order is preserved.
286 * @param in input sequence to clone
287 * @param out output sequence to copy cloned pointers into
289 template<class InputSequence,class OutputSequence> void clone(const InputSequence& in, OutputSequence& out) {
290 for (typename InputSequence::const_iterator i=in.begin(); i!=in.end(); i++) {
292 out.push_back((*i)->clone());
299 * Functor for cleaning up heap objects in containers.
301 template<class T> struct cleanup
304 * Function operator to delete an object.
306 * @param ptr object to delete
308 void operator()(T* ptr) {delete ptr;}
311 * Function operator to delete an object stored as const.
313 * @param ptr object to delete after casting away const
315 void operator()(const T* ptr) {delete const_cast<T*>(ptr);}
319 * Functor for cleaning up heap objects in key/value containers.
321 template<class A,class B> struct cleanup_pair
324 * Function operator to delete an object.
326 * @param p a pair in which the second component is the object to delete
328 void operator()(const std::pair<A,B*>& p) {delete p.second;}
332 #endif /* __xmltooling_base_h__ */