Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 11 additions & 18 deletions src/impls/cpp/polish.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ class Node {
// 与えられた文字列を数値化するメソッド
// 正常に変換できた場合はnumberに変換した数値を代入し、trueを返す
// 変換できなかった場合はfalseを返す
static bool parse_number(const std::string& expression, double& number);
static bool parse_number(const std::string_view& expression, double& number) noexcept;
};

// 与えられた式が不正な形式であることを報告するための例外クラス
Expand Down Expand Up @@ -392,25 +392,18 @@ void Node::calculate_node(Node& node)
node.right = nullptr;
}

bool Node::parse_number(const std::string& expression, double& number)
bool Node::parse_number(const std::string_view& expression, double& number) noexcept
{
try {
size_t pos_invalid; // std::stodで変換できない文字の位置を検出するための変数

// 与えられた文字列を数値に変換する
number = std::stod(expression, &pos_invalid);

if (pos_invalid < expression.length())
return false; // 途中に変換できない文字があるため、正常に変換できなかった
// 与えられた文字列を数値に変換する
[[maybe_unused]] auto [ptr, ec] = std::from_chars(
std::to_address(std::begin(expression)),
std::to_address(std::end(expression)),
number
);

return true;
}
catch (std::out_of_range&) {
return false;// doubleで扱える範囲外のため、正常に変換できなかった
}
catch (std::invalid_argument&) {
return false; // doubleに変換できないため、正常に変換できなかった
}
// 最後の文字まで変換できた場合は、正常に変換できたと判断する
// そうでなければ、正常に変換できなかったと判断する
return ptr == std::to_address(std::end(expression));
}

std::string Node::format_number(const double& number) noexcept
Expand Down
Loading