Bug fixes and API changes from second unit test.
[shibboleth/cpp-xmltooling.git] / xmltooling / base.h
index d7c6016..5194776 100644 (file)
 #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