0,0 → 1,135 |
#ifndef _VECTOR_INCLUDED |
#define _VECTOR_INCLUDED |
#include <stdlib.h> |
#include <string.h> |
extern void *__cdecl operator new(size_t); |
inline void *__cdecl operator new(size_t, void *_P) |
{ return (_P); } |
namespace std |
{ |
template<class T> class vector |
{ |
unsigned length; |
unsigned allocated; |
T* data; |
public: |
typedef unsigned size_type; |
typedef T* iterator; |
vector():length(0),allocated(0),data(NULL) {} |
~vector() {for (unsigned i=length;i--;)data[i].~T();free(data);} |
unsigned size() const {return length;} |
void clear() {length=0;} |
T& operator[](unsigned pos) {return data[pos];} |
T* begin() {return data;} |
T* end() {return data+length;} |
void push_back(const T& x) |
{ |
if (length==allocated) |
{ |
allocated+=16; |
data=(T*)realloc(data,allocated*sizeof(T)); |
} |
new (data+length++) T(x); |
} |
bool empty() const {return length==0;} |
void pop_back() {data[--length].~T();} |
T& back() {return data[length-1];} |
iterator erase(iterator it) |
{ |
T* a=it; |
while (++a != data+length) |
{ |
a[-1] = *a; |
} |
length--; |
return it; |
} |
/*iterator*/T* insert(iterator where, const T& what = T()) |
{ |
int z=where-data; |
if (length==allocated) |
{ |
allocated+=16; |
data=(T*)realloc(data,allocated*sizeof(T)); |
} |
T* a=data+length; |
T* b=data+z; |
length++; |
while (a != b) |
{ |
*a = a[-1]; |
--a; |
} |
*a = what; |
return /*iterator*/a; |
} |
}; |
struct _generic_vector |
{ |
unsigned length; |
unsigned allocated; |
void** data; |
}; |
inline void _generic_pointer_push_back(_generic_vector* v, void* a) |
{ |
if (v->length==v->allocated) |
{ |
v->allocated+=16; |
v->data=(void**)realloc(v->data,v->allocated*sizeof(void*)); |
} |
v->data[v->length++]=a; |
} |
inline void _generic_pointer_erase(_generic_vector* v, void** a) |
{ |
while (++a != v->data+v->length) |
{ |
a[-1] = *a; |
} |
v->length--; |
} |
inline void** _generic_pointer_insert(_generic_vector* v, void** where, void* what) |
{ |
int z=where-v->data; |
if (v->length==v->allocated) |
{ |
v->allocated+=16; |
v->data=(void**)realloc(v->data,v->allocated*sizeof(void*)); |
} |
void** a=v->data+v->length; |
void** b=v->data+z; |
v->length++; |
while (a != b) |
{ |
*a = a[-1]; |
--a; |
} |
*a = what; |
return a; |
} |
template<class T> class vector<T*> |
{ |
unsigned length; |
unsigned allocated; |
T** data; |
public: |
typedef unsigned size_type; |
typedef T** iterator; |
vector():length(0),allocated(0),data(NULL) {} |
~vector() {free(data);} |
unsigned size() const {return length;} |
void clear() {length=0;} |
T*& operator[](unsigned pos) {return data[pos];} |
iterator begin() {return iterator(data);} |
iterator end() {return iterator(data+length);} |
void push_back(T* const& x) |
{ _generic_pointer_push_back((_generic_vector*)this, (void*)x); } |
bool empty() const {return length==0;} |
void pop_back() {--length;} |
T*& back() {return data[length-1];} |
iterator erase(iterator it) |
{ _generic_pointer_erase((_generic_vector*)this, (void**)it); return it; } |
iterator insert(iterator where, T* const& what) |
{ return (T**)_generic_pointer_insert((_generic_vector*)this, (void**)where, what); } |
}; |
} |
#endif |