@ -1923,15 +1923,15 @@ ImU32 ImGui::GetColorU32(ImU32 col)
//-----------------------------------------------------------------------------
// std::lower_bound but without the bullshit
static ImGuiStorage : : Pair* LowerBound ( ImVector < ImGuiStorage : : Pair> & data , ImGuiID key )
static ImGuiStorage : : ImGuiStorage Pair* LowerBound ( ImVector < ImGuiStorage : : ImGuiStorage Pair> & data , ImGuiID key )
{
ImGuiStorage : : Pair* first = data . Data ;
ImGuiStorage : : Pair* last = data . Data + data . Size ;
ImGuiStorage : : ImGuiStorage Pair* first = data . Data ;
ImGuiStorage : : ImGuiStorage Pair* last = data . Data + data . Size ;
size_t count = ( size_t ) ( last - first ) ;
while ( count > 0 )
{
size_t count2 = count > > 1 ;
ImGuiStorage : : Pair* mid = first + count2 ;
ImGuiStorage : : ImGuiStorage Pair* mid = first + count2 ;
if ( mid - > key < key )
{
first = + + mid ;
@ -1953,18 +1953,18 @@ void ImGuiStorage::BuildSortByKey()
static int IMGUI_CDECL PairCompareByID ( const void * lhs , const void * rhs )
{
// We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that.
if ( ( ( const Pair* ) lhs ) - > key > ( ( const Pair* ) rhs ) - > key ) return + 1 ;
if ( ( ( const Pair* ) lhs ) - > key < ( ( const Pair* ) rhs ) - > key ) return - 1 ;
if ( ( ( const ImGuiStorage Pair* ) lhs ) - > key > ( ( const ImGuiStorage Pair* ) rhs ) - > key ) return + 1 ;
if ( ( ( const ImGuiStorage Pair* ) lhs ) - > key < ( ( const ImGuiStorage Pair* ) rhs ) - > key ) return - 1 ;
return 0 ;
}
} ;
if ( Data . Size > 1 )
ImQsort ( Data . Data , ( size_t ) Data . Size , sizeof ( Pair) , StaticFunc : : PairCompareByID ) ;
ImQsort ( Data . Data , ( size_t ) Data . Size , sizeof ( ImGuiStorage Pair) , StaticFunc : : PairCompareByID ) ;
}
int ImGuiStorage : : GetInt ( ImGuiID key , int default_val ) const
{
ImGuiStorage : : Pair* it = LowerBound ( const_cast < ImVector < ImGuiStorage : : Pair> & > ( Data ) , key ) ;
ImGuiStorage Pair* it = LowerBound ( const_cast < ImVector < ImGuiStorage Pair> & > ( Data ) , key ) ;
if ( it = = Data . end ( ) | | it - > key ! = key )
return default_val ;
return it - > val_i ;
@ -1977,7 +1977,7 @@ bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const
float ImGuiStorage : : GetFloat ( ImGuiID key , float default_val ) const
{
ImGuiStorage : : Pair* it = LowerBound ( const_cast < ImVector < ImGuiStorage : : Pair> & > ( Data ) , key ) ;
ImGuiStorage Pair* it = LowerBound ( const_cast < ImVector < ImGuiStorage Pair> & > ( Data ) , key ) ;
if ( it = = Data . end ( ) | | it - > key ! = key )
return default_val ;
return it - > val_f ;
@ -1985,7 +1985,7 @@ float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const
void * ImGuiStorage : : GetVoidPtr ( ImGuiID key ) const
{
ImGuiStorage : : Pair* it = LowerBound ( const_cast < ImVector < ImGuiStorage : : Pair> & > ( Data ) , key ) ;
ImGuiStorage Pair* it = LowerBound ( const_cast < ImVector < ImGuiStorage Pair> & > ( Data ) , key ) ;
if ( it = = Data . end ( ) | | it - > key ! = key )
return NULL ;
return it - > val_p ;
@ -1994,9 +1994,9 @@ void* ImGuiStorage::GetVoidPtr(ImGuiID key) const
// References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.
int * ImGuiStorage : : GetIntRef ( ImGuiID key , int default_val )
{
ImGuiStorage : : Pair* it = LowerBound ( Data , key ) ;
ImGuiStorage Pair* it = LowerBound ( Data , key ) ;
if ( it = = Data . end ( ) | | it - > key ! = key )
it = Data . insert ( it , Pair( key , default_val ) ) ;
it = Data . insert ( it , ImGuiStorage Pair( key , default_val ) ) ;
return & it - > val_i ;
}
@ -2007,27 +2007,27 @@ bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val)
float * ImGuiStorage : : GetFloatRef ( ImGuiID key , float default_val )
{
ImGuiStorage : : Pair* it = LowerBound ( Data , key ) ;
ImGuiStorage Pair* it = LowerBound ( Data , key ) ;
if ( it = = Data . end ( ) | | it - > key ! = key )
it = Data . insert ( it , Pair( key , default_val ) ) ;
it = Data . insert ( it , ImGuiStorage Pair( key , default_val ) ) ;
return & it - > val_f ;
}
void * * ImGuiStorage : : GetVoidPtrRef ( ImGuiID key , void * default_val )
{
ImGuiStorage : : Pair* it = LowerBound ( Data , key ) ;
ImGuiStorage Pair* it = LowerBound ( Data , key ) ;
if ( it = = Data . end ( ) | | it - > key ! = key )
it = Data . insert ( it , Pair( key , default_val ) ) ;
it = Data . insert ( it , ImGuiStorage Pair( key , default_val ) ) ;
return & it - > val_p ;
}
// FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame)
void ImGuiStorage : : SetInt ( ImGuiID key , int val )
{
ImGuiStorage : : Pair* it = LowerBound ( Data , key ) ;
ImGuiStorage Pair* it = LowerBound ( Data , key ) ;
if ( it = = Data . end ( ) | | it - > key ! = key )
{
Data . insert ( it , Pair( key , val ) ) ;
Data . insert ( it , ImGuiStorage Pair( key , val ) ) ;
return ;
}
it - > val_i = val ;
@ -2040,10 +2040,10 @@ void ImGuiStorage::SetBool(ImGuiID key, bool val)
void ImGuiStorage : : SetFloat ( ImGuiID key , float val )
{
ImGuiStorage : : Pair* it = LowerBound ( Data , key ) ;
ImGuiStorage Pair* it = LowerBound ( Data , key ) ;
if ( it = = Data . end ( ) | | it - > key ! = key )
{
Data . insert ( it , Pair( key , val ) ) ;
Data . insert ( it , ImGuiStorage Pair( key , val ) ) ;
return ;
}
it - > val_f = val ;
@ -2051,10 +2051,10 @@ void ImGuiStorage::SetFloat(ImGuiID key, float val)
void ImGuiStorage : : SetVoidPtr ( ImGuiID key , void * val )
{
ImGuiStorage : : Pair* it = LowerBound ( Data , key ) ;
ImGuiStorage Pair* it = LowerBound ( Data , key ) ;
if ( it = = Data . end ( ) | | it - > key ! = key )
{
Data . insert ( it , Pair( key , val ) ) ;
Data . insert ( it , ImGuiStorage Pair( key , val ) ) ;
return ;
}
it - > val_p = val ;
@ -2095,7 +2095,7 @@ bool ImGuiTextFilter::Draw(const char* label, float width)
return value_changed ;
}
void ImGuiTextFilter : : TextRange: : split ( char separator , ImVector < TextRange> * out ) const
void ImGuiTextFilter : : ImGui TextRange: : split ( char separator , ImVector < ImGui TextRange> * out ) const
{
out - > resize ( 0 ) ;
const char * wb = b ;
@ -2104,25 +2104,25 @@ void ImGuiTextFilter::TextRange::split(char separator, ImVector<TextRange>* out)
{
if ( * we = = separator )
{
out - > push_back ( TextRange( wb , we ) ) ;
out - > push_back ( ImGui TextRange( wb , we ) ) ;
wb = we + 1 ;
}
we + + ;
}
if ( wb ! = we )
out - > push_back ( TextRange( wb , we ) ) ;
out - > push_back ( ImGui TextRange( wb , we ) ) ;
}
void ImGuiTextFilter : : Build ( )
{
Filters . resize ( 0 ) ;
TextRange input_range ( InputBuf , InputBuf + strlen ( InputBuf ) ) ;
ImGui TextRange input_range ( InputBuf , InputBuf + strlen ( InputBuf ) ) ;
input_range . split ( ' , ' , & Filters ) ;
CountGrep = 0 ;
for ( int i = 0 ; i ! = Filters . Size ; i + + )
{
TextRange& f = Filters [ i ] ;
ImGui TextRange& f = Filters [ i ] ;
while ( f . b < f . e & & ImCharIsBlankA ( f . b [ 0 ] ) )
f . b + + ;
while ( f . e > f . b & & ImCharIsBlankA ( f . e [ - 1 ] ) )
@ -2144,19 +2144,19 @@ bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const
for ( int i = 0 ; i ! = Filters . Size ; i + + )
{
const TextRange& f = Filters [ i ] ;
const ImGui TextRange& f = Filters [ i ] ;
if ( f . empty ( ) )
continue ;
if ( f . b [ 0 ] = = ' - ' )
{
// Subtract
if ( ImStristr ( text , text_end , f . b egin( ) + 1 , f . e nd( ) ) ! = NULL )
if ( ImStristr ( text , text_end , f . b + 1 , f . e ) ! = NULL )
return false ;
}
else
{
// Grep
if ( ImStristr ( text , text_end , f . b egin( ) , f . e nd( ) ) ! = NULL )
if ( ImStristr ( text , text_end , f . b , f . e ) ! = NULL )
return true ;
}
}
@ -10102,7 +10102,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
NodeColumns ( & window - > ColumnsStorage [ n ] ) ;
ImGui : : TreePop ( ) ;
}
ImGui : : BulletText ( " Storage: %d bytes " , window - > StateStorage . Data . Size * ( int ) sizeof ( ImGuiStorage : : Pair ) ) ;
ImGui : : BulletText ( " Storage: %d bytes " , window - > StateStorage . Data . size_in_bytes( ) ) ;
ImGui : : TreePop ( ) ;
}