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 + 1u));
69constexpr std::size_t
align(std::size_t ptr, std::size_t alignment)
76 return (ptr + alignment - 1u) & (~alignment + 1u);
89template<
typename Number>
90#ifdef PLYWOOT_USE_FAST_INT
91inline Number to_number(
const char *first,
const char *last,
const char **end)
93inline Number
to_number(
const char *first,
const char *,
const char **end)
96#ifdef PLYWOOT_USE_FAST_INT
98 *end = fast_int::from_chars(first, last, n).ptr;
101 return static_cast<Number
>(std::strtoll(first,
const_cast<char **
>(end), 10));
116#ifdef PLYWOOT_USE_FAST_FLOAT
117inline float to_number<>(
const char *first,
const char *last,
const char **end)
119inline float to_number<>(
const char *first,
const char *,
const char **end)
122#ifdef PLYWOOT_USE_FAST_FLOAT
124 *end = fast_float::from_chars(first, last, x).ptr;
127 return std::strtof(first,
const_cast<char **
>(end));
142#ifdef PLYWOOT_USE_FAST_FLOAT
143inline double to_number<double>(
const char *first,
const char *last,
const char **end)
145inline double to_number<double>(
const char *first,
const char *,
const char **end)
148#ifdef PLYWOOT_USE_FAST_FLOAT
150 *end = fast_float::from_chars(first, last, x).ptr;
153 return std::strtof(first,
const_cast<char **
>(end));
163inline bool starts_with(
const std::string &s,
const char *prefix) {
return s.rfind(prefix, 0) == 0; }
174 std::stringstream oss;
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)
Number to_number(const char *first, const char *, const char **end)