summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2008-12-30 21:04:09 +0000
committerpeter1138 <peter1138@openttd.org>2008-12-30 21:04:09 +0000
commit766bf8deaaf0eb0e79b5712027422e54c22066f7 (patch)
tree1f6c1f3657b9f105bc316a47f529d5ab2be21955
parentaf624ae1571b4430d4b58eef2473c138a1e00716 (diff)
downloadopenttd-766bf8deaaf0eb0e79b5712027422e54c22066f7.tar.xz
(svn r14776) -Fix (r14742): ListPositionMap relied on std::map having sorted the map, which is now done by a manual key sorter on SmallMap. This fixes engine ID list sorting.
-rw-r--r--src/core/smallmap_type.hpp12
-rw-r--r--src/newgrf_engine.cpp3
2 files changed, 15 insertions, 0 deletions
diff --git a/src/core/smallmap_type.hpp b/src/core/smallmap_type.hpp
index 681cacdff..cc2533dd0 100644
--- a/src/core/smallmap_type.hpp
+++ b/src/core/smallmap_type.hpp
@@ -96,6 +96,18 @@ struct SmallMap : SmallVector<SmallPair<T, U>, S> {
n->first = key;
return n->second;
}
+
+ FORCEINLINE void SortByKey()
+ {
+ qsort(this->Begin(), this->items, sizeof(Pair), KeySorter);
+ }
+
+ static int CDECL KeySorter(const void *a, const void *b)
+ {
+ const Pair *pa = (const Pair*)a;
+ const Pair *pb = (const Pair*)b;
+ return pa->first - pb->first;
+ }
};
#endif /* SMALLMAP_TYPE_HPP */
diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp
index 3b950dc8a..75a082429 100644
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -1114,6 +1114,9 @@ void CommitVehicleListOrderChanges()
}
}
+ /* std::map sorted by default, SmallMap does not */
+ lptr_map.SortByKey();
+
/* Get the target position, if it exists */
if (target_e != NULL) {
uint16 target_position = target_e->list_position;