#include "Setup.hh"
#include "CloneSource.hh"
#include <senf/Scheduler/Scheduler.hh>
-#include <senf/Utils/membind.hh>
#include <senf/Utils/auto_unit_test.hh>
#include <boost/test/test_tools.hpp>
namespace module = senf::ppi::module;
namespace scheduler = senf::scheduler;
-namespace {
- void timeout() {
- scheduler::terminate();
- }
-
+namespace {
void run(senf::ClockService::clock_type t) {
- scheduler::TimerEvent timeoutTimer ("timeoutTimer", &timeout,
- senf::ClockService::now() + t);
+ scheduler::TimerEvent timeout(
+ "test-timeout", &scheduler::terminate, scheduler::now() + t);
ppi::run();
}
}
#define prefix_ inline
///////////////////////////////cci.p///////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////
+// senf::format::eng
+
prefix_ senf::format::eng::eng(float v, float d)
: v_ (v), d_ (d), haveWidth_ (false), width_ (0), havePrecision_ (false), precision_ (0),
haveFill_ (false), fill_ (' '), mask_ (), flags_ ()
return *this;
}
+///////////////////////////////////////////////////////////////////////////
+// senf::format::IndentHelper
+
+prefix_ senf::format::IndentHelper::IndentHelper()
+ : instance_level(1)
+{
+ ++static_level;
+}
+
+prefix_ senf::format::IndentHelper::~IndentHelper()
+{
+ static_level -= instance_level;
+}
+
+prefix_ void senf::format::IndentHelper::increase()
+{
+ ++static_level;
+ ++instance_level;
+}
+
+prefix_ unsigned int senf::format::IndentHelper::level()
+ const
+{
+ return static_level;
+}
+
prefix_ std::ostream & senf::format::operator<<(std::ostream & os, senf::format::IndentHelper const & indent)
{
- for (unsigned int i = 0; i < indent.static_level; ++i)
+ for (unsigned int i=0, j=indent.level(); i<j; ++i)
os << " ";
return os;
}
+
+
+
+
+
///////////////////////////////cci.e///////////////////////////////////////
#undef prefix_
#endif
+ /** \brief Helper class to easily achieve indent levels
+
+ This class helps to achieve indent levels across function calls. Every instance
+ increases the static indent level. On destruction the level is decreased to the level
+ before the instance.
+ The following example illustrates the use of this class:
+ \code
+ void f1() {
+ senf::format::IndentHelper indent;
+ std::cout << indent << "f1\n";
+ }
+ void f2() {
+ senf::format::IndentHelper indent;
+ std::cout << indent << "f2 begin\n";
+ f1();
+ std::cout << indent << "f2 end\n";
+ }
+ f2()
+ \endcode
+ Output:
+ <pre>
+ f2 begin
+ f1
+ f2 end
+ </pre>
+ Here <tt>f1()</tt> and <tt>f2()</tt> don't need to know to current indent level,
+ they just increase the level by instantiating IndentHelper.
+
+ \ingroup senf_utils_format
+ */
class IndentHelper
{
static unsigned int static_level;
-
unsigned int instance_level;
public:
- IndentHelper () : instance_level(1) { ++static_level; }
- ~IndentHelper () { static_level -= instance_level; }
- void increase() { ++static_level; ++instance_level; }
-
- friend std::ostream & operator<<(std::ostream & os, IndentHelper const & indent);
+
+ IndentHelper(); ///< Construct new IndentHelper instance
+ /**< The static indent level is increased by one. */
+ ~IndentHelper(); ///< Destruct IndentHelper instance
+ /**< The static indent level will be decreased to the
+ level before the instance. */
+ void increase(); ///< Increase the indent level
+ /**< The indent level of the instance is increases by one. */
+ unsigned int level() const; ///< return the current indent level
};
+
+ /** \brief Output indent to given ostream
+ \related IndentHelper
+ */
std::ostream & operator<<(std::ostream & os, IndentHelper const & indent);
}}
# undef CheckFormat
}
+namespace {
+ void f1(std::ostream & os) {
+ senf::format::IndentHelper indent;
+ os << indent << "f1\n";
+ }
+ void f2(std::ostream & os) {
+ senf::format::IndentHelper indent;
+ os << indent << "f2_1\n";
+ f1( os);
+ os << indent << "f2_2\n";
+ indent.increase();
+ os << indent << "f2_3\n";
+ }
+}
+SENF_AUTO_UNIT_TEST(indent)
+{
+ std::stringstream ss;
+ f2(ss);
+ BOOST_CHECK_EQUAL( ss.str(),
+ " f2_1\n"
+ " f1\n"
+ " f2_2\n"
+ " f2_3\n");
+}
+
///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_