template<typename MYSELF, typename ARRAY, BASESORTFLAGS FLAGS = BASESORTFLAGS::NONE, Bool PARALLEL = false>
class maxon::SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL >
Sorted array. The class can be combined with any standard array type. Sorting is done on first read access, e.g. if you access the array by using the index operator. Note that sorted arrays will be extremely slow if read and write access is constantly alternating, as for every write access a sort needs to be done, which needs O(log n) time. In those cases other datastructures will be better suited. Please also take into consideration that sorted arrays are not thread-safe, even for read-access unless you call Sort() once before multiple threads start reading the data (if the array was in a non-sorted state the first read-access will sort it otherwise, which will obviously cause problems)
If the data type to be sorted is unknown to DefaultCompare you should inherit from SortedArray and define a LessThan() and an IsEqual() method for comparison of elements. For example:
class MySortedArray :
public SortedArray<MySortedArray, BaseArray<MyType>>
{
public:
static Bool LessThan(
const MyType& a,
const MyType& b) {
return a < b; }
static Bool IsEqual(
const MyType& a,
const MyType& b) {
return a == b; }
};
MySortedArray a;
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value &&!STD_IS_REPLACEMENT(same, typename std::decay< COMPARE >::type, EQUALITY), Bool >::type IsEqual(const COLLECTION2 &other, COMPARE &&cmp=COMPARE()) const
Definition: collection.h:236
SortedArray()
Default constructor. Creates an empty array.
Definition: sortedarray.h:66
PyObject * x
Definition: bytesobject.h:38
maxon::Bool Bool
Definition: ge_sys_math.h:55
Bool LessThan(UInt a1, UInt a2, UInt b1, UInt b2)
Definition: integer.h:151
#define iferr_return
Definition: resultbase.h:1465
- Note
- Note that the classes that will be sorted have special requirements regarding copy and move constructors .
-
Note that the comparison must fulfill the condition (a < b) == !(b < a). If this is not the case the sort algorithm will crash. To avoid mistakes when comparing tuples use LexicographicalCompare.
- Template Parameters
-
- Note
- Note that the array element class has special requirements regarding copy and move constructors .
|
| SortedArray () |
|
| SortedArray (const typename ARRAY::AllocatorType &a) |
|
| ~SortedArray () |
|
| SortedArray (SortedArray &&src) |
|
| MAXON_OPERATOR_MOVE_ASSIGNMENT (SortedArray) |
|
void | Reset () |
|
void | Flush () |
|
ResultMem | SetCapacityHint (Int requestedCapacity, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
Int | GetCount () const |
|
Int | GetCapacityCount () const |
|
const TYPE & | operator[] (Int idx) const |
|
template<typename... ARGS> |
MAXON_ATTRIBUTE_FORCE_INLINE ResultRef< TYPE > | Append (ARGS &&... args) |
|
ResultPtr< TYPE > | AppendPtr (TYPE *x) |
|
Bool | PopPtr (TYPE **dst) |
|
ResultPtr< TYPE > | InsertPtr (Int position, TYPE *x) |
|
template<typename... ARGS> |
ResultRef< TYPE > | Insert (Int position, ARGS &&... args) |
|
template<typename... ARGS> |
ResultMemT< Iterator > | Insert (Iterator position, ARGS &&... args) |
|
template<typename... ARGS> |
ResultPtr< TYPE > | InsertBlock (Int position, ARGS &&... args) |
|
template<typename... ARGS> |
ResultMemT< Iterator > | InsertBlock (Iterator position, ARGS &&... args) |
|
ResultPtr< TYPE > | Erase (Int position, Int eraseCnt=1) |
|
ResultPtr< TYPE > | ErasePtr (Int position, TYPE **dst) |
|
ResultMem | SwapErase (Int position, Int eraseCnt=1) |
|
Iterator | SwapErase (Iterator position, Int eraseCnt=1) |
|
template<Bool STRIDED> |
Int | GetBlock (Int position, Block< TYPE, STRIDED > &block) |
|
template<Bool STRIDED> |
Int | GetBlock (Int position, Block< const TYPE, STRIDED > &block) const |
|
Iterator | Erase (Iterator position, Int eraseCnt=1) |
|
template<typename SEARCH > |
Bool | EraseKey (const SEARCH &key) |
|
const TYPE * | GetFirst () const |
|
TYPE * | GetFirst () |
|
const TYPE * | GetLast () const |
|
TYPE * | GetLast () |
|
ResultMem | Resize (Int newCnt, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::DEFAULT) |
|
Bool | Pop (TYPE *dst=nullptr) |
|
Int | GetIndex (const TYPE &x) const |
|
Result< void > | CopyFrom (const SortedArray &src) |
|
template<typename COLLECTION2 , typename = typename std::enable_if<!STD_IS_REPLACEMENT(same, typename std::decay<COLLECTION2>::type, SortedArray)>::type> |
Result< void > | CopyFrom (COLLECTION2 &&other) |
|
void | Swap (Iterator a, Iterator b) |
|
Int | GetMemorySize () const |
|
ConstIterator | Begin () const |
|
Iterator | Begin () |
|
ConstIterator | End () const |
|
Iterator | End () |
|
void | SortChanged () |
|
void | Sort () |
|
template<typename SEARCH > |
TYPE * | FindValue (const SEARCH &key) |
|
template<typename SEARCH > |
const TYPE * | FindValue (const SEARCH &key) const |
|
template<typename SEARCH > |
Int | FindIndex (const SEARCH &key) const |
|
template<typename SEARCH > |
ResultRef< TYPE > | InsertValue (const SEARCH &key) |
|
template<typename SEARCH > |
ResultRef< TYPE > | InsertValue (const SEARCH &key, Bool &newElement, Int *index=nullptr) |
|
ARRAY & | GetUnderlyingArray () |
|
const ARRAY & | GetUnderlyingArray () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE | ArrayBase (ARGS &&... args) |
|
ArrayImpl< SortedArray< MYSELF, ARRAY, BASESORTFLAGS::NONE, false > & > | ToArray () |
|
ArrayImpl< const SortedArray< MYSELF, ARRAY, BASESORTFLAGS::NONE, false > & > | ToArray () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE | operator ArrayImpl< SortedArray< MYSELF, ARRAY, BASESORTFLAGS::NONE, false > & > () |
|
MAXON_ATTRIBUTE_FORCE_INLINE | operator ArrayImpl< const SortedArray< MYSELF, ARRAY, BASESORTFLAGS::NONE, false > & > () const |
|
template<typename... ARGS> |
MAXON_ATTRIBUTE_FORCE_INLINE | ArrayBase0 (ARGS &&... args) |
|
Bool | IsValidIndex (Int index) const |
|
Result< void > | CheckValidIndex (Int index) const |
|
Int | FindIndex (typename ByValueParam< VALUETYPE >::type v, Int start) const |
|
Int | FindLastIndex (typename ByValueParam< VALUETYPE >::type v) const |
|
Int | FindLastIndex (typename ByValueParam< VALUETYPE >::type v, Int start) const |
|
Bool | EraseFirst (typename ByValueParam< VALUETYPE >::type v) |
|
Int | EraseAll (typename ByValueParam< VALUETYPE >::type v) |
|
template<typename COLLECTION2 > |
Result< void > | AppendAllImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, Bool overwrite, OverloadRank0) |
|
template<typename COLLECTION2 > |
Result< void > | InsertAll (Int index, COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
template<typename COLLECTION2 > |
Result< void > | Add (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
template<typename COLLECTION2 > |
Result< void > | SubtractImpl (COLLECTION2 &&other, OverloadRank0) |
|
template<typename COLLECTION2 , typename COMPARE > |
Bool | IsEqualImpl (const COLLECTION2 &other, COMPARE &&cmp, OverloadRank0) const |
|
HashInt | GetHashCode () const |
|
UniqueHash | GetUniqueHashCode () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE AutoIterator< COLLECTION > | Slice (Int start) |
|
MAXON_ATTRIBUTE_FORCE_INLINE AutoIterator< const COLLECTION > | Slice (Int start) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE AutoIterator< COLLECTION > | Slice (Int start, Int end) |
|
MAXON_ATTRIBUTE_FORCE_INLINE AutoIterator< const COLLECTION > | Slice (Int start, Int end) const |
|
BlockIterator< COLLECTION, VALUETYPE, false, false > | GetBlocks () |
|
BlockIterator< COLLECTION, VALUETYPE, true, false > | GetBlocks () const |
|
BlockIterator< COLLECTION, VALUETYPE, false, true > | GetStridedBlocks () |
|
BlockIterator< COLLECTION, VALUETYPE, true, true > | GetStridedBlocks () const |
|
template<typename... ARGS> |
MAXON_ATTRIBUTE_FORCE_INLINE | Collection (ARGS &&... args) |
|
ResultOk< void > | VariadicAppend () |
|
template<typename V , typename... VALUES> |
Result< void > | VariadicAppend (V &&value, VALUES &&... rest) |
|
| operator ValueReceiver< const VALUETYPE & > () |
|
| operator ValueReceiver< VALUETYPE && > () |
|
| operator ValueReceiver< typename std::conditional< STD_IS_REPLACEMENT (scalar, VALUETYPE) |
|
DummyParamType & | type () |
|
template<typename FN > |
Result< Bool > | ForEach (FN &&callback) const |
|
template<typename FN > |
Result< Bool > | ForEach (FN &&callback) |
|
template<typename H = COLLECTION> |
H::Iterator | Find (typename ByValueParam< VALUETYPE >::type v) |
|
template<typename H = COLLECTION> |
H::ConstIterator | Find (typename ByValueParam< VALUETYPE >::type v) const |
|
Int | FindIndex (typename ByValueParam< VALUETYPE >::type v) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE Bool | Contains (typename ByValueParam< VALUETYPE >::type v) const |
|
template<typename... ARGS> |
MAXON_ATTRIBUTE_FORCE_INLINE | BaseCollection (ARGS &&... args) |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value, Bool >::type | operator== (const COLLECTION2 &other) const |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value, Bool >::type | operator!= (const COLLECTION2 &other) const |
|
template<typename COMPARE = EqualityCompare, typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value &&!STD_IS_REPLACEMENT(same, typename std::decay< COMPARE >::type, EQUALITY), Bool >::type | IsEqual (const COLLECTION2 &other, COMPARE &&cmp=COMPARE()) const |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | AppendAll (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | CopyFrom (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::FIT_TO_SIZE) |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | Subtract (COLLECTION2 &&other) |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | Intersect (const COLLECTION2 &other) |
|
template<typename COLLECTION2 > |
Bool | Intersects (const COLLECTION2 &other) const |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | CopyFromImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, OverloadRank0) |
|
template<typename COLLECTION2 > |
Result< void > | AppendAllImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, Bool overwrite, OverloadRank0) |
|
template<typename COLLECTION2 > |
Result< void > | IntersectImpl (COLLECTION2 &&other, OverloadRank0) |
|
MAXON_ATTRIBUTE_FORCE_INLINE Bool | IsEmpty () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE Bool | IsPopulated () const |
|
String | ToString (const FormatStatement *formatStatement=nullptr) const |
|
template<typename COLLECTION2 > |
MAXON_ATTRIBUTE_FORCE_INLINE Bool | ContainsAll (COLLECTION2 &&other) const |
|
template<typename COLLECTION2 > |
Bool | ContainsAllImpl (COLLECTION2 &&other, OverloadRank0) const |
|