mirror of https://github.com/OpenTTD/OpenTTD
Codechange: support strongly typed pool element IDs in squirrel/saveload
parent
30127dfe90
commit
07dd5bf01d
|
@ -1318,6 +1318,7 @@ int64_t ReadValue(const void *ptr, VarType conv);
|
||||||
void WriteValue(void *ptr, VarType conv, int64_t val);
|
void WriteValue(void *ptr, VarType conv, int64_t val);
|
||||||
|
|
||||||
void SlSetArrayIndex(uint index);
|
void SlSetArrayIndex(uint index);
|
||||||
|
static void SlSetArrayIndex(const ConvertibleThroughBase auto &index) { SlSetArrayIndex(index.base()); }
|
||||||
int SlIterateArray();
|
int SlIterateArray();
|
||||||
|
|
||||||
void SlSetStructListLength(size_t length);
|
void SlSetStructListLength(size_t length);
|
||||||
|
|
|
@ -43,13 +43,19 @@ private:
|
||||||
int modifications; ///< Number of modification that has been done. To prevent changing data while valuating.
|
int modifications; ///< Number of modification that has been done. To prevent changing data while valuating.
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
/* Temporary helper functions to get the raw index from either strongly and non-strongly typed pool items. */
|
||||||
|
template <typename T>
|
||||||
|
static auto GetRawIndex(const T &index) { return index; }
|
||||||
|
template <ConvertibleThroughBase T>
|
||||||
|
static auto GetRawIndex(const T &index) { return index.base(); }
|
||||||
|
|
||||||
template <typename T, class ItemValid, class ItemFilter>
|
template <typename T, class ItemValid, class ItemFilter>
|
||||||
static void FillList(ScriptList *list, ItemValid item_valid, ItemFilter item_filter)
|
static void FillList(ScriptList *list, ItemValid item_valid, ItemFilter item_filter)
|
||||||
{
|
{
|
||||||
for (const T *item : T::Iterate()) {
|
for (const T *item : T::Iterate()) {
|
||||||
if (!item_valid(item)) continue;
|
if (!item_valid(item)) continue;
|
||||||
if (!item_filter(item)) continue;
|
if (!item_filter(item)) continue;
|
||||||
list->AddItem(item->index);
|
list->AddItem(GetRawIndex(item->index));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +105,7 @@ protected:
|
||||||
/* Push the root table as instance object, this is what squirrel does for meta-functions. */
|
/* Push the root table as instance object, this is what squirrel does for meta-functions. */
|
||||||
sq_pushroottable(vm);
|
sq_pushroottable(vm);
|
||||||
/* Push all arguments for the valuator function. */
|
/* Push all arguments for the valuator function. */
|
||||||
sq_pushinteger(vm, item->index);
|
sq_pushinteger(vm, GetRawIndex(item->index));
|
||||||
for (int i = 0; i < nparam - 1; i++) {
|
for (int i = 0; i < nparam - 1; i++) {
|
||||||
sq_push(vm, i + 3);
|
sq_push(vm, i + 3);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#define SQUIRREL_HPP
|
#define SQUIRREL_HPP
|
||||||
|
|
||||||
#include <squirrel.h>
|
#include <squirrel.h>
|
||||||
|
#include "../core/convertible_through_base.hpp"
|
||||||
|
|
||||||
/** The type of script we're working with, i.e. for who is it? */
|
/** The type of script we're working with, i.e. for who is it? */
|
||||||
enum class ScriptType : uint8_t {
|
enum class ScriptType : uint8_t {
|
||||||
|
@ -110,6 +111,8 @@ public:
|
||||||
*/
|
*/
|
||||||
void AddConst(const char *var_name, uint value) { this->AddConst(var_name, (int)value); }
|
void AddConst(const char *var_name, uint value) { this->AddConst(var_name, (int)value); }
|
||||||
|
|
||||||
|
void AddConst(const char *var_name, const ConvertibleThroughBase auto &value) { this->AddConst(var_name, static_cast<int>(value.base())); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a const to the stack. Depending on the current state this means
|
* Adds a const to the stack. Depending on the current state this means
|
||||||
* either a const to a class or to the global space.
|
* either a const to a class or to the global space.
|
||||||
|
@ -152,6 +155,7 @@ public:
|
||||||
void InsertResult(bool result);
|
void InsertResult(bool result);
|
||||||
void InsertResult(int result);
|
void InsertResult(int result);
|
||||||
void InsertResult(uint result) { this->InsertResult((int)result); }
|
void InsertResult(uint result) { this->InsertResult((int)result); }
|
||||||
|
void InsertResult(ConvertibleThroughBase auto result) { this->InsertResult(static_cast<int>(result.base())); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call a method of an instance, in various flavors.
|
* Call a method of an instance, in various flavors.
|
||||||
|
|
Loading…
Reference in New Issue