4#include "downward/utils/exceptions.h"
5#include "downward/utils/system.h"
6#include "downward/utils/timer.h"
16enum class Verbosity { SILENT, NORMAL, VERBOSE, DEBUG };
27 const Verbosity verbosity;
28 bool line_has_started;
31 explicit Log(Verbosity verbosity)
33 , verbosity(verbosity)
34 , line_has_started(false)
39 Log& operator<<(
const T& elem)
41 if (!line_has_started) {
42 line_has_started =
true;
43 stream <<
"[t=" << g_timer <<
", " << get_peak_memory_in_kb()
51 using manip_function = std::ostream& (*)(std::ostream&);
52 Log& operator<<(manip_function f)
54 if (f ==
static_cast<manip_function
>(&std::endl)) {
55 line_has_started =
false;
62 Verbosity get_verbosity()
const {
return verbosity; }
66concept Dumpable =
requires(T t, std::ostream& out) { out << t; };
69struct RecursivelyDumpableHelper : std::false_type {};
71template <std::ranges::input_range T>
72struct RecursivelyDumpableHelper<T>
76 !Dumpable<std::ranges::range_reference_t<T>>,
77 RecursivelyDumpableHelper<std::ranges::range_reference_t<T>>,
82concept RecursivelyDumpable = RecursivelyDumpableHelper<T>::value;
100 std::shared_ptr<Log> log;
103 explicit LogProxy(
const std::shared_ptr<Log>& log)
108 LogProxy& operator<<(
const Dumpable
auto& elem)
114 using manip_function = std::ostream& (*)(std::ostream&);
115 LogProxy& operator<<(manip_function f)
121 bool is_at_least_normal()
const
123 return log->get_verbosity() >= Verbosity::NORMAL;
126 bool is_at_least_verbose()
const
128 return log->get_verbosity() >= Verbosity::VERBOSE;
131 bool is_at_least_debug()
const
133 return log->get_verbosity() >= Verbosity::DEBUG;
137 bool is_warning()
const {
return true; }
139 template <
typename T>
140 friend LogProxy& operator<<(LogProxy& stream,
const T& range)
141 requires(RecursivelyDumpable<T>)
144 auto it = std::ranges::begin(range);
145 auto end = std::ranges::end(range);
149 if (++it == end)
break;
164extern LogProxy g_log;
166extern LogProxy get_log_for_verbosity(
const Verbosity& verbosity);
167extern LogProxy get_silent_log();
169class ContextError :
public utils::Exception {
171 explicit ContextError(
const std::string& msg);
176 static const std::string INDENT;
177 size_t initial_stack_size =
179 std::vector<std::string> block_stack;
182 explicit Context() =
default;
183 Context(
const Context& context);
186 decorate_block_name(
const std::string& block_name)
const;
187 void enter_block(
const std::string& block_name);
188 void leave_block(
const std::string& block_name);
189 std::string str()
const;
192 virtual void error(
const std::string& message)
const;
193 virtual void warn(
const std::string& message)
const;
196class MemoryContext :
public Context {
198 static const int MEM_FIELD_WIDTH = 7;
199 static const int TIME_FIELD_WIDTH = 7;
203 decorate_block_name(
const std::string& block_name)
const override;
206extern MemoryContext _memory_context;
210 std::string block_name;
213 explicit TraceBlock(Context& context,
const std::string& block_name);
217extern void trace_memory(
const std::string& msg =
"");
222ostream& operator<<(ostream& stream,
const vector<T>& vec)
225 for (
size_t i = 0; i < vec.size(); ++i) {
226 if (i != 0) stream <<
", ";