source: Revenant/marslib/include/mars_log.h@ 25c4774

port/mars-tycoon
Last change on this file since 25c4774 was 80a6a52, checked in by Jonathan Neufeld <support@…>, 3 years ago

Get to a compile state for terrain procedural generation

  • Property mode set to 100755
File size: 4.7 KB
Line 
1#ifndef __TOTILOG_H__
2#define __TOTILOG_H__
3
4#include <fstream>
5#include <string>
6#include <vector>
7#include <map>
8#include <set>
9
10#include <boost/thread.hpp>
11
12#include "mars_util.h"
13
14namespace mars
15{
16 enum LogSettings
17 {
18 Log_File = 1 << 0,
19 Log_Function = 1 << 1,
20 Log_Line = 1 << 2,
21 Log_Time = 1 << 3,
22 Log_Thread = 1 << 4
23 };
24
25 class Outputter
26 {
27 private:
28 std::ofstream * _pOut;
29 mutable boost::mutex * _pMutex;
30
31 template< typename CTR >
32 inline Outputter & writeContainer (const CTR & ctr)
33 {
34 if (_pOut != NULL)
35 {
36 *_pOut << "[";
37 for (typename CTR::const_iterator i = ctr.begin(); i != ctr.end(); ++i)
38 {
39 if (i != ctr.begin())
40 *_pOut << ", ";
41 *this << *i;
42 }
43 *_pOut << "]";
44 }
45 return *this;
46 }
47
48 public:
49 Outputter ();
50 Outputter (std::ofstream * pOut, const unsigned int enSettings, boost::mutex * pMutex, const time_t & tTime, const char * szFile, const unsigned int nLine, const char * szFunction, const boost::thread::id & idThread);
51 ~Outputter();
52
53 template< typename T >
54 inline Outputter & operator << (const T & nVal)
55 {
56 if (_pOut != NULL)
57 *_pOut << nVal;
58 return *this;
59 }
60
61 template< typename T >
62 inline Outputter & operator << (const BBox< T > & bbox)
63 {
64 if (_pOut != NULL)
65 *_pOut
66 << typeid(BBox< T >).name()
67 << "[left=" << bbox.left << ", top="
68 << bbox.top << ", right=" << bbox.right << ", bottom="
69 << bbox.bottom << "]";
70
71 return *this;
72 }
73
74 template< typename T >
75 inline Outputter & operator << (const Range< T > & rng)
76 {
77 if (_pOut != NULL)
78 {
79 *_pOut
80 << typeid(Range< T >).name()
81 << '[' << rng.minimum << " <= x <= " << rng.maximum << ']';
82 }
83
84 return *this;
85 }
86
87 template< typename T >
88 inline Outputter & operator << (const RangeX< T > & rng)
89 {
90 if (_pOut != NULL)
91 {
92 *_pOut
93 << typeid(Range< T >).name()
94 << '[' << rng.minimum << " <= x <= " << rng.maximum;
95
96 if (rng.step != (std::numeric_limits<T>::epsilon() == 0 ? 1 : std::numeric_limits<T>::epsilon()))
97 *_pOut << ", step=" << rng.step;
98
99 *_pOut << ']';
100 }
101
102 return *this;
103 }
104
105 template< typename T >
106 inline Outputter & operator << (const T * ptr)
107 {
108 if (_pOut != NULL)
109 *_pOut
110 << typeid(T *).name() << "=0x" << std::setw(4) << std::setfill('0') << std::ios::hex << ptr;
111
112 return *this;
113 }
114
115 inline Outputter & operator << (const std::string & str)
116 {
117 if (_pOut != NULL)
118 *_pOut << str;
119 return *this;
120 }
121 inline Outputter & operator << (const char * sz)
122 {
123 if (_pOut != NULL)
124 *_pOut << sz;
125 return *this;
126 }
127
128 template< typename A, typename B >
129 inline Outputter & operator << (const std::pair< A, B > & pair)
130 {
131 if (_pOut != NULL)
132 *_pOut << '(' << pair.first << ", " << pair.second << ')';
133 return *this;
134 }
135
136 template< typename V >
137 inline Outputter & operator << (const std::set< V > & sett)
138 { return writeContainer(sett); }
139
140 template< typename V >
141 inline Outputter & operator << (const std::vector< V > & vec)
142 { return writeContainer(vec); }
143
144 template< typename K, typename V >
145 inline Outputter & operator << (const std::map< K, V > & map)
146 {
147 if (_pOut != NULL)
148 {
149 *_pOut << "[";
150 for (typename std::map< K, V >::const_iterator i = map.begin(); i != map.end(); ++i)
151 {
152 if (i != map.begin())
153 *_pOut << ", ";
154 *this << i->first << " -> " << i->second;
155 }
156 *_pOut << "]";
157 }
158 return *this;
159 }
160 };
161
162 class Log
163 {
164 public:
165 enum Level
166 {
167 Info = 0,
168 Warn = 1,
169 Fatal = 2,
170 Debug = 3
171 };
172
173#ifndef MARS_LOGLEVEL
174 #define MARS_LOGLEVEL Fatal
175#endif
176 Log (const std::string & sFilename = "mars.log", const Level enLevel = MARS_LOGLEVEL, const unsigned int enSettings = Log_Function | Log_Time);
177
178 Outputter stream (const Level enLevel = Info, const char * szFile = NULL, const char * szFunction = NULL, const unsigned int nLine = 0);
179 static Log & getSingleton ();
180
181 inline void setLevel (const Level enLevel) { _enLevel = enLevel; }
182 inline Level getLevel () const { return _enLevel; }
183
184 inline void setSettings (const unsigned int enSettings) { _enSettings = enSettings; }
185 inline unsigned int getSettings () const { return _enSettings; }
186 inline void toggleSetting (const LogSettings enSetting) { _enSettings ^= enSetting; }
187 inline void addSettings (const unsigned int enSettings) { _enSettings |= enSettings; }
188 inline void removeSettings (const unsigned int enSettings) { _enSettings &= ~enSettings; }
189
190 ~Log();
191
192 private:
193 std::ofstream _outfile;
194 boost::mutex _mutex;
195 unsigned int _enSettings;
196 Level _enLevel;
197
198 const time_t _tTimeStart;
199 };
200
201 extern Log g_log;
202}
203
204#define LOG(l) mars::g_log.stream(l, __FILE__, __FUNCTION__, __LINE__)
205#define LOGN LOG(mars::Log::Info)
206#define LOGD LOG(mars::Log::Debug)
207
208#endif
Note: See TracBrowser for help on using the repository browser.