libt2n: (gerd) basic command handling (still some todos)
[libt2n] / src / container.hxx
diff --git a/src/container.hxx b/src/container.hxx
new file mode 100644 (file)
index 0000000..90053c6
--- /dev/null
@@ -0,0 +1,121 @@
+/***************************************************************************
+ *   Copyright (C) 2006 by Gerd v. Egidy                                   *
+ *   gve@intra2net.com                                                     *
+ *                                                                         *
+ *   This library is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU Lesser General Public License version   *
+ *   2.1 as published by the Free Software Foundation.                     *
+ *                                                                         *
+ *   This library is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU Lesser General Public License for more details.                   *
+ *                                                                         *
+ *   You should have received a copy of the GNU Lesser General Public      *
+ *   License along with this program; if not, write to the                 *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef __LIBT2N_CONTAINER
+#define __LIBT2N_CONTAINER
+
+#include "command.hxx"
+#include "t2n_exception.hxx"
+
+namespace libt2n
+{
+
+/** @brief contains the result (return value or exception) of a executed command
+*/
+class result_container
+{
+    private:
+        enum result_type_t { regular, exception } result_type;
+
+        result *res;
+        t2n_exception *ex;
+
+        friend class boost::serialization::access;
+        // When the class Archive corresponds to an output archive, the
+        // & operator is defined similar to <<.  Likewise, when the class Archive
+        // is a type of input archive the & operator is defined similar to >>.
+        template<class Archive>
+        void serialize(Archive & ar, const unsigned int version)
+        {
+            ar & BOOST_SERIALIZATION_NVP(result_type);
+            ar & BOOST_SERIALIZATION_NVP(res);
+            ar & BOOST_SERIALIZATION_NVP(ex);
+        }
+
+    public:
+        result_container()
+            { res=0; ex=0; }
+
+        result_container(result *_res)
+            { set_result(_res); }
+        result_container(t2n_exception *_ex)
+            { set_exception(_ex); }
+
+        void set_result(result *_res)
+            { res=_res; ex=0; result_type=regular; }
+        void set_exception(t2n_exception *_ex)
+            { res=0; ex=_ex; result_type=exception; }
+
+        /** @brief returns the result or throw the carried exception.
+                   ATTENTION: the result object is deleted in the destructor
+        */
+        result* get_result(void)
+        {
+            if (result_type==exception)
+                ex->do_throw();
+            return res;
+        }
+
+        /// deletes the carried result or exception objects
+        ~result_container()
+        {
+            if (res)
+                delete res;
+            if (ex)
+                delete ex;
+        }
+};
+
+/** @brief contains a command
+*/
+class command_container
+{
+    private:
+        command *cmd;
+
+        friend class boost::serialization::access;
+        template<class Archive>
+        void serialize(Archive & ar, const unsigned int version)
+        {
+            ar & BOOST_SERIALIZATION_NVP(cmd);
+        }
+
+    public:
+        command_container()
+            { cmd=0; }
+        command_container(command *_cmd)
+            { cmd=_cmd; }
+
+        /// return the contained command
+        command* get_command()
+            { return cmd; }
+
+        ~command_container()
+        {
+            if (cmd)
+                delete cmd;
+        }
+};
+
+} // namespace libt2n
+
+BOOST_CLASS_TRACKING(libt2n::result_container, boost::serialization::track_never)
+BOOST_CLASS_TRACKING(libt2n::command_container, boost::serialization::track_never)
+
+#endif
+