Skip to content

Commit

Permalink
Add: [Script] Native priority queue; useful e.g. for pathfinders.
Browse files Browse the repository at this point in the history
  • Loading branch information
michicc committed May 23, 2020
1 parent 800ade7 commit bcaa8d9
Show file tree
Hide file tree
Showing 18 changed files with 335 additions and 0 deletions.
2 changes: 2 additions & 0 deletions projects/openttd_vs140.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,7 @@
<ClInclude Include="..\src\script\api\script_news.hpp" />
<ClInclude Include="..\src\script\api\script_object.hpp" />
<ClInclude Include="..\src\script\api\script_order.hpp" />
<ClInclude Include="..\src\script\api\script_priorityqueue.hpp" />
<ClInclude Include="..\src\script\api\script_rail.hpp" />
<ClInclude Include="..\src\script\api\script_railtypelist.hpp" />
<ClInclude Include="..\src\script\api\script_road.hpp" />
Expand Down Expand Up @@ -1163,6 +1164,7 @@
<ClCompile Include="..\src\script\api\script_news.cpp" />
<ClCompile Include="..\src\script\api\script_object.cpp" />
<ClCompile Include="..\src\script\api\script_order.cpp" />
<ClCompile Include="..\src\script\api\script_priorityqueue.cpp" />
<ClCompile Include="..\src\script\api\script_rail.cpp" />
<ClCompile Include="..\src\script\api\script_railtypelist.cpp" />
<ClCompile Include="..\src\script\api\script_road.cpp" />
Expand Down
6 changes: 6 additions & 0 deletions projects/openttd_vs140.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -2379,6 +2379,9 @@
<ClInclude Include="..\src\script\api\script_order.hpp">
<Filter>Script API</Filter>
</ClInclude>
<ClInclude Include="..\src\script\api\script_priorityqueue.hpp">
<Filter>Script API</Filter>
</ClInclude>
<ClInclude Include="..\src\script\api\script_rail.hpp">
<Filter>Script API</Filter>
</ClInclude>
Expand Down Expand Up @@ -2580,6 +2583,9 @@
<ClCompile Include="..\src\script\api\script_order.cpp">
<Filter>Script API Implementation</Filter>
</ClCompile>
<ClCompile Include="..\src\script\api\script_priorityqueue.cpp">
<Filter>Script API Implementation</Filter>
</ClCompile>
<ClCompile Include="..\src\script\api\script_rail.cpp">
<Filter>Script API Implementation</Filter>
</ClCompile>
Expand Down
2 changes: 2 additions & 0 deletions projects/openttd_vs141.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,7 @@
<ClInclude Include="..\src\script\api\script_news.hpp" />
<ClInclude Include="..\src\script\api\script_object.hpp" />
<ClInclude Include="..\src\script\api\script_order.hpp" />
<ClInclude Include="..\src\script\api\script_priorityqueue.hpp" />
<ClInclude Include="..\src\script\api\script_rail.hpp" />
<ClInclude Include="..\src\script\api\script_railtypelist.hpp" />
<ClInclude Include="..\src\script\api\script_road.hpp" />
Expand Down Expand Up @@ -1163,6 +1164,7 @@
<ClCompile Include="..\src\script\api\script_news.cpp" />
<ClCompile Include="..\src\script\api\script_object.cpp" />
<ClCompile Include="..\src\script\api\script_order.cpp" />
<ClCompile Include="..\src\script\api\script_priorityqueue.cpp" />
<ClCompile Include="..\src\script\api\script_rail.cpp" />
<ClCompile Include="..\src\script\api\script_railtypelist.cpp" />
<ClCompile Include="..\src\script\api\script_road.cpp" />
Expand Down
6 changes: 6 additions & 0 deletions projects/openttd_vs141.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -2379,6 +2379,9 @@
<ClInclude Include="..\src\script\api\script_order.hpp">
<Filter>Script API</Filter>
</ClInclude>
<ClInclude Include="..\src\script\api\script_priorityqueue.hpp">
<Filter>Script API</Filter>
</ClInclude>
<ClInclude Include="..\src\script\api\script_rail.hpp">
<Filter>Script API</Filter>
</ClInclude>
Expand Down Expand Up @@ -2580,6 +2583,9 @@
<ClCompile Include="..\src\script\api\script_order.cpp">
<Filter>Script API Implementation</Filter>
</ClCompile>
<ClCompile Include="..\src\script\api\script_priorityqueue.cpp">
<Filter>Script API Implementation</Filter>
</ClCompile>
<ClCompile Include="..\src\script\api\script_rail.cpp">
<Filter>Script API Implementation</Filter>
</ClCompile>
Expand Down
2 changes: 2 additions & 0 deletions projects/openttd_vs142.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,7 @@
<ClInclude Include="..\src\script\api\script_news.hpp" />
<ClInclude Include="..\src\script\api\script_object.hpp" />
<ClInclude Include="..\src\script\api\script_order.hpp" />
<ClInclude Include="..\src\script\api\script_priorityqueue.hpp" />
<ClInclude Include="..\src\script\api\script_rail.hpp" />
<ClInclude Include="..\src\script\api\script_railtypelist.hpp" />
<ClInclude Include="..\src\script\api\script_road.hpp" />
Expand Down Expand Up @@ -1163,6 +1164,7 @@
<ClCompile Include="..\src\script\api\script_news.cpp" />
<ClCompile Include="..\src\script\api\script_object.cpp" />
<ClCompile Include="..\src\script\api\script_order.cpp" />
<ClCompile Include="..\src\script\api\script_priorityqueue.cpp" />
<ClCompile Include="..\src\script\api\script_rail.cpp" />
<ClCompile Include="..\src\script\api\script_railtypelist.cpp" />
<ClCompile Include="..\src\script\api\script_road.cpp" />
Expand Down
6 changes: 6 additions & 0 deletions projects/openttd_vs142.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -2379,6 +2379,9 @@
<ClInclude Include="..\src\script\api\script_order.hpp">
<Filter>Script API</Filter>
</ClInclude>
<ClInclude Include="..\src\script\api\script_priorityqueue.hpp">
<Filter>Script API</Filter>
</ClInclude>
<ClInclude Include="..\src\script\api\script_rail.hpp">
<Filter>Script API</Filter>
</ClInclude>
Expand Down Expand Up @@ -2580,6 +2583,9 @@
<ClCompile Include="..\src\script\api\script_order.cpp">
<Filter>Script API Implementation</Filter>
</ClCompile>
<ClCompile Include="..\src\script\api\script_priorityqueue.cpp">
<Filter>Script API Implementation</Filter>
</ClCompile>
<ClCompile Include="..\src\script\api\script_rail.cpp">
<Filter>Script API Implementation</Filter>
</ClCompile>
Expand Down
2 changes: 2 additions & 0 deletions source.list
Original file line number Diff line number Diff line change
Expand Up @@ -830,6 +830,7 @@ script/api/script_marine.hpp
script/api/script_news.hpp
script/api/script_object.hpp
script/api/script_order.hpp
script/api/script_priorityqueue.hpp
script/api/script_rail.hpp
script/api/script_railtypelist.hpp
script/api/script_road.hpp
Expand Down Expand Up @@ -899,6 +900,7 @@ script/api/script_marine.cpp
script/api/script_news.cpp
script/api/script_object.cpp
script/api/script_order.cpp
script/api/script_priorityqueue.cpp
script/api/script_rail.cpp
script/api/script_railtypelist.cpp
script/api/script_road.cpp
Expand Down
2 changes: 2 additions & 0 deletions src/ai/ai_instance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#include "../script/api/ai/ai_map.hpp.sq"
#include "../script/api/ai/ai_marine.hpp.sq"
#include "../script/api/ai/ai_order.hpp.sq"
#include "../script/api/ai/ai_priorityqueue.hpp.sq"
#include "../script/api/ai/ai_rail.hpp.sq"
#include "../script/api/ai/ai_railtypelist.hpp.sq"
#include "../script/api/ai/ai_road.hpp.sq"
Expand Down Expand Up @@ -164,6 +165,7 @@ void AIInstance::RegisterAPI()
SQAIMap_Register(this->engine);
SQAIMarine_Register(this->engine);
SQAIOrder_Register(this->engine);
SQAIPriorityQueue_Register(this->engine);
SQAIRail_Register(this->engine);
SQAIRailTypeList_Register(this->engine);
SQAIRoad_Register(this->engine);
Expand Down
2 changes: 2 additions & 0 deletions src/game/game_instance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
#include "../script/api/game/game_marine.hpp.sq"
#include "../script/api/game/game_news.hpp.sq"
#include "../script/api/game/game_order.hpp.sq"
#include "../script/api/game/game_priorityqueue.hpp.sq"
#include "../script/api/game/game_rail.hpp.sq"
#include "../script/api/game/game_railtypelist.hpp.sq"
#include "../script/api/game/game_road.hpp.sq"
Expand Down Expand Up @@ -173,6 +174,7 @@ void GameInstance::RegisterAPI()
SQGSMarine_Register(this->engine);
SQGSNews_Register(this->engine);
SQGSOrder_Register(this->engine);
SQGSPriorityQueue_Register(this->engine);
SQGSRail_Register(this->engine);
SQGSRailTypeList_Register(this->engine);
SQGSRoad_Register(this->engine);
Expand Down
31 changes: 31 additions & 0 deletions src/script/api/ai/ai_priorityqueue.hpp.sq
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/

/* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */

#include "../script_priorityqueue.hpp"
#include "../template/template_priorityqueue.hpp.sq"


template <> const char *GetClassName<ScriptPriorityQueue, ST_AI>() { return "AIPriorityQueue"; }

void SQAIPriorityQueue_Register(Squirrel *engine)
{
DefSQClass<ScriptPriorityQueue, ST_AI> SQAIPriorityQueue("AIPriorityQueue");
SQAIPriorityQueue.PreRegister(engine);
SQAIPriorityQueue.AddConstructor<void (ScriptPriorityQueue::*)(), 1>(engine, "x");

SQAIPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Insert, "Insert");
SQAIPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Pop, "Pop");
SQAIPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Peek, "Peek");
SQAIPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Exists, "Exists");
SQAIPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Clear, "Clear");
SQAIPriorityQueue.DefSQMethod(engine, &ScriptPriorityQueue::IsEmpty, "IsEmpty", 1, "x");
SQAIPriorityQueue.DefSQMethod(engine, &ScriptPriorityQueue::Count, "Count", 1, "x");

SQAIPriorityQueue.PostRegister(engine);
}
3 changes: 3 additions & 0 deletions src/script/api/ai_changelog.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
*
* This version is not yet released. The following changes are not set in stone yet.
*
* API additions:
* \li AIPriorityQueue
*
* \b 1.10.0
*
* API additions:
Expand Down
31 changes: 31 additions & 0 deletions src/script/api/game/game_priorityqueue.hpp.sq
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/

/* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */

#include "../script_priorityqueue.hpp"
#include "../template/template_priorityqueue.hpp.sq"


template <> const char *GetClassName<ScriptPriorityQueue, ST_GS>() { return "GSPriorityQueue"; }

void SQGSPriorityQueue_Register(Squirrel *engine)
{
DefSQClass<ScriptPriorityQueue, ST_GS> SQGSPriorityQueue("GSPriorityQueue");
SQGSPriorityQueue.PreRegister(engine);
SQGSPriorityQueue.AddConstructor<void (ScriptPriorityQueue::*)(), 1>(engine, "x");

SQGSPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Insert, "Insert");
SQGSPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Pop, "Pop");
SQGSPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Peek, "Peek");
SQGSPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Exists, "Exists");
SQGSPriorityQueue.DefSQAdvancedMethod(engine, &ScriptPriorityQueue::Clear, "Clear");
SQGSPriorityQueue.DefSQMethod(engine, &ScriptPriorityQueue::IsEmpty, "IsEmpty", 1, "x");
SQGSPriorityQueue.DefSQMethod(engine, &ScriptPriorityQueue::Count, "Count", 1, "x");

SQGSPriorityQueue.PostRegister(engine);
}
1 change: 1 addition & 0 deletions src/script/api/game_changelog.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
* \li GSStoryPage::MakePushButtonReference
* \li GSStoryPage::MakeTileButtonReference
* \li GSStoryPage::MakeVehicleButtonReference
* \li GSPriorityQueue
*
* \b 1.10.0
*
Expand Down
107 changes: 107 additions & 0 deletions src/script/api/script_priorityqueue.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/

