xenia-canary/src/xenia/kernel/objects/xenumerator.h

86 lines
2.2 KiB
C
Raw Normal View History

2014-08-03 04:37:11 +00:00
/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2014 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
2015-08-07 14:56:57 +00:00
#ifndef XENIA_KERNEL_OBJECTS_XENUMERATOR_H_
#define XENIA_KERNEL_OBJECTS_XENUMERATOR_H_
2014-08-03 04:37:11 +00:00
2015-06-17 05:08:05 +00:00
#include <cstring>
2015-05-25 03:11:19 +00:00
#include <vector>
2015-02-01 06:49:47 +00:00
#include "xenia/kernel/xobject.h"
#include "xenia/xbox.h"
2014-08-03 04:37:11 +00:00
namespace xe {
namespace kernel {
class XEnumerator : public XObject {
2014-08-17 20:13:03 +00:00
public:
2015-02-13 00:15:45 +00:00
XEnumerator(KernelState* kernel_state, size_t item_capacity,
size_t item_size);
2014-08-03 04:37:11 +00:00
virtual ~XEnumerator();
void Initialize();
2015-02-13 00:15:45 +00:00
virtual uint32_t item_count() const = 0;
virtual void WriteItems(uint8_t* buffer) = 0;
2015-07-27 23:18:05 +00:00
virtual bool WriteItem(uint8_t* buffer) = 0;
size_t current_item() const { return current_item_; }
2015-02-13 00:15:45 +00:00
protected:
2015-07-27 23:18:05 +00:00
size_t item_capacity_ = 0;
size_t item_size_ = 0;
size_t current_item_ = 0;
2015-02-13 00:15:45 +00:00
};
class XStaticEnumerator : public XEnumerator {
public:
XStaticEnumerator(KernelState* kernel_state, size_t item_capacity,
size_t item_size)
: XEnumerator(kernel_state, item_capacity, item_size), item_count_(0) {
buffer_.resize(item_capacity_ * item_size_);
}
uint32_t item_count() const override { return item_count_; }
uint8_t* AppendItem() {
if (item_count_ + 1 > item_capacity_) {
return nullptr;
}
auto ptr = const_cast<uint8_t*>(buffer_.data() + item_count_ * item_size_);
++item_count_;
return ptr;
}
void WriteItems(uint8_t* buffer) override {
std::memcpy(buffer, buffer_.data(), item_count_ * item_size_);
}
2015-07-27 23:18:05 +00:00
bool WriteItem(uint8_t* buffer) {
if (current_item_ >= item_count_) {
return false;
}
std::memcpy(buffer, buffer_.data() + current_item_ * item_size_,
item_size_);
current_item_++;
return true;
}
2014-08-17 20:13:03 +00:00
private:
2015-02-13 00:15:45 +00:00
uint32_t item_count_;
std::vector<uint8_t> buffer_;
2014-08-03 04:37:11 +00:00
};
} // namespace kernel
} // namespace xe
2015-08-07 14:56:57 +00:00
#endif // XENIA_KERNEL_OBJECTS_XENUMERATOR_H_