X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketImpl.cci;h=3c6cce0bc93e8e85f9d15d2ccd48488d207e4ac2;hb=1e7062482bb6d99a0c36b641069c73a4a93da9cc;hp=9b8a27723d6a39ba162b584f53ba8e88d82d21cf;hpb=9348e1098d66ac2684c8e280abf8d7143c887982;p=senf.git diff --git a/Packets/PacketImpl.cci b/Packets/PacketImpl.cci index 9b8a277..3c6cce0 100644 --- a/Packets/PacketImpl.cci +++ b/Packets/PacketImpl.cci @@ -33,12 +33,22 @@ /////////////////////////////////////////////////////////////////////////// // senf::detail::AnnotationIndexerBase +prefix_ senf::detail::AnnotationIndexerBase::~AnnotationIndexerBase() +{} + prefix_ std::vector & senf::detail::AnnotationIndexerBase::small() { static std::vector smalls; return smalls; } +prefix_ std::vector & +senf::detail::AnnotationIndexerBase::registry() +{ + static std::vector reg; + return reg; +} + /////////////////////////////////////////////////////////////////////////// // senf::detail::AnnotationP @@ -72,11 +82,11 @@ prefix_ senf::detail::AnnotationP::~AnnotationP() // senf::detail::PacketImpl prefix_ senf::detail::PacketImpl::PacketImpl() - : refcount_(0), annotations_(AnnotationIndexerBase::maxAnnotations, 0) + : refcount_(0), annotations_(AnnotationIndexerBase::maxAnnotations) {} prefix_ senf::detail::PacketImpl::PacketImpl(size_type size, byte initValue) - : refcount_(0), data_(size,initValue), annotations_(AnnotationIndexerBase::maxAnnotations, 0) + : refcount_(0), data_(size,initValue), annotations_(AnnotationIndexerBase::maxAnnotations) {} // rerference/memory management @@ -175,6 +185,38 @@ prefix_ void senf::detail::PacketImpl::erase(PacketData * self, iterator first, 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(); +} + +prefix_ void senf::detail::PacketImpl::dumpAnnotations(std::ostream & os) +{ + AnnotationIndexerBase::dump(this, os); +} + +// 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