1//===- CXString.h - Routines for manipulating CXStrings -------------------===//
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// This file defines routines for manipulating CXStrings.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_TOOLS_LIBCLANG_CXSTRING_H
14#define LLVM_CLANG_TOOLS_LIBCLANG_CXSTRING_H
15
16#include "clang-c/Index.h"
17#include "clang/Basic/LLVM.h"
18#include "llvm/ADT/SmallString.h"
19#include "llvm/ADT/StringRef.h"
20#include "llvm/Support/Compiler.h"
21#include <string>
22#include <vector>
23
24namespace clang {
25namespace cxstring {
26
27struct CXStringBuf;
28
29/// Create a CXString object for an empty "" string.
30CXString createEmpty();
31
32/// Create a CXString object for an NULL string.
33///
34/// A NULL string should be used as an "invalid" value in case of errors.
35CXString createNull();
36
37/// Create a CXString object from a nul-terminated C string. New
38/// CXString may contain a pointer to \p String.
39///
40/// \p String should not be changed by the caller afterwards.
41CXString createRef(const char *String);
42
43/// Create a CXString object from a nul-terminated C string. New
44/// CXString will contain a copy of \p String.
45///
46/// \p String can be changed or freed by the caller.
47CXString createDup(const char *String);
48
49/// Create a CXString object from a StringRef. New CXString may
50/// contain a pointer to the undrelying data of \p String.
51///
52/// \p String should not be changed by the caller afterwards.
53CXString createRef(StringRef String);
54
55/// Create a CXString object from a StringRef. New CXString will
56/// contain a copy of \p String.
57///
58/// \p String can be changed or freed by the caller.
59CXString createDup(StringRef String);
60
61// Usually std::string is intended to be used as backing storage for CXString.
62// In this case, call \c createRef(String.c_str()).
63//
64// If you need to make a copy, call \c createDup(StringRef(String)).
65CXString createRef(std::string String) = delete;
66
67/// Create a CXString object that is backed by a string buffer.
68CXString createCXString(CXStringBuf *buf);
69
70CXStringSet *createSet(const std::vector<std::string> &Strings);
71
72/// A string pool used for fast allocation/deallocation of strings.
73class CXStringPool {
74public:
75 ~CXStringPool();
76
77 CXStringBuf *getCXStringBuf(CXTranslationUnit TU);
78
79private:
80 std::vector<CXStringBuf *> Pool;
81
82 friend struct CXStringBuf;
83};
84
85struct CXStringBuf {
86 SmallString<128> Data;
87 CXTranslationUnit TU;
88
89 CXStringBuf(CXTranslationUnit TU) : TU(TU) {}
90
91 /// Return this buffer to the pool.
92 void dispose();
93};
94
95CXStringBuf *getCXStringBuf(CXTranslationUnit TU);
96
97/// Returns true if the CXString data is managed by a pool.
98bool isManagedByPool(CXString str);
99
100}
101
102static inline StringRef getContents(const CXUnsavedFile &UF) {
103 return StringRef(UF.Contents, UF.Length);
104}
105}
106
107#endif
108
109