1b9056914e2627627ffdd615e078a9b6020ab1cf2philip.liard@gmail.com// Copyright (C) 2011 The Libphonenumber Authors
21ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
31ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Licensed under the Apache License, Version 2.0 (the "License");
41ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// you may not use this file except in compliance with the License.
51ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// You may obtain a copy of the License at
61ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
71ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// http://www.apache.org/licenses/LICENSE-2.0
81ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
91ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Unless required by applicable law or agreed to in writing, software
101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// distributed under the License is distributed on an "AS IS" BASIS,
111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// See the License for the specific language governing permissions and
131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// limitations under the License.
141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Author: Philippe Liard
161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#ifndef I18N_PHONENUMBERS_DEFAULT_LOGGER_H_
181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#define I18N_PHONENUMBERS_DEFAULT_LOGGER_H_
191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
20a6eef04c15f45d5916ee3429d24665c49148b99bphilip.liard@gmail.com#include "phonenumbers/logger.h"
21a6eef04c15f45d5916ee3429d24665c49148b99bphilip.liard@gmail.com
22fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com#include <sstream>
23fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com#include <string>
24edea68e5614cc3f69f4910132ff3aec8064782c0philip.liard@gmail.com
25edea68e5614cc3f69f4910132ff3aec8064782c0philip.liard@gmail.comnamespace i18n {
26edea68e5614cc3f69f4910132ff3aec8064782c0philip.liard@gmail.comnamespace phonenumbers {
27edea68e5614cc3f69f4910132ff3aec8064782c0philip.liard@gmail.com
28fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.comusing i18n::phonenumbers::Logger;
291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing std::string;
304709186a7e133a95159c0eba1c8c5be69f302355philip.liard@gmail.comusing std::stringstream;
311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Class template used to inline the right implementation for the T -> string
331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// conversion.
341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comtemplate <typename T>
351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstruct ConvertToString;
361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comtemplate <typename T>
381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstruct ConvertToString {
391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  static inline string DoWork(const T& s) {
401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return string(s);
411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comtemplate <>
451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstruct ConvertToString<int> {
464709186a7e133a95159c0eba1c8c5be69f302355philip.liard@gmail.com  static inline string DoWork(int n) {
474709186a7e133a95159c0eba1c8c5be69f302355philip.liard@gmail.com    stringstream stream;
484709186a7e133a95159c0eba1c8c5be69f302355philip.liard@gmail.com    stream << n;
494709186a7e133a95159c0eba1c8c5be69f302355philip.liard@gmail.com    string result;
504709186a7e133a95159c0eba1c8c5be69f302355philip.liard@gmail.com    stream >> result;
514709186a7e133a95159c0eba1c8c5be69f302355philip.liard@gmail.com    return result;
521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass LoggerHandler {
561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com public:
571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  LoggerHandler(Logger* impl) : impl_(impl) {}
581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ~LoggerHandler() {
601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    if (impl_) {
611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      impl_->WriteMessage("\n");
621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    }
631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  template <typename T>
661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  LoggerHandler& operator<<(const T& value) {
671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    if (impl_) {
681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com      impl_->WriteMessage(ConvertToString<T>::DoWork(value));
691ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    }
701ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return *this;
711ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com private:
741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  Logger* const impl_;
751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
7767b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.cominline LoggerHandler LOG(int n) {
781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  Logger* const logger_impl = Logger::mutable_logger_impl();
791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  if (logger_impl->level() < n) {
801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return LoggerHandler(NULL);
811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  logger_impl->WriteLevel();
831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  return LoggerHandler(logger_impl);
841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
8667b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.cominline LoggerHandler VLOG(int n) {
8767b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  // VLOG(1) is the next logging level after LOG(DEBUG).
8867b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  n += LOG_DEBUG;
8967b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  return LOG(n);
901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}
911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Default logger implementation used by PhoneNumberUtil class. It outputs the
931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// messages to the standard output.
941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass StdoutLogger : public Logger {
951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com public:
961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual ~StdoutLogger() {}
971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual void WriteLevel();
991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual void WriteMessage(const string& msg);
1001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
1011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace phonenumbers
1031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace i18n
1041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif  // I18N_PHONENUMBERS_DEFAULT_LOGGER_H_
106