/*////////////////////////////////////////////////////////////////////////////// // CMT Cosmic Muon Tomography project ////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// Copyright (c) 2014, Universita' degli Studi di Padova, INFN sez. di Padova All rights reserved Authors: Andrea Rigoni Garola < andrea.rigoni@pd.infn.it > ------------------------------------------------------------------ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library. //////////////////////////////////////////////////////////////////////////////*/ #ifndef U_CORE_DEBUG_H #define U_CORE_DEBUG_H #include "ltk/ltkdebug.h" #include "Macros.h" #include "Types.h" #include "Mpl.h" #include "Vector.h" #include #include namespace uLib { namespace detail { struct DebugAdapterInterface { virtual ~DebugAdapterInterface() {} virtual void operator()(char val) {} virtual void operator()(unsigned char val) {} virtual void operator()(short val) {} virtual void operator()(unsigned short val) {} virtual void operator()(int val) {} virtual void operator()(unsigned int val) {} virtual void operator()(long val) {} virtual void operator()(unsigned long val) {} virtual void operator()(float val) {} virtual void operator()(double val) {} virtual void operator()(std::string val) {} }; struct DebugAdapter { struct AnyCastAdapterBase { virtual ~AnyCastAdapterBase(){} virtual void operator()(SmartPointer &ad, boost::any &val) {} }; template < typename T > struct AnyCastAdapter : AnyCastAdapterBase { void operator()(SmartPointer &ad, boost::any &val) { ad->operator()(boost::any_cast(val)); } }; struct DItem { DItem(){} template DItem(std::string str, T &t) : m_adapter(new AnyCastAdapter()), m_name(str), m_value(t) { } SmartPointer m_adapter; std::string m_name; boost::any m_value; }; }; } // detail //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // text ADAPTER class DebugAdapterText : public detail::DebugAdapterInterface { std::ostream &m_out; public: DebugAdapterText(std::ostream &o) : m_out(o) {} void operator()(int val) { m_out << "debug: " << val << "\n"; } void operator()(std::string val) { m_out << "debug: " << val << "\n"; } }; class Debug { typedef detail::DebugAdapterInterface AdapterInterface; typedef SmartPointer Adapter; typedef detail::DebugAdapter::DItem DItem; public: template void operator() (std::string str, T &t) { m_v.push_back(DItem(str,t)); } void AddAdapter(AdapterInterface &ad) { m_a.push_back(Adapter(ad)); } void Update() { foreach(Adapter &ad, m_a) { foreach(DItem &item, m_v) { item.m_adapter->operator()(ad, item.m_value); } } } private: Vector m_v; Vector m_a; }; } // uLib #endif // DEBUG_H