array.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // ======================================================================== //
  2. // Copyright 2009-2017 Intel Corporation //
  3. // //
  4. // Licensed under the Apache License, Version 2.0 (the "License"); //
  5. // you may not use this file except in compliance with the License. //
  6. // You may obtain a copy of the License at //
  7. // //
  8. // http://www.apache.org/licenses/LICENSE-2.0 //
  9. // //
  10. // Unless required by applicable law or agreed to in writing, software //
  11. // distributed under the License is distributed on an "AS IS" BASIS, //
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
  13. // See the License for the specific language governing permissions and //
  14. // limitations under the License. //
  15. // ======================================================================== //
  16. #pragma once
  17. #include "platform.h"
  18. #include "alloc.h"
  19. namespace embree
  20. {
  21. /*! static array with static size */
  22. template<typename T, size_t N>
  23. class array_t
  24. {
  25. public:
  26. /********************** Iterators ****************************/
  27. __forceinline T* begin() const { return items; };
  28. __forceinline T* end () const { return items+N; };
  29. /********************** Capacity ****************************/
  30. __forceinline bool empty () const { return N == 0; }
  31. __forceinline size_t size () const { return N; }
  32. __forceinline size_t max_size () const { return N; }
  33. /******************** Element access **************************/
  34. __forceinline T& operator[](size_t i) { assert(i < N); return items[i]; }
  35. __forceinline const T& operator[](size_t i) const { assert(i < N); return items[i]; }
  36. __forceinline T& at(size_t i) { assert(i < N); return items[i]; }
  37. __forceinline const T& at(size_t i) const { assert(i < N); return items[i]; }
  38. __forceinline T& front() const { assert(N > 0); return items[0]; };
  39. __forceinline T& back () const { assert(N > 0); return items[N-1]; };
  40. __forceinline T* data() { return items; };
  41. __forceinline const T* data() const { return items; };
  42. private:
  43. T items[N];
  44. };
  45. /*! static array with dyamic size */
  46. template<typename T, size_t N>
  47. class darray_t
  48. {
  49. public:
  50. __forceinline darray_t () : M(0) {}
  51. __forceinline darray_t (const T& v) : M(0) {
  52. for (size_t i=0; i<N; i++) items[i] = v;
  53. }
  54. /********************** Iterators ****************************/
  55. __forceinline T* begin() const { return items; };
  56. __forceinline T* end () const { return items+M; };
  57. /********************** Capacity ****************************/
  58. __forceinline bool empty () const { return M == 0; }
  59. __forceinline size_t size () const { return M; }
  60. __forceinline size_t capacity () const { return N; }
  61. __forceinline size_t max_size () const { return N; }
  62. void resize(size_t new_size) {
  63. assert(new_size < max_size());
  64. M = new_size;
  65. }
  66. /******************** Modifiers **************************/
  67. __forceinline void push_back(const T& v)
  68. {
  69. assert(M+1 < max_size());
  70. items[M++] = v;
  71. }
  72. __forceinline void pop_back()
  73. {
  74. assert(!empty());
  75. M--;
  76. }
  77. __forceinline void clear() {
  78. M = 0;
  79. }
  80. /******************** Element access **************************/
  81. __forceinline T& operator[](size_t i) { assert(i < M); return items[i]; }
  82. __forceinline const T& operator[](size_t i) const { assert(i < M); return items[i]; }
  83. __forceinline T& at(size_t i) { assert(i < M); return items[i]; }
  84. __forceinline const T& at(size_t i) const { assert(i < M); return items[i]; }
  85. __forceinline T& front() const { assert(M > 0); return items[0]; };
  86. __forceinline T& back () const { assert(M > 0); return items[M-1]; };
  87. __forceinline T* data() { return items; };
  88. __forceinline const T* data() const { return items; };
  89. private:
  90. size_t M;
  91. T items[N];
  92. };
  93. /*! dynamic sized array that is allocated on the stack */
  94. #define dynamic_large_stack_array(Ty,Name,N,max_stack_bytes) StackArray<Ty,max_stack_bytes> Name(N)
  95. template<typename Ty, size_t max_stack_bytes>
  96. struct __aligned(64) StackArray
  97. {
  98. __forceinline StackArray (const size_t N)
  99. {
  100. if (N*sizeof(Ty) <= max_stack_bytes)
  101. data = &arr[0];
  102. else
  103. data = (Ty*) alignedMalloc(N*sizeof(Ty),64);
  104. }
  105. __forceinline ~StackArray () {
  106. if (data != &arr[0]) alignedFree(data);
  107. }
  108. __forceinline operator Ty* () { return data; }
  109. __forceinline operator const Ty* () const { return data; }
  110. __forceinline Ty& operator[](const int i) { return data[i]; }
  111. __forceinline const Ty& operator[](const int i) const { return data[i]; }
  112. __forceinline Ty& operator[](const unsigned i) { return data[i]; }
  113. __forceinline const Ty& operator[](const unsigned i) const { return data[i]; }
  114. #if defined(__X86_64__)
  115. __forceinline Ty& operator[](const size_t i) { return data[i]; }
  116. __forceinline const Ty& operator[](const size_t i) const { return data[i]; }
  117. #endif
  118. private:
  119. Ty arr[max_stack_bytes/sizeof(Ty)];
  120. Ty* data;
  121. };
  122. }