1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#ifndef CVECTOR_HPP
#define CVECTOR_HPP
#include <memory>
template <class T> class Cvector
{
public :
typedef T* iterator;
typedef const T* const_iterator;
typedef T& reference;
typedef const T& const_reference;
typedef size_t size_type;
typedef T value_type;
typedef std::ptrdiff_t difference_type;
Cvector() { create(); }
explicit Cvector(size_type size, const T& value = T()) { create(size, value); }
Cvector(const Cvector& v) { create(v.begin(), v.end()); }
~Cvector() { uncreate(); }
reference operator[](size_type i) { return data[i]; }
const_reference operator[](size_type i) const { return data[i]; }
Cvector& operator=(const Cvector&);
iterator begin() { return data; }
const_iterator begin() const { return data; }
iterator end() { return limit; }
const_iterator end() const { return limit; }
size_type size() const { return limit - data; }
bool isEmpty() { return data == limit; }
void clear() { uncreate(); }
private :
iterator data;
iterator avail;
iterator limit;
std::allocator<T> alloc;
void create();
void create(size_type, const T&);
void create(const_iterator, const_iterator);
void uncreate();
};
template <class T> void Cvector<T>::create()
{
data = limit = 0;
}
template <class T>
void Cvector<T>::create(size_type size, const T& value)
{
data = alloc.allocate(size);
limit = avail = data + size;
std::uninitialized_fill(data, limit, value);
}
template <class T>
void Cvector<T>::create(const_iterator begin, const_iterator end)
{
data = alloc.allocate(end - begin);
limit = avail = std::uninitialized_copy(begin, end, data);
}
template <class T> void Cvector<T>::uncreate()
{
if(data)
{
iterator iter = avail;
while(iter != data)
alloc.destroy(--iter);
alloc.deallocate(data, limit-data);
}
limit = avail = data = 0;
}
template <class T>
Cvector<T>& Cvector<T>::operator=(const Cvector<T> &v)
{
Cvector<T> tempVector(v);
std::swap(tempVector.data, this->data);
return *this;
}
#endif |
Partager