15 #ifndef __UT_PACKED_ARRAY_OF_ARRAYS_H__
16 #define __UT_PACKED_ARRAY_OF_ARRAYS_H__
36 { myOffsets.clear(); myData.clear(); }
38 {
return size() == 0; }
46 return (inclusive ?
sizeof(*
this) : 0) +
47 myOffsets.getMemoryUsage(
false) +
48 myData.getMemoryUsage(
false);
56 if (myOffsets.isEmpty())
58 myData.bumpCapacity(myData.size() + len);
59 for (
exint i = 0; i < len; i++)
60 myData.append(data[i]);
61 myOffsets.append(myData.entries());
69 myOffsets.bumpCapacity(myOffsets.size() + arr.
size());
70 myData.bumpCapacity(myData.size() + arr.myData.size());
81 *
this = std::move(arr);
87 myData.concat(std::move(arr.myData));
89 myOffsets.bumpCapacity(myOffsets.size() + arr.size());
90 for (
exint i = 0,
n = arr.size(); i <
n; ++i)
91 myOffsets.append(myOffsets.last() + arr.arrayLen(i));
93 arr.myOffsets.clear();
100 if (myOffsets.isEmpty())
102 exint base = myOffsets.last();
103 myOffsets.append(base+len);
104 myData.bumpSize(base+len);
105 return myData.array() + base;
134 template <
typename TLD =
void,
typename FUNC>
137 if (myOffsets.isEmpty())
139 exint base = myOffsets.last();
140 exint oldcount = myOffsets.size();
141 myOffsets.setSizeNoInit(oldcount + n);
146 if constexpr (!std::is_void_v<TLD>)
149 for (
exint i = r.begin(),
end = r.end(); i <
end; ++i)
150 myOffsets[oldcount + i] = countfunctor(i, tld);
154 for (
exint i = r.begin(),
end = r.end(); i <
end; ++i)
155 myOffsets[oldcount + i] = countfunctor(i);
161 tempoffsets, base, std::plus<exint>());
164 myData.setSizeNoInit(myOffsets.last());
165 return myData.array() + base;
172 exint base = myOffsets(idx);
174 return myData(base+idx_in_array);
181 exint base = myOffsets(idx);
182 exint len = myOffsets(idx+1)-base;
184 for (
exint i = 0; i < len; i++)
185 result(i) = myData(base+i);
194 return myData.array() + myOffsets(idx);
199 return myData.array() + myOffsets(idx);
203 return myOffsets(idx+1)-myOffsets(idx);
213 {
return UTmakeRange(arrayData(idx), arrayData(idx + 1)); }
215 {
return UTmakeRange(arrayData(idx), arrayData(idx + 1)); }
221 if (maxsize >= 0 &&
size() > maxsize)
227 myOffsets.setSize(maxsize+1);
228 myData.setSize(myOffsets(maxsize));
237 { myData.setCapacity(capacity); }
239 { myData.setCapacityIfNeeded(capacity); }
241 { myOffsets.setCapacity(capacity); }
243 { myOffsets.setCapacityIfNeeded(capacity); }
void setDataCapacity(exint capacity)
const T & operator()(exint idx, exint idx_in_array) const
From the given idxth array, return the idx_in_array element.
void truncate(exint maxsize)
Decreases, but never expands, to the given maxsize.
UT_Array< exint > & rawOffsets()
UT_IteratorRange< IterT > UTmakeRange(IterT &&b, IterT &&e)
const UT_Array< T > & rawData() const
void UTparallelForLightItems(const Range &range, const Body &body, const bool force_use_task_scope=true)
**But if you need a result
UT_IteratorRange< const T * > arrayRange(exint idx) const
void append(const UT_PackedArrayOfArrays< T > &arr, exint idx)
void append(const T *data, exint len)
void setArrayCapacity(exint capacity)
const UT_Array< exint > & rawOffsets() const
const T * arrayData(exint idx) const
void concat(const UT_PackedArrayOfArrays< T > &arr)
Appends an array of arrays to our list.
UT_Array< T > & rawData()
All of the array data is in one contiguous block.
void setArrayCapacityIfNeeded(exint capacity)
UT_Span< const T > span(exint idx) const
void concat(UT_PackedArrayOfArrays< T > &&arr)
Moves an array of arrays to our list.
void extract(UT_Array< T > &result, exint idx) const
Extracts an array into a UT_Array.
T * appendArray(exint len)
exint size() const
Returns the number of arrays in this structure.
exint entries() const
Alias of size(). size() is preferred.
void setDataCapacityIfNeeded(exint capacity)
int64 getMemoryUsage(bool inclusive=false) const
void append(const UT_Array< T > &arr)
Adds a new array to the end of our list of arrays.
exint arrayLen(exint idx) const
T * allocateArraysNoInit(exint n, FUNC &&countfunctor)
void UTparallelDeterministicPrefixSumInPlace(UT_Span< T > &array, const T identity, const Op &op, const int grain_size=1024, const bool force_use_task_scope=true)
UT_IteratorRange< T * > arrayRange(exint idx)