helpers.cpp
author KUDr
Sat, 30 Dec 2006 18:25:01 +0000
branchcustombridgeheads
changeset 5609 ec38986d2c8e
parent 5189 c3f55e80901c
permissions -rw-r--r--
(svn r7655) [cbh] - Fix: [YAPF] another assert (on opposite cbh when it contained choice). Now it is possible to reach choice when exiting wormhole. So the wormhole cost must be taken into consideration when starting new YAPF node.
5189
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
     1
/* $Id$ */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
     2
#include "stdafx.h"
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
     3
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
     4
EXTERN_C_BEGIN
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
     5
#include "openttd.h"
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
     6
#include "engine.h"
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
     7
EXTERN_C_END
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
     8
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
     9
#include <new>
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    10
#include "yapf/blob.hpp"
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    11
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    12
/* Engine list manipulators - current implementation is only C wrapper around CBlobT<EngineID> (see yapf/blob.hpp) */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    13
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    14
/* we cannot expose CBlobT directly to C so we must cast EngineList* to CBlobT<EngineID>* always when we are called from C */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    15
#define B (*(CBlobT<EngineID>*)el)
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    16
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    17
/** Create Engine List (and initialize it to empty) */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    18
void EngList_Create(EngineList *el)
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    19
{
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    20
	// call CBlobT constructor explicitly
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    21
	new (&B) CBlobT<EngineID>();
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    22
}
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    23
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    24
/** Destroy Engine List (and free its contents) */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    25
void EngList_Destroy(EngineList *el)
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    26
{
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    27
	// call CBlobT destructor explicitly
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    28
	B.~CBlobT<EngineID>();
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    29
}
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    30
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    31
/** Return number of items stored in the Engine List */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    32
uint EngList_Count(const EngineList *el)
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    33
{
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    34
	return B.Size();
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    35
}
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    36
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    37
/** Add new item at the end of Engine List */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    38
void EngList_Add(EngineList *el, EngineID eid)
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    39
{
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    40
	B.Append(eid);
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    41
}
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    42
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    43
/** Return pointer to the items array held by Engine List */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    44
EngineID* EngList_Items(EngineList *el)
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    45
{
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    46
	return B.Data();
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    47
}
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    48
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    49
/** Clear the Engine List (by invalidating all its items == reseting item count to zero) */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    50
void EngList_RemoveAll(EngineList *el)
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    51
{
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    52
	B.Clear();
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    53
}
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    54
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    55
/** Sort all items using qsort() and given 'CompareItems' function */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    56
void EngList_Sort(EngineList *el, EngList_SortTypeFunction compare)
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    57
{
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    58
	qsort(B.Data(), B.Size(), sizeof(**el), compare);
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    59
}
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    60
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    61
/** Sort selected range of items (on indices @ <begin, begin+num_items-1>) */
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    62
void EngList_SortPartial(EngineList *el, EngList_SortTypeFunction compare, uint begin, uint num_items)
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    63
{
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    64
	assert(begin <= (uint)B.Size());
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    65
	assert(begin + num_items <= (uint)B.Size());
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    66
	qsort(B.Data() + begin, num_items, sizeof(**el), compare);
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    67
}
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    68
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    69
#undef B
c3f55e80901c (svn r7301) -Fix: (r7299) Forgotten $Id$ and eol-style (peter1138)
KUDr
parents: 5187
diff changeset
    70