X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketImpl.cci;h=63c330c0a977d72248395f5f3f2c58be278c2891;hb=961cf85a6abf2b5f0a7958bbfcd8f72e7b32721b;hp=56e501b6a0359d57a12c9a8bd9f7c20165418437;hpb=aa4bfb511acb198a278caafc193ac67a9c322a13;p=senf.git diff --git a/senf/Packets/PacketImpl.cci b/senf/Packets/PacketImpl.cci index 56e501b..63c330c 100644 --- a/senf/Packets/PacketImpl.cci +++ b/senf/Packets/PacketImpl.cci @@ -31,30 +31,61 @@ ///////////////////////////////cci.p/////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -// senf::detail::AnnotationIndexerBase +// senf::detail::AnnotationRegistry -prefix_ senf::detail::AnnotationIndexerBase::~AnnotationIndexerBase() -{} +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_ std::vector & senf::detail::AnnotationIndexerBase::small() +prefix_ std::string senf::detail::AnnotationRegistry::name(key_type key) + const { - static std::vector smalls; - return smalls; + Registry::const_iterator i (registry_.find(key)); + return i == registry_.end() ? "" : i->second->v_name(); } -prefix_ std::vector & -senf::detail::AnnotationIndexerBase::registry() +prefix_ bool senf::detail::AnnotationRegistry::isComplex(key_type key) + const { - static std::vector reg; - return reg; + Registry::const_iterator i (registry_.find(key)); + return i != registry_.end() && i->second->v_isComplex(); } -/////////////////////////////////////////////////////////////////////////// -// senf::detail::AnnotationP +prefix_ unsigned senf::detail::AnnotationRegistry::size(key_type key) + const +{ + Registry::const_iterator i (registry_.find(key)); + return i == registry_.end() ? 0 : i->second->v_size(); +} + +prefix_ senf::detail::AnnotationRegistry::iterator senf::detail::AnnotationRegistry::begin() + const +{ + return boost::make_transform_iterator(index_.begin(), + __gnu_cxx::select2nd()); +} + +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 @@ -82,12 +113,16 @@ prefix_ senf::detail::AnnotationP::~AnnotationP() // 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_)); +} // reference/memory management @@ -196,11 +231,6 @@ 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? @@ -216,6 +246,12 @@ prefix_ void senf::detail::PacketImpl::release(refcount_t n) refcount_ -= n; } +// Annotations + +prefix_ void * senf::detail::PacketImpl::annotation(AnnotationRegistry::key_type key) +{ + return key >= 0 ? & simpleAnnotations_[key] : complexAnnotation(key); +} /////////////////////////////////////////////////////////////////////////// // senf::detail::PacketImpl::Guard