aboutsummaryrefslogtreecommitdiff
path: root/packages/noncvs/windows/extra/Gem/dev/Gem/Properties.h
diff options
context:
space:
mode:
Diffstat (limited to 'packages/noncvs/windows/extra/Gem/dev/Gem/Properties.h')
-rw-r--r--packages/noncvs/windows/extra/Gem/dev/Gem/Properties.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/packages/noncvs/windows/extra/Gem/dev/Gem/Properties.h b/packages/noncvs/windows/extra/Gem/dev/Gem/Properties.h
new file mode 100644
index 00000000..a5db22dd
--- /dev/null
+++ b/packages/noncvs/windows/extra/Gem/dev/Gem/Properties.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2010-2011 IOhannes m zmölnig. forum::für::umläute. IEM. zmoelnig@iem.at
+ *
+ * map that stores "any"thing
+ *
+ * USAGE:
+ *
+ * Properties am; // create a new Properties
+ * am["a"] = 42; // assign value "42" to key "a"
+ * int i=0;
+ * try { i=any_cast<int>am["a"]; } catch(bad_any_cast ex) { ; } // retrieve value from key "a"; might throw a bad_any_cast exception
+ * am.get("a", i); // retrieve value at key "a"; if there was an error (e.g. typeof(i) does not match, then i is left untouched and "false" is returned
+ *
+ * NOTE:
+ * this simplilstic approach has some problems with type-conversion
+ * e.g. this will fail:
+ * am["a"]=12.0f; any_cast<int>am["a"];
+ */
+
+#ifndef GEM_PROPERTIES_H
+#define GEM_PROPERTIES_H
+
+#include "Utils/any.h"
+#include <vector>
+#include <string>
+
+namespace gem
+{
+ class Properties {
+ private:
+ class PIMPL;
+ PIMPL*pimpl;
+
+ public:
+ enum PropertyType {
+ UNSET=-1, /* not set, in-existant */
+ NONE, /* "bang" */
+ DOUBLE, /* double */
+ STRING, /* std::string */
+ UNKNOWN /* all the rest */
+ };
+
+ Properties(void);
+ Properties(const gem::Properties&); /* copy constructor */
+
+ virtual ~Properties(void);
+
+#if 0
+ /* array/hashmap like access:
+ * e.g.: prop["width"]=640;
+ */
+ virtual gem::any&operator[](const std::string&key);
+#endif
+
+ /* get the value of a property
+ * e.g.: double w=any_cast<double>prop.at("width")
+ */
+ virtual gem::any get(const std::string&key) const;
+
+ /* check whether the given key exists
+ * if the key was in the property-map, return the type of the property
+ * if no key of the given value exists, return <code>PropertyType::UNSET</code>
+ */
+ virtual enum PropertyType type(const std::string) const;
+
+ /* set a property
+ * e.g.: double w=640; prop.set("width", w);
+ */
+ virtual void set(const std::string&key, gem::any value);
+
+ /* get a property
+ * e.g.: double w=320; prop.get("width", w);
+ * NOTE: if no property of the given name exists or the existing property
+ * is of a different (incompatible) type, "value" will not be changed
+ */
+ template<class Class>
+ bool get(const std::string&key, Class&value) const {
+ try {
+ value=gem::any_cast<Class>(get(key));
+ } catch (gem::bad_any_cast e) {
+ return false;
+ }
+ return true;
+ };
+
+ /* get all keys
+ */
+ virtual std::vector<std::string>keys(void) const;
+
+ /*
+ * delete a given key from the Properties
+ */
+ virtual void erase(const std::string);
+ /*
+ * delete all keys from the Properties
+ */
+ virtual void clear(void);
+
+
+ /*
+ * assign Properties from another set
+ */
+ virtual gem::Properties& assign(const gem::Properties&);
+ gem::Properties& operator= (const gem::Properties&org) { return assign(org); }
+
+ };
+};
+#endif /* GEM_PROPERTIES_H */