mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-04-16 22:50:01 +00:00

to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
77 lines
2.1 KiB
C++
77 lines
2.1 KiB
C++
//===- FormatAdapters.h - Formatters for common LLVM types -----*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_SUPPORT_FORMATCOMMON_H
|
|
#define LLVM_SUPPORT_FORMATCOMMON_H
|
|
|
|
#include "llvm/ADT/SmallString.h"
|
|
#include "llvm/Support/FormatVariadicDetails.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
namespace llvm {
|
|
enum class AlignStyle { Left, Center, Right };
|
|
|
|
struct FmtAlign {
|
|
detail::format_adapter &Adapter;
|
|
AlignStyle Where;
|
|
size_t Amount;
|
|
char Fill;
|
|
|
|
FmtAlign(detail::format_adapter &Adapter, AlignStyle Where, size_t Amount,
|
|
char Fill = ' ')
|
|
: Adapter(Adapter), Where(Where), Amount(Amount), Fill(Fill) {}
|
|
|
|
void format(raw_ostream &S, StringRef Options) {
|
|
// If we don't need to align, we can format straight into the underlying
|
|
// stream. Otherwise we have to go through an intermediate stream first
|
|
// in order to calculate how long the output is so we can align it.
|
|
// TODO: Make the format method return the number of bytes written, that
|
|
// way we can also skip the intermediate stream for left-aligned output.
|
|
if (Amount == 0) {
|
|
Adapter.format(S, Options);
|
|
return;
|
|
}
|
|
SmallString<64> Item;
|
|
raw_svector_ostream Stream(Item);
|
|
|
|
Adapter.format(Stream, Options);
|
|
if (Amount <= Item.size()) {
|
|
S << Item;
|
|
return;
|
|
}
|
|
|
|
size_t PadAmount = Amount - Item.size();
|
|
switch (Where) {
|
|
case AlignStyle::Left:
|
|
S << Item;
|
|
fill(S, PadAmount);
|
|
break;
|
|
case AlignStyle::Center: {
|
|
size_t X = PadAmount / 2;
|
|
fill(S, X);
|
|
S << Item;
|
|
fill(S, PadAmount - X);
|
|
break;
|
|
}
|
|
default:
|
|
fill(S, PadAmount);
|
|
S << Item;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private:
|
|
void fill(llvm::raw_ostream &S, uint32_t Count) {
|
|
for (uint32_t I = 0; I < Count; ++I)
|
|
S << Fill;
|
|
}
|
|
};
|
|
}
|
|
|
|
#endif
|