xenia-canary/src/xenia/base/ring_buffer.cc

74 lines
2.2 KiB
C++
Raw Normal View History

2015-06-02 15:11:59 +00:00
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2015 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "xenia/base/ring_buffer.h"
2015-06-19 14:50:54 +00:00
#include <algorithm>
2015-06-17 05:08:05 +00:00
#include <cstring>
2015-06-02 15:11:59 +00:00
namespace xe {
2015-06-19 14:50:54 +00:00
RingBuffer::RingBuffer(uint8_t* raw_buffer, size_t size, size_t read_offset, size_t write_offset)
: raw_buffer_(raw_buffer)
, size_(size)
, read_offset_(read_offset)
, write_offset_(write_offset) {}
2015-06-02 15:11:59 +00:00
2015-06-19 14:50:54 +00:00
size_t RingBuffer::Skip(size_t num_bytes) {
num_bytes = std::min(read_size(), num_bytes);
if (read_offset_ + num_bytes < size_) {
read_offset_ += num_bytes;
} else {
read_offset_ = num_bytes - (size_ - read_offset_);
}
return num_bytes;
}
2015-06-02 15:11:59 +00:00
2015-06-19 14:50:54 +00:00
size_t RingBuffer::Read(uint8_t* buffer, size_t num_bytes) {
num_bytes = std::min(read_size(), num_bytes);
if (!num_bytes) {
return 0;
}
2015-06-03 16:12:55 +00:00
2015-06-19 14:50:54 +00:00
if (read_offset_ + num_bytes < size_) {
std::memcpy(buffer, raw_buffer_ + read_offset_, num_bytes);
read_offset_ += num_bytes;
} else {
size_t left_half = size_ - read_offset_;
size_t right_half = size_ - left_half;
std::memcpy(buffer, raw_buffer_ + read_offset_, left_half);
std::memcpy(buffer + left_half, raw_buffer_, right_half);
read_offset_ = right_half;
2015-06-02 15:11:59 +00:00
}
2015-06-19 14:50:54 +00:00
return num_bytes;
2015-06-02 15:11:59 +00:00
}
2015-06-19 14:50:54 +00:00
size_t RingBuffer::Write(uint8_t* buffer, size_t num_bytes) {
num_bytes = std::min(num_bytes, write_size());
if (!num_bytes) {
return 0;
2015-06-03 16:12:55 +00:00
}
2015-06-19 14:50:54 +00:00
if (write_offset_ + num_bytes < size_) {
std::memcpy(raw_buffer_ + write_offset_, buffer, num_bytes);
write_offset_ += num_bytes;
2015-06-02 15:11:59 +00:00
} else {
2015-06-19 14:50:54 +00:00
size_t left_half = size_ - write_offset_;
size_t right_half = size_ - left_half;
std::memcpy(raw_buffer_ + write_offset_, buffer, left_half);
std::memcpy(raw_buffer_, buffer + left_half, right_half);
write_offset_ = right_half;
2015-06-02 15:11:59 +00:00
}
2015-06-19 14:50:54 +00:00
return num_bytes;
2015-06-02 15:11:59 +00:00
}
2015-06-17 05:08:05 +00:00
} // namespace xe