Core: ValueMap improvements (thanks Kohait00)

git-svn-id: svn://ultimatepp.org/upp/trunk@3359 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2011-04-19 05:54:50 +00:00
parent fc20c556cd
commit 290137a794
2 changed files with 46 additions and 9 deletions

View file

@ -320,7 +320,8 @@ Vector<Value>& ValueArray::Clone() {
return data->data;
}
ValueArray::ValueArray() {
void ValueArray::Init0()
{
data = &Single<NullData>();
data->Retain();
}
@ -330,11 +331,6 @@ ValueArray::ValueArray(const ValueArray& v) {
data->Retain();
}
ValueArray::ValueArray(const Nuller&) {
data = &Single<NullData>();
data->Retain();
}
ValueArray::ValueArray(pick_ Vector<Value>& 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<Value>& k, pick_ Vector<Value>& v)
{
Data& d = Create();
d.key = k;
d.value = ValueArray(v);
}
ValueMap::ValueMap(const Index<Value>& k, const Vector<Value>& v, int deep)
{
Data& d = Create();
d.key <<= k;
Vector<Value> _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);

View file

@ -626,11 +626,12 @@ class ValueArray : AssignValueTypeNo<ValueArray, VALUEARRAY_V, Moveable<ValueArr
Vector<Value>& Create();
Vector<Value>& Clone();
void Init0();
friend Value::Void *ValueArrayDataCreate(Stream& s);
public:
ValueArray();
ValueArray() { Init0(); }
ValueArray(const ValueArray& v);
explicit ValueArray(pick_ Vector<Value>& values);
explicit ValueArray(const Vector<Value>& 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<ValueMap, VALUEMAP_V, Moveable<ValueMap> >{
public:
ValueMap() { Init0(); }
ValueMap(const ValueMap& v);
ValueMap(pick_ Index<Value>& k, pick_ Vector<Value>& v);
ValueMap(const Index<Value>& k, const Vector<Value>& 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<Value>& GetKeys() const { return data->key; }
ValueArray GetValues() const { return data->value; }