Context.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "multiline_ostream.hpp"
4 #include "../Defs.hpp"
5 #include <sstream>
6 #include "StringIO.hpp"
7 
8 namespace iv
9 {
10 
14 class Context
15 {
16 public:
17  Context();
18  virtual ~Context(){}
19 
24  class Endl{};
25 
29  class Begin{};
30  class End{};
31 
35  template< class ... Items >
36  void log( SrcInfo const & info, LogId id, Items const & ... items ) const;
37 
40  bool log_enabled( LogId id ) const;
41 
45  template< class ... Items >
46  void warning( SrcInfo const & info, Items const & ... items ) const;
47 
48 protected:
53  virtual bool log_process_enabled( LogId id ) const = 0;
54 
57  virtual void log_process( SrcInfo const & info, LogId id, std::string const & message ) const = 0;
58 
59 private:
60  template< class T, class ... TT >
61  void WriteItemsToStream( multiline_ostream & mss, T const & first, TT const & ... rest ) const;
62 
63  template< class ... TT >
64  void WriteItemsToStream( multiline_ostream & mss, Endl, TT const & ... rest ) const;
65  template< class ... TT >
66  void WriteItemsToStream( multiline_ostream & mss, Begin, TT const & ... rest ) const;
67  template< class ... TT >
68  void WriteItemsToStream( multiline_ostream & mss, End, TT const & ... rest ) const;
69 
70  void WriteItemsToStream( multiline_ostream & mss ) const{}
71 
72 private:
77  mutable std::stringstream ss;
78  mutable multiline_ostream mss;
79 };
80 
81 }
82 
83 #include "Context.inl"