3#ifndef CPP_UTILITIES_NO_THREAD_LOCAL
4#include "../feature_detection/features.h"
7#ifndef CPP_UTILITIES_THREAD_LOCAL
8#define CPP_UTILITIES_THREAD_LOCAL
22#ifdef PLATFORM_WINDOWS
40 size_t operator()(
size_t value)
46 size_t operator()(
size_t value)
52 size_t operator()(
size_t value)
60 size_t operator()(
size_t value)
62 return static_cast<size_t>(
static_cast<float>(value) *
factor);
74 throw ConversionException(
"Unable to allocate descriptor for character set conversion.");
83 throw ConversionException(
"Unable to allocate descriptor for character set conversion.");
118 throw ConversionException(
"Invalid multibyte sequence in the input.");
204#ifdef PLATFORM_WINDOWS
215 auto bufferSize =
static_cast<int>(std::clamp<std::size_t>(
inputBuffer.size(), 0, std::numeric_limits<int>::max()));
218 ec = std::error_code(
static_cast<int>(
GetLastError()), std::system_category());
222 widePath.resize(
static_cast<std::wstring::size_type
>(
size));
225 ec = std::error_code(
static_cast<int>(
GetLastError()), std::system_category());
243 ec = std::error_code(
static_cast<int>(
GetLastError()), std::system_category());
250 ec = std::error_code(
static_cast<int>(
GetLastError()), std::system_category());
263 inputBuffer.size() <
static_cast<std::size_t
>(std::numeric_limits<int>::max() - 1) ?
static_cast<int>(
inputBuffer.size() + 1) : -1);
308 stringstream
res(stringstream::in | stringstream::out);
309 res.setf(ios::fixed, ios::floatfield);
340 stringstream
res(stringstream::in | stringstream::out);
343 res <<
"indeterminable";
369const char *
const base64Chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
380 auto mod =
static_cast<std::uint8_t
>(
dataSize % 3);
381 auto temp = std::uint32_t();
383 for (
const std::uint8_t *end = --data +
dataSize -
mod; data != end;) {
384 temp =
static_cast<std::uint32_t
>(*++data << 16);
385 temp |=
static_cast<std::uint32_t
>(*++data << 8);
394 temp =
static_cast<std::uint32_t
>(*++data << 16);
401 temp =
static_cast<std::uint32_t
>(*++data << 16);
402 temp |=
static_cast<std::uint32_t
>(*++data << 8);
420 return std::make_pair(std::make_unique<std::uint8_t[]>(0), 0);
433 auto buffer = std::make_unique<std::uint8_t[]>(
decodedSize);
434 auto *
iter = buffer.get() - 1;
436 std::int32_t
temp = 0;
448 temp |= 2 * 26 + 10 + 1;
452 *++
iter =
static_cast<std::uint8_t
>((
temp >> 16) & 0xFF);
453 *++
iter =
static_cast<std::uint8_t
>((
temp >> 8) & 0xFF);
454 return std::make_pair(std::move(buffer),
decodedSize);
456 *++
iter =
static_cast<std::uint8_t
>((
temp >> 10) & 0xFF);
457 return std::make_pair(std::move(buffer),
decodedSize);
465 *++
iter =
static_cast<std::uint8_t
>((
temp >> 16) & 0xFF);
466 *++
iter =
static_cast<std::uint8_t
>((
temp >> 8) & 0xFF);
467 *++
iter =
static_cast<std::uint8_t
>(
temp & 0xFF);
469 return std::make_pair(std::move(buffer),
decodedSize);
The ConversionException class is thrown by the various conversion functions of this library when a co...
Contains all utilities provides by the c++utilities library.
CPP_UTILITIES_EXPORT StringData convertUtf8ToUtf16BE(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-8 string to UTF-16 (big-endian).
CPP_UTILITIES_EXPORT StringData convertString(const char *fromCharset, const char *toCharset, const char *inputBuffer, std::size_t inputBufferSize, float outputBufferSizeFactor=1.0f)
Converts the specified string from one character set to another.
std::pair< std::unique_ptr< char[], StringDataDeleter >, std::size_t > StringData
Type used to return string encoding conversion result.
CPP_UTILITIES_EXPORT StringData convertLatin1ToUtf8(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified Latin-1 string to UTF-8.
CPP_UTILITIES_EXPORT StringData convertUtf16LEToUtf8(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-16 (little-endian) string to UTF-8.
CPP_UTILITIES_EXPORT std::pair< std::unique_ptr< std::uint8_t[]>, std::uint32_t > decodeBase64(const char *encodedStr, const std::uint32_t strSize)
Decodes the specified Base64 encoded string.
IntegralType stringToNumber(const StringType &string, BaseType base=10)
Converts the given string to an unsigned/signed number assuming string uses the specified base.
CPP_UTILITIES_EXPORT void truncateString(std::string &str, char terminationChar='\0')
Truncates all characters after the first occurrence of the specified terminationChar and the terminat...
CPP_UTILITIES_EXPORT StringData convertUtf16BEToUtf8(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-16 (big-endian) string to UTF-8.
CPP_UTILITIES_EXPORT StringData convertUtf8ToLatin1(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-8 string to Latin-1.
CPP_UTILITIES_EXPORT StringData convertUtf8ToUtf16LE(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-8 string to UTF-16 (little-endian).
CPP_UTILITIES_EXPORT std::string bitrateToString(double speedInKbitsPerSecond, bool useByteInsteadOfBits=false)
Converts the specified bitrate in kbit/s to its equivalent std::string representation.
CPP_UTILITIES_EXPORT std::string encodeBase64(const std::uint8_t *data, std::uint32_t dataSize)
Encodes the specified data to Base64.
CPP_UTILITIES_EXPORT std::string dataSizeToString(std::uint64_t sizeInByte, bool includeByte=false)
Converts the specified data size in byte to its equivalent std::string representation.
#define CPP_UTILITIES_THREAD_LOCAL