struct AnnotationIndexerBase
{
+ virtual ~AnnotationIndexerBase();
+ virtual void v_dump(PacketImpl * p, std::ostream & os) = 0;
+
static unsigned maxAnnotations;
static std::vector<bool> & small();
+ static std::vector<AnnotationIndexerBase*> & registry();
+ static void dump(PacketImpl * p, std::ostream & os);
};
template <class Annotation>
public AnnotationIndexerBase
{
AnnotationIndexer();
+ virtual void v_dump(PacketImpl * p, std::ostream & os);
unsigned index_;
static unsigned index();
static bool const Complex = boost::is_base_of<ComplexAnnotation, Annotation>::value;
static bool const Small = (sizeof(Annotation) <= sizeof(AnnotationEntry) && ! Complex);
+# if 0 // The test is difficult since it does not work with user-defined trivial constructors
# ifdef BOOST_HAS_TYPE_TRAITS_INTRINSICS
BOOST_STATIC_ASSERT(( (boost::has_trivial_constructor<Annotation>::value
|| Complex ));
# endif
+# endif
};
template <class Annotation, bool Small = AnnotationIndexer<Annotation>::Small>
struct GetAnnotation
{
static Annotation & get(AnnotationEntry & e);
+ static void dump(AnnotationEntry & e, std::ostream & os);
};
template <class Annotation>
struct GetAnnotation<Annotation, true>
{
static Annotation & get(AnnotationEntry & e);
+ static void dump(AnnotationEntry & e, std::ostream & os);
};
/** \brief Internal: Packet data storage
void erase(PacketData * self, iterator first, iterator last);
void clear(PacketData * self);
+ void reserve(size_type n);
+ size_type capacity() const;
+
// Annotations
template <class Annotation>
Annotation & annotation();
+ void dumpAnnotations(std::ostream & os);
+ template <class Annotation>
+ void dumpAnnotation(std::ostream & os);
/** \brief Internal: Keep PacketImpl instance alive