fixed ...
[senf.git] / senf / Packets / ListOptionTypeParser.cti
index 125921d..819f15e 100644 (file)
 ///////////////////////////////////////////////////////////////////////////
 // senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>
 
-template<class ElementParser, class AuxPolicy>
-prefix_ senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::ListOptionTypeParser_Policy() {
-}
+template <class ElementParser, class AuxPolicy>
+prefix_
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::
+ListOptionTypeParser_Policy()
+{}
 
-template<class ElementParser, class AuxPolicy>
-template<class Arg>
-prefix_ senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::ListOptionTypeParser_Policy(Arg const & arg) :AuxPolicy(arg) {
-}
+template <class ElementParser, class AuxPolicy>
+template <class Arg>
+prefix_
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::
+ListOptionTypeParser_Policy(Arg const & arg)
+    : AuxPolicy(arg) 
+{}
 
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::size_type
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::bytes(data_iterator i, state_type s) const {
-    return AuxPolicy::aux(i, s) + AuxPolicy::aux_bytes;
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::bytes(data_iterator i,
+                                                                          state_type s)
+    const
+{
+    return ((AuxPolicy::aux(i, s) * 8 + 6)  + AuxPolicy::aux_bytes);
 }
 
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::size_type
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::size(data_iterator i, state_type s) const {
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::size(data_iterator i,
+                                                                         state_type s)
+    const
+{
     parser_type p(*this, i, s);
     container_type c(p);
     return std::distance(c.begin(), c.end());
 }
 
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ void
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::init(data_iterator i, state_type s) const {
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::init(data_iterator i,
+                                                                         state_type s)
+    const
+{
+    i[0] = 1u;
+    i[1] = 4u;
+    for (unsigned int n = 2;n < 6; ++n)
+        i[n] = 0u;
     AuxPolicy::aux(0, i, s);
 }
 
@@ -66,152 +84,197 @@ senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::init(data_i
 // senf::detail::ListOptionTypeParser_Policy<ElementParser,BytesParser>
 
 //constructor
-template<class ElementParser, class AuxPolicy>
-prefix_ senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::container_policy(parser_policy const & p) :
-    AuxPolicy(p) {
-}
+template <class ElementParser, class AuxPolicy>
+prefix_
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+container_policy(parser_policy const & p)
+    : AuxPolicy(p) 
+{}
 
 //destructor
-template<class ElementParser, class AuxPolicy>
-prefix_ senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::~container_policy()
+template <class ElementParser, class AuxPolicy>
+prefix_
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+~container_policy()
 {}
 
 //construct method
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ void
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::construct(container_type & c) {
-    data_iterator i = c.i();
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+construct(container_type & c)
+{
+    safe_data_iterator i (c.data(), c.i()) ;
     realAux_ = (AuxPolicy::aux(i, c.state()) * 8) + 6;
-    data_iterator e = i + realAux_;
-    for (n_ = 0; i != e; ++n_) {
+    safe_data_iterator e = i + realAux_;
+    for (n_ = 0; i != e;) {
         unsigned int elByte = senf::bytes(ElementParser(i, c.state()));
-        if (((i + elByte) == e) && (i[0] == 0u || i[0] == 1u)) { //check wether last element is padding or not
+        if (((i + elByte) == e) && (i[0] == 0u || i[0] == 1u)) { //check weather last element is padding or not
             realAux_ -= std::distance(i, e);
             c.data().erase(i, e); //delete padding
             e = i; //set end iterator
-        } else
+        } else{
+            ++n_;
             std::advance(i, elByte);
+        }
     }
-    //    container_size_ = std::distance(i,e);
     container_size_ = c.data().size(); //set actual size without padding
 }
 
 //destruct method
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ void
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::destruct(container_type & c) {
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+destruct(container_type & c)
+{
     // data_iterator i (AuxPolicy::adjust(parser_type::get(p).i(), parser_type::get(p).state()));
-    data_iterator i = c.i();
-    data_iterator const e = i + realAux_;
-    unsigned int padBytes = (realAux_ % 8);
-    c.data().insert(e, padBytes, 0u);
+    safe_data_iterator i (c.data(), c.i()) ;
+    safe_data_iterator e = i + realAux_;
+    unsigned int padBytes = 0;
+    if (realAux_ == 0)      //if list is empty, 6 padding bytes required!
+      padBytes = 6;
+    else{
+      padBytes = ( (realAux_+2) % 8);
+      if (padBytes != 0)
+          padBytes = 8 - padBytes;
+    }
     if (padBytes > 0) {
+        c.data().insert(e, padBytes, 0u);
         if (padBytes > 1) {
-            e[0] = 1;
+            e[0] = 1u;
             e[1] = padBytes - 2;
         } else
             e[0] = 0;
         container_size_ += padBytes;
+        realAux_ += padBytes;
         ++n_;
     }
-    AuxPolicy::aux((realAux_ / 8 - 1), i, c.state());
+    AuxPolicy::aux(( (realAux_ + 2)/ 8 - 1), i, c.state());
 }
 
 //bytes()
-template<class ElementParser, class AuxPolicy>
-prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::size_type
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::bytes(data_iterator i,state_type s) const {
-    return (realAux_ + 2);
+template <class ElementParser, class AuxPolicy>
+prefix_ typename senf::detail::ListOptionTypeParser_Policy<
+    ElementParser,AuxPolicy>::container_policy::size_type
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+bytes(data_iterator i, state_type s)
+    const
+{
+    return (realAux_ );
 }
 
 //size()
-template<class ElementParser, class AuxPolicy>
-prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::size_type
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::size(data_iterator i,state_type s) const {
+template <class ElementParser, class AuxPolicy>
+prefix_ typename senf::detail::ListOptionTypeParser_Policy<
+    ElementParser,AuxPolicy>::container_policy::size_type
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+size(data_iterator i, state_type s)
+    const
+{
     return n_;
 }
 
 //init()
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ void
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::init(data_iterator i, state_type s) {
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+init(data_iterator i, state_type s)
+{
+    realAux_ = 0;
     n_ = 0;
     container_size_ = s->size();
     AuxPolicy::aux(0, i, s);
 }
 
 //erase()
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ void
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::erase(container_type & c, data_iterator p) {
-    size_type b(senf::bytes(ElementParser(p, c.state()))); //length of parser
-    //    AuxPolicy::aux(
-    //                 AuxPolicy::aux( c.i(), c.state()) -b,
-    //                 c.i(),
-    //                 c.state());
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+erase(container_type & c, data_iterator p)
+{
+    size_type b(senf::bytes(ElementParser(p, c.state())));
     realAux_ -= b;
     --n_;
-    // The container will be reduced by b bytes directly after this call
     container_size_ = c.data().size() - b;
 }
 
 //insert()
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ void
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::insert(container_type & c, data_iterator p) {
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+insert(container_type & c, data_iterator p)
+{
     size_type b(senf::bytes(ElementParser(p, c.state())));
-    //    AuxPolicy::aux( AuxPolicy::aux(c.i(), c.state())+b, c.i(), c.state());
     realAux_ += b;
     ++n_;
     container_size_ = c.data().size();
 }
 
 //update()
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ void
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::update(container_type const & c) const {
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+update(container_type const & c)
+    const
+{
     if (container_size_ == c.data().size())
         return;
     data_iterator i(AuxPolicy::adjust(c.i(), c.state()));
     data_iterator j(i);
     for (size_type n(n_); n; --n, std::advance(j, senf::bytes(ElementParser(j,c.state()))));
     realAux_ = std::distance(i, j);
-    //    aux( std::distance(i,j), c.i(), c.state() );
     container_size_ = c.data().size();
 }
 
 //setbegin()
-template<class ElementParser, class AuxPolicy>
-prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::data_iterator
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::setBegin(container_type const & c, iterator_data & d) const {
+template <class ElementParser, class AuxPolicy>
+prefix_ typename senf::detail::ListOptionTypeParser_Policy<
+    ElementParser,AuxPolicy>::container_policy::data_iterator
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+setBegin(container_type const & c, iterator_data & d)
+    const
+{
     return c.i();
-    //    return AuxPolicy::adjust(c.i(), c.state());
 }
 
 //setEnd()
-template<class ElementParser, class AuxPolicy>
-prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::data_iterator
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::setEnd(container_type const & c, iterator_data & d) const { //wtf??
-    return boost::next(AuxPolicy::adjust(c.i(), c.state()), aux(c.i(),c.state()));
+template <class ElementParser, class AuxPolicy>
+prefix_ typename senf::detail::ListOptionTypeParser_Policy<
+    ElementParser,AuxPolicy>::container_policy::data_iterator
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+setEnd(container_type const & c, iterator_data & d)
+    const
+{
+    return boost::next(c.i(),realAux_);
 }
 
 //setFromPosition()
-template<class ElementParser, class AuxPolicy>
+template <class ElementParser, class AuxPolicy>
 prefix_ void
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::setFromPosition(container_type const & c, iterator_data & d, data_iterator p) const {
-}
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+setFromPosition(container_type const & c, iterator_data & d, data_iterator p)
+    const
+{}
 
 //next()
-template<class ElementParser, class AuxPolicy>
-prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::data_iterator
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::next(container_type const & c, iterator_data & d) const {
+template <class ElementParser, class AuxPolicy>
+prefix_ typename senf::detail::ListOptionTypeParser_Policy<
+    ElementParser,AuxPolicy>::container_policy::data_iterator
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+next(container_type const & c, iterator_data & d)
+    const
+{
     return boost::next(container_type::iterator::get(d).i(), senf::bytes(ElementParser(container_type::iterator::get(d).i(), c.state())));
 }
 
 //raw()
-template<class ElementParser, class AuxPolicy>
-prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::data_iterator
-senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::container_policy::raw(container_type const & c, iterator_data const & d) const {
+template <class ElementParser, class AuxPolicy>
+prefix_ typename senf::detail::ListOptionTypeParser_Policy<
+    ElementParser,AuxPolicy>::container_policy::data_iterator
+senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
+raw(container_type const & c, iterator_data const & d)
+    const
+{
     return container_type::iterator::get(d).i();
 }