diff --git a/Packets/ParseInt.ih b/Packets/ParseInt.ih index 70c5859a588ae090048154484f7b705908417e49..fd58b04bcf6ef4902ae8271e77f4fdbc6bff4c65 100644 --- a/Packets/ParseInt.ih +++ b/Packets/ParseInt.ih @@ -71,6 +71,11 @@ namespace impl { Derived const & operator -- () { derived().value( derived.value()-1 ); return derived(); } + Derived const & operator ++ (int) + { Value v (derived.value()); derived().value( v+1 ); return v; } + Derived const & operator -- (int) + { Value v (derived.value()); derived().value( v-1 ); return v; } + private: Derived & derived() { return *static_cast<Derived *>(this); } Derived const & derived() const { return *static_cast<Derived const *>(this); }; diff --git a/Packets/ParserBase.cti b/Packets/ParserBase.cti index 5ba7367e8881870d5b6e0d94607e836c9b062600..084c6253d99224c8f49d641fbba19863c9a963dc 100644 --- a/Packets/ParserBase.cti +++ b/Packets/ParserBase.cti @@ -22,7 +22,7 @@ // Definition of inline template functions -//#include "ParserBase.ih" +#include "ParserBase.ih" // Custom includes diff --git a/Packets/ParserBase.hh b/Packets/ParserBase.hh index 69508b7cd3cb06d2cbd66b795494b66973ec90fa..cb2eccea7bd2aad49e24bbdea508da5e29578b18 100644 --- a/Packets/ParserBase.hh +++ b/Packets/ParserBase.hh @@ -29,6 +29,7 @@ // Custom includes #include <utility> +#include <boost/iterator/iterator_facade.hpp> #include <boost/type_traits/is_member_function_pointer.hpp> #include "ParserBase.ih" @@ -39,7 +40,19 @@ namespace pkf { namespace impl { struct ParserBase; } - struct nil {}; + struct nil + : public boost::iterator_facade<nil,char,boost::random_access_traversal_tag> + { + // Theese are declared to make nil a valid iterator. All + // access to an instance of this iterator however is invalid + // (these members are not implemented only declared) + char & dereference() const; + bool equal(nil other) const; + void increment(); + void decrement(); + void advance(int n); + int distance_to(nil other) const; + }; /** \brief Parser framework diff --git a/Scheduler/Scheduler.cc b/Scheduler/Scheduler.cc index 21885f24a8fd26bf6add1f5c1cbb0f10cf4d91f4..5e8a860835719e214a45f0723cb5291b34f7f3e8 100644 --- a/Scheduler/Scheduler.cc +++ b/Scheduler/Scheduler.cc @@ -90,7 +90,7 @@ prefix_ satcom::lib::Scheduler::Scheduler() throw SystemException(errno); } -prefix_ void satcom::lib::Scheduler::add(int fd, Callback const & cb, EventId eventMask) +prefix_ void satcom::lib::Scheduler::do_add(int fd, InternalCallback const & cb, EventId eventMask) { FdTable::iterator i (fdTable_.find(fd)); int action (EPOLL_CTL_MOD); @@ -114,7 +114,7 @@ prefix_ void satcom::lib::Scheduler::add(int fd, Callback const & cb, EventId ev throw SystemException(errno); } -prefix_ void satcom::lib::Scheduler::remove(int fd, EventId eventMask) +prefix_ void satcom::lib::Scheduler::do_remove(int fd, EventId eventMask) { FdTable::iterator i (fdTable_.find(fd)); if (i == fdTable_.end()) @@ -171,24 +171,24 @@ prefix_ void satcom::lib::Scheduler::process() if (ev.events & EPOLLIN) { BOOST_ASSERT(spec.cb_read); - spec.cb_read(ev.data.fd, EV_READ); + spec.cb_read(EV_READ); } else if (ev.events & EPOLLPRI) { BOOST_ASSERT(spec.cb_prio); - spec.cb_prio (ev.data.fd, EV_PRIO); + spec.cb_prio(EV_PRIO); } else if (ev.events & EPOLLOUT) { BOOST_ASSERT(spec.cb_write); - spec.cb_write(ev.data.fd, EV_WRITE); + spec.cb_write(EV_WRITE); } else if (ev.events & EPOLLHUP) { BOOST_ASSERT(spec.cb_hup); - spec.cb_hup(ev.data.fd, EV_HUP); + spec.cb_hup(EV_HUP); } else if (ev.events & EPOLLERR) { BOOST_ASSERT(spec.cb_err); - spec.cb_err(ev.data.fd, EV_ERR); + spec.cb_err(EV_ERR); } } } diff --git a/Scheduler/Scheduler.cci b/Scheduler/Scheduler.cci index f34286e486cea5b9a9bb772c418f6bbc1ed6cbfe..d332654343472922effba8978f74d9c22573f336 100644 --- a/Scheduler/Scheduler.cci +++ b/Scheduler/Scheduler.cci @@ -34,6 +34,11 @@ prefix_ void satcom::lib::Scheduler::terminate() terminate_ = true; } +prefix_ int satcom::lib::retrieve_filehandle(int fd) +{ + return fd; +} + ///////////////////////////////cci.e/////////////////////////////////////// #undef prefix_ diff --git a/Scheduler/Scheduler.cti b/Scheduler/Scheduler.cti index 7ef1148ba9e51b46c6e2d01690dc0f34d2e29e03..be4196168cbb64208eceb587bb06c5f94c0b365b 100644 --- a/Scheduler/Scheduler.cti +++ b/Scheduler/Scheduler.cti @@ -35,14 +35,15 @@ prefix_ void satcom::lib::Scheduler::add(Handle const & handle, typename GenericCallback<Handle>::Callback const & cb, EventId eventMask) { - add(retrieve_filehandle(handle),boost::bind(cb,handle,_2),eventMask); + // retrieve_filehandle is found via ADL + do_add(retrieve_filehandle(handle),boost::bind(cb,handle,_1),eventMask); } template <class Handle> prefix_ void satcom::lib::Scheduler::remove(Handle const & handle, EventId eventMask) { // retrieve_filehandle is found via ADL - remove(retrieve_filehandle(handle),eventMask); + do_remove(retrieve_filehandle(handle),eventMask); } ///////////////////////////////cti.e/////////////////////////////////////// diff --git a/Scheduler/Scheduler.hh b/Scheduler/Scheduler.hh index e731db4b499b06f0d5604174a48dc2f0cdcfda46..8916723181261819df9eb2e84d03feb1003216b3 100644 --- a/Scheduler/Scheduler.hh +++ b/Scheduler/Scheduler.hh @@ -59,7 +59,6 @@ namespace lib { typedef boost::function<void (typename boost::call_traits<Handle>::param_type, EventId) > Callback; }; - typedef GenericCallback<int>::Callback Callback; /////////////////////////////////////////////////////////////////////////// ///\name Structors and default members @@ -76,9 +75,6 @@ namespace lib { ///@} /////////////////////////////////////////////////////////////////////////// - void add(int fd, Callback const & cb, EventId eventMask = EV_ALL); - void remove(int fd, EventId eventMask = EV_ALL); - template <class Handle> void add(Handle const & handle, typename GenericCallback<Handle>::Callback const & cb, @@ -94,14 +90,19 @@ namespace lib { private: Scheduler(); - - struct EventSpec + + typedef boost::function<void (EventId)> InternalCallback; + + void do_add(int fd, InternalCallback const & cb, EventId eventMask = EV_ALL); + void do_remove(int fd, EventId eventMask = EV_ALL); + + struct EventSpec { - Callback cb_read; - Callback cb_prio; - Callback cb_write; - Callback cb_hup; - Callback cb_err; + InternalCallback cb_read; + InternalCallback cb_prio; + InternalCallback cb_write; + InternalCallback cb_hup; + InternalCallback cb_err; int epollMask() const; }; @@ -113,6 +114,8 @@ namespace lib { bool terminate_; }; + int retrieve_filehandle(int fd); + }} ///////////////////////////////hh.e////////////////////////////////////////