Scorum
asset.hpp
Go to the documentation of this file.
1 #pragma once
4 
5 #include <scorum/utils/fraction.hpp>
6 #include <scorum/utils/extra_high_bit_operations.hpp>
7 
9 
10 namespace scorum {
11 namespace protocol {
12 
13 using asset_symbol_type = uint64_t;
14 
15 struct asset
16 {
18  : amount(0)
19  , _symbol(SCORUM_SYMBOL)
20  {
21  // used for fc::variant
22  }
23 
25  : amount(a)
26  , _symbol(id)
27  {
28  _check_symbol();
29  }
30 
33  {
34  return _symbol;
35  }
36 
38  {
39  return asset(SCORUM_MAX_SHARE_SUPPLY, id);
40  }
42  {
43  return asset(0, id);
44  }
45 
46  double to_real() const
47  {
48  return double(amount.value) / precision();
49  }
50 
51  uint8_t decimals() const;
52  std::string symbol_name() const;
53  int64_t precision() const;
54 
55  static asset from_string(const std::string& from);
56  std::string to_string() const;
57 
58  template <typename T> asset& operator+=(const T& o_amount)
59  {
60  amount += o_amount;
61  return *this;
62  }
63  asset& operator+=(const asset& o)
64  {
65  FC_ASSERT(_symbol == o._symbol);
66  return *this += o.amount;
67  }
68  template <typename T> asset& operator-=(const T& o_amount)
69  {
70  amount -= o_amount;
71  return *this;
72  }
73  asset& operator-=(const asset& o)
74  {
75  FC_ASSERT(_symbol == o._symbol);
76  return *this -= o.amount;
77  }
78  asset operator-() const
79  {
80  return asset(-amount, _symbol);
81  }
82  template <typename T> asset& operator*=(const T& o_amount)
83  {
84  amount *= o_amount;
85  return *this;
86  }
87  template <typename T> asset& operator/=(const T& o_amount)
88  {
89  amount /= o_amount;
90  return *this;
91  }
92  template <typename FractionalNumerator, typename FractionalDenominator>
93  asset& operator*=(const utils::fraction<FractionalNumerator, FractionalDenominator>& fraction)
94  {
95  amount = utils::multiply_by_fractional(amount.value, fraction.numerator, fraction.denominator);
96  return *this;
97  }
98  asset& operator*=(const odds& k)
99  {
100  return (*this) *= (odds_fraction_type)k;
101  }
102  friend bool operator==(const asset& a, const asset& b)
103  {
104  return std::tie(a._symbol, a.amount) == std::tie(b._symbol, b.amount);
105  }
106  friend bool operator<(const asset& a, const asset& b)
107  {
108  FC_ASSERT(a._symbol == b._symbol);
109  return std::tie(a.amount, a._symbol) < std::tie(b.amount, b._symbol);
110  }
111  friend bool operator<=(const asset& a, const asset& b)
112  {
113  return (a == b) || (a < b);
114  }
115  friend bool operator!=(const asset& a, const asset& b)
116  {
117  return !(a == b);
118  }
119  friend bool operator>(const asset& a, const asset& b)
120  {
121  return !(a <= b);
122  }
123  friend bool operator>=(const asset& a, const asset& b)
124  {
125  return !(a < b);
126  }
127  template <typename T> friend asset operator+(const asset& a, const T& b_amount)
128  {
129  asset ret(a);
130  ret += b_amount;
131  return ret;
132  }
133  friend asset operator+(const asset& a, const asset& b)
134  {
135  asset ret(a);
136  ret += b;
137  return ret;
138  }
139  template <typename T> friend asset operator-(const asset& a, const T& b_amount)
140  {
141  asset ret(a);
142  ret -= b_amount;
143  return ret;
144  }
145  friend asset operator-(const asset& a, const asset& b)
146  {
147  asset ret(a);
148  ret -= b;
149  return ret;
150  }
151  template <typename T> friend asset operator*(const asset& a, const T& b_amount)
152  {
153  asset ret(a);
154  ret *= b_amount;
155  return ret;
156  }
157  template <typename FractionalNumerator, typename FractionalDenominator>
158  friend asset operator*(const asset& a, const utils::fraction<FractionalNumerator, FractionalDenominator>& fraction)
159  {
160  asset ret(a);
161  ret *= fraction;
162  return ret;
163  }
164  friend asset operator*(const asset& a, const odds& k)
165  {
166  asset ret(a);
167  ret *= k;
168  return ret;
169  }
170  template <typename T> friend asset operator/(const asset& a, const T& b_amount)
171  {
172  asset ret(a);
173  ret /= b_amount;
174  return ret;
175  }
176 
177  friend asset operator%(const asset& a, const asset& b)
178  {
179  FC_ASSERT(a._symbol == b._symbol);
180  asset ret(a);
181  ret.amount %= b.amount;
182  return ret;
183  }
184 
185 private:
186  friend struct fc::reflector<asset>;
187 
188  asset_symbol_type _symbol;
189 
190  // throw fc::assert_exception is symbol unknown
191  void _check_symbol();
192 
193  void _set_decimals(uint8_t d);
194 };
195 
196 template <typename Stream> Stream& operator<<(Stream& stream, const scorum::protocol::asset& a)
197 {
198  stream << a.to_string();
199  return stream;
200 }
201 
202 template <typename Stream> Stream& operator>>(Stream& stream, scorum::protocol::asset& a)
203 {
204  std::string str;
205  stream >> str;
207  return stream;
208 }
209 } // namespace protocol
210 } // namespace scorum
211 
212 namespace fc {
213 
214 inline void to_variant(const scorum::protocol::asset& var, fc::variant& vo)
215 {
216  vo = var.to_string();
217 }
218 
219 inline void from_variant(const fc::variant& var, scorum::protocol::asset& vo)
220 {
221  vo = scorum::protocol::asset::from_string(var.as_string());
222 }
223 
224 } // namespace fc
225 
226 FC_REFLECT_TYPENAME(scorum::protocol::share_type)
227 
228 FC_REFLECT(scorum::protocol::asset, (amount)(_symbol))
#define SCORUM_SYMBOL
Definition: config.hpp:102
#define SCORUM_MAX_SHARE_SUPPLY
Definition: config.hpp:106
FC_REFLECT(appender_args,(appender)(stream)) FC_REFLECT_DERIVED(file_appender_args
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
fc::safe< share_value_type > share_type
Definition: types.hpp:73
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
uint64_t asset_symbol_type
Definition: asset.hpp:13
Stream & operator<<(Stream &stream, const scorum::protocol::asset &a)
Definition: asset.hpp:196
Definition: asset.cpp:15
friend asset operator*(const asset &a, const utils::fraction< FractionalNumerator, FractionalDenominator > &fraction)
Definition: asset.hpp:158
asset & operator-=(const asset &o)
Definition: asset.hpp:73
friend asset operator*(const asset &a, const T &b_amount)
Definition: asset.hpp:151
friend asset operator-(const asset &a, const asset &b)
Definition: asset.hpp:145
static asset maximum(asset_symbol_type id)
Definition: asset.hpp:37
asset & operator-=(const T &o_amount)
Definition: asset.hpp:68
asset_symbol_type symbol() const
Definition: asset.hpp:32
std::string to_string() const
Definition: asset.cpp:69
int64_t precision() const
Definition: asset.cpp:48
share_type amount
Definition: asset.hpp:31
asset & operator*=(const odds &k)
Definition: asset.hpp:98
static asset min(asset_symbol_type id)
Definition: asset.hpp:41
friend bool operator<(const asset &a, const asset &b)
Definition: asset.hpp:106
friend asset operator+(const asset &a, const asset &b)
Definition: asset.hpp:133
asset & operator/=(const T &o_amount)
Definition: asset.hpp:87
friend asset operator/(const asset &a, const T &b_amount)
Definition: asset.hpp:170
asset & operator+=(const T &o_amount)
Definition: asset.hpp:58
friend bool operator>(const asset &a, const asset &b)
Definition: asset.hpp:119
friend bool operator==(const asset &a, const asset &b)
Definition: asset.hpp:102
static asset from_string(const std::string &from)
Definition: asset.cpp:85
friend asset operator*(const asset &a, const odds &k)
Definition: asset.hpp:164
friend bool operator<=(const asset &a, const asset &b)
Definition: asset.hpp:111
friend asset operator+(const asset &a, const T &b_amount)
Definition: asset.hpp:127
friend bool operator>=(const asset &a, const asset &b)
Definition: asset.hpp:123
asset(share_type a, asset_symbol_type id)
Definition: asset.hpp:24
asset & operator*=(const utils::fraction< FractionalNumerator, FractionalDenominator > &fraction)
Definition: asset.hpp:93
friend asset operator%(const asset &a, const asset &b)
Definition: asset.hpp:177
friend asset operator-(const asset &a, const T &b_amount)
Definition: asset.hpp:139
std::string symbol_name() const
Definition: asset.cpp:41
asset & operator*=(const T &o_amount)
Definition: asset.hpp:82
asset operator-() const
Definition: asset.hpp:78
asset & operator+=(const asset &o)
Definition: asset.hpp:63
friend bool operator!=(const asset &a, const asset &b)
Definition: asset.hpp:115
uint8_t decimals() const
Definition: asset.cpp:33
double to_real() const
Definition: asset.hpp:46