1
0
kolibrios/programs/develop/libraries/menuetlibc/include/vector
right-hearted 6496d04506 Adding menuetlibc back to its place in /programs/develop/libraries
This version of menuetlibc was taken from revision 4743, right before I made any changes

git-svn-id: svn://kolibrios.org@4973 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-06-12 10:43:21 +00:00

136 lines
3.5 KiB
Plaintext

#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