Program Listing for File LogScope.hpp

Return to documentation for file (include/dish2/debug/LogScope.hpp)

#pragma once
#ifndef DISH2_DEBUG_LOGSCOPE_HPP_INCLUDE
#define DISH2_DEBUG_LOGSCOPE_HPP_INCLUDE

#include <string>

#include "enable.hpp"
#include "entry_types.hpp"
#include "log_event.hpp"
#include "log_level.hpp"
#include "log_stack_dispatcher.hpp"
#include "log_stack.hpp"

namespace dish2 {

struct LogScope {
#ifdef DISH2_LOG_ENABLE

  std::string name;
  std::string description;
  int verbosity;

  LogScope(
    const std::string& name_,
    const std::string& description_="",
    const int verbosity_=dish2::scope_begin.verbosity
  ) : name( name_ )
  , description( description_ )
  , verbosity( verbosity_ ) {

    auto event = dish2::scope_begin;
    event.verbosity = verbosity;

    dish2::log_event({
      event,
      name,
      description,
    });

    dish2::log_stack.emplace_back(
      name,
      description
    );

    if ( dish2::log_level >= verbosity ) {
      for (const auto& fun : log_stack_dispatcher ) fun( dish2::log_stack );
    }

  }

  ~LogScope() {

    dish2::log_stack.pop_back();

    auto event = dish2::scope_end;
    event.verbosity = verbosity;

    dish2::log_event({
      event,
      name,
      description
    });

    if ( dish2::log_level >= verbosity ) {
      for (const auto& fun : log_stack_dispatcher ) fun( dish2::log_stack );
    }

  }

#else

  template< typename... Args > LogScope(Args&&... args) {}

#endif // #ifdef DISH2_LOG_ENABLE
};

} // namespace dish2

#endif // #ifndef DISH2_DEBUG_LOGSCOPE_HPP_INCLUDE