diff --git a/uppsrc/Core/Value.cpp b/uppsrc/Core/Value.cpp index 2ee6c2c2f..abe87f554 100644 --- a/uppsrc/Core/Value.cpp +++ b/uppsrc/Core/Value.cpp @@ -320,7 +320,8 @@ Vector& ValueArray::Clone() { return data->data; } -ValueArray::ValueArray() { +void ValueArray::Init0() +{ data = &Single(); data->Retain(); } @@ -330,11 +331,6 @@ ValueArray::ValueArray(const ValueArray& v) { data->Retain(); } -ValueArray::ValueArray(const Nuller&) { - data = &Single(); - data->Retain(); -} - ValueArray::ValueArray(pick_ Vector& v) { Create() = v; @@ -408,7 +404,7 @@ void ValueArray::Add(const Value& v) { void ValueArray::Set(int i, const Value& v) { ASSERT(i >= 0); - Clone().DoIndex(i) = v; + Clone().At(i) = v; } void ValueArray::Remove(int i) @@ -500,6 +496,21 @@ ValueMap::ValueMap(const ValueMap& v) data->Retain(); } +ValueMap::ValueMap(pick_ Index& k, pick_ Vector& v) +{ + Data& d = Create(); + d.key = k; + d.value = ValueArray(v); +} + +ValueMap::ValueMap(const Index& k, const Vector& v, int deep) +{ + Data& d = Create(); + d.key <<= k; + Vector _v(v, 0); + d.value = ValueArray(_v); +} + ValueMap::operator Value() const { data->Retain(); return Value(data); @@ -556,6 +567,21 @@ void ValueMap::Add(const Value& key, const Value& value) { d.value.Add(value); } +void ValueMap::Set(int i, const Value& v) { + Clone().value.Set(i, v); +} + +void ValueMap::SetKey(int i, const Value& k) { + Clone().key.Set(i, k); +} + +void ValueMap::Remove(int i) +{ + Data& d = Clone(); + d.key.Remove(i); + d.value.Remove(i); +} + Value ValueMap::operator[](const Value& key) const { int q = data->key.Find(key); diff --git a/uppsrc/Core/Value.h b/uppsrc/Core/Value.h index db74a32e5..048c2f711 100644 --- a/uppsrc/Core/Value.h +++ b/uppsrc/Core/Value.h @@ -626,11 +626,12 @@ class ValueArray : AssignValueTypeNo& Create(); Vector& Clone(); + void Init0(); friend Value::Void *ValueArrayDataCreate(Stream& s); public: - ValueArray(); + ValueArray() { Init0(); } ValueArray(const ValueArray& v); explicit ValueArray(pick_ Vector& values); explicit ValueArray(const Vector& values, int deep); @@ -641,7 +642,7 @@ public: operator Value() const; ValueArray(const Value& src); - ValueArray(const Nuller&); + ValueArray(const Nuller&) { Init0(); } bool IsNull() const { return data->IsNull(); } void Clear(); @@ -698,6 +699,8 @@ class ValueMap : AssignValueTypeNo >{ public: ValueMap() { Init0(); } ValueMap(const ValueMap& v); + ValueMap(pick_ Index& k, pick_ Vector& v); + ValueMap(const Index& k, const Vector& v, int deep); ~ValueMap(); ValueMap& operator=(const ValueMap& v); @@ -709,11 +712,19 @@ public: bool IsNullInstance() const { return data->IsNull(); } void Clear(); + int GetCount() const { return data->value.GetCount(); } + bool IsEmpty() const { return data->value.IsEmpty(); } void Add(const Value& key, const Value& value); void Add(const String& s, const Value& value) { Add(Value(s), value); } void Add(const char *s, const Value& value) { Add(Value(s), value); } void Add(Id id, const Value& value) { Add(Value(id.ToString()), value); } + void Set(int i, const Value& v); + void SetKey(int i, const Value& k); + void SetKey(int i, const String& s) { SetKey(i, Value(s)); } + void SetKey(int i, const char* s) { SetKey(i, Value(s)); } + void SetKey(int i, Id id) { SetKey(i, Value(id.ToString())); } + void Remove(int i); const Index& GetKeys() const { return data->key; } ValueArray GetValues() const { return data->value; }