From e77029508fd0e32d7172e7f9d7cda7e7f5805daa Mon Sep 17 00:00:00 2001 From: Vasilii Rogin Date: Sun, 14 May 2023 22:09:22 +0300 Subject: [PATCH] Moving into ArrayElement --- src/sfall_arrays.cc | 52 +++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/src/sfall_arrays.cc b/src/sfall_arrays.cc index b7adc7f..68e1647 100644 --- a/src/sfall_arrays.cc +++ b/src/sfall_arrays.cc @@ -55,14 +55,14 @@ enum class ArrayElementType { /** * 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 * 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. - * + * */ class ArrayElement { private: @@ -79,6 +79,17 @@ public: // 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 ArrayElement(ProgramValue programValue, Program* program) @@ -232,12 +243,7 @@ public: } else if (newLen > 0) { if (newLen > ARRAY_MAX_SIZE) newLen = ARRAY_MAX_SIZE; // safety - std::vector newValues; - newValues.reserve(newLen); - for (size_t i = 0; i < std::min(newLen, size()); i++) { - newValues.push_back(values[i]); - }; - values = newValues; + values.resize(newLen); } else if (newLen >= ARRAY_ACTION_SHUFFLE) { ListSort(values, newLen, std::less()); } @@ -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 if (iter != map.end()) { map.erase(iter); - std::vector newKeys; - newKeys.reserve(keys.size() - 1); - for (auto keyCandidate : keys) { - if (keyCandidate == keyEl) { - // skip this key - } else { - newKeys.push_back(keyCandidate); - } + + if (keys.size() == 0) { + throw(std::exception()); + } + auto it = std::find(keys.begin(), + keys.end(), keyEl); + 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 { if (iter == map.end()) { @@ -348,7 +358,7 @@ public: newKeys.reserve(newLen); 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++) {