1 // Copyright (C) 2011 The Libphonenumber Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // Author: Philippe Liard
16 
17 #ifndef I18N_PHONENUMBERS_DEFAULT_LOGGER_H_
18 #define I18N_PHONENUMBERS_DEFAULT_LOGGER_H_
19 
20 #include "phonenumbers/logger.h"
21 
22 #include <sstream>
23 #include <string>
24 
25 namespace i18n {
26 namespace phonenumbers {
27 
28 using i18n::phonenumbers::Logger;
29 using std::stringstream;
30 
31 // Class template used to inline the right implementation for the T -> string
32 // conversion.
33 template <typename T>
34 struct ConvertToString;
35 
36 template <typename T>
37 struct ConvertToString {
DoWorkConvertToString38   static inline string DoWork(const T& s) {
39     return string(s);
40   }
41 };
42 
43 template <>
44 struct ConvertToString<int> {
45   static inline string DoWork(int n) {
46     stringstream stream;
47     stream << n;
48     string result;
49     stream >> result;
50     return result;
51   }
52 };
53 
54 class LoggerHandler {
55  public:
56   LoggerHandler(Logger* impl) : impl_(impl) {}
57 
58   ~LoggerHandler() {
59     if (impl_) {
60       impl_->WriteMessage("\n");
61     }
62   }
63 
64   template <typename T>
65   LoggerHandler& operator<<(const T& value) {
66     if (impl_) {
67       impl_->WriteMessage(ConvertToString<T>::DoWork(value));
68     }
69     return *this;
70   }
71 
72  private:
73   Logger* const impl_;
74 };
75 
76 inline LoggerHandler LOG(int n) {
77   Logger* const logger_impl = Logger::mutable_logger_impl();
78   if (logger_impl->level() < n) {
79     return LoggerHandler(NULL);
80   }
81   logger_impl->WriteLevel();
82   return LoggerHandler(logger_impl);
83 }
84 
85 inline LoggerHandler VLOG(int n) {
86   // VLOG(1) is the next logging level after LOG(DEBUG).
87   n += LOG_DEBUG;
88   return LOG(n);
89 }
90 
91 // Default logger implementation used by PhoneNumberUtil class. It outputs the
92 // messages to the standard output.
93 class StdoutLogger : public Logger {
94  public:
95   virtual ~StdoutLogger() {}
96 
97   virtual void WriteLevel();
98   virtual void WriteMessage(const string& msg);
99 };
100 
101 }  // namespace phonenumbers
102 }  // namespace i18n
103 
104 #endif  // I18N_PHONENUMBERS_DEFAULT_LOGGER_H_
105