@ -73,73 +73,8 @@ struct ImVec4
# endif
} ;
namespace ImGui
{
// Proxy functions to access the MemAllocFn/MemFreeFn pointers in ImGui::GetIO(). The only reason they exist here is to allow ImVector<> to compile inline.
IMGUI_API void * MemAlloc ( size_t sz ) ;
IMGUI_API void MemFree ( void * ptr ) ;
}
// Lightweight std::vector<> like class to avoid dragging dependencies (also: windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).
// Use '#define ImVector std::vector' if you want to use the STL type or your own type.
// Our implementation does NOT call c++ constructors because we don't use them in ImGui. Don't use this class as a straight std::vector replacement in your code!
# ifndef ImVector
template < typename T >
class ImVector
{
protected :
size_t Size ;
size_t Capacity ;
T * Data ;
public :
typedef T value_type ;
typedef value_type * iterator ;
typedef const value_type * const_iterator ;
ImVector ( ) { Size = Capacity = 0 ; Data = NULL ; }
~ ImVector ( ) { if ( Data ) ImGui : : MemFree ( Data ) ; }
inline bool empty ( ) const { return Size = = 0 ; }
inline size_t size ( ) const { return Size ; }
inline size_t capacity ( ) const { return Capacity ; }
inline value_type & at ( size_t i ) { IM_ASSERT ( i < Size ) ; return Data [ i ] ; }
inline const value_type & at ( size_t i ) const { IM_ASSERT ( i < Size ) ; return Data [ i ] ; }
inline value_type & operator [ ] ( size_t i ) { IM_ASSERT ( i < Size ) ; return Data [ i ] ; }
inline const value_type & operator [ ] ( size_t i ) const { IM_ASSERT ( i < Size ) ; return Data [ i ] ; }
inline void clear ( ) { if ( Data ) { Size = Capacity = 0 ; ImGui : : MemFree ( Data ) ; Data = NULL ; } }
inline iterator begin ( ) { return Data ; }
inline const_iterator begin ( ) const { return Data ; }
inline iterator end ( ) { return Data + Size ; }
inline const_iterator end ( ) const { return Data + Size ; }
inline value_type & front ( ) { IM_ASSERT ( Size > 0 ) ; return Data [ 0 ] ; }
inline const value_type & front ( ) const { IM_ASSERT ( Size > 0 ) ; return Data [ 0 ] ; }
inline value_type & back ( ) { IM_ASSERT ( Size > 0 ) ; return Data [ Size - 1 ] ; }
inline const value_type & back ( ) const { IM_ASSERT ( Size > 0 ) ; return Data [ Size - 1 ] ; }
inline void swap ( ImVector < T > & rhs ) { const size_t rhs_size = rhs . Size ; rhs . Size = Size ; Size = rhs_size ; const size_t rhs_cap = rhs . Capacity ; rhs . Capacity = Capacity ; Capacity = rhs_cap ; value_type * rhs_data = rhs . Data ; rhs . Data = Data ; Data = rhs_data ; }
inline void resize ( size_t new_size ) { if ( new_size > Capacity ) reserve ( new_size ) ; Size = new_size ; }
inline void reserve ( size_t new_capacity )
{
if ( new_capacity < = Capacity ) return ;
T * new_data = ( value_type * ) ImGui : : MemAlloc ( new_capacity * sizeof ( value_type ) ) ;
memcpy ( new_data , Data , Size * sizeof ( value_type ) ) ;
ImGui : : MemFree ( Data ) ;
Data = new_data ;
Capacity = new_capacity ;
}
inline void push_back ( const value_type & v ) { if ( Size = = Capacity ) reserve ( Capacity ? Capacity * 2 : 4 ) ; Data [ Size + + ] = v ; }
inline void pop_back ( ) { IM_ASSERT ( Size > 0 ) ; Size - - ; }
inline iterator erase ( const_iterator it ) { IM_ASSERT ( it > = begin ( ) & & it < end ( ) ) ; const ptrdiff_t off = it - begin ( ) ; memmove ( Data + off , Data + off + 1 , ( Size - ( size_t ) off - 1 ) * sizeof ( value_type ) ) ; Size - - ; return Data + off ; }
inline iterator insert ( const_iterator it , const value_type & v ) { IM_ASSERT ( it > = begin ( ) & & it < = end ( ) ) ; const ptrdiff_t off = it - begin ( ) ; if ( Size = = Capacity ) reserve ( Capacity ? Capacity * 2 : 4 ) ; if ( off < ( int ) Size ) memmove ( Data + off + 1 , Data + off , ( Size - ( size_t ) off ) * sizeof ( value_type ) ) ; Data [ off ] = v ; Size + + ; return Data + off ; }
} ;
# endif // #ifndef ImVector
// Helpers at bottom of the file:
// - class ImVector<> // Lightweight std::vector like class. Use '#define ImVector std::vector' if you want to use the STL type or your own type.
// - IMGUI_ONCE_UPON_A_FRAME // Execute a block of code once per frame only (convenient for creating UI within deep-nested code that runs multiple times)
// - struct ImGuiTextFilter // Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]"
// - struct ImGuiTextBuffer // Text buffer for logging/accumulating text
@ -424,6 +359,10 @@ namespace ImGui
IMGUI_API void ColorConvertRGBtoHSV ( float r , float g , float b , float & out_h , float & out_s , float & out_v ) ;
IMGUI_API void ColorConvertHSVtoRGB ( float h , float s , float v , float & out_r , float & out_g , float & out_b ) ;
// Proxy functions to access the MemAllocFn/MemFreeFn pointers in ImGui::GetIO()
IMGUI_API void * MemAlloc ( size_t sz ) ;
IMGUI_API void MemFree ( void * ptr ) ;
// Internal state access - if you want to share ImGui state between modules (e.g. DLL) or allocate it yourself
IMGUI_API const char * GetVersion ( ) ;
IMGUI_API void * GetInternalState ( ) ;
@ -727,6 +666,65 @@ struct ImGuiIO
// Helpers
//-----------------------------------------------------------------------------
// Lightweight std::vector<> like class to avoid dragging dependencies (also: windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).
// Use '#define ImVector std::vector' if you want to use the STL type or your own type.
// Our implementation does NOT call c++ constructors because we don't use them in ImGui. Don't use this class as a straight std::vector replacement in your code!
# ifndef ImVector
template < typename T >
class ImVector
{
protected :
size_t Size ;
size_t Capacity ;
T * Data ;
public :
typedef T value_type ;
typedef value_type * iterator ;
typedef const value_type * const_iterator ;
ImVector ( ) { Size = Capacity = 0 ; Data = NULL ; }
~ ImVector ( ) { if ( Data ) ImGui : : MemFree ( Data ) ; }
inline bool empty ( ) const { return Size = = 0 ; }
inline size_t size ( ) const { return Size ; }
inline size_t capacity ( ) const { return Capacity ; }
inline value_type & at ( size_t i ) { IM_ASSERT ( i < Size ) ; return Data [ i ] ; }
inline const value_type & at ( size_t i ) const { IM_ASSERT ( i < Size ) ; return Data [ i ] ; }
inline value_type & operator [ ] ( size_t i ) { IM_ASSERT ( i < Size ) ; return Data [ i ] ; }
inline const value_type & operator [ ] ( size_t i ) const { IM_ASSERT ( i < Size ) ; return Data [ i ] ; }
inline void clear ( ) { if ( Data ) { Size = Capacity = 0 ; ImGui : : MemFree ( Data ) ; Data = NULL ; } }
inline iterator begin ( ) { return Data ; }
inline const_iterator begin ( ) const { return Data ; }
inline iterator end ( ) { return Data + Size ; }
inline const_iterator end ( ) const { return Data + Size ; }
inline value_type & front ( ) { IM_ASSERT ( Size > 0 ) ; return Data [ 0 ] ; }
inline const value_type & front ( ) const { IM_ASSERT ( Size > 0 ) ; return Data [ 0 ] ; }
inline value_type & back ( ) { IM_ASSERT ( Size > 0 ) ; return Data [ Size - 1 ] ; }
inline const value_type & back ( ) const { IM_ASSERT ( Size > 0 ) ; return Data [ Size - 1 ] ; }
inline void swap ( ImVector < T > & rhs ) { const size_t rhs_size = rhs . Size ; rhs . Size = Size ; Size = rhs_size ; const size_t rhs_cap = rhs . Capacity ; rhs . Capacity = Capacity ; Capacity = rhs_cap ; value_type * rhs_data = rhs . Data ; rhs . Data = Data ; Data = rhs_data ; }
inline void resize ( size_t new_size ) { if ( new_size > Capacity ) reserve ( new_size ) ; Size = new_size ; }
inline void reserve ( size_t new_capacity )
{
if ( new_capacity < = Capacity ) return ;
T * new_data = ( value_type * ) ImGui : : MemAlloc ( new_capacity * sizeof ( value_type ) ) ;
memcpy ( new_data , Data , Size * sizeof ( value_type ) ) ;
ImGui : : MemFree ( Data ) ;
Data = new_data ;
Capacity = new_capacity ;
}
inline void push_back ( const value_type & v ) { if ( Size = = Capacity ) reserve ( Capacity ? Capacity * 2 : 4 ) ; Data [ Size + + ] = v ; }
inline void pop_back ( ) { IM_ASSERT ( Size > 0 ) ; Size - - ; }
inline iterator erase ( const_iterator it ) { IM_ASSERT ( it > = begin ( ) & & it < end ( ) ) ; const ptrdiff_t off = it - begin ( ) ; memmove ( Data + off , Data + off + 1 , ( Size - ( size_t ) off - 1 ) * sizeof ( value_type ) ) ; Size - - ; return Data + off ; }
inline iterator insert ( const_iterator it , const value_type & v ) { IM_ASSERT ( it > = begin ( ) & & it < = end ( ) ) ; const ptrdiff_t off = it - begin ( ) ; if ( Size = = Capacity ) reserve ( Capacity ? Capacity * 2 : 4 ) ; if ( off < ( int ) Size ) memmove ( Data + off + 1 , Data + off , ( Size - ( size_t ) off ) * sizeof ( value_type ) ) ; Data [ off ] = v ; Size + + ; return Data + off ; }
} ;
# endif // #ifndef ImVector
// Helper: execute a block of code once a frame only
// Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame.
// Usage: