blob: 78f80291b48b0d7790342130f95d2c186e96c630 [file] [log] [blame]
//#####################################################################
// Copyright 2004-2005, Geoffrey Irving, Frank Losasso, Andrew Selle.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class LOG_ENTRY
//#####################################################################
#ifndef __LOG_ENTRY__
#define __LOG_ENTRY__
#include "LOG.h"
#include <string>
#include "TIMER.h"
#include "STRING_UTILITIES.h"
namespace PhysBAM
{
class LOG_ENTRY
{
public:
LOG_ENTRY* parent;
int depth;
int timer_id;
double time;
double timer_start_time;
std::string name;
bool end_on_separate_line, log_file_end_on_separate_line;
static bool start_on_separate_line, log_file_start_on_separate_line;
static bool needs_indent, log_file_needs_indent;
int& verbosity_level;
LOG_ENTRY (LOG_ENTRY* parent_input, const int depth_input, const int timer_id_input, const std::string& name_input, int& verbosity_level_input)
: parent (parent_input), depth (depth_input), timer_id (timer_id_input), time (0), name (name_input), verbosity_level (verbosity_level_input)
{
end_on_separate_line = false;
log_file_end_on_separate_line = false;
timer_start_time = TIMER::Singleton()->Peek_Time (timer_id);
}
virtual ~LOG_ENTRY()
{}
void Start()
{
if (depth <= verbosity_level)
{
if (start_on_separate_line) putchar ('\n');
start_on_separate_line = needs_indent = true;
printf ("%*s%-*s", 2 * depth, "", 50 - 2 * depth, name.c_str());
fflush (stdout);
}
if (LOG::log_file)
{
if (log_file_start_on_separate_line) putc ('\n', LOG::log_file);
log_file_start_on_separate_line = log_file_needs_indent = true;
fprintf (LOG::log_file, "%*s%-*s", 2 * depth, "", 50 - 2 * depth, name.c_str());
fflush (LOG::log_file);
}
timer_start_time = TIMER::Singleton()->Peek_Time (timer_id);
}
void Stop()
{
double time_since_start = (TIMER::Singleton()->Peek_Time (timer_id) - timer_start_time) / 1000;
if (depth <= verbosity_level)
{
if (end_on_separate_line)
{
if (start_on_separate_line) putchar ('\n');
printf ("%*sEND %-*s", 2 * depth, "", 50 - 2 * depth - 4, name.c_str());
}
end_on_separate_line = false;
start_on_separate_line = needs_indent = true;
printf ("%8.4f s", time_since_start);
fflush (stdout);
}
if (LOG::log_file)
{
if (log_file_end_on_separate_line)
{
if (log_file_start_on_separate_line) putc ('\n', LOG::log_file);
fprintf (LOG::log_file, "%*sEND %-*s", 2 * depth, "", 50 - 2 * depth - 4, name.c_str());
}
log_file_end_on_separate_line = false;
log_file_start_on_separate_line = log_file_needs_indent = true;
fprintf (LOG::log_file, "%8.4f s", time_since_start);
fflush (LOG::log_file);
}
time += time_since_start;
}
virtual LOG_ENTRY* Get_Stop_Time()
{
Stop();
return parent;
}
virtual LOG_ENTRY* Get_New_Scope (const std::string& new_scope_identifier, const std::string& new_name)
{
Stop();
return parent->Get_New_Scope (new_scope_identifier, new_name);
}
virtual LOG_ENTRY* Get_New_Item (const std::string& new_name)
{
Stop();
return parent->Get_New_Item (new_name);
}
virtual LOG_ENTRY* Get_Pop_Scope()
{
Stop();
return parent->Get_Pop_Scope();
}
virtual void Dump_Log (FILE* output)
{
fprintf (output, "%*s%-*s%8.4f s\n", 2 * depth, "", 50 - 2 * depth, name.c_str(), time);
fflush (output);
}
virtual void Dump_Log_XML (std::ostream& output)
{
output << STRING_UTILITIES::string_sprintf ("%*s", 2 * depth, "") << "<scope name=\"" << name << "\" time=\"" << time << "\"/>" << std::endl;
}
virtual void Dump_Names (FILE* output)
{
fprintf (output, "%*s%-*s", 2 * depth, "", 50 - 2 * depth, name.c_str());
fflush (output);
}
//#####################################################################
};
}
#endif