49 #ifndef __UT_ARRAY_H_INCLUDED__
50 #define __UT_ARRAY_H_INCLUDED__
68 #include <initializer_list>
70 #include <type_traits>
79 #undef UT_ARRAY_STRICT_LABELED_CAPACITY
125 explicit
UT_Array(std::initializer_list<
T> init);
148 if (check_dup && ((idx =
find(t)) != -1))
166 template <
typename...
S>
177 const UT_ArrayCT::ExternalCapacity,
179 const exint external_capacity
183 const UT_ArrayCT::ExternalMove,
185 const exint external_capacity,
196 const UT_ArrayCT::GeneralizedMove,
203 template <
typename Y>
213 template <
typename F>
214 using IsBoolComp = decltype(std::declval<F>()(std::declval<T>(),
226 template <typename ComparatorBool = Less<
T>,
227 typename = IsBoolComp<ComparatorBool>>
236 template <
typename ComparatorBool = Less<T>,
237 typename = IsBoolComp<ComparatorBool>>
248 template <
typename ComparatorBool = Less<T>,
249 typename = IsBoolComp<ComparatorBool>>
251 ComparatorBool is_less = {})
const;
262 template <typename ComparatorBool = Less<
T>>
264 bool allow_dups, ComparatorBool is_less = {});
265 template <
typename ComparatorBool = Less<T>>
267 bool allow_dups, ComparatorBool is_less = {})
270 template <
typename ComparatorBool = Less<T>,
271 typename = IsBoolComp<ComparatorBool>>
273 ComparatorBool is_less = {})
const;
275 template <
typename ComparatorBool = Less<T>,
276 typename = IsBoolComp<ComparatorBool>>
279 ComparatorBool is_less = {});
280 template <
typename ComparatorBool = Less<T>,
281 typename = IsBoolComp<ComparatorBool>>
285 ComparatorBool is_less = {})
const;
286 template <
typename ComparatorBool = Less<T>,
287 typename = IsBoolComp<ComparatorBool>>
290 ComparatorBool is_less = {});
291 template <
typename ComparatorBool = Less<T>,
292 typename = IsBoolComp<ComparatorBool>>
296 ComparatorBool is_less = {})
const;
297 template <
typename ComparatorBool = Less<T>,
298 typename = IsBoolComp<ComparatorBool>>
301 ComparatorBool is_less = {});
302 template <
typename ComparatorBool = Less<T>,
303 typename = IsBoolComp<ComparatorBool>>
307 ComparatorBool is_less = {})
const;
371 {
return (index >= 0 && index < mySize); }
377 template <
typename S>
387 exint idx = --mySize;
388 destroyElement(myData[idx]);
407 template <
typename IsEqual>
411 template <
typename IsEqual>
434 template <
typename S>
439 template <
typename IsEqual>
465 template <
typename ComparatorBool = Less<T>,
466 typename = IsBoolComp<ComparatorBool>>
467 void sort(ComparatorBool is_less = {})
469 std::sort(myData, myData + mySize, is_less);
479 template <typename ComparatorBool,
480 typename = IsBoolComp<ComparatorBool>>
484 std::sort(myData, myData + mySize, is_less);
495 template<
typename ComparatorBool = Less<T>>
507 template<
typename ComparatorBool = Less<T>>
509 ComparatorBool is_less = {})
520 std::stable_sort(
array() + start,
array() + end, is_less);
523 template<
typename ComparatorBool>
532 template <
typename I,
typename V,
typename ComparatorBool>
542 {
return myCompare(myValues(a), myValues(b)); }
545 const ComparatorBool &myCompare;
556 template <
typename I,
typename ComparatorBool = Less<T>>
558 ComparatorBool is_less = {})
const
560 IndexedCompare<I, T, ComparatorBool>
compare(*
this, is_less);
561 std::stable_sort(indices.
getArray(),
568 template <
typename I,
typename ComparatorBool = Less<T>>
570 ComparatorBool is_less = {})
const
581 template <
typename K,
typename ComparatorBool = Less<K>>
583 ComparatorBool is_less = {})
600 template <
typename CompareEqual>
607 template<
typename ComparatorBool = Less<T>>
618 template <
typename ComparatorBool = Less<T>>
640 exint new_capacity = min_capacity;
641 if (bumped > min_capacity)
642 new_capacity = bumped;
683 return (inclusive ?
sizeof(*
this) : 0) +
capacity()*
sizeof(
T);
694 if (newsize == mySize)
697 if (mySize > newsize)
698 destroyRange(myData + newsize, mySize - newsize);
700 constructRange(myData + mySize, newsize - mySize);
705 if (
size() >= minsize)
723 if (newsize == mySize)
726 if (mySize > newsize)
727 destroyRange(myData + newsize, mySize - newsize);
729 constructRange(myData + mySize, newsize - mySize);
749 if (maxsize >= 0 &&
size() > maxsize)
758 destroyRange(myData, mySize);
781 template <typename ComparatorBool,
782 typename = IsBoolComp<ComparatorBool>>
837 return (i >= 0 && i < mySize) ? myData[i] :
T();
843 return myData[mySize-1];
848 return myData[mySize-1];
857 template <
typename BinaryOp>
864 const T *
array()
const {
return myData; }
867 const T *
data()
const {
return myData; }
872 {
T *
data = myData; myData = newdata;
return data; }
874 template <
typename IT,
bool FORWARD>
890 template<
typename EIT>
892 : myCurrent(src.myCurrent), myEnd(src.myEnd) {}
895 {
return FORWARD ? myCurrent : myCurrent - 1; }
898 {
return FORWARD ? *myCurrent : myCurrent[-1]; }
901 {
return FORWARD ? *myCurrent : myCurrent[-1]; }
904 {
return FORWARD ? myCurrent[
n] : myCurrent[-n - 1]; }
909 if (FORWARD) ++myCurrent;
else --myCurrent;
916 if (FORWARD) ++myCurrent;
else --myCurrent;
922 if (FORWARD) --myCurrent;
else ++myCurrent;
929 if (FORWARD) --myCurrent;
else ++myCurrent;
950 {
return (*
this) += (-
n); }
952 {
return (*
this) + (-
n); }
954 bool atEnd()
const {
return myCurrent == myEnd; }
958 template<
typename ITR,
bool FR>
960 {
return myCurrent == r.myCurrent; }
962 template<
typename ITR,
bool FR>
964 {
return myCurrent != r.myCurrent; }
966 template<
typename ITR>
967 bool operator<(const base_iterator<ITR, FORWARD> &
r)
const
970 return myCurrent <
r.myCurrent;
972 return r.myCurrent < myCurrent;
975 template<
typename ITR>
979 return myCurrent > r.myCurrent;
981 return r.myCurrent > myCurrent;
984 template<
typename ITR>
985 bool operator<=(const base_iterator<ITR, FORWARD> &
r)
const
988 return myCurrent <=
r.myCurrent;
990 return r.myCurrent <= myCurrent;
993 template<
typename ITR>
997 return myCurrent >= r.myCurrent;
999 return r.myCurrent >= myCurrent;
1003 template<
typename ITR>
1007 return exint(myCurrent - r.myCurrent);
1009 return exint(r.myCurrent - myCurrent);
1013 template<
typename ITR>
1041 return iterator(myData, myData + mySize);
1099 removeAt(&it.item() - myData);
1108 myData = src.myData;
1109 myCapacity = labelExternal( src.
capacity() );
1110 mySize = src.mySize;
1115 myCapacity = labelExternal( srcsize );
1122 myCapacity = labelExternal( capacity );
1127 myCapacity = labelExternal( 0 );
1144 return SYS_IsPod_v< T >;
1150 template <
typename S>
1154 template <
typename S>
1157 template <
typename S>
1163 template <typename First, typename... Rest>
1167 static_cast<const void *>(&first) <
1168 static_cast<const void *>(myData) ||
1169 static_cast<const void *>(&first) >=
1170 static_cast<const void *>(myData + mySize),
1171 "Argument cannot reference an existing element in the array.");
1182 template <
typename...
S>
1185 new (&
dst)
T(std::forward<S>(
s)...);
1191 if constexpr( SYS_IsPod_v< T > )
1205 class AppendIterator
1208 using iterator_category = std::output_iterator_tag;
1210 using difference_type =
void;
1214 explicit AppendIterator(
UT_Array<T> &arr) : myArray(&arr) {}
1220 myArray->append(val);
1226 myArray->append(std::move(val));
1233 AppendIterator &
operator*() {
return *
this; }
1234 AppendIterator &operator++() {
return *
this; }
1235 AppendIterator operator++(
int) {
return *
this; }
1242 #ifdef UT_ARRAY_STRICT_LABELED_CAPACITY
1252 LabeledCapacity myCapacity;
1258 static LabeledCapacity labelOwned(
const exint capacity) noexcept;
1261 static LabeledCapacity labelExternal(
const exint capacity) noexcept;
1278 static void deallocateArray(
T *
data) noexcept;
1304 static void constructElement(
T &
dst);
1307 static void destroyElement(
T &
dst) noexcept;
1308 static void destroyRange([[maybe_unused]]
T *
dst,
exint n) noexcept;
1346 static void bitwiseRelocate(
T *
dst,
const T *
src,
exint n) noexcept;
1351 static void bitwiseRelocateNonoverlapping(
1400 template<
typename OS,
typename S>
1401 friend OS &operator<<(OS &os, const UT_Array<S> &d);
1417 template <
typename T,
typename S>
1424 for (
exint i = 0; i <
n; i++)
1425 dest(i) =
T(
src(i));
1427 template <
typename T,
typename S>
1433 for (
exint i = 0; i <
n; i++)
1434 dest(i) =
T(src[i]);
1436 template <
typename T,
typename S>
1442 for (
exint i = 0; i <
n; i++)
1443 dest[i] =
T(
src(i));
1445 template <
typename T,
typename S>
1450 for (
int64 i = 0; i <
n; i++)
1451 dest[i] =
T(src[i]);
1457 template<
typename OS,
typename S>
1459 operator<<(OS &os, const UT_Array<S> &d)
1466 template <
typename T>
UT_API size_t
1471 template <
template <
typename>
class ArrayT,
typename T>
1473 UTarrayDeepMemoryUsage(
const ArrayT<T> &arr,
bool inclusive)
1475 int64 mem = inclusive ?
sizeof(arr) : 0;
1476 mem += arr.getMemoryUsage(
false);
1477 for (
auto &&item : arr)
1478 mem += item.getMemoryUsage(
false);
1483 template <
typename T>
1487 arr.
sort([](
const T &
a,
const T &
b) {
return a <
b; });
1491 template <
typename T>
1501 template <
typename T>
1502 struct DefaultClearer;
1504 template <
typename T>
1513 static const bool clearNeedsDestruction =
false;
1529 template <
typename T>
1536 #if defined(MBSD) || defined(_LIBCPP_VERSION)
1538 template <
typename CharT,
typename Traits,
typename Allocator>
1540 #elif defined(__GLIBCXX__)
1541 #include <bits/stringfwd.h>
1542 template <
typename CharT,
typename Traits,
typename Allocator>
1546 template <
typename CharT,
typename Traits,
typename Allocator>
1550 #endif // __UT_ARRAY_H_INCLUDED__
reference operator*() const
base_iterator & operator++()
Pre-increment operator.
base_iterator & operator--()
Pre-decrement operator.
exint insert(T &&t, exint i)
IndexedCompare(const UT_Array< V > &values, const ComparatorBool &compare)
typedef int(APIENTRYP RE_PFNGLXSWAPINTERVALSGIPROC)(int)
const T & operator[](exint i) const
void merge(const UT_Array< T > &other, int direction, bool allow_dups, ComparatorBool is_less={})
const T * getRawArray() const
bool isHeapBuffer() const
Returns true if the data used by the array was allocated on the heap.
pointer operator->() const
base_iterator operator+(exint n) const
GLenum GLuint GLsizei bufsize
void validateEmplaceArgs() const
Base case for validateEmplaceArgs().
GLsizei GLenum const void * indices
std::make_unsigned_t< exint > UT_LabeledCapacityRep
void stableSort(ComparatorBool is_less={})
void bumpCapacity(exint min_capacity)
void setSizeIfNeeded(exint minsize)
exint insertImpl(S &&s, exint index)
Similar to appendImpl() but for insertion.
SYS_FORCE_INLINE void removeLast()
void unsafeShareData(T *src, exint size, exint capacity)
exint findAndRemove(const S &s)
void shrinkToFit()
shrinks the capacity to the current size
UT_Array< T > & operator=(const UT_Array< T > &a)
IMF_EXPORT IMATH_NAMESPACE::V3f direction(const IMATH_NAMESPACE::Box2i &dataWindow, const IMATH_NAMESPACE::V2f &pixelPosition)
void extractRange(exint begin_i, exint end_i, UT_Array< T > &dest)
void collapseIf(IsEqual is_equal)
Remove all matching elements. Also sets the capacity of the array.
T * aliasArray(T *newdata)
void setSizeNoInit(exint newsize)
bool isValidIndex(exint index) const
Return true if given index is valid.
#define SYS_DEPRECATED_HDK_REPLACE(__V__, __R__)
CompareResults OIIO_API compare(const ImageBuf &A, const ImageBuf &B, float failthresh, float warnthresh, float failrelative, float warnrelative, ROI roi={}, int nthreads=0)
void zero()
Zeros the array if a POD type, else trivial constructs if a class type.
base_iterator< const T, false > const_reverse_iterator
friend void swap(UT_Array< T > &a, UT_Array< T > &b)
exint uniqueSortedFind(const T &item, ComparatorBool is_less={}) const
void move(exint src_idx, exint dst_idx, exint how_many)
const_iterator begin() const
int64 getMemoryUsage(bool inclusive=false) const
void bumpEntries(exint newsize)
const T & heapMax() const
GLboolean GLboolean GLboolean GLboolean a
void cycle(exint how_many)
Cyclically shifts the entire array by how_many.
exint removeIndex(exint index)
static constexpr struct UT_ArrayCT::GeneralizedMove GENERALIZED_MOVE
const_reverse_iterator rend() const
End reverse iterator. Consider using it.atEnd() instead.
void setCapacity(exint new_capacity)
PUGI__FN void sort(I begin, I end, const Pred &pred)
static constexpr SYS_FORCE_INLINE bool isPOD()
exint concat(const UT_Array< T > &a)
Takes another T array and concatenate it onto my end.
exint append(const T &t, bool check_dup)
**But if you need a result
#define UT_ASSERT_MSG_P(ZZ,...)
exint index(const T &t) const
bool operator>=(const base_iterator< ITR, FORWARD > &r) const
exint uniqueSortedInsert(const T &t, Comparator compare)
exint find(const S &s, exint start=0) const
static bool isClear(const UT_Array< T > &v)
void setSize(exint newsize)
bool operator==(const base_iterator< ITR, FR > &r) const
void sortedUnion(const UT_Array< T > &other, ComparatorBool is_less={})
base_iterator operator-(exint n) const
void bumpSize(exint newsize)
bool operator>(const base_iterator< ITR, FORWARD > &r) const
void setSizeAndShrink(exint new_size)
convenience method to set size and shrink-to-fit in a single call
base_iterator< T, false > reverse_iterator
void stableArgSort(UT_Array< I > &indices, ComparatorBool is_less={}) const
void unsafeShareData(T *src, exint srcsize)
#define SYS_DEPRECATED_REPLACE(__V__, __R__)
exint operator-(const base_iterator< ITR, FORWARD > &r) const
exint sortAndRemoveDuplicates(ComparatorBool is_less={})
const_reverse_iterator rbegin() const
Begin iterating over the array in reverse.
exint safeIndex(const T &t) const
SYS_NO_DISCARD_RESULT SYS_FORCE_INLINE constexpr T * SYSaddressof(T &val) noexcept
exint findIf(IsEqual is_equal, exint start=0) const
friend base_iterator operator+(exint n, const base_iterator< ITR, FORWARD > &next) noexcept
exint apply(int(*apply_func)(T &t, void *d), void *d)
reverse_iterator rbegin()
Begin iterating over the array in reverse.
exint emplace_back(S &&...s)
static void construct(T &dst, S &&...s)
void entries(exint newsize)
Alias of setSize(). setSize() is preferred.
exint uniqueSortedInsertImpl(S &&s, Comparator compare)
const T & operator()(exint i) const
void sort(ComparatorBool is_less={})
Sort using std::sort with bool comparator. Defaults to operator<().
reference operator[](exint n) const
exint insertAt(const T &t, exint index)
T accumulate(const T &init_value, BinaryOp add) const
base_iterator< T, true > iterator
static void clearConstruct(UT_Array< T > *p)
exint sortedInsert(const T &t, Comparator compare)
UT_IteratorRange< reverse_iterator > rrange()
exint insert(const T &t, exint i)
base_iterator(const base_iterator< EIT, FORWARD > &src)
void appendMultiple(const T &t, exint count)
IMATH_HOSTDEVICE constexpr Color4< T > operator*(S a, const Color4< T > &v) IMATH_NOEXCEPT
Reverse multiplication: S * Color4.
exint sizeInBytes() const
Returns size in bytes.
base_iterator(IT *c, IT *e)
static constexpr struct UT_ArrayCT::ExternalCapacity EXTERNAL_CAPACITY
T forcedGet(exint i) const
static void copyConstruct(T &dst, const T &src)
UT_API size_t UTformatBuffer(char *buffer, size_t bufsize, const UT_Array< T > &v)
void setCapacityIfNeeded(exint min_capacity)
#define SYS_DEPRECATED_HDK(__V__)
exint removeIf(IsEqual is_equal)
const_iterator end() const
End const iterator. Consider using it.atEnd() instead.
base_iterator & operator-=(exint n)
exint sortedRemoveDuplicates()
void sortedSetDifference(const UT_Array< T > &other, ComparatorBool is_less={})
GLboolean GLboolean GLboolean b
void unsafeShareData(UT_Array< T > &src)
reverse_iterator rend()
End reverse iterator.
bool operator()(I a, I b) const
bool operator!=(const base_iterator< ITR, FR > &r) const
exint sortedRemoveDuplicatesIf(CompareEqual compare_equal)
exint entries() const
Alias of size(). size() is preferred.
T selectNthLargest(exint idx, ComparatorBool is_less={})
base_iterator & operator+=(exint n)
void stdsort(ComparatorBool is_less)
Sort using std::sort. The ComparatorBool uses the less-than semantics.
#define SYS_DECLARE_IS_NOT_TR_TEMPLATE(...)
Version for class template.
static constexpr struct UT_ArrayCT::ExternalMove EXTERNAL_MOVE
GLenum GLsizei GLsizei GLint * values
bool isEqual(const UT_Array< T > &a, ComparatorBool is_equal) const
base_iterator operator--(int)
Post-decrement operator.
static void clear(UT_Array< T > &v)
int(* Comparator)(const T *, const T *)
UT_EXTERN_TEMPLATE(UT_Array< UT_StringHolder >)
base_iterator< const T, true > const_iterator
void truncate(exint maxsize)
Decreases, but never expands, to the given maxsize.
void constant(const T &v)
Quickly set the array to a single value.
void stableSortRange(exint start, exint end, ComparatorBool is_less={})
Like stableSort, but operates on a subset of the array.
void removeItem(const reverse_iterator &it)
Remove item specified by the reverse_iterator.
void stableSortByKey(const UT_Array< K > &keys, ComparatorBool is_less={})
void sortedIntersection(const UT_Array< T > &other, ComparatorBool is_less={})
void UTconvertArray(UT_Array< T > &dest, const UT_Array< S > &src)
Comparator class for stableSortIndices.
ImageBuf OIIO_API add(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
UT_Array(const UT_Array< T > &a)
void clear()
Resets list to an empty list.
UT_IteratorRange< iterator > range()
UT_IteratorRange< const_iterator > range() const
that also have some descendant prim *whose name begins with which in turn has a child named baz where *the predicate and *a name There is also one special expression reference
GA_API const UT_StringHolder rest
T heapPop(Comparator compare)
std::random_access_iterator_tag iterator_category
exint heapPush(const T &t, Comparator compare)
void reverse()
Reverses the array by swapping elements in mirrored locations.
exint multipleInsert(exint index, exint count)
Insert an element "count" times at the given index. Return the index.
void removeRange(exint begin_i, exint end_i)
base_iterator operator++(int)
Post-increment operator.
void swap(UT_Array< T > &other)
exint insert(exint index)
void stableSortIndices(UT_Array< I > &indices, ComparatorBool is_less={}) const
bool hasSortedSubset(const UT_Array< T > &other, ComparatorBool is_less={}) const
iterator end()
End iterator.
UT_IteratorRange< const_reverse_iterator > rrange() const
bool isEmpty() const
Returns true iff there are no occupied elements in the array.
exint sortedFind(const T &t, Comparator compare) const