X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketImpl.cc;h=291b3f1b8ff90417348e93973bb535e30bd24b51;hb=57daeae6f2e924ce3f16f9677c3474f531cba9e5;hp=f9c598f8de604be939e66a61799768e88bf56d08;hpb=73a2b9252afa039e5e8d0cace3f658478b696483;p=senf.git diff --git a/senf/Packets/PacketImpl.cc b/senf/Packets/PacketImpl.cc index f9c598f..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) @@ -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,9 +178,21 @@ 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) { boost::format fmt ("%-56.56s %-4.4s %-7.7s %5d\n"); @@ -178,7 +217,7 @@ prefix_ void senf::dumpPacketAnnotationRegistry(std::ostream & os) senf::detail::AnnotationRegistry::instance().dumpRegistrations(os); } -/////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ //#include "PacketImpl.mpp"