Remove ProgramNoScan builder
[senf.git] / Packets / PacketImpl.cti
index a00a8e3..e3ec1ea 100644 (file)
 ///////////////////////////////cti.p///////////////////////////////////////
 
 ///////////////////////////////////////////////////////////////////////////
+// senf::detail::AnnotationIndexer<Annotation>
+
+template <class Annotation>
+prefix_ senf::detail::AnnotationIndexer<Annotation>::AnnotationIndexer()
+    : index_ (maxAnnotations++)
+{
+    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));
+}
+
+template <class Annotation>
+prefix_ void senf::detail::GetAnnotation<Annotation, true>::dump(AnnotationEntry & e,
+                                                                 std::ostream & os)
+{
+    os << get(e);
+}
+
+///////////////////////////////////////////////////////////////////////////
 // senf::detail::PacketImpl
 
 // Data container
@@ -46,9 +109,25 @@ prefix_ void senf::detail::PacketImpl::insert(PacketData * self, iterator pos, F
 
 template <class InputIterator>
 prefix_ senf::detail::PacketImpl::PacketImpl(InputIterator first, InputIterator last)
-    : refcount_(0), data_(first,last)
+    : refcount_(0), data_(first,last), annotations_(AnnotationIndexerBase::maxAnnotations)
 {}
 
+// 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);
+}
+
 ///////////////////////////////cti.e///////////////////////////////////////
 #undef prefix_