Misc micro-optimizations related to hot-path of dealing with a large clipped tree.
Halved times by two in MSVC Debug x64.
diff --git a/imgui.cpp b/imgui.cpp
index 8640eda..6b545d6 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -2583,12 +2583,11 @@
{
ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), PairComparerByID);
}
-IM_MSVC_RUNTIME_CHECKS_RESTORE
int ImGuiStorage::GetInt(ImGuiID key, int default_val) const
{
ImGuiStoragePair* it = ImLowerBound(const_cast<ImGuiStoragePair*>(Data.Data), const_cast<ImGuiStoragePair*>(Data.Data + Data.Size), key);
- if (it == Data.end() || it->key != key)
+ if (it == Data.Data + Data.Size || it->key != key)
return default_val;
return it->val_i;
}
@@ -2601,7 +2600,7 @@
float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const
{
ImGuiStoragePair* it = ImLowerBound(const_cast<ImGuiStoragePair*>(Data.Data), const_cast<ImGuiStoragePair*>(Data.Data + Data.Size), key);
- if (it == Data.end() || it->key != key)
+ if (it == Data.Data + Data.Size || it->key != key)
return default_val;
return it->val_f;
}
@@ -2609,7 +2608,7 @@
void* ImGuiStorage::GetVoidPtr(ImGuiID key) const
{
ImGuiStoragePair* it = ImLowerBound(const_cast<ImGuiStoragePair*>(Data.Data), const_cast<ImGuiStoragePair*>(Data.Data + Data.Size), key);
- if (it == Data.end() || it->key != key)
+ if (it == Data.Data + Data.Size || it->key != key)
return NULL;
return it->val_p;
}
@@ -2618,7 +2617,7 @@
int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val)
{
ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
- if (it == Data.end() || it->key != key)
+ if (it == Data.Data + Data.Size || it->key != key)
it = Data.insert(it, ImGuiStoragePair(key, default_val));
return &it->val_i;
}
@@ -2631,7 +2630,7 @@
float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val)
{
ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
- if (it == Data.end() || it->key != key)
+ if (it == Data.Data + Data.Size || it->key != key)
it = Data.insert(it, ImGuiStoragePair(key, default_val));
return &it->val_f;
}
@@ -2639,7 +2638,7 @@
void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val)
{
ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
- if (it == Data.end() || it->key != key)
+ if (it == Data.Data + Data.Size || it->key != key)
it = Data.insert(it, ImGuiStoragePair(key, default_val));
return &it->val_p;
}
@@ -2648,7 +2647,7 @@
void ImGuiStorage::SetInt(ImGuiID key, int val)
{
ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
- if (it == Data.end() || it->key != key)
+ if (it == Data.Data + Data.Size || it->key != key)
Data.insert(it, ImGuiStoragePair(key, val));
else
it->val_i = val;
@@ -2662,7 +2661,7 @@
void ImGuiStorage::SetFloat(ImGuiID key, float val)
{
ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
- if (it == Data.end() || it->key != key)
+ if (it == Data.Data + Data.Size || it->key != key)
Data.insert(it, ImGuiStoragePair(key, val));
else
it->val_f = val;
@@ -2671,7 +2670,7 @@
void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val)
{
ImGuiStoragePair* it = ImLowerBound(Data.Data, Data.Data + Data.Size, key);
- if (it == Data.end() || it->key != key)
+ if (it == Data.Data + Data.Size || it->key != key)
Data.insert(it, ImGuiStoragePair(key, val));
else
it->val_p = val;
@@ -2682,6 +2681,7 @@
for (int i = 0; i < Data.Size; i++)
Data[i].val_i = v;
}
+IM_MSVC_RUNTIME_CHECKS_RESTORE
//-----------------------------------------------------------------------------
// [SECTION] ImGuiTextFilter
@@ -2749,7 +2749,7 @@
bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const
{
- if (Filters.empty())
+ if (Filters.Size == 0)
return true;
if (text == NULL)
@@ -8241,6 +8241,7 @@
// This is one of the very rare legacy case where we use ImGuiWindow methods,
// it should ideally be flattened at some point but it's been used a lots by widgets.
+IM_MSVC_RUNTIME_CHECKS_OFF
ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
{
ImGuiID seed = IDStack.back();
@@ -8385,6 +8386,8 @@
ImGuiWindow* window = GImGui->CurrentWindow;
return window->GetID(int_id);
}
+IM_MSVC_RUNTIME_CHECKS_RESTORE
+
//-----------------------------------------------------------------------------
// [SECTION] INPUTS
//-----------------------------------------------------------------------------