Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add: [Script] Native priority queue; useful e.g. for pathfinders.
  • Loading branch information
michicc committed Apr 19, 2020
1 parent e45bccb commit b3865f5
Show file tree
Hide file tree
Showing 18 changed files with 347 additions and 0 deletions.
2 changes: 2 additions & 0 deletions projects/openttd_vs140.vcxproj
Expand Up @@ -1094,6 +1094,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 @@ -1161,6 +1162,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
Expand Up @@ -2370,6 +2370,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 @@ -2571,6 +2574,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
Expand Up @@ -1094,6 +1094,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 @@ -1161,6 +1162,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
Expand Up @@ -2370,6 +2370,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 @@ -2571,6 +2574,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
Expand Up @@ -1094,6 +1094,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 @@ -1161,6 +1162,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
Expand Up @@ -2370,6 +2370,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 @@ -2571,6 +2574,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
Expand Up @@ -826,6 +826,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 @@ -895,6 +896,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
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
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 @@ -170,6 +171,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
@@ -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
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
@@ -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);
}
3 changes: 3 additions & 0 deletions src/script/api/game_changelog.hpp
Expand Up @@ -17,6 +17,9 @@
*
* This version is not yet released. The following changes are not set in stone yet.
*
* API additions:
* \li GSPriorityQueue
*
* \b 1.10.0
*
* API additions:
Expand Down
109 changes: 109 additions & 0 deletions src/script/api/script_priorityqueue.cpp
@@ -0,0 +1,109 @@
/*
* 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 "../../safeguards.h"


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


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

this->items.clear();
}

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

auto inserted = this->items.insert(item);
if (inserted.second) {
sq_addref(vm, &item); // Keep object alive.
this->queue.emplace(priority, item);
}

return SQConvert::Return(vm, inserted.second);
}

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

HSQOBJECT item = this->queue.top().second;
this->queue.pop();
this->items.erase(item);

/* 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.top().second);
}

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

return SQConvert::Return(vm, this->items.find(item) != this->items.end());
}

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

this->items.clear();
this->queue = ItemQueue();

return 0;
}

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

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

0 comments on commit b3865f5

Please sign in to comment.