X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketImpl.cci;h=4c8bc04f31e5acab3d1cdadeed97c1d1aa6289f1;hb=3aced0177a1c69c7af338b4e66db8694a71873ae;hp=d7a2ec3a64d93132111e1563e3297c2d3864ff3a;hpb=9cb871b939efe93e35dd96808d25089399acfc46;p=senf.git diff --git a/senf/Packets/PacketImpl.cci b/senf/Packets/PacketImpl.cci index d7a2ec3..4c8bc04 100644 --- a/senf/Packets/PacketImpl.cci +++ b/senf/Packets/PacketImpl.cci @@ -24,47 +24,64 @@ \brief PacketImpl inline non-template implementation */ // Custom includes -#include -// #include "PacketInterpreter.hh" #define prefix_ inline -///////////////////////////////cci.p/////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// -// senf::detail::AnnotationIndexerBase +//-///////////////////////////////////////////////////////////////////////////////////////////////// +// senf::detail::AnnotationRegistry -prefix_ senf::detail::AnnotationIndexerBase::~AnnotationIndexerBase() -{} +prefix_ std::string senf::detail::AnnotationRegistry::name(key_type key) + const +{ + Registry::const_iterator i (registry_.find(key)); + return i == registry_.end() ? "" : i->second->v_name(); +} + +prefix_ bool senf::detail::AnnotationRegistry::isComplex(key_type key) + const +{ + Registry::const_iterator i (registry_.find(key)); + return i != registry_.end() && i->second->v_isComplex(); +} -prefix_ std::vector & senf::detail::AnnotationIndexerBase::small() +prefix_ unsigned senf::detail::AnnotationRegistry::size(key_type key) + const { - static std::vector smalls; - return smalls; + Registry::const_iterator i (registry_.find(key)); + return i == registry_.end() ? 0 : i->second->v_size(); } -prefix_ std::vector & -senf::detail::AnnotationIndexerBase::registry() +prefix_ senf::detail::AnnotationRegistry::iterator senf::detail::AnnotationRegistry::begin() + const { - static std::vector reg; - return reg; + return boost::make_transform_iterator(index_.begin(), + __gnu_cxx::select2nd()); } -/////////////////////////////////////////////////////////////////////////// -// senf::detail::AnnotationP +prefix_ senf::detail::AnnotationRegistry::iterator senf::detail::AnnotationRegistry::end() + const +{ + return boost::make_transform_iterator(index_.end(), + __gnu_cxx::select2nd()); +} -prefix_ senf::detail::AnnotationP::~AnnotationP() +prefix_ senf::detail::AnnotationRegistry::AnnotationRegistry() + : simpleAnnotationCount_ (0), complexAnnotationCount_ (0) {} +//-///////////////////////////////////////////////////////////////////////////////////////////////// + // 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 +// * The PacketInterpreters use safe hooks -> they know whether they are part of a list or not // * PacketHandle has an intrusive_ptr to PacketInterpreterBase. The intrusive_ptr_add_ref // will refcount both the PacketImpl as well as the PacketInterpreterBase // * intrusive_ptr_remove will only delete the object if it's not in a container // * removing an object from the list will decrement the PacketImpl refcount accordingly -// * inserting an object into the list will incroment the PacketImpl refcount accordingly +// * inserting an object into the list will increment the PacketImpl refcount accordingly // * each PacketInterpreterBase instance holds a *raw* pointer to the PacketImpl // // The following operations change refcounts: @@ -78,22 +95,26 @@ prefix_ senf::detail::AnnotationP::~AnnotationP() // The last three also modify the impl_ member accordingly by calling // PacketInterpreterBase::assign/release -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::detail::PacketImpl prefix_ senf::detail::PacketImpl::PacketImpl() - : refcount_(0), annotations_(AnnotationIndexerBase::maxAnnotations) -{} + : refcount_(0) +{ + ::memset(simpleAnnotations_, 0, sizeof(simpleAnnotations_)); +} prefix_ senf::detail::PacketImpl::PacketImpl(size_type size, byte initValue) - : refcount_(0), data_(size,initValue), annotations_(AnnotationIndexerBase::maxAnnotations) -{} + : refcount_(0), data_(size,initValue) +{ + ::memset(simpleAnnotations_, 0, sizeof(simpleAnnotations_)); +} -// rerference/memory management +// reference/memory management -prefix_ void senf::detail::PacketImpl::add_ref(refcount_t n) +prefix_ void senf::detail::PacketImpl::add_ref() { - refcount_ += n; + ++ refcount_; } prefix_ senf::detail::PacketImpl::refcount_t senf::detail::PacketImpl::refcount() @@ -196,28 +217,14 @@ prefix_ senf::detail::PacketImpl::size_type senf::detail::PacketImpl::capacity() 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? +// Annotations -prefix_ void senf::detail::PacketImpl::release(refcount_t n) +prefix_ void * senf::detail::PacketImpl::annotation(AnnotationRegistry::key_type key) { - 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; + return key >= 0 ? & simpleAnnotations_[key] : complexAnnotation(key); } - -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::detail::PacketImpl::Guard prefix_ senf::detail::PacketImpl::Guard::Guard(PacketImpl * impl) @@ -231,7 +238,7 @@ prefix_ senf::detail::PacketImpl::Guard::~Guard() p->release(); } -///////////////////////////////cci.e/////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_