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