blob: 350246a98761fb5394a79dbdae07087828ce9b30 [file] [log] [blame]
Mike Dodd8cfa7022010-11-17 11:12:26 -08001/**
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