• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
22 template <typename T> class growable_vector {
23 public:
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
size()83 	size_type size() const {
84 		return container.size();
85 	}
86 
87 
88 	/// fill container with given value
fill(size_type size,T const & 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
zero()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 
101 private:
102 	container_type container;
103 };
104 
105 #endif // GROWABLE_VECTOR_H
106