Advertisement
Guest User

GOVNOKOD

a guest
May 1st, 2020
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.33 KB | None | 0 0
  1. extern UInt8 GSupportFormatBuffer[FORMAT_BUFFER_SIZE];
  2. extern UInt8 GSupportToStringBuffer[TO_STRING_BUFFER_SIZE];
  3.  
  4. template<typename CharType>
  5. struct FormatterPlaceholder
  6. {
  7. };
  8.  
  9. template<>
  10. struct FormatterPlaceholder<char>
  11. {
  12. public:
  13.     enum
  14.     {
  15.         Begin = '{',
  16.         End = '}'
  17.     };
  18. };
  19.  
  20. template<>
  21. struct FormatterPlaceholder<wchar_t>
  22. {
  23. public:
  24.     enum
  25.     {
  26.         Begin = L'{',
  27.         End = L'}'
  28.     };
  29. };
  30.  
  31. template<typename CharType>
  32. class Formatter
  33. {
  34. private:
  35.     static int _ToString(Int8 Value)
  36.     {
  37.         return CString<CharType>::Snprintf(
  38.             (CharType*)GSupportToStringBuffer,
  39.             TO_STRING_BUFFER_SIZE,
  40.             "%" PRId8,
  41.             Value);
  42.     }
  43.  
  44.     static int _ToString(Int16 Value)
  45.     {
  46.         return CString<CharType>::Snprintf(
  47.             (CharType*)GSupportToStringBuffer,
  48.             TO_STRING_BUFFER_SIZE,
  49.             "%" PRId16,
  50.             Value);
  51.     }
  52.  
  53.     static int _ToString(Int32 Value)
  54.     {
  55.         return CString<CharType>::Snprintf(
  56.             (CharType*)GSupportToStringBuffer,
  57.             TO_STRING_BUFFER_SIZE,
  58.             "%" PRId32,
  59.             Value);
  60.     }
  61.  
  62.     static int _ToString(Int64 Value)
  63.     {
  64.         return CString<CharType>::Snprintf(
  65.             (CharType*)GSupportToStringBuffer,
  66.             TO_STRING_BUFFER_SIZE,
  67.             "%" PRId64,
  68.             Value);
  69.     }
  70.  
  71.     static int _ToString(UInt8 Value)
  72.     {
  73.         return CString<CharType>::Snprintf(
  74.             (CharType*)GSupportToStringBuffer,
  75.             TO_STRING_BUFFER_SIZE,
  76.             "%" PRIu8,
  77.             Value);
  78.     }
  79.  
  80.     static int _ToString(UInt16 Value)
  81.     {
  82.         return CString<CharType>::Snprintf(
  83.             (CharType*)GSupportToStringBuffer,
  84.             TO_STRING_BUFFER_SIZE,
  85.             "%" PRIu16,
  86.             Value);
  87.     }
  88.  
  89.     static int _ToString(UInt32 Value)
  90.     {
  91.         return CString<CharType>::Snprintf(
  92.             (CharType*)GSupportToStringBuffer,
  93.             TO_STRING_BUFFER_SIZE,
  94.             "%" PRIu32,
  95.             Value);
  96.     }
  97.  
  98.     static int _ToString(UInt64 Value)
  99.     {
  100.         return CString<CharType>::Snprintf(
  101.             (CharType*)GSupportToStringBuffer,
  102.             TO_STRING_BUFFER_SIZE,
  103.             "%" PRIu64,
  104.             Value);
  105.     }
  106.  
  107.     static int _ToString(float Value)
  108.     {
  109.         return CString<CharType>::Snprintf(
  110.             (CharType*)GSupportToStringBuffer,
  111.             TO_STRING_BUFFER_SIZE,
  112.             "%f",
  113.             Value);
  114.     }
  115.  
  116.     static int _ToString(double Value)
  117.     {
  118.         return CString<CharType>::Snprintf(
  119.             (CharType*)GSupportToStringBuffer,
  120.             TO_STRING_BUFFER_SIZE,
  121.             "%f",
  122.             Value);
  123.     }
  124.  
  125.     template<typename First, typename ... Args>
  126.     static void _ConvertArgs(Array<GenericString<CharType>>& _ArgBuffer, const First& _First, const Args& ... _Args)
  127.     {
  128.         _ArgBuffer.Add(ToString(_First));
  129.         _ConvertArgs(_ArgBuffer, _Args ...);
  130.     }
  131.  
  132.     template<typename First>
  133.     static void _ConvertArgs(Array<GenericString<CharType>>& _ArgBuffer, const First& _First)
  134.     {
  135.         _ArgBuffer.Add(ToString(_First));
  136.     }
  137.  
  138.     static bool _ScanPlaceholder(const CharType* Format, size_t Index, size_t Length, size_t& Placeholder, size_t& LastIndex)
  139.     {
  140.         size_t i = Index;
  141.         size_t j = 0;
  142.         while (i < Length && Format[i] != FormatterPlaceholder<CharType>::End)
  143.         {
  144.             if (!Char<CharType>::IsDigit(Format[i]))
  145.             {
  146.                 return false;
  147.             }
  148.             else
  149.             {
  150.                 GSupportToStringBuffer[j] = Format[i];
  151.                 j++;
  152.             }
  153.  
  154.             i++;
  155.         }
  156.  
  157.         if (i == Length)
  158.             return false;
  159.        
  160.         GSupportToStringBuffer[j] = 0;
  161. #if defined(64BIT)
  162.         Placeholder = CString<CharType>::Atoi64((const CharType*)GSupportToStringBuffer);
  163. #else
  164.         Placeholder = CString<CharType>::Atoi((const CharType*)GSupportToStringBuffer);
  165. #endif
  166.         LastIndex = i;
  167.  
  168.         return true;
  169.     }
  170. public:
  171.     template<typename T>
  172.     static GenericString<CharType> ToString(const T& Value)
  173.     {
  174.         int Length = Formatter<CharType>::_ToString(Value);
  175.         return GenericString<CharType>((char*)GSupportToStringBuffer, Length);
  176.     }
  177.  
  178.     template<typename ... Args>
  179.     static GenericString<CharType> Format(const CharType* Format, const Args& ... _Args)
  180.     {
  181.         Array<GenericString<CharType>> _FormatedArgs;
  182.         _FormatedArgs.Reserve(sizeof...(Args));
  183.         Formatter<CharType>::_ConvertArgs(_FormatedArgs, _Args ...);
  184.        
  185.         const size_t _Length = CString<CharType>::Strlen(Format);
  186.         size_t Index = 0;
  187.         for (size_t i = 0; i < _Length; i++)
  188.         {
  189.             if (Format[i] == FormatterPlaceholder<CharType>::Begin)
  190.             {
  191.                 size_t Placeholder = 0;
  192.                 size_t LastIndex = 0;
  193.                 if (_ScanPlaceholder(Format, i + 1, _Length, Placeholder, LastIndex) && Placeholder < sizeof...(Args))
  194.                 {
  195.                     Memory::Copy(
  196.                         GSupportFormatBuffer + Index,
  197.                         _FormatedArgs[Placeholder].Data(),
  198.                         _FormatedArgs[Placeholder].Length() * sizeof(CharType)
  199.                     );
  200.  
  201.                     Index += _FormatedArgs[Placeholder].Length();
  202.                     i = LastIndex;
  203.                 }
  204.             }
  205.             else
  206.             {
  207.                 GSupportFormatBuffer[Index] = Format[i];
  208.                 Index++;
  209.             }
  210.         }
  211.  
  212.         GSupportFormatBuffer[Index] = 0;
  213.  
  214.         return GenericString<CharType>((const CharType*)GSupportFormatBuffer);
  215.     }
  216. };
  217.  
  218. template<typename T>
  219. forceinline String ToString(const T& Value)
  220. {
  221.     return Formatter<char>::ToString<T>(Value);
  222. }
  223.  
  224. forceinline String ToString(const char* Value)
  225. {
  226.     return String(Value);
  227. }
  228.  
  229. forceinline String ToString(const String& Value)
  230. {
  231.     return Value;
  232. }
  233.  
  234. forceinline String FormatAnsi(const char* Format, ...)
  235. {
  236.     va_list Args;
  237.     va_start(Args, Format);
  238.     int Length = CString<char>::Vsnprintf((char*)GSupportFormatBuffer, FORMAT_BUFFER_SIZE, Format, Args);
  239.     String Result(GSupportFormatBuffer, Length);
  240.     va_end(Args);
  241.     return Result;
  242. }
  243.  
  244. template<typename ... Args>
  245. forceinline String Format(const char* Format, const Args& ... _Args)
  246. {
  247.     return Formatter<char>::Format(Format, _Args ...);
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement