Program Listing for File BufferLogger.h

Program Listing for File BufferLogger.h#

Return to documentation for file (src/logging/BufferLogger.h)

#pragma once

/* toolchain */
#include <array>
#include <cstdio>
#include <functional>
#include <string>

/* internal */
#include "LogInterface.h"

namespace Coral
{

static constexpr std::size_t default_buffer_depth = BUFSIZ;

template <std::size_t depth = default_buffer_depth, typename element_t = char>
class BufferLogger : public LogInterface<BufferLogger<depth>>
{
  public:
    using String = std::basic_string<element_t>;
    using Handler = std::function<void(const String &)>;

    BufferLogger(Handler &_handler) : handler(_handler)
    {
    }

    void vlog_impl(const char *fmt, va_list args)
    {
        auto head = data.data();
        vsnprintf(head, depth, fmt, args);
        handler(String(head));
    }

  protected:
    Handler handler;
    std::array<element_t, depth> data;
};

}; // namespace Coral