X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketInterpreter.cci;h=d81df8a40ce05a5b4b3120bfbb97fe01eb681fb7;hb=7ee689fe38d66aa3a0004d55e8708750d35adc0b;hp=c5c75d367b6fc56ef4d73f45a6fb8504b3e729ce;hpb=601d1f509f5bb24df167a4dd5a20da67a0af9af8;p=senf.git diff --git a/senf/Packets/PacketInterpreter.cci b/senf/Packets/PacketInterpreter.cci index c5c75d3..d81df8a 100644 --- a/senf/Packets/PacketInterpreter.cci +++ b/senf/Packets/PacketInterpreter.cci @@ -24,13 +24,13 @@ \brief PacketInterpreter inline non-template implementation */ // Custom includes -#include "../Utils/senfassert.hh" +#include #include #define prefix_ inline -///////////////////////////////cci.p/////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::PacketInterpreterBase // Structors and default members @@ -98,7 +98,12 @@ prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::next return v_nextPacketType(); } -//////////////////////////////////////// +prefix_ void senf::PacketInterpreterBase::clearAnnotations() +{ + return impl().clearAnnotations(); +} + +//-///////////////////////////////////////////////////////////////////////////////////////////////// // protected members // protected structors @@ -116,7 +121,15 @@ prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * : PacketData(std::distance(impl->begin(),b), std::distance(impl->begin(),e)) { - impl->prependInterpreter(this); + impl->prependInterpreter(this); +} + +prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * impl, + iterator b, iterator e, ptr before) + : PacketData(std::distance(impl->begin(),b), + std::distance(impl->begin(),e)) +{ + impl->prependInterpreter(this, before.get()); } prefix_ senf::PacketInterpreterBase::ptr @@ -132,50 +145,50 @@ senf::PacketInterpreterBase::appendClone(detail::PacketImpl * impl, range r) return v_appendClone(impl,r); } -//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // private members -// reference/memory management - -prefix_ void senf::PacketInterpreterBase::add_ref() -{ - intrusive_refcount_t::add_ref(); - if (impl_) - impl_->add_ref(); -} - -prefix_ bool senf::PacketInterpreterBase::release() -{ - if (impl_) - // This call will set impl_ to 0 if we just removed the last reference ... - impl_->release(); - return intrusive_refcount_t::release() && !impl_; -} - // containment management. Only to be called by PacketImpl. prefix_ void senf::PacketInterpreterBase::assignImpl(detail::PacketImpl * impl) { - SENF_ASSERT(!impl_); + SENF_ASSERT(!impl_, "Internal failure: PacketInterpreter added to two Packets"); impl_ = impl; - impl_->add_ref(refcount()); + if (refcount()) + impl_->add_ref(); } prefix_ void senf::PacketInterpreterBase::releaseImpl() { - SENF_ASSERT(impl_); - refcount_t refc (refcount()); - if (refc) { - impl_->release(refc); + SENF_ASSERT(impl_, "Internal failure: release of lone PacketInterpreter"); + if (refcount()) { + detail::PacketImpl * i (impl_); impl_ = 0; + // This call might delete this ... + i->release(); } else { impl_ = 0; delete this; } } +prefix_ void senf::intrusive_ptr_add_ref(PacketInterpreterBase const * p) +{ + if (! p->refcount()) + const_cast(p)->add_ref(); + else + const_cast(p)->intrusive_refcount_base::add_ref(); +} + +prefix_ void senf::intrusive_ptr_release(PacketInterpreterBase const * p) +{ + if (p->refcount() <= 1) + const_cast(p)->release(); + else + const_cast(p)->intrusive_refcount_base::release(); +} -///////////////////////////////cci.e/////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_