Files
gps/tools/local/circt/include/llvm/Support/InterleavedRange.h
T
2026-07-12 11:01:51 +03:00

97 lines
3.4 KiB
C++

//===- InterleavedRange.h - Output stream formatting for ranges -----------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// Implements format objects for printing ranges to output streams.
// For example:
// ```c++
// ArrayRef<Type> Types = ...;
// OS << "Types: " << interleaved(Types); // ==> "Types: i32, f16, i8"
// ArrayRef<int> Values = ...;
// OS << "Values: " << interleaved_array(Values); // ==> "Values: [1, 2, 3]"
// ```
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SUPPORT_INTERLEAVED_RANGE_H
#define LLVM_SUPPORT_INTERLEAVED_RANGE_H
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/raw_ostream.h"
namespace llvm {
/// Format object class for interleaved ranges. Supports specifying the
/// separator and, optionally, the prefix and suffix to be printed surrounding
/// the range.
/// Uses the operator '<<' of the range element type for printing. The range
/// type itself does not have to have an '<<' operator defined.
template <typename Range> class InterleavedRange {
const Range &TheRange;
StringRef Separator;
StringRef Prefix;
StringRef Suffix;
public:
InterleavedRange(const Range &R, StringRef Separator, StringRef Prefix,
StringRef Suffix)
: TheRange(R), Separator(Separator), Prefix(Prefix), Suffix(Suffix) {}
template <typename OStream>
friend OStream &operator<<(OStream &OS, const InterleavedRange &Interleaved) {
OS << Interleaved.Prefix;
llvm::interleave(Interleaved.TheRange, OS, Interleaved.Separator);
OS << Interleaved.Suffix;
return OS;
}
std::string str() const {
std::string Result;
raw_string_ostream Stream(Result);
Stream << *this;
return Result;
}
operator std::string() const { return str(); }
};
/// Output range `R` as a sequence of interleaved elements. Requires the range
/// element type to be printable using `raw_ostream& operator<<`. The
/// `Separator` and `Prefix` / `Suffix` can be customized. Examples:
/// ```c++
/// SmallVector<int> Vals = {1, 2, 3};
/// OS << interleaved(Vals); // ==> "1, 2, 3"
/// OS << interleaved(Vals, ";"); // ==> "1;2;3"
/// OS << interleaved(Vals, " ", "{", "}"); // ==> "{1 2 3}"
/// ```
template <typename Range>
InterleavedRange<Range> interleaved(const Range &R, StringRef Separator = ", ",
StringRef Prefix = "",
StringRef Suffix = "") {
return {R, Separator, Prefix, Suffix};
}
/// Output range `R` as an array of interleaved elements. Requires the range
/// element type to be printable using `raw_ostream& operator<<`. The
/// `Separator` can be customized. Examples:
/// ```c++
/// SmallVector<int> Vals = {1, 2, 3};
/// OS << interleaved_array(Vals); // ==> "[1, 2, 3]"
/// OS << interleaved_array(Vals, ";"); // ==> "[1;2;3]"
/// OS << interleaved_array(Vals, " "); // ==> "[1 2 3]"
/// ```
template <typename Range>
InterleavedRange<Range> interleaved_array(const Range &R,
StringRef Separator = ", ") {
return {R, Separator, "[", "]"};
}
} // end namespace llvm
#endif // LLVM_SUPPORT_INTERLEAVED_RANGE_H