moved Sniffer into new Examples directory
[senf.git] / Packets / ParseListS.hh
index 2c75016..63d3ff1 100644 (file)
@@ -1,6 +1,6 @@
 // $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.
 
+/** \file
+
+    \idea Add an optional state to the sentinel and an optional
+    transition function. See ParseListS.hh for more.
+
+    We should write a baseclass for sentinels which has no \c check()
+    member, an empty \c next() member and \c void as the state
+    type. This simplifies writing simple sentinels.
+
+    The parse_listS iterator will have to pass the state in addition
+    to the current list element to \c check(). The \c next() member
+    will be invoked to advance the iterator. It is passer the current
+    element and a (non-const) reference to the state which it may
+    update. The Parse_ListS constructor must take an arbitrary number
+    of additional arguments which are forwarded to the state
+    initialization.
+
+    This structure makes it simple to optimize away the overhead if
+    the state type is void. If we would always instantiate the
+    sentinel, this will always take up space.
+
+    Another possibility would be to always instantiate the sentinel
+    and make the baseclass mandatory. The baseclass would then hold
+    the current raw iterator. The iterator itself would ONLY include a
+    single sentinel instance .. I think, this is the best solution,
+    sentinel members then have intrinsic access to the
+    state. Arguments are forwarded from the list constructor to the
+    Sentinel constructor.
+ */
+
 #ifndef HH_ParseListS_
 #define HH_ParseListS_ 1
 
 //#include "ParseListS.mpp"
 ///////////////////////////////hh.p////////////////////////////////////////
 
-namespace satcom {
-namespace pkf {
+namespace senf {
+
 
     template <class Parser, class Sentinel, class Container> class Parse_ListS_wrapper;
-    namespace impl { 
-        template <class Parser, class Sentinel, class Container> class Parse_ListS_iterator; 
+    namespace impl {
+        template <class Parser, class Sentinel, class Container> class Parse_ListS_iterator;
     }
 
     template <class Parser, class Sentinel, class Iterator=nil, class IPacket=nil>
@@ -46,13 +76,13 @@ namespace pkf {
         ///////////////////////////////////////////////////////////////////////////
         // Parser interface
 
-        template <class I=nil, class P=nil> 
+        template <class I=nil, class P=nil>
         struct rebind { typedef Parse_ListS<Parser,Sentinel,I,P> parser; };
         typedef Iterator byte_iterator;
-        
+
         Parse_ListS();
         Parse_ListS(Iterator const & i);
-        
+
         unsigned bytes() const;
         bool check(Iterator const & e) const;
         void init() const;
@@ -83,7 +113,7 @@ namespace pkf {
     };
 
     /** \brief
-        
+
         Holds a reference to the container !
       */
     template <class Parser, class Sentinel, class Container>
@@ -132,25 +162,25 @@ namespace pkf {
         ///\name Mutators
         ///@{
 
-        template <class Value> void insert(iterator pos, Value const & t); 
-        template <class Value> void insert(iterator pos, size_type n, Value const & t); 
-        template <class InputIterator> void insert(iterator pos, InputIterator f, InputIterator l); 
-        
-        void erase(iterator pos, size_type n=1); 
-        void erase(iterator f, iterator l); 
-        void clear(); 
+        template <class Value> void insert(iterator pos, Value const & t);
+        template <class Value> void insert(iterator pos, size_type n, Value const & t);
+        template <class InputIterator> void insert(iterator pos, InputIterator f, InputIterator l);
+
+        void erase(iterator pos, size_type n=1);
+        void erase(iterator f, iterator l);
+        void clear();
 
         ///@}
 
     protected:
 
     private:
-        
+
         size_type i_;
         Container & container_;
     };
 
-}}
+}
 
 ///////////////////////////////hh.e////////////////////////////////////////
 //#include "ParseListS.cci"
@@ -161,5 +191,8 @@ namespace pkf {
 \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: