#ifndef VECTOR_H #define VECTOR_H template struct PGF_INTERNAL Vector { size_t len; A data[]; public: static void release(ref vec) { PgfDB::free(vec, vec->len*sizeof(A)); } }; template inline PGF_INTERNAL ref> vector_new(size_t len) { ref> res = PgfDB::malloc>(len*sizeof(A)); res->len = len; return res; } template inline PGF_INTERNAL ref vector_new(Vector C::* field, size_t len) { ref res = PgfDB::malloc(len*sizeof(A)).as_object(); (res->*field).len = len; return res; } template inline PGF_INTERNAL ref vector_elem(ref> v, size_t index) { return ref::from_ptr(&v->data[index]); } template inline PGF_INTERNAL A *vector_elem(Vector *v, size_t index) { return &v->data[index]; } template class PGF_INTERNAL_DECL vector { private: object offset; struct V { size_t size; A data[]; }; V* v() const { return (V*) (current_base+offset); } vector(object o) { this->offset = o; } 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 v()->size; }; A &operator[] (size_t i) { return v()->data[i]; }; iterator begin() { return iterator(ref::from_ptr(&v()->data[0])); } iterator end() { return iterator(ref::from_ptr(&v()->data[v()->size])); } static vector alloc(size_t size) { auto res = PgfDB::malloc::V>(size*sizeof(A)); res->size = size; return vector(res.as_object()); } }; #endif // VECTOR_H