text: /*************************************************************************/
  /* spdlog - an extremely fast and easy to use c++11 logging library.     */
  /* Copyright (c) 2014 Gabi Melman.                                       */
  /*                                                                       */
  /* Permission is hereby granted, free of charge, to any person obtaining */
  /* a copy of this software and associated documentation files (the       */
  /* "Software"), to deal in the Software without restriction, including   */
  /* without limitation the rights to use, copy, modify, merge, publish,   */
  /* distribute, sublicense, and/or sell copies of the Software, and to    */
  /* permit persons to whom the Software is furnished to do so, subject to */
  /* the following conditions:                                             */
  /*                                                                       */
  /* The above copyright notice and this permission notice shall be        */
  /* included in all copies or substantial portions of the Software.       */
  /*                                                                       */
  /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
  /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
  /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
  /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
  /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
  /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
  /*************************************************************************/
  
  #pragma once
  
  #include <string>
  #include <initializer_list>
  #include <chrono>
  #include <memory>
  
  //visual studio does not support noexcept yet
  #ifndef _MSC_VER
  #define SPDLOG_NOEXCEPT noexcept
  #else
  #define SPDLOG_NOEXCEPT throw()
  #endif
  
  
  namespace spdlog
  {
  
  class formatter;
  
  namespace sinks
  {
  class sink;
  }
  
  // Common types across the lib
  using log_clock = std::chrono::system_clock;
  using sink_ptr = std::shared_ptr < sinks::sink > ;
  using sinks_init_list = std::initializer_list < sink_ptr > ;
  using formatter_ptr = std::shared_ptr<spdlog::formatter>;
  
  
  //Log level enum
  namespace level
  {
  typedef enum
  {
      trace    = 0,
      debug    = 1,
      info     = 2,
      notice   = 3,
      warn     = 4,
      err      = 5,
      critical = 6,
      alert    = 7,
      emerg    = 8,
      off      = 9
  } level_enum;
  
  static const char* level_names[] { "trace", "debug", "info", "notice", "warning", "error", "critical", "alert", "emerg", "off"};
  
  static const char* short_level_names[] { "T", "D", "I", "N", "W", "E", "C", "A", "M", "O"};
  
  inline const char* to_str(spdlog::level::level_enum l)
  {
      return level_names[l];
  }
  
  inline const char* to_short_str(spdlog::level::level_enum l)
  {
      return short_level_names[l];
  }
  } //level
  
  
  //
  // Async overflow policy - block by default.
  //
  enum class async_overflow_policy
  {
      block_retry, // Block / yield / sleep until message can be enqueued
      discard_log_msg // Discard the message it enqueue fails
  };
  
  
  //
  // Log exception
  //
  class spdlog_ex : public std::exception
  {
  public:
      spdlog_ex(const std::string& msg) :_msg(msg) {}
      const char* what() const SPDLOG_NOEXCEPT override
      {
          return _msg.c_str();
      }
  private:
      std::string _msg;
  
  };
  
  } //spdlog
  