LCOV - code coverage report
Current view: top level - shared_model/interfaces/common_objects/impl - amount.cpp (source / functions) Hit Total Coverage
Test: coverage_cleared.info Lines: 27 30 90.0 %
Date: 2018-12-05 17:11:35 Functions: 11 15 73.3 %

          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

Generated by: LCOV version 1.13