20#ifndef PLYWOOT_STD_HPP
21#define PLYWOOT_STD_HPP
25#ifdef PLYWOOT_USE_FAST_FLOAT
26#include <fast_float/fast_float.h>
29#ifdef PLYWOOT_USE_FAST_INT
30#include <fast_int/fast_int.hpp>
40namespace plywoot::detail {
50constexpr Ptr
align(Ptr ptr, std::size_t alignment)
57 const auto uintptr =
reinterpret_cast<uintptr_t
>(ptr);
58 return reinterpret_cast<Ptr
>((uintptr + alignment - 1u) & -alignment);
69constexpr std::size_t
align(std::size_t ptr, std::size_t alignment)
76 return (ptr + alignment - 1u) & -alignment;
89template<
typename Number>
90inline Number
to_number(
const char *first,
const char *last,
const char **end)
92#ifdef PLYWOOT_USE_FAST_INT
94 *end = fast_int::from_chars(first, last, n).ptr;
97 return std::strtoll(first,
const_cast<char **
>(end), 10);
112inline float to_number<>(
const char *first,
const char *last,
const char **end)
114#ifdef PLYWOOT_USE_FAST_FLOAT
116 *end = fast_float::from_chars(first, last, x).ptr;
119 return std::strtof(first,
const_cast<char **
>(end));
134inline double to_number<double>(
const char *first,
const char *last,
const char **end)
136#ifdef PLYWOOT_USE_FAST_FLOAT
138 *end = fast_float::from_chars(first, last, x).ptr;
141 return std::strtof(first,
const_cast<char **
>(end));
151inline bool starts_with(
const std::string &s,
const char *prefix) {
return s.rfind(prefix, 0) == 0; }
162 std::stringstream oss;
Number to_number(const char *first, const char *last, const char **end)
constexpr Ptr align(Ptr ptr, std::size_t alignment)
bool starts_with(const std::string &s, const char *prefix)
std::string to_string(const T &t)