X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/1108cd13922be13921cc6c89f78e4ee3ae88af52..ebd170a764ab9660adee464588cda1801c7986b4:/include/stg/tariff_conf.h diff --git a/include/stg/tariff_conf.h b/include/stg/tariff_conf.h index b554e14a..0a4f988b 100644 --- a/include/stg/tariff_conf.h +++ b/include/stg/tariff_conf.h @@ -18,33 +18,22 @@ * Author : Boris Mikhailenko */ - /* - $Revision: 1.9 $ - $Date: 2010/10/05 20:41:11 $ - $Author: faust $ - */ +#pragma once -#ifndef TARIFF_CONF_H -#define TARIFF_CONF_H +#include "tariff.h" +#include "const.h" +#include "splice.h" #include #include +#include -#include "resetable.h" -#include "const.h" - -//----------------------------------------------------------------------------- -enum +namespace STG { - TRAFF_UP = 0, - TRAFF_DOWN, - TRAFF_UP_DOWN, - TRAFF_MAX -}; //----------------------------------------------------------------------------- -struct DIRPRICE_DATA +struct DirPriceData { - DIRPRICE_DATA() + DirPriceData() noexcept : hDay(0), mDay(0), hNight(0), @@ -56,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; @@ -70,178 +65,241 @@ 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() - {} - - 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() = 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) + {} + + 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; - dd.hDay = hDay.data(); - dd.hNight = hNight.data(); - dd.mDay = mDay.data(); - dd.mNight = mNight.data(); - dd.noDiscount = noDiscount.data(); - dd.priceDayA = priceDayA.data(); - dd.priceDayB = priceDayB.data(); - - dd.priceNightA = priceNightA.data(); - dd.priceNightB = priceNightB.data(); - dd.singlePrice = singlePrice.data(); - dd.threshold = threshold.data(); - return dd; - } - - RESETABLE hDay; - RESETABLE mDay; - RESETABLE hNight; - RESETABLE mNight; - RESETABLE priceDayA; - RESETABLE priceNightA; - RESETABLE priceDayB; - RESETABLE priceNightB; - RESETABLE threshold; - RESETABLE singlePrice; - RESETABLE noDiscount; + } + + 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); + } + + 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; + } + + 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; - int traffType; - double passiveCost; - std::string name; + double fee; + double free; + Tariff::TraffType traffType; + double passiveCost; + std::string name; + Tariff::Period period; + Tariff::ChangePolicy changePolicy; + time_t changePolicyTimeout; - TARIFF_CONF() + TariffConf() noexcept : fee(0), free(0), - traffType(TRAFF_UP_DOWN), + traffType(Tariff::TRAFF_UP_DOWN), passiveCost(0), - name() - {} + period(Tariff::MONTH), + changePolicy(Tariff::ALLOW), + changePolicyTimeout(0) + {} - TARIFF_CONF(const std::string & n) + explicit TariffConf(const std::string & n) noexcept : fee(0), free(0), - traffType(TRAFF_UP_DOWN), + traffType(Tariff::TRAFF_UP_DOWN), passiveCost(0), - name(n) - {} + name(n), + 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() - {} - - 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; passiveCost = tc.passiveCost; name = tc.name; + period = tc.period; + changePolicy = tc.changePolicy; + changePolicyTimeout = tc.changePolicyTimeout; return *this; - } - - TARIFF_CONF GetData() const - { - TARIFF_CONF tc; - tc.fee = fee.data(); - tc.free = free.data(); - tc.name = name.data(); - tc.passiveCost = passiveCost.data(); - tc.traffType = traffType.data(); - return tc; - } - - RESETABLE fee; - RESETABLE free; - RESETABLE traffType; - RESETABLE passiveCost; - RESETABLE name; + } + + TariffConfOpt(const TariffConfOpt&) = default; + TariffConfOpt& operator=(const TariffConfOpt&) = default; + TariffConfOpt(TariffConfOpt&&) = default; + TariffConfOpt& operator=(TariffConfOpt&&) = default; + + 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; + } + + 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) + {} - TARIFF_DATA(const std::string & name) + explicit TariffData(const std::string& name) noexcept : tariffConf(name), dirPrice(DIR_NUM) - {} - - TARIFF_DATA(const TARIFF_DATA & td) - : tariffConf(td.tariffConf), - dirPrice(td.dirPrice) - {} + {} - TARIFF_DATA & operator=(const TARIFF_DATA & td) - { - tariffConf = td.tariffConf; - dirPrice = td.dirPrice; - return *this; - } + 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; + + TariffDataOpt() + : dirPrice(DIR_NUM) + {} - TARIFF_DATA_RES() - : tariffConf(), + TariffDataOpt(const TariffData& data) noexcept + : tariffConf(data.tariffConf), dirPrice(DIR_NUM) - {} - - 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; - } + { + for (size_t i = 0; i < DIR_NUM; ++i) + dirPrice[i] = data.dirPrice[i]; + } + + 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; + } + + 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 +}