diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp index aaa8f8eeb67a1..d240c255e49b1 100644 --- a/clang/tools/libclang/CXString.cpp +++ b/clang/tools/libclang/CXString.cpp @@ -107,15 +107,28 @@ CXString createCXString(CXStringBuf *buf) { return Str; } -CXStringSet *createSet(const std::vector &Strings) { +template +static CXStringSet *createSetImpl(ArrayRef Strings) { CXStringSet *Set = new CXStringSet; Set->Count = Strings.size(); Set->Strings = new CXString[Set->Count]; - for (unsigned SI = 0, SE = Set->Count; SI < SE; ++SI) - Set->Strings[SI] = createDup(Strings[SI]); + for (unsigned SI = 0, SE = Set->Count; SI < SE; ++SI) { + if constexpr (Copy) { + Set->Strings[SI] = createDup(Strings[SI]); + } else { + Set->Strings[SI] = createRef(Strings[SI]); + } + } return Set; } +CXStringSet *createSet(const std::vector &Strings) { + return createSetImpl(Strings); +} + +CXStringSet *createRefSet(ArrayRef Strings) { + return createSetImpl(Strings); +} //===----------------------------------------------------------------------===// // String pools. diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h index 809bdec3d677f..c20b68a83c29e 100644 --- a/clang/tools/libclang/CXString.h +++ b/clang/tools/libclang/CXString.h @@ -67,8 +67,14 @@ CXString createRef(std::string String) = delete; /// Create a CXString object that is backed by a string buffer. CXString createCXString(CXStringBuf *buf); +/// Create a CXStringSet object that owns the strings. Such an object should be +/// disposed with clang_disposeStringSet. CXStringSet *createSet(const std::vector &Strings); +/// Create a CXStringSet object that does not own the strings. Such an object +/// should still be disposed with clang_disposeStringSet. +CXStringSet *createRefSet(ArrayRef Strings); + /// A string pool used for fast allocation/deallocation of strings. class CXStringPool { public: @@ -105,4 +111,3 @@ static inline StringRef getContents(const CXUnsavedFile &UF) { } #endif -