#include "SocketHandle.ih"
// Custom includes
-#include "../Utils/senfassert.hh"
#include <typeinfo>
-#include <boost/lexical_cast.hpp>
+#include "../Utils/senfassert.hh"
#include "../Utils/TypeInfo.hh"
#define prefix_ inline
: FileHandle(other)
{
SENF_ASSERT( isChecked );
- SENF_ASSERT( dynamic_cast<SocketBody *>(&FileHandle::body()) );
+ SENF_ASSERT( ! valid() || dynamic_cast<SocketBody *>(&FileHandle::body()) );
}
template <class SPolicy>
}
template <class SPolicy>
-prefix_ senf::SocketProtocol const & senf::SocketHandle<SPolicy>::protocol()
+prefix_ senf::SocketProtocol & senf::SocketHandle<SPolicy>::protocol()
const
{
return body().protocol();
{
// throws bad_cast if the body is not a SocketBody
SocketBody & body (dynamic_cast<SocketBody&>(FileHandle::body(handle)));
- // throws bad_cast if the policy is not compatible
+ // throws bad_cast if the policy is not compatible (already wrapped ...)
SPolicy::checkBaseOf(body.protocol().policy());
return cast_static(handle);
}
template <class Target, class Source>
prefix_ Target senf::dynamic_socket_cast(Source handle)
{
- BOOST_STATIC_ASSERT((
- boost::is_convertible<Source*,FileHandle*>::value &&
- boost::is_convertible<Target*,FileHandle*>::value &&
- ( boost::is_convertible<Source,Target>::value ||
- boost::is_convertible<Target,Source>::value ) ));
- return Target::cast_dynamic(handle);
+// BOOST_STATIC_ASSERT((
+// boost::is_convertible<Source*,FileHandle*>::value &&
+// boost::is_convertible<Target*,FileHandle*>::value &&
+// ( boost::is_convertible<Source,Target>::value ||
+// boost::is_convertible<Target,Source>::value ) ));
+ try {
+ return Target::cast_dynamic(handle);
+ }
+ SENF_WRAP_EXC(std::bad_cast)
}
template <class Target, class Source>
prefix_ bool senf::check_socket_cast(Source handle)
{
- BOOST_STATIC_ASSERT((
- boost::is_convertible<Source*,FileHandle*>::value &&
- boost::is_convertible<Target*,FileHandle*>::value &&
- ( boost::is_convertible<Source,Target>::value ||
- boost::is_convertible<Target,Source>::value ) ));
+// BOOST_STATIC_ASSERT((
+// boost::is_convertible<Source*,FileHandle*>::value &&
+// boost::is_convertible<Target*,FileHandle*>::value &&
+// ( boost::is_convertible<Source,Target>::value ||
+// boost::is_convertible<Target,Source>::value ) ));
// we don't have a non-throwing variant of cast_dynamic
// for two reasons:
// a) since the handle is passed back by value, we cannot return
return detail::dumpState(map);
}
+template <class SPolicy>
+template <class Facet>
+prefix_ Facet & senf::SocketHandle<SPolicy>::facet()
+
+{
+ try {
+ return dynamic_cast<Facet &>(protocol());
+ }
+ SENF_WRAP_EXC(std::bad_cast)
+}
+
///////////////////////////////////////////////////////////////////////////
// senf::ProtocolSocketBody<SProtocol>