brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · c272a17 Raw
78 lines · plain
1//  Copyright John Maddock 2014.2//  Use, modification and distribution are subject to the3//  Boost Software License, Version 1.0. (See accompanying file4//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)5 6#ifndef BOOST_MATH_TOOLS_ITERATION_LOGGER7#define BOOST_MATH_TOOLS_ITERATION_LOGGER8 9#include <map>10#include <string>11#include <utility>12#include <iostream>13#include <iomanip>14#include <fstream>15#include <boost/current_function.hpp>16 17namespace boost{ namespace math{ namespace detail{18 19struct logger20{21   std::map<std::pair<std::string, std::string>, unsigned long long> data;22 23   ~logger()24   {25      for(std::map<std::pair<std::string, std::string>, unsigned long long>::const_iterator i = data.begin(); i != data.end(); ++i)26      {27         std::cout << "Logging iteration data:\n  file: " << i->first.first28            << "\n  function: " << i->first.second29            << "\n  count: " << i->second << std::endl;30         //31         // Read in existing data:32         //33         std::map<std::string, unsigned long long> file_data;34         std::string filename = i->first.first + ".logfile";35         std::ifstream is(filename.c_str());36         while(is.good())37         {38            std::string f;39            unsigned long long c;40            is >> std::ws;41            std::getline(is, f);42            is >> c;43            if(f.size())44               file_data[f] = c;45         }46         is.close();47         if(file_data.find(i->first.second) != file_data.end())48            file_data[i->first.second] += i->second;49         else50            file_data[i->first.second] = i->second;51         //52         // Write it out again:53         //54         std::ofstream os(filename.c_str());55         for(std::map<std::string, unsigned long long>::const_iterator j = file_data.begin(); j != file_data.end(); ++j)56            os << j->first << "\n    " << j->second << std::endl;57         os.close();58      }59   }60};61 62inline void log_iterations(const char* file, const char* function, unsigned long long count)63{64   static logger l;65   std::pair<std::string, std::string> key(file, function);66   if(l.data.find(key) == l.data.end())67      l.data[key] = 0;68   l.data[key] += count;69}70 71#define BOOST_MATH_LOG_COUNT(count) boost::math::detail::log_iterations(__FILE__, BOOST_CURRENT_FUNCTION, count);72 73 74}}} // namespaces75 76#endif // BOOST_MATH_TOOLS_ITERATION_LOGGER77 78