blob: ead132cbf56dfdf499d3ccbdefcc059ab9ec887c [file] [log] [blame]
//#####################################################################
// Copyright 2004, 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_SCOPE
//#####################################################################
#ifndef __LOG_SCOPE__
#define __LOG_SCOPE__
#include "LOG_ENTRY.h"
#include <string>
#include "../Arrays/LIST_ARRAY.h"
#include "../Data_Structures/SPLAY_TREE.h"
#include "TIMER.h"
namespace PhysBAM
{
class LOG_SCOPE: public LOG_ENTRY
{
public:
SPLAY_TREE<std::string, int> entries;
LIST_ARRAY<LOG_ENTRY*> children;
std::string scope_identifier;
LOG_SCOPE (LOG_ENTRY* parent_input, int depth_input, int timer_id_input, const std::string& scope_identifier_input, const std::string& name_input, int& verbosity_level_input)
: LOG_ENTRY (parent_input, depth_input, timer_id_input, name_input, verbosity_level_input), scope_identifier (scope_identifier_input)
{}
virtual LOG_ENTRY* Get_Stop_Time()
{
return this;
}
LOG_ENTRY* Get_New_Scope (const std::string& new_scope_identifier, const std::string& new_name)
{
int entry;
end_on_separate_line = true;
log_file_end_on_separate_line = true;
if (entries.Find (new_scope_identifier, entry))
{
children (entry)->name = new_name;
return children (entry);
}
LOG_ENTRY* new_entry = new LOG_SCOPE (this, depth + 1, timer_id, new_scope_identifier, new_name, verbosity_level);
children.Append_Element (new_entry);
entries.Set (new_scope_identifier, children.m);
return new_entry;
}
LOG_ENTRY* Get_New_Item (const std::string& new_name)
{
int entry;
end_on_separate_line = true;
log_file_end_on_separate_line = true;
if (entries.Find (new_name, entry)) return children (entry);
LOG_ENTRY* new_entry = new LOG_ENTRY (this, depth + 1, timer_id, new_name, verbosity_level);
children.Append_Element (new_entry);
entries.Set (new_name, children.m);
return new_entry;
}
LOG_ENTRY* Get_Pop_Scope()
{
Stop();
return parent;
}
void Dump_Log (FILE* output)
{
fprintf (output, "%*s%-*s%8.4f\n", 2 * depth, "", 50 - 2 * depth, scope_identifier.c_str(), time);
fflush (output);
for (int i = 1; i <= children.m; i++) children (i)->Dump_Log (output);
}
void Dump_Log_XML (std::ostream& output)
{
output << STRING_UTILITIES::string_sprintf ("%*s", 2 * depth, "") << "<scope name=\"" << scope_identifier << "\" time=\"" << time << "\">" << std::endl;
for (int i = 1; i <= children.m; i++) children (i)->Dump_Log_XML (output);
output << STRING_UTILITIES::string_sprintf ("%*s", 2 * depth, "") << "</scope>" << std::endl;
}
void Dump_Names (FILE* output)
{
LOG_ENTRY::Dump_Names (output);
for (int i = 1; i <= children.m; i++) children (i)->Dump_Names (output);
}
//#####################################################################
};
}
#endif