diff --git a/uppsrc/Core/Index.h b/uppsrc/Core/Index.h index 47cd51c3a..43e2e109b 100644 --- a/uppsrc/Core/Index.h +++ b/uppsrc/Core/Index.h @@ -76,10 +76,10 @@ public: void Swap(HashBase& b); }; -template -class AIndex { +template +class Index : MoveableAndDeepCopyOption> { protected: - V key; + Vector key; HashBase hash; int Find0(const T& x, int i) const { @@ -93,13 +93,13 @@ protected: void Hash(); public: - unsigned hashfn(const T& x) const { return GetHashValue(x); } + unsigned hashfn(const T& x) const { return GetHashValue(x); } T& Add(const T& x, unsigned _hash); T& Add(const T& x); int FindAdd(const T& key, unsigned _hash); int FindAdd(const T& key); - AIndex& operator<<(const T& x) { Add(x); return *this; } + Index& operator<<(const T& x) { Add(x); return *this; } int Put(const T& x, unsigned _hash); int Put(const T& x); @@ -124,10 +124,6 @@ public: void Clear() { hash.Clear(); key.Clear(); } - void ClearIndex() { hash.ClearIndex(); } - void Reindex(int n) { hash.Reindex(n); } - void Reindex() { hash.Reindex(); } - void Unlink(int i) { hash.Unlink(i); } int UnlinkKey(const T& k, unsigned h); int UnlinkKey(const T& k); @@ -148,6 +144,7 @@ public: void Trim(int n) { key.SetCount(n); hash.Trim(n); } void Drop(int n = 1) { key.Drop(n); hash.Drop(n); } const T& Top() const { return key.Top(); } + T Pop() { T x = B::Top(); B::Drop(); return x; } void Reserve(int n) { key.Reserve(n); hash.Reserve(n); } void Shrink() { key.Shrink(); hash.Shrink(); } @@ -165,57 +162,39 @@ public: template bool operator<(const B& x) const { return Compare(x) < 0; } template bool operator>(const B& x) const { return Compare(x) > 0; } - V PickKeys() pick_ { return pick(key); } - const V& GetKeys() const { return key; } + Vector PickKeys() { Vector r = pick(key); Clear(); return r; } + const Vector& GetKeys() const { return key; } -// Pick assignment & copy. Picked source can only Clear(), ~AIndex(), operator=, operator<<= + Index() {} + Index(Index&& s) : key(pick(s.key)), hash(pick(s.hash)) {} + Index(const Index& s, int) : key(s.key, 0), hash(s.hash, 0) {} + explicit Index(Vector&& s) : key(pick(s)) { Hash(); } + Index(const Vector& s, int) : key(s, 0) { Hash(); } - AIndex& operator=(V&& s); + Index& operator=(Vector&& x) { key = pick(x); Hash(); return *this; } + Index& operator=(Index&& x) { key = pick(x.key); hash = pick(x.hash); return *this; } - typedef ConstIteratorOf ConstIterator; + Index(std::initializer_list init) : key(init) { Hash(); } + + typedef ConstIteratorOf> ConstIterator; // Standard container interface ConstIterator begin() const { return key.Begin(); } ConstIterator end() const { return key.End(); } - void Swap(AIndex& b) { UPP::Swap(hash, b.hash); + friend void Swap(Index& b) { UPP::Swap(hash, b.hash); UPP::Swap(key, b.key); } + STL_INDEX_COMPATIBILITY(Index) + #ifdef DEPRECATED - AIndex& operator<<=(const V& s); + Index& operator<<=(const Vector& s) { *this = clone(s); return *this; } typedef T ValueType; - typedef V ValueContainer; + typedef Vector ValueContainer; ConstIterator GetIter(int pos) const { return key.GetIter(pos); } + + void ClearIndex() { hash.ClearIndex(); } + void Reindex(int n) { hash.Reindex(n); } + void Reindex() { hash.Reindex(); } #endif - -protected: - AIndex(V&& s); - AIndex(const V& s, int); - AIndex() {} - AIndex(const AIndex& s, int); - AIndex(std::initializer_list init); -}; - -template -class Index : MoveableAndDeepCopyOption< Index >, - public AIndex> { - typedef AIndex> B; -public: - T Pop() { T x = B::Top(); B::Drop(); return x; } - - Index() {} - Index(Index&& s) : B(pick(s)) {} - Index(const Index& s, int) : B(s, 1) {} - explicit Index(Vector&& s) : B(pick(s)) {} - Index(const Vector& s, int) : B(s, 1) {} - - Index& operator=(Vector&& x) { B::operator=(pick(x)); return *this; } - Index& operator=(Index&& x) { B::operator=(pick(x)); return *this; } - - friend void Swap(Index& a, Index& b) { a.B::Swap(b); } - - typedef typename B::ConstIterator ConstIterator; // GCC bug (?) - STL_INDEX_COMPATIBILITY(Index) - - Index(std::initializer_list init) : B(init) {} }; diff --git a/uppsrc/Core/Map.hpp b/uppsrc/Core/Map.hpp index d1b5eb0c4..a451c06eb 100644 --- a/uppsrc/Core/Map.hpp +++ b/uppsrc/Core/Map.hpp @@ -92,65 +92,27 @@ inline void HashBase::Unlink(int i) } } -template -AIndex::AIndex(const AIndex& s, int) -: key(s.key, 0), - hash(s.hash, 0) {} - -template -void AIndex::Hash() { +template +void Index::Hash() { + hash.Clear(); for(int i = 0; i < key.GetCount(); i++) hash.Add(hashfn(key[i])); } -template -AIndex& AIndex::operator=(V&& s) { - if(&key != &s) { - key = pick(s); - hash.Clear(); - Hash(); - } - return *this; -} - -template -AIndex& AIndex::operator<<=(const V& s) { - key <<= s; - hash.Clear(); - Hash(); - return *this; -} - -template -AIndex::AIndex(V&& s) : key(pick(s)) { - Hash(); -} - -template -AIndex::AIndex(const V& s, int) : key(s, 1) { - Hash(); -} - -template -AIndex::AIndex(std::initializer_list init) : key(init) -{ - Hash(); -} - -template -T& AIndex::Add(const T& x, unsigned _hash) { +template +T& Index::Add(const T& x, unsigned _hash) { T& t = key.Add(x); hash.Add(_hash); return t; } -template -T& AIndex::Add(const T& x) { +template +T& Index::Add(const T& x) { return Add(x, hashfn(x)); } -template -int AIndex::FindAdd(const T& _key, unsigned _hash) { +template +int Index::FindAdd(const T& _key, unsigned _hash) { int i = Find(_key, _hash); if(i >= 0) return i; i = key.GetCount(); @@ -158,8 +120,8 @@ int AIndex::FindAdd(const T& _key, unsigned _hash) { return i; } -template -int AIndex::Put(const T& x, unsigned _hash) +template +int Index::Put(const T& x, unsigned _hash) { int q = hash.Put(_hash); if(q < 0) { @@ -171,29 +133,29 @@ int AIndex::Put(const T& x, unsigned _hash) return q; } -template -int AIndex::Put(const T& x) +template +int Index::Put(const T& x) { return Put(x, hashfn(x)); } -template -int AIndex::FindPut(const T& _key, unsigned _hash) +template +int Index::FindPut(const T& _key, unsigned _hash) { int i = Find(_key, _hash); if(i >= 0) return i; return Put(_key, _hash); } -template -int AIndex::FindPut(const T& key) +template +int Index::FindPut(const T& key) { return FindPut(key, hashfn(key)); } -template +template inline -int AIndex::Find(const T& x, unsigned hash_) const { +int Index::Find(const T& x, unsigned hash_) const { int i0 = hash.Find(hash_); if(i0 >= 0) { int i = i0; @@ -206,79 +168,79 @@ int AIndex::Find(const T& x, unsigned hash_) const { return -1; } -template -int AIndex::Find(const T& x) const { +template +int Index::Find(const T& x) const { return Find(x, hashfn(x)); } -template -int AIndex::FindNext(int i) const { +template +int Index::FindNext(int i) const { return Find0(key[i], hash.FindNext(i)); } -template -inline int AIndex::FindLast(const T& x, unsigned _hash) const { +template +inline int Index::FindLast(const T& x, unsigned _hash) const { return FindB(x, hash.FindLast(_hash)); } -template -int AIndex::FindLast(const T& x) const { +template +int Index::FindLast(const T& x) const { return FindLast(x, hashfn(x)); } -template -int AIndex::FindPrev(int i) const { +template +int Index::FindPrev(int i) const { return FindB(key[i], hash.FindPrev(i)); } -template -int AIndex::FindAdd(const T& key) { +template +int Index::FindAdd(const T& key) { return FindAdd(key, hashfn(key)); } -template -T& AIndex::Set(int i, const T& x, unsigned _hash) { +template +T& Index::Set(int i, const T& x, unsigned _hash) { T& t = key[i]; t = x; hash.Set(i, _hash); return t; } -template -T& AIndex::Set(int i, const T& x) { +template +T& Index::Set(int i, const T& x) { return Set(i, x, hashfn(x)); } #ifdef UPP -template -void AIndex::Serialize(Stream& s) { +template +void Index::Serialize(Stream& s) { if(s.IsLoading()) ClearIndex(); key.Serialize(s); hash.Serialize(s); } -template -void AIndex::Xmlize(XmlIO& xio, const char *itemtag) +template +void Index::Xmlize(XmlIO& xio, const char *itemtag) { - XmlizeIndex >(xio, itemtag, *this); + XmlizeIndex >(xio, itemtag, *this); } -template -void AIndex::Jsonize(JsonIO& jio) +template +void Index::Jsonize(JsonIO& jio) { - JsonizeIndex, T>(jio, *this); + JsonizeIndex, T>(jio, *this); } -template -String AIndex::ToString() const +template +String Index::ToString() const { return AsStringArray(*this); } #endif -template -int AIndex::UnlinkKey(const T& k, unsigned h) +template +int Index::UnlinkKey(const T& k, unsigned h) { int n = 0; int q = hash.Find(h); @@ -293,63 +255,63 @@ int AIndex::UnlinkKey(const T& k, unsigned h) return n; } -template -int AIndex::UnlinkKey(const T& k) +template +int Index::UnlinkKey(const T& k) { return UnlinkKey(k, hashfn(k)); } -template -void AIndex::Sweep() +template +void Index::Sweep() { Vector b = hash.GetUnlinked(); Sort(b); Remove(b); } -template -T& AIndex::Insert(int i, const T& k, unsigned h) { +template +T& Index::Insert(int i, const T& k, unsigned h) { key.Insert(i, k); hash.Insert(i, h); return key[i]; } -template -T& AIndex::Insert(int i, const T& k) { +template +T& Index::Insert(int i, const T& k) { key.Insert(i, k); hash.Insert(i, hashfn(k)); return key[i]; } -template -void AIndex::Remove(int i) +template +void Index::Remove(int i) { key.Remove(i); hash.Remove(i); } -template -void AIndex::Remove(int i, int count) +template +void Index::Remove(int i, int count) { key.Remove(i, count); hash.Remove(i, count); } -template -void AIndex::Remove(const int *sorted_list, int count) +template +void Index::Remove(const int *sorted_list, int count) { key.Remove(sorted_list, count); hash.Remove(sorted_list, count); } -template -void AIndex::Remove(const Vector& sl) +template +void Index::Remove(const Vector& sl) { Remove(sl, sl.GetCount()); } -template -int AIndex::RemoveKey(const T& k, unsigned h) +template +int Index::RemoveKey(const T& k, unsigned h) { Vector rk; int q = Find(k, h); @@ -361,8 +323,8 @@ int AIndex::RemoveKey(const T& k, unsigned h) return rk.GetCount(); } -template -int AIndex::RemoveKey(const T& k) +template +int Index::RemoveKey(const T& k) { return RemoveKey(k, hashfn(k)); } diff --git a/uppsrc/Core/src.tpp/AIndex$en-us.tpp b/uppsrc/Core/src.tpp/AIndex$en-us.tpp index 78e39123c..78e417bae 100644 --- a/uppsrc/Core/src.tpp/AIndex$en-us.tpp +++ b/uppsrc/Core/src.tpp/AIndex$en-us.tpp @@ -10,33 +10,32 @@ topic "AIndex"; [i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam] [b42;2 $$9,9#13035079074754324216151401829390:normal] [{_}%EN-US -[ {{10000@(113.42.0) [s0; [*@7;4 AIndex]]}}&] +[ {{10000@(113.42.0) [s0; [*@7;4 Index]]}}&] [s3; &] -[s1;:noref:%- [@(0.0.255)3 template][3 _<][@(0.0.255)3 class][3 _][*@4;3 T][3 , -][@(0.0.255)3 class][3 _][*@4;3 V][3 , ][@(0.0.255)3 class][3 _][*@4;3 HashFn][@(0.0.255)3 >]&] -[s1;:AIndex`:`:class:%- [@(0.0.255) class]_[* AIndex]&] -[s8; [*C@4 T]-|Type of elements to store. T must satisfy requirements -for container flavor identified by parameter V and must have -[*C operator`=`=] defined.&] -[s8; [*C@4 V]-|Basic random access container.&] -[s8; [*C@4 HashFn]-|Hashing class. Must have [*C unsigned operator()(const -T`& x)] method returning the hash of x.&] -[s9; This template class adds associative capabilities to basic random -access containers, forming flavors of Index. It is used as base -class for concrete index flavors, [* Index] and [* ArrayIndex].&] +[s1;:noref:%- [@(0.0.255)3 template][3 _<][@(0.0.255)3 class][3 _][*@4;3 T][3 >]&] +[s1;:Index`:`:class:%- [@(0.0.255) class]_[* Index]&] +[s8; [*@4 T]-|Type of elements stored in Index. T is required to be +[/^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ moveable][/ ]and must +have [/^topic`:`/`/Core`/srcdoc`/pick`_`$en`-us^ deep copy constructor] +and deep copy assignment.&] +[s0; &] +[s0; Like any other NTL container, Index is a [*/^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ m +oveable][*/ ]type with [*/^topic`:`/`/Core`/srcdoc`/pick`_`$en`-us^ pick +and optional deep copy] transfer semantics.&] +[s9; Index adds associative capabilities to Vector.&] [s9; It allows adding elements at the end of sequence in constant amortized time like basic random container. Additionally, it also allows fast retrieval of a position of the element with -specified value. Implementation is based on hash tables. AIndex +specified value. Implementation is based on hash tables. Index stores hash`-values of elements, so it has no advantage to cache them externally.&] -[s9; Removing elements from an AIndex poses an interesting problem. +[s9; Removing elements from an Index poses an interesting problem. While it is possible to simply remove (or insert) an element at a specified position, such operation has to move a lot of elements and also invalidates internal hash maps. Thus removing elements this way is slow, especially when combined with searching.&] [s9; The solution for this problem is [*/ unlinking] of elements. Unlinked -elements are not removed from the AIndex, instead they are [*/ ignored][/ +elements are not removed from the Index, instead they are [*/ ignored][/ ]by search operations. Unlinking is a simple, constant time, fast operation. Further, it is possible to place an element at the first available unlinked position (rather than to the end @@ -53,72 +52,88 @@ On the other hand, usage scenarios for indexes show that need for unlinking elements and multi`-key ordering is almost always disjunct. For the rest of the cases, it is always possible to restore ordering using [* Sweep] method.&] -[s9; Like any other NTL container, AIndex is [*/^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ m -oveable][*/ ]type with [*/^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ pick -and optional deep copy] transfer semantics, although these features -are more important in derived concrete index flavors.&] -[s3; &] -[s0; &] -[ {{10000F(128)G(128)@1 [s0; [* Constructor Detail]]}}&] -[s3;%- &] -[s5;:AIndex`:`:AIndex`(`):%- [* AIndex]()&] -[s2; Default constructor.&] -[s3;%- &] -[s4;%- &] -[s5;:AIndex`:`:AIndex`(const AIndex`&`,int`):%- [* AIndex]([@(0.0.255) const]_[* AIndex][@(0.0.255) `& -]_[*@3 s], [@(0.0.255) int])&] -[s2; Optional deep copy constructor.&] -[s6; -|Requires T to have deep copy constructor or optional deep copy -constructor.&] -[s3; &] -[s4;%- &] -[s5;:Upp`:`:AIndex`:`:AIndex`(std`:`:initializer`_list``):%- [* AIndex]([_^http`:`/`/en`.cppreference`.com`/w`/cpp`/utility`/initializer`_list^ s -td`::initializer`_list]<[*@4 T]>_[*@3 init])&] -[s2; C`+`+ 11 initialization.&] -[s3; &] -[s4; &] -[s5;:AIndex`:`:AIndex`(pick`_ V`&`):%- [* AIndex]([@(0.128.128) pick`_]_[*@4 V][@(0.0.255) `& -]_[*@3 s])&] -[s2; Pick`-constructs [* AIndex] from a basic random access container -[%-*@3 s]. Transfers the source container in short constant time, -but destroys it by picking.&] -[s3; &] -[s4;%- &] -[s5;:AIndex`:`:AIndex`(const V`&`,int`):%- [* AIndex]([@(0.0.255) const]_[*@4 V][@(0.0.255) `& -]_[*@3 s], [@(0.0.255) int])&] -[s2; Deep`-copy constructs AIndex from basic random access container.&] -[s6; Requires T to have deep copy constructor or optional deep copy -constructor.&] [s3; &] [s0; &] [ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&] [s3;%- &] -[s5;:AIndex`:`:Add`(const T`&`,unsigned`):%- [*@4 T][@(0.0.255) `&]_[* Add]([@(0.0.255) const -]_[*@4 T][@(0.0.255) `&]_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])&] +[s5;:Index`:`:Index`(`):%- [* Index]()&] +[s2; Constructs empty Index.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:Index`:`:Index`(Upp`:`:Index`&`&`):%- [* Index]([* Index][@(0.0.255) `&`&]_[*@3 s +])&] +[s2; Pick constructor.&] +[s3; &] +[s4;%- &] +[s5;:Index`:`:Index`(pick`_ Vector``&`):%- [* Index]([@(0.128.128) pick`_]_[_^Vector^ V +ector][@(0.0.255) <][*@4 T][@(0.0.255) >`&]_[*@3 s])&] +[s2; Pick operator. Transfers source Vector to Index in low constant +time, but destroys it by picking.&] +[s7; [*C@3 x]-|Source Vector.&] +[s3; &] +[s4;%- &] +[s5;:Index`:`:Index`(const Index`&`,int`):%- [* Index]([@(0.0.255) const]_[* Index][@(0.0.255) `& +]_[*@3 s], [@(0.0.255) int])&] +[s2; Optional deep copy constructor.&] +[s6; Requires T to have deep copy constructor or optional deep copy +constructor.&] +[s7; [*C@3 s]-|Source Index.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:Index`:`:Index`(Upp`:`:Vector``&`&`):%- [@(0.0.255) explicit]_[* Index]([_^Upp`:`:Vector^ V +ector]<[*@4 T]>`&`&_[*@3 s])&] +[s2; Pick constructs Index from Vector.&] +[s3; &] +[s4;%- &] +[s5;:Index`:`:Index`(const Vector``&`,int`):%- [* Index]([@(0.0.255) const]_[_^Vector^ V +ector][@(0.0.255) <][*@4 T][@(0.0.255) >`&]_[*@3 s], [@(0.0.255) int])&] +[s2; Deep`-copy constructs Index from Vector.&] +[s6; Requires T to have deep copy constructor or optional deep copy +constructor.&] +[s7; [*@3 s]-|Source Vector.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:Index`:`:operator`=`(Upp`:`:Vector``&`&`):%- [_^Upp`:`:Index^ Index][@(0.0.255) `& +]_[* operator`=]([_^Upp`:`:Vector^ Vector]<[*@4 T]>`&`&_[*@3 x])&] +[s2; Pick assignment from Vector.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:Index`:`:operator`=`(Upp`:`:Index``&`&`):%- [_^Upp`:`:Index^ Index][@(0.0.255) `& +]_[* operator`=]([_^Upp`:`:Index^ Index]<[*@4 T]>`&`&_[*@3 x])&] +[s2; Pick assignment.&] +[s3; &] +[s4;%- &] +[s5;:Upp`:`:Index`:`:Index`(std`:`:initializer`_list``):%- [* Index]([_^http`:`/`/en`.cppreference`.com`/w`/cpp`/utility`/initializer`_list^ s +td`::initializer`_list]<[*@4 T]>_[*@3 init])&] +[s6;%- C`+`+ 11 initialization.&] +[s3;%- &] +[s4;%- &] +[s5;:Index`:`:Add`(const T`&`,unsigned`):%- [*@4 T][@(0.0.255) `&]_[* Add]([@(0.0.255) const]_ +[*@4 T][@(0.0.255) `&]_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])&] [s2; Adds a new element [%-*@3 x] with a precomputed hash value [%-*@3 `_hash]. The performance benefit of this variant is that sometimes you can compute hash`-value as the part of other process, like fetching strings from an input stream. Returns a reference to the element.&] [s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] +[s6; Invalidates iterators to Index.&] [s6; Invalidates references to Index.&] [s6; The precomputed [%-@3 `_hash] must be the same as the hash specified by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Add`(const T`&`):%- [*@4 T][@(0.0.255) `&]_[* Add]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& +[s5;:Index`:`:Add`(const T`&`):%- [*@4 T][@(0.0.255) `&]_[* Add]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& ]_[*@3 x])&] -[s2; Adds a new element [%-*@3 x ]to AIndex. Returns a reference to +[s2; Adds a new element [%-*@3 x ]to Index. Returns a reference to the element.&] [s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] +[s6; Invalidates iterators to Index.&] [s6; Invalidates references to Index.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Find`(const T`&`,unsigned`)const:%- [@(0.0.255) int]_[* Find]([@(0.0.255) co -nst]_[*@4 T][@(0.0.255) `&]_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])_[@(0.0.255) const]&] +[s5;:Index`:`:Find`(const T`&`,unsigned`)const:%- [@(0.0.255) int]_[* Find]([@(0.0.255) con +st]_[*@4 T][@(0.0.255) `&]_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])_[@(0.0.255) const]&] [s2; Returns the position of the first element with value [%-*@3 x] -in AIndex, using a precomputed [%-*@3 `_hash]. If multi`-key ordering +in Index, using a precomputed [%-*@3 `_hash]. If multi`-key ordering is not broken and more than one element with the same value exists in AIndex, the lowest position is returned. If the specified value does not exist in AIndex, a negative number is returned. @@ -127,7 +142,7 @@ Unlinked elements are ignored.&] by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Find`(const T`&`)const:%- [@(0.0.255) int]_[* Find]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& +[s5;:Index`:`:Find`(const T`&`)const:%- [@(0.0.255) int]_[* Find]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& ]_[*@3 x])_[@(0.0.255) const]&] [s2; Returns the position of the first element with value [%-*@3 x] in AIndex. If multi`-key ordering is not broken and more than @@ -136,7 +151,7 @@ is retrieved. If the specified value does not exist in AIndex, a negative number is returned. Unlinked elements are ignored.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:FindNext`(int`)const:%- [@(0.0.255) int]_[* FindNext]([@(0.0.255) int]_[*@3 i]) +[s5;:Index`:`:FindNext`(int`)const:%- [@(0.0.255) int]_[* FindNext]([@(0.0.255) int]_[*@3 i]) _[@(0.0.255) const]&] [s2; Returns the position of the next element with the same value as the element at [%-*@3 i]. If multi`-key ordering is not broken @@ -147,7 +162,7 @@ When there are no more elements with the required value, a negative number is returned. Unlinked elements are ignored.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:FindLast`(const T`&`,unsigned`)const:%- [@(0.0.255) int]_[* FindLast]([@(0.0.255) c +[s5;:Index`:`:FindLast`(const T`&`,unsigned`)const:%- [@(0.0.255) int]_[* FindLast]([@(0.0.255) c onst]_[*@4 T][@(0.0.255) `&]_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])_[@(0.0.255) const]&] [s2; Returns the position of the last element with value [%-*@3 x] in AIndex, using a precomputed [%-*@3 `_hash]. If multi`-key ordering @@ -159,8 +174,8 @@ Unlinked elements are ignored.&] by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:FindLast`(const T`&`)const:%- [@(0.0.255) int]_[* FindLast]([@(0.0.255) cons -t]_[*@4 T][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) const]&] +[s5;:Index`:`:FindLast`(const T`&`)const:%- [@(0.0.255) int]_[* FindLast]([@(0.0.255) const +]_[*@4 T][@(0.0.255) `&]_[*@3 x])_[@(0.0.255) const]&] [s2; Returns the position of the last element with value [%-*@3 x] in AIndex. If multi`-key ordering is not broken and more than one element with the same value exists in AIndex, the greatest @@ -168,7 +183,7 @@ position is retrieved. If element does not exist in AIndex, a negative number is returned. Unlinked elements are ignored.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:FindPrev`(int`)const:%- [@(0.0.255) int]_[* FindPrev]([@(0.0.255) int]_[*@3 i]) +[s5;:Index`:`:FindPrev`(int`)const:%- [@(0.0.255) int]_[* FindPrev]([@(0.0.255) int]_[*@3 i]) _[@(0.0.255) const]&] [s2; Returns the position of the previous element with the same value as the element at [%- _][%-*@3 i]. If multi`-key ordering is not @@ -179,8 +194,8 @@ order). When there are no more elements with required value, negative number is returned. Unlinked elements are ignored.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:FindAdd`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* FindAdd]([@(0.0.255) c -onst]_[*@4 T][@(0.0.255) `&]_[*@3 key], [@(0.0.255) unsigned]_[*@3 `_hash])&] +[s5;:Index`:`:FindAdd`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* FindAdd]([@(0.0.255) co +nst]_[*@4 T][@(0.0.255) `&]_[*@3 key], [@(0.0.255) unsigned]_[*@3 `_hash])&] [s2; Retrieves position of first element with value [%-*@3 key] in AIndex, using a precomputed [%-*@3 `_hash]. If multi`-key ordering is not broken and more than one element with the same value exists @@ -194,8 +209,8 @@ newly added element is returned. Unlinked elements are ignored.&] by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:FindAdd`(const T`&`):%- [@(0.0.255) int]_[* FindAdd]([@(0.0.255) const]_[*@4 T -][@(0.0.255) `&]_[*@3 key])&] +[s5;:Index`:`:FindAdd`(const T`&`):%- [@(0.0.255) int]_[* FindAdd]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& +]_[*@3 key])&] [s2; Retrieves position of first element with value [%-*@3 key] in AIndex. If multi`-key ordering is not broken and more than one element with the same value exists in AIndex, lowest position @@ -207,25 +222,14 @@ Unlinked elements are ignored.&] [s2;%- [*@5;1 Invalidates references to Index.]&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:operator`<`<`(const T`&`):%- AIndex[@(0.0.255) `&]_[* operator<<]([@(0.0.255) c -onst]_[*@4 T][@(0.0.255) `&]_[*@3 x])&] -[s2; Operator alternative of [* void Add(const T`& x)]. By returning -reference to AIndex it allows adding multiple elements in a single -expression, thus e.g. allowing to construct a temporary Index -as part of an expression like Foo((Index() << 1 << 2)).&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s3;%- &] -[s4;%- &] -[s5;:AIndex`:`:Unlink`(int`):%- [@(0.0.255) void]_[* Unlink]([@(0.0.255) int]_[*@3 i])&] +[s5;:Index`:`:Unlink`(int`):%- [@(0.0.255) void]_[* Unlink]([@(0.0.255) int]_[*@3 i])&] [s2; Unlinks the element at [%-*@3 i]. The unlinked item stays in AIndex but is ignored by any Find operation.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Put`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* Put]([@(0.0.255) const]_[*@4 T +[s5;:Index`:`:Put`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* Put]([@(0.0.255) const]_[*@4 T ][@(0.0.255) `&]_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])&] -[s2; If there are any unlinked elements in AIndex, one of them is +[s2; If there are any unlinked elements in Index, one of them is replaced by [%-*@3 x]. If there are no unlinked elements, the element with the specified value is appended to the end of AIndex using [* Add]. The position of newly placed element is returned.&] @@ -237,7 +241,7 @@ with the specified value is appended to the end of AIndex using by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Put`(const T`&`):%- [@(0.0.255) int]_[* Put]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& +[s5;:Index`:`:Put`(const T`&`):%- [@(0.0.255) int]_[* Put]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& ]_[*@3 x])&] [s2; If there are any unlinked elements in AIndex, one of them is replaced by [%-*@3 x]. If there are no unlinked elements, the element @@ -249,8 +253,8 @@ with the specified value is appended to the end of AIndex using [s6; Invalidates references to Index.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:FindPut`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* FindPut]([@(0.0.255) c -onst]_[*@4 T][@(0.0.255) `&]_[*@3 key], [@(0.0.255) unsigned]_[*@3 `_hash])&] +[s5;:Index`:`:FindPut`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* FindPut]([@(0.0.255) co +nst]_[*@4 T][@(0.0.255) `&]_[*@3 key], [@(0.0.255) unsigned]_[*@3 `_hash])&] [s2; Retrieves the position of the first element with the value [%-*@3 key] in AIndex, using a precomputed [%-*@3 `_hash]. The precomputed hash value must be the same as the hash value that would be the @@ -265,8 +269,8 @@ The position of the found or placed element is returned.&] by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:FindPut`(const T`&`):%- [@(0.0.255) int]_[* FindPut]([@(0.0.255) const]_[*@4 T -][@(0.0.255) `&]_[*@3 key])&] +[s5;:Index`:`:FindPut`(const T`&`):%- [@(0.0.255) int]_[* FindPut]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& +]_[*@3 key])&] [s2; Retrieves the position of the first element with value [%-*@3 key] in AIndex. If the element does not exist in the AIndex, it is placed to it using [* Put(const T`& x).] The position of the found @@ -277,7 +281,7 @@ or placed element is returned.&] [s6; Invalidates references to Index.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Set`(int`,const T`&`,unsigned`):%- [*@4 T][@(0.0.255) `&]_[* Set]([@(0.0.255) i +[s5;:Index`:`:Set`(int`,const T`&`,unsigned`):%- [*@4 T][@(0.0.255) `&]_[* Set]([@(0.0.255) i nt]_[*@3 i], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_ha sh])&] [s2; Replaces the element at the specified position with a new element @@ -291,7 +295,7 @@ same value as the specified one. Returns a reference to the element.&] by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Set`(int`,const T`&`):%- [*@4 T][@(0.0.255) `&]_[* Set]([@(0.0.255) int]_[*@3 i], +[s5;:Index`:`:Set`(int`,const T`&`):%- [*@4 T][@(0.0.255) `&]_[* Set]([@(0.0.255) int]_[*@3 i], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 x])&] [s2; Replaces the element at the specified position with a new element with value [%-*@3 x]. Speed of this operation depends on the total @@ -302,34 +306,37 @@ Returns a reference to the element.&] [s6; Invalidates references to Index.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:operator`[`]`(int`)const:%- [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* opera -tor`[`]]([@(0.0.255) int]_[*@3 i])_[@(0.0.255) const]&] +[s5;:Index`:`:operator`[`]`(int`)const:%- [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* operat +or`[`]]([@(0.0.255) int]_[*@3 i])_[@(0.0.255) const]&] [s2; Returns the element at the specified position.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:GetCount`(`)const:%- [@(0.0.255) int]_[* GetCount]()_[@(0.0.255) const]&] +[s5;:Index`:`:GetCount`(`)const:%- [@(0.0.255) int]_[* GetCount]()_[@(0.0.255) const]&] [s2; Returns number of elements in AIndex.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:IsEmpty`(`)const:%- [@(0.0.255) bool]_[* IsEmpty]()_[@(0.0.255) const]&] +[s5;:Upp`:`:Index`:`:begin`(`)const:%- [_^Upp`:`:Index`:`:ConstIterator^ ConstIterator]_ +[* begin]()_[@(0.0.255) const]&] +[s5;:Upp`:`:Index`:`:end`(`)const:%- [_^Upp`:`:Index`:`:ConstIterator^ ConstIterator]_[* e +nd]()_[@(0.0.255) const]&] +[s2;%- Standard begin/end methods.&] +[s3;%- &] +[s4;%- &] +[s5;:Index`:`:IsEmpty`(`)const:%- [@(0.0.255) bool]_[* IsEmpty]()_[@(0.0.255) const]&] [s2; Tests whether AIndex is empty. Same as GetCount() `=`= 0.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:GetHash`(int`)const:%- [@(0.0.255) unsigned]_[* GetHash]([@(0.0.255) int]_[*@3 i +[s5;:Index`:`:GetHash`(int`)const:%- [@(0.0.255) unsigned]_[* GetHash]([@(0.0.255) int]_[*@3 i ])_[@(0.0.255) const]&] [s2; Returns a hash of element [%-*@3 i]. This is perhaps only useful when making the exact copy of Index, e.g. in the persistent storage.&] [s3; &] [s4;%- &] -[s5;:AIndex`:`:Clear`(`):%- [@(0.0.255) void]_[* Clear]()&] +[s5;:Index`:`:Clear`(`):%- [@(0.0.255) void]_[* Clear]()&] [s2; Removes all elements from AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:AIndex`:`:ClearIndex`(`):%- [@(0.0.255) void]_[* ClearIndex]()&] -[s2; Restores multi`-key ordering.&] [s3; &] [s4; &] -[s5;:AIndex`:`:UnlinkKey`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* UnlinkKey]([@(0.0.255) c +[s5;:Index`:`:UnlinkKey`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* UnlinkKey]([@(0.0.255) c onst]_[*@4 T][@(0.0.255) `&]_[*@3 k], [@(0.0.255) unsigned]_[*@3 `_hash])&] [s2; Unlinks all elements with value [%-*@3 k] using precomputed [%-*@3 `_hash]. Unlinked elements stay in AIndex but are ignored by any Find @@ -339,38 +346,38 @@ that would be result of HashFn.&] by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:UnlinkKey`(const T`&`):%- [@(0.0.255) int]_[* UnlinkKey]([@(0.0.255) const]_ -[*@4 T][@(0.0.255) `&]_[*@3 k])&] +[s5;:Index`:`:UnlinkKey`(const T`&`):%- [@(0.0.255) int]_[* UnlinkKey]([@(0.0.255) const]_[*@4 T +][@(0.0.255) `&]_[*@3 k])&] [s2; Unlinks all elements with value [%-*@3 k]. Unlinked elements remain in the AIndex but are ignored by any Find operations.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:IsUnlinked`(int`)const:%- [@(0.0.255) bool]_[* IsUnlinked]([@(0.0.255) int]_ -[*@3 i])_[@(0.0.255) const]&] +[s5;:Index`:`:IsUnlinked`(int`)const:%- [@(0.0.255) bool]_[* IsUnlinked]([@(0.0.255) int]_[*@3 i +])_[@(0.0.255) const]&] [s2; Tests whether the element at [%-*@3 i] is unlinked.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:GetUnlinked`(`)const:%- [_^Vector^ Vector]<[@(0.0.255) int]>_[* GetUnlinked]( +[s5;:Index`:`:GetUnlinked`(`)const:%- [_^Vector^ Vector]<[@(0.0.255) int]>_[* GetUnlinked]( )_[@(0.0.255) const]&] -[s2; Returns indicies of all unlinked elements.&] +[s2; Returns indices of all unlinked elements.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Sweep`(`):%- [@(0.0.255) void]_[* Sweep]()&] +[s5;:Index`:`:Sweep`(`):%- [@(0.0.255) void]_[* Sweep]()&] [s2; Removes all unlinked elements from AIndex. Complexity of the operation depends on the number of elements in AIndex, not on the number of unlinked elements. Also restores multi`-key ordering.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:HasUnlinked`(`)const:%- [@(0.0.255) bool]_[* HasUnlinked]()_[@(0.0.255) cons -t]&] +[s5;:Index`:`:HasUnlinked`(`)const:%- [@(0.0.255) bool]_[* HasUnlinked]()_[@(0.0.255) const +]&] [s2; Returns true of AIndex has any unlinked elements.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Insert`(int`,const T`&`,unsigned`):%- [*@4 T][@(0.0.255) `&]_[* Insert]([@(0.0.255) i +[s5;:Index`:`:Insert`(int`,const T`&`,unsigned`):%- [*@4 T][@(0.0.255) `&]_[* Insert]([@(0.0.255) i nt]_[*@3 i], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 k], [@(0.0.255) unsigned]_[*@3 h])&] [s2; Inserts an element with value [%-*@3 k] at the specified position -[%-*@3 i], using a precomputed hash [%-*@3 h]. This is a slow operation. -Returns a reference to the element.&] +[%-*@3 i], using a precomputed hash [%-*@3 h]. This is a slow O(n) +operation. Returns a reference to the element.&] [s6; Requires T to have deep copy constructor.&] [s6; Invalidates iterators to AIndex.&] [s6; Invalidates references to Index.&] @@ -378,24 +385,24 @@ Returns a reference to the element.&] by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Insert`(int`,const T`&`):%- [*@4 T][@(0.0.255) `&]_[* Insert]([@(0.0.255) int]_ +[s5;:Index`:`:Insert`(int`,const T`&`):%- [*@4 T][@(0.0.255) `&]_[* Insert]([@(0.0.255) int]_ [*@3 i], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 k])&] [s2; Inserts an element with value [%-*@3 k] at the specified position -[%-*@3 i]. This is a slow operation. Returns a reference to the -element.&] +[%-*@3 i]. This is a slow O(n) operation. Returns a reference to +the element.&] [s6; Requires T to have deep copy constructor.&] [s6; Invalidates iterators to AIndex.&] [s6; Invalidates references to Index.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Remove`(int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) int]_[*@3 i])&] +[s5;:Index`:`:Remove`(int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) int]_[*@3 i])&] [s2; Removes an element at the specified position [%-*@3 i]. This is a slow O(n) operation.&] [s6; Invalidates iterators to AIndex.&] [s6; Invalidates references to Index.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Remove`(int`,int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) int]_[*@3 i], +[s5;:Index`:`:Remove`(int`,int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) int]_[*@3 i], [@(0.0.255) int]_[*@3 count])&] [s2; Removes [%-*@3 count] elements starting at [%-*@3 i]. This is a slow O(n) operation.&] @@ -403,8 +410,8 @@ slow O(n) operation.&] [s6; Invalidates references to Index.&] [s3; &] [s4;%- &] -[s5;:AIndex`:`:Remove`(const int`*`,int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) const -]_[@(0.0.255) int]_`*[*@3 sorted`_list], [@(0.0.255) int]_[*@3 count])&] +[s5;:Index`:`:Remove`(const int`*`,int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) const]_ +[@(0.0.255) int]_`*[*@3 sorted`_list], [@(0.0.255) int]_[*@3 count])&] [s2; Removes multiple elements from AIndex. Time of operation only slightly depends on the number of removed elements. This is a slow O(n) operation. [%-*@3 sorted`_list] must point to [%-*@3 count] @@ -413,7 +420,7 @@ positions, sorted in ascending order.&] [s6; Invalidates references to Index.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Remove`(const Vector``&`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) c +[s5;:Index`:`:Remove`(const Vector``&`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) c onst]_Vector[@(0.0.255) `&]_[*@3 sorted`_list])&] [s2; Removes multiple elements from AIndex. Same as Remove(sorted`_list, sorted`_list.GetCount()).&] @@ -421,7 +428,7 @@ sorted`_list.GetCount()).&] [s6; Invalidates references to Index.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:RemoveKey`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* RemoveKey]([@(0.0.255) c +[s5;:Index`:`:RemoveKey`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* RemoveKey]([@(0.0.255) c onst]_[*@4 T][@(0.0.255) `&]_[*@3 k], [@(0.0.255) unsigned]_[*@3 h])&] [s2; Removes all elements with value [%-*@3 k] using a precomputed hash [%-*@3 h]. Slow O(n).&] @@ -431,81 +438,61 @@ hash [%-*@3 h]. Slow O(n).&] by HashFn.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:RemoveKey`(const T`&`):%- [@(0.0.255) int]_[* RemoveKey]([@(0.0.255) const]_ -[*@4 T][@(0.0.255) `&]_[*@3 k])&] +[s5;:Index`:`:RemoveKey`(const T`&`):%- [@(0.0.255) int]_[* RemoveKey]([@(0.0.255) const]_[*@4 T +][@(0.0.255) `&]_[*@3 k])&] [s2; Removes all elements with value [%-*@3 k]. Slow O(n).&] [s6; Invalidates iterators to AIndex.&] [s6; Invalidates references to Index.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Trim`(int`):%- [@(0.0.255) void]_[* Trim]([@(0.0.255) int]_[*@3 n])&] +[s5;:Index`:`:Trim`(int`):%- [@(0.0.255) void]_[* Trim]([@(0.0.255) int]_[*@3 n])&] [s2; Reduces the number of elements in AIndex to [%-*@3 n]. Requested number must be less than or equal to actual number of elements in AIndex.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Drop`(int`):%- [@(0.0.255) void]_[* Drop]([@(0.0.255) int]_[*@3 n]_`=_[@3 1])&] +[s5;:Index`:`:Drop`(int`):%- [@(0.0.255) void]_[* Drop]([@(0.0.255) int]_[*@3 n]_`=_[@3 1])&] [s2; Drops [%-*@3 n] elements from the end of the AIndex (same as Trim(GetCount() `- n)).&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Top`(`)const:%- [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* Top]()_[@(0.0.255) c +[s5;:Index`:`:Top`(`)const:%- [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* Top]()_[@(0.0.255) c onst]&] [s2; Returns a reference to the last element in the AIndex.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Reserve`(int`):%- [@(0.0.255) void]_[* Reserve]([@(0.0.255) int]_[*@3 n])&] -[s2; Reserves capacity. If [%-*@3 n] is greater than current capacity, -capacity is increased to the requested value.&] +[s5;:Index`:`:Pop`(`):%- [*@4 T]_[* Pop]()&] +[s2; Drops last element of the Index and returns its value.&] +[s6; Requires T to have deep copy constructor.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Shrink`(`):%- [@(0.0.255) void]_[* Shrink]()&] +[s5;:Index`:`:Reserve`(int`):%- [@(0.0.255) void]_[* Reserve]([@(0.0.255) int]_[*@3 n])&] +[s2; Reserves capacity. If [%-*@3 n] is greater than current capacity, +capacity is increased to the requested value.&] +[s0; &] +[s4;%- &] +[s5;:Index`:`:Shrink`(`):%- [@(0.0.255) void]_[* Shrink]()&] [s2; Minimizes the memory consumption of AIndex by decreasing the capacity to the number of elements.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:GetAlloc`(`)const:%- [@(0.0.255) int]_[* GetAlloc]()_[@(0.0.255) const]&] +[s5;:Index`:`:GetAlloc`(`)const:%- [@(0.0.255) int]_[* GetAlloc]()_[@(0.0.255) const]&] [s2; Returns the current capacity of AIndex.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:Serialize`(Stream`&`):%- [@(0.0.255) void]_[* Serialize](Stream[@(0.0.255) `& +[s5;:Index`:`:Serialize`(Stream`&`):%- [@(0.0.255) void]_[* Serialize](Stream[@(0.0.255) `& ]_[*@3 s])&] [s2; Serializes content of AIndex to/from Stream.&] [s6; Requires T to have serialization operator defined.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:PickKeys`(`)pick`_:%- [*@4 V]_[* PickKeys]()_[@(0.128.128) pick`_]&] +[s5;:Index`:`:PickKeys`(`):%- [*@4 V]_[* PickKeys]()&] [s2; Returns a basic random access container of elements. Destroys AIndex by picking.&] [s3;%- &] [s4;%- &] -[s5;:AIndex`:`:GetKeys`(`)const:%- [@(0.0.255) const]_[*@4 V][@(0.0.255) `&]_[* GetKeys]()_[@(0.0.255) c +[s5;:Index`:`:GetKeys`(`)const:%- [@(0.0.255) const]_[*@4 V][@(0.0.255) `&]_[* GetKeys]()_[@(0.0.255) c onst]&] [s2; Returns a constant reference to basic random access container of elements.&] -[s3;%- &] -[s4;%- &] -[s5;:Upp`:`:AIndex`:`:operator`=`(V`&`&`):%- [_^Upp`:`:AIndex^ AIndex][@(0.0.255) `&]_[* op -erator`=]([*@4 V][@(0.0.255) `&`&]_[*@3 s])&] -[s2; Assigns basic random access container to AIndex. Transfers the -source container in short constant time, but destroys it by picking.&] -[s3;%- &] -[s4;%- &] -[s5;:AIndex`:`:Begin`(`)const:%- [_^AIndex`:`:ConstIterator^ ConstIterator]_[* Begin]()_[@(0.0.255) c -onst]&] -[s2; Returns a constant iterator to the first element in AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:AIndex`:`:End`(`)const:%- [_^AIndex`:`:ConstIterator^ ConstIterator]_[* End]()_[@(0.0.255) c -onst]&] -[s2; Returns a constant iterator to the position just beyond the -last element in AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:AIndex`:`:GetIter`(int`)const:%- [_^AIndex`:`:ConstIterator^ ConstIterator]_[* GetIt -er]([@(0.0.255) int]_[*@3 pos])_[@(0.0.255) const]&] -[s2; Returns a constant iterator to the element at specified position. -Same as [* Begin() `+ i]. The benefit of this method is that [* pos] -is range checked in debug mode.&] -[s3;%- &] [s0; ]] \ No newline at end of file diff --git a/uppsrc/Core/src.tpp/Indext$en-us.tpp b/uppsrc/Core/src.tpp/Indext$en-us.tpp index d38849833..83c19890f 100644 --- a/uppsrc/Core/src.tpp/Indext$en-us.tpp +++ b/uppsrc/Core/src.tpp/Indext$en-us.tpp @@ -10,38 +10,6 @@ topic "Index"; [i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam] [b42;2 $$9,9#13035079074754324216151401829390:normal] [{_}%EN-US -[ {{10000@(113.42.0) [s0; [*@7;4 Index]]}}&] -[s3; &] -[s1;:noref:%- [@(0.0.255)3 template][3 _<][@(0.0.255)3 class][3 _][*@4;3 T][3 , -][@(0.0.255)3 class][3 _][*@4;3 HashFn][3 _`=_StdHash][@(0.0.255)3 <][*@4;3 T][@(0.0.255)3 >][3 _ ->]&] -[s1;:Index`:`:class:%- [@(0.0.255) class]_[* Index]_:_[@(0.0.255) private]_[*@3 MoveableAndDee -pCopyOption][@(0.0.255) <]_[* Index][@(0.0.255) <][*@4 T], [*@4 HashFn]_>_>, -[@(0.0.255) public]_[*@3 AIndex][@(0.0.255) <][*@4 T], [_^Vector^ Vector][@(0.0.255) <][*@4 T][@(0.0.255) > -], [*@4 HashFn][@(0.0.255) >]_&] -[s8; [*@4 T]-|Type of elements stored in Index. T is required to be -[/^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ moveable][/ ]and must -have [/^topic`:`/`/Core`/srcdoc`/pick`_`$en`-us^ deep copy constructor] -and deep copy assignment.&] -[s8; [*@4 HashFn]-|Hashing class. Must have unsigned operator()(const -T`& x) method defined, returning hash value for elements. Defaults -to StdHash which requires unsigned GetHashValue(const T`&) -function returning hash value of elements to be defined.&] -[s9; Vector flavor of index. Inherits most of its functionality from -[^topic`:`/`/Core`/src`/AIndex`$en`-us^ AIndex] and adds only members -specific for its flavor.&] -[s9; Like any other NTL container, Index is a [*/^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ m -oveable][*/ ]type with [*/^topic`:`/`/Core`/srcdoc`/pick`_`$en`-us^ pick -and optional deep copy] transfer semantics. Calling methods of -picked Index is logic error with exception of&] -[s0; [C+75 void ][*C+75 operator`=][C+75 (pick`_ Index`& ][*C@3+75 v][C+75 ) -][/+75 (defined by composition)]&] -[s0; [C+75 void ][*C+75 operator<<`=][C+75 (const AIndex`& ][*C@3+75 v][C+75 )][+75 -][/+75 (defined in AIndex)]&] -[s0; [C+75 void ][*C+75 Clear][C+75 ()]&] -[s0; [C+75 bool ][*C+75 IsPicked][C+75 () const]&] -[s9; Optional deep copy operator is inherited from AIndex class. -Pick operator is implicitly defined by composition.&] [s0; &] [s0; [* Base class]&] [s0; [^topic`:`/`/Core`/src`/AIndex`$en`-us`#AIndex`:`:class^ AIndex, HashFn>]&] [s0;%- &] [ {{10000F(128)G(128)@1 [s0; [* Constructor Detail]]}}&] [s3;%- &] -[s5;:Index`:`:Index`(`):%- [* Index]()&] -[s2; Constructs empty Index.&] -[s3; &] -[s4;%- &] -[s5;:Upp`:`:Index`:`:Index`(Upp`:`:Index`&`&`):%- [* Index]([* Index][@(0.0.255) `&`&]_[*@3 s -])&] -[s2; Pick constructor.&] -[s3; &] -[s4;%- &] -[s5;:Index`:`:Index`(pick`_ Vector``&`):%- [* Index]([@(0.128.128) pick`_]_[_^Vector^ V -ector][@(0.0.255) <][*@4 T][@(0.0.255) >`&]_[*@3 s])&] -[s2; Pick operator. Transfers source Vector to Index in low constant -time, but destroys it by picking.&] -[s7; [*C@3 x]-|Source Vector.&] -[s3; &] -[s4;%- &] -[s5;:Index`:`:Index`(const Index`&`,int`):%- [* Index]([@(0.0.255) const]_[* Index][@(0.0.255) `& -]_[*@3 s], [@(0.0.255) int])&] -[s2; Optional deep copy constructor.&] -[s6; Requires T to have deep copy constructor or optional deep copy -constructor.&] -[s7; [*C@3 s]-|Source Index.&] -[s3; &] -[s4;%- &] -[s5;:Upp`:`:Index`:`:Index`(Upp`:`:Vector``&`&`):%- [@(0.0.255) explicit]_[* Index]([_^Upp`:`:Vector^ V -ector]<[*@4 T]>`&`&_[*@3 s])&] -[s2; Pick constructs Index from Vector.&] -[s3; &] -[s4;%- &] -[s5;:Index`:`:Index`(const Vector``&`,int`):%- [* Index]([@(0.0.255) const]_[_^Vector^ V -ector][@(0.0.255) <][*@4 T][@(0.0.255) >`&]_[*@3 s], [@(0.0.255) int])&] -[s2; Deep`-copy constructs Index from Vector.&] -[s6; Requires T to have deep copy constructor or optional deep copy -constructor.&] -[s7; [*@3 s]-|Source Vector.&] -[s3; &] -[s4;%- &] -[s5;:Upp`:`:Index`:`:operator`=`(Upp`:`:Vector``&`&`):%- [_^Upp`:`:Index^ Index][@(0.0.255) `& -]_[* operator`=]([_^Upp`:`:Vector^ Vector]<[*@4 T]>`&`&_[*@3 x])&] -[s2; Pick assignment from Vector.&] -[s3; &] -[s4;%- &] -[s5;:Upp`:`:Index`:`:operator`=`(Upp`:`:Index``&`&`):%- [_^Upp`:`:Index^ Index][@(0.0.255) `& -]_[* operator`=]([_^Upp`:`:Index^ Index]<[*@4 T]>`&`&_[*@3 x])&] -[s2; Pick assignment.&] -[s3; &] -[s4;%- &] -[s5;:Upp`:`:Index`:`:Index`(std`:`:initializer`_list``):%- [* Index]([_^http`:`/`/en`.cppreference`.com`/w`/cpp`/utility`/initializer`_list^ s -td`::initializer`_list]<[*@4 T]>_[*@3 init])&] -[s2;%- C`+`+ 11 initialization.&] +[s2;%- &] [s0; &] [ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&] [s3;%- &] -[s5;:Index`:`:Pop`(`):%- [*@4 T]_[* Pop]()&] -[s2; Drops last element of the Index and returns its value.&] -[s6; Requires T to have deep copy constructor.&] -[s7; [*/ Return value]-|Value of the dropped element.&] [s3; &] [s0; ]] \ No newline at end of file