summaryrefslogtreecommitdiff
path: root/include/multimapwdef.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/multimapwdef.h')
-rw-r--r--include/multimapwdef.h39
1 files changed, 39 insertions, 0 deletions
diff --git a/include/multimapwdef.h b/include/multimapwdef.h
new file mode 100644
index 0000000..89b79a9
--- /dev/null
+++ b/include/multimapwdef.h
@@ -0,0 +1,39 @@
+#ifndef MULTIMAPWDEF
+#define MULTIMAPWDEF
+
+#include <map>
+
+SWORD_NAMESPACE_START
+
+// multmap that still lets you use [] to reference FIRST
+// entry of a key if multiples exist
+template <class Key, class T, class Compare>
+class multimapwithdefault : public std::multimap<Key, T, Compare> {
+public:
+ typedef std::pair<const Key, T> value_type;
+ T& getWithDefault(const Key& k, const T& defaultValue) {
+ if (find(k) == this->end()) {
+ insert(value_type(k, defaultValue));
+ }
+ return (*(find(k))).second;
+ }
+
+ T& operator[](const Key& k) {
+ if (find(k) == this->end()) {
+ insert(value_type(k, T()));
+ }
+ return (*(find(k))).second;
+ }
+ bool has(const Key& k, const T &val) const {
+ typename std::multimap<Key, T, Compare>::const_iterator start = lower_bound(k);
+ typename std::multimap<Key, T, Compare>::const_iterator end = upper_bound(k);
+ for (; start!=end; start++) {
+ if (start->second == val)
+ return true;
+ }
+ return false;
+ }
+};
+
+SWORD_NAMESPACE_END
+#endif