Packets: added Packet::as<>(nothrow); fixed documentation
tho [Mon, 30 Aug 2010 14:50:46 +0000 (14:50 +0000)]
Scheduler: fixed assert include in FIFORunner

git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1703 270642c3-0616-0410-b53a-bc976706d245

senf/PPI/Connectors.cci
senf/PPI/Connectors.hh
senf/Packets/Packet.cti
senf/Packets/Packet.hh
senf/Scheduler/FIFORunner.cc

index 2b21add..d324492 100644 (file)
@@ -374,7 +374,6 @@ prefix_ senf::ppi::connector::GenericActiveInput::GenericActiveInput()
 prefix_ senf::ppi::connector::GenericPassiveInput & senf::ppi::connector::GenericActiveOutput::peer()
     const
 {
-//    return dynamic_cast<GenericPassiveInput&>(Connector::peer());
     SENF_ASSERT(peer_, "senf::ppi::connect() call missing");
     return *peer_;
 }
index 33e651f..6b4cdef 100644 (file)
@@ -280,7 +280,6 @@ namespace connector {
 
         bool remoteThrottled_;
         bool nativeThrottled_;
-        ActiveConnector * myPeer_;
 
         typedef std::vector<ForwardingRoute*> Routes;
         Routes routes_;
index bea3eaa..0241419 100644 (file)
@@ -67,6 +67,14 @@ prefix_ OtherPacket senf::Packet::as()
 }
 
 template <class OtherPacket>
+prefix_ OtherPacket senf::Packet::as(NoThrow_t)
+    const
+{
+    SENF_ASSERT( is<OtherPacket>(), "Bad cast, called packet::as(nothrow) with wrong PacketType");
+    return OtherPacket(ptr()->as<typename OtherPacket::type>());
+}
+
+template <class OtherPacket>
 prefix_ OtherPacket senf::Packet::next()
     const
 {
@@ -103,7 +111,8 @@ prefix_ OtherPacket senf::Packet::prev(NoThrow_t)
     const
 {
     Packet p (prev(nothrow));
-    return p && p.is<OtherPacket>() ? p.as<OtherPacket>() : OtherPacket();
+    return p && p.is<OtherPacket>() ?
+            OtherPacket(p.ptr()->as<typename OtherPacket::type>()) : OtherPacket();
 }
 
 template <class OtherPacket>
index 43c88d2..7d31942 100644 (file)
@@ -197,10 +197,9 @@ namespace senf {
                                                  exists */
         template <class OtherPacket> OtherPacket next(NoThrow_t) const;
                                         ///< Get next packet in chain and cast to \a OtherPacket
-                                        /**< \throws std::bad_cast if the next() packet is not of
-                                             type \a OtherPacket
-                                             \returns in - valid() packet if no next packet
-                                                 exists */
+                                        /**< \returns in - valid() packet if no next packet
+                                                 exists or if next() packet is not of
+                                                 type \a OtherPacket */
         template <class OtherPacket> OtherPacket find() const;
                                         ///< Search chain forward for packet of type \a OtherPacket
                                         /**< The search will start with the current packet.
@@ -226,10 +225,9 @@ namespace senf {
                                                  packet exists */
         template <class OtherPacket> OtherPacket prev(NoThrow_t) const;
                                         ///< Get previous packet in chain and cast to \a OtherPacket
-                                        /**< \throws std::bad_cast, if the previous packet is not of
-                                             type \a OtherPacket
-                                             \returns in - valid() packet if no previous packet
-                                                 exists */
+                                        /**< \returns in - valid() packet if no previous packet
+                                                 exists or if the previous packet is not of
+                                                 type \a OtherPacket */
         template <class OtherPacket> OtherPacket rfind() const;
                                         ///< Search chain backwards for packet of type \a OtherPacket
                                         /**< The search will start with the current packet.
@@ -290,6 +288,15 @@ namespace senf {
                                              before.
                                              \throws std::bad_cast if the current packet is not of
                                                  type \a OtherPacket */
+        template <class OtherPacket> OtherPacket as(NoThrow_t) const;
+                                        ///< Cast current packet to the given type
+                                        /**< This operations returns a handle to the same packet
+                                             header/interpreter however upcast to the given
+                                             ConcretePacket type which have been instantiated
+                                             before.
+                                             \warning You must make absolutely sure that the packet
+                                             is of the given type. If not, calling this member
+                                             crashes your program in a unkindly way. */
 
         Packet append(Packet const & packet) const; ///< Append the given packet to \c this packet
                                         /**< This operation will replace the payload section of \c
index 4669c4d..94009c3 100644 (file)
@@ -29,6 +29,7 @@
 // Custom includes
 #include <signal.h>
 #include <time.h>
+#include <cassert>
 #include <senf/Utils/Exception.hh>
 #include <senf/Utils/senfassert.hh>
 #ifdef SENF_DEBUG
@@ -112,7 +113,7 @@ prefix_ void senf::scheduler::detail::FIFORunner::stopWatchdog()
 // At the moment, the FIFORunner is not very efficient with many non-runnable tasks since the
 // complete list of tasks is traversed on each run().
 //
-// To optimize this, we woould need a way to find the relative ordering of two tasks in O(1) (at the
+// To optimize this, we would need a way to find the relative ordering of two tasks in O(1) (at the
 // moment, this is an O(N) operation by traversing the list).
 //
 // One idea is, to give each task an 'order' value. Whenever a task is added at the end, it's order