// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/forensics/feedback_data/system_log_recorder/encoding/ring_buffer.h"

#include <lib/syslog/cpp/macros.h>

#include <cstring>
#include <vector>

#include "src/developer/forensics/feedback_data/system_log_recorder/encoding/lz4_utils.h"

namespace forensics {
namespace feedback_data {
namespace system_log_recorder {

RingBuffer::RingBuffer(const size_t buffer_size)
    : ring_buffer_(buffer_size), write_size_(kMaxChunkSize) {
  ring_ptr_ = ring_buffer_.data();
  ring_start_ = ring_buffer_.data();
  ring_end_ = ring_start_ + ring_buffer_.size();
}

void RingBuffer::Advance(const size_t pos) {
  ring_ptr_ += pos;
  // Wrap the data index around if there is a possibility that the data index falls outside the ring
  // buffer.
  if (ring_ptr_ + write_size_ >= ring_end_) {
    ring_ptr_ = ring_start_;
  }
}

char* RingBuffer::Write(const char* chunk, const size_t chunk_size) {
  FX_CHECK(chunk_size <= write_size_);
  char* ptr = ring_ptr_;
  std::memcpy(ring_ptr_, chunk, chunk_size);
  Advance(chunk_size);
  return ptr;
}

}  // namespace system_log_recorder
}  // namespace feedback_data
}  // namespace forensics
