1//===- llvm/Support/StringSaver.h -------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLVM_SUPPORT_STRINGSAVER_H 10#define LLVM_SUPPORT_STRINGSAVER_H 11 12#include "llvm/ADT/DenseSet.h" 13#include "llvm/ADT/StringRef.h" 14#include "llvm/ADT/Twine.h" 15#include "llvm/Support/Allocator.h" 16 17namespace llvm { 18 19/// Saves strings in the provided stable storage and returns a 20/// StringRef with a stable character pointer. 21class StringSaver final { 22 BumpPtrAllocator &Alloc; 23 24public: 25 StringSaver(BumpPtrAllocator &Alloc) : Alloc(Alloc) {} 26 27 // All returned strings are null-terminated: *save(S).end() == 0. 28 StringRef save(const char *S) { return save(StringRef(S)); } 29 StringRef save(StringRef S); 30 StringRef save(const Twine &S) { return save(StringRef(S.str())); } 31 StringRef save(const std::string &S) { return save(StringRef(S)); } 32}; 33 34/// Saves strings in the provided stable storage and returns a StringRef with a 35/// stable character pointer. Saving the same string yields the same StringRef. 36/// 37/// Compared to StringSaver, it does more work but avoids saving the same string 38/// multiple times. 39/// 40/// Compared to StringPool, it performs fewer allocations but doesn't support 41/// refcounting/deletion. 42class UniqueStringSaver final { 43 StringSaver Strings; 44 llvm::DenseSet<llvm::StringRef> Unique; 45 46public: 47 UniqueStringSaver(BumpPtrAllocator &Alloc) : Strings(Alloc) {} 48 49 // All returned strings are null-terminated: *save(S).end() == 0. 50 StringRef save(const char *S) { return save(StringRef(S)); } 51 StringRef save(StringRef S); 52 StringRef save(const Twine &S) { return save(StringRef(S.str())); } 53 StringRef save(const std::string &S) { return save(StringRef(S)); } 54}; 55 56} 57#endif 58