#pragma once
#include "ctre/phoenix/export.h"
#include <span>
#include <sstream>
#include <stdint.h>
#include <string>
#include <vector>
namespace ctre {
namespace phoenix {
namespace string_util {
CTREXPORT std::vector<std::string> string_split(std::string const &input, char delimiter);
CTREXPORT std::string toLower(std::string_view input);
CTREXPORT void makeLower(std::string &input);
CTREXPORT std::string toUpper(std::string_view input);
CTREXPORT void makeUpper(std::string &input);
CTREXPORT int strcmp_nocase(char const *a, char const *b);
CTREXPORT uint32_t safe_copyDoubles(double *dest, std::span<double const> src, int32_t capacityDoubles);
CTREXPORT size_t safe_memcpy(void *dest, void const *src, size_t numBytesToCopy, size_t capacity);
CTREXPORT char *safe_strcpy(char *dest, char const *src, size_t capacity);
CTREXPORT char *safe_strcpy(char *dest, char const *src, size_t capacityDest, size_t capacitySrc);
CTREXPORT char *safe_strcat(char *dest, char const *src, size_t capacity);
CTREXPORT char *safe_strcat(char *dest, char const *src, size_t capacityDest, size_t capacitySrc);
CTREXPORT char *safe_strtok(char **str_ptr, char const *delimiters);
CTREXPORT constexpr size_t safe_strlen(char const *s, size_t capacity)
{
if (!s) return 0;
size_t len = 0;
for (; len < capacity && s[len]; ++len);
return len;
}
template <typename T>
bool toNumber(std::string const &str, T &value)
{
std::istringstream iss{str};
iss >> std::ws >> value >> std::ws;
return iss.eof();
}
} } }