1/**
2 * @file growable_vector.h
3 * Auto-expanding vector type
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 * @author Philippe Elie
10 */
11
12#ifndef GROWABLE_VECTOR_H
13#define GROWABLE_VECTOR_H
14
15#include <vector>
16#include <algorithm>
17#include <functional>
18
19/**
20 * A simple growable vector template.
21 */
22template <typename T> class growable_vector {
23public:
24	typedef std::vector<T> container_type;
25	typedef typename container_type::size_type size_type;
26
27
28	/**
29	 * Index into the vector for a value. An out of
30	 * bounds index will return a default-constructed value.
31	 */
32	T operator[](size_type index) const {
33		if (index >= container.size())
34			return T();
35		return container[index];
36	}
37
38
39	/**
40	 * Index into the vector for a value. If the index is larger than
41	 * the current max index, the array is expanded, default-filling
42	 * any intermediary gaps.
43	 */
44	T & operator[](size_type index) {
45		if (index >= container.size())
46			container.resize(index + 1);
47		return container[index];
48	}
49
50
51	/**
52	 * vectorized += operator
53	 */
54	growable_vector<T> & operator+=(growable_vector<T> const & rhs) {
55		if (rhs.container.size() > container.size())
56			container.resize(rhs.container.size());
57
58		size_type min_size = min(container.size(), rhs.container.size());
59		for (size_type i = 0 ; i < min_size; ++i)
60			container[i] += rhs.container[i];
61
62		return *this;
63	}
64
65
66	/**
67	 * vectorized -= operator, overflow shouldn't occur during substraction
68	 * (iow: for each components lhs[i] >= rhs[i]
69	 */
70	growable_vector<T> & operator-=(growable_vector<T> const & rhs) {
71		if (rhs.container.size() > container.size())
72			container.resize(rhs.container.size());
73
74		size_type min_size = min(container.size(), rhs.container.size());
75		for (size_type i = 0 ; i < min_size; ++i)
76			container[i] -= rhs.container[i];
77
78		return *this;
79	}
80
81
82	/// return current size of vector
83	size_type size() const {
84		return container.size();
85	}
86
87
88	/// fill container with given value
89	void fill(size_type size, T const & value) {
90		container.resize(size, value);
91	}
92
93
94	/// return true if all elements have the default constructed value
95	bool zero() const {
96		return std::find_if(container.begin(), container.end(),
97	                            std::bind2nd(std::not_equal_to<T>(), T()))
98					== container.end();
99	}
100
101private:
102	container_type container;
103};
104
105#endif // GROWABLE_VECTOR_H
106