/** \file
\brief Target internal header */
-#ifndef IH_Target_
-#define IH_Target_ 1
+#ifndef IH_SENF_Utils_Logger_Target_
+#define IH_SENF_Utils_Logger_Target_ 1
// Custom includes
#include <memory>
-#include <boost/scoped_ptr.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/static_assert.hpp>
+#include "../Console/LazyDirectory.hh"
///////////////////////////////ih.p////////////////////////////////////////
using senf::singleton<TargetRegistry>::instance;
void write(StreamBase const & stream, AreaBase const & area, unsigned level,
- std::string msg);
-
- void timeSource(std::auto_ptr<TimeSource> source);
+ std::string const & msg);
void routed();
bool fallbackRouting();
private:
TargetRegistry();
- void registerTarget(Target * target);
+ void registerTarget(Target * target, std::string const & name);
void unregisterTarget(Target * target);
typedef std::set<Target *> Targets;
Targets targets_;
- boost::scoped_ptr<TimeSource> timeSource_;
bool fallbackRouting_;
+
+ console::LazyDirectory consoleDir_;
friend class senf::log::Target;
friend class senf::singleton<TargetRegistry>;
/** \brief Internal: Write log message */
template <class Stream, class Area, class Level>
- void write(std::string msg);
+ void write(std::string const & msg);
+
+#ifndef DOXYGEN
+
+ // This code takes the routing target template arguments in any order and sorts them
+ // by type (Stream, Area and Level).
senf::mpl::rv<0u> RouteParameterCheck_(...);
senf::mpl::rv<1u> RouteParameterCheck_(StreamBase *);
template <class T> senf::mpl::rv<3u> RouteParameterCheck_(T*, typename T::SENFLogArea * = 0);
senf::mpl::rv<4u> RouteParameterCheck_(LevelBase *);
+ // For g++ 4.0 (at least) we need to provide the fully scoped name for this default value.
+ // no idea why. It works without the scope in 4.1
template < class T, class A2, class A1,
- unsigned type = SENF_MPL_RV( RouteParameterCheck_(static_cast<T*>(0)) ) >
+ unsigned type = SENF_MPL_RV( senf::log::detail::RouteParameterCheck_(static_cast<T*>(0)) ) >
struct RouteParameters
{};
struct RouteParameters<T,A2,A1,1u>
: public RouteParameters<A2,A1,mpl::nil>
{
+ typedef RouteParameters<A2,A1,mpl::nil> base;
+ BOOST_STATIC_ASSERT(( boost::is_same<typename base::Stream, mpl::nil>::value ));
typedef T Stream;
};
struct RouteParameters<T,A2,A1,2u>
: public RouteParameters<A2,A1,mpl::nil>
{
+ typedef RouteParameters<A2,A1,mpl::nil> base;
+ BOOST_STATIC_ASSERT(( boost::is_same<typename base::Area, mpl::nil>::value ));
typedef T Area;
};
struct RouteParameters<T,A2,A1,3u>
: public RouteParameters<A2,A1,mpl::nil>
{
+ typedef RouteParameters<A2,A1,mpl::nil> base;
+ BOOST_STATIC_ASSERT(( boost::is_same<typename base::Area, mpl::nil>::value ));
typedef typename T::SENFLogArea Area;
};
struct RouteParameters<T,A2,A1,4u>
: public RouteParameters<A2,A1,mpl::nil>
{
+ typedef RouteParameters<A2,A1,mpl::nil> base;
+ BOOST_STATIC_ASSERT(( boost::is_same<typename base::Level, NilLevel>::value ));
typedef T Level;
};
static RV * value() { return 0; }
};
+#endif
+
}}}
///////////////////////////////ih.e////////////////////////////////////////