From 8812eccc79231a4dba22ba16ef5deb5dccbc4fbe Mon Sep 17 00:00:00 2001 From: cxl Date: Wed, 23 Apr 2014 07:14:40 +0000 Subject: [PATCH] Core: ValueArray, ValueMap Pick git-svn-id: svn://ultimatepp.org/upp/trunk@7302 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Core/ValueUtil.cpp | 33 ++++++++++++- uppsrc/Core/ValueUtil.h | 7 +++ uppsrc/Core/src.tpp/ValueArray$en-us.tpp | 32 +++++++++++-- uppsrc/Core/src.tpp/ValueMap$en-us.tpp | 61 ++++++++++++++++++++++-- 4 files changed, 124 insertions(+), 9 deletions(-) diff --git a/uppsrc/Core/ValueUtil.cpp b/uppsrc/Core/ValueUtil.cpp index 96a900fd5..1dee532bf 100644 --- a/uppsrc/Core/ValueUtil.cpp +++ b/uppsrc/Core/ValueUtil.cpp @@ -275,6 +275,14 @@ Value ValueArray::GetAndClear(int i) return v; } +Vector ValueArray::Pick() +{ + Vector& x = Clone(); + Vector r = pick(x); + x.Clear(); + return r; +} + template<> String AsString(const ValueArray& v) { return sAsString(v.Get()); @@ -431,12 +439,33 @@ ValueMap::ValueMap(Index rval_ k, Vector rval_ v) d.value = ValueArray(pick(v)); } +ValueMap::ValueMap(VectorMap rval_ m) +{ + Data& d = Create(); + d.key = m.PickKeys(); + d.value = ValueArray(m.PickValues()); +} + ValueMap::ValueMap(const Index& k, const Vector& v, int deep) { Data& d = Create(); d.key <<= k; - Vector _v(v, 0); - d.value = ValueArray(pick(_v)); + d.value = ValueArray(v, 0); +} + +ValueMap::ValueMap(const VectorMap& m, int deep) +{ + Data& d = Create(); + d.key = clone(m.GetKeys()); + d.value = ValueArray(m.GetValues(), 0); +} + +VectorMap ValueMap::Pick() +{ + Data& d = Clone(); + VectorMap m(d.key.PickKeys(), d.value.Pick()); + d.key.Clear(); + return m; } ValueMap::operator Value() const { diff --git a/uppsrc/Core/ValueUtil.h b/uppsrc/Core/ValueUtil.h index a64a33312..2ec87cc5f 100644 --- a/uppsrc/Core/ValueUtil.h +++ b/uppsrc/Core/ValueUtil.h @@ -221,6 +221,7 @@ public: ~ValueArray(); ValueArray& operator=(const ValueArray& v); + ValueArray& operator=(Vector 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& Get() const { return data->data; } + Vector 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 rval_ k, Vector rval_ v); + ValueMap(VectorMap rval_ m); ValueMap(const Index& k, const Vector& v, int deep); + ValueMap(const VectorMap& m, int deep); ~ValueMap(); ValueMap& operator=(const ValueMap& v); + ValueMap& operator=(VectorMap 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 Pick(); const Value& operator[](const Value& key) const; const Value& operator[](const String& key) const { return operator[](Value(key)); } diff --git a/uppsrc/Core/src.tpp/ValueArray$en-us.tpp b/uppsrc/Core/src.tpp/ValueArray$en-us.tpp index 502125436..62c3f455c 100644 --- a/uppsrc/Core/src.tpp/ValueArray$en-us.tpp +++ b/uppsrc/Core/src.tpp/ValueArray$en-us.tpp @@ -38,9 +38,9 @@ alueArray][@(0.0.255) `&]_[*@3 v])&] [s2;%% Copy constructor.&] [s3;%% &] [s4; &] -[s5;:ValueArray`:`:ValueArray`(pick`_ Vector``&`): [@(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`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``&`,int`): [@(0.0.255) explicit]_[* V @@ -60,6 +60,11 @@ version).&] [s2;%% Assignment operator.&] [s3;%% &] [s4; &] +[s5;:ValueArray`:`:operator`=`(Vector`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.&] [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;%% ]] \ No newline at end of file +[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;%% ]] \ No newline at end of file diff --git a/uppsrc/Core/src.tpp/ValueMap$en-us.tpp b/uppsrc/Core/src.tpp/ValueMap$en-us.tpp index 22fbf2539..b66dc2c06 100644 --- a/uppsrc/Core/src.tpp/ValueMap$en-us.tpp +++ b/uppsrc/Core/src.tpp/ValueMap$en-us.tpp @@ -46,13 +46,19 @@ p][@(0.0.255) `&]_[*@3 v])&] [s2; Copy constructor.&] [s3; &] [s4;%- &] -[s5;:ValueMap`:`:ValueMap`(pick`_ Index``&`,pick`_ Vector``&`):%- [* 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`rval`_`,Vector`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`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``&`,const Vector``&`,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``&`,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`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; ]] \ No newline at end of file