Core: ValueArray, ValueMap Pick

git-svn-id: svn://ultimatepp.org/upp/trunk@7302 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2014-04-23 07:14:40 +00:00
parent 8c1ff0cef8
commit 8812eccc79
4 changed files with 124 additions and 9 deletions

View file

@ -275,6 +275,14 @@ Value ValueArray::GetAndClear(int i)
return v;
}
Vector<Value> ValueArray::Pick()
{
Vector<Value>& x = Clone();
Vector<Value> r = pick(x);
x.Clear();
return r;
}
template<>
String AsString(const ValueArray& v) {
return sAsString(v.Get());
@ -431,12 +439,33 @@ ValueMap::ValueMap(Index<Value> rval_ k, Vector<Value> rval_ v)
d.value = ValueArray(pick(v));
}
ValueMap::ValueMap(VectorMap<Value, Value> rval_ m)
{
Data& d = Create();
d.key = m.PickKeys();
d.value = ValueArray(m.PickValues());
}
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(pick(_v));
d.value = ValueArray(v, 0);
}
ValueMap::ValueMap(const VectorMap<Value, Value>& m, int deep)
{
Data& d = Create();
d.key = clone(m.GetKeys());
d.value = ValueArray(m.GetValues(), 0);
}
VectorMap<Value, Value> ValueMap::Pick()
{
Data& d = Clone();
VectorMap<Value, Value> m(d.key.PickKeys(), d.value.Pick());
d.key.Clear();
return m;
}
ValueMap::operator Value() const {

View file

@ -221,6 +221,7 @@ public:
~ValueArray();
ValueArray& operator=(const ValueArray& v);
ValueArray& operator=(Vector<Value> rval_ values) { *this = ValueArray(values); return *this; }
operator Value() const;
ValueArray(const Value& src);
@ -242,6 +243,7 @@ public:
const Value& Get(int i) const;
Value GetAndClear(int i);
const Vector<Value>& Get() const { return data->data; }
Vector<Value> Pick();
void Remove(int i, int count = 1);
void Insert(int i, const ValueArray& va);
@ -300,10 +302,13 @@ public:
ValueMap() { Init0(); }
ValueMap(const ValueMap& v);
ValueMap(Index<Value> rval_ k, Vector<Value> rval_ v);
ValueMap(VectorMap<Value, Value> rval_ m);
ValueMap(const Index<Value>& k, const Vector<Value>& v, int deep);
ValueMap(const VectorMap<Value, Value>& m, int deep);
~ValueMap();
ValueMap& operator=(const ValueMap& v);
ValueMap& operator=(VectorMap<Value, Value> rval_ m) { *this = ValueMap(m); return *this; }
operator Value() const;
ValueMap(const Value& src);
@ -355,6 +360,8 @@ public:
ValueArray GetValues() const { return data->value; }
operator ValueArray() const { return GetValues(); }
VectorMap<Value, Value> Pick();
const Value& operator[](const Value& key) const;
const Value& operator[](const String& key) const { return operator[](Value(key)); }

View file

@ -38,9 +38,9 @@ alueArray][@(0.0.255) `&]_[*@3 v])&]
[s2;%% Copy constructor.&]
[s3;%% &]
[s4; &]
[s5;:ValueArray`:`:ValueArray`(pick`_ Vector`<Value`>`&`): [@(0.0.255) explicit]_[* Value
Array]([@(0.128.128) pick`_]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 values])&]
[s2;%% Creates ValueArray by [%-*@3 values].&]
[s5;:ValueArray`:`:ValueArray`(Vector`<Value`>rval`_`): [@(0.0.255) explicit]_[* ValueArr
ay]([_^Vector^ Vector]<[_^Value^ Value]>_[@(0.0.255) rval`_]_[*@3 values])&]
[s2;%% Creates ValueArray by picking [%-*@3 values] `- source is destroyed.&]
[s3;%% &]
[s4; &]
[s5;:ValueArray`:`:ValueArray`(const Vector`<Value`>`&`,int`): [@(0.0.255) explicit]_[* V
@ -60,6 +60,11 @@ version).&]
[s2;%% Assignment operator.&]
[s3;%% &]
[s4; &]
[s5;:ValueArray`:`:operator`=`(Vector`<Value`>rval`_`): [_^ValueArray^ ValueArray][@(0.0.255) `&
]_[* operator`=]([_^Vector^ Vector]<[_^Value^ Value]>_[@(0.0.255) rval`_]_[*@3 values])&]
[s2;%% Pick assignment `- source is destroyed.&]
[s3;%% &]
[s4; &]
[s5;:ValueArray`:`:operator Value`(`)const: [* operator_Value]()_[@(0.0.255) const]&]
[s2;%% Returns ValueArray as Value.&]
[s3; &]
@ -138,6 +143,10 @@ required.&]
[s2;%% Returns constant reference to (internal) Vector<Value>.&]
[s3; &]
[s4; &]
[s5;:ValueArray`:`:Pick`(`): [_^Vector^ Vector]<[_^Value^ Value]>_[* Pick]()&]
[s2;%% Picks the content, ValueArray is cleared.&]
[s3; &]
[s4; &]
[s5;:ValueArray`:`:Remove`(int`,int`): [@(0.0.255) void]_[* Remove]([@(0.0.255) int]_[*@3 i],
[@(0.0.255) int]_[*@3 count]_`=_[@3 1])&]
[s2;%% Removes [%-*@3 count] elements at [%-*@3 i].&]
@ -193,4 +202,19 @@ t]&]
[s2;%% (In)Equality comparison. Two ValueArrays are equal if they
have the same number of elements and all elements at the same
position are equal.&]
[s0;%% ]]
[s3;%% &]
[s4; &]
[s5;:ValueArray`:`:Compare`(const ValueArray`&`)const: [@(0.0.255) int]_[* Compare]([@(0.0.255) c
onst]_[_^ValueArray^ ValueArray][@(0.0.255) `&]_[*@3 b])_[@(0.0.255) const]&]
[s5;:ValueArray`:`:operator`<`=`(const ValueArray`&`)const: [@(0.0.255) bool]_[* operator
<`=]([@(0.0.255) const]_[_^ValueArray^ ValueArray][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) cons
t]&]
[s5;:ValueArray`:`:operator`>`=`(const ValueArray`&`)const: [@(0.0.255) bool]_[* operator
>`=]([@(0.0.255) const]_[_^ValueArray^ ValueArray][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) cons
t]&]
[s5;:ValueArray`:`:operator`<`(const ValueArray`&`)const: [@(0.0.255) bool]_[* operator<](
[@(0.0.255) const]_[_^ValueArray^ ValueArray][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) const]&]
[s5;:ValueArray`:`:operator`>`(const ValueArray`&`)const: [@(0.0.255) bool]_[* operator>](
[@(0.0.255) const]_[_^ValueArray^ ValueArray][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) const]&]
[s2;%% Compares two ValueArrays using lexicographical comparison.&]
[s3;%% ]]

View file

@ -46,13 +46,19 @@ p][@(0.0.255) `&]_[*@3 v])&]
[s2; Copy constructor.&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:ValueMap`(pick`_ Index`<Value`>`&`,pick`_ Vector`<Value`>`&`):%- [* Va
lueMap]([@(0.128.128) pick`_]_[_^Index^ Index]<[_^Value^ Value]>`&_[*@3 k],
[@(0.128.128) pick`_]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 v])&]
[s5;:ValueMap`:`:ValueMap`(Index`<Value`>rval`_`,Vector`<Value`>rval`_`):%- [* ValueMap
]([_^Index^ Index]<[_^Value^ Value]>_[@(0.0.255) rval`_]_[*@3 k], [_^Vector^ Vector]<[_^Value^ V
alue]>_[@(0.0.255) rval`_]_[*@3 v])&]
[s2; Creates ValueMap by picking Index a Vector of Values (efficient
but sources are destroyed).&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:ValueMap`(VectorMap`<Value`,Value`>rval`_`):%- [* ValueMap]([_^VectorMap^ V
ectorMap]<[_^Value^ Value], [_^Value^ Value]>_[@(0.0.255) rval`_]_[*@3 m])&]
[s2; Creates ValueMap by picking VectorMap (efficient but source
is destroyed).&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:ValueMap`(const Index`<Value`>`&`,const Vector`<Value`>`&`,int`):%- [* V
alueMap]([@(0.0.255) const]_[_^Index^ Index]<[_^Value^ Value]>`&_[*@3 k],
[@(0.0.255) const]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 v], [@(0.0.255) int]_[*@3 deep
@ -60,6 +66,12 @@ alueMap]([@(0.0.255) const]_[_^Index^ Index]<[_^Value^ Value]>`&_[*@3 k],
[s2; Creates ValueMap by deep copying Index a Vector of Values.&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:ValueMap`(const VectorMap`<Value`,Value`>`&`,int`):%- [* ValueMap]([@(0.0.255) c
onst]_[_^VectorMap^ VectorMap]<[_^Value^ Value], [_^Value^ Value]>`&_[*@3 m],
[@(0.0.255) int]_[*@3 deep])&]
[s2; Creates ValueMap by deep copying VectorMap.&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:`~ValueMap`(`):%- [@(0.0.255) `~][* ValueMap]()&]
[s2; Destructor.&]
[s3;%- &]
@ -69,6 +81,12 @@ alueMap]([@(0.0.255) const]_[_^Index^ Index]<[_^Value^ Value]>`&_[*@3 k],
[s2; Assignment.&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:operator`=`(VectorMap`<Value`,Value`>rval`_`):%- [_^ValueMap^ ValueMap
][@(0.0.255) `&]_[* operator`=]([_^VectorMap^ VectorMap]<[_^Value^ Value],
[_^Value^ Value]>_[@(0.0.255) rval`_]_[*@3 m])&]
[s2; Pick assignment `- efficient, destroying the source.&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:operator Value`(`)const:%- [* operator_Value]()_[@(0.0.255) const]&]
[s2; Conversion to Value.&]
[s3;%- &]
@ -129,6 +147,24 @@ multiple same keys. Note: multiple overloads are required to make
Id and SqlId work with ValueMap.&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:operator`(`)`(const Value`&`,const Value`&`):%- [_^ValueMap^ ValueMap][@(0.0.255) `&
]_[* operator()]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 key],
[@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 value])&]
[s5;:ValueMap`:`:operator`(`)`(const String`&`,const Value`&`):%- [_^ValueMap^ ValueMap
][@(0.0.255) `&]_[* operator()]([@(0.0.255) const]_[_^String^ String][@(0.0.255) `&]_[*@3 key
], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 value])&]
[s5;:ValueMap`:`:operator`(`)`(const char`*`,const Value`&`):%- [_^ValueMap^ ValueMap][@(0.0.255) `&
]_[* operator()]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 key], [@(0.0.255) const]_[_^Value^ V
alue][@(0.0.255) `&]_[*@3 value])&]
[s5;:ValueMap`:`:operator`(`)`(int`,const Value`&`):%- [_^ValueMap^ ValueMap][@(0.0.255) `&
]_[* operator()]([@(0.0.255) int]_[*@3 key], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&
]_[*@3 value])&]
[s5;:ValueMap`:`:operator`(`)`(Id`,const Value`&`):%- [_^ValueMap^ ValueMap][@(0.0.255) `&
]_[* operator()]([_^Id^ Id]_[*@3 key], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v
alue])&]
[s2;%- [%% Same as Add(][*@3 key], [*@3 value]).&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:Set`(const Value`&`,const Value`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) c
onst]_[_^Value^ Value][@(0.0.255) `&]_[*@3 key], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&
]_[*@3 value])&]
@ -199,6 +235,11 @@ nst]&]
[s2; Same as GetValues.&]
[s3;%- &]
[s4;%- &]
[s5;:ValueMap`:`:Pick`(`):%- [_^VectorMap^ VectorMap]<[_^Value^ Value],
[_^Value^ Value]>_[* Pick]()&]
[s2; Picks the content `- fast, ValueMap is cleared.&]
[s3;%- &]
[s4;%- &]
[s5;:ValueMap`:`:operator`[`]`(const Value`&`)const:%- [@(0.0.255) const]_[_^Value^ Value
][@(0.0.255) `&]_[* operator`[`]]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 key
])_[@(0.0.255) const]&]
@ -261,4 +302,18 @@ same key`-value pairs [*/ in the same order].&]
]([@(0.0.255) const]_[_^ValueMap^ ValueMap][@(0.0.255) `&]_[*@3 v])_[@(0.0.255) const]&]
[s2; Same as !operator`=`=(v).&]
[s3; &]
[s4;%- &]
[s5;:ValueMap`:`:Compare`(const ValueMap`&`)const:%- [@(0.0.255) int]_[* Compare]([@(0.0.255) c
onst]_[_^ValueMap^ ValueMap][@(0.0.255) `&]_[*@3 b])_[@(0.0.255) const]&]
[s5;:ValueMap`:`:operator`<`=`(const ValueMap`&`)const:%- [@(0.0.255) bool]_[* operator<`=
]([@(0.0.255) const]_[_^ValueMap^ ValueMap][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) const]&]
[s5;:ValueMap`:`:operator`>`=`(const ValueMap`&`)const:%- [@(0.0.255) bool]_[* operator>`=
]([@(0.0.255) const]_[_^ValueMap^ ValueMap][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) const]&]
[s5;:ValueMap`:`:operator`<`(const ValueMap`&`)const:%- [@(0.0.255) bool]_[* operator<]([@(0.0.255) c
onst]_[_^ValueMap^ ValueMap][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) const]&]
[s5;:ValueMap`:`:operator`>`(const ValueMap`&`)const:%- [@(0.0.255) bool]_[* operator>]([@(0.0.255) c
onst]_[_^ValueMap^ ValueMap][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) const]&]
[s2; Compares two ValueMaps. Performs ordered (as ValueMap has order
of key`-value pairs) comparison of key`-value pairs.&]
[s3; &]
[s0; ]]