X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketImpl.cc;h=291b3f1b8ff90417348e93973bb535e30bd24b51;hb=57daeae6f2e924ce3f16f9677c3474f531cba9e5;hp=d67a7795b26982761ab8c4fe21803dcde90fa455;hpb=7c691ffe57bd1939572a94736bedf6ac3a3f7b1a;p=senf.git diff --git a/senf/Packets/PacketImpl.cc b/senf/Packets/PacketImpl.cc index d67a779..291b3f1 100644 --- a/senf/Packets/PacketImpl.cc +++ b/senf/Packets/PacketImpl.cc @@ -35,9 +35,9 @@ //#include "PacketImpl.mpp" #define prefix_ -///////////////////////////////cc.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::detail::PacketImpl prefix_ senf::detail::PacketImpl::~PacketImpl() @@ -47,6 +47,19 @@ prefix_ senf::detail::PacketImpl::~PacketImpl() eraseInterpreters(interpreters_.begin(), interpreters_.end()); } +prefix_ void senf::detail::PacketImpl::release() +{ + SENF_ASSERT(refcount_ >= 1, "Internal failure: Releasing dead PacketImpl ??"); + // uah ... we need to be extremely careful here. If refcount_ is 1, we want to commit suicide, + // however the destructor will remove all PacketInterpreters from the list and will thereby + // decrement refcount -> only decrement refcount_ when *not* calling delete (otherwise + // the assert above will fail) + if (refcount_ == 1) + delete this; + else + -- refcount_; +} + // interpreter chain prefix_ void senf::detail::PacketImpl::appendInterpreter(PacketInterpreterBase * p) @@ -108,7 +121,7 @@ prefix_ void senf::detail::PacketImpl::updateIterators(PacketData * self, differ // b) 'self' // c) Those that come afterwards // For a), the change must be inside the packet since 'self' must be within those packets - // For b), the change must also be within since that's the packet we are changeing + // For b), the change must also be within since that's the packet we are changing // For c), the change must be outside the packet (we don't allow an upper packet to mess with // the the data owned by a packet further down the chain). It can be before or after the // packet. @@ -123,7 +136,7 @@ prefix_ void senf::detail::PacketImpl::updateIterators(PacketData * self, differ interpreter_list::iterator const i_end (interpreters_.end()); if (++i != i_end) if (pos <= difference_type(i->begin_)) - // pos is before the packet, it must then be before all futher packets ... + // pos is before the packet, it must then be before all further packets ... for (; i != i_end; ++i) { i->begin_ += n; i->end_ += n; @@ -143,6 +156,20 @@ prefix_ void senf::detail::PacketImpl::dumpAnnotations(std::ostream & os) } } +prefix_ void senf::detail::PacketImpl::clearAnnotations() +{ + ::memset(simpleAnnotations_, 0, sizeof(simpleAnnotations_)); + complexAnnotations_.clear(); +} + +prefix_ void senf::detail::PacketImpl::assignAnnotations(PacketImpl const & other) +{ + std::copy(&other.simpleAnnotations_[0], &other.simpleAnnotations_[0] + + sizeof(simpleAnnotations_)/sizeof(simpleAnnotations_[0]), simpleAnnotations_); + complexAnnotations_.assign( + other.complexAnnotations_.begin(), other.complexAnnotations_.end()); +} + prefix_ void * senf::detail::PacketImpl::complexAnnotation(AnnotationRegistry::key_type key) { SENF_ASSERT( key < 0, "complexAnnotation called with invalid key"); @@ -151,12 +178,23 @@ prefix_ void * senf::detail::PacketImpl::complexAnnotation(AnnotationRegistry::k ? 0 : complexAnnotations_[-key-1].get(); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::detail::AnnotationRegistry +prefix_ void senf::detail::AnnotationRegistry::dump(key_type key, std::ostream & os, + void * annotation) + const +{ + Registry::const_iterator i (registry_.find(key)); + if (i != registry_.end()) { + os << fieldName(i->second->v_name()); + i->second->v_dump(os, annotation); + os << "\n"; + } +} + prefix_ void senf::detail::AnnotationRegistry::dumpRegistrations(std::ostream & os) { -#ifdef SENF_DEBUG boost::format fmt ("%-56.56s %-4.4s %-7.7s %5d\n"); os << "SENF_PACKET_ANNOTATION_SLOTS = " << SENF_PACKET_ANNOTATION_SLOTS << "\n" << "SENF_PACKET_ANNOTATION_SLOTSIZE = " << SENF_PACKET_ANNOTATION_SLOTSIZE << "\n"; @@ -172,7 +210,6 @@ prefix_ void senf::detail::AnnotationRegistry::dumpRegistrations(std::ostream & % (isComplex(key) ? "yes" : "no") % size(key); } -#endif } prefix_ void senf::dumpPacketAnnotationRegistry(std::ostream & os) @@ -180,7 +217,7 @@ prefix_ void senf::dumpPacketAnnotationRegistry(std::ostream & os) senf::detail::AnnotationRegistry::instance().dumpRegistrations(os); } -/////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ //#include "PacketImpl.mpp"