From b0056c90044c82d7a4f4fae4537bca586f6bd33b Mon Sep 17 00:00:00 2001 From: stani Date: Mon, 10 Mar 2025 21:04:58 +0100 Subject: [PATCH] Curring magic --- CMakeLists.txt | 8 +++ src/helper/Curry.h | 14 ++++ src/interfaces/ICostComponent.h | 15 +++++ src/model/Building.cpp | 13 +--- src/model/Building.h | 15 +++-- src/model/Community.cpp | 24 +++++-- src/model/Community.h | 15 +++-- src/model/Model.h | 20 ++++++ src/services/Cost/CostPipeline.cpp | 18 +++++ src/services/Cost/CostPipeline.h | 23 +++++++ src/services/Cost/TaxComponent.cpp | 16 +++++ src/services/Cost/TaxComponent.h | 19 ++++++ src/services/Surplus.cpp | 21 +++--- src/services/Surplus.h | 10 +-- tests/model/Factory.h | 104 +++++++++++++++++++++++++++++ tests/services/test_Surplus.cpp | 5 ++ 16 files changed, 296 insertions(+), 44 deletions(-) create mode 100644 src/helper/Curry.h create mode 100644 src/interfaces/ICostComponent.h create mode 100644 src/model/Model.h create mode 100644 src/services/Cost/CostPipeline.cpp create mode 100644 src/services/Cost/CostPipeline.h create mode 100644 src/services/Cost/TaxComponent.cpp create mode 100644 src/services/Cost/TaxComponent.h create mode 100644 tests/model/Factory.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 39ba7ab..9c4a149 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,14 @@ add_executable(Sim_C__ src/services/Surplus.cpp src/services/Surplus.h tests/services/test_Surplus.cpp + src/model/Model.h + tests/model/Factory.h + src/services/Cost/CostPipeline.cpp + src/services/Cost/CostPipeline.h + src/interfaces/ICostComponent.h + src/services/Cost/TaxComponent.cpp + src/services/Cost/TaxComponent.h + src/helper/Curry.h ) find_package(doctest CONFIG REQUIRED) target_link_libraries(Sim_C__ PRIVATE doctest::doctest) \ No newline at end of file diff --git a/src/helper/Curry.h b/src/helper/Curry.h new file mode 100644 index 0000000..97c511d --- /dev/null +++ b/src/helper/Curry.h @@ -0,0 +1,14 @@ +// +// Created by stani on 3/10/2025. +// + +#ifndef CURRY_H +#define CURRY_H +template +auto curry(Func1 f1, Func2 f2) { + return [=](auto... args) { + auto result1 = f1(args...); + return f2(result1); + }; +} +#endif //CURRY_H diff --git a/src/interfaces/ICostComponent.h b/src/interfaces/ICostComponent.h new file mode 100644 index 0000000..5ee9471 --- /dev/null +++ b/src/interfaces/ICostComponent.h @@ -0,0 +1,15 @@ +// +// Created by stani on 3/10/2025. +// + +#ifndef ICOSTCOMPONENT_H +#define ICOSTCOMPONENT_H +#include "../model/Community.h" + +class ICostComponent +{ + public: + virtual ~ICostComponent() = default; + virtual double apply(std::vector>& communities) const = 0; +}; +#endif //ICOSTCOMPONENT_H diff --git a/src/model/Building.cpp b/src/model/Building.cpp index 092b19c..0ef17f5 100644 --- a/src/model/Building.cpp +++ b/src/model/Building.cpp @@ -129,7 +129,7 @@ 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); } @@ -137,7 +137,7 @@ 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); } @@ -145,15 +145,8 @@ 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); } -void Building::Base::iterateBuildings(std::vector> &buildings, -const std::function& function) { - for (auto &building : buildings) { - function(*building); - } -} - diff --git a/src/model/Building.h b/src/model/Building.h index 884642b..ba4f6b6 100644 --- a/src/model/Building.h +++ b/src/model/Building.h @@ -8,6 +8,8 @@ #include #include +#include "Model.h" + namespace Building { class Cost { @@ -15,6 +17,7 @@ float SpecialRateConsumption; float SpecialRateGeneration; public: + float special_rate_consumption() const; void set_special_rate_consumption(float special_rate_consumption); float special_rate_generation() const; @@ -68,21 +71,19 @@ void set_grid_power(short grid_power); }; - class Base { + class Base : public Model + { private: std::unique_ptr Cost; std::unique_ptr Values; std::unique_ptr Metadata; public: std::unique_ptr& cost(); - void set_cost(std::unique_ptr &cost); + void set_cost(std::unique_ptr cost); std::unique_ptr & values(); - void set_values(std::unique_ptr &values); + void set_values(std::unique_ptr values); std::unique_ptr & metadata(); - void set_metadata(std::unique_ptr &metadata); - - static void iterateBuildings(std::vector > &buildings, - const std::function& function); + void set_metadata(std::unique_ptr metadata); }; } diff --git a/src/model/Community.cpp b/src/model/Community.cpp index 415d4b9..c2917cd 100644 --- a/src/model/Community.cpp +++ b/src/model/Community.cpp @@ -1,5 +1,7 @@ #include "Community.h" +#include "../helper/Curry.h" + std::string Community::name() const { return Name; } @@ -25,9 +27,19 @@ void Community::set_energy_tariff(const Energy_Tariff& energy_tariff) { energy_Tariff = energy_tariff; } -void Community::iterateCommunities(std::vector> &communities, - const std::function&)> &function) { - for (auto &community : communities) { - function(community); - } -} \ No newline at end of file +auto Community::iterateBuildings(std::vector>& Communities) -> std::function&)>(const std::function&)> +{ + return [&](const std::function& func1) { + return [&, func1](const std::function& func2) { + // First apply func1 to each Community + iterateVector(Communities, func1); + + // Second apply func2 to each building inside each Community + iterateVector(Communities, [&](Community& community) { + for (auto& building : community.buildings()) { + func2(*building); // Apply func2 to each Building::Base + } + }); + }; + }; +} diff --git a/src/model/Community.h b/src/model/Community.h index 73a5452..1b1ac0d 100644 --- a/src/model/Community.h +++ b/src/model/Community.h @@ -11,11 +11,12 @@ #include "Energy_Tariff.h" -class Community { +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(); @@ -23,17 +24,17 @@ public: Energy_Tariff energy_tariff() const; - void set_energy_tariff(const Energy_Tariff &energy_tariff); + void set_energy_tariff(const Energy_Tariff& energy_tariff); - static void iterateCommunities(std::vector> &communities, - const std::function &)> &function); + static std::function&)> + (const std::function&)> + iterateBuildings(std::vector>& Communities); private: std::string Name; std::vector> Buildings; - Energy_Tariff energy_Tariff; + Energy_Tariff energy_Tariff; }; - #endif //COMMUNITY_H diff --git a/src/model/Model.h b/src/model/Model.h new file mode 100644 index 0000000..fbc8b18 --- /dev/null +++ b/src/model/Model.h @@ -0,0 +1,20 @@ +#ifndef MODEL_H +#define MODEL_H + +#include +#include +#include + +template +class Model { +public: + static void iterateVector(std::vector>& vector, + const std::function& function) + { + for (auto& item : vector) { + function(*item); + } + } +}; + +#endif // MODEL_H diff --git a/src/services/Cost/CostPipeline.cpp b/src/services/Cost/CostPipeline.cpp new file mode 100644 index 0000000..b20f0f9 --- /dev/null +++ b/src/services/Cost/CostPipeline.cpp @@ -0,0 +1,18 @@ +// +// Created by stani on 3/10/2025. +// + +#include "CostPipeline.h" + +void CostPipeline::addCostComponent(const std::shared_ptr& components) +{ + this->components.push_back(components); +} + +void CostPipeline::calculateFinalCost() +{ + for (auto& component: this->components) + { + component->apply(this->communities); + } +} diff --git a/src/services/Cost/CostPipeline.h b/src/services/Cost/CostPipeline.h new file mode 100644 index 0000000..ee165aa --- /dev/null +++ b/src/services/Cost/CostPipeline.h @@ -0,0 +1,23 @@ +// +// Created by stani on 3/10/2025. +// + +#ifndef COSTPIPELINE_H +#define COSTPIPELINE_H +#include +#include +#include "../../interfaces/ICostComponent.h" +#include "../../model/Community.h" + +class CostPipeline { + std::vector>& communities; + std::vector> components; + public: + CostPipeline(std::vector>& communities) : communities(communities){} + void addCostComponent(const std::shared_ptr& components); + void calculateFinalCost(); +}; + + + +#endif //COSTPIPELINE_H diff --git a/src/services/Cost/TaxComponent.cpp b/src/services/Cost/TaxComponent.cpp new file mode 100644 index 0000000..1e25228 --- /dev/null +++ b/src/services/Cost/TaxComponent.cpp @@ -0,0 +1,16 @@ +// +// Created by stani on 3/10/2025. +// + +#include "TaxComponent.h" + +void TaxComponent::applyCost(std::vector>& communities) +{ + Community::iterateVector(communities, [&](Community& community) + { + Building::Base::iterateVector(community.buildings(), [&](Building::Base& building) + { + + }); + }); +} diff --git a/src/services/Cost/TaxComponent.h b/src/services/Cost/TaxComponent.h new file mode 100644 index 0000000..e06e848 --- /dev/null +++ b/src/services/Cost/TaxComponent.h @@ -0,0 +1,19 @@ +// +// Created by stani on 3/10/2025. +// + +#ifndef TAXCOMPONENT_H +#define TAXCOMPONENT_H +#include "../../interfaces/ICostComponent.h" + + +class TaxComponent : public ICostComponent{ + double taxRate; + public: + TaxComponent(double rate) : taxRate(rate){} + void applyCost(std::vector>& communities); +}; + + + +#endif //TAXCOMPONENT_H diff --git a/src/services/Surplus.cpp b/src/services/Surplus.cpp index 5e43970..bce25e4 100644 --- a/src/services/Surplus.cpp +++ b/src/services/Surplus.cpp @@ -7,20 +7,23 @@ #include "../model/Building.h" #include #include +#include #include -void Surplus::CalculateSurplus(std::vector> &communities) { +void Surplus::CalculateSurplus(std::vector>& communities) { std::vector consumptionAvailable(VALUE_COUNT, 0.0); std::vector generationAvailable(VALUE_COUNT, 0.0); - - Community::iterateCommunities(communities, [&](const std::shared_ptr& community) { - auto &buildings = community->buildings(); - - Building::Base::iterateBuildings(buildings, [&](Building::Base &building) { - CalculateBuildingSurplus(building); - }); - }); + auto iterateFunc = Community::iterateBuildings(communities); + auto modifyCommunity = [](Community& c) { + std::cout << "Processing Community\n"; + }; + auto modifyBuilding = [](Building::Base& building) { + std::cout << "Processing Building\n"; + CalculateBuildingSurplus(building); + }; + auto nestedFunc = iterateFunc(modifyCommunity); + nestedFunc(modifyBuilding); } void Surplus::CalculateBuildingSurplus(Building::Base& building) { diff --git a/src/services/Surplus.h b/src/services/Surplus.h index 560f287..c62acf5 100644 --- a/src/services/Surplus.h +++ b/src/services/Surplus.h @@ -14,13 +14,13 @@ class Community; class Surplus { private: - std::vector> &communities; - public: - Surplus(std::vector> &communities):communities(communities){}; + std::vector>& communities; +public: + Surplus(std::vector>& communities) : communities(communities) {} - void CalculateSurplus(std::vector> &communities); + void static CalculateSurplus(std::vector>& communities); - void CalculateBuildingSurplus(Building::Base&); + void static CalculateBuildingSurplus(Building::Base&); }; diff --git a/tests/model/Factory.h b/tests/model/Factory.h new file mode 100644 index 0000000..42c32da --- /dev/null +++ b/tests/model/Factory.h @@ -0,0 +1,104 @@ +// +// Created by stani on 3/10/2025. +// + +#ifndef FACTORY_H +#define FACTORY_H +#include +#include "../../src/model/Building.h" +#include "../../src/model/Community.h" +#include "../../src/model/Energy_Tariff.h" + +namespace Building +{ + class Cost; +} + +class Factory { + public: + 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() { + auto values = std::make_unique(); + + auto communityCoverage = std::vector>(); + auto ownUsage = std::vector>(); + auto neededCon = std::vector>(); + auto neededGen = std::vector>(); + + 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)); + neededCon.push_back(std::make_unique(i * 3.0f)); + neededGen.push_back(std::make_unique(i * 2.0f)); + } + + values->set_community_coverage(std::move(communityCoverage)); + values->set_own_usage(std::move(ownUsage)); + values->set_needed_con(std::move(neededCon)); + values->set_needed_gen(std::move(neededGen)); + + return values; + } + + std::unique_ptr static create_test_metadata() { + auto metadata = std::make_unique(); + metadata->set_name("Test Building"); + metadata->set_annual_consumption(12000.0f); + metadata->set_annual_generation(5000.0f); + metadata->set_consumption_profile_name("Profile_1"); + metadata->set_generation_profile_name("Profile_2"); + metadata->set_connection_power(100); + metadata->set_grid_power(50); + + auto consumptionProfile = std::vector>(); + auto generationProfile = std::vector>(); + + 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)); + } + + metadata->set_consumption_profile(std::move(consumptionProfile)); + metadata->set_generation_profile(std::move(generationProfile)); + + return metadata; + } + + std::unique_ptr static create_test_building() { + auto building = std::make_unique(); + + building->set_cost( create_test_cost()); + building->set_values(create_test_simulation_values()); + building->set_metadata(create_test_metadata()); + + return building; + } + Energy_Tariff static create_test_energy_tariff() { + return {}; + } + 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++) { + buildings.push_back(create_test_building()); + } + + community->set_buildings(std::move(buildings)); + community->set_energy_tariff(create_test_energy_tariff()); + + return community; + } + +}; + + + +#endif //FACTORY_H diff --git a/tests/services/test_Surplus.cpp b/tests/services/test_Surplus.cpp index 76b0dd9..400a84a 100644 --- a/tests/services/test_Surplus.cpp +++ b/tests/services/test_Surplus.cpp @@ -2,8 +2,13 @@ // Created by StanislausCichocki on 10.03.2025. // #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN +#include "../../src/services/Surplus.h" #include "doctest/doctest.h" +#include "../model/Factory.h" TEST_CASE("Testing add function") { + std::vector> communities; + communities.push_back(Factory::create_test_community()); + Surplus::CalculateSurplus(communities); CHECK(true); } \ No newline at end of file