JASPL  0.2
Just Another Signal Processing Library
jvector_templates.tpp
1 JVector<F> operator*= (F scalar) {
2 
3  for(unsigned int i=0; i<underlying_vector.size(); i++) {
4  underlying_vector[i]*=scalar;
5  }
6 
7  return *this;
8 }
9 
10 JVector<F> operator* (F scalar) {
11 
12  for(unsigned int i=0; i<underlying_vector.size(); i++) {
13  underlying_vector[i]*=scalar;
14  }
15 
16  return *this;
17 }
18 
19 JVector<F> operator+= (F scalar) {
20 
21  for(unsigned int i=0; i<underlying_vector.size(); i++) {
22  underlying_vector[i]+=scalar;
23  }
24  return *this;
25 }
26 
27 
28 friend bool operator== (JVector<F>& vector_a, JVector<F>& vector_b) {
29 
30  return ( vector_a.underlying_vector == vector_b.underlying_vector);
31 }
32 
33 
34 friend bool operator!= (JVector<F>& vector_a, JVector<F>& vector_b) {
35 
36  return ( vector_a.underlying_vector != vector_b.underlying_vector);
37 }
38 
39 
40 friend std::ostream& operator << (std::ostream& stream, JVector<F>& spectrum) {
41 
42  for(unsigned int i=0; i<spectrum.size(); i++) {
43  stream << spectrum.underlying_vector[i] << std::endl;
44  }
45 
46  return stream;
47 }
48 
49 
50 friend std::ofstream& operator << (std::ofstream& stream, JVector<F>& spectrum) {
51 
52  for(unsigned int i=0; i<spectrum.size(); i++) {
53  stream << spectrum.underlying_vector[i] << std::endl;
54  }
55 
56  return stream;
57 }
58 
59 
60 friend JVector<F> operator+ (JVector<F>& vector_a, JVector<F>& vector_b) {
61 
62  if( vector_a.size() != vector_b.size() ) {
63  std::string err_mesg = __FUNCTION__ ;
64  err_mesg += "\nJVectors are not the same size";
65  err_mesg += boost::lexical_cast<std::string> (vector_a.size());
66  err_mesg += " vs ";
67  err_mesg += boost::lexical_cast<std::string> (vector_b.size());
68  throw std::length_error(err_mesg);
69  }
70 
71  auto vector_c = vector_a;
72 
73  std::transform(vector_c.underlying_vector.begin(),\
74  vector_c.underlying_vector.end(),\
75  vector_b.underlying_vector.begin(),\
76  vector_c.underlying_vector.begin(),\
77  std::plus<F>());
78 
79  return vector_c;
80 }
81 
82 
83 friend JVector<F> operator+ (JVector<F>& vector_a, std::vector<F>& vector_b) {
84 
85  if( vector_a.size() != vector_b.size() ) {
86  std::string err_mesg = "JVector and vector are not the same size ";
87  err_mesg += boost::lexical_cast<std::string> (vector_a.size());
88  err_mesg += " vs ";
89  err_mesg += boost::lexical_cast<std::string> (vector_b.size());
90  throw std::length_error(err_mesg);
91  }
92 
93  auto vector_c = vector_a;
94 
95  vector_c.underlying_vector.resize(vector_b.size());
96 
97  std::transform(vector_c.underlying_vector.begin(),\
98  vector_c.underlying_vector.end(),\
99  vector_b.begin(),\
100  vector_c.underlying_vector.begin(),\
101  std::plus<F>());
102 
103  return vector_c;
104 }
105 
106 friend JVector<F> operator- (JVector<F>& vector_a, JVector<F>& vector_b) {
107 
108  if( vector_a.size() != vector_b.size() ) {
109  std::string err_mesg = __FUNCTION__ ;
110  err_mesg += "\nJVectors are not the same size";
111  err_mesg += boost::lexical_cast<std::string> (vector_a.size());
112  err_mesg += " vs ";
113  err_mesg += boost::lexical_cast<std::string> (vector_b.size());
114  throw std::length_error(err_mesg);
115  }
116 
117  auto vector_c = vector_a;
118 
119  std::transform(vector_c.underlying_vector.begin(),\
120  vector_c.underlying_vector.end(),\
121  vector_b.underlying_vector.begin(),\
122  vector_c.underlying_vector.begin(),\
123  std::minus<F>());
124 
125  return vector_c;
126 }
127 
128 friend JVector<F> operator- (JVector<F>& vector_a, std::vector<F>& vector_b) {
129 
130  if( vector_a.size() != vector_b.size() ) {
131  std::string err_mesg = "JVectors and vector are not the same size ";
132  err_mesg += boost::lexical_cast<std::string> (vector_a.size());
133  err_mesg += " vs ";
134  err_mesg += boost::lexical_cast<std::string> (vector_b.size());
135  throw std::length_error(err_mesg);
136  }
137 
138  auto vector_c = vector_a;
139 
140  std::transform(vector_c.underlying_vector.begin(),\
141  vector_c.underlying_vector.end(),\
142  vector_b.begin(),\
143  vector_c.underlying_vector.begin(),\
144  std::minus<F>());
145 
146  return vector_c;
147 }
148 
149 friend JVector<F> operator* (JVector<F>& vector_a, JVector<F>& vector_b) {
150 
151  if( vector_a.size() != vector_b.size() ) {
152  std::string err_mesg = __FUNCTION__ ;
153  err_mesg += "\nJVectors are not the same size";
154  err_mesg += boost::lexical_cast<std::string> (vector_a.size());
155  err_mesg += " vs ";
156  err_mesg += boost::lexical_cast<std::string> (vector_b.size());
157  throw std::length_error(err_mesg);
158  }
159 
160  auto vector_c = vector_a;
161 
162  for(unsigned int i=0; i<vector_a.size(); i++) {
163  vector_c.underlying_vector[i] =\
164  vector_a.underlying_vector[i] *\
165  vector_b.underlying_vector[i];
166  }
167 
168  return vector_c;
169 }
170 
171 friend JVector<F> operator* (JVector<F>& vector_a, std::vector<F>& vector_b) {
172 
173  if( vector_a.size() != vector_b.size() ) {
174  std::string err_mesg = "JVectors and vector are not the same size ";
175  err_mesg += boost::lexical_cast<std::string> (vector_a.size());
176  err_mesg += " vs ";
177  err_mesg += boost::lexical_cast<std::string> (vector_b.size());
178  throw std::length_error(err_mesg);
179  }
180 
181  auto vector_c = vector_a;
182 
183  for(unsigned int i=0; i<vector_a.size(); i++) {
184  vector_c.underlying_vector[i] =\
185  vector_a.underlying_vector[i] *\
186  vector_b[i];
187  }
188 
189  return vector_c;
190 }
191 
192 //Re-implementation of std::vector methods
193 
194 void push_back( F element ) {
195  underlying_vector.push_back( element );
196 }
197 
198 void push_front( F element ) {
199  underlying_vector.insert( underlying_vector.begin(), element);
200 }
201 
202 typename std::vector<F>::iterator begin() {
203  return underlying_vector.begin();
204 }
205 
206 typename std::vector<F>::iterator end() {
207  return underlying_vector.end();
208 }
209 
210 F* data() {
211  return underlying_vector.data();
212 }
213 
214 F& operator[] ( const uint index ) {
215  return underlying_vector[index];
216 }
217 
218 F& at( const uint index ) {
219  return underlying_vector.at( index );
220 }
221 
222 void reserve ( uint n ) {
223  underlying_vector.reserve( n );
224 }