mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Internals: added ImSpanAllocator<> helper.
This commit is contained in:
		| @@ -249,7 +249,7 @@ namespace ImStb | ||||
| // - Helper: ImRect | ||||
| // - Helper: ImBitArray | ||||
| // - Helper: ImBitVector | ||||
| // - Helper: ImSpan<> | ||||
| // - Helper: ImSpan<>, ImSpanAllocator<> | ||||
| // - Helper: ImPool<> | ||||
| // - Helper: ImChunkStream<> | ||||
| //----------------------------------------------------------------------------- | ||||
| @@ -531,6 +531,26 @@ struct ImSpan | ||||
|     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: ImSpanAllocator<> | ||||
| // Facilitate storing multiple chunks into a single large block (the "arena") | ||||
| template<int CHUNKS> | ||||
| struct ImSpanAllocator | ||||
| { | ||||
|     char*   BasePtr; | ||||
|     int     TotalSize; | ||||
|     int     CurrSpan; | ||||
|     int     Offsets[CHUNKS]; | ||||
|  | ||||
|     ImSpanAllocator()                               { memset(this, 0, sizeof(*this)); } | ||||
|     inline void  ReserveBytes(int n, size_t sz)     { IM_ASSERT(n == CurrSpan && n < CHUNKS); Offsets[CurrSpan++] = TotalSize; TotalSize += (int)sz; } | ||||
|     inline int   GetArenaSizeInBytes()              { return TotalSize; } | ||||
|     inline void  SetArenaBasePtr(void* base_ptr)    { BasePtr = (char*)base_ptr; } | ||||
|     inline void* GetSpanPtrBegin(int n)             { IM_ASSERT(n >= 0 && n < CHUNKS && CurrSpan == CHUNKS); return (void*)(BasePtr + Offsets[n]); } | ||||
|     inline void* GetSpanPtrEnd(int n)               { IM_ASSERT(n >= 0 && n < CHUNKS && CurrSpan == CHUNKS); return (n + 1 < CHUNKS) ? BasePtr + Offsets[n + 1] : (void*)(BasePtr + TotalSize); } | ||||
|     template<typename T>  | ||||
|     inline void  GetSpan(int n, ImSpan<T>* span)    { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); } | ||||
| }; | ||||
|  | ||||
| // 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