1
0
mirror of https://github.com/ocornut/imgui.git synced 2024-12-19 11:05:59 +01:00

ImStrv: standardized code doing format copy, optimized ImStrStr

This commit is contained in:
ocornut 2021-05-25 14:08:20 +02:00 committed by ocornut
parent 2e0aa8299d
commit a1874dc3ea
2 changed files with 57 additions and 33 deletions

View File

@ -2062,22 +2062,19 @@ const char* ImStristr(const char* haystack, const char* haystack_end, const char
return NULL; return NULL;
} }
// FIXME-IMSTR: probably unneeded.
const char* ImStrstr(ImStrv haystack, ImStrv needle) const char* ImStrstr(ImStrv haystack, ImStrv needle)
{ {
const char un0 = (char)*needle.Begin; const char un0 = (char)*needle.Begin;
while ((!haystack.End && *haystack.Begin) || (haystack.End && haystack.Begin < haystack.End)) const char* p = haystack.Begin;
const size_t needle_len_m1 = needle.length() - 1;
while (true)
{ {
if (*haystack.Begin == un0) p = (const char*)memchr(p, un0, haystack.End - p);
{ if (p == NULL || (size_t)(haystack.End - p) - 1u < needle_len_m1)
const char* b = needle.Begin + 1; return NULL;
for (const char* a = haystack.Begin + 1; b < needle.End; a++, b++) if (needle_len_m1 == 0 || memcmp(p + 1, needle.Begin + 1, needle_len_m1) == 0)
if (*a != *b) return p;
break; p += 1;
if (b == needle.End)
return haystack.Begin;
}
haystack.Begin++;
} }
return NULL; return NULL;
} }

View File

@ -2603,14 +2603,20 @@ bool ImGui::DragScalar(ImStrv label, ImGuiDataType data_type, void* p_data, floa
return false; return false;
// FIXME-IMSTR // FIXME-IMSTR
char format_0[64]; // format may not end with \0 const char* format;
const char* format = format_0; char format_buf[64];
IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_0));
ImStrncpy(format_0, format_p, IM_ARRAYSIZE(format_0));
// Default format string when passing NULL
if (!format_p) if (!format_p)
{
// Default format string when passing NULL
format = DataTypeGetInfo(data_type)->PrintFmt; format = DataTypeGetInfo(data_type)->PrintFmt;
}
else
{
// Copy format string (format may not be zero-terminated)
format = format_buf;
IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_buf));
ImStrncpy(format_buf, format_p, IM_ARRAYSIZE(format_buf));
}
const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags); const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags);
bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);
@ -3211,13 +3217,20 @@ bool ImGui::SliderScalar(ImStrv label, ImGuiDataType data_type, void* p_data, co
return false; return false;
// FIXME-IMSTR // FIXME-IMSTR
char format_0[64]; // format may not end with \0 const char* format;
const char* format = format_0; char format_buf[64];
IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_0));
// Default format string when passing NULL
if (!format_p) if (!format_p)
{
// Default format string when passing NULL
format = DataTypeGetInfo(data_type)->PrintFmt; format = DataTypeGetInfo(data_type)->PrintFmt;
}
else
{
// Copy format string (format may not be zero-terminated)
format = format_buf;
IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_buf));
ImStrncpy(format_buf, format_p, IM_ARRAYSIZE(format_buf));
}
const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags); const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags);
bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id);
@ -3383,13 +3396,20 @@ bool ImGui::VSliderScalar(ImStrv label, const ImVec2& size, ImGuiDataType data_t
return false; return false;
// FIXME-IMSTR // FIXME-IMSTR
char format_0[64]; // format may not end with \0 const char* format;
const char* format = format_0; char format_buf[64];
IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_0));
// Default format string when passing NULL
if (!format_p) if (!format_p)
{
// Default format string when passing NULL
format = DataTypeGetInfo(data_type)->PrintFmt; format = DataTypeGetInfo(data_type)->PrintFmt;
}
else
{
// Copy format string (format may not be zero-terminated)
format = format_buf;
IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_buf));
ImStrncpy(format_buf, format_p, IM_ARRAYSIZE(format_buf));
}
const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags); const bool hovered = ItemHoverable(frame_bb, id, g.LastItemData.ItemFlags);
const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id); const bool clicked = hovered && IsMouseClicked(0, ImGuiInputFlags_None, id);
@ -3675,13 +3695,20 @@ bool ImGui::InputScalar(ImStrv label, ImGuiDataType data_type, void* p_data, con
IM_ASSERT((flags & ImGuiInputTextFlags_EnterReturnsTrue) == 0); // Not supported by InputScalar(). Please open an issue if you this would be useful to you. Otherwise use IsItemDeactivatedAfterEdit()! IM_ASSERT((flags & ImGuiInputTextFlags_EnterReturnsTrue) == 0); // Not supported by InputScalar(). Please open an issue if you this would be useful to you. Otherwise use IsItemDeactivatedAfterEdit()!
// FIXME-IMSTR // FIXME-IMSTR
char format_0[64]; // format may not end with \0 const char* format;
const char* format = format_0; char format_buf[64];
IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_0));
ImStrncpy(format_0, format_p, IM_ARRAYSIZE(format_0));
if (!format_p) if (!format_p)
{
// Default format string when passing NULL
format = DataTypeGetInfo(data_type)->PrintFmt; format = DataTypeGetInfo(data_type)->PrintFmt;
}
else
{
// Copy format string (format may not be zero-terminated)
format = format_buf;
IM_ASSERT(format_p.End - format_p.Begin < IM_ARRAYSIZE(format_buf));
ImStrncpy(format_buf, format_p, IM_ARRAYSIZE(format_buf));
}
void* p_data_default = (g.NextItemData.HasFlags & ImGuiNextItemDataFlags_HasRefVal) ? &g.NextItemData.RefVal : &g.DataTypeZeroValue; void* p_data_default = (g.NextItemData.HasFlags & ImGuiNextItemDataFlags_HasRefVal) ? &g.NextItemData.RefVal : &g.DataTypeZeroValue;