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;
- 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 |
|
ResultRef< TYPE > | Append () |
|
ResultRef< TYPE > | Append (const TYPE &x) |
|
ResultRef< TYPE > | Append (TYPE &&x) |
|
ResultPtr< TYPE > | AppendPtr (TYPE *x) |
|
Bool | PopPtr (TYPE **dst) |
|
ResultRef< TYPE > | Insert (Int position) |
|
ResultPtr< TYPE > | InsertPtr (Int position, TYPE *x) |
|
ResultMemT< Iterator > | Insert (Iterator position) |
|
ResultRef< TYPE > | Insert (Int position, const TYPE &x) |
|
ResultMemT< Iterator > | Insert (Iterator position, const TYPE &x) |
|
ResultRef< TYPE > | Insert (Int position, TYPE &&x) |
|
ResultMemT< Iterator > | Insert (Iterator position, TYPE &&x) |
|
ResultPtr< TYPE > | Insert (Int position, const Block< const TYPE > &values) |
|
ResultMemT< Iterator > | Insert (Iterator position, const Block< const TYPE > &values) |
|
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_same<typename std::decay<COLLECTION2>::type, SortedArray>::value>::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, FLAGS, PARALLEL > & > | ToArray () |
|
ArrayImpl< const SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL > & > | ToArray () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE | operator ArrayImpl< SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL > & > () |
|
MAXON_ATTRIBUTE_FORCE_INLINE | operator ArrayImpl< const SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL > & > () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE | ArrayBase0 (ARGS &&... args) |
|
Bool | IsValidIndex (Int index) const |
|
Result< void > | CheckValidIndex (Int index) const |
|
Int | FindIndex (typename ByValueParam< ARRAY::ValueType >::type v, Int start) const |
|
Int | FindLastIndex (typename ByValueParam< ARRAY::ValueType >::type v) const |
|
Int | FindLastIndex (typename ByValueParam< ARRAY::ValueType >::type v, Int start) const |
|
Bool | EraseFirst (typename ByValueParam< ARRAY::ValueType >::type v) |
|
Int | EraseAll (typename ByValueParam< ARRAY::ValueType >::type v) |
|
Result< void > | AppendAllImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, Bool overwrite, OverloadRank0) |
|
Result< void > | InsertAll (Int index, COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
Result< void > | Add (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
Result< void > | SubtractImpl (COLLECTION2 &&other, OverloadRank0) |
|
Bool | IsEqualImpl (const COLLECTION2 &other, COMPARE &&cmp, OverloadRank0) const |
|
UInt | GetHashCode () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE AutoIterator< SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL > > | Slice (Int start) |
|
MAXON_ATTRIBUTE_FORCE_INLINE AutoIterator< const SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL > > | Slice (Int start) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE AutoIterator< SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL > > | Slice (Int start, Int end) |
|
MAXON_ATTRIBUTE_FORCE_INLINE AutoIterator< const SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL > > | Slice (Int start, Int end) const |
|
BlockIterator< SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL >, ARRAY::ValueType, false, false > | GetBlocks () |
|
BlockIterator< SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL >, ARRAY::ValueType, true, false > | GetBlocks () const |
|
BlockIterator< SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL >, ARRAY::ValueType, false, true > | GetStridedBlocks () |
|
BlockIterator< SortedArray< MYSELF, ARRAY, FLAGS, PARALLEL >, ARRAY::ValueType, true, true > | GetStridedBlocks () const |
|
MAXON_ATTRIBUTE_FORCE_INLINE | Collection (ARGS &&... args) |
|
ResultOk< void > | VariadicAppend () |
|
Result< void > | VariadicAppend (V &&value, VALUES &&... rest) |
|
| operator ValueReceiver< const ARRAY::ValueType & > () |
|
| operator ValueReceiver< ARRAY::ValueType && > () |
|
| operator ValueReceiver< typename std::conditional< std::is_scalar< ARRAY::ValueType >::value, ARRAY::ValueType, DummyParamType & >::type > () |
|
Result< Bool > | ForEach (FN &&callback) |
|
H::Iterator | Find (typename ByValueParam< ARRAY::ValueType >::type v) |
|
H::ConstIterator | Find (typename ByValueParam< ARRAY::ValueType >::type v) const |
|
Int | FindIndex (typename ByValueParam< ARRAY::ValueType >::type v) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE Bool | Contains (typename ByValueParam< ARRAY::ValueType >::type v) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE | BaseCollection (ARGS &&... args) |
|
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value, Bool >::type | operator== (const COLLECTION2 &other) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value, Bool >::type | operator!= (const COLLECTION2 &other) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE std::enable_if< maxon::IsCollection< COLLECTION2 >::value &&!std::is_same< typename std::decay< COMPARE >::type, EQUALITY >::value, Bool >::type | IsEqual (const COLLECTION2 &other, COMPARE &&cmp=COMPARE()) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | AppendAll (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::ON_GROW_RESERVE_CAPACITY) |
|
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | CopyFrom (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags=COLLECTION_RESIZE_FLAGS::FIT_TO_SIZE) |
|
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | Subtract (COLLECTION2 &&other) |
|
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | Intersect (const COLLECTION2 &other) |
|
Bool | Intersects (const COLLECTION2 &other) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE Result< void > | CopyFromImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, OverloadRank0) |
|
Result< void > | AppendAllImpl (COLLECTION2 &&other, COLLECTION_RESIZE_FLAGS resizeFlags, Bool overwrite, OverloadRank0) |
|
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) const |
|
MAXON_ATTRIBUTE_FORCE_INLINE Bool | ContainsAll (COLLECTION2 &&other) const |
|
Bool | ContainsAllImpl (COLLECTION2 &&other, OverloadRank0) const |
|