Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add: [Script] Native priority queue; useful e.g. for pathfinders. #8091

Merged
merged 1 commit into from
Jun 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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());
}
michicc marked this conversation as resolved.
Show resolved Hide resolved

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