From 2aa4a82499d4becd2284cdb482213d541b8804dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 28 Apr 2024 16:29:10 +0200 Subject: Adding upstream version 86.0.1. Signed-off-by: Daniel Baumann --- .../compiler/translator/ImmutableStringBuilder.h | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 gfx/angle/checkout/src/compiler/translator/ImmutableStringBuilder.h (limited to 'gfx/angle/checkout/src/compiler/translator/ImmutableStringBuilder.h') diff --git a/gfx/angle/checkout/src/compiler/translator/ImmutableStringBuilder.h b/gfx/angle/checkout/src/compiler/translator/ImmutableStringBuilder.h new file mode 100644 index 0000000000..e68459169f --- /dev/null +++ b/gfx/angle/checkout/src/compiler/translator/ImmutableStringBuilder.h @@ -0,0 +1,80 @@ +// +// Copyright (c) 2018 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// ImmutableStringBuilder.h: Stringstream-like utility for building pool allocated strings where the +// maximum length is known in advance. +// + +#ifndef COMPILER_TRANSLATOR_IMMUTABLESTRINGBUILDER_H_ +#define COMPILER_TRANSLATOR_IMMUTABLESTRINGBUILDER_H_ + +#include "compiler/translator/ImmutableString.h" + +namespace sh +{ + +class ImmutableStringBuilder +{ + public: + ImmutableStringBuilder(size_t maxLength) + : mPos(0u), mMaxLength(maxLength), mData(AllocateEmptyPoolCharArray(maxLength)) + {} + + ImmutableStringBuilder &operator<<(const ImmutableString &str); + + ImmutableStringBuilder &operator<<(const char *str); + + ImmutableStringBuilder &operator<<(const char &c); + + // This invalidates the ImmutableStringBuilder, so it should only be called once. + operator ImmutableString(); + + void appendDecimal(const uint32_t &i); + + template + void appendHex(T number) + { + ASSERT(mData != nullptr); + ASSERT(mPos + sizeof(T) * 2u <= mMaxLength); + int index = static_cast(sizeof(T)) * 2 - 1; + // Loop through leading zeroes. + while (((number >> (index * 4)) & 0xfu) == 0 && index > 0) + { + --index; + } + // Write the rest of the hex digits. + while (index >= 0) + { + char digit = static_cast((number >> (index * 4)) & 0xfu); + char digitChar = (digit < 10) ? (digit + '0') : (digit + ('a' - 10)); + mData[mPos++] = digitChar; + --index; + } + } + + template + static constexpr size_t GetHexCharCount() + { + return sizeof(T) * 2; + } + + private: + inline static char *AllocateEmptyPoolCharArray(size_t strLength) + { + size_t requiredSize = strLength + 1u; + return static_cast(GetGlobalPoolAllocator()->allocate(requiredSize)); + } + + size_t mPos; + size_t mMaxLength; + char *mData; +}; + +// GLSL ES 3.00.6 section 3.9: the maximum length of an identifier is 1024 characters. +constexpr unsigned int kESSLMaxIdentifierLength = 1024u; + +} // namespace sh + +#endif // COMPILER_TRANSLATOR_IMMUTABLESTRINGBUILDER_H_ -- cgit v1.2.3