Line data Source code
1 : /**
2 : * Copyright Soramitsu Co., Ltd. All Rights Reserved.
3 : * SPDX-License-Identifier: Apache-2.0
4 : */
5 :
6 : #include "interfaces/common_objects/amount.hpp"
7 :
8 : #include <regex>
9 :
10 : #include "utils/string_builder.hpp"
11 :
12 : namespace shared_model {
13 : namespace interface {
14 : Amount::Amount(const std::string &amount) : Amount(std::string(amount)) {}
15 : Amount::Amount(std::string &&amount)
16 2370 : : amount_(std::move(amount)),
17 2370 : precision_(0),
18 : multiprecision_repr_([this] {
19 2370 : static const std::regex r("([0-9]+)(\\.([0-9]+))?");
20 : // 123.456 will have the following groups:
21 : // [0] -> 123.456, [1] -> 123
22 : // [2] -> .456, [3] -> 456
23 2370 : std::smatch match;
24 2370 : if (std::regex_match(this->amount_, match, r)
25 2370 : && match.size() == 4) {
26 2352 : this->precision_ = match[3].length();
27 2352 : auto str = match[0].str();
28 2352 : size_t pos = match[1].length();
29 : // remove dot if it exist
30 2352 : if (pos < str.size()) {
31 2279 : str.erase(str.begin() + pos);
32 2279 : }
33 : // remove leading zeroes
34 2352 : str.erase(0,
35 2352 : std::min(str.find_first_not_of('0'), str.size() - 1));
36 2352 : return boost::multiprecision::uint256_t(str);
37 2352 : }
38 18 : return std::numeric_limits<boost::multiprecision::uint256_t>::min();
39 2370 : }()) {}
40 :
41 : Amount::Amount(const Amount &o) : Amount(std::string(o.amount_)) {}
42 :
43 : Amount::Amount(Amount &&o) noexcept
44 1145 : : Amount(std::move(const_cast<std::string &>(o.amount_))) {}
45 :
46 : const boost::multiprecision::uint256_t &Amount::intValue() const {
47 773 : return multiprecision_repr_;
48 : }
49 :
50 : types::PrecisionType Amount::precision() const {
51 274 : return precision_;
52 : }
53 :
54 : std::string Amount::toStringRepr() const {
55 384 : return amount_;
56 : }
57 :
58 : bool Amount::operator==(const ModelType &rhs) const {
59 36 : return amount_ == rhs.amount_;
60 : }
61 :
62 : std::string Amount::toString() const {
63 183 : return detail::PrettyStringBuilder()
64 183 : .init("Amount")
65 183 : .append("value", amount_)
66 183 : .finalize();
67 0 : }
68 :
69 : Amount *Amount::clone() const {
70 0 : return new Amount(*this);
71 0 : }
72 : } // namespace interface
73 : } // namespace shared_model
|