X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fcontainer.hxx;fp=src%2Fcontainer.hxx;h=90053c6d266f7018502e10245da9240ca11999ce;hp=0000000000000000000000000000000000000000;hb=7087e18783f91d2b889e880462d1d1da24831c28;hpb=cc68aabb16ec32278df8b071c4c9efec7e9f0dce diff --git a/src/container.hxx b/src/container.hxx new file mode 100644 index 0000000..90053c6 --- /dev/null +++ b/src/container.hxx @@ -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 + 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 + 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 +