1 #ifndef DIY_COLLECTION_HPP
2 #define DIY_COLLECTION_HPP
6 #include "serialization.hpp"
16 typedef void* Element;
17 typedef std::vector<Element> Elements;
20 typedef void* (*Create)();
21 typedef void (*Destroy)(
void*);
22 typedef detail::Save Save;
23 typedef detail::Load Load;
38 size_t size()
const {
return elements_.size(); }
39 const CInt& in_memory()
const {
return in_memory_; }
42 int add(Element e) { elements_.push_back(e); external_.push_back(-1); ++(*in_memory_.access());
return static_cast<int>(elements_.size()) - 1; }
43 void* release(
int i) {
void* e =
get(i); elements_[
static_cast<size_t>(i)] = 0;
return e; }
45 void* find(
int i)
const {
return elements_[
static_cast<size_t>(i)]; }
46 void*
get(
int i) {
if (!find(i)) load(i);
return find(i); }
48 int available()
const {
int i = 0;
for (; i < (int)size(); ++i)
if (find(i) != 0)
break;
return i; }
50 inline void load(
int i);
51 inline void unload(
int i);
53 Create creator()
const {
return create_; }
54 Destroy destroyer()
const {
return destroy_; }
55 Load loader()
const {
return load_; }
56 Save saver()
const {
return save_; }
58 void* create()
const {
return create_(); }
59 void destroy(
int i) {
if (find(i)) { destroy_(find(i)); elements_[
static_cast<size_t>(i)] = 0; }
else if (external_[static_cast<size_t>(i)] != -1) storage_->destroy(external_[static_cast<size_t>(i)]); }
61 bool own()
const {
return destroy_ != 0; }
73 std::vector<int> external_;
83 for (
size_t i = 0; i < size(); ++i)
84 destroy(static_cast<int>(i));
87 *in_memory_.access() = 0;
98 external_[
static_cast<size_t>(i)] = storage_->put(e, save_);
101 elements_[
static_cast<size_t>(i)] = 0;
103 --(*in_memory_.access());
114 storage_->get(external_[static_cast<size_t>(i)], e, load_);
115 elements_[
static_cast<size_t>(i)] = e;
116 external_[
static_cast<size_t>(i)] = -1;
118 ++(*in_memory_.access());
Definition: storage.hpp:38
Definition: collection.hpp:13