mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Internals: added ImSpanAllocator<> helper.
This commit is contained in:
parent
182115409a
commit
6dff061309
@ -249,7 +249,7 @@ namespace ImStb
|
|||||||
// - Helper: ImRect
|
// - Helper: ImRect
|
||||||
// - Helper: ImBitArray
|
// - Helper: ImBitArray
|
||||||
// - Helper: ImBitVector
|
// - Helper: ImBitVector
|
||||||
// - Helper: ImSpan<>
|
// - Helper: ImSpan<>, ImSpanAllocator<>
|
||||||
// - Helper: ImPool<>
|
// - Helper: ImPool<>
|
||||||
// - Helper: ImChunkStream<>
|
// - 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; }
|
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<>
|
// 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,
|
// 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.
|
// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.
|
||||||
|
Loading…
Reference in New Issue
Block a user