xo-expression2/xo-imgui/example/ex4/GenerationLayout.hpp

96 lines
3.8 KiB
C++

/* GenerationLayout.hpp */
#pragma once
#include "GcGenerationDescription.hpp"
#include "xo/imgui/ImRect.hpp"
/** @class GenerationLayout
* @brief layout for displaying a single collector generation.
*
* @text
* reserved: xxx committed: xxxx G1: xxx bytes G0: xxx bytes
* +--------------------------+--------------------+-------------------------+
* to | G1 | G0 | |
* +--------------------------+--------------------+-------------------------+
* Mem: 28k
* +-------------------------------------------------------------------------+
* from | |
* +-------------------------------------------------------------------------+
* ^
* layout elements:
*
* <-a-><------------------------------ mem_w ------------------------------------><---b---->
* <------------------------- ngc_w ---------------------------->
* <--------- G1_w ----------> <------- G0_w ----->
*
* a (lh_text_dx): width for left-hand-side text
* b (rh_text_dx): width for right-hand-side text
* mem_w: width for contiguous committed memory
* ngc_w: location (relative to start of GC memory range) of next-collection trigger
* G1_w: width for occupied memory that has survived one GC in this space
* G0_w: width for memory allocated since last GC
*
* @endtext
*
**/
struct GenerationLayout {
GenerationLayout() = default;
GenerationLayout(const GcGenerationDescription & gendescr, const ImRect & br, bool with_labels);
const char * name() const { return gendescr_.name_; }
const char * mnemonic() const { return gendescr_.mnemonic_; }
const char * gc_type() const { return gendescr_.gc_type_; }
std::size_t to_G1_size() const { return gendescr_.before_checkpoint_; }
std::size_t to_G0_size() const { return gendescr_.after_checkpoint_; }
std::size_t to_gc_threhsold() const { return gendescr_.gc_threshold_; }
float to_scale() const {
/** note: deliberate size_t->float conversion here **/
return gendescr_.scale();
}
ImRect to_g1_rect() const {
return mem_rect_to_.left_fraction(this->to_G1_size() / this->to_scale());
}
ImRect to_g0_rect() const {
return mem_rect_to_.mid_x_fraction(this->to_G1_size() / this->to_scale(),
(this->to_G1_size() + this->to_G0_size()) / this->to_scale());
}
ImRect to_alloc_rect() const {
return mem_rect_to_.left_fraction((this->to_G1_size() + this->to_G0_size()) / this->to_scale());
}
ImRect from_alloc_rect() const {
/* use the same sizing as for source generation */
return mem_rect_from_.left_fraction((this->to_G1_size() + this->to_G0_size()) / this->to_scale());
}
/** size-related statistics for generation to be displayed **/
GcGenerationDescription gendescr_;
/** bounding rectangle. all drawing for generation display will be inside this rectanglge **/
ImRect bounding_rect_;
/** true iff text labels enabled **/
bool with_labels_ = false;
/** text height in screen units **/
float text_dy_ = 0.0;
/** chart rectangle. bounding rectangle less room for headline text **/
ImRect chart_withlabel_rect_;
ImRect chart_nolabel_rect_;
/** text for RH label. something like "N: 28k/40k" **/
xo::flatstring<80> rh_text_;
/** width of .rh_text in screen units **/
float rh_text_dx_ = 0.0;
/** rectangle representing from-space memory range **/
ImRect mem_rect_from_;
/** rectangle representing to-space memory range **/
ImRect mem_rect_to_;
};
/* GenerationLayout.hpp */