Internals: added ImSpan helper structure + 2020/10/01 stricter bound checking
This commit is contained in:
parent
054c67079a
commit
182115409a
@ -249,6 +249,7 @@ namespace ImStb
|
|||||||
// - Helper: ImRect
|
// - Helper: ImRect
|
||||||
// - Helper: ImBitArray
|
// - Helper: ImBitArray
|
||||||
// - Helper: ImBitVector
|
// - Helper: ImBitVector
|
||||||
|
// - Helper: ImSpan<>
|
||||||
// - Helper: ImPool<>
|
// - Helper: ImPool<>
|
||||||
// - Helper: ImChunkStream<>
|
// - Helper: ImChunkStream<>
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -502,6 +503,34 @@ struct IMGUI_API ImBitVector
|
|||||||
void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); }
|
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<>
|
// 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.
|
||||||
|
@ -13,6 +13,16 @@
|
|||||||
</ArrayItems>
|
</ArrayItems>
|
||||||
</Expand>
|
</Expand>
|
||||||
</Type>
|
</Type>
|
||||||
|
|
||||||
|
<Type Name="ImSpan<*>">
|
||||||
|
<DisplayString>{{Size={DataEnd-Data} }}</DisplayString>
|
||||||
|
<Expand>
|
||||||
|
<ArrayItems>
|
||||||
|
<Size>DataEnd-Data</Size>
|
||||||
|
<ValuePointer>Data</ValuePointer>
|
||||||
|
</ArrayItems>
|
||||||
|
</Expand>
|
||||||
|
</Type>
|
||||||
|
|
||||||
<Type Name="ImVec2">
|
<Type Name="ImVec2">
|
||||||
<DisplayString>{{x={x,g} y={y,g}}}</DisplayString>
|
<DisplayString>{{x={x,g} y={y,g}}}</DisplayString>
|
||||||
|
Loading…
Reference in New Issue
Block a user