File: Synopsis/Trace.hh 1
2
3
4
5
6
7
8#ifndef Synopsis_Trace_hh_
9#define Synopsis_Trace_hh_
10
11#include <iostream>
12#include <string>
13
14namespace Synopsis
15{
16
17class Trace
18{
19public:
20
21
22 enum Category { NONE=0x0,
23 PTREE=0x01,
24 SYMBOLLOOKUP=0x02,
25 PARSING=0x04,
26 TRANSLATION=0x08,
27 ALL=0xff};
28
29 struct Entry
30 {
31 Entry(bool e);
32 Entry(Entry const &e) : enabled(e.enabled) { e.enabled = false;}
33 ~Entry();
34
35 template <typename T> Entry const &operator<<(T const &t) const;
36
37 mutable bool enabled;
38 };
39 friend struct Entry;
40 Trace(std::string const &s, unsigned int c)
41 : my_scope(s), my_visibility(my_mask & c)
42 {
43 if (!my_visibility) return;
44 std::cout << indent() << "entering " << my_scope << std::endl;
45 ++my_level;
46 }
47 template <typename T>
48 Trace(std::string const &s, unsigned int c, T const &t)
49 : my_scope(s), my_visibility(my_mask & c)
50 {
51 if (!my_visibility) return;
52 std::cout << indent() << "entering " << my_scope << ' ' << t << std::endl;
53 ++my_level;
54 }
55 ~Trace()
56 {
57 if (!my_visibility) return;
58 --my_level;
59 std::cout << indent() << "leaving " << my_scope << std::endl;
60 }
61
62 template <typename T>
63 Entry operator<<(T const &t) const;
64
65 static void enable(unsigned int mask = ALL) { my_mask = mask;}
66
67private:
68 static std::string indent() { return std::string(my_level, ' ');}
69
70 static unsigned int my_mask;
71 static size_t my_level;
72 std::string my_scope;
73 bool my_visibility;
74};
75
76inline Trace::Entry::Entry(bool e)
77 : enabled(e)
78{
79 if (enabled)
80 std::cout << Trace::indent();
81}
82
83inline Trace::Entry::~Entry()
84{
85 if (enabled)
86 std::cout << std::endl;
87}
88
89template <typename T>
90inline Trace::Entry const &Trace::Entry::operator<<(T const &t) const
91{
92 if (enabled)
93 std::cout << t;
94 return *this;
95}
96
97template <typename T>
98inline Trace::Entry Trace::operator<<(T const &t) const
99{
100 Entry entry(my_visibility);
101 return entry << t;
102}
103
104}
105
106#endif
Generated on Thu Apr 16 16:28:03 2009 by
synopsis (version devel)