mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2024-11-23 03:10:01 +08:00
Optimize inserts in vector and refactor const reference objects (#659)
Signed-off-by: German Semenov <GermanAizek@yandex.ru> Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
This commit is contained in:
parent
8bea9261bc
commit
d464a071da
@ -98,6 +98,7 @@ class VerticalContainer : public ContainerBase {
|
|||||||
|
|
||||||
Element Render() override {
|
Element Render() override {
|
||||||
Elements elements;
|
Elements elements;
|
||||||
|
elements.reserve(children_.size());
|
||||||
for (auto& it : children_) {
|
for (auto& it : children_) {
|
||||||
elements.push_back(it->Render());
|
elements.push_back(it->Render());
|
||||||
}
|
}
|
||||||
@ -180,6 +181,7 @@ class HorizontalContainer : public ContainerBase {
|
|||||||
|
|
||||||
Element Render() override {
|
Element Render() override {
|
||||||
Elements elements;
|
Elements elements;
|
||||||
|
elements.reserve(children_.size());
|
||||||
for (auto& it : children_) {
|
for (auto& it : children_) {
|
||||||
elements.push_back(it->Render());
|
elements.push_back(it->Render());
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ class InputBase : public ComponentBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Elements elements;
|
Elements elements;
|
||||||
std::vector<std::string> lines = Split(*content_);
|
const std::vector<std::string> lines = Split(*content_);
|
||||||
|
|
||||||
int& cursor_position = option_->cursor_position();
|
int& cursor_position = option_->cursor_position();
|
||||||
cursor_position = util::clamp(cursor_position, 0, (int)content_->size());
|
cursor_position = util::clamp(cursor_position, 0, (int)content_->size());
|
||||||
@ -138,6 +138,7 @@ class InputBase : public ComponentBase {
|
|||||||
elements.push_back(text("") | focused);
|
elements.push_back(text("") | focused);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
elements.reserve(lines.size());
|
||||||
for (size_t i = 0; i < lines.size(); ++i) {
|
for (size_t i = 0; i < lines.size(); ++i) {
|
||||||
const std::string& line = lines[i];
|
const std::string& line = lines[i];
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ namespace {
|
|||||||
|
|
||||||
Element DefaultOptionTransform(const EntryState& state) {
|
Element DefaultOptionTransform(const EntryState& state) {
|
||||||
std::string label = (state.active ? "> " : " ") + state.label; // NOLINT
|
std::string label = (state.active ? "> " : " ") + state.label; // NOLINT
|
||||||
Element e = text(label);
|
Element e = text(std::move(label));
|
||||||
if (state.focused) {
|
if (state.focused) {
|
||||||
e = e | inverted;
|
e = e | inverted;
|
||||||
}
|
}
|
||||||
@ -114,6 +114,7 @@ class MenuBase : public ComponentBase {
|
|||||||
if (option_->elements_prefix) {
|
if (option_->elements_prefix) {
|
||||||
elements.push_back(option_->elements_prefix());
|
elements.push_back(option_->elements_prefix());
|
||||||
}
|
}
|
||||||
|
elements.reserve(size());
|
||||||
for (int i = 0; i < size(); ++i) {
|
for (int i = 0; i < size(); ++i) {
|
||||||
if (i != 0 && option_->elements_infix) {
|
if (i != 0 && option_->elements_infix) {
|
||||||
elements.push_back(option_->elements_infix());
|
elements.push_back(option_->elements_infix());
|
||||||
@ -362,7 +363,10 @@ class MenuBase : public ComponentBase {
|
|||||||
animator_background_.clear();
|
animator_background_.clear();
|
||||||
animator_foreground_.clear();
|
animator_foreground_.clear();
|
||||||
|
|
||||||
for (int i = 0; i < size(); ++i) {
|
const int len = size();
|
||||||
|
animator_background_.reserve(len);
|
||||||
|
animator_foreground_.reserve(len);
|
||||||
|
for (int i = 0; i < len; ++i) {
|
||||||
animation_background_[i] = 0.F;
|
animation_background_[i] = 0.F;
|
||||||
animation_foreground_[i] = 0.F;
|
animation_foreground_[i] = 0.F;
|
||||||
animator_background_.emplace_back(&animation_background_[i], 0.F,
|
animator_background_.emplace_back(&animation_background_[i], 0.F,
|
||||||
|
@ -33,6 +33,7 @@ class RadioboxBase : public ComponentBase {
|
|||||||
Clamp();
|
Clamp();
|
||||||
Elements elements;
|
Elements elements;
|
||||||
const bool is_menu_focused = Focused();
|
const bool is_menu_focused = Focused();
|
||||||
|
elements.reserve(size());
|
||||||
for (int i = 0; i < size(); ++i) {
|
for (int i = 0; i < size(); ++i) {
|
||||||
const bool is_focused = (focused_entry() == i) && is_menu_focused;
|
const bool is_focused = (focused_entry() == i) && is_menu_focused;
|
||||||
const bool is_selected = (hovered_ == i);
|
const bool is_selected = (hovered_ == i);
|
||||||
|
@ -68,6 +68,7 @@ class Flexbox : public Node {
|
|||||||
|
|
||||||
void Layout(flexbox_helper::Global& global,
|
void Layout(flexbox_helper::Global& global,
|
||||||
bool compute_requirement = false) {
|
bool compute_requirement = false) {
|
||||||
|
global.blocks.reserve(children_.size());
|
||||||
for (auto& child : children_) {
|
for (auto& child : children_) {
|
||||||
flexbox_helper::Block block;
|
flexbox_helper::Block block;
|
||||||
block.min_size_x = child->requirement().min_x;
|
block.min_size_x = child->requirement().min_x;
|
||||||
|
@ -88,6 +88,7 @@ struct Line {
|
|||||||
void SetX(Global& global, std::vector<Line> lines) {
|
void SetX(Global& global, std::vector<Line> lines) {
|
||||||
for (auto& line : lines) {
|
for (auto& line : lines) {
|
||||||
std::vector<box_helper::Element> elements;
|
std::vector<box_helper::Element> elements;
|
||||||
|
elements.reserve(line.blocks.size());
|
||||||
for (auto* block : line.blocks) {
|
for (auto* block : line.blocks) {
|
||||||
box_helper::Element element;
|
box_helper::Element element;
|
||||||
element.min_size = block->min_size_x;
|
element.min_size = block->min_size_x;
|
||||||
@ -117,6 +118,7 @@ void SetX(Global& global, std::vector<Line> lines) {
|
|||||||
// NOLINTNEXTLINE(readability-function-cognitive-complexity)
|
// NOLINTNEXTLINE(readability-function-cognitive-complexity)
|
||||||
void SetY(Global& g, std::vector<Line> lines) {
|
void SetY(Global& g, std::vector<Line> lines) {
|
||||||
std::vector<box_helper::Element> elements;
|
std::vector<box_helper::Element> elements;
|
||||||
|
elements.reserve(lines.size());
|
||||||
for (auto& line : lines) {
|
for (auto& line : lines) {
|
||||||
box_helper::Element element;
|
box_helper::Element element;
|
||||||
element.flex_shrink = line.blocks.front()->flex_shrink_y;
|
element.flex_shrink = line.blocks.front()->flex_shrink_y;
|
||||||
@ -317,6 +319,7 @@ void Compute3(Global& global) {
|
|||||||
{
|
{
|
||||||
Line line;
|
Line line;
|
||||||
int x = 0;
|
int x = 0;
|
||||||
|
line.blocks.reserve(global.blocks.size());
|
||||||
for (auto& block : global.blocks) {
|
for (auto& block : global.blocks) {
|
||||||
// Does it fit the end of the row?
|
// Does it fit the end of the row?
|
||||||
// No? Then we need to start a new one:
|
// No? Then we need to start a new one:
|
||||||
|
@ -37,6 +37,8 @@ class GridBox : public Node {
|
|||||||
for (const auto& line : lines_) {
|
for (const auto& line : lines_) {
|
||||||
x_size = std::max(x_size, int(line.size()));
|
x_size = std::max(x_size, int(line.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill in empty cells, in case the user did not used the API correctly:
|
||||||
for (auto& line : lines_) {
|
for (auto& line : lines_) {
|
||||||
while (line.size() < size_t(x_size)) {
|
while (line.size() < size_t(x_size)) {
|
||||||
line.push_back(filler());
|
line.push_back(filler());
|
||||||
|
@ -78,7 +78,7 @@ LinearGradientNormalized Normalize(LinearGradient gradient) {
|
|||||||
LinearGradientNormalized normalized;
|
LinearGradientNormalized normalized;
|
||||||
// NOLINTNEXTLINE
|
// NOLINTNEXTLINE
|
||||||
normalized.angle = std::fmod(std::fmod(gradient.angle, 360.f) + 360.f, 360.f);
|
normalized.angle = std::fmod(std::fmod(gradient.angle, 360.f) + 360.f, 360.f);
|
||||||
for (auto& stop : gradient.stops) {
|
for (const auto& stop : gradient.stops) {
|
||||||
normalized.colors.push_back(stop.color);
|
normalized.colors.push_back(stop.color);
|
||||||
normalized.positions.push_back(stop.position.value()); // NOLINT
|
normalized.positions.push_back(stop.position.value()); // NOLINT
|
||||||
}
|
}
|
||||||
|
@ -44,9 +44,11 @@ Table::Table() {
|
|||||||
|
|
||||||
Table::Table(std::vector<std::vector<std::string>> input) {
|
Table::Table(std::vector<std::vector<std::string>> input) {
|
||||||
std::vector<std::vector<Element>> output;
|
std::vector<std::vector<Element>> output;
|
||||||
|
output.reserve(input.size());
|
||||||
for (auto& row : input) {
|
for (auto& row : input) {
|
||||||
output.emplace_back();
|
output.emplace_back();
|
||||||
auto& output_row = output.back();
|
auto& output_row = output.back();
|
||||||
|
output_row.reserve(row.size());
|
||||||
for (auto& cell : row) {
|
for (auto& cell : row) {
|
||||||
output_row.push_back(text(std::move(cell)));
|
output_row.push_back(text(std::move(cell)));
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,7 @@ Decorator operator|(Decorator a, Decorator b) {
|
|||||||
/// @ingroup dom
|
/// @ingroup dom
|
||||||
Elements operator|(Elements elements, Decorator decorator) { // NOLINT
|
Elements operator|(Elements elements, Decorator decorator) { // NOLINT
|
||||||
Elements output;
|
Elements output;
|
||||||
|
output.reserve(elements.size());
|
||||||
for (auto& it : elements) {
|
for (auto& it : elements) {
|
||||||
output.push_back(std::move(it) | decorator);
|
output.push_back(std::move(it) | decorator);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user