summaryrefslogtreecommitdiff
path: root/cpp/include/Ice/LoggerUtil.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/include/Ice/LoggerUtil.h')
-rw-r--r--cpp/include/Ice/LoggerUtil.h52
1 files changed, 45 insertions, 7 deletions
diff --git a/cpp/include/Ice/LoggerUtil.h b/cpp/include/Ice/LoggerUtil.h
index c5576e1e0b2..1414bb37f03 100644
--- a/cpp/include/Ice/LoggerUtil.h
+++ b/cpp/include/Ice/LoggerUtil.h
@@ -13,6 +13,7 @@
#include <Ice/Logger.h>
#include <Ice/CommunicatorF.h>
#include <Ice/Plugin.h>
+#include <Ice/Exception.h>
namespace Ice
{
@@ -30,24 +31,61 @@ private:
std::ostringstream _str;
};
+ICE_API LoggerOutputBase& loggerInsert(LoggerOutputBase& out, const IceUtil::Exception& ex);
+
+template<typename T>
+struct IsException
+{
+ static char test(IceUtil::Exception*);
+ static long test(...);
+
+ static const bool value = sizeof(test(static_cast<T*>(0))) == sizeof(char);
+};
+
+template<typename T, bool = false>
+struct LoggerOutputInserter
+{
+ static inline LoggerOutputBase&
+ insert(LoggerOutputBase& out, const T& val)
+ {
+ out.__str() << val;
+ return out;
+ }
+};
+
+// Partial specialization
+template<typename T>
+struct LoggerOutputInserter<T, true>
+{
+ static inline LoggerOutputBase&
+ insert(LoggerOutputBase& out, const T& ex)
+ {
+ return loggerInsert(out, ex);
+ }
+};
+
template<typename T>
inline LoggerOutputBase&
operator<<(LoggerOutputBase& out, const T& val)
{
- out.__str() << val;
- return out;
+ return LoggerOutputInserter<T, IsException<T>::value>::insert(out, val);
}
-template<class Y>
-LoggerOutputBase&
-operator<<(LoggerOutputBase& os, ::IceInternal::ProxyHandle<Y> p)
+template<typename T>
+inline LoggerOutputBase&
+operator<<(LoggerOutputBase& os, const ::IceInternal::ProxyHandle<T>& p)
{
return os << (p ? p->ice_toString() : "");
}
-ICE_API LoggerOutputBase& operator<<(LoggerOutputBase&, std::ios_base& (*)(std::ios_base&));
-ICE_API LoggerOutputBase& operator<<(LoggerOutputBase&, const ::std::exception& ex);
+inline LoggerOutputBase&
+operator<<(LoggerOutputBase& out, const ::std::exception& ex)
+{
+ out.__str() << ex.what();
+ return out;
+}
+ICE_API LoggerOutputBase& operator<<(LoggerOutputBase&, std::ios_base& (*)(std::ios_base&));
template<class L, class LPtr, void (L::*output)(const std::string&)>
class LoggerOutput : public LoggerOutputBase