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 17 namespace llvm { 18 19 /// Saves strings in the provided stable storage and returns a 20 /// StringRef with a stable character pointer. 21 class StringSaver final { 22 BumpPtrAllocator &Alloc; 23 24 public: 25 StringSaver(BumpPtrAllocator &Alloc) : Alloc(Alloc) {} 26 27 BumpPtrAllocator &getAllocator() const { return Alloc; } 28 29 // All returned strings are null-terminated: *save(S).end() == 0. 30 StringRef save(const char *S) { return save(StringRef(S)); } 31 StringRef save(StringRef S); 32 StringRef save(const Twine &S); 33 StringRef save(const std::string &S) { return save(StringRef(S)); } 34 }; 35 36 /// Saves strings in the provided stable storage and returns a StringRef with a 37 /// stable character pointer. Saving the same string yields the same StringRef. 38 /// 39 /// Compared to StringSaver, it does more work but avoids saving the same string 40 /// multiple times. 41 /// 42 /// Compared to StringPool, it performs fewer allocations but doesn't support 43 /// refcounting/deletion. 44 class UniqueStringSaver final { 45 StringSaver Strings; 46 llvm::DenseSet<llvm::StringRef> Unique; 47 48 public: 49 UniqueStringSaver(BumpPtrAllocator &Alloc) : Strings(Alloc) {} 50 51 // All returned strings are null-terminated: *save(S).end() == 0. 52 StringRef save(const char *S) { return save(StringRef(S)); } 53 StringRef save(StringRef S); 54 StringRef save(const Twine &S); 55 StringRef save(const std::string &S) { return save(StringRef(S)); } 56 }; 57 58 } // namespace llvm 59 #endif 60