Packets: return value_type parser from collection parser push_back_space() and push_f...
g0dil [Wed, 23 Sep 2009 15:21:42 +0000 (15:21 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1434 270642c3-0616-0410-b53a-bc976706d245

senf/Packets/ListBParser.test.cc
senf/Packets/ListParser.ct
senf/Packets/ListParser.cti
senf/Packets/ListParser.hh
senf/Packets/VectorParser.cti
senf/Packets/VectorParser.hh
senf/Packets/VectorParser.test.cc

index 23a14ff..d380738 100644 (file)
@@ -100,9 +100,8 @@ BOOST_AUTO_UNIT_TEST(ListBParser_container)
             senf::PacketInterpreterBase::ptr pi2 (senf::PacketInterpreter<VoidPacket>::create(
                     MyListBParser::init_bytes));
             MyListBParser::container c2 (MyListBParser(pi2->data().begin(),&pi2->data()));
-            c2.push_back_space();
             {
-                VectorParser::vec_t::container c2v (c2.front().vec());
+                VectorParser::vec_t::container c2v (c2.push_back_space().vec());
                 c2v.push_back(0x2345u);
                 c2v.push_back(0x3456u);
             }
index 8a5555e..7ce53a3 100644 (file)
@@ -75,7 +75,8 @@ senf::ListParser_Container<ListPolicy>::back()
 }
 
 template <class ListPolicy>
-prefix_ void senf::ListParser_Container<ListPolicy>::shift(iterator pos, size_type n)
+prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
+senf::ListParser_Container<ListPolicy>::shift(iterator pos, size_type n)
 {
     ListPolicy::update(*this);
     safe_data_iterator sp (data(),pos.raw());
@@ -84,6 +85,7 @@ prefix_ void senf::ListParser_Container<ListPolicy>::shift(iterator pos, size_ty
         value_type(sp,state()).init();
         ListPolicy::insert(*this,sp);
     }
+    return value_type(sp,state());
 }
 
 template <class ListPolicy>
index e8c85a7..0aa24ea 100644 (file)
@@ -92,11 +92,12 @@ prefix_ void senf::ListParser<ListPolicy>::push_back(Value const & value, size_t
 }
 
 template <class ListPolicy>
-prefix_ void senf::ListParser<ListPolicy>::push_back_space(size_type n)
+prefix_ typename senf::ListParser<ListPolicy>::value_type
+senf::ListParser<ListPolicy>::push_back_space(size_type n)
     const
 {
     container c(*this);
-    c.push_back_space(n);
+    return c.push_back_space(n);
 }
 
 template <class ListPolicy>
@@ -109,11 +110,12 @@ prefix_ void senf::ListParser<ListPolicy>::push_front(Value const & value, size_
 }
 
 template <class ListPolicy>
-prefix_ void senf::ListParser<ListPolicy>::push_front_space(size_type n)
+prefix_ typename senf::ListParser<ListPolicy>::value_type
+senf::ListParser<ListPolicy>::push_front_space(size_type n)
     const
 {
     container c(*this);
-    c.push_front_space(n);
+    return c.push_front_space(n);
 }
 
 template <class ListPolicy>
@@ -308,9 +310,10 @@ prefix_ void senf::ListParser_Container<ListPolicy>::push_back(Value const & val
 }
 
 template <class ListPolicy>
-prefix_ void senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
+prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
+senf::ListParser_Container<ListPolicy>::push_back_space(size_type n)
 {
-    shift(end(),n);
+    return shift(end(),n);
 }
 
 template <class ListPolicy>
@@ -322,9 +325,10 @@ prefix_ void senf::ListParser_Container<ListPolicy>::push_front(Value const & va
 }
 
 template <class ListPolicy>
-prefix_ void senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
+prefix_ typename senf::ListParser_Container<ListPolicy>::value_type
+senf::ListParser_Container<ListPolicy>::push_front_space(size_type n)
 {
-    shift(begin(),n);
+    return shift(begin(),n);
 }
 
 // Parser interface
index 3b26dad..d7c19a1 100644 (file)
@@ -102,9 +102,9 @@ namespace senf {
         value_type back() const;
 
         template <class Value> void push_back        (Value const & value, size_type n=1) const;
-                               void push_back_space  (size_type n=1) const;
+        value_type                  push_back_space  (size_type n=1) const;
         template <class Value> void push_front       (Value const & value, size_type n=1) const;
-                               void push_front_space (size_type n=1) const;
+        value_type                  push_front_space (size_type n=1) const;
                                void resize           (size_type n) const;
         template <class Value> void resize           (size_type n, Value value) const;
 
@@ -183,7 +183,7 @@ namespace senf {
         ///@{
 
         // All these operations can be quite inefficient depending on the list type
-        void shift(iterator pos, size_type n=1);
+        value_type shift(iterator pos, size_type n=1);
         template <class Value>
         void insert(iterator pos, Value const & t);
         template <class Value>
@@ -201,10 +201,10 @@ namespace senf {
         void clear();
 
         template <class Value> void push_back        (Value const & value, size_type n=1);
-                               void push_back_space  (size_type n=1);
+        value_type                  push_back_space  (size_type n=1);
         template <class Value> void push_front       (Value const & value, size_type n=1);
-                               void push_front_space (size_type n=1);
-                               void resize           (size_type n);
+        value_type                  push_front_space (size_type n=1);
+        void                        resize           (size_type n);
         template <class Value> void resize           (size_type n, Value value);
 
         ///@}
index de4a3ac..45faf91 100644 (file)
@@ -121,11 +121,12 @@ prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_back(Value const
 }
 
 template <class ElementParser, class AuxPolicy>
-prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_back_space(size_type n)
+prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
+senf::VectorParser<ElementParser,AuxPolicy>::push_back_space(size_type n)
     const
 {
     container c (*this);
-    c.push_back_space(n);
+    return c.push_back_space(n);
 }
 
 template <class ElementParser, class AuxPolicy>
@@ -138,11 +139,12 @@ prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_front(Value const
 }
 
 template <class ElementParser, class AuxPolicy>
-prefix_ void senf::VectorParser<ElementParser,AuxPolicy>::push_front_space(size_type n)
+prefix_ typename senf::VectorParser<ElementParser,AuxPolicy>::value_type
+senf::VectorParser<ElementParser,AuxPolicy>::push_front_space(size_type n)
     const
 {
     container c (*this);
-    c.push_front_space(n);
+    return c.push_front_space(n);
 }
 
 template <class ElementParser, class AuxPolicy>
@@ -272,9 +274,10 @@ prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_back(Va
 }
 
 template <class ElementParser, class AuxPolicy>
-prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_back_space(size_type n)
+prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
+senf::VectorParser_Container<ElementParser,AuxPolicy>::push_back_space(size_type n)
 {
-    shift(end(),n);
+    return *shift(end(),n);
 }
 
 template <class ElementParser, class AuxPolicy>
@@ -286,9 +289,10 @@ prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_front(V
 }
 
 template <class ElementParser, class AuxPolicy>
-prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::push_front_space(size_type n)
+prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::value_type
+senf::VectorParser_Container<ElementParser,AuxPolicy>::push_front_space(size_type n)
 {
-    shift(begin(),n);
+    return *shift(begin(),n);
 }
 
 // Parser interface
index ef3fe36..fda789e 100644 (file)
@@ -107,10 +107,10 @@ namespace senf {
         // 'container' wrapper
                    
         template <class Value> void push_back        (Value const & value, size_type n=1) const;
-                               void push_back_space  (size_type n=1) const;
+        value_type                  push_back_space  (size_type n=1) const;
         template <class Value> void push_front       (Value const & value, size_type n=1) const;
-                               void push_front_space (size_type n=1) const;
-                               void resize           (size_type n) const;
+        value_type                  push_front_space (size_type n=1) const;
+        void                        resize           (size_type n) const;
         template <class Value> void resize           (size_type n, Value value) const;
 
      private:
@@ -203,10 +203,10 @@ namespace senf {
         void clear();
 
         template <class Value> void push_back        (Value const & value, size_type n=1);
-                               void push_back_space  (size_type n=1);
+        value_type                  push_back_space  (size_type n=1);
         template <class Value> void push_front       (Value const & value, size_type n=1);
-                               void push_front_space (size_type n=1);
-                               void resize           (size_type n);
+        value_type                  push_front_space (size_type n=1);
+        void                        resize           (size_type n);
         template <class Value> void resize           (size_type n, Value value);
 
         ///@}
index 71f415b..b0d368c 100644 (file)
@@ -82,9 +82,9 @@ BOOST_AUTO_UNIT_TEST(VectorParser)
         BOOST_CHECK_EQUAL( v.size(), 8u );
         BOOST_CHECK_EQUAL( v[7], 0xf0f1u );
 
-        v.push_back_space();
+        v.push_back_space() = 37u;
         BOOST_CHECK_EQUAL( v.size(), 9u );
-        BOOST_CHECK_EQUAL( v[8], 0u );
+        BOOST_CHECK_EQUAL( v[8], 37u );
         
         v.push_front(0xf3f4u);
         BOOST_CHECK_EQUAL( v.size(), 10u );