+// A variant of Writer which returns offsets from the start of the buffer from the operator() functions.
+class OffsetWriter : Writer {
+public:
+ OffsetWriter() { }
+ OffsetWriter(void *base) : Writer(base), basePos(base) { }
+ void operator = (void *base) { basePos = base; Writer::operator = (base); }
+
+ template <class T>
+ T *operator () (const T &obj)
+ { return Writer::operator() (obj) - basePos; }
+
+ void *operator () (const void *addr, size_t size)
+ { return reinterpret_cast<void *>(uintptr_t(Writer::operator() (addr, size)) - uintptr_t(basePos)); }
+
+ char *operator () (const char *s)
+ { return (char *)(*this)(s, strlen(s) + 1); }
+
+private:
+ void *basePos; // base address
+};
+
+