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*e5dd7070Spatrickstatic 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