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 Listatic 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