#pragma once namespace Utils { namespace String { template class VAProvider { public: static_assert(Buffers != 0 && MinBufferSize != 0, "Buffers and MinBufferSize mustn't be 0"); VAProvider() : currentBuffer(0) {} ~VAProvider() {} char* get(const char* format, va_list ap) { ++this->currentBuffer %= ARRAYSIZE(this->stringPool); auto entry = &this->stringPool[this->currentBuffer]; if (!entry->size || !entry->buffer) { throw std::runtime_error("String pool not initialized"); } while (true) { int res = vsnprintf_s(entry->buffer, entry->size, _TRUNCATE, format, ap); if (res > 0) break; // Success if (res == 0) return ""; // Error entry->doubleSize(); } return entry->buffer; } private: class Entry { public: Entry(size_t _size = MinBufferSize) : size(_size), buffer(nullptr) { if (this->size < MinBufferSize) this->size = MinBufferSize; this->allocate(); } ~Entry() { if(this->buffer) Utils::Memory::GetAllocator()->free(this->buffer); this->size = 0; this->buffer = nullptr; } void allocate() { if (this->buffer) Utils::Memory::GetAllocator()->free(this->buffer); this->buffer = Utils::Memory::GetAllocator()->allocateArray(this->size + 1); } void doubleSize() { this->size *= 2; this->allocate(); } size_t size; char* buffer; }; size_t currentBuffer; Entry stringPool[Buffers]; }; const char *VA(const char *fmt, ...); int IsSpace(int c); std::string ToLower(std::string input); std::string ToUpper(std::string input); bool EndsWith(std::string haystack, std::string needle); std::vector Explode(const std::string& str, char delim); void Replace(std::string &string, std::string find, std::string replace); bool StartsWith(std::string haystack, std::string needle); std::string <rim(std::string &s); std::string &RTrim(std::string &s); std::string &Trim(std::string &s); std::string FormatTimeSpan(int milliseconds); std::string FormatBandwidth(size_t bytes, int milliseconds); std::string DumpHex(std::string data, std::string separator = " "); std::string XOR(std::string str, char value); std::string EncodeBase64(const char* input, const unsigned long inputSize); std::string EncodeBase64(const std::string& input); std::string EncodeBase128(const std::string& input); std::string GenerateUUIDString(); } }