Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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) { return save(StringRef(S.str())); }
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) { return save(StringRef(S.str())); }
55
  StringRef save(const std::string &S) { return save(StringRef(S)); }
56
};
57
 
58
}
59
#endif