00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_TRACE_EXITING_HH
00027 # define MLN_TRACE_EXITING_HH
00028
00032
00033 # include <string>
00034 # include <iostream>
00035 # include <stack>
00036
00037 # include <mln/core/contract.hh>
00038 # include <mln/trace/quiet.hh>
00039
00040 namespace mln
00041 {
00042
00043 namespace trace
00044 {
00045
00046 void exiting(const std::string& scope);
00047
00048
00049 extern std::stack<std::clock_t> start_times;
00050 extern std::stack<std::string> scopes;
00051
00052
00053 # ifndef MLN_INCLUDE_ONLY
00054
00055 inline
00056 void exiting(const std::string& scope)
00057 {
00058 if (quiet)
00059 return;
00060
00061 if (scopes.empty())
00062 {
00063 std::cerr << "error: missing 'entering' scope (exiting is '" << scope << "')" << std::endl;
00064 quiet = true;
00065 }
00066 else
00067 {
00068 if (scopes.top() != scope)
00069 {
00070 std::cerr << "error: bad matching scope (entering is '" << scopes.top()
00071 << "' v. exiting is '" << scope << "')" << std::endl;
00072 quiet = true;
00073 }
00074 scopes.pop();
00075 }
00076
00077 bool has_inner_trace = (internal::max_tab == tab);
00078 --tab;
00079
00080 if (!has_inner_trace)
00081 for (unsigned i = 0; i < tab; ++i)
00082 std::cout << " ";
00083
00084 std::cout << "} ";
00085
00086 if (!has_inner_trace)
00087 std::cout << scope << " ";
00088
00089 mln_assertion(! start_times.empty());
00090 std::clock_t now = std::clock();
00091
00092 if (start_times.top() > now)
00093 {
00094 std::cerr << "warning: bad timer in trace handling" << std::endl;
00095
00096 }
00097
00098 if (start_times.top() < now)
00099 {
00100 std::cout << "- "
00101 << ((float(now) - float(start_times.top())) / CLOCKS_PER_SEC)
00102 << "s ";
00103 }
00104
00105 start_times.pop();
00106
00107 if (has_inner_trace || (internal::max_tab - tab > 1))
00108 std::cout << std::endl;
00109 }
00110
00111 # endif // ! MLN_INCLUDE_ONLY
00112
00113 }
00114
00115 }
00116
00117
00118 #endif // ! MLN_TRACE_EXITING_HH