aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Support
diff options
context:
space:
mode:
authorJakub Kuderski <jakub@nod-labs.com>2025-04-15 23:44:33 -0400
committerGitHub <noreply@github.com>2025-04-15 23:44:33 -0400
commitb07c88563febdb62b82daad0480d7b6131bc54d4 (patch)
treef730db90f03994830170f9ff4d2c0dbbc6b2a903 /llvm/unittests/Support
parenta024d13f84dbe7b3d1eee555ddc82cdd1af814e0 (diff)
downloadllvm-b07c88563febdb62b82daad0480d7b6131bc54d4.zip
llvm-b07c88563febdb62b82daad0480d7b6131bc54d4.tar.gz
llvm-b07c88563febdb62b82daad0480d7b6131bc54d4.tar.bz2
[Support] Add format object for interleaved ranges (#135517)
Add two new format functions for printing ranges: `interleaved` and `interleaved_array`. This is meant to improve the ergonomics of printing ranges. Before this patch, we have to either use `llvm::interleave` or write a for loop by hand. For example: Before: ```c++ ArrayRef<Type> types = ...; ArrayRef<Values> values = ...; LLVM_DEBUG({ llvm::dbgs() << "Types: "; llvm::interleave_comma(llvm::dbgs(), types); llvm::dbgs() << "\n"; llvm::dbgs() << "Values: ["; llvm::interleave_comma(llvm::dbgs(), values); llvm::dbgs() << "]\n"; }): ``` After: ```c++ ArrayRef<Type> types = ...; ArrayRef<Values> values = ...; LLVM_DEBUG(llvm::dbgs() << "Types: " << interleaved(types) << "\n"); LLVM_DEBUG(llvm::dbgs() << "Values: " << interleaved_array(values) << "\n"); ``` The separator and the prefix/suffix strings are customizable.
Diffstat (limited to 'llvm/unittests/Support')
-rw-r--r--llvm/unittests/Support/CMakeLists.txt3
-rw-r--r--llvm/unittests/Support/InterleavedRangeTest.cpp70
2 files changed, 72 insertions, 1 deletions
diff --git a/llvm/unittests/Support/CMakeLists.txt b/llvm/unittests/Support/CMakeLists.txt
index 6c4e7cb..4a12a92 100644
--- a/llvm/unittests/Support/CMakeLists.txt
+++ b/llvm/unittests/Support/CMakeLists.txt
@@ -49,6 +49,7 @@ add_llvm_unittest(SupportTests
HashBuilderTest.cpp
IndexedAccessorTest.cpp
InstructionCostTest.cpp
+ InterleavedRangeTest.cpp
JSONTest.cpp
KnownBitsTest.cpp
LEB128Test.cpp
@@ -61,7 +62,7 @@ add_llvm_unittest(SupportTests
MemoryBufferRefTest.cpp
MemoryBufferTest.cpp
MemoryTest.cpp
- MustacheTest.cpp
+ MustacheTest.cpp
ModRefTest.cpp
NativeFormatTests.cpp
OptimizedStructLayoutTest.cpp
diff --git a/llvm/unittests/Support/InterleavedRangeTest.cpp b/llvm/unittests/Support/InterleavedRangeTest.cpp
new file mode 100644
index 0000000..8640b81
--- /dev/null
+++ b/llvm/unittests/Support/InterleavedRangeTest.cpp
@@ -0,0 +1,70 @@
+//===- InterleavedRangeTest.cpp - Unit tests for interleaved format -------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/InterleavedRange.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/Support/raw_ostream.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+
+TEST(InterleavedRangeTest, VectorInt) {
+ SmallVector<int> V = {0, 1, 2, 3};
+
+ // First, make sure that the raw print API works as expected.
+ std::string Buff;
+ raw_string_ostream OS(Buff);
+ OS << interleaved(V);
+ EXPECT_EQ("0, 1, 2, 3", Buff);
+ Buff.clear();
+ OS << interleaved_array(V);
+ EXPECT_EQ("[0, 1, 2, 3]", Buff);
+
+ // In the rest of the tests, use `.str()` for convenience.
+ EXPECT_EQ("0, 1, 2, 3", interleaved(V).str());
+ EXPECT_EQ("{{0,1,2,3}}", interleaved(V, ",", "{{", "}}").str());
+ EXPECT_EQ("[0, 1, 2, 3]", interleaved_array(V).str());
+ EXPECT_EQ("[0;1;2;3]", interleaved_array(V, ";").str());
+ EXPECT_EQ("0;1;2;3", interleaved(V, ";").str());
+}
+
+TEST(InterleavedRangeTest, VectorIntEmpty) {
+ SmallVector<int> V = {};
+ EXPECT_EQ("", interleaved(V).str());
+ EXPECT_EQ("{{}}", interleaved(V, ",", "{{", "}}").str());
+ EXPECT_EQ("[]", interleaved_array(V).str());
+ EXPECT_EQ("", interleaved(V, ";").str());
+}
+
+TEST(InterleavedRangeTest, VectorIntOneElem) {
+ SmallVector<int> V = {42};
+ EXPECT_EQ("42", interleaved(V).str());
+ EXPECT_EQ("{{42}}", interleaved(V, ",", "{{", "}}").str());
+ EXPECT_EQ("[42]", interleaved_array(V).str());
+ EXPECT_EQ("42", interleaved(V, ";").str());
+}
+
+struct CustomPrint {
+ int N;
+ friend raw_ostream &operator<<(raw_ostream &OS, const CustomPrint &CP) {
+ OS << "$$" << CP.N << "##";
+ return OS;
+ }
+};
+
+TEST(InterleavedRangeTest, CustomPrint) {
+ CustomPrint V[] = {{3}, {4}, {5}};
+ EXPECT_EQ("$$3##, $$4##, $$5##", interleaved(V).str());
+ EXPECT_EQ("{{$$3##;$$4##;$$5##}}", interleaved(V, ";", "{{", "}}").str());
+ EXPECT_EQ("[$$3##, $$4##, $$5##]", interleaved_array(V).str());
+}
+
+} // namespace