PPI: Missing commit
[senf.git] / Packets / PacketImpl.cci
index d8dd2cb..e3c532e 100644 (file)
@@ -1,6 +1,8 @@
-// Copyright (C) 2007 
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// $Id$
+//
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
     \brief PacketImpl inline non-template implementation */
 
 // Custom includes
-#include "PacketInterpreter.hh"
+#include "../Utils/senfassert.hh"
+// #include "PacketInterpreter.hh"
 
 #define prefix_ inline
 ///////////////////////////////cci.p///////////////////////////////////////
 
+///////////////////////////////////////////////////////////////////////////
+// senf::detail::AnnotationIndexerBase
+
+prefix_ std::vector<bool> & senf::detail::AnnotationIndexerBase::small()
+{
+    static std::vector<bool> smalls;
+    return smalls;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// senf::detail::AnnotationP
+
+prefix_ senf::detail::AnnotationP::~AnnotationP()
+{}
+
 // Memory management:
-// 
+//
 // * The PacketImpl destructor will *explicitly* clean-up the interpreters_ list by removing
 //   each element from the list and deleting it if it's (intrusive) refcount is 0
 // * The PacketInterpreters use safe hooks -> they know wether they are part of a list or not
 // senf::detail::PacketImpl
 
 prefix_ senf::detail::PacketImpl::PacketImpl()
-    : refcount_(0)
+    : refcount_(0), annotations_(AnnotationIndexerBase::maxAnnotations)
 {}
 
 prefix_ senf::detail::PacketImpl::PacketImpl(size_type size, byte initValue)
-    : refcount_(0), data_(size,initValue)
+    : refcount_(0), data_(size,initValue), annotations_(AnnotationIndexerBase::maxAnnotations)
 {}
 
-prefix_ senf::detail::PacketImpl::~PacketImpl()
-{
-    // We increment refcount_ to ensure, release() won't call delete again
-    ++refcount_;
-    eraseInterpreters(interpreters_.begin(), interpreters_.end());
-}
-
 // rerference/memory management
 
 prefix_ void senf::detail::PacketImpl::add_ref(refcount_t n)
@@ -75,18 +86,6 @@ prefix_ void senf::detail::PacketImpl::add_ref(refcount_t n)
     refcount_ += n;
 }
 
-prefix_ void senf::detail::PacketImpl::release(refcount_t n)
-{
-    BOOST_ASSERT(refcount_ >= n);
-    // uah ... we need to be extremely careful here. If refcount_ is n, we want to commit suicide,
-    // however the destructor will remove all PacketInterpreters from the list and will thereby
-    // decrement refcount -> only decrenebt refcount_ when *not* caling delete
-    if (refcount_ == n)
-        delete this;
-    else
-        refcount_ -= n;
-}
-
 prefix_ senf::detail::PacketImpl::refcount_t senf::detail::PacketImpl::refcount()
     const
 {
@@ -112,7 +111,7 @@ prefix_ senf::PacketInterpreterBase * senf::detail::PacketImpl::next(PacketInter
 }
 
 prefix_ senf::PacketInterpreterBase * senf::detail::PacketImpl::prev(PacketInterpreterBase * p)
-{ 
+{
     interpreter_list::iterator i (interpreter_list::current(*p));
     return (i == interpreters_.begin()) ? 0 : &*(--i);
 }
@@ -148,29 +147,61 @@ prefix_ senf::detail::PacketImpl::size_type senf::detail::PacketImpl::size()
 
 prefix_ void senf::detail::PacketImpl::insert(PacketData * self, iterator pos, byte v)
 {
+    difference_type ix (std::distance(begin(),pos));
     data_.insert(pos,v);
-    updateIterators(self,pos,1);
+    updateIterators(self,ix,1);
 }
 
 prefix_ void senf::detail::PacketImpl::insert(PacketData * self, iterator pos, size_type n,
                                               byte v)
 {
+    difference_type ix (std::distance(begin(),pos));
     data_.insert(pos,n,v);
-    updateIterators(self,pos,n);
+    updateIterators(self,ix,n);
 }
 
 prefix_ void senf::detail::PacketImpl::erase(PacketData * self, iterator pos)
 {
+    difference_type ix (std::distance(begin(),pos));
     data_.erase(pos);
-    updateIterators(self,pos,-1);
+    updateIterators(self,ix,-1);
 }
 
 prefix_ void senf::detail::PacketImpl::erase(PacketData * self, iterator first, iterator last)
 {
+    difference_type ix (std::distance(begin(),first));
+    difference_type delta (std::distance(first,last));
     data_.erase(first,last);
-    updateIterators(self,first,-std::distance(first,last));
+    updateIterators(self,ix,-delta);
+}
+
+prefix_ void senf::detail::PacketImpl::reserve(size_type n)
+{
+    data_.reserve(n);
 }
 
+prefix_ senf::detail::PacketImpl::size_type senf::detail::PacketImpl::capacity()
+    const
+{
+    return data_.capacity();
+}
+
+// This function has a problem being inlined. Somehow, often when calling this, the size of the 
+// resulting inlined code would be huge?
+
+prefix_ void senf::detail::PacketImpl::release(refcount_t n)
+{
+    SENF_ASSERT(refcount_ >= n);
+    // uah ... we need to be extremely careful here. If refcount_ is n, we want to commit suicide,
+    // however the destructor will remove all PacketInterpreters from the list and will thereby
+    // decrement refcount -> only decrenebt refcount_ when *not* caling delete
+    if (refcount_ == n)
+        delete this;
+    else
+        refcount_ -= n;
+}
+
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::detail::PacketImpl::Guard
 
@@ -195,4 +226,6 @@ prefix_ senf::detail::PacketImpl::Guard::~Guard()
 // c-file-style: "senf"
 // indent-tabs-mode: nil
 // ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// comment-column: 40
 // End: