diff --git a/src/common.cpp b/src/common.cpp index bded8c3..15c5425 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -228,6 +228,29 @@ Result String::get(const Value& key) const { return res; } +Result String::set_value(const Value& key, const Value& value) const { + if (!key.is()) { + return ERROR(TypeMismatch); + } + + if (!value.is()) { + return ERROR(TypeMismatch); + } + + uint64_t idx = (uint64_t)key.to()->value(); + const String& value_str = *value.to(); + + auto str_size = TRY(size()); + if (idx >= str_size + 1) return ERROR(IndexOutOfRange); + + auto res = TRY(slice(0, idx)); + res = TRY(res.concat(value_str)); + auto rem = TRY(slice(std::min(str_size, idx + 1), str_size)); + res = TRY(res.concat(rem)); + + return Value(std::move(res)); +} + Result Symbol::copy_value() const { return Value(Symbol(TRY(_value.copy()))); } diff --git a/src/common.hpp b/src/common.hpp index a99445b..422e70a 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -541,8 +541,9 @@ class String : public Object { } Result get(const Value& key) const; + Result set_value(const Value& key, const Value& value) const; - Result concat(const char* rhs, uint64_t rhs_size) { + Result concat(const char* rhs, uint64_t rhs_size) const { uint64_t lhs_size = TRY(size()); uint64_t res_size = lhs_size + rhs_size; @@ -557,7 +558,7 @@ class String : public Object { Result concat(const char* rhs) { return concat(rhs, strlen(rhs)); } - Result concat(const char32_t* rhs, uint64_t rhs_size) { + Result concat(const char32_t* rhs, uint64_t rhs_size) const { uint64_t lhs_size = TRY(size()); uint64_t res_size = lhs_size + rhs_size; @@ -570,7 +571,7 @@ class String : public Object { return String(TRY(MkGcRoot(pod))); } - Result concat(String& rhs) { + Result concat(const String& rhs) const { uint64_t rhs_size = TRY(rhs.size()); uint64_t lhs_size = TRY(size()); uint64_t res_size = lhs_size + rhs_size;