several fixes for clang/llvm
[senf.git] / senf / Packets / PacketInterpreter.hh
index deae9d3..d7fb09b 100644 (file)
 namespace senf {
 
     template <class PacketType> class PacketInterpreter;
+    
+    void intrusive_ptr_add_ref(PacketInterpreterBase const * p);
+    void intrusive_ptr_release(PacketInterpreterBase const * p);
 
+    
     /** \brief Internal: Base packet interpreter class
 
         \internal
@@ -74,7 +78,7 @@ namespace senf {
         typedef senf::detail::packet::byte byte;
 
         typedef boost::iterator_range<iterator> range;
-        typedef boost::optional< boost::iterator_range<iterator> > optional_range;
+        typedef boost::optional<range> optional_range;
         typedef optional_range no_range;
 
         enum Append_t { Append };
@@ -102,26 +106,26 @@ namespace senf {
 
             // Create packet as new packet after a given packet
 
-            virtual ptr createAfter(PacketInterpreterBase::ptr packet) const = 0;
-            virtual ptr createAfter(PacketInterpreterBase::ptr packet, senf::NoInit_t) const = 0;
-            virtual ptr createAfter(PacketInterpreterBase::ptr packet, size_type size) const = 0;
-            virtual ptr createAfter(PacketInterpreterBase::ptr packet, size_type size,
+            virtual ptr createAfter(PacketInterpreterBase::ptr const & packet) const = 0;
+            virtual ptr createAfter(PacketInterpreterBase::ptr const & packet, senf::NoInit_t) const = 0;
+            virtual ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size) const = 0;
+            virtual ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size,
                                     senf::NoInit_t) const = 0;
             template <class ForwardReadableRange>
-            ptr createAfter(PacketInterpreterBase::ptr packet,
+            ptr createAfter(PacketInterpreterBase::ptr const & packet,
                             ForwardReadableRange const & range) const;
 
             // Create packet as new packet (header) const before a given packet
 
-            virtual ptr createBefore(PacketInterpreterBase::ptr packet) const = 0;
-            virtual ptr createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t) const = 0;
+            virtual ptr createBefore(PacketInterpreterBase::ptr const & packet) const = 0;
+            virtual ptr createBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t) const = 0;
 
-            virtual ptr createInsertBefore(PacketInterpreterBase::ptr packet) const = 0;
-            virtual ptr createInsertBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t) const = 0;
+            virtual ptr createInsertBefore(PacketInterpreterBase::ptr const & packet) const = 0;
+            virtual ptr createInsertBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t) const = 0;
 
             // Parse next packet in chain
 
-            virtual ptr parseNext(ptr packet) const = 0;
+            virtual ptr parseNext(ptr const & packet, PacketInterpreterBase::optional_range const & range) const = 0;
         };
 
         typedef Factory const * factory_t;
@@ -136,7 +140,7 @@ namespace senf {
 
         virtual ~PacketInterpreterBase();
 
-        static                             factory_t no_factory();
+        static factory_t no_factory();
 
         ptr clone();
 
@@ -152,8 +156,7 @@ namespace senf {
         ptr last();
 
         template <class Type> typename PacketInterpreter<Type>::ptr parseNextAs();
-                                       ptr                          parseNextAs(factory_t factory);
-        template <class Type>          bool                         is();
+                                       ptr                          parseNextAs(factory_t factory, PacketInterpreterBase::optional_range const & range);
         template <class Type> typename PacketInterpreter<Type>::ptr as();
 
         ptr append(ptr packet);
@@ -233,16 +236,13 @@ namespace senf {
         friend class detail::PacketImpl;
         friend class intrusive_refcount_base;
         template <class PacketType> friend class PacketInterpreter;
-        friend class detail::packet::test::TestDriver;
+        friend struct detail::packet::test::TestDriver;
         friend class PacketParserBase;
 
         friend void senf::intrusive_ptr_add_ref(PacketInterpreterBase const *);
         friend void senf::intrusive_ptr_release(PacketInterpreterBase const *);
     };
 
-    void intrusive_ptr_add_ref(PacketInterpreterBase const * p);
-    void intrusive_ptr_release(PacketInterpreterBase const * p);
-
     /** \brief Internal: Concrete packet interpreter
 
         \internal
@@ -288,21 +288,21 @@ namespace senf {
 
         // Create packet as new packet after a given packet
 
-        static ptr createAfter(PacketInterpreterBase::ptr packet);
-        static ptr createAfter(PacketInterpreterBase::ptr packet, senf::NoInit_t);
-        static ptr createAfter(PacketInterpreterBase::ptr packet, size_type size);
-        static ptr createAfter(PacketInterpreterBase::ptr packet, size_type size, senf::NoInit_t);
+        static ptr createAfter(PacketInterpreterBase::ptr const & packet);
+        static ptr createAfter(PacketInterpreterBase::ptr const & packet, senf::NoInit_t);
+        static ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size);
+        static ptr createAfter(PacketInterpreterBase::ptr const & packet, size_type size, senf::NoInit_t);
         template <class ForwardReadableRange>
-        static ptr createAfter(PacketInterpreterBase::ptr packet,
+        static ptr createAfter(PacketInterpreterBase::ptr const & packet,
                                ForwardReadableRange const & range);
 
         // Create packet as new packet (header) before a given packet
 
-        static ptr createBefore(PacketInterpreterBase::ptr packet);
-        static ptr createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t);
+        static ptr createBefore(PacketInterpreterBase::ptr const & spacket);
+        static ptr createBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t);
 
-        static ptr createInsertBefore(PacketInterpreterBase::ptr packet);
-        static ptr createInsertBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t);
+        static ptr createInsertBefore(PacketInterpreterBase::ptr const & packet);
+        static ptr createInsertBefore(PacketInterpreterBase::ptr const & packet, senf::NoInit_t);
 
         // Create a clone of the current packet
 
@@ -328,12 +328,12 @@ namespace senf {
         PacketInterpreter(detail::PacketImpl * impl, iterator b, iterator e, Append_t);
         PacketInterpreter(detail::PacketImpl * impl, iterator b, iterator e, Prepend_t);
         PacketInterpreter(detail::PacketImpl * impl, iterator b, iterator e,
-                          PacketInterpreterBase::ptr before);
+                          PacketInterpreterBase::ptr const & before);
 
         static ptr create(detail::PacketImpl * impl, iterator b, iterator e, Append_t);
         static ptr create(detail::PacketImpl * impl, iterator b, iterator e, Prepend_t);
         static ptr create(detail::PacketImpl * impl, iterator b, iterator e,
-                          PacketInterpreterBase::ptr before);
+                          PacketInterpreterBase::ptr const & before);
 
         // PacketType access
 
@@ -371,40 +371,40 @@ namespace senf {
 
             // Create packet as new packet after a given packet
 
-            virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet)
+            virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr const & packet)
                 const;
-            virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet,
+            virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr const & packet,
                                                            senf::NoInit_t) const;
-            virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet,
+            virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr const & packet,
                                                            size_type size) const;
-            virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet,
+            virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr const & packet,
                                                            size_type size, senf::NoInit_t) const;
 
             // Create packet as new packet (header) before a given packet
 
-            virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr packet)
+            virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr const & packet)
                 const;
-            virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr packet,
+            virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr const & packet,
                                                             senf::NoInit_t)
                 const;
 
-            virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr packet)
+            virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr const & packet)
                 const;
-            virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr packet,
+            virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr const & packet,
                                                                   senf::NoInit_t)
                 const;
 
             // Parse next packet in chain
 
-            virtual PacketInterpreterBase::ptr parseNext(PacketInterpreterBase::ptr packet)
+            virtual PacketInterpreterBase::ptr parseNext(PacketInterpreterBase::ptr const & packet, PacketInterpreterBase::optional_range const & range)
                 const;
         };
 
         static const FactoryImpl factory_;
 
-        friend class detail::packet::test::TestDriver;
+        friend struct detail::packet::test::TestDriver;
         friend class PacketInterpreterBase;
-        friend class FactoryImpl;
+        friend struct FactoryImpl;
     };
 
     /** \brief Invalid packet chain operation