109 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file defines routines for manipulating CXStrings.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_CLANG_TOOLS_LIBCLANG_CXSTRING_H14#define LLVM_CLANG_TOOLS_LIBCLANG_CXSTRING_H15 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. New38/// 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. New44/// 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 may50/// 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 will56/// 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#endif108 109