fork download
  1. #include <iostream>
  2. #include <chrono>
  3. #include <ratio>
  4. #include <vector>
  5. #include <numeric>
  6. #include <algorithm>
  7.  
  8. template <class Rep, class Period = std::ratio<1> >
  9. using tmp_t = std::chrono::duration<Rep, Period>;
  10.  
  11. typedef tmp_t<int64_t> dollar_t;
  12. typedef tmp_t<int64_t, std::ratio<1,100>> cent_t;
  13.  
  14. //typedef tmp_t<int64_t, std::ratio<1,100>> store_money_t;
  15. struct store_money_t : cent_t {
  16. store_money_t(cent_t::rep v = 0, bool null = false) : cent_t(v), is_null(null) {}
  17. store_money_t(cent_t c) : cent_t(c) {}
  18. store_money_t(dollar_t d) : cent_t(d) {}
  19. bool is_null = false;
  20. };
  21.  
  22. dollar_t dollar_lost_cents_cast(cent_t cents) { return std::chrono::duration_cast<dollar_t>(cents); }
  23. std::ostream& operator<<(std::ostream& os, store_money_t store_money) {
  24. os << store_money.count()/100 << "." << store_money.count()%100;
  25. return os;
  26. }
  27.  
  28. store_money_t null_money(0, true);
  29. bool not_null_money(store_money_t &m) { return !m.is_null; }
  30.  
  31. int main() {
  32.  
  33. // example
  34. store_money_t store_money = dollar_t(2) + cent_t(20);
  35. store_money += dollar_t(7);
  36. store_money += cent_t(18);
  37.  
  38. cent_t cents = store_money;
  39. dollar_t dollars = dollar_lost_cents_cast(cents);
  40.  
  41. std::cout << "dollar_lost_cents_cast = " << dollar_lost_cents_cast(store_money).count() <<
  42. ", store_money = " << store_money << std::endl;
  43.  
  44. // INSERT INTO Table ( Column1 ) VALUES ( 0), ( null ), ( 6 )
  45. // SELECT AVG( Column1 ) FROM Table
  46. std::vector<store_money_t> user_accounts = { cent_t(0), null_money, dollar_t(6) };
  47.  
  48. store_money_t sum = std::accumulate (user_accounts.begin(), user_accounts.end(), store_money_t());
  49. std::cout << "sum = " << sum << std::endl;
  50.  
  51. store_money_t::rep count = std::count_if(user_accounts.begin(), user_accounts.end(), not_null_money);
  52. std::cout << "count = " << count << std::endl;
  53.  
  54. store_money_t avg = sum / count;
  55. std::cout << "avg = " << avg << std::endl;
  56.  
  57. // SELECT 0 + null + 6 FROM dual
  58. store_money_t sum_select_statment = cent_t(0) + null_money + dollar_t(6);
  59. std::cout << "sum_select_statment = " << sum_select_statment << std::endl;
  60.  
  61. return 0;
  62. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
dollar_lost_cents_cast = 9, store_money = 9.38
sum = 6.0
count = 2
avg = 3.0
sum_select_statment = 6.0