Adding assoc arrays
This commit is contained in:
parent
a06a2c9c9c
commit
a7800a6d49
|
@ -3,12 +3,12 @@
|
||||||
#include "sfall_script_value.h"
|
#include "sfall_script_value.h"
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace fallout {
|
namespace fallout {
|
||||||
|
|
||||||
static ArrayId nextArrayID = 1;
|
static ArrayId nextArrayID = 1;
|
||||||
|
@ -30,6 +30,9 @@ public:
|
||||||
|
|
||||||
class SFallArrayList : public SFallArray {
|
class SFallArrayList : public SFallArray {
|
||||||
private:
|
private:
|
||||||
|
// TODO: SFall copies strings
|
||||||
|
std::vector<SFallScriptValue> values;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SFallArrayList() = delete;
|
SFallArrayList() = delete;
|
||||||
|
|
||||||
|
@ -39,9 +42,6 @@ public:
|
||||||
mFlags = flags;
|
mFlags = flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: SFall copies strings
|
|
||||||
std::vector<SFallScriptValue> values;
|
|
||||||
|
|
||||||
int size()
|
int size()
|
||||||
{
|
{
|
||||||
return values.size();
|
return values.size();
|
||||||
|
@ -84,6 +84,62 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SFallArrayAssoc : public SFallArray {
|
||||||
|
private:
|
||||||
|
// TODO: SFall copies strings
|
||||||
|
std::vector<SFallScriptValue> keys;
|
||||||
|
std::map<SFallScriptValue, SFallScriptValue> map;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SFallArrayAssoc() = delete;
|
||||||
|
|
||||||
|
SFallArrayAssoc(uint32_t flags)
|
||||||
|
{
|
||||||
|
mFlags = flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
int size()
|
||||||
|
{
|
||||||
|
return keys.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
ProgramValue GetArrayKey(int index)
|
||||||
|
{
|
||||||
|
// if (index < -1 || index > size()) {
|
||||||
|
// return SFallScriptValue(0);
|
||||||
|
// };
|
||||||
|
// if (index == -1) { // special index to indicate if array is associative
|
||||||
|
// throw(std::invalid_argument("Not implemented yet"));
|
||||||
|
// };
|
||||||
|
// // TODO: assoc
|
||||||
|
// return SFallScriptValue(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
ProgramValue GetArray(const SFallScriptValue& key)
|
||||||
|
{
|
||||||
|
// TODO assoc
|
||||||
|
|
||||||
|
// auto element_index = key.asInt();
|
||||||
|
// if (element_index < 0 || element_index >= size()) {
|
||||||
|
// return SFallScriptValue(0);
|
||||||
|
// };
|
||||||
|
// return values[element_index];
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetArray(const SFallScriptValue& key, const SFallScriptValue& val, bool allowUnset)
|
||||||
|
{
|
||||||
|
|
||||||
|
// TODO: assoc
|
||||||
|
|
||||||
|
// if (key.isInt()) {
|
||||||
|
// auto index = key.asInt();
|
||||||
|
// if (index >= 0 && index < size()) {
|
||||||
|
// values[index] = key;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
using ArraysMap = std::unordered_map<ArrayId, std::unique_ptr<SFallArray>>;
|
using ArraysMap = std::unordered_map<ArrayId, std::unique_ptr<SFallArray>>;
|
||||||
|
|
||||||
ArraysMap arrays;
|
ArraysMap arrays;
|
||||||
|
@ -97,17 +153,19 @@ ArrayId CreateArray(int len, uint32_t flags)
|
||||||
flags |= SFALL_ARRAYFLAG_ASSOC;
|
flags |= SFALL_ARRAYFLAG_ASSOC;
|
||||||
// TODO: Implement
|
// TODO: Implement
|
||||||
throw(std::invalid_argument("Not implemented yet"));
|
throw(std::invalid_argument("Not implemented yet"));
|
||||||
};
|
} else if (len > ARRAY_MAX_SIZE) {
|
||||||
|
|
||||||
if (len > ARRAY_MAX_SIZE) {
|
|
||||||
len = ARRAY_MAX_SIZE; // safecheck
|
len = ARRAY_MAX_SIZE; // safecheck
|
||||||
}
|
};
|
||||||
|
|
||||||
ArrayId array_id = nextArrayID++;
|
ArrayId array_id = nextArrayID++;
|
||||||
|
|
||||||
stackArrayId = array_id;
|
stackArrayId = array_id;
|
||||||
|
|
||||||
arrays.emplace(std::make_pair(array_id, std::make_unique<SFallArrayList>(len, flags)));
|
if (flags & SFALL_ARRAYFLAG_ASSOC) {
|
||||||
|
arrays.emplace(std::make_pair(array_id, std::make_unique<SFallArrayAssoc>(flags)));
|
||||||
|
} else {
|
||||||
|
arrays.emplace(std::make_pair(array_id, std::make_unique<SFallArrayList>(len, flags)));
|
||||||
|
}
|
||||||
|
|
||||||
return array_id;
|
return array_id;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue