nxpp
Header-only graph utilities on top of Boost Graph Library
Loading...
Searching...
No Matches
numeric.hpp
Go to the documentation of this file.
1#pragma once
2
8#include <any>
9#include <optional>
10
11namespace nxpp::detail {
12
13template <typename T>
14std::optional<double> try_numeric_any_cast_as_double(const std::any& value) {
15 if (const auto* typed_value = std::any_cast<T>(&value)) {
16 return static_cast<double>(*typed_value);
17 }
18 return std::nullopt;
19}
20
21inline std::optional<double> try_numeric_any_cast(const std::any& value) {
22 if (auto converted = try_numeric_any_cast_as_double<int>(value)) return converted;
23 if (auto converted = try_numeric_any_cast_as_double<long>(value)) return converted;
24 if (auto converted = try_numeric_any_cast_as_double<long long>(value)) return converted;
25 if (auto converted = try_numeric_any_cast_as_double<unsigned int>(value)) return converted;
26 if (auto converted = try_numeric_any_cast_as_double<unsigned long>(value)) return converted;
27 if (auto converted = try_numeric_any_cast_as_double<unsigned long long>(value)) return converted;
28 if (auto converted = try_numeric_any_cast_as_double<float>(value)) return converted;
29 if (auto converted = try_numeric_any_cast_as_double<double>(value)) return converted;
30 if (auto converted = try_numeric_any_cast_as_double<long double>(value)) return converted;
31 return std::nullopt;
32}
33
34} // namespace nxpp::detail