8#include <cppunit/TestFixture.h>
9#include <cppunit/extensions/HelperMacros.h>
12#include <initializer_list>
16#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
22using namespace CPPUNIT_NS;
26static_assert(
toNormalInt(383) == 255,
"toNormalInt()");
27static_assert(
swapOrder(
static_cast<std::uint16_t
>(0xABCD)) == 0xCDAB,
"swapOrder(std::uint16_t)");
28static_assert(
swapOrder(
static_cast<std::uint32_t
>(0xABCDEF12u)) == 0x12EFCDABu,
"swapOrder(std::uint32_t)");
29static_assert(
swapOrder(
static_cast<std::uint64_t
>(0xABCDEF1234567890ul)) == 0x9078563412EFCDABul,
"swapOrder(std::uint64_t)");
30static_assert(
swapOrder(
static_cast<std::int16_t
>(0xABCD)) ==
static_cast<std::int16_t
>(0xCDAB),
"swapOrder(std::int16_t)");
31static_assert(
swapOrder(
static_cast<std::int32_t
>(0xABCDEF12)) == 0x12EFCDAB,
"swapOrder(std::int32_t)");
32static_assert(
swapOrder(
static_cast<std::int64_t
>(0xABCDEF1234567890l)) ==
static_cast<std::int64_t
>(0x9078563412EFCDABl),
"swapOrder(std::int64_t)");
46 CPPUNIT_TEST_SUITE_END();
67 template <
typename intType>
68 void testConversion(
const char *message, function<
void(intType,
char *)> vice, function<intType(
const char *)> verca, intType
min, intType
max);
71 random_device m_randomDevice;
72 mt19937 m_randomEngine;
79 , m_randomEngine(m_randomDevice())
96 } test = { 0x01020304 };
97#if defined(CONVERSION_UTILITIES_BYTE_ORDER_BIG_ENDIAN)
99 CPPUNIT_ASSERT(CONVERSION_UTILITIES_IS_BYTE_ORDER_BIG_ENDIAN ==
true);
100 CPPUNIT_ASSERT(CONVERSION_UTILITIES_IS_BYTE_ORDER_LITTLE_ENDIAN ==
false);
102 CPPUNIT_ASSERT_MESSAGE(
"Byte order assumption (big-endian) is wrong", test.characters[0] == 0x01);
103#elif defined(CONVERSION_UTILITIES_BYTE_ORDER_LITTLE_ENDIAN)
105 CPPUNIT_ASSERT(CONVERSION_UTILITIES_IS_BYTE_ORDER_BIG_ENDIAN ==
false);
106 CPPUNIT_ASSERT(CONVERSION_UTILITIES_IS_BYTE_ORDER_LITTLE_ENDIAN ==
true);
108 CPPUNIT_ASSERT_MESSAGE(
"Byte order assumption (little-endian) is wrong", test.characters[0] == 0x04);
110 CPPUNIT_FAIL(
"There is not valid byte order assumption");
114template <
typename intType>
115void ConversionTests::testConversion(
116 const char *message, function<
void(intType,
char *)> vice, function<intType(
const char *)> versa, intType
min, intType
max)
118 const intType random = uniform_int_distribution<intType>(
min,
max)(m_randomEngine);
120 msg << message <<
'(' << hex <<
'0' <<
'x' << random <<
')';
121 vice(random, m_buff);
122 CPPUNIT_ASSERT_EQUAL_MESSAGE(msg.str(), random, versa(m_buff));
125#define TEST_TYPE(endianness, function) decltype(endianness::function(m_buff))
127#define TEST_CONVERSION(function, endianness) \
128 testConversion<TEST_TYPE(endianness, function)>("testing " #endianness "::" #function, \
129 static_cast<void (*)(TEST_TYPE(endianness, function), char *)>(&endianness::getBytes), endianness::function, \
130 numeric_limits<TEST_TYPE(endianness, function)>::min(), numeric_limits<TEST_TYPE(endianness, function)>::max())
132#define TEST_BE_CONVERSION(function) TEST_CONVERSION(function, BE)
134#define TEST_LE_CONVERSION(function) TEST_CONVERSION(function, LE)
136#define TEST_CUSTOM_CONVERSION(vice, versa, endianness, min, max) \
137 testConversion<TEST_TYPE(endianness, versa)>("testing " #versa " (" #endianness ")", \
138 static_cast<void (*)(TEST_TYPE(endianness, versa), char *)>(&endianness::vice), endianness::versa, min, max)
149 for (
auto b = 1; b < 100; ++b) {
172 CPPUNIT_ASSERT(
swapOrder(
static_cast<std::uint16_t
>(0x7825)) == 0x2578);
173 CPPUNIT_ASSERT(
swapOrder(
static_cast<std::uint32_t
>(0x12345678)) == 0x78563412);
174 CPPUNIT_ASSERT(
swapOrder(
static_cast<std::uint64_t
>(0x1122334455667788)) == 0x8877665544332211);
180void assertEqual(
const char *message,
const std::uint8_t *expectedValues,
size_t expectedSize,
const StringData &actualValues)
183 CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expectedSize, actualValues.second);
185 auto *end = expectedValues + expectedSize;
186 auto *
i =
reinterpret_cast<std::uint8_t *
>(actualValues.first.get());
187 for (; expectedValues != end; ++expectedValues, ++
i) {
192#if CONVERSION_UTILITIES_IS_BYTE_ORDER_LITTLE_ENDIAN == true
193#define LE_STR_FOR_ENDIANNESS(name) name##LE##String
194#define BE_STR_FOR_ENDIANNESS(name) name##BE##String
195#elif CONVERSION_UTILITIES_IS_BYTE_ORDER_BIG_ENDIAN == true
196#define LE_STR_FOR_ENDIANNESS(name) name##BE##String
197#define BE_STR_FOR_ENDIANNESS(name) name##LE##String
215#ifndef CPP_UTILITIES_NO_ICONV
217 const std::uint8_t simpleString[] = {
'A',
'B',
'C',
'D' };
218 const std::uint16_t simpleUtf16LEString[] = { 0x0041, 0x0042, 0x0043, 0x0044 };
219 const std::uint16_t simpleUtf16BEString[] = { 0x4100, 0x4200, 0x4300, 0x4400 };
221 const std::uint8_t latin1String[] = {
'A',
'B', 0xD6,
'C',
'D' };
222 const std::uint8_t utf8String[] = {
'A',
'B', 0xC3, 0x96,
'C',
'D' };
223 const std::uint16_t utf16LEString[] = { 0x0041, 0x0042, 0x00D6, 0x0043, 0x0044 };
224 const std::uint16_t utf16BEString[] = { 0x4100, 0x4200, 0xD600, 0x4300, 0x4400 };
229 "UTF-16LE to UTF-8 (simple)", simpleString, 4,
convertUtf16LEToUtf8(
reinterpret_cast<const char *
>(LE_STR_FOR_ENDIANNESS(simpleUtf16)), 8));
232 "UTF-16BE to UTF-8 (simple)", simpleString, 4,
convertUtf16BEToUtf8(
reinterpret_cast<const char *
>(BE_STR_FOR_ENDIANNESS(simpleUtf16)), 8));
237 assertEqual(
"UTF-8 to UFT-16LE (simple)",
reinterpret_cast<const std::uint8_t *
>(LE_STR_FOR_ENDIANNESS(simpleUtf16)), 8,
239 assertEqual(
"UTF-8 to UFT-16LE",
reinterpret_cast<const std::uint8_t *
>(LE_STR_FOR_ENDIANNESS(utf16)), 10,
241 assertEqual(
"UTF-8 to UFT-16BE (simple)",
reinterpret_cast<const std::uint8_t *
>(BE_STR_FOR_ENDIANNESS(simpleUtf16)), 8,
243 assertEqual(
"UTF-8 to UFT-16BE",
reinterpret_cast<const std::uint8_t *
>(BE_STR_FOR_ENDIANNESS(utf16)), 10,
257 uniform_int_distribution<std::int64_t> randomDistSigned(numeric_limits<std::int64_t>::min());
258 uniform_int_distribution<std::uint64_t> randomDistUnsigned(0);
259 const string stringMsg(
"string"), wideStringMsg(
"wide string"), bufferMsg(
"buffer");
260 for (std::uint8_t b = 1; b < 100; ++b) {
261 auto signedRandom = randomDistSigned(m_randomEngine);
262 auto unsignedRandom = randomDistUnsigned(m_randomEngine);
263 for (
const auto base : initializer_list<std::uint8_t>{ 2, 8, 10, 16 }) {
270 for (
const auto base : initializer_list<std::uint8_t>{ 10 }) {
310 CPPUNIT_ASSERT_EQUAL_MESSAGE(
312 vector<string> splitTestExpected({
"1",
"2,3" });
314 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
316 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
317 splitTestExpected = {
"12",
"34",
"56",
"" };
319 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
321 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
322 splitTestExpected = {
"1",
"2,3",
"4,,5" };
323 splitTestActual =
splitString<vector<string>>(
"1,2,,3,4,,5"s,
","s, EmptyPartsTreat::Merge, 3);
324 CPPUNIT_ASSERT_EQUAL(splitTestExpected, splitTestActual);
325 string splitJoinTest =
joinStrings(
splitString<vector<string>>(
",a,,ab,ABC,s"s,
","s, EmptyPartsTreat::Keep),
" "s,
false,
"("s,
")"s);
326 CPPUNIT_ASSERT_EQUAL(
"() (a) () (ab) (ABC) (s)"s, splitJoinTest);
327 splitJoinTest =
joinStrings(
splitString<vector<string>>(
",a,,ab,ABC,s"s,
","s, EmptyPartsTreat::Keep),
" "s,
true,
"("s,
")"s);
328 CPPUNIT_ASSERT_EQUAL(
"(a) (ab) (ABC) (s)"s, splitJoinTest);
329 splitJoinTest =
joinStrings(
splitStringSimple<vector<string>>(
",a,,ab,ABC,s"s,
","s),
" "s,
true,
"("s,
")"s);
330 CPPUNIT_ASSERT_EQUAL(
"(a) (ab) (ABC) (s)"s, splitJoinTest);
331 splitJoinTest =
joinStrings(
splitString<vector<string>>(
",a,,ab,ABC,s"s,
","s, EmptyPartsTreat::Omit),
" "s,
false,
"("s,
")"s);
332 CPPUNIT_ASSERT_EQUAL(
"(a) (ab) (ABC) (s)"s, splitJoinTest);
333 splitJoinTest =
joinStrings(
splitString<vector<string>>(
",a,,ab,ABC,s"s,
","s, EmptyPartsTreat::Merge),
" "s,
false,
"("s,
")"s);
334 CPPUNIT_ASSERT_EQUAL(
"(a,ab) (ABC) (s)"s, splitJoinTest);
337 string findReplaceTest(
"findAndReplace()");
339 CPPUNIT_ASSERT_EQUAL(
"findOrReplace()"s, findReplaceTest);
342 CPPUNIT_ASSERT(!
startsWith(findReplaceTest,
"findAnd"));
343 CPPUNIT_ASSERT(
startsWith(findReplaceTest,
"findOr"));
344 CPPUNIT_ASSERT(!
startsWith(findReplaceTest,
"findAnd"s));
345 CPPUNIT_ASSERT(
startsWith(findReplaceTest,
"findOr"s));
348 CPPUNIT_ASSERT(!
startsWith(
"test"s,
"tests"s));
349 CPPUNIT_ASSERT(!
startsWith(
"test"s,
"tests"));
352 CPPUNIT_ASSERT(!
endsWith(findReplaceTest,
"AndReplace()"));
353 CPPUNIT_ASSERT(
endsWith(findReplaceTest,
"OrReplace()"));
354 CPPUNIT_ASSERT(!
endsWith(findReplaceTest,
"AndReplace()"s));
355 CPPUNIT_ASSERT(
endsWith(findReplaceTest,
"OrReplace()"s));
356 CPPUNIT_ASSERT(
endsWith(
"test"s,
"test"s));
357 CPPUNIT_ASSERT(
endsWith(
"test"s,
"test"));
358 CPPUNIT_ASSERT(!
endsWith(
"test"s,
" test"s));
359 CPPUNIT_ASSERT(!
endsWith(
"test"s,
" test"));
366 string truncateTest(
"foo bar ");
368 CPPUNIT_ASSERT_EQUAL(
"foo"s, truncateTest);
371 std::uniform_int_distribution<int> randomDistChar;
372 std::uint8_t originalBase64Data[4047];
373 for (std::uint8_t &c : originalBase64Data) {
374 c =
static_cast<std::uint8_t
>(randomDistChar(m_randomEngine) & 0xFF);
376 auto encodedBase64Data =
encodeBase64(originalBase64Data,
sizeof(originalBase64Data));
377 auto decodedBase64Data =
decodeBase64(encodedBase64Data.data(),
static_cast<std::uint32_t
>(encodedBase64Data.size()));
378 CPPUNIT_ASSERT(decodedBase64Data.second ==
sizeof(originalBase64Data));
379 for (
unsigned int i = 0;
i <
sizeof(originalBase64Data); ++
i) {
380 CPPUNIT_ASSERT(decodedBase64Data.first[
i] == originalBase64Data[
i]);
383 encodedBase64Data =
encodeBase64(originalBase64Data,
sizeof(originalBase64Data) - 1);
384 CPPUNIT_ASSERT_EQUAL(
'=', encodedBase64Data.at(encodedBase64Data.size() - 1));
385 CPPUNIT_ASSERT_NO_THROW(
decodeBase64(encodedBase64Data.data(),
static_cast<std::uint32_t
>(encodedBase64Data.size())));
386 encodedBase64Data =
encodeBase64(originalBase64Data,
sizeof(originalBase64Data) - 2);
387 CPPUNIT_ASSERT_EQUAL(
'=', encodedBase64Data.at(encodedBase64Data.size() - 1));
388 CPPUNIT_ASSERT_EQUAL(
'=', encodedBase64Data.at(encodedBase64Data.size() - 2));
389 CPPUNIT_ASSERT_NO_THROW(
decodeBase64(encodedBase64Data.data(),
static_cast<std::uint32_t
>(encodedBase64Data.size())));
396 CPPUNIT_ASSERT_EQUAL(
"2.50 KiB (2560 byte)"s,
dataSizeToString((2048ull + 512ull),
true));
397 CPPUNIT_ASSERT_EQUAL(
"2.50 MiB"s,
dataSizeToString((2048ull + 512ull) * 1024ull));
398 CPPUNIT_ASSERT_EQUAL(
"2.50 GiB"s,
dataSizeToString((2048ull + 512ull) * 1024ull * 1024ull));
399 CPPUNIT_ASSERT_EQUAL(
"2.50 TiB"s,
dataSizeToString((2048ull + 512ull) * 1024ull * 1024ull * 1024ull));
402 CPPUNIT_ASSERT_EQUAL(
"128 Mbit/s"s,
bitrateToString(128.0 * 1e3,
false));
403 CPPUNIT_ASSERT_EQUAL(
"128 Gbit/s"s,
bitrateToString(128.0 * 1e6,
false));
412struct ConvertibleToString {
413 operator std::string()
const;
416struct StringThatDoesNotLikeToBeCopiedOrMoved :
public std::string {
417 explicit StringThatDoesNotLikeToBeCopiedOrMoved(
const char *value)
421 [[noreturn]] StringThatDoesNotLikeToBeCopiedOrMoved(
const StringThatDoesNotLikeToBeCopiedOrMoved &other)
424 CPPUNIT_FAIL(
"attempt to copy string: " + other);
426 [[noreturn]] StringThatDoesNotLikeToBeCopiedOrMoved(StringThatDoesNotLikeToBeCopiedOrMoved &&other)
427 :
std::string(
std::move(other))
429 CPPUNIT_FAIL(
"attempt to move string: " + other);
438 static_assert(Helper::IsStringType<std::string, std::string>::value);
439 static_assert(!Helper::IsStringType<std::string, std::wstring>::value);
440 static_assert(Helper::IsStringType<std::wstring, std::wstring>::value);
441 static_assert(Helper::IsStringViewType<std::string, std::string_view>::value);
442 static_assert(!Helper::IsStringViewType<std::wstring, std::string_view>::value);
443 static_assert(Helper::IsStringViewType<std::wstring, std::wstring_view>::value);
444 static_assert(Helper::IsConvertibleToConstStringRef<std::string, ConvertibleToString>::value);
445#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
446 static_assert(!Helper::IsConvertibleToConstStringRef<std::filesystem::path::string_type, std::filesystem::path>::value,
447 "conversion via native() preferred");
450 !Helper::IsConvertibleToConstStringRef<std::string, std::string>::value,
"yes, in this context this should not be considered convertible");
451 static_assert(!Helper::IsConvertibleToConstStringRef<std::wstring, ConvertibleToString>::value);
452#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
453 static_assert(Helper::IsConvertibleToConstStringRefViaNative<std::filesystem::path::string_type, std::filesystem::path>::value);
455 static_assert(!Helper::IsConvertibleToConstStringRefViaNative<std::string, std::string>::value);
458 const tuple<const char *, string, int, const char *> tuple(
"string1",
"string2", 1234,
"string3");
459 CPPUNIT_ASSERT_EQUAL(
"string1string21234string3"s,
tupleToString(tuple));
460 CPPUNIT_ASSERT_EQUAL(
"foobarfoo2bar2"s,
tupleToString(
"foo"s %
"bar" %
"foo2"s %
"bar2"));
461 CPPUNIT_ASSERT_EQUAL(
"v2.3.0"s,
argsToString(
"v2.", 3,
'.', 0));
462 CPPUNIT_ASSERT_EQUAL(
"v2.3.0"s,
argsToString(
'v', make_tuple(2,
'.', 3,
'.', 0)));
463#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
464 if constexpr (std::is_same_v<std::filesystem::path::value_type, std::string::value_type>) {
465 CPPUNIT_ASSERT_EQUAL(
"path: foo"s,
argsToString(
"path: ", std::filesystem::path(
"foo")));
470 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"result can be passed to any function taking a std::string"s,
"123456789"s,
"12" %
string(
"34") %
'5' % 67 +
"89");
471 constexpr double velocityExample = 27.0;
472 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"real-word example"s,
"velocity: 27 km/h (7.5 m/s)"s,
474 CPPUNIT_ASSERT_EQUAL_MESSAGE(
475 "regular + operator still works (no problems with ambiguity)"s,
"regular + still works"s,
"regular"s +
" + still works");
476 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"using string_view",
"foobar123"s,
"foo"sv %
"bar"sv + 123);
479 StringThatDoesNotLikeToBeCopiedOrMoved str(
" happen ");
480 const StringThatDoesNotLikeToBeCopiedOrMoved str2(
"for this");
481 CPPUNIT_ASSERT_EQUAL(
"no copy/move should happen for this!"s,
482 argsToString(StringThatDoesNotLikeToBeCopiedOrMoved(
"no copy/move should"), str, str2, StringThatDoesNotLikeToBeCopiedOrMoved(
"!")));
The ConversionTests class tests classes and functions provided by the files inside the conversion dir...
void testSwapOrderFunctions()
Tests swap order functions.
void testBinaryConversions()
Tests most important binary conversions.
void testStringEncodingConversions()
Tests string encoding conversions.
void testConversionException()
void testEndianness()
Tests whether macros for endianness are correct.
void testStringConversions()
Tests miscellaneous string conversions.
The ConversionException class is thrown by the various conversion functions of this library when a co...
void assertEqual(const char *message, const std::uint8_t *expectedValues, size_t expectedSize, const StringData &actualValues)
Internally used for string encoding tests to check results.
#define TEST_BE_CONVERSION(function)
#define TEST_LE_CONVERSION(function)
#define TEST_CUSTOM_CONVERSION(vice, versa, endianness, min, max)
CPPUNIT_TEST_SUITE_REGISTRATION(ConversionTests)
Contains all utilities provides by the c++utilities library.
void findAndReplace(StringType1 &str, const StringType2 &find, const StringType3 &replace)
Replaces all occurrences of find with relpace in the specified str.
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.
StringType numberToString(IntegralType number, BaseType base=10)
Converts the given number to its equivalent string representation using the specified base.
CPP_UTILITIES_EXPORT constexpr std::uint32_t toNormalInt(std::uint32_t synchsafeInt)
Returns a normal 32-bit integer converted from a 32-bit synchsafe integer.
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.
ReturnType joinStrings(const Container &strings, Detail::StringParamForContainer< Container > delimiter=Detail::StringParamForContainer< Container >(), bool omitEmpty=false, Detail::StringParamForContainer< Container > leftClosure=Detail::StringParamForContainer< Container >(), Detail::StringParamForContainer< Container > rightClosure=Detail::StringParamForContainer< Container >())
Joins the given strings using the specified delimiter.
CPP_UTILITIES_EXPORT constexpr std::uint16_t swapOrder(std::uint16_t value)
Swaps the byte order of the specified 16-bit unsigned integer.
bool startsWith(const StringType &str, const StringType &phrase)
Returns whether str starts with phrase.
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.
Container splitStringSimple(Detail::StringParamForContainer< Container > string, Detail::StringParamForContainer< Container > delimiter, int maxParts=-1)
Splits the given string (which might also be a string view) at the specified delimiter.
StringType argsToString(Args &&...args)
bool containsSubstrings(const StringType &str, std::initializer_list< StringType > substrings)
Returns whether str contains the specified substrings.
constexpr T max(T first, T second)
Returns the greatest of the given items.
StringType tupleToString(const std::tuple< Args... > &tuple)
Concatenates all strings hold by the specified tuple.
AsHexNumber< T > asHexNumber(const T &value)
Wraps a value to be printed using the hex system in the error case when asserted with cppunit (or sim...
CPP_UTILITIES_EXPORT StringData convertUtf8ToLatin1(const char *inputBuffer, std::size_t inputBufferSize)
Converts the specified UTF-8 string to Latin-1.
std::string interpretIntegerAsString(T integer, int startOffset=0)
Interprets the given integer at the specified position as std::string using the specified byte order.
bool endsWith(const StringType &str, const StringType &phrase)
Returns whether str ends with phrase.
CPP_UTILITIES_EXPORT constexpr std::uint32_t toSynchsafeInt(std::uint32_t normalInt)
Returns a 32-bit synchsafe integer converted from a normal 32-bit integer.
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.
constexpr T min(T first, T second)
Returns the smallest of the given items.
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.
IntegralType bufferToNumber(const CharType *string, std::size_t size, BaseType base=10)
Converts the given string of size characters to an unsigned numeric value using the specified base.
Container splitString(Detail::StringParamForContainer< Container > string, Detail::StringParamForContainer< Container > delimiter, EmptyPartsTreat emptyPartsRole=EmptyPartsTreat::Keep, int maxParts=-1)
Splits the given string at the specified delimiter.