@ -211,18 +211,32 @@ 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
// Creation/Erasure invalidate all pointers, but indexes are valid as long as the object lifetime.
template < typename T >
struct IMGUI_API ImPool
{
ImVector < T > Data ; // Contiguous data
ImGuiStorage Map ; // ID->Index
int 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 ( int n ) { return & Data [ n ] ; }
int GetIndex ( const T * p ) const { IM_ASSERT ( p > = Data . Data & & p < Data . Data + Data . Size ) ; return ( int ) ( 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 , int idx ) { Data [ idx ] . ~ T ( ) ; * ( int * ) & Data [ idx ] = FreeIdx ; FreeIdx = idx ; Map . SetInt ( key , - 1 ) ; }
} ;
typedef int ImPoolIdx ;
//-----------------------------------------------------------------------------
// Types
//-----------------------------------------------------------------------------
// 1D vector (this odd construct is used to facilitate the transition between 1D and 2D and maintenance of some patches)
struct ImVec1
{
float x ;
ImVec1 ( ) { x = 0.0f ; }
ImVec1 ( float _x ) { x = _x ; }
} ;
enum ImGuiButtonFlags_
{
ImGuiButtonFlags_None = 0 ,
@ -366,6 +380,14 @@ enum ImGuiPopupPositionPolicy
ImGuiPopupPositionPolicy_ComboBox
} ;
// 1D vector (this odd construct is used to facilitate the transition between 1D and 2D and maintenance of some patches)
struct ImVec1
{
float x ;
ImVec1 ( ) { x = 0.0f ; }
ImVec1 ( float _x ) { x = _x ; }
} ;
// 2D axis aligned bounding-box
// NB: we can't rely on ImVec2 math operators being available here
struct IMGUI_API ImRect
@ -632,7 +654,10 @@ struct ImGuiNextWindowData
}
} ;
//-----------------------------------------------------------------------------
// Main imgui context
//-----------------------------------------------------------------------------
struct ImGuiContext
{
bool Initialized ;