Add HarfBuzz Text Shaping and Font Fallback Support (#3611)
Co-authored-by: alan wei chen <alanchenboy@gmail.com>
This commit is contained in:
@@ -7,6 +7,9 @@
|
||||
#include <cstddef>
|
||||
#include <tuple>
|
||||
#include <type_traits>
|
||||
#include <string_view>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
|
||||
namespace mbgl {
|
||||
namespace util {
|
||||
@@ -36,5 +39,53 @@ inline constexpr auto to_array(std::tuple<Ts...>&& tuple) {
|
||||
std::forward<std::tuple<Ts...>>(tuple));
|
||||
}
|
||||
|
||||
/// Convert string to integral types
|
||||
template <typename T>
|
||||
std::enable_if_t<std::is_integral_v<T>, std::optional<T>> parse(std::string_view str, int base = 10) noexcept {
|
||||
static_assert(std::is_same_v<T, int32_t> || std::is_same_v<T, uint32_t> || std::is_same_v<T, int64_t> ||
|
||||
std::is_same_v<T, uint64_t>,
|
||||
"Unsupported integral type in mbgl::util::parse<T>.");
|
||||
char* end = nullptr;
|
||||
errno = 0;
|
||||
|
||||
if constexpr (std::is_same_v<T, int32_t>) {
|
||||
long val = std::strtol(str.data(), &end, base);
|
||||
if (errno == 0 && end == str.data() + str.size()) return static_cast<T>(val);
|
||||
} else if constexpr (std::is_same_v<T, uint32_t>) {
|
||||
unsigned long val = std::strtoul(str.data(), &end, base);
|
||||
if (errno == 0 && end == str.data() + str.size()) return static_cast<T>(val);
|
||||
} else if constexpr (std::is_same_v<T, int64_t>) {
|
||||
long long val = std::strtoll(str.data(), &end, base);
|
||||
if (errno == 0 && end == str.data() + str.size()) return static_cast<T>(val);
|
||||
} else if constexpr (std::is_same_v<T, uint64_t>) {
|
||||
unsigned long long val = std::strtoull(str.data(), &end, base);
|
||||
if (errno == 0 && end == str.data() + str.size()) return static_cast<T>(val);
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
/// Convert string to floating point types
|
||||
template <typename T>
|
||||
std::enable_if_t<std::is_floating_point_v<T>, std::optional<T>> parse(std::string_view str) noexcept {
|
||||
static_assert(std::is_same_v<T, float> || std::is_same_v<T, double> || std::is_same_v<T, long double>,
|
||||
"Unsupported floating point type in mbgl::util::parse<T>.");
|
||||
char* end = nullptr;
|
||||
errno = 0;
|
||||
|
||||
if constexpr (std::is_same_v<T, float>) {
|
||||
float val = std::strtof(str.data(), &end);
|
||||
if (errno == 0 && end == str.data() + str.size()) return val;
|
||||
} else if constexpr (std::is_same_v<T, double>) {
|
||||
double val = std::strtod(str.data(), &end);
|
||||
if (errno == 0 && end == str.data() + str.size()) return val;
|
||||
} else if constexpr (std::is_same_v<T, long double>) {
|
||||
long double val = std::strtold(str.data(), &end);
|
||||
if (errno == 0 && end == str.data() + str.size()) return val;
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
} // namespace util
|
||||
} // namespace mbgl
|
||||
|
||||
Reference in New Issue
Block a user