// $Id$
//
-// Copyright (C) 2006
+// Copyright (C) 2006
// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
// Stefan Bund <stefan.bund@fokus.fraunhofer.de>
// Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-// TODO: Add parameterless create() method
#ifndef HH_PacketRegistryImpl_
#define HH_PacketRegistryImpl_ 1
//#include "PacketRegistry.mpp"
///////////////////////////////hh.p////////////////////////////////////////
-namespace satcom {
-namespace pkf {
+namespace senf {
+
namespace impl { template <class key> class PacketRegistryImpl; }
The PacketRegistry provides a generic facility to associate an
arbitrary key with Packets. Example keys are Ethertype or IP
protocols.
-
+
Every PacketRegistry is identified by a type tag:
\code
struct SomeTag {
typedef some_key_type key_t;
};
\endcode
- The key type can be an arbitrary valuetype. The PacketRegistry
+ The key type can be an arbitrary value type. The PacketRegistry
for this Tag can then be accessed using
<code>PacketRegistry<SomeTag>::</code>.
Normally, packet classes are registered statically and not
procedurally. To this end, the RegistrationProxy is provided:
\code
- PacketRegistry<SomeTag>::RegistrationProxy<SomePacket>
+ PacketRegistry<SomeTag>::RegistrationProxy<SomePacket>
registerSomePacket (key_of_somePacket);
\endcode
This global variable declaration will register \c SomePacket
constructor during global construction time.
The PacketRegistry's purpose is mostly to assist in
- implementing the \v v_nextInterpreter() member of packet
+ implementing the v_nextInterpreter() member of packet
facades. This is further supported by the PacketRegistryMixin
class.
+
+ \todo Add parameterless create() method
*/
template <class Tag>
class PacketRegistry
{
public:
- // TODO: This fails to work within a library since the linker will
- // remove all unused object files ...
/** \brief Statically register a packet type in a PacketRegistry
+
+ \fixme This fails to work within a library since the linker will
+ remove all unused object files ...
*/
template <class OtherPacket>
struct RegistrationProxy
{
RegistrationProxy(typename Tag::key_t key);
};
-
+
/** \brief Register new packet type
-
+
Register \c OtherPacket in the packet registry \c Tag
under the given \c key.
any other packet class in this registry.
The Packet must not already be registered in the registry.
- \param OtherPacket packet to regiser
+ \param OtherPacket packet to register
\param key key of the packet
*/
template <class OtherPacket>
static void registerPacket(typename Tag::key_t key);
/** \brief Find key of a packet
-
+
Return the key of \c OtherPacket as registered in the \c
Tag registry
\param key Key of packet type to create instance of
\param b begin iterator argument to Packet::create()
- \param e end iterator argment to Packet::create()
+ \param e end iterator argument to Packet::create()
\returns new Instance of the packet type registered under
key or DataPacket, if the key is not registered.
*/
template <class InputIterator>
static Packet::ptr create(typename Tag::key_t key, InputIterator b, InputIterator e);
-
+
private:
typedef impl::PacketRegistryImpl<typename Tag::key_t> Registry;
static Registry & registry();
-
+
template <class T, class D> friend class PacketRegistryMixin;
};
This mixin class provides a new registerInterpreter
implementation which can be used besides the methods provided
- bei satcom::pkf::Packet to add a new interpreter to the
+ by senf::Packet to add a new interpreter to the
interpreter chain.
\code
{
protected:
/** \brief add interpreter to interpreter chain
-
+
This method is used by v_nextInterpreter() to add a new
interpreter to the interpreter chain (see the Packet
reference for more). Instead of specifying the type of
packet to use as a template argument it is specified using
the \c key value from the \c Tag registry
*/
- void registerInterpreter(typename Tag::key_t key,
+ void registerInterpreter(typename Tag::key_t key,
Packet::iterator b, Packet::iterator e) const;
};
struct PacketTypeNotRegistered : public std::exception
{ virtual char const * what() const throw() { return "packet type not registered"; } };
-}}
+}
///////////////////////////////hh.e////////////////////////////////////////
//#include "PacketRegistry.cci"
\f
// Local Variables:
// mode: c++
-// c-file-style: "satcom"
+// fill-column: 100
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
// End: