[clang] [clang] Adding an API to create a `CXStringSet` from a Vector of `StringRef`s (PR #136773)
Qiongsi Wu via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 23 08:28:36 PDT 2025
https://github.com/qiongsiwu updated https://github.com/llvm/llvm-project/pull/136773
>From 7f39ebcc34fe3f40c2554ff7fa93baca5b4634a0 Mon Sep 17 00:00:00 2001
From: Qiongsi Wu <qiongsi_wu at apple.com>
Date: Tue, 22 Apr 2025 14:17:15 -0700
Subject: [PATCH 1/4] Adding CXStringSet *createSet that takes a vector of
StringRef as input.
---
clang/tools/libclang/CXString.cpp | 10 +++++++++-
clang/tools/libclang/CXString.h | 3 +++
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp
index aaa8f8eeb67a1..7e46fcc3b8e69 100644
--- a/clang/tools/libclang/CXString.cpp
+++ b/clang/tools/libclang/CXString.cpp
@@ -107,7 +107,8 @@ CXString createCXString(CXStringBuf *buf) {
return Str;
}
-CXStringSet *createSet(const std::vector<std::string> &Strings) {
+template <typename StringTy>
+static CXStringSet *createSetImpl(const std::vector<StringTy> &Strings) {
CXStringSet *Set = new CXStringSet;
Set->Count = Strings.size();
Set->Strings = new CXString[Set->Count];
@@ -116,6 +117,13 @@ CXStringSet *createSet(const std::vector<std::string> &Strings) {
return Set;
}
+CXStringSet *createSet(const std::vector<std::string> &Strings) {
+ return createSetImpl(Strings);
+}
+
+CXStringSet *createSet(const std::vector<StringRef> &Strings) {
+ return createSetImpl(Strings);
+}
//===----------------------------------------------------------------------===//
// String pools.
diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h
index 809bdec3d677f..24c4092a9a2c0 100644
--- a/clang/tools/libclang/CXString.h
+++ b/clang/tools/libclang/CXString.h
@@ -67,7 +67,10 @@ 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 owns the strings. Such an object should be
+/// disposed with clang_disposeStringSet.
CXStringSet *createSet(const std::vector<std::string> &Strings);
+CXStringSet *createSet(const std::vector<StringRef> &Strings);
/// A string pool used for fast allocation/deallocation of strings.
class CXStringPool {
>From 506c91d22bc6284a64f31a06a340110d5847def1 Mon Sep 17 00:00:00 2001
From: Qiongsi Wu <qiongsi_wu at apple.com>
Date: Tue, 22 Apr 2025 16:19:57 -0700
Subject: [PATCH 2/4] Revise so that we can create an interface to avoid string
copying.
---
clang/tools/libclang/CXString.cpp | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp
index 7e46fcc3b8e69..edfbe354c3331 100644
--- a/clang/tools/libclang/CXString.cpp
+++ b/clang/tools/libclang/CXString.cpp
@@ -107,22 +107,27 @@ CXString createCXString(CXStringBuf *buf) {
return Str;
}
-template <typename StringTy>
-static CXStringSet *createSetImpl(const std::vector<StringTy> &Strings) {
+template <typename StringTy, bool Copy>
+static CXStringSet *createSetImpl(ArrayRef<StringTy> 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<std::string> &Strings) {
- return createSetImpl(Strings);
+ return createSetImpl<std::string, true>(ArrayRef<std::string>(Strings));
}
-CXStringSet *createSet(const std::vector<StringRef> &Strings) {
- return createSetImpl(Strings);
+CXStringSet *createRefSet(ArrayRef<StringRef> Strings) {
+ return createSetImpl<StringRef, false>(Strings);
}
//===----------------------------------------------------------------------===//
>From f3df9577b152794708056c379c08bbe306d86e6e Mon Sep 17 00:00:00 2001
From: Qiongsi Wu <qiongsi_wu at apple.com>
Date: Tue, 22 Apr 2025 16:22:25 -0700
Subject: [PATCH 3/4] Fix function prototype.
---
clang/tools/libclang/CXString.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h
index 24c4092a9a2c0..4662ab75f1286 100644
--- a/clang/tools/libclang/CXString.h
+++ b/clang/tools/libclang/CXString.h
@@ -70,7 +70,7 @@ CXString createCXString(CXStringBuf *buf);
/// Create a CXStringSet object owns the strings. Such an object should be
/// disposed with clang_disposeStringSet.
CXStringSet *createSet(const std::vector<std::string> &Strings);
-CXStringSet *createSet(const std::vector<StringRef> &Strings);
+CXStringSet *createRefSet(ArrayRef<StringRef> Strings);
/// A string pool used for fast allocation/deallocation of strings.
class CXStringPool {
>From ea4e8c60a99af5c00c6647bc0ff6d22b05bb508b Mon Sep 17 00:00:00 2001
From: Qiongsi Wu <qiongsi_wu at apple.com>
Date: Wed, 23 Apr 2025 08:28:24 -0700
Subject: [PATCH 4/4] Updating comments.
---
clang/tools/libclang/CXString.h | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h
index 4662ab75f1286..c20b68a83c29e 100644
--- a/clang/tools/libclang/CXString.h
+++ b/clang/tools/libclang/CXString.h
@@ -67,9 +67,12 @@ 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 owns the strings. Such an object should be
+/// Create a CXStringSet object that owns the strings. Such an object should be
/// disposed with clang_disposeStringSet.
CXStringSet *createSet(const std::vector<std::string> &Strings);
+
+/// Create a CXStringSet object that does not own the strings. Such an object
+/// should still be disposed with clang_disposeStringSet.
CXStringSet *createRefSet(ArrayRef<StringRef> Strings);
/// A string pool used for fast allocation/deallocation of strings.
@@ -108,4 +111,3 @@ static inline StringRef getContents(const CXUnsavedFile &UF) {
}
#endif
-
More information about the cfe-commits
mailing list