/*
- * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
*
* Squid software is distributed under GPLv2+ license and includes
* contributions from numerous individuals and organizations.
* Thus, one can write just one function that will take a Packable object
* and either "pack" things for Comm::Write or "append" things to Store,
* depending on actual Packable object supplied.
+ *
+ * XXX: Misnamed. This is a Packer or Packager API (i.e., "something that packs
+ * or packages others"); this is not a "something that can be packed" API.
*/
class Packable
{
public:
+ virtual ~Packable() {}
+
/// Appends a c-string to existing packed data.
virtual void append(const char *buf, int size) = 0;
*
* \note arguments may be evaluated more than once, be careful
* of side-effects
+ *
+ * XXX: This method either should not exist or should not be virtual.
+ * Kids should not be forced to re-implement vappendf() logic.
+ * That logic should be implemented once, using other [Packable] APIs.
+ * Packable is not about providing a printf(3) service. Packable
+ * is about writing opaque data to various custom destinations.
*/
virtual void vappendf(const char *fmt, va_list ap) = 0;
+
+ /** start buffering appends (if relevant)
+ *
+ * Indicates that a number of small appends are about to
+ * follow so would be detrimental to trigger expensive
+ * activity on each.
+ */
+ virtual void buffer() {}
+
+ /** perform a buffer flush (if relevant)
+ *
+ * Used by code such as PackableStream, that assumes the
+ * Packable leads to some form of output buffer.
+ */
+ virtual void flush() {}
};
#endif /* SQUID_SRC_BASE_PACKABLE_H */