Scorum
odds.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <scorum/utils/fraction.hpp>
4 
5 #include <tuple>
6 
7 namespace scorum {
8 namespace protocol {
9 
10 using odds_value_type = int32_t;
11 using odds_fraction_type = utils::fraction<odds_value_type, odds_value_type>;
12 
13 class odds
14 {
15  void initialize(const odds_value_type& base_n, const odds_value_type& base_d);
16 
17 public:
18  odds() = default;
19 
20  odds(const odds_value_type& base_n, const odds_value_type& base_d)
21  {
22  initialize(base_n, base_d);
23  }
24 
25  template <typename FractionalNumerator, typename FractionalDenominator>
26  odds(const utils::fraction<FractionalNumerator, FractionalDenominator>& base)
27  {
28  if ((sizeof(FractionalNumerator) > sizeof(odds_value_type))
29  && (base.numerator > (FractionalNumerator)std::numeric_limits<odds_value_type>::max()
30  || base.numerator < (FractionalNumerator)std::numeric_limits<odds_value_type>::min()))
31  {
32  FC_CAPTURE_AND_THROW(fc::overflow_exception, (base.numerator));
33  }
34  if ((sizeof(FractionalDenominator) > sizeof(odds_value_type))
35  && (base.denominator > (FractionalDenominator)std::numeric_limits<odds_value_type>::max()
36  || base.denominator < (FractionalDenominator)std::numeric_limits<odds_value_type>::min()))
37  {
38  FC_CAPTURE_AND_THROW(fc::overflow_exception, (base.denominator));
39  }
40  initialize((odds_value_type)base.numerator, (odds_value_type)base.denominator);
41  }
42 
43  friend bool operator==(const odds& a, const odds& b)
44  {
45  return a._simplified == b._simplified;
46  }
47 
48  odds_fraction_type base() const;
49 
51 
53 
54  operator odds_fraction_type() const
55  {
56  return simplified();
57  }
58 
59  operator bool() const
60  {
61  return _simplified != std::tuple<odds_value_type, odds_value_type>();
62  }
63 
64  static odds from_string(const std::string& from);
65  std::string to_string() const;
66 
67 private:
68  std::tuple<odds_value_type, odds_value_type> _base;
69  std::tuple<odds_value_type, odds_value_type> _simplified;
70  std::tuple<odds_value_type, odds_value_type> _inverted;
71 };
72 
73 template <typename Stream> Stream& operator<<(Stream& stream, const scorum::protocol::odds& o)
74 {
75  stream << o.to_string();
76  return stream;
77 }
78 
79 template <typename Stream> Stream& operator>>(Stream& stream, scorum::protocol::odds& o)
80 {
81  std::string str;
82  stream >> str;
84  return stream;
85 }
86 } // namespace protocol
87 } // namespace scorum
88 
89 FC_REFLECT_EMPTY(scorum::protocol::odds)
90 
91 namespace fc {
92 void to_variant(const scorum::protocol::odds& var, fc::variant& vo);
93 void from_variant(const fc::variant& var, scorum::protocol::odds& vo);
94 }
odds(const utils::fraction< FractionalNumerator, FractionalDenominator > &base)
Definition: odds.hpp:26
std::string to_string() const
Definition: odds.cpp:54
odds(const odds_value_type &base_n, const odds_value_type &base_d)
Definition: odds.hpp:20
static odds from_string(const std::string &from)
Definition: odds.cpp:34
odds_fraction_type simplified() const
Definition: odds.cpp:24
friend bool operator==(const odds &a, const odds &b)
Definition: odds.hpp:43
odds_fraction_type base() const
Definition: odds.cpp:19
odds_fraction_type inverted() const
Definition: odds.cpp:29
Definition: game.cpp:4
void to_variant(const game_type &game, fc::variant &var)
Definition: game.cpp:8
void from_variant(const fc::variant &var, game_type &game)
Definition: game.cpp:12
utils::fraction< odds_value_type, odds_value_type > odds_fraction_type
Definition: odds.hpp:11
Stream & operator>>(Stream &stream, scorum::protocol::asset &a)
Definition: asset.hpp:202
int32_t odds_value_type
Definition: odds.hpp:10
Stream & operator<<(Stream &stream, const scorum::protocol::asset &a)
Definition: asset.hpp:196
Definition: asset.cpp:15