@ -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
//-----------------------------------------------------------------------------