mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Internals: added ImSpan helper structure + 2020/10/01 stricter bound checking
This commit is contained in:
		| @@ -249,6 +249,7 @@ namespace ImStb | ||||
| // - Helper: ImRect | ||||
| // - Helper: ImBitArray | ||||
| // - Helper: ImBitVector | ||||
| // - Helper: ImSpan<> | ||||
| // - Helper: ImPool<> | ||||
| // - Helper: ImChunkStream<> | ||||
| //----------------------------------------------------------------------------- | ||||
| @@ -502,6 +503,34 @@ struct IMGUI_API ImBitVector | ||||
|     void            ClearBit(int n)             { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); } | ||||
| }; | ||||
|  | ||||
| // Helper: ImSpan<> | ||||
| // Pointing to a span of data we don't own. | ||||
| template<typename T> | ||||
| struct ImSpan | ||||
| { | ||||
|     T*                  Data; | ||||
|     T*                  DataEnd; | ||||
|  | ||||
|     // Constructors, destructor | ||||
|     inline ImSpan()                                 { Data = DataEnd = NULL; } | ||||
|     inline ImSpan(T* data, int size)                { Data = data; DataEnd = data + size; } | ||||
|     inline ImSpan(T* data, T* data_end)             { Data = data; DataEnd = data_end; } | ||||
|  | ||||
|     inline void         set(T* data, int size)      { Data = data; DataEnd = data + size; } | ||||
|     inline void         set(T* data, T* data_end)   { Data = data; DataEnd = data_end; } | ||||
|     inline int          size() const                { return (int)(ptrdiff_t)(DataEnd - Data); } | ||||
|     inline T&           operator[](int i)           { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } | ||||
|     inline const T&     operator[](int i) const     { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } | ||||
|  | ||||
|     inline T*           begin()                     { return Data; } | ||||
|     inline const T*     begin() const               { return Data; } | ||||
|     inline T*           end()                       { return DataEnd; } | ||||
|     inline const T*     end() const                 { return DataEnd; } | ||||
|  | ||||
|     // Utilities | ||||
|     inline int  index_from_ptr(const T* it) const   { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; } | ||||
| }; | ||||
|  | ||||
| // Helper: ImPool<> | ||||
| // Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer, | ||||
| // Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user