X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/22cb2560274e05e6490cf964cbbeb74a1991c642..be1b46cc784e43cd28c5521bdcde79bd7463fb40:/include/stg/tariff_conf.h diff --git a/include/stg/tariff_conf.h b/include/stg/tariff_conf.h index f705d0a0..0a4f988b 100644 --- a/include/stg/tariff_conf.h +++ b/include/stg/tariff_conf.h @@ -18,26 +18,22 @@ * Author : Boris Mikhailenko */ - /* - $Revision: 1.9 $ - $Date: 2010/10/05 20:41:11 $ - $Author: faust $ - */ - -#ifndef TARIFF_CONF_H -#define TARIFF_CONF_H +#pragma once #include "tariff.h" -#include "resetable.h" #include "const.h" +#include "splice.h" #include #include +#include +namespace STG +{ //----------------------------------------------------------------------------- -struct DIRPRICE_DATA +struct DirPriceData { - DIRPRICE_DATA() + DirPriceData() noexcept : hDay(0), mDay(0), hNight(0), @@ -49,7 +45,13 @@ struct DIRPRICE_DATA threshold(0), singlePrice(0), noDiscount(0) - {} + {} + + DirPriceData(const DirPriceData&) = default; + DirPriceData& operator=(const DirPriceData&) = default; + DirPriceData(DirPriceData&&) = default; + DirPriceData& operator=(DirPriceData&&) = default; + int hDay; int mDay; int hNight; @@ -63,132 +65,143 @@ struct DIRPRICE_DATA int noDiscount; // Do not use threshold }; //----------------------------------------------------------------------------- -struct DIRPRICE_DATA_RES +struct DirPriceDataOpt { - DIRPRICE_DATA_RES() - : hDay(), - mDay(), - hNight(), - mNight(), - priceDayA(), - priceNightA(), - priceDayB(), - priceNightB(), - threshold(), - singlePrice(), - noDiscount() - {} + DirPriceDataOpt() = default; + + DirPriceDataOpt(const DirPriceData& data) noexcept + : hDay(data.hDay), + mDay(data.mDay), + hNight(data.hNight), + mNight(data.mNight), + priceDayA(data.priceDayA), + priceNightA(data.priceNightA), + priceDayB(data.priceDayB), + priceNightB(data.priceNightB), + threshold(data.threshold), + singlePrice(data.singlePrice), + noDiscount(data.noDiscount) + {} - DIRPRICE_DATA_RES & operator= (const DIRPRICE_DATA & rvalue) - { - hDay = rvalue.hDay; - mDay = rvalue.mDay; - hNight = rvalue.hNight; - mNight = rvalue.mNight; - priceDayA = rvalue.priceDayA; - priceNightA = rvalue.priceNightA; - priceDayB = rvalue.priceDayB; - priceNightB = rvalue.priceNightB; - threshold = rvalue.threshold; - singlePrice = rvalue.singlePrice; - noDiscount = rvalue.noDiscount; + DirPriceDataOpt(const DirPriceDataOpt&) = default; + DirPriceDataOpt& operator=(const DirPriceDataOpt&) = default; + DirPriceDataOpt(DirPriceDataOpt&&) = default; + DirPriceDataOpt& operator=(DirPriceDataOpt&&) = default; + + DirPriceDataOpt & operator=(const DirPriceData& rhs) noexcept + { + hDay = rhs.hDay; + mDay = rhs.mDay; + hNight = rhs.hNight; + mNight = rhs.mNight; + priceDayA = rhs.priceDayA; + priceNightA = rhs.priceNightA; + priceDayB = rhs.priceDayB; + priceNightB = rhs.priceNightB; + threshold = rhs.threshold; + singlePrice = rhs.singlePrice; + noDiscount = rhs.noDiscount; return *this; - } + } - DIRPRICE_DATA GetData() const - { - DIRPRICE_DATA dd; - hDay.maybeSet(dd.hDay); - hNight.maybeSet(dd.hNight); - mDay.maybeSet(dd.mDay); - mNight.maybeSet(dd.mNight); - noDiscount.maybeSet(dd.noDiscount); - priceDayA.maybeSet(dd.priceDayA); - priceDayB.maybeSet(dd.priceDayB); - priceNightA.maybeSet(dd.priceNightA); - priceNightB.maybeSet(dd.priceNightB); - singlePrice.maybeSet(dd.singlePrice); - threshold.maybeSet(dd.threshold); - return dd; - } + void splice(const DirPriceDataOpt & rhs) noexcept + { + STG::splice(hDay, rhs.hDay); + STG::splice(mDay, rhs.mDay); + STG::splice(hNight, rhs.hNight); + STG::splice(mNight, rhs.mNight); + STG::splice(priceDayA, rhs.priceDayA); + STG::splice(priceNightA, rhs.priceNightA); + STG::splice(priceDayB, rhs.priceDayB); + STG::splice(priceNightB, rhs.priceNightB); + STG::splice(threshold, rhs.threshold); + STG::splice(singlePrice, rhs.singlePrice); + STG::splice(noDiscount, rhs.noDiscount); + } - void Splice(const DIRPRICE_DATA_RES & rhs) - { - hDay.splice(rhs.hDay); - mDay.splice(rhs.mDay); - hNight.splice(rhs.hNight); - mNight.splice(rhs.mNight); - priceDayA.splice(rhs.priceDayA); - priceNightA.splice(rhs.priceNightA); - priceDayB.splice(rhs.priceDayB); - priceNightB.splice(rhs.priceNightB); - threshold.splice(rhs.threshold); - singlePrice.splice(rhs.singlePrice); - noDiscount.splice(rhs.noDiscount); - } + DirPriceData get(const DirPriceData& defaultValue) const noexcept + { + DirPriceData res; + res.hDay = hDay.value_or(defaultValue.hDay); + res.mDay = mDay.value_or(defaultValue.mDay); + res.hNight = hNight.value_or(defaultValue.hNight); + res.mNight = mNight.value_or(defaultValue.mNight); + res.priceDayA = priceDayA.value_or(defaultValue.priceDayA); + res.priceNightA = priceNightA.value_or(defaultValue.priceNightA); + res.priceDayB = priceDayB.value_or(defaultValue.priceDayB); + res.priceNightB = priceNightB.value_or(defaultValue.priceNightB); + res.threshold = threshold.value_or(defaultValue.threshold); + res.singlePrice = singlePrice.value_or(defaultValue.singlePrice); + res.noDiscount = noDiscount.value_or(defaultValue.noDiscount); + return res; + } - RESETABLE hDay; - RESETABLE mDay; - RESETABLE hNight; - RESETABLE mNight; - RESETABLE priceDayA; - RESETABLE priceNightA; - RESETABLE priceDayB; - RESETABLE priceNightB; - RESETABLE threshold; - RESETABLE singlePrice; - RESETABLE noDiscount; + std::optional hDay; + std::optional mDay; + std::optional hNight; + std::optional mNight; + std::optional priceDayA; + std::optional priceNightA; + std::optional priceDayB; + std::optional priceNightB; + std::optional threshold; + std::optional singlePrice; + std::optional noDiscount; }; //----------------------------------------------------------------------------- -struct TARIFF_CONF +struct TariffConf { double fee; double free; - TARIFF::TRAFF_TYPE traffType; + Tariff::TraffType traffType; double passiveCost; std::string name; - TARIFF::PERIOD period; - TARIFF::CHANGE_POLICY changePolicy; + Tariff::Period period; + Tariff::ChangePolicy changePolicy; time_t changePolicyTimeout; - TARIFF_CONF() + TariffConf() noexcept : fee(0), free(0), - traffType(TARIFF::TRAFF_UP_DOWN), + traffType(Tariff::TRAFF_UP_DOWN), passiveCost(0), - name(), - period(TARIFF::MONTH), - changePolicy(TARIFF::ALLOW), + period(Tariff::MONTH), + changePolicy(Tariff::ALLOW), changePolicyTimeout(0) - {} + {} - explicit TARIFF_CONF(const std::string & n) + explicit TariffConf(const std::string & n) noexcept : fee(0), free(0), - traffType(TARIFF::TRAFF_UP_DOWN), + traffType(Tariff::TRAFF_UP_DOWN), passiveCost(0), name(n), - period(TARIFF::MONTH), - changePolicy(TARIFF::ALLOW), + period(Tariff::MONTH), + changePolicy(Tariff::ALLOW), changePolicyTimeout(0) - {} + {} + + TariffConf(const TariffConf&) = default; + TariffConf& operator=(const TariffConf&) = default; + TariffConf(TariffConf&&) = default; + TariffConf& operator=(TariffConf&&) = default; }; //----------------------------------------------------------------------------- -struct TARIFF_CONF_RES +struct TariffConfOpt { - TARIFF_CONF_RES() - : fee(), - free(), - traffType(), - passiveCost(), - name(), - period(), - changePolicy(), - changePolicyTimeout() - {} - - TARIFF_CONF_RES & operator=(const TARIFF_CONF & tc) - { + TariffConfOpt() = default; + TariffConfOpt(const TariffConf& data) noexcept + : fee(data.fee), + free(data.free), + traffType(data.traffType), + passiveCost(data.passiveCost), + name(data.name), + period(data.period), + changePolicy(data.changePolicy), + changePolicyTimeout(data.changePolicyTimeout) + {} + TariffConfOpt& operator=(const TariffConf & tc) noexcept + { fee = tc.fee; free = tc.free; traffType = tc.traffType; @@ -198,74 +211,95 @@ struct TARIFF_CONF_RES changePolicy = tc.changePolicy; changePolicyTimeout = tc.changePolicyTimeout; return *this; - } + } + + TariffConfOpt(const TariffConfOpt&) = default; + TariffConfOpt& operator=(const TariffConfOpt&) = default; + TariffConfOpt(TariffConfOpt&&) = default; + TariffConfOpt& operator=(TariffConfOpt&&) = default; - TARIFF_CONF GetData() const - { - TARIFF_CONF tc; - fee.maybeSet(tc.fee); - free.maybeSet(tc.free); - name.maybeSet(tc.name); - passiveCost.maybeSet(tc.passiveCost); - traffType.maybeSet(tc.traffType); - period.maybeSet(tc.period); - changePolicy.maybeSet(tc.changePolicy); - changePolicyTimeout.maybeSet(tc.changePolicyTimeout); - return tc; - } + TariffConf get(const TariffConf& defaultValue) const noexcept + { + TariffConf res; + res.fee = fee.value_or(defaultValue.fee); + res.free = free.value_or(defaultValue.free); + res.traffType = traffType.value_or(defaultValue.traffType); + res.passiveCost = passiveCost.value_or(defaultValue.passiveCost); + res.name = name.value_or(defaultValue.name); + res.period = period.value_or(defaultValue.period); + res.changePolicy = changePolicy.value_or(defaultValue.changePolicy); + res.changePolicyTimeout = changePolicyTimeout.value_or(defaultValue.changePolicyTimeout); + return res; + } - RESETABLE fee; - RESETABLE free; - RESETABLE traffType; - RESETABLE passiveCost; - RESETABLE name; - RESETABLE period; - RESETABLE changePolicy; - RESETABLE changePolicyTimeout; + std::optional fee; + std::optional free; + std::optional traffType; + std::optional passiveCost; + std::optional name; + std::optional period; + std::optional changePolicy; + std::optional changePolicyTimeout; }; //----------------------------------------------------------------------------- -struct TARIFF_DATA +struct TariffData { - TARIFF_CONF tariffConf; - std::vector dirPrice; + TariffConf tariffConf; + std::vector dirPrice; - TARIFF_DATA() - : tariffConf(), - dirPrice(DIR_NUM) - {} + TariffData() noexcept + : dirPrice(DIR_NUM) + {} - explicit TARIFF_DATA(const std::string & name) + explicit TariffData(const std::string& name) noexcept : tariffConf(name), dirPrice(DIR_NUM) - {} + {} + + TariffData(const TariffData&) = default; + TariffData& operator=(const TariffData&) = default; + TariffData(TariffData&&) = default; + TariffData& operator=(TariffData&&) = default; }; //----------------------------------------------------------------------------- -struct TARIFF_DATA_RES +struct TariffDataOpt { - TARIFF_CONF_RES tariffConf; - std::vector dirPrice; + TariffConfOpt tariffConf; + std::vector dirPrice; - TARIFF_DATA_RES() - : tariffConf(), + TariffDataOpt() + : dirPrice(DIR_NUM) + {} + + TariffDataOpt(const TariffData& data) noexcept + : tariffConf(data.tariffConf), dirPrice(DIR_NUM) - {} + { + for (size_t i = 0; i < DIR_NUM; ++i) + dirPrice[i] = data.dirPrice[i]; + } - TARIFF_DATA_RES & operator=(const TARIFF_DATA & td) - { + TariffDataOpt& operator=(const TariffData& td) noexcept + { tariffConf = td.tariffConf; for (size_t i = 0; i < DIR_NUM; ++i) dirPrice[i] = td.dirPrice[i]; return *this; - } + } - TARIFF_DATA GetData() const - { - TARIFF_DATA td; - td.tariffConf = tariffConf.GetData(); - for (size_t i = 0; i < DIR_NUM; i++) - td.dirPrice[i] = dirPrice[i].GetData(); - return td; - } + TariffDataOpt(const TariffDataOpt&) = default; + TariffDataOpt& operator=(const TariffDataOpt&) = default; + TariffDataOpt(TariffDataOpt&&) = default; + TariffDataOpt& operator=(TariffDataOpt&&) = default; + + TariffData get(const TariffData& defaultValue) const noexcept + { + TariffData res; + res.tariffConf = tariffConf.get(defaultValue.tariffConf); + for (size_t i = 0; i < DIR_NUM; ++i) + res.dirPrice[i] = dirPrice[i].get(defaultValue.dirPrice[i]); + return res; + } }; //----------------------------------------------------------------------------- -#endif +}