Path: blob/master/thirdparty/embree/common/sys/array.h
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "platform.h"6#include "alloc.h"78namespace embree9{10/*! static array with static size */11template<typename T, size_t N>12class array_t13{14public:1516/********************** Iterators ****************************/1718__forceinline T* begin() const { return items; };19__forceinline T* end () const { return items+N; };202122/********************** Capacity ****************************/2324__forceinline bool empty () const { return N == 0; }25__forceinline size_t size () const { return N; }26__forceinline size_t max_size () const { return N; }272829/******************** Element access **************************/3031__forceinline T& operator[](size_t i) { assert(i < N); return items[i]; }32__forceinline const T& operator[](size_t i) const { assert(i < N); return items[i]; }3334__forceinline T& at(size_t i) { assert(i < N); return items[i]; }35__forceinline const T& at(size_t i) const { assert(i < N); return items[i]; }3637__forceinline T& front() const { assert(N > 0); return items[0]; };38__forceinline T& back () const { assert(N > 0); return items[N-1]; };3940__forceinline T* data() { return items; };41__forceinline const T* data() const { return items; };4243private:44T items[N];45};4647/*! static array with dynamic size */48template<typename T, size_t N>49class darray_t50{51public:5253__forceinline darray_t () : M(0) {}5455__forceinline darray_t (const T& v) : M(0) {56for (size_t i=0; i<N; i++) items[i] = v;57}5859/********************** Iterators ****************************/6061__forceinline T* begin() const { return (T*)items; };62__forceinline T* end () const { return (T*)items+M; };636465/********************** Capacity ****************************/6667__forceinline bool empty () const { return M == 0; }68__forceinline size_t size () const { return M; }69__forceinline size_t capacity () const { return N; }70__forceinline size_t max_size () const { return N; }7172void resize(size_t new_size) {73assert(new_size < max_size());74M = new_size;75}7677/******************** Modifiers **************************/7879__forceinline void push_back(const T& v)80{81assert(M+1 < max_size());82items[M++] = v;83}8485__forceinline void pop_back()86{87assert(!empty());88M--;89}9091__forceinline void clear() {92M = 0;93}9495/******************** Element access **************************/9697__forceinline T& operator[](size_t i) { assert(i < M); return items[i]; }98__forceinline const T& operator[](size_t i) const { assert(i < M); return items[i]; }99100__forceinline T& at(size_t i) { assert(i < M); return items[i]; }101__forceinline const T& at(size_t i) const { assert(i < M); return items[i]; }102103__forceinline T& front() { assert(M > 0); return items[0]; };104__forceinline T& back () { assert(M > 0); return items[M-1]; };105106__forceinline T* data() { return items; };107__forceinline const T* data() const { return items; };108109private:110size_t M;111T items[N];112};113114/*! dynamic sized array that is allocated on the stack */115#define dynamic_large_stack_array(Ty,Name,N,max_stack_bytes) StackArray<Ty,max_stack_bytes> Name(N)116template<typename Ty, size_t max_stack_bytes>117struct __aligned(64) StackArray118{119__forceinline StackArray (const size_t N)120: N(N)121{122if (N*sizeof(Ty) <= max_stack_bytes)123data = &arr[0];124else125data = (Ty*) alignedMalloc(N*sizeof(Ty),64);126}127128__forceinline ~StackArray () {129if (data != &arr[0]) alignedFree(data);130}131132__forceinline operator Ty* () { return data; }133__forceinline operator const Ty* () const { return data; }134135__forceinline Ty& operator[](const int i) { assert(i>=0 && i<N); return data[i]; }136__forceinline const Ty& operator[](const int i) const { assert(i>=0 && i<N); return data[i]; }137138__forceinline Ty& operator[](const unsigned i) { assert(i<N); return data[i]; }139__forceinline const Ty& operator[](const unsigned i) const { assert(i<N); return data[i]; }140141#if defined(__64BIT__) || defined(__EMSCRIPTEN__)142__forceinline Ty& operator[](const size_t i) { assert(i<N); return data[i]; }143__forceinline const Ty& operator[](const size_t i) const { assert(i<N); return data[i]; }144#endif145146private:147Ty arr[max_stack_bytes/sizeof(Ty)];148Ty* data;149size_t N;150151private:152StackArray (const StackArray& other) DELETED; // do not implement153StackArray& operator= (const StackArray& other) DELETED; // do not implement154155};156157/*! dynamic sized array that is allocated on the stack */158template<typename Ty, size_t max_stack_elements, size_t max_total_elements>159struct __aligned(64) DynamicStackArray160{161__forceinline DynamicStackArray ()162: data(&arr[0]) {}163164__forceinline ~DynamicStackArray ()165{166if (!isStackAllocated())167delete[] data;168}169170__forceinline bool isStackAllocated() const {171return data == &arr[0];172}173174__forceinline size_t size() const175{176if (isStackAllocated()) return max_stack_elements;177else return max_total_elements;178}179180__forceinline void resize(size_t M)181{182assert(M <= max_total_elements);183if (likely(M <= max_stack_elements)) return;184if (likely(!isStackAllocated())) return;185186data = new Ty[max_total_elements];187188for (size_t i=0; i<max_stack_elements; i++)189data[i] = arr[i];190}191192__forceinline operator Ty* () { return data; }193__forceinline operator const Ty* () const { return data; }194195__forceinline Ty& operator[](const int i) { assert(i>=0 && i<max_total_elements); resize(i+1); return data[i]; }196__forceinline Ty& operator[](const unsigned i) { assert(i<max_total_elements); resize(i+1); return data[i]; }197198#if defined(__64BIT__) || defined(__EMSCRIPTEN__)199__forceinline Ty& operator[](const size_t i) { assert(i<max_total_elements); resize(i+1); return data[i]; }200#endif201202__forceinline DynamicStackArray (const DynamicStackArray& other)203: data(&arr[0])204{205for (size_t i=0; i<other.size(); i++)206this->operator[] (i) = other[i];207}208209DynamicStackArray& operator= (const DynamicStackArray& other)210{211for (size_t i=0; i<other.size(); i++)212this->operator[] (i) = other[i];213214return *this;215}216217private:218Ty arr[max_stack_elements];219Ty* data;220};221}222223224