#pragma once #include #include "openvic-simulation/economy/GoodDefinition.hpp" #include "openvic-simulation/economy/trading/SellResult.hpp" #include "openvic-simulation/types/fixed_point/FixedPoint.hpp" #include "openvic-simulation/types/HasIdentifier.hpp" #include "openvic-simulation/types/IdentifierRegistry.hpp" #include "openvic-simulation/utility/Getters.hpp" namespace OpenVic { struct GoodInstanceManager; struct GoodInstance : HasIdentifierAndColour { friend struct GoodInstanceManager; private: GoodDefinition const& PROPERTY(good_definition); fixed_point_t PROPERTY(price); bool PROPERTY(is_available); fixed_point_t supply_running_total; fixed_point_t PROPERTY(total_supply_yesterday); std::vector PROPERTY(market_sell_order_quantities); std::vector> PROPERTY(market_sell_order_callbacks); GoodInstance(GoodDefinition const& new_good_definition); public: GoodInstance(GoodInstance&&) = default; void add_market_sell_order(const fixed_point_t quantity, const std::function callback); void clear_orders(); }; struct GoodInstanceManager { private: IdentifierRegistry IDENTIFIER_REGISTRY(good_instance); public: IDENTIFIER_REGISTRY_NON_CONST_ACCESSORS(good_instance); bool setup(GoodDefinitionManager const& good_definition_manager); }; }