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