// ======================================================================== // // Copyright 2009-2017 Intel Corporation // // // // Licensed under the Apache License, Version 2.0 (the "License"); // // you may not use this file except in compliance with the License. // // You may obtain a copy of the License at // // // // http://www.apache.org/licenses/LICENSE-2.0 // // // // Unless required by applicable law or agreed to in writing, software // // distributed under the License is distributed on an "AS IS" BASIS, // // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // // See the License for the specific language governing permissions and // // limitations under the License. // // ======================================================================== // #pragma once #include "platform.h" #include "alloc.h" namespace embree { /*! static array with static size */ template class array_t { public: /********************** Iterators ****************************/ __forceinline T* begin() const { return items; }; __forceinline T* end () const { return items+N; }; /********************** Capacity ****************************/ __forceinline bool empty () const { return N == 0; } __forceinline size_t size () const { return N; } __forceinline size_t max_size () const { return N; } /******************** Element access **************************/ __forceinline T& operator[](size_t i) { assert(i < N); return items[i]; } __forceinline const T& operator[](size_t i) const { assert(i < N); return items[i]; } __forceinline T& at(size_t i) { assert(i < N); return items[i]; } __forceinline const T& at(size_t i) const { assert(i < N); return items[i]; } __forceinline T& front() const { assert(N > 0); return items[0]; }; __forceinline T& back () const { assert(N > 0); return items[N-1]; }; __forceinline T* data() { return items; }; __forceinline const T* data() const { return items; }; private: T items[N]; }; /*! static array with dyamic size */ template class darray_t { public: __forceinline darray_t () : M(0) {} __forceinline darray_t (const T& v) : M(0) { for (size_t i=0; i 0); return items[0]; }; __forceinline T& back () const { assert(M > 0); return items[M-1]; }; __forceinline T* data() { return items; }; __forceinline const T* data() const { return items; }; private: size_t M; T items[N]; }; /*! dynamic sized array that is allocated on the stack */ #define dynamic_large_stack_array(Ty,Name,N,max_stack_bytes) StackArray Name(N) template struct __aligned(64) StackArray { __forceinline StackArray (const size_t N) { if (N*sizeof(Ty) <= max_stack_bytes) data = &arr[0]; else data = (Ty*) alignedMalloc(N*sizeof(Ty),64); } __forceinline ~StackArray () { if (data != &arr[0]) alignedFree(data); } __forceinline operator Ty* () { return data; } __forceinline operator const Ty* () const { return data; } __forceinline Ty& operator[](const int i) { return data[i]; } __forceinline const Ty& operator[](const int i) const { return data[i]; } __forceinline Ty& operator[](const unsigned i) { return data[i]; } __forceinline const Ty& operator[](const unsigned i) const { return data[i]; } #if defined(__X86_64__) __forceinline Ty& operator[](const size_t i) { return data[i]; } __forceinline const Ty& operator[](const size_t i) const { return data[i]; } #endif private: Ty arr[max_stack_bytes/sizeof(Ty)]; Ty* data; }; }