diff --git a/example/currency.cpp b/example/currency.cpp index 6f280659..f6699376 100644 --- a/example/currency.cpp +++ b/example/currency.cpp @@ -24,6 +24,7 @@ #ifdef MP_UNITS_IMPORT_STD import std; #else +#include #include #include #include @@ -66,8 +67,9 @@ static_assert(!std::equality_comparable_with, quantity -[[nodiscard]] double exchange_rate() +[[nodiscard]] double exchange_rate(std::chrono::sys_seconds timestamp) { + (void)timestamp; // get conversion ratios for this timestamp if constexpr (From == us_dollar && To == euro) return 0.9215; else if constexpr (From == euro && To == us_dollar) return 1.0848; // ... @@ -78,8 +80,9 @@ template [[nodiscard]] std::string_view to_string_view(Unit auto u) { return u.symbol.ascii().c_str(); } template -[[nodiscard]] double exchange_rate() +[[nodiscard]] double exchange_rate(std::chrono::sys_seconds timestamp) { + (void)timestamp; // get conversion ratios for this timestamp static const std::map, double> rates = { {{"USD", "EUR"}, 0.9215}, {{"EUR", "USD"}, 1.0848}, // ... @@ -90,25 +93,29 @@ template #endif -template auto To, ReferenceOf auto From, typename Rep> -quantity exchange_to(quantity q) +template auto To, QuantityOf From> +QuantityOf auto exchange_to(From q, std::chrono::sys_seconds timestamp) { - return static_cast(exchange_rate() * q.numerical_value()) * To; + const auto rate = static_cast(exchange_rate(timestamp) * q.numerical_value_in(q.unit)); + return rate * From::quantity_spec[To]; } -template auto To, ReferenceOf auto From, auto PO, typename Rep> -quantity_point exchange_to(quantity_point q) +template auto To, QuantityPointOf From> +QuantityPointOf auto exchange_to(From qp, std::chrono::sys_seconds timestamp) { - return quantity_point{ - static_cast(exchange_rate() * q.quantity_from_zero().numerical_value_in(q.unit)) * To}; + const auto rate = static_cast(exchange_rate(timestamp) * + qp.quantity_from_zero().numerical_value_in(qp.unit)); + return quantity_point{rate * From::quantity_spec[To], From::point_origin}; } int main() { using namespace unit_symbols; + using namespace std::chrono; + const auto timestamp = time_point_cast(system_clock::now() - hours{24}); const quantity_point price_usd{100 * USD}; - const quantity_point price_euro = exchange_to(price_usd); + const quantity_point price_euro = exchange_to(price_usd, timestamp); std::cout << price_usd.quantity_from_zero() << " -> " << price_euro.quantity_from_zero() << "\n"; // std::cout << price_usd.quantity_from_zero() + price_euro.quantity_from_zero() << "\n"; // does