4#include "../Foundation/AlignedStorage.h"
5#include "../Foundation/Internal/IGrowableBuffer.h"
6#include "../Strings/StringView.h"
13struct StringFormatterFor;
26 GrowableBuffer<T>& gbuf = growableBufferStorage.reinterpret_as<GrowableBuffer<T>>();
27 placementNew(gbuf, destination);
28 growableBuffer = &gbuf;
56 IGrowableBuffer* growableBuffer =
nullptr;
57 StringEncoding encoding;
60 size_t backupSize = 0;
85template <
typename RangeIterator>
94 template <
typename... Types>
98 struct Implementation;
107template <
typename RangeIterator>
110 template <
int Total,
int N,
typename T,
typename... Rest>
111 static bool formatArgument(StringFormatOutput& data, StringView specifier,
int position, T&& arg, Rest&&... rest)
113 if (position == Total - N)
115 using First =
typename TypeTraits::RemoveConst<typename TypeTraits::RemoveReference<T>::type>::type;
116 return StringFormatterFor<First>::format(data, specifier, arg);
120 return formatArgument<Total, N - 1>(data, specifier, position,
forward<Rest>(rest)...);
124 template <
int Total,
int N,
typename... Args>
126 StringView,
int, Args...)
131 template <
typename... Types>
132 static bool parsePosition(StringFormatOutput& data, RangeIterator& it,
int32_t& parsedPosition, Types&&... args)
134 const auto startOfSpecifier = it;
135 if (it.advanceUntilMatches(
'}'))
137 auto specifier = startOfSpecifier.sliceFromStartUntil(it);
138 auto specifierPosition = specifier;
139 if (specifier.advanceUntilMatches(
':'))
141 specifierPosition = startOfSpecifier.sliceFromStartUntil(specifier);
142 (void)specifier.stepForward();
144 (void)specifierPosition.stepForward();
145 (void)it.stepForward();
148 if (not positionString.isEmpty())
150 if (not positionString.parseInt32(parsedPosition))
155 constexpr auto maxArgs =
sizeof...(args);
156 return formatArgument<maxArgs, maxArgs>(data, specifierString, parsedPosition,
forward<Types>(args)...);
161 template <
typename... Types>
162 static bool executeFormat(StringFormatOutput& data, RangeIterator it, Types&&... args)
171 if (it.advanceUntilMatchesAny({
'{',
'}'}, matchedChar))
173 if (it.isFollowedBy(matchedChar))
176 (void)it.stepForward();
179 (void)it.stepForward();
182 else if (matchedChar ==
'{')
187 int32_t parsedPosition = position;
188 if (not parsePosition(data, it, parsedPosition,
forward<Types>(args)...))
192 maxPosition =
max(maxPosition, parsedPosition + 1);
203 return maxPosition ==
static_cast<int32_t>(
sizeof...(args));
209template <
typename RangeIterator>
210template <
typename... Types>
214 if (Implementation::executeFormat(data, fmt.
getIterator<RangeIterator>(), forward<Types>(args)...))
226template <>
struct SC_COMPILER_EXPORT StringFormatterFor<float> {
static bool format(
StringFormatOutput&,
const StringView,
const float);};
227template <>
struct SC_COMPILER_EXPORT StringFormatterFor<double> {
static bool format(StringFormatOutput&,
const StringView,
const double);};
228#if SC_COMPILER_MSVC || SC_COMPILER_CLANG_CL
229#if SC_PLATFORM_64_BIT == 0
230template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
ssize_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::ssize_t);};
233#if !SC_PLATFORM_LINUX
234template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
size_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::size_t);};
235template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
ssize_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::ssize_t);};
238template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
int64_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::int64_t);};
239template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
uint64_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::uint64_t);};
240template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
int32_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::int32_t);};
241template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
uint32_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::uint32_t);};
242template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
int16_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::int16_t);};
243template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
uint16_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::uint16_t);};
244template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
int8_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::int8_t);};
245template <>
struct SC_COMPILER_EXPORT StringFormatterFor<SC::
uint8_t> {
static bool format(StringFormatOutput&,
const StringView,
const SC::uint8_t);};
246template <>
struct SC_COMPILER_EXPORT StringFormatterFor<char> {
static bool format(StringFormatOutput&,
const StringView,
const char);};
247template <>
struct SC_COMPILER_EXPORT StringFormatterFor<bool> {
static bool format(StringFormatOutput&,
const StringView,
const bool);};
248template <>
struct SC_COMPILER_EXPORT StringFormatterFor<StringView> {
static bool format(StringFormatOutput&,
const StringView,
const StringView);};
249template <>
struct SC_COMPILER_EXPORT StringFormatterFor<const char*> {
static bool format(StringFormatOutput&,
const StringView,
const char*);};
250template <>
struct SC_COMPILER_EXPORT StringFormatterFor<const void*> {
static bool format(StringFormatOutput&,
const StringView,
const void*);};
251#if SC_PLATFORM_WINDOWS
252template <>
struct SC_COMPILER_EXPORT StringFormatterFor<wchar_t> {
static bool format(StringFormatOutput&,
const StringView,
const wchar_t);};
253template <>
struct SC_COMPILER_EXPORT StringFormatterFor<const wchar_t*> {
static bool format(StringFormatOutput&,
const StringView,
const wchar_t*);};
255template <>
struct SC_COMPILER_EXPORT StringFormatterFor<StringSpan> {
static bool format(StringFormatOutput&,
const StringView,
const StringSpan);};
258template <>
struct SC_COMPILER_EXPORT StringFormatterFor<StringPath> {
static bool format(StringFormatOutput&,
const StringView,
const StringPath&);};
263struct StringFormatterFor<char[N]>
265 static bool format(StringFormatOutput& data,
const StringView specifier,
const char* str)
267 const StringView sv({str, N - 1},
true, StringEncoding::Ascii);
268 return StringFormatterFor<StringView>::format(data, specifier, sv);
constexpr const T & max(const T &t1, const T &t2)
Finds the maximum of two values.
Definition Compiler.h:285
unsigned short uint16_t
Platform independent (2) bytes unsigned int.
Definition PrimitiveTypes.h:37
constexpr T && forward(typename TypeTraits::RemoveReference< T >::type &value)
Forwards an lvalue or an rvalue as an rvalue reference.
Definition Compiler.h:260
unsigned char uint8_t
Platform independent (1) byte unsigned int.
Definition PrimitiveTypes.h:36
unsigned long size_t
Platform independent unsigned size type.
Definition PrimitiveTypes.h:56
unsigned long long uint64_t
Platform independent (8) bytes unsigned int.
Definition PrimitiveTypes.h:42
unsigned int uint32_t
Platform independent (4) bytes unsigned int.
Definition PrimitiveTypes.h:38
short int16_t
Platform independent (2) bytes signed int.
Definition PrimitiveTypes.h:45
long long int64_t
Platform independent (8) bytes signed int.
Definition PrimitiveTypes.h:50
signed char int8_t
Platform independent (1) byte signed int.
Definition PrimitiveTypes.h:44
signed long ssize_t
Platform independent signed size type.
Definition PrimitiveTypes.h:57
int int32_t
Platform independent (4) bytes signed int.
Definition PrimitiveTypes.h:46
uint32_t StringCodePoint
UTF code point (32 bit)
Definition StringIterator.h:14
A buffer of bytes with given alignment.
Definition AlignedStorage.h:29
Writes to console using SC::StringFormat.
Definition Console.h:25
Non-owning view over a range of characters with UTF Encoding.
Definition StringView.h:46
constexpr StringIterator getIterator() const
Returns a StringIterator from current StringView.
Definition StringView.h:614
static StringView fromIteratorUntilEnd(StringIterator it, StringEncoding encoding=StringIterator::getEncoding())
Returns a section of a string, from it to end of StringView.
static StringView fromIterators(StringIterator from, StringIterator to, StringEncoding encoding=StringIterator::getEncoding())
Returns a StringView starting at from and ending at to.
EnableIf conditionally defines a type if a boolean template parameter is true.
Definition TypeTraits.h:25