#pragma once
// Nachbau von std::vector ohne Allocator, minimalistisch
// hier fest verdrahtet auf C-Funktion realloc()
namespace std{
template<class T> class vector{
public:
typedef size_t size_type;
typedef T* iterator;
typedef T& reference;
vector(size_t reserve=0):data(0),fill(0) {resize(reserve);}
~vector() {realloc(0);}
iterator begin() const {return data;}
iterator end() const {return data+fill;}
reference front() {return *data;}
reference back() {return data[fill-1];}
reference operator[](size_type i) {return data[i];}
reference at(size_type i);
size_type size() const {return fill;}
bool empty() const {return !size();}
void push_back(const T&val) {realloc(fill+1); back()=val;}
vector&operator=(const vector&x) {return copy(x);}
iterator insert(iterator pos,const T&val) {
int i=pos-data;
insert(i,1,val);
return data+i;
}
void insert(iterator pos,size_type n, const T&val) {
int i=pos-data;
insert(i,n,val);
}
void erase(iterator first,iterator last) {
memmove(first,last,(end()-last)*sizeof(T));
realloc(fill-(last-first));
}
void erase(iterator p) {
erase(p,p+1);
}
void resize(size_type c) {realloc(c);}
void resize(size_type c,const T&val) {size_t o=size(); resize(c); for (;o<c;o++) operator[](o)=val;}
size_type capacity() const;
private:
T*data; // Erst der Zeiger
size_type fill; // Dann der Füllstand
void realloc(size_type n) {
data=(T*)::realloc(data,(fill=n)*sizeof(T));
if (n && !data) ::RaiseException(0,0,0,0);
}
void insert(int i,size_type n,const T&val) {
realloc(fill+n);
iterator p=data+i;
memmove(p+n,p,(end()-(p+n))*sizeof(T));
if (n) do *p++=val; while(--n);
}
vector©(const vector&x) {realloc(x.size()); memcpy(begin(),x.begin(),size()*sizeof(T)); return *this;}
};
}
Detected encoding: UTF-8 | 0
|