Last active
January 13, 2018 22:59
-
-
Save tbfleming/8e8e50c560cc3aba165d5ddb4f2c2c16 to your computer and use it in GitHub Desktop.
cib demo: Boost.Format
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ---------------------------------------------------------------------------- | |
// sample_formats.cpp : example of basic usage of format | |
// ---------------------------------------------------------------------------- | |
// Copyright Samuel Krempp 2003. Use, modification, and distribution are | |
// subject to the Boost Software License, Version 1.0. (See accompanying | |
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
// See http://www.boost.org/libs/format for library home page | |
// ---------------------------------------------------------------------------- | |
// cib:{"fetch":"https://cdn.rawgit.com/tbfleming/cib-zips/a2a6f431/boost-1.66.0-headers.zip", "system_includes":["."], "unzip_compiler":true} | |
#include <iostream> | |
#include <iomanip> | |
#include <cassert> | |
#include "boost/format.hpp" | |
// 2 custom namespaces, to bring in a few useful names : | |
namespace MyNS_ForOutput { | |
using std::cout; using std::cerr; | |
using std::string; | |
using std::endl; using std::flush; | |
using boost::format; | |
using boost::io::group; | |
} | |
namespace MyNS_Manips { | |
using std::setfill; | |
using std::setw; | |
using std::hex ; | |
using std::dec ; | |
// gcc-2.95 doesnt define the next ones | |
// using std::showbase ; | |
// using std::left ; | |
// using std::right ; | |
// using std::internal ; | |
} | |
int main(){ | |
using namespace MyNS_ForOutput; | |
using namespace MyNS_Manips; | |
std::cout << format("%|1$1| %|2$3|") % "Hello" % 3 << std::endl; | |
// Reordering : | |
cout << format("%1% %2% %3% %2% %1% \n") % "o" % "oo" % "O"; // 'simple' style. | |
// prints "o oo O oo o \n" | |
cout << format("(x,y) = (%1$+5d,%2$+5d) \n") % -23 % 35; // Posix-Printf style | |
// No reordering : | |
cout << format("writing %s, x=%s : %d-th step \n") % "toto" % 40.23 % 50; | |
// prints "writing toto, x=40.23 : 50-th step \n" | |
cout << format("(x,y) = (%+5d,%+5d) \n") % -23 % 35; | |
cout << format("(x,y) = (%|+5|,%|+5|) \n") % -23 % 35; | |
cout << format("(x,y) = (%|1$+5|,%|2$+5|) \n") % -23 % 35; | |
// all those are the same, it prints "(x,y) = ( -23, +35) \n" | |
// Using manipulators, via 'group' : | |
cout << format("%2% %1% %2%\n") % 1 % group(setfill('X'), hex, setw(4), 16+3) ; | |
// prints "XX13 1 XX13\n" | |
// printf directives's type-flag can be used to pass formatting options : | |
cout << format("_%1$4d_ is : _%1$#4x_, _%1$#4o_, and _%1$s_ by default\n") % 18; | |
// prints "_ 18_ is : _0x12_, _ 022_, and _18_ by default\n" | |
// Taking the string value : | |
std::string s; | |
s= str( format(" %d %d ") % 11 % 22 ); | |
assert( s == " 11 22 "); | |
// ----------------------------------------------- | |
// %% prints '%' | |
cout << format("%%##%#x ") % 20 << endl; | |
// prints "%##0x14 " | |
// ----------------------------------------------- | |
// Enforcing the right number of arguments | |
// Too much arguments will throw an exception when feeding the unwanted argument : | |
try { | |
format(" %1% %1% ") % 101 % 102; | |
// the format-string refers to ONE argument, twice. not 2 arguments. | |
// thus giving 2 arguments is an error | |
} | |
catch (boost::io::too_many_args& exc) { | |
cerr << exc.what() << "\n\t\t***Dont worry, that was planned\n"; | |
} | |
// Too few arguments when requesting the result will also throw an exception : | |
try { | |
cerr << format(" %|3$| ") % 101; | |
// even if %1$ and %2$ are not used, you should have given 3 arguments | |
} | |
catch (boost::io::too_few_args& exc) { | |
cerr << exc.what() << "\n\t\t***Dont worry, that was planned\n"; | |
} | |
cerr << "\n\nEverything went OK, exiting. \n"; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment