00001 // This code contains NVIDIA Confidential Information and is disclosed to you 00002 // under a form of NVIDIA software license agreement provided separately to you. 00003 // 00004 // Notice 00005 // NVIDIA Corporation and its licensors retain all intellectual property and 00006 // proprietary rights in and to this software and related documentation and 00007 // any modifications thereto. Any use, reproduction, disclosure, or 00008 // distribution of this software and related documentation without an express 00009 // license agreement from NVIDIA Corporation is strictly prohibited. 00010 // 00011 // ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES 00012 // NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO 00013 // THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, 00014 // MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. 00015 // 00016 // Information and code furnished is believed to be accurate and reliable. 00017 // However, NVIDIA Corporation assumes no responsibility for the consequences of use of such 00018 // information or for any infringement of patents or other rights of third parties that may 00019 // result from its use. No license is granted by implication or otherwise under any patent 00020 // or patent rights of NVIDIA Corporation. Details are subject to change without notice. 00021 // This code supersedes and replaces all information previously supplied. 00022 // NVIDIA Corporation products are not authorized for use as critical 00023 // components in life support devices or systems without express written approval of 00024 // NVIDIA Corporation. 00025 // 00026 // Copyright (c) 2016-2020 NVIDIA Corporation. All rights reserved. 00027 00028 00029 #ifndef NVBLASTFIXEDARRAY_H 00030 #define NVBLASTFIXEDARRAY_H 00031 00032 #include "NvBlastAssert.h" 00033 #include "NvBlastMemory.h" 00034 00035 namespace Nv 00036 { 00037 namespace Blast 00038 { 00039 00063 template <class T> 00064 class FixedArray 00065 { 00066 public: 00067 explicit FixedArray() : m_size(0) 00068 { 00069 } 00070 00071 static size_t requiredMemorySize(uint32_t capacity) 00072 { 00073 return align16(sizeof(FixedArray<T>)) + align16(capacity * sizeof(T)); 00074 } 00075 00076 NV_FORCE_INLINE T& pushBack(T& t) 00077 { 00078 new (data() + m_size) T(t); 00079 return data()[m_size++]; 00080 } 00081 00082 T popBack() 00083 { 00084 NVBLAST_ASSERT(m_size); 00085 T t = data()[m_size - 1]; 00086 data()[--m_size].~T(); 00087 return t; 00088 } 00089 00090 void clear() 00091 { 00092 for(T* first = data(); first < data() + m_size; ++first) 00093 first->~T(); 00094 m_size = 0; 00095 } 00096 00097 NV_FORCE_INLINE void forceSize_Unsafe(uint32_t s) 00098 { 00099 m_size = s; 00100 } 00101 00102 NV_FORCE_INLINE T& operator[](uint32_t idx) 00103 { 00104 NVBLAST_ASSERT(idx < m_size); 00105 return data()[idx]; 00106 } 00107 00108 NV_FORCE_INLINE const T& operator[](uint32_t idx) const 00109 { 00110 NVBLAST_ASSERT(idx < m_size); 00111 return data()[idx]; 00112 } 00113 00114 NV_FORCE_INLINE T& at(uint32_t idx) 00115 { 00116 NVBLAST_ASSERT(idx < m_size); 00117 return data()[idx]; 00118 } 00119 00120 NV_FORCE_INLINE const T& at(uint32_t idx) const 00121 { 00122 NVBLAST_ASSERT(idx < m_size); 00123 return data()[idx]; 00124 } 00125 00126 NV_FORCE_INLINE uint32_t size() const 00127 { 00128 return m_size; 00129 } 00130 00131 private: 00132 uint32_t m_size; 00133 00134 NV_FORCE_INLINE T* data() 00135 { 00136 return (T*)((char*)this + sizeof(FixedArray<T>)); 00137 } 00138 00139 private: 00140 FixedArray(const FixedArray& that); 00141 }; 00142 00143 } // namespace Blast 00144 } // namespace Nv 00145 00146 #endif // ifndef NVBLASTFIXEDARRAY_H