summaryrefslogtreecommitdiff
path: root/helpers.cpp
diff options
context:
space:
mode:
authorKUDr <kudr@openttd.org>2006-11-30 16:03:12 +0000
committerKUDr <kudr@openttd.org>2006-11-30 16:03:12 +0000
commit1235172cc7392325a0f14c2e5d9ab08fadf9fb8c (patch)
treed0b937c0d86acf0c61f997be2286c510c5fbf5d4 /helpers.cpp
parent3e6f89ca7e76c078af713b41cfdece5470b9983c (diff)
downloadopenttd-1235172cc7392325a0f14c2e5d9ab08fadf9fb8c.tar.xz
(svn r7299) -CodeChange: Train and Aircraft Build window GUI code simplified a bit:
- using one engine list instead of 3 - removed engine filters (loco, wagons, helicopters, etc.) - EngineList code isolated from GUI (moved to helpers.cpp - reusing CBlobT code which does exactly what is needed for EngineList) - removed unnecessary "optimization" (rebuild and sort engine list on each WE_PAINT)
Diffstat (limited to 'helpers.cpp')
-rw-r--r--helpers.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/helpers.cpp b/helpers.cpp
new file mode 100644
index 000000000..f8f6aa24f
--- /dev/null
+++ b/helpers.cpp
@@ -0,0 +1,69 @@
+#include "stdafx.h"
+
+EXTERN_C_BEGIN
+#include "openttd.h"
+#include "engine.h"
+EXTERN_C_END
+
+#include <new>
+#include "yapf/blob.hpp"
+
+/* Engine list manipulators - current implementation is only C wrapper around CBlobT<EngineID> (see yapf/blob.hpp) */
+
+/* we cannot expose CBlobT directly to C so we must cast EngineList* to CBlobT<EngineID>* always when we are called from C */
+#define B (*(CBlobT<EngineID>*)el)
+
+/** Create Engine List (and initialize it to empty) */
+void EngList_Create(EngineList *el)
+{
+ // call CBlobT constructor explicitly
+ new (&B) CBlobT<EngineID>();
+}
+
+/** Destroy Engine List (and free its contents) */
+void EngList_Destroy(EngineList *el)
+{
+ // call CBlobT destructor explicitly
+ B.~CBlobT<EngineID>();
+}
+
+/** Return number of items stored in the Engine List */
+uint EngList_Count(const EngineList *el)
+{
+ return B.Size();
+}
+
+/** Add new item at the end of Engine List */
+void EngList_Add(EngineList *el, EngineID eid)
+{
+ B.Append(eid);
+}
+
+/** Return pointer to the items array held by Engine List */
+EngineID* EngList_Items(EngineList *el)
+{
+ return B.Data();
+}
+
+/** Clear the Engine List (by invalidating all its items == reseting item count to zero) */
+void EngList_RemoveAll(EngineList *el)
+{
+ B.Clear();
+}
+
+/** Sort all items using qsort() and given 'CompareItems' function */
+void EngList_Sort(EngineList *el, EngList_SortTypeFunction compare)
+{
+ qsort(B.Data(), B.Size(), sizeof(**el), compare);
+}
+
+/** Sort selected range of items (on indices @ <begin, begin+num_items-1>) */
+void EngList_SortPartial(EngineList *el, EngList_SortTypeFunction compare, uint begin, uint num_items)
+{
+ assert(begin <= (uint)B.Size());
+ assert(begin + num_items <= (uint)B.Size());
+ qsort(B.Data() + begin, num_items, sizeof(**el), compare);
+}
+
+#undef B
+