5 #include "RNBO_PlatformInterface.h"
8 #include "RNBO_UniquePtr.h"
11 #endif // RNBO_NOSTDLIB
15 static const size_t listChunkSize = 8;
57 T listValues[
sizeof...(args)] = {
static_cast<T
>(args)...};
58 for (
size_t i = 0; i <
length; i++) {
79 for (
size_t i = 0; i <
length; i++) {
92 l._allocatedLength = 0;
102 Platform::get()->free(
_values);
120 Platform::get()->errorOrDefault(RuntimeError::OutOfRange,
"list index out of range",
false );
121 _dummy =
static_cast<T
>(0);
138 return Platform::get()->errorOrDefault(RuntimeError::OutOfRange,
"list index out of range", 0);
147 const listbase* operator->()
const {
159 for (
size_t i = 0; i <
length; i++) {
178 allocate(
length + 1,
true);
212 return Platform::get()->errorOrDefault(RuntimeError::OutOfRange,
"cannot shift out of empty list", 0);
253 for (
size_t i = 0; i < item.
length; i++) {
272 if (end == 0) end =
length;
275 for (
size_t i = start; i < end; i++) {
288 template<
typename... Ts>
void unshift(Ts ... args) {
304 if (start < 0) start +=
length;
305 if (start < 0) start = 0;
306 size_t iStart = (size_t)start;
312 if (iStart + deleteCount >
length) deleteCount =
length - iStart;
314 const size_t addLength =
sizeof...(args);
315 const long diff = (long)(addLength - deleteCount);
318 deletedItems.allocate(deleteCount,
false);
319 for (
size_t i = 0; i < deleteCount; i++) {
323 long newLength = (long)(
length) + diff;
324 if (newLength <= 0) {
329 allocate(
static_cast<size_t>(newLength),
true);
332 for (
long i = (
long)start - diff; i < (long)
length; i++) {
335 }
else if (diff > 0) {
336 for (
long i = (
long)(
length - 1); i >= (long)start; i--) {
342 T addValues[(
sizeof...(args)) + 1] = {
static_cast<T
>(args)...};
343 for (
size_t i = 0; i < addLength; i++) {
344 _values[i + start] = addValues[i];
347 length =
static_cast<size_t>(newLength);
362 int ilen =
static_cast<int>(this->
length);
366 start = ilen + start;
378 if (start >= ilen || ilen == 0) {
386 tmp.allocate(
static_cast<size_t>(end - start),
false);
387 for (
int i = start; i < end; i++) {
404 fromIndex = int(
length) + fromIndex;
405 if (fromIndex < 0) fromIndex = 0;
408 for (
size_t i =
size_t(fromIndex); i <
length; i++) {
409 if (
_values[i] == value)
return true;
424 int indexOf(T value,
int fromIndex = 0)
const {
426 fromIndex = int(
length) + fromIndex;
427 if (fromIndex < 0) fromIndex = 0;
430 for (
size_t i =
size_t(fromIndex); i <
length; i++) {
431 if (
_values[i] == value)
return (
int)i;
443 size_t len2 =
length >> 1;
445 for (
size_t i = 0; i < len2; ++i) {
447 size_t target =
length - i - 1;
461 allocate(size,
true);
475 void allocate(
size_t size,
bool keepValues)
480 _allocatedLength = listChunkSize + (size_t(size/listChunkSize)) * listChunkSize;
484 Platform::get()->memcpy(
_values, old_values,
length *
sizeof(T));
488 Platform::get()->free(old_values);
536 operator number()
const {
return _val.
length > 0 ? _val[0] : 0; }
537 operator list()
const {
return _val; }
543 const list& operator->()
const {
554 using UniqueListPtr = std::unique_ptr<listbase<number>>;
555 #endif // RNBO_NOSTDLIB
559 #endif // #ifndef _RNBO_LIST_H_