summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2008-12-26 13:50:46 +0000
committersmatz <smatz@openttd.org>2008-12-26 13:50:46 +0000
commitbd92143e7bbf9f48008da45fe2c40857f84c3e5c (patch)
treed8863f9851929f98f51e3a934f8dff902ae3e3d4 /src/core
parent4ced1d3e9f5b655327256ad1cd6f6c17d2095228 (diff)
downloadopenttd-bd92143e7bbf9f48008da45fe2c40857f84c3e5c.tar.xz
(svn r14742) -Codechange: use SmallMap in two cases to reduce compilation time and binary size
Diffstat (limited to 'src/core')
-rw-r--r--src/core/smallmap_type.hpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/core/smallmap_type.hpp b/src/core/smallmap_type.hpp
new file mode 100644
index 000000000..681cacdff
--- /dev/null
+++ b/src/core/smallmap_type.hpp
@@ -0,0 +1,101 @@
+/* $Id$ */
+
+/** @file smallmap_type.hpp Simple mapping class targeted for small sets of data. Stored data shall be POD ("Plain Old Data")! */
+
+#ifndef SMALLMAP_TYPE_HPP
+#define SMALLMAP_TYPE_HPP
+
+#include "smallvec_type.hpp"
+
+/** Simple pair of data. Both types have to be POD ("Plain Old Data")! */
+template <typename T, typename U>
+struct SmallPair {
+ T first;
+ U second;
+
+ /** Initializes this Pair with data */
+ FORCEINLINE SmallPair(const T &first, const U &second) : first(first), second(second) { }
+};
+
+/** Implementation of simple mapping class. Both types have to be POD ("Plain Old Data")!
+ * It has inherited accessors from SmallVector().
+ * @see SmallVector
+ */
+template <typename T, typename U, uint S = 16>
+struct SmallMap : SmallVector<SmallPair<T, U>, S> {
+ typedef ::SmallPair<T, U> Pair;
+ typedef Pair *iterator;
+
+ /** Creates new SmallMap. Data are initialized in SmallVector constructor */
+ FORCEINLINE SmallMap() { }
+ /** Data are freed in SmallVector destructor */
+ FORCEINLINE ~SmallMap() { }
+
+ /** Finds given key in this map
+ * @param key key to find
+ * @return &Pair(key, data) if found, this->End() if not
+ */
+ FORCEINLINE Pair *Find(const T &key)
+ {
+ for (uint i = 0; i < this->items; i++) {
+ if (key == this->data[i].first) return &this->data[i];
+ }
+ return this->End();
+ }
+
+ /** Removes given pair from this map
+ * @param pair pair to remove
+ * @return true iff key was found
+ * @note it has to be pointer to pair in this map. It is overwritten by the last item.
+ */
+ FORCEINLINE void Erase(Pair *pair)
+ {
+ assert(pair >= this->Begin() && pair < this->End());
+ *pair = this->data[--this->items];
+ }
+
+ /** Removes given key from this map
+ * @param key key to remove
+ * @return true iff key was found
+ * @note last item is moved to its place, so don't increase your iterator if true is returned!
+ */
+ FORCEINLINE bool Erase(const T &key)
+ {
+ for (uint i = 0; i < this->items; i++) {
+ if (key == this->data[i].first) {
+ this->data[i] = this->data[--this->items];
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** Adds new item to this map.
+ * @param key key
+ * @param data data
+ * @return true iff the kay wasn't already present
+ */
+ FORCEINLINE bool Insert(const T &key, const U &data)
+ {
+ if (this->Find(key) != this->End()) return false;
+ new (this->Append()) Pair(key, data);
+ return true;
+ }
+
+ /** Returns data belonging to this key
+ * @param key key
+ * @return data belonging to this key
+ * @note if this key wasn't present, new entry is created
+ */
+ FORCEINLINE U &operator[](const T &key)
+ {
+ for (uint i = 0; i < this->items; i++) {
+ if (key == this->data[i].first) return this->data[i].second;
+ }
+ Pair *n = this->Append();
+ n->first = key;
+ return n->second;
+ }
+};
+
+#endif /* SMALLMAP_TYPE_HPP */