#ifndef VECTOR_H #define VECTOR_H template class vector; template class PGF_INTERNAL_DECL inline_vector { private: size_t len; A data[]; public: class iterator { public: object offset; iterator(ref r) { this->offset = r.as_object(); } bool operator!=(iterator other) { return offset != other.offset; } void operator++() { offset += sizeof(A); } A &operator*() { return *((A*) (current_base+offset)); } }; size_t size() { return len; }; A &operator[] (size_t i) { return data[i]; }; ref elem(size_t i) { return ref::from_ptr(&data[i]); }; iterator begin() { return iterator(ref::from_ptr(&data[0])); } iterator end() { return iterator(ref::from_ptr(&data[len])); } template static ref alloc(inline_vector C::* field, size_t size) { ref res = PgfDB::malloc(size*sizeof(A)).as_object(); (res->*field).len = size; return res; } template static void release(inline_vector C::* field, ref o) { PgfDB::free(o,(o->*field).len*sizeof(A)); } vector as_vector() { return vector(((unsigned char*) this)-current_base); } friend class vector; }; template class PGF_INTERNAL_DECL vector { private: object offset; inline_vector* v() const { return (inline_vector*) (current_base+offset); } public: vector() { } vector(object o) { this->offset = o; } class iterator { public: object offset; iterator(ref r) { this->offset = r.as_object(); } bool operator!=(iterator other) { return offset != other.offset; } void operator++() { offset += sizeof(A); } A &operator*() { return *((A*) (current_base+offset)); } }; size_t size() { return v()->len; }; A &operator[] (size_t i) { return v()->data[i]; }; ref elem(size_t i) { return ref::from_ptr(&v()->data[i]); }; iterator begin() { return iterator(ref::from_ptr(&v()->data[0])); } iterator end() { return iterator(ref::from_ptr(&v()->data[v()->len])); } bool operator ==(vector& other) const { return offset==other.offset; } bool operator !=(vector& other) const { return offset!=other.offset; } bool operator ==(object other_offset) const { return offset==other_offset; } bool operator !=(object other_offset) const { return offset!=other_offset; } A *get_data() { return v()->data; } static vector alloc(size_t size) { auto res = PgfDB::malloc>(size*sizeof(A)); res->len = size; return vector(res.as_object()); } vector realloc(size_t new_size, txn_t txn_id) { ref> r = offset; auto res = PgfDB::realloc>(r,v()->len*sizeof(A),new_size*sizeof(A),txn_id); res->len = new_size; return res->as_vector(); } static void release(vector vec) { PgfDB::free(ref>(vec.offset), vec.v()->len*sizeof(A)); } }; #endif // VECTOR_H