From edbc301c02d4c2eb74ec7c59419a5609ffa7ae7f Mon Sep 17 00:00:00 2001 From: Stanislaus Cichcoki Date: Mon, 10 Mar 2025 22:59:54 +0100 Subject: [PATCH] Fixed memory leak Added logging --- CMakeLists.txt | 3 +- src/model/Building.cpp | 108 +++++++++++--------------------- src/model/Building.h | 95 ++++++++++++++++++---------- src/model/Community.cpp | 35 ++++------- src/model/Community.h | 19 +++--- src/model/Energy_Tariff.h | 3 +- src/services/Surplus.cpp | 34 +++++----- src/services/Surplus.h | 16 +++-- tests/model/Factory.h | 47 ++++++-------- tests/services/test_Surplus.cpp | 5 +- 10 files changed, 162 insertions(+), 203 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c4a149..98f6402 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,4 +24,5 @@ add_executable(Sim_C__ src/helper/Curry.h ) find_package(doctest CONFIG REQUIRED) -target_link_libraries(Sim_C__ PRIVATE doctest::doctest) \ No newline at end of file +find_package(spdlog CONFIG REQUIRED) +target_link_libraries(Sim_C__ PRIVATE doctest::doctest spdlog::spdlog) \ No newline at end of file diff --git a/src/model/Building.cpp b/src/model/Building.cpp index a68ffdf..5063f44 100644 --- a/src/model/Building.cpp +++ b/src/model/Building.cpp @@ -4,184 +4,148 @@ #include "Building.h" -float Building::Cost::special_rate_consumption() const -{ +float Building::Cost::special_rate_consumption() const { return SpecialRateConsumption; } -void Building::Cost::set_special_rate_consumption(float special_rate_consumption) -{ +void Building::Cost::set_special_rate_consumption(float special_rate_consumption) { SpecialRateConsumption = special_rate_consumption; } -float Building::Cost::special_rate_generation() const -{ +float Building::Cost::special_rate_generation() const { return SpecialRateGeneration; } -void Building::Cost::set_special_rate_generation(float special_rate_generation) -{ +void Building::Cost::set_special_rate_generation(float special_rate_generation) { SpecialRateGeneration = special_rate_generation; } -std::vector>& Building::Simulation_Values::community_coverage() -{ +std::vector > &Building::Simulation_Values::community_coverage() { return CommunityCoverage; } void Building::Simulation_Values:: -set_community_coverage(std::vector> community_coverage) -{ +set_community_coverage(std::vector > community_coverage) { CommunityCoverage = std::move(community_coverage); } -std::vector>& Building::Simulation_Values::own_usage() -{ +std::vector > &Building::Simulation_Values::own_usage() { return OwnUsage; } -void Building::Simulation_Values::set_own_usage(std::vector> own_usage) -{ +void Building::Simulation_Values::set_own_usage(std::vector > own_usage) { OwnUsage = std::move(own_usage); } -std::vector>& Building::Simulation_Values::needed_con() -{ +std::vector > &Building::Simulation_Values::needed_con() { return Needed_con; } -void Building::Simulation_Values::set_needed_con(std::vector> needed_con) -{ +void Building::Simulation_Values::set_needed_con(std::vector > needed_con) { Needed_con = std::move(needed_con); } -std::vector>& Building::Simulation_Values::needed_gen() -{ +std::vector > &Building::Simulation_Values::needed_gen() { return NeededGen; } -void Building::Simulation_Values::set_needed_gen(std::vector> needed_gen) -{ +void Building::Simulation_Values::set_needed_gen(std::vector > needed_gen) { NeededGen = std::move(needed_gen); } -std::string Building::Metadata::name() const -{ +std::string Building::Metadata::name() const { return Name; } -void Building::Metadata::set_name(const std::string& name) -{ +void Building::Metadata::set_name(const std::string &name) { Name = name; } -float Building::Metadata::annual_consumption() const -{ +float Building::Metadata::annual_consumption() const { return AnnualConsumption; } -void Building::Metadata::set_annual_consumption(float annual_consumption) -{ +void Building::Metadata::set_annual_consumption(float annual_consumption) { AnnualConsumption = annual_consumption; } -float Building::Metadata::annual_generation() const -{ +float Building::Metadata::annual_generation() const { return AnnualGeneration; } -void Building::Metadata::set_annual_generation(float annual_generation) -{ +void Building::Metadata::set_annual_generation(float annual_generation) { AnnualGeneration = annual_generation; } -std::vector>& Building::Metadata::consumption_profile() -{ +std::vector > &Building::Metadata::consumption_profile() { return ConsumptionProfile; } -void Building::Metadata::set_consumption_profile(std::vector> consumption_profile) -{ +void Building::Metadata::set_consumption_profile(std::vector > consumption_profile) { ConsumptionProfile = std::move(consumption_profile); } -std::vector>& Building::Metadata::generation_profile() -{ +std::vector > &Building::Metadata::generation_profile() { return GenerationProfile; } -void Building::Metadata::set_generation_profile(std::vector> generation_profile) -{ +void Building::Metadata::set_generation_profile(std::vector > generation_profile) { GenerationProfile = std::move(generation_profile); } -std::string Building::Metadata::consumption_profile_name() const -{ +std::string Building::Metadata::consumption_profile_name() const { return ConsumptionProfileName; } -void Building::Metadata::set_consumption_profile_name(const std::string& consumption_profile_name) -{ +void Building::Metadata::set_consumption_profile_name(const std::string &consumption_profile_name) { ConsumptionProfileName = consumption_profile_name; } -std::string Building::Metadata::generation_profile_name() const -{ +std::string Building::Metadata::generation_profile_name() const { return GenerationProfileName; } -void Building::Metadata::set_generation_profile_name(const std::string& generation_profile_name) -{ +void Building::Metadata::set_generation_profile_name(const std::string &generation_profile_name) { GenerationProfileName = generation_profile_name; } -short Building::Metadata::connection_power() const -{ +short Building::Metadata::connection_power() const { return ConnectionPower; } -void Building::Metadata::set_connection_power(short connection_power) -{ +void Building::Metadata::set_connection_power(short connection_power) { ConnectionPower = connection_power; } -short Building::Metadata::grid_power() const -{ +short Building::Metadata::grid_power() const { return GridPower; } -void Building::Metadata::set_grid_power(short grid_power) -{ +void Building::Metadata::set_grid_power(short grid_power) { GridPower = grid_power; } -std::unique_ptr& Building::Base::cost() -{ +std::unique_ptr &Building::Base::cost() { return Cost; } -void Building::Base::set_cost(std::unique_ptr cost) -{ +void Building::Base::set_cost(std::unique_ptr cost) { Cost = std::move(cost); } -std::unique_ptr& Building::Base::values() -{ +std::unique_ptr &Building::Base::values() { return Values; } -void Building::Base::set_values(std::unique_ptr values) -{ +void Building::Base::set_values(std::unique_ptr values) { Values = std::move(values); } -std::unique_ptr& Building::Base::metadata() -{ +std::unique_ptr &Building::Base::metadata() { return Metadata; } -void Building::Base::set_metadata(std::unique_ptr metadata) -{ +void Building::Base::set_metadata(std::unique_ptr metadata) { Metadata = std::move(metadata); } diff --git a/src/model/Building.h b/src/model/Building.h index ad8cf29..093902d 100644 --- a/src/model/Building.h +++ b/src/model/Building.h @@ -11,48 +11,54 @@ #include "Model.h" -namespace Building -{ - class Cost - { +namespace Building { + class Cost { private: float SpecialRateConsumption; float SpecialRateGeneration; public: float special_rate_consumption() const; + void set_special_rate_consumption(float special_rate_consumption); + float special_rate_generation() const; + void set_special_rate_generation(float special_rate_generation); }; - class Simulation_Values - { + class Simulation_Values { private: - std::vector> CommunityCoverage; - std::vector> OwnUsage; - std::vector> Needed_con; - std::vector> NeededGen; + std::vector > CommunityCoverage; + std::vector > OwnUsage; + std::vector > Needed_con; + std::vector > NeededGen; public: - std::vector>& community_coverage(); - void set_community_coverage(std::vector> community_coverage); - std::vector>& own_usage(); - void set_own_usage(std::vector> own_usage); - std::vector>& needed_con(); - void set_needed_con(std::vector> needed_con); - std::vector>& needed_gen(); - void set_needed_gen(std::vector> needed_gen); + std::vector > &community_coverage(); + + void set_community_coverage(std::vector > community_coverage); + + std::vector > &own_usage(); + + void set_own_usage(std::vector > own_usage); + + std::vector > &needed_con(); + + void set_needed_con(std::vector > needed_con); + + std::vector > &needed_gen(); + + void set_needed_gen(std::vector > needed_gen); }; - class Metadata - { + class Metadata { private: std::string Name; float AnnualConsumption; float AnnualGeneration; - std::vector> ConsumptionProfile; - std::vector> GenerationProfile; + std::vector > ConsumptionProfile; + std::vector > GenerationProfile; std::string ConsumptionProfileName; std::string GenerationProfileName; short ConnectionPower; @@ -60,38 +66,59 @@ namespace Building public: std::string name() const; - void set_name(const std::string& name); + + void set_name(const std::string &name); + float annual_consumption() const; + void set_annual_consumption(float annual_consumption); + float annual_generation() const; + void set_annual_generation(float annual_generation); - std::vector>& consumption_profile(); - void set_consumption_profile(std::vector> consumption_profile); - std::vector>& generation_profile(); - void set_generation_profile(std::vector> generation_profile); + + std::vector > &consumption_profile(); + + void set_consumption_profile(std::vector > consumption_profile); + + std::vector > &generation_profile(); + + void set_generation_profile(std::vector > generation_profile); + std::string consumption_profile_name() const; - void set_consumption_profile_name(const std::string& consumption_profile_name); + + void set_consumption_profile_name(const std::string &consumption_profile_name); + std::string generation_profile_name() const; - void set_generation_profile_name(const std::string& generation_profile_name); + + void set_generation_profile_name(const std::string &generation_profile_name); + short connection_power() const; + void set_connection_power(short connection_power); + short grid_power() const; + void set_grid_power(short grid_power); }; - class Base : public Model - { + class Base : public Model { private: std::unique_ptr Cost; std::unique_ptr Values; std::unique_ptr Metadata; public: - std::unique_ptr& cost(); + std::unique_ptr &cost(); + void set_cost(std::unique_ptr cost); - std::unique_ptr& values(); + + std::unique_ptr &values(); + void set_values(std::unique_ptr values); - std::unique_ptr& metadata(); + + std::unique_ptr &metadata(); + void set_metadata(std::unique_ptr metadata); }; } diff --git a/src/model/Community.cpp b/src/model/Community.cpp index bd07eeb..16570a0 100644 --- a/src/model/Community.cpp +++ b/src/model/Community.cpp @@ -2,51 +2,40 @@ #include "../helper/Curry.h" -std::string Community::name() const -{ +std::string Community::name() const { return Name; } -void Community::set_name(const std::string& name) -{ +void Community::set_name(const std::string &name) { Name = name; } -std::vector>& Community::buildings() -{ +std::vector > &Community::buildings() { return Buildings; } // Use move semantics for efficiency -void Community::set_buildings(std::vector> buildings) -{ +void Community::set_buildings(std::vector > buildings) { Buildings = std::move(buildings); } -Energy_Tariff Community::energy_tariff() const -{ +Energy_Tariff Community::energy_tariff() const { return energy_Tariff; } -void Community::set_energy_tariff(const Energy_Tariff& energy_tariff) -{ +void Community::set_energy_tariff(const Energy_Tariff &energy_tariff) { energy_Tariff = energy_tariff; } auto Community::iterateBuildings( - std::vector>& Communities) -> std::function&)>(const std::function&)> -{ - return [&](const std::function& func1) - { - return [&, func1](const std::function& func2) - { + std::vector > &Communities) -> std::function &)>(const std::function &)> { + return [&](const std::function &func1) { + return [&, func1](const std::function &func2) { iterateVector(Communities, func1); - iterateVector(Communities, [&](Community& community) - { - for (auto& building : community.buildings()) - { + iterateVector(Communities, [&](Community &community) { + for (auto &building: community.buildings()) { func2(*building); } }); diff --git a/src/model/Community.h b/src/model/Community.h index 1b1ac0d..d9d3373 100644 --- a/src/model/Community.h +++ b/src/model/Community.h @@ -11,28 +11,27 @@ #include "Energy_Tariff.h" -class Community : public Model -{ +class Community : public Model { public: std::string name() const; - void set_name(const std::string& name); + void set_name(const std::string &name); - std::vector>& buildings(); + std::vector > &buildings(); - void set_buildings(std::vector> buildings); + void set_buildings(std::vector > buildings); Energy_Tariff energy_tariff() const; - void set_energy_tariff(const Energy_Tariff& energy_tariff); + void set_energy_tariff(const Energy_Tariff &energy_tariff); - static std::function&)> - (const std::function&)> - iterateBuildings(std::vector>& Communities); + static std::function &)> + (const std::function &)> + iterateBuildings(std::vector > &Communities); private: std::string Name; - std::vector> Buildings; + std::vector > Buildings; Energy_Tariff energy_Tariff; }; diff --git a/src/model/Energy_Tariff.h b/src/model/Energy_Tariff.h index 6a7af09..59cfeb4 100644 --- a/src/model/Energy_Tariff.h +++ b/src/model/Energy_Tariff.h @@ -6,8 +6,7 @@ #define ENERGY_TARIFF_H -class Energy_Tariff -{ +class Energy_Tariff { }; diff --git a/src/services/Surplus.cpp b/src/services/Surplus.cpp index ace82f5..57b1de9 100644 --- a/src/services/Surplus.cpp +++ b/src/services/Surplus.cpp @@ -5,21 +5,17 @@ #include "Surplus.h" #include "../model/Building.h" #include -#include -#include #include +#include -void Surplus::CalculateSurplus() -{ +void Surplus::CalculateSurplus() { auto iterateFunc = Community::iterateBuildings(communities); - auto modifyCommunity = [](Community& c) - { - std::cout << "Processing Community\n"; + auto modifyCommunity = [](Community &c) { + spdlog::info("Calculating Surplus for Community: {}", c.name()); }; - auto modifyBuilding = [this](Building::Base& building) - { - std::cout << "Processing Building\n"; + auto modifyBuilding = [this](Building::Base &building) { + spdlog::info("Calculating Surplus for Community: {}", building.metadata()->name()); CalculateBuildingSurplus(building); }; iterateFunc(modifyCommunity)(modifyBuilding); @@ -27,15 +23,14 @@ void Surplus::CalculateSurplus() //TODO Calculate Relative Values } -void Surplus::CalculateBuildingSurplus(Building::Base& building) -{ - std::vector> ownCoverage; - std::vector> neededConsumption; - std::vector> neededGeneration; - std::vector> ownUsage; +void Surplus::CalculateBuildingSurplus(Building::Base &building) { + std::vector > ownCoverage; + std::vector > neededConsumption; + std::vector > neededGeneration; + std::vector > ownUsage; - const auto& consumption = building.metadata()->consumption_profile(); - const auto& generation = building.metadata()->generation_profile(); + const auto &consumption = building.metadata()->consumption_profile(); + const auto &generation = building.metadata()->generation_profile(); ownCoverage.reserve(consumption.size()); neededConsumption.reserve(consumption.size()); @@ -44,8 +39,7 @@ void Surplus::CalculateBuildingSurplus(Building::Base& building) std::transform(consumption.begin(), consumption.end(), generation.begin(), std::back_inserter(ownCoverage), - [&](const std::unique_ptr& c, const std::unique_ptr& g) - { + [&](const std::unique_ptr &c, const std::unique_ptr &g) { auto own_cov = std::make_unique((c ? *c : 0.0f) - (g ? *g : 0.0f)); ownCoverage.push_back(std::make_unique(*own_cov)); diff --git a/src/services/Surplus.h b/src/services/Surplus.h index bc1690f..6cffd62 100644 --- a/src/services/Surplus.h +++ b/src/services/Surplus.h @@ -12,25 +12,23 @@ class Community; -class Surplus -{ +class Surplus { private: - std::vector>& communities; + std::vector > &communities; std::vector consumptionAvailable; std::vector generationAvailable; std::vector isGenBigger; public: - Surplus(std::vector>& communities) : communities(communities), - consumptionAvailable(VALUE_COUNT, 0.0f), - generationAvailable(VALUE_COUNT, 0.0f), - isGenBigger((VALUE_COUNT, false)) - { + Surplus(std::vector > &communities) : communities(communities), + consumptionAvailable(VALUE_COUNT, 0.0f), + generationAvailable(VALUE_COUNT, 0.0f), + isGenBigger(VALUE_COUNT, false) { } void CalculateSurplus(); - void CalculateBuildingSurplus(Building::Base&); + void CalculateBuildingSurplus(Building::Base &); }; diff --git a/tests/model/Factory.h b/tests/model/Factory.h index b36788c..6b0839e 100644 --- a/tests/model/Factory.h +++ b/tests/model/Factory.h @@ -9,33 +9,28 @@ #include "../../src/model/Community.h" #include "../../src/model/Energy_Tariff.h" -namespace Building -{ +namespace Building { class Cost; } -class Factory -{ +class Factory { public: - std::unique_ptr static create_test_cost() - { + std::unique_ptr static create_test_cost() { auto cost = std::make_unique(); cost->set_special_rate_consumption(0.15f); cost->set_special_rate_generation(0.10f); return cost; } - std::unique_ptr static create_test_simulation_values() - { + std::unique_ptr static create_test_simulation_values() { auto values = std::make_unique(); - auto communityCoverage = std::vector>(); - auto ownUsage = std::vector>(); - auto neededCon = std::vector>(); - auto neededGen = std::vector>(); + auto communityCoverage = std::vector >(); + auto ownUsage = std::vector >(); + auto neededCon = std::vector >(); + auto neededGen = std::vector >(); - for (int i = 0; i < 5; i++) - { + for (int i = 0; i < 5; i++) { // Populate with test values communityCoverage.push_back(std::make_unique(i * 10.0f)); ownUsage.push_back(std::make_unique(i * 5.0f)); @@ -51,8 +46,7 @@ public: return values; } - std::unique_ptr static create_test_metadata() - { + std::unique_ptr static create_test_metadata() { auto metadata = std::make_unique(); metadata->set_name("Test Building"); metadata->set_annual_consumption(12000.0f); @@ -62,11 +56,10 @@ public: metadata->set_connection_power(100); metadata->set_grid_power(50); - auto consumptionProfile = std::vector>(); - auto generationProfile = std::vector>(); + auto consumptionProfile = std::vector >(); + auto generationProfile = std::vector >(); - for (int i = 0; i < 5; i++) - { + for (int i = 0; i < 5; i++) { // Populate with test values consumptionProfile.push_back(std::make_unique(i * 100.0f)); generationProfile.push_back(std::make_unique(i * 50.0f)); @@ -78,8 +71,7 @@ public: return metadata; } - std::unique_ptr static create_test_building() - { + std::unique_ptr static create_test_building() { auto building = std::make_unique(); building->set_cost(create_test_cost()); @@ -89,19 +81,16 @@ public: return building; } - Energy_Tariff static create_test_energy_tariff() - { + Energy_Tariff static create_test_energy_tariff() { return {}; } - std::unique_ptr static create_test_community() - { + std::unique_ptr static create_test_community() { auto community = std::make_unique(); community->set_name("Test Community"); - std::vector> buildings; - for (int i = 0; i < 3; i++) - { + std::vector > buildings; + for (int i = 0; i < 3; i++) { buildings.push_back(create_test_building()); } diff --git a/tests/services/test_Surplus.cpp b/tests/services/test_Surplus.cpp index 3ff927b..806d2c6 100644 --- a/tests/services/test_Surplus.cpp +++ b/tests/services/test_Surplus.cpp @@ -6,9 +6,8 @@ #include "doctest/doctest.h" #include "../model/Factory.h" -TEST_CASE("Testing add function") -{ - std::vector> communities; +TEST_CASE("Testing add function") { + std::vector > communities; communities.push_back(Factory::create_test_community()); Surplus surplus(communities); surplus.CalculateSurplus();