From a15cf65c44d5c224169c32ef5495b68c758134b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Sun, 18 May 2014 16:08:14 +0200 Subject: Imported Upstream version 3.3.0.2 --- libfrontend-elements/frontend-elements/context.hxx | 133 +++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 libfrontend-elements/frontend-elements/context.hxx (limited to 'libfrontend-elements/frontend-elements/context.hxx') diff --git a/libfrontend-elements/frontend-elements/context.hxx b/libfrontend-elements/frontend-elements/context.hxx new file mode 100644 index 0000000..9a31da2 --- /dev/null +++ b/libfrontend-elements/frontend-elements/context.hxx @@ -0,0 +1,133 @@ +// file : frontend-elements/context.hxx +// author : Boris Kolpackov +// copyright : Copyright (c) 2005-2010 Boris Kolpackov +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef FRONTEND_ELEMENTS_CONTEXT_HXX +#define FRONTEND_ELEMENTS_CONTEXT_HXX + +#include + +#include +#include + +namespace FrontendElements +{ + class Context: public NonCopyable + { + typedef + Cult::Containers::Map + Map; + + public: + struct NoEntry {}; + struct Typing {}; + + Context () + { + } + + Void + swap (Context& c) + { + map_.swap (c.map_); + } + + Size + count (Char const* key) const + { + return map_.count (key); + } + + template + X& + get (Char const* key) + { + Map::Iterator i (map_.find (key)); + + if (i == map_.end ()) + throw NoEntry (); + + try + { + return i->second. template value (); + } + catch (Cult::Containers::Any::Typing const&) + { + throw Typing (); + } + } + + template + X const& + get (Char const* key) const + { + Map::ConstIterator i (map_.find (key)); + + if (i == map_.end ()) + throw NoEntry (); + + try + { + return i->second. template value (); + } + catch (Cult::Containers::Any::Typing const&) + { + throw Typing (); + } + } + + template + X const& + get (Char const* key, X const& default_value) const + { + Map::ConstIterator i (map_.find (key)); + + if (i == map_.end ()) + return default_value; + + try + { + return i->second. template value (); + } + catch (Cult::Containers::Any::Typing const&) + { + throw Typing (); + } + } + + template + Void + set (Char const* key, X const& value) + { + try + { + if (!map_.insert (Map::Pair (key, value)).second) + { + Map::Iterator i (map_.find (key)); + i->second.template value () = value; + } + } + catch (Cult::Containers::Any::Typing const&) + { + throw Typing (); + } + } + + Void + remove (Char const* key) + { + Map::Iterator i (map_.find (key)); + + if (i == map_.end ()) + throw NoEntry (); + + map_.erase (i); + } + + private: + Map map_; + }; +} + +#endif // FRONTEND_ELEMENTS_CONTEXT_HXX -- cgit v1.2.3