/** \file
\brief PacketImpl inline template implementation */
-//#include "PacketImpl.ih"
+#include "PacketImpl.ih"
// Custom includes
#define prefix_ inline
-///////////////////////////////cti.p///////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-// senf::detail::AnnotationIndexer<Annotation>
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
+// senf::detail::AnnotationRegistry
template <class Annotation>
-prefix_ senf::detail::AnnotationIndexer<Annotation>::AnnotationIndexer()
- : index_ (maxAnnotations++)
+prefix_ senf::detail::AnnotationRegistry::key_type
+senf::detail::AnnotationRegistry::registerAnnotation()
{
- small().push_back(Small);
- registry().push_back(this);
-}
-
-///////////////////////////////////////////////////////////////////////////
-// senf::detail::AnnotationIndexer<Annotation>
-
-
-template <class Annotation>
-prefix_ void senf::detail::AnnotationIndexer<Annotation>::v_dump(PacketImpl * p,
- std::ostream & os)
-{
-
- os << " " << senf::prettyName(typeid(Annotation)) << ": ";
- p->dumpAnnotation<Annotation>(os);
- os << "\n";
-}
-
-template <class Annotation>
-prefix_ unsigned senf::detail::AnnotationIndexer<Annotation>::index()
-{
- return AnnotationIndexer::instance().index_;
-}
-
-///////////////////////////////////////////////////////////////////////////
-// senf::detail::GetAnnotation<Annotation,Small>
-
-template <class Annotation, bool Small>
-prefix_ Annotation & senf::detail::GetAnnotation<Annotation,Small>::get(AnnotationEntry & e)
-{
- if (!e.p)
- e.p = new TAnnotationP<Annotation>();
- return static_cast< TAnnotationP<Annotation>* >(e.p)->annotation;
-}
-
-template <class Annotation, bool Small>
-prefix_ void senf::detail::GetAnnotation<Annotation,Small>::dump(AnnotationEntry & e,
- std::ostream & os)
-{
- if (!e.p) os << "no value";
- else os << get(e);
-}
-
-template <class Annotation>
-prefix_ Annotation & senf::detail::GetAnnotation<Annotation, true>::get(AnnotationEntry & e)
-{
- return * static_cast<Annotation*>(static_cast<void*>(& e.i));
+ key_type key (simpleAnnotationCount_ >= SENF_PACKET_ANNOTATION_SLOTS
+ || IsComplexAnnotation<Annotation>::value
+ ? - ++complexAnnotationCount_
+ : simpleAnnotationCount_ ++);
+ std::pair<Registry::iterator, bool> reg (
+ registry_.insert(key, new Registration<Annotation>()));
+ SENF_ASSERT(reg.second, "internal error: duplicate annotation key");
+ index_.insert(std::make_pair(reg.first->second->v_name(), key));
+ return key;
}
template <class Annotation>
-prefix_ void senf::detail::GetAnnotation<Annotation, true>::dump(AnnotationEntry & e,
- std::ostream & os)
+prefix_ senf::detail::AnnotationRegistry::key_type senf::detail::AnnotationRegistry::lookup()
{
- os << get(e);
+ SENF_ASSERT(
+ -instance().complexAnnotationCount_ <= AnnotationRegistry::Entry<Annotation>::key()
+ && AnnotationRegistry::Entry<Annotation>::key() < instance().simpleAnnotationCount_,
+ "internal error: annotation key not registered" );
+ SENF_ASSERT(
+ AnnotationRegistry::Entry<Annotation>::key() < 0
+ || ! IsComplexAnnotation<Annotation>::value,
+ "internal error: complex annotation registered with invalid key" );
+ SENF_ASSERT(
+ AnnotationRegistry::Entry<Annotation>::key() < SENF_PACKET_ANNOTATION_SLOTS,
+ "internal error: annotation key out of valid range" );
+ return AnnotationRegistry::Entry<Annotation>::key();
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::detail::PacketImpl
// Data container
template <class InputIterator>
prefix_ senf::detail::PacketImpl::PacketImpl(InputIterator first, InputIterator last)
- : refcount_(0), data_(first,last), annotations_(AnnotationIndexerBase::maxAnnotations)
-{}
+ : refcount_(0), data_(first,last)
+{
+ ::memset(simpleAnnotations_, 0, sizeof(simpleAnnotations_));
+}
// Annotations
template <class Annotation>
prefix_ Annotation & senf::detail::PacketImpl::annotation()
{
- return GetAnnotation<Annotation>::get(
- annotations_[AnnotationIndexer<Annotation>::index()]);
-}
-
-template <class Annotation>
-prefix_ void senf::detail::PacketImpl::dumpAnnotation(std::ostream & os)
-{
- GetAnnotation<Annotation>::dump(
- annotations_[AnnotationIndexer<Annotation>::index()], os);
+ AnnotationRegistry::key_type key (AnnotationRegistry::lookup<Annotation>());
+ void * antn (key >= 0 ? & simpleAnnotations_[key] : complexAnnotation<Annotation>());
+ SENF_ASSERT( antn, "internal error: null annotation pointer" );
+ return * static_cast<Annotation*>(antn);
}
-///////////////////////////////cti.e///////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
#undef prefix_
\f