Conversely, Log objects may specify insertion `resistances' through their setLevel members. If the level's `force' is equal to or exceeds the Log object's `resistance' then the insertion is performed, otherwise the insertion is ignored. A single insertion statement may contain multiple level calls. If so, then each level call updates the `force' of insertions following the level call.
By default insertions into Log objects not preceded by level insertions are completed.
When a level object is inserted into another kind of std::ostream object the level object performs no actions.
Copy and move constructors (and assignment operators) are available.
#include <iostream>
#include <iomanip>
//#include <bobcat/log>
#include "../log"
#include <bobcat/level>
using namespace std;
using namespace FBB;
int main()
{
// Log &log = Log::initialize("&1"); // uses the static Log object
Log log; // explicitly defining a Log object
// log.open("/tmp/out"); // or at once: Log log{ "/tmp/out" }
log << "This message is written to cout" << nl <<
setw(16) << ' ' << "occupying multiple lines\n";
log.off();
log << "This message is not shown\n";
log << "This message is not shown\n";
log << fnl;
log << "This message is not shown\n";
log.on(2);
log << "This message is shown\n";
log << level(0) << "not shown" << level(2) << "shown at level 2\n";
log << level(3) << "at level(3)" << level(1) << "not shown" << fnl;
log << "separate new line\n";
log << level(2) << "in business again\n";
log << "final line\n";
log.str("ab");
log('a') << "hello a!" << endl;
log('b') << "hello b!" << nl <<
setw(16) << ' ' << "so far, so good" << endl;
log << "not shown" << endl;
log('c') << "not shown\n";
log << "not shown\n";
log.setLevel(2);
log << level(2) << "in business again\n";
}