mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Merge branch 'master' into viewport
# Conflicts: # examples/imgui_impl_sdl.cpp
This commit is contained in:
		| @@ -1,4 +1,4 @@ | ||||
| // dear imgui, v1.66 | ||||
| // dear imgui, v1.67 WIP | ||||
| // (internal structures/api) | ||||
|  | ||||
| // You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility! | ||||
| @@ -213,6 +213,30 @@ static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) | ||||
| static inline float  ImLinearSweep(float current, float target, float speed)    { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; } | ||||
| static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs)                { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } | ||||
|  | ||||
| // 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. | ||||
| typedef int ImPoolIdx; | ||||
| template<typename T> | ||||
| struct IMGUI_API ImPool | ||||
| { | ||||
|     ImVector<T>     Data;       // Contiguous data | ||||
|     ImGuiStorage    Map;        // ID->Index | ||||
|     ImPoolIdx       FreeIdx;    // Next free idx to use | ||||
|  | ||||
|     ImPool()    { FreeIdx = 0; } | ||||
|     ~ImPool()   { Clear(); } | ||||
|     T*          GetByKey(ImGuiID key)               { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Data[idx] : NULL; } | ||||
|     T*          GetByIndex(ImPoolIdx n)             { return &Data[n]; } | ||||
|     ImPoolIdx   GetIndex(const T* p) const          { IM_ASSERT(p >= Data.Data && p < Data.Data + Data.Size); return (ImPoolIdx)(p - Data.Data); } | ||||
|     T*          GetOrAddByKey(ImGuiID key)          { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Data[*p_idx]; *p_idx = FreeIdx; return Add(); } | ||||
|     void        Clear()                             { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Data[idx].~T(); }  Map.Clear(); Data.clear(); FreeIdx = 0; } | ||||
|     T*          Add()                               { int idx = FreeIdx; if (idx == Data.Size) { Data.resize(Data.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Data[idx]; } IM_PLACEMENT_NEW(&Data[idx]) T(); return &Data[idx]; } | ||||
|     void        Remove(ImGuiID key, const T* p)     { Remove(key, GetIndex(p)); } | ||||
|     void        Remove(ImGuiID key, ImPoolIdx idx)  { Data[idx].~T(); *(int*)&Data[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); } | ||||
|     void        Reserve(int capacity)               { Data.reserve(capacity); Map.Data.reserve(capacity); } | ||||
|     int         GetSize() const                     { return Data.Size; } | ||||
| }; | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // Types | ||||
| //----------------------------------------------------------------------------- | ||||
|   | ||||
		Reference in New Issue
	
	Block a user