code/include/swoc/ArenaWriter.h (21 lines of code) (raw):
// SPDX-License-Identifier: Apache-2.0
// Copyright Verizon Media 2020
/** @file
* @c BufferWriter for a @c MemArena.
*/
#pragma once
#include "swoc/swoc_version.h"
#include "swoc/MemSpan.h"
#include "swoc/bwf_base.h"
#include "swoc/MemArena.h"
namespace swoc { inline namespace SWOC_VERSION_NS {
/** Buffer writer for a @c MemArena.
*
* This provides formatted output to the remnant of a @c MemArena. The output resides in uncommitted
* arena memory and must be committed externally. This will resize the remnant as needed to contain
* the output without overflow. Because it uses the remnant, if there is an error or resizing,
* no arena memory will be lost.
*/
class ArenaWriter : public FixedBufferWriter {
using self_type = ArenaWriter; ///< Self reference type.
using super_type = FixedBufferWriter; ///< Parent type.
public:
/** Constructor.
*
* @param arena Arena to use for storage.
*/
ArenaWriter(MemArena &arena);
/** Write data to the buffer.
*
* @param data Data to write.
* @param n Amount of data in bytes.
* @return @a this
*/
ArenaWriter &write(void const *data, size_t n) override;
/// Write a single character @a c to the buffer.
ArenaWriter &write(char c) override;
using super_type::write; // import super class write.
/** Mark bytes as in use.
*
* @param n Number of bytes to include in the used buffer.
* @return @c true if successful, @c false if additional buffer space was required.
*/
bool commit(size_t n) override;
protected:
MemArena &_arena; ///< Arena for the buffer.
/** Reallocate the buffer to increase the capacity.
*
* @param n Total size required.
*/
void realloc(size_t n);
};
inline swoc::ArenaWriter::ArenaWriter(swoc::MemArena &arena) : super_type(arena.remnant()), _arena(arena) {}
}} // namespace swoc::SWOC_VERSION_NS