Path: blob/main_old/src/compiler/translator/ImmutableString.h
1693 views
//1// Copyright 2018 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// ImmutableString.h: Wrapper for static or pool allocated char arrays, that are guaranteed to be6// valid and unchanged for the duration of the compilation.7//89#ifndef COMPILER_TRANSLATOR_IMMUTABLESTRING_H_10#define COMPILER_TRANSLATOR_IMMUTABLESTRING_H_1112#include <string>1314#include "common/string_utils.h"15#include "compiler/translator/Common.h"1617namespace sh18{1920namespace21{22constexpr size_t constStrlen(const char *str)23{24if (str == nullptr)25{26return 0u;27}28size_t len = 0u;29while (*(str + len) != '\0')30{31++len;32}33return len;34}35} // namespace3637class ImmutableString38{39public:40// The data pointer passed in must be one of:41// 1. nullptr (only valid with length 0).42// 2. a null-terminated static char array like a string literal.43// 3. a null-terminated pool allocated char array. This can't be c_str() of a local TString,44// since when a TString goes out of scope it clears its first character.45explicit constexpr ImmutableString(const char *data) : mData(data), mLength(constStrlen(data))46{}4748constexpr ImmutableString(const char *data, size_t length) : mData(data), mLength(length) {}4950ImmutableString(const std::string &str)51: mData(AllocatePoolCharArray(str.c_str(), str.size())), mLength(str.size())52{}5354constexpr ImmutableString(const ImmutableString &) = default;5556ImmutableString &operator=(const ImmutableString &) = default;5758constexpr const char *data() const { return mData ? mData : ""; }59constexpr size_t length() const { return mLength; }6061char operator[](size_t index) const { return data()[index]; }6263constexpr bool empty() const { return mLength == 0; }64bool beginsWith(const char *prefix) const { return angle::BeginsWith(data(), prefix); }65constexpr bool beginsWith(const ImmutableString &prefix) const66{67return mLength >= prefix.length() && memcmp(data(), prefix.data(), prefix.length()) == 0;68}69bool contains(const char *substr) const { return strstr(data(), substr) != nullptr; }7071constexpr bool operator==(const ImmutableString &b) const72{73if (mLength != b.mLength)74{75return false;76}77return memcmp(data(), b.data(), mLength) == 0;78}79constexpr bool operator!=(const ImmutableString &b) const { return !(*this == b); }80constexpr bool operator==(const char *b) const81{82if (b == nullptr)83{84return empty();85}86return strcmp(data(), b) == 0;87}88constexpr bool operator!=(const char *b) const { return !(*this == b); }89bool operator==(const std::string &b) const90{91return mLength == b.length() && memcmp(data(), b.c_str(), mLength) == 0;92}93bool operator!=(const std::string &b) const { return !(*this == b); }9495constexpr bool operator<(const ImmutableString &b) const96{97if (mLength < b.mLength)98{99return true;100}101if (mLength > b.mLength)102{103return false;104}105return (memcmp(data(), b.data(), mLength) < 0);106}107108template <size_t hashBytes>109struct FowlerNollVoHash110{111static const size_t kFnvOffsetBasis;112static const size_t kFnvPrime;113114constexpr size_t operator()(const ImmutableString &a) const115{116const char *data = a.data();117size_t hash = kFnvOffsetBasis;118while ((*data) != '\0')119{120hash = hash ^ (*data);121hash = hash * kFnvPrime;122++data;123}124return hash;125}126};127128// Perfect hash functions129uint32_t mangledNameHash() const;130uint32_t unmangledNameHash() const;131132private:133const char *mData;134size_t mLength;135};136137constexpr ImmutableString kEmptyImmutableString("");138} // namespace sh139140std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str);141142#endif // COMPILER_TRANSLATOR_IMMUTABLESTRING_H_143144145