Source file: /~heha/ewa/Ofen/prozess.zip/msvc/o1/vector.h

#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&copy(const vector&x) {realloc(x.size()); memcpy(begin(),x.begin(),size()*sizeof(T)); return *this;}
};
}
Detected encoding: UTF-80