[Support] Add type-safe alternative to llvm::format()
authorNick Kledzik <kledzik@apple.com>
Thu, 25 Sep 2014 20:30:58 +0000 (20:30 +0000)
committerNick Kledzik <kledzik@apple.com>
Thu, 25 Sep 2014 20:30:58 +0000 (20:30 +0000)
commite93da60ac47f3b35678ef0b86ce329830d1f5555
treef3cf0627a045e0857761d09f62bb2f283498a1af
parentf85d5cfbf6e0c013af62268973b23af2ea073d92
[Support] Add type-safe alternative to llvm::format()

llvm::format() is somewhat unsafe. The compiler does not check that integer
parameter size matches the %x or %d size and it does not complain when a
StringRef is passed for a %s.  And correctly using a StringRef with format() is
ugly because you have to convert it to a std::string then call c_str().

The cases where llvm::format() is useful is controlling how numbers and
strings are printed, especially when you want fixed width output.  This
patch adds some new formatting functions to raw_streams to format numbers
and StringRefs in a type safe manner. Some examples:

   OS << format_hex(255, 6)        => "0x00ff"
   OS << format_hex(255, 4)        => "0xff"
   OS << format_decimal(0, 5)      => "    0"
   OS << format_decimal(255, 5)    => "  255"
   OS << right_justify(Str, 5)     => "  foo"
   OS << left_justify(Str, 5)      => "foo  "

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218463 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Support/Format.h
include/llvm/Support/raw_ostream.h
lib/Support/raw_ostream.cpp
unittests/Support/raw_ostream_test.cpp