blob: 2dc624f493841cece284468d20a81e39264361e2 [file] [log] [blame]
#ifndef MESSAGELOG_H
#define MESSAGELOG_H
#include <cstdint>
#include <new>
#include <memory>
#include <stdexcept>
// https://github.com/raltnoeder/cppdsaext
#include <dsaext.h>
extern "C"
{
#include <sys/time.h>
#include <time.h>
}
class MessageLog
{
public:
static const char* MESSAGES_HEADER;
static const char* F_ALERT_MARK;
static const char* F_WARN_MARK;
static const char* F_INFO_MARK;
static const char* F_ALERT;
static const char* F_WARN;
static const char* F_INFO;
static const char* F_RESET;
static const size_t DATE_BUFFER_SIZE;
static const char* DATE_FORMAT;
static const size_t DATE_LENGTH;
static const std::string CAPACITY_ERROR;
enum class log_level : uint32_t
{
INFO,
WARN,
ALERT
};
typedef struct entry_s
{
log_level level;
std::string* message;
}
entry;
class EntriesIterator : dsaext::QIterator<entry>
{
public:
EntriesIterator(const MessageLog& log_ref);
EntriesIterator(const EntriesIterator& orig) = delete;
EntriesIterator& operator=(const EntriesIterator& orig) = delete;
EntriesIterator(EntriesIterator&& orig) = default;
EntriesIterator& operator=(EntriesIterator&& orig) = default;
virtual ~EntriesIterator() noexcept override;
virtual entry* next() override;
virtual size_t get_size() const override;
virtual bool has_next() const override;
private:
const MessageLog& log_obj;
size_t iter_index {0};
bool circular_mode {false};
};
// @throws std::bad_alloc, std::out_of_range
explicit MessageLog(size_t entries);
MessageLog(const MessageLog& orig) = delete;
MessageLog& operator=(const MessageLog& orig) = delete;
MessageLog(MessageLog&& orig) = default;
MessageLog& operator=(MessageLog&& orig) = delete;
virtual ~MessageLog() noexcept;
// @throws std::bad_alloc
virtual bool has_entries() const;
virtual void add_entry(log_level level, std::string& message);
virtual void add_entry(log_level level, const char* message);
virtual void clear();
virtual void display_messages(std::FILE* out) const;
private:
size_t index {0};
bool filled {false};
size_t capacity {0};
struct timeval utc_time;
struct tm time_fields;
std::unique_ptr<entry*[]> log_entries;
std::unique_ptr<char[]> date_buffer;
void clear_impl() noexcept;
bool format_date() noexcept;
};
#endif /* MESSAGELOG_H */