Skip to content

Commit

Permalink
mod: refactoring the description data
Browse files Browse the repository at this point in the history
  • Loading branch information
quesnel committed Jun 17, 2024
1 parent c202bb2 commit 8bac94d
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 34 deletions.
21 changes: 11 additions & 10 deletions app/gui/component-editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,10 @@
#include <irritator/modeling.hpp>

#include "application.hpp"
#include "dialog.hpp"
#include "editor.hpp"
#include "imgui.h"
#include "imnodes.h"
#include "internal.hpp"
#include "irritator/helpers.hpp"

#include <cstring>

namespace irt {

Expand Down Expand Up @@ -174,25 +170,30 @@ static void show_file_access(application& app, component& compo) noexcept

is_save_enabled = is_valid_irt_filename(file->path.sv());

auto* desc = app.mod.descriptions.try_to_get(compo.desc);
if (!desc) {
if (not app.mod.descriptions.exists(compo.desc)) {
if (app.mod.descriptions.can_alloc(1) &&
ImGui::Button("Add description")) {
auto& new_desc = app.mod.descriptions.alloc();
compo.desc = app.mod.descriptions.get_id(new_desc);
compo.desc = app.mod.descriptions.alloc(
[](auto /*id*/, auto& str, auto& status) noexcept {
str.clear();
status = description_status::modified;
});
}
} else {
constexpr ImGuiInputTextFlags flags =
ImGuiInputTextFlags_AllowTabInput;

const auto idx = get_index(compo.desc);
auto& str = app.mod.descriptions.get<0>()[idx];

ImGui::InputSmallStringMultiline(
"##source",
desc->data,
str,
ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16),
flags);

if (ImGui::Button("Remove")) {
app.mod.descriptions.free(*desc);
app.mod.descriptions.free(compo.desc);
compo.desc = undefined<description_id>();
}
}
Expand Down
3 changes: 1 addition & 2 deletions app/gui/memory-window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ void memory_window::show() noexcept

if (ImGui::CollapsingHeader("Component usage",
ImGuiTreeNodeFlags_DefaultOpen)) {
ImGui::TextFormat("descriptions: {} / {} / {}",
ImGui::TextFormat("descriptions: {} / {}",
app.mod.descriptions.size(),
app.mod.descriptions.max_used(),
app.mod.descriptions.capacity());
ImGui::TextFormat("components: {} / {} / {}",
app.mod.components.size(),
Expand Down
8 changes: 7 additions & 1 deletion lib/include/irritator/modeling.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1271,6 +1271,7 @@ class modeling
public:
struct connection_error {};
struct children_error {};
struct description_error {};

enum class part {
descriptions,
Expand All @@ -1288,7 +1289,12 @@ class modeling
connections
};

data_array<description, description_id> descriptions;
id_data_array<description_id,
default_allocator,
description_str,
description_status>
descriptions;

data_array<generic_component, generic_component_id> generic_components;
data_array<grid_component, grid_component_id> grid_components;
data_array<graph_component, graph_component_id> graph_components;
Expand Down
54 changes: 33 additions & 21 deletions lib/src/modeling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@ modeling::modeling() noexcept

status modeling::init(modeling_initializer& p) noexcept
{
descriptions.reserve(p.description_capacity);
if (not descriptions.can_alloc())
return new_error(modeling::part::descriptions);
if (p.description_capacity) {
descriptions.reserve(p.description_capacity);
if (not descriptions.capacity())
return new_error(description_error{},
e_memory{ p.description_capacity, 0 });
}

components.reserve(p.component_capacity);
if (not components.can_alloc())
Expand Down Expand Up @@ -91,10 +94,12 @@ static void prepare_component_loading(modeling& mod,
std::error_code ec;
if (fs::exists(desc_file, ec)) {
debug_logi(6, "found description file {}\n", desc_file.string());
if (mod.descriptions.can_alloc()) {
auto& desc = mod.descriptions.alloc();
desc.status = description_status::unread;
compo.desc = mod.descriptions.get_id(desc);
if (mod.descriptions.can_alloc(1)) {
compo.desc = mod.descriptions.alloc(
[](auto /*id*/, auto& str, auto& status) noexcept {
str.clear();
status = description_status::unread;
});
} else {
mod.log_entries.push(log_level::error, [&](auto& e) noexcept {
format(e.buffer,
Expand Down Expand Up @@ -431,16 +436,21 @@ static status load_component(modeling& mod, component& compo) noexcept

if (file::exists(str.c_str())) {
if (auto f = file::open(str.c_str(), open_mode::read); f) {
auto* desc = mod.descriptions.try_to_get(compo.desc);
if (!desc) {
auto& d = mod.descriptions.alloc();
desc = &d;
compo.desc = mod.descriptions.get_id(d);
}

if (!f->read(desc->data.data(), desc->data.capacity())) {
mod.descriptions.free(*desc);
compo.desc = undefined<description_id>();
if (not mod.descriptions.exists(compo.desc))
if (mod.descriptions.can_alloc(1))
compo.desc = mod.descriptions.alloc(
[](auto /*id*/, auto& str, auto& status) noexcept {
str.clear();
status = description_status::modified;
});

if (mod.descriptions.exists(compo.desc)) {
auto& str = mod.descriptions.get<0>(compo.desc);

if (not f->read(str.data(), str.capacity())) {
mod.descriptions.free(compo.desc);
compo.desc = undefined<description_id>();
}
}
}
}
Expand Down Expand Up @@ -945,8 +955,8 @@ void modeling::free(component& compo) noexcept
break;
}

if (auto* desc = descriptions.try_to_get(compo.desc); desc)
descriptions.free(*desc);
if (descriptions.exists(compo.desc))
descriptions.free(compo.desc);

if (auto* path = file_paths.try_to_get(compo.file); path)
file_paths.free(*path);
Expand Down Expand Up @@ -1125,12 +1135,14 @@ status modeling::save(component& c) noexcept
return ret.error();
}

if (auto* desc = descriptions.try_to_get(c.desc); desc) {
if (descriptions.exists(c.desc)) {
std::filesystem::path p{ dir->path.c_str() };
p /= file->path.c_str();
p.replace_extension(".desc");
std::ofstream ofs{ p };
ofs.write(desc->data.c_str(), desc->data.size());

auto& str = descriptions.get<0>()[get_index(c.desc)];
ofs.write(str.c_str(), str.size());
}

c.state = component_status::unmodified;
Expand Down

0 comments on commit 8bac94d

Please sign in to comment.