From 2e2086f3f884487b4f456bd4b4c1e21f96987b59 Mon Sep 17 00:00:00 2001 From: smatz Date: Fri, 26 Dec 2008 13:50:46 +0000 Subject: (svn r14742) -Codechange: use SmallMap in two cases to reduce compilation time and binary size --- src/core/smallmap_type.hpp | 101 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/core/smallmap_type.hpp (limited to 'src/core') 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 +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 +struct SmallMap : SmallVector, S> { + typedef ::SmallPair 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 */ -- cgit v1.2.3-70-g09d2