File: vector.hh

package info (click to toggle)
xmahjongg 3.5-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 1,060 kB
  • ctags: 1,317
  • sloc: cpp: 5,619; ansic: 3,451; sh: 330; makefile: 162
file content (69 lines) | stat: -rw-r--r-- 1,555 bytes parent folder | download | duplicates (2)
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
#ifndef VECTOR_HH
#define VECTOR_HH
#include <assert.h>
#include <stdlib.h>
#ifdef HAVE_NEW_H
# include <new.h>
#else
static inline void *operator new(size_t, void *v) { return v; }
#endif

template <class T>
class Vector {
  
  T *_l;
  int _n;
  int _cap;
  
  void *velt(int i) const		{ return (void *)&_l[i]; }
  static void *velt(T *l, int i)	{ return (void *)&l[i]; }
  
 public:
  
  Vector()			: _l(0), _n(0), _cap(0) { }
  explicit Vector(int capacity)	: _l(0), _n(0), _cap(0) { reserve(capacity); }
  Vector(int n, const T &e)	: _l(0), _n(0), _cap(0) { resize(n, e); }
  Vector(const Vector<T> &);
  ~Vector();
  
  int size() const			{ return _n; }
  
  const T &at(int i) const		{ assert(i>=0 && i<_n); return _l[i]; }
  const T &operator[](int i) const	{ return at(i); }
  const T &back() const			{ return at(_n - 1); }
  const T &at_u(int i) const		{ return _l[i]; }
  
  T &at(int i)				{ assert(i>=0 && i<_n); return _l[i]; }
  T &operator[](int i)			{ return at(i); }
  T &back()				{ return at(_n - 1); }
  T &at_u(int i)			{ return _l[i]; }
  
  void push_back(const T &);
  void pop_back();
  
  void clear()				{ resize(0); }
  bool reserve(int = -1);
  void resize(int nn, const T &e = T());
  
  Vector<T> &operator=(const Vector<T> &);
  Vector<T> &assign(int n, const T &e = T());
  
};

template <class T> inline void
Vector<T>::push_back(const T &e)
{
  if (_n < _cap || reserve(-1)) {
    new(velt(_n)) T(e);
    _n++;
  }
}

template <class T> inline void
Vector<T>::pop_back()
{
  assert(_n >= 0);
  _l[--_n].~T();
}

#endif