// Simple class to format the ctor arguments into a fixed-sized buffer. class FormatBufferBase { protected:
char* _buf;
inline FormatBufferBase(char* buf) : _buf(buf) {} public: staticconst int BufferSize = 256; operatorconst char *() const { return _buf; }
};
// Use resource area for buffer class FormatBufferResource : public FormatBufferBase { public:
FormatBufferResource(const char * format, ...) ATTRIBUTE_PRINTF(2, 3);
};
class FormatBufferDummy {};
// Use stack for buffer template <size_t bufsz = FormatBufferBase::BufferSize> class FormatBuffer : public FormatBufferBase { public:
inline FormatBuffer(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); // since va_list is unspecified type (can be char*), we use FormatBufferDummy to disambiguate these constructors
inline FormatBuffer(FormatBufferDummy dummy, const char* format, va_list ap) ATTRIBUTE_PRINTF(3, 0);
inline void append(const char* format, ...) ATTRIBUTE_PRINTF(2, 3);
inline void print(const char* format, ...) ATTRIBUTE_PRINTF(2, 3);
inline void printv(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0);
template <size_t bufsz> void FormatBuffer<bufsz>::print(const char * format, ...) {
va_list argp;
va_start(argp, format);
jio_vsnprintf(_buf, bufsz, format, argp);
va_end(argp);
}
template <size_t bufsz> void FormatBuffer<bufsz>::printv(const char * format, va_list argp) {
jio_vsnprintf(_buf, bufsz, format, argp);
}
template <size_t bufsz> void FormatBuffer<bufsz>::append(const char* format, ...) { // Given that the constructor does a vsnprintf we can assume that // _buf is already initialized.
size_t len = strlen(_buf);
char* buf_end = _buf + len;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.