#define NULL 0\r
#endif\r
\r
+#include <utility>\r
+\r
+namespace xmltooling {\r
+\r
+ /**\r
+ * Template function for cloning a sequence of XMLObjects.\r
+ * Invokes the clone() member on each element of the input sequence and adds the copy to\r
+ * the output sequence. Order is preserved.\r
+ * \r
+ * @param in input sequence to clone\r
+ * @param out output sequence to copy cloned pointers into\r
+ */\r
+ template<class InputSequence,class OutputSequence> void clone(const InputSequence& in, OutputSequence& out) {\r
+ for (InputSequence::const_iterator i=in.begin(); i!=in.end(); i++)\r
+ out.push_back((*i)->clone());\r
+ }\r
+\r
+ /*\r
+ * Functor for cleaning up heap objects in containers.\r
+ */\r
+ template<class T> struct cleanup\r
+ {\r
+ /**\r
+ * Function operator to delete an object.\r
+ * \r
+ * @param ptr object to delete\r
+ */\r
+ void operator()(T* ptr) {delete ptr;}\r
+ \r
+ /**\r
+ * Function operator to delete an object stored as const.\r
+ * \r
+ * @param ptr object to delete after casting away const\r
+ */\r
+ void operator()(const T* ptr) {delete const_cast<T*>(ptr);}\r
+ };\r
+\r
+ /*\r
+ * Functor for cleaning up heap objects in key/value containers.\r
+ */\r
+ template<class A,class B> struct cleanup_pair\r
+ {\r
+ /**\r
+ * Function operator to delete an object.\r
+ * \r
+ * @param p a pair in which the second component is the object to delete\r
+ */\r
+ void operator()(const std::pair<A,B*>& p) {delete p.second;}\r
+ };\r
+};\r
+\r
#endif /* __xmltooling_base_h__ */\r