/** @file script_priorityqueue.cpp Implementation of ScriptPriorityQueue. */

#include "../../stdafx.h"
#include "script_priorityqueue.hpp"
#include "script_error.hpp"
#include "../squirrel_helper.hpp"
#include "../script_instance.hpp"
#include "../../debug.h"
#include <algorithm>

#include "../../safeguards.h"


static bool operator==(const ScriptPriorityQueue::PriorityItem &lhs, const HSQOBJECT &rhs)
{
return lhs.second._type == rhs._type && lhs.second._unVal.raw == rhs._unVal.raw;
}


ScriptPriorityQueue::~ScriptPriorityQueue()
{
/* Release reference to stored objects. */
auto inst = ScriptObject::GetActiveInstance();
if (!inst->InShutdown()) {
for (auto &i : this->queue) inst->ReleaseSQObject(const_cast<HSQOBJECT *>(&i.second));
}
}

SQInteger ScriptPriorityQueue::Insert(HSQUIRRELVM vm)
{
HSQOBJECT item;
int64 priority;
sq_resetobject(&item);
sq_getstackobj(vm, 2, &item);
sq_getinteger(vm, 3, &priority);

sq_addref(vm, &item); // Keep object alive.

this->queue.emplace_back(priority, item);
std::push_heap(this->queue.begin(), this->queue.end(), this->comp);

return SQConvert::Return(vm, true);
}

SQInteger ScriptPriorityQueue::Pop(HSQUIRRELVM vm)
{
if (this->IsEmpty()) {
ScriptObject::SetLastError(ScriptError::ERR_PRECONDITION_FAILED);
sq_pushnull(vm);
return 1;
}

HSQOBJECT item = this->queue.front().second;
std::pop_heap(this->queue.begin(), this->queue.end(), this->comp);
this->queue.pop_back();

/* Store the object on the Squirrel stack before releasing it to make sure the ref count can't drop to zero. */
auto ret = SQConvert::Return(vm, item);
sq_release(vm, &item);
return ret;
}

SQInteger ScriptPriorityQueue::Peek(HSQUIRRELVM vm)
{
if (this->IsEmpty()) {
ScriptObject::SetLastError(ScriptError::ERR_PRECONDITION_FAILED);
sq_pushnull(vm);
return 1;
}

return SQConvert::Return(vm, this->queue.front().second);
}

SQInteger ScriptPriorityQueue::Exists(HSQUIRRELVM vm)
{
HSQOBJECT item;
sq_resetobject(&item);
sq_getstackobj(vm, 2, &item);

return SQConvert::Return(vm, std::find(this->queue.cbegin(), this->queue.cend(), item) != this->queue.cend());
}

SQInteger ScriptPriorityQueue::Clear(HSQUIRRELVM vm)
{
/* Release reference to stored objects. */
for (auto &i : this->queue) sq_release(vm, const_cast<HSQOBJECT *>(&i.second));
this->queue.clear();

return 0;
}

bool ScriptPriorityQueue::IsEmpty()
{
return this->queue.empty();
}

SQInteger ScriptPriorityQueue::Count()
{
return (SQInteger)this->queue.size();
}
Loading

0 comments on commit bcaa8d9

Please sign in to comment.