Moving into ArrayElement
This commit is contained in:
parent
3d36f415ba
commit
e77029508f
|
@ -55,14 +55,14 @@ enum class ArrayElementType {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is mostly the same as ProgramValue but it owns strings.
|
* This is mostly the same as ProgramValue but it owns strings.
|
||||||
*
|
*
|
||||||
* This is done because when we pop dynamic string element from
|
* This is done because when we pop dynamic string element from
|
||||||
* the stack we decrease ref count for this string and it memory
|
* the stack we decrease ref count for this string and it memory
|
||||||
* can be freed.
|
* can be freed.
|
||||||
*
|
*
|
||||||
* In theory arrays can be shared between programs so we also
|
* In theory arrays can be shared between programs so we also
|
||||||
* have to copy static strings.
|
* have to copy static strings.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class ArrayElement {
|
class ArrayElement {
|
||||||
private:
|
private:
|
||||||
|
@ -79,6 +79,17 @@ public:
|
||||||
// todo
|
// todo
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ArrayElement(const ArrayElement& other) = delete;
|
||||||
|
ArrayElement& operator=(const ArrayElement& rhs) = delete;
|
||||||
|
ArrayElement(ArrayElement&& other) {
|
||||||
|
// todo
|
||||||
|
};
|
||||||
|
ArrayElement& operator=(ArrayElement&& rhs)
|
||||||
|
{
|
||||||
|
// todo
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Remove all other constructors
|
// TODO: Remove all other constructors
|
||||||
|
|
||||||
ArrayElement(ProgramValue programValue, Program* program)
|
ArrayElement(ProgramValue programValue, Program* program)
|
||||||
|
@ -232,12 +243,7 @@ public:
|
||||||
} else if (newLen > 0) {
|
} else if (newLen > 0) {
|
||||||
if (newLen > ARRAY_MAX_SIZE) newLen = ARRAY_MAX_SIZE; // safety
|
if (newLen > ARRAY_MAX_SIZE) newLen = ARRAY_MAX_SIZE; // safety
|
||||||
|
|
||||||
std::vector<ArrayElement> newValues;
|
values.resize(newLen);
|
||||||
newValues.reserve(newLen);
|
|
||||||
for (size_t i = 0; i < std::min(newLen, size()); i++) {
|
|
||||||
newValues.push_back(values[i]);
|
|
||||||
};
|
|
||||||
values = newValues;
|
|
||||||
} else if (newLen >= ARRAY_ACTION_SHUFFLE) {
|
} else if (newLen >= ARRAY_ACTION_SHUFFLE) {
|
||||||
ListSort(values, newLen, std::less<ArrayElement>());
|
ListSort(values, newLen, std::less<ArrayElement>());
|
||||||
}
|
}
|
||||||
|
@ -315,16 +321,20 @@ public:
|
||||||
// after assigning zero to a key, no need to store it, because "get_array" returns 0 for non-existent keys: try unset
|
// after assigning zero to a key, no need to store it, because "get_array" returns 0 for non-existent keys: try unset
|
||||||
if (iter != map.end()) {
|
if (iter != map.end()) {
|
||||||
map.erase(iter);
|
map.erase(iter);
|
||||||
std::vector<ArrayElement> newKeys;
|
|
||||||
newKeys.reserve(keys.size() - 1);
|
if (keys.size() == 0) {
|
||||||
for (auto keyCandidate : keys) {
|
throw(std::exception());
|
||||||
if (keyCandidate == keyEl) {
|
}
|
||||||
// skip this key
|
auto it = std::find(keys.begin(),
|
||||||
} else {
|
keys.end(), keyEl);
|
||||||
newKeys.push_back(keyCandidate);
|
if (it == keys.end()) {
|
||||||
}
|
throw(std::exception());
|
||||||
};
|
};
|
||||||
keys = newKeys;
|
auto idx = it - keys.begin();
|
||||||
|
if (idx != keys.size() - 1) {
|
||||||
|
std::swap(keys[idx], keys[size() - 1]);
|
||||||
|
keys.resize(keys.size() - 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (iter == map.end()) {
|
if (iter == map.end()) {
|
||||||
|
@ -348,7 +358,7 @@ public:
|
||||||
newKeys.reserve(newLen);
|
newKeys.reserve(newLen);
|
||||||
|
|
||||||
for (size_t i = 0; i < newLen; i++) {
|
for (size_t i = 0; i < newLen; i++) {
|
||||||
newKeys[i] = keys[i];
|
newKeys[i] = std::move(keys[i]);
|
||||||
};
|
};
|
||||||
|
|
||||||
for (size_t i = newLen; i < size(); i++) {
|
for (size_t i = newLen; i < size(); i++) {
|
||||||
|
|
Loading…
Reference in New Issue