Chris@49
|
1 // Copyright (C) 2010 NICTA (www.nicta.com.au)
|
Chris@49
|
2 // Copyright (C) 2010 Conrad Sanderson
|
Chris@49
|
3 //
|
Chris@49
|
4 // This Source Code Form is subject to the terms of the Mozilla Public
|
Chris@49
|
5 // License, v. 2.0. If a copy of the MPL was not distributed with this
|
Chris@49
|
6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
Chris@49
|
7
|
Chris@49
|
8
|
Chris@49
|
9 //! \addtogroup injector
|
Chris@49
|
10 //! @{
|
Chris@49
|
11
|
Chris@49
|
12
|
Chris@49
|
13
|
Chris@49
|
14 template<typename eT>
|
Chris@49
|
15 inline
|
Chris@49
|
16 mat_injector_row<eT>::mat_injector_row()
|
Chris@49
|
17 : n_cols(0)
|
Chris@49
|
18 {
|
Chris@49
|
19 arma_extra_debug_sigprint();
|
Chris@49
|
20
|
Chris@49
|
21 A.set_size( podarray_prealloc_n_elem::val );
|
Chris@49
|
22 }
|
Chris@49
|
23
|
Chris@49
|
24
|
Chris@49
|
25
|
Chris@49
|
26 template<typename eT>
|
Chris@49
|
27 inline
|
Chris@49
|
28 void
|
Chris@49
|
29 mat_injector_row<eT>::insert(const eT val) const
|
Chris@49
|
30 {
|
Chris@49
|
31 arma_extra_debug_sigprint();
|
Chris@49
|
32
|
Chris@49
|
33 if(n_cols < A.n_elem)
|
Chris@49
|
34 {
|
Chris@49
|
35 A[n_cols] = val;
|
Chris@49
|
36 ++n_cols;
|
Chris@49
|
37 }
|
Chris@49
|
38 else
|
Chris@49
|
39 {
|
Chris@49
|
40 B.set_size(2 * A.n_elem);
|
Chris@49
|
41
|
Chris@49
|
42 arrayops::copy(B.memptr(), A.memptr(), n_cols);
|
Chris@49
|
43
|
Chris@49
|
44 B[n_cols] = val;
|
Chris@49
|
45 ++n_cols;
|
Chris@49
|
46
|
Chris@49
|
47 std::swap( access::rw(A.mem), access::rw(B.mem) );
|
Chris@49
|
48 std::swap( access::rw(A.n_elem), access::rw(B.n_elem) );
|
Chris@49
|
49 }
|
Chris@49
|
50 }
|
Chris@49
|
51
|
Chris@49
|
52
|
Chris@49
|
53
|
Chris@49
|
54 //
|
Chris@49
|
55 //
|
Chris@49
|
56 //
|
Chris@49
|
57
|
Chris@49
|
58
|
Chris@49
|
59
|
Chris@49
|
60 template<typename T1>
|
Chris@49
|
61 inline
|
Chris@49
|
62 mat_injector<T1>::mat_injector(T1& in_X, const typename mat_injector<T1>::elem_type val)
|
Chris@49
|
63 : X(in_X)
|
Chris@49
|
64 , n_rows(1)
|
Chris@49
|
65 {
|
Chris@49
|
66 arma_extra_debug_sigprint();
|
Chris@49
|
67
|
Chris@49
|
68 typedef typename mat_injector<T1>::elem_type eT;
|
Chris@49
|
69
|
Chris@49
|
70 AA = new podarray< mat_injector_row<eT>* >;
|
Chris@49
|
71 BB = new podarray< mat_injector_row<eT>* >;
|
Chris@49
|
72
|
Chris@49
|
73 podarray< mat_injector_row<eT>* >& A = *AA;
|
Chris@49
|
74
|
Chris@49
|
75 A.set_size(n_rows);
|
Chris@49
|
76
|
Chris@49
|
77 for(uword row=0; row<n_rows; ++row)
|
Chris@49
|
78 {
|
Chris@49
|
79 A[row] = new mat_injector_row<eT>;
|
Chris@49
|
80 }
|
Chris@49
|
81
|
Chris@49
|
82 (*(A[0])).insert(val);
|
Chris@49
|
83 }
|
Chris@49
|
84
|
Chris@49
|
85
|
Chris@49
|
86
|
Chris@49
|
87 template<typename T1>
|
Chris@49
|
88 inline
|
Chris@49
|
89 mat_injector<T1>::mat_injector(T1& in_X, const injector_end_of_row<>& x)
|
Chris@49
|
90 : X(in_X)
|
Chris@49
|
91 , n_rows(1)
|
Chris@49
|
92 {
|
Chris@49
|
93 arma_extra_debug_sigprint();
|
Chris@49
|
94 arma_ignore(x);
|
Chris@49
|
95
|
Chris@49
|
96 typedef typename mat_injector<T1>::elem_type eT;
|
Chris@49
|
97
|
Chris@49
|
98 AA = new podarray< mat_injector_row<eT>* >;
|
Chris@49
|
99 BB = new podarray< mat_injector_row<eT>* >;
|
Chris@49
|
100
|
Chris@49
|
101 podarray< mat_injector_row<eT>* >& A = *AA;
|
Chris@49
|
102
|
Chris@49
|
103 A.set_size(n_rows);
|
Chris@49
|
104
|
Chris@49
|
105 for(uword row=0; row<n_rows; ++row)
|
Chris@49
|
106 {
|
Chris@49
|
107 A[row] = new mat_injector_row<eT>;
|
Chris@49
|
108 }
|
Chris@49
|
109
|
Chris@49
|
110 (*this).end_of_row();
|
Chris@49
|
111 }
|
Chris@49
|
112
|
Chris@49
|
113
|
Chris@49
|
114
|
Chris@49
|
115 template<typename T1>
|
Chris@49
|
116 inline
|
Chris@49
|
117 mat_injector<T1>::~mat_injector()
|
Chris@49
|
118 {
|
Chris@49
|
119 arma_extra_debug_sigprint();
|
Chris@49
|
120
|
Chris@49
|
121 typedef typename mat_injector<T1>::elem_type eT;
|
Chris@49
|
122
|
Chris@49
|
123 podarray< mat_injector_row<eT>* >& A = *AA;
|
Chris@49
|
124
|
Chris@49
|
125 if(n_rows > 0)
|
Chris@49
|
126 {
|
Chris@49
|
127 uword max_n_cols = (*(A[0])).n_cols;
|
Chris@49
|
128
|
Chris@49
|
129 for(uword row=1; row<n_rows; ++row)
|
Chris@49
|
130 {
|
Chris@49
|
131 const uword n_cols = (*(A[row])).n_cols;
|
Chris@49
|
132
|
Chris@49
|
133 if(max_n_cols < n_cols)
|
Chris@49
|
134 {
|
Chris@49
|
135 max_n_cols = n_cols;
|
Chris@49
|
136 }
|
Chris@49
|
137 }
|
Chris@49
|
138
|
Chris@49
|
139 const uword max_n_rows = ((*(A[n_rows-1])).n_cols == 0) ? n_rows-1 : n_rows;
|
Chris@49
|
140
|
Chris@49
|
141 if(is_Mat_only<T1>::value == true)
|
Chris@49
|
142 {
|
Chris@49
|
143 X.set_size(max_n_rows, max_n_cols);
|
Chris@49
|
144
|
Chris@49
|
145 for(uword row=0; row<max_n_rows; ++row)
|
Chris@49
|
146 {
|
Chris@49
|
147 const uword n_cols = (*(A[row])).n_cols;
|
Chris@49
|
148
|
Chris@49
|
149 for(uword col=0; col<n_cols; ++col)
|
Chris@49
|
150 {
|
Chris@49
|
151 X.at(row,col) = (*(A[row])).A[col];
|
Chris@49
|
152 }
|
Chris@49
|
153
|
Chris@49
|
154 for(uword col=n_cols; col<max_n_cols; ++col)
|
Chris@49
|
155 {
|
Chris@49
|
156 X.at(row,col) = eT(0);
|
Chris@49
|
157 }
|
Chris@49
|
158 }
|
Chris@49
|
159 }
|
Chris@49
|
160 else
|
Chris@49
|
161 if(is_Row<T1>::value == true)
|
Chris@49
|
162 {
|
Chris@49
|
163 arma_debug_check( (max_n_rows > 1), "matrix initialisation: incompatible dimensions" );
|
Chris@49
|
164
|
Chris@49
|
165 const uword n_cols = (*(A[0])).n_cols;
|
Chris@49
|
166
|
Chris@49
|
167 X.set_size(1, n_cols);
|
Chris@49
|
168
|
Chris@49
|
169 arrayops::copy( X.memptr(), (*(A[0])).A.memptr(), n_cols );
|
Chris@49
|
170 }
|
Chris@49
|
171 else
|
Chris@49
|
172 if(is_Col<T1>::value == true)
|
Chris@49
|
173 {
|
Chris@49
|
174 const bool is_vec = ( (max_n_rows == 1) || (max_n_cols == 1) );
|
Chris@49
|
175
|
Chris@49
|
176 arma_debug_check( (is_vec == false), "matrix initialisation: incompatible dimensions" );
|
Chris@49
|
177
|
Chris@49
|
178 const uword n_elem = (std::max)(max_n_rows, max_n_cols);
|
Chris@49
|
179
|
Chris@49
|
180 X.set_size(n_elem, 1);
|
Chris@49
|
181
|
Chris@49
|
182 uword i = 0;
|
Chris@49
|
183 for(uword row=0; row<max_n_rows; ++row)
|
Chris@49
|
184 {
|
Chris@49
|
185 const uword n_cols = (*(A[0])).n_cols;
|
Chris@49
|
186
|
Chris@49
|
187 for(uword col=0; col<n_cols; ++col)
|
Chris@49
|
188 {
|
Chris@49
|
189 X[i] = (*(A[row])).A[col];
|
Chris@49
|
190 ++i;
|
Chris@49
|
191 }
|
Chris@49
|
192
|
Chris@49
|
193 for(uword col=n_cols; col<max_n_cols; ++col)
|
Chris@49
|
194 {
|
Chris@49
|
195 X[i] = eT(0);
|
Chris@49
|
196 ++i;
|
Chris@49
|
197 }
|
Chris@49
|
198 }
|
Chris@49
|
199 }
|
Chris@49
|
200 }
|
Chris@49
|
201
|
Chris@49
|
202 for(uword row=0; row<n_rows; ++row)
|
Chris@49
|
203 {
|
Chris@49
|
204 delete A[row];
|
Chris@49
|
205 }
|
Chris@49
|
206
|
Chris@49
|
207 delete AA;
|
Chris@49
|
208 delete BB;
|
Chris@49
|
209 }
|
Chris@49
|
210
|
Chris@49
|
211
|
Chris@49
|
212
|
Chris@49
|
213 template<typename T1>
|
Chris@49
|
214 inline
|
Chris@49
|
215 void
|
Chris@49
|
216 mat_injector<T1>::insert(const typename mat_injector<T1>::elem_type val) const
|
Chris@49
|
217 {
|
Chris@49
|
218 arma_extra_debug_sigprint();
|
Chris@49
|
219
|
Chris@49
|
220 typedef typename mat_injector<T1>::elem_type eT;
|
Chris@49
|
221
|
Chris@49
|
222 podarray< mat_injector_row<eT>* >& A = *AA;
|
Chris@49
|
223
|
Chris@49
|
224 (*(A[n_rows-1])).insert(val);
|
Chris@49
|
225 }
|
Chris@49
|
226
|
Chris@49
|
227
|
Chris@49
|
228
|
Chris@49
|
229
|
Chris@49
|
230 template<typename T1>
|
Chris@49
|
231 inline
|
Chris@49
|
232 void
|
Chris@49
|
233 mat_injector<T1>::end_of_row() const
|
Chris@49
|
234 {
|
Chris@49
|
235 arma_extra_debug_sigprint();
|
Chris@49
|
236
|
Chris@49
|
237 typedef typename mat_injector<T1>::elem_type eT;
|
Chris@49
|
238
|
Chris@49
|
239 podarray< mat_injector_row<eT>* >& A = *AA;
|
Chris@49
|
240 podarray< mat_injector_row<eT>* >& B = *BB;
|
Chris@49
|
241
|
Chris@49
|
242 B.set_size( n_rows+1 );
|
Chris@49
|
243
|
Chris@49
|
244 arrayops::copy(B.memptr(), A.memptr(), n_rows);
|
Chris@49
|
245
|
Chris@49
|
246 for(uword row=n_rows; row<(n_rows+1); ++row)
|
Chris@49
|
247 {
|
Chris@49
|
248 B[row] = new mat_injector_row<eT>;
|
Chris@49
|
249 }
|
Chris@49
|
250
|
Chris@49
|
251 std::swap(AA, BB);
|
Chris@49
|
252
|
Chris@49
|
253 n_rows += 1;
|
Chris@49
|
254 }
|
Chris@49
|
255
|
Chris@49
|
256
|
Chris@49
|
257
|
Chris@49
|
258 template<typename T1>
|
Chris@49
|
259 arma_inline
|
Chris@49
|
260 const mat_injector<T1>&
|
Chris@49
|
261 operator<<(const mat_injector<T1>& ref, const typename mat_injector<T1>::elem_type val)
|
Chris@49
|
262 {
|
Chris@49
|
263 arma_extra_debug_sigprint();
|
Chris@49
|
264
|
Chris@49
|
265 ref.insert(val);
|
Chris@49
|
266
|
Chris@49
|
267 return ref;
|
Chris@49
|
268 }
|
Chris@49
|
269
|
Chris@49
|
270
|
Chris@49
|
271
|
Chris@49
|
272 template<typename T1>
|
Chris@49
|
273 arma_inline
|
Chris@49
|
274 const mat_injector<T1>&
|
Chris@49
|
275 operator<<(const mat_injector<T1>& ref, const injector_end_of_row<>& x)
|
Chris@49
|
276 {
|
Chris@49
|
277 arma_extra_debug_sigprint();
|
Chris@49
|
278 arma_ignore(x);
|
Chris@49
|
279
|
Chris@49
|
280 ref.end_of_row();
|
Chris@49
|
281
|
Chris@49
|
282 return ref;
|
Chris@49
|
283 }
|
Chris@49
|
284
|
Chris@49
|
285
|
Chris@49
|
286
|
Chris@49
|
287 //// using a mixture of operator << and , doesn't work yet
|
Chris@49
|
288 //// e.g. A << 1, 2, 3 << endr
|
Chris@49
|
289 //// in the above "3 << endr" requires special handling.
|
Chris@49
|
290 //// similarly, special handling is necessary for "endr << 3"
|
Chris@49
|
291 ////
|
Chris@49
|
292 // template<typename T1>
|
Chris@49
|
293 // arma_inline
|
Chris@49
|
294 // const mat_injector<T1>&
|
Chris@49
|
295 // operator,(const mat_injector<T1>& ref, const typename mat_injector<T1>::elem_type val)
|
Chris@49
|
296 // {
|
Chris@49
|
297 // arma_extra_debug_sigprint();
|
Chris@49
|
298 //
|
Chris@49
|
299 // ref.insert(val);
|
Chris@49
|
300 //
|
Chris@49
|
301 // return ref;
|
Chris@49
|
302 // }
|
Chris@49
|
303
|
Chris@49
|
304
|
Chris@49
|
305
|
Chris@49
|
306 // template<typename T1>
|
Chris@49
|
307 // arma_inline
|
Chris@49
|
308 // const mat_injector<T1>&
|
Chris@49
|
309 // operator,(const mat_injector<T1>& ref, const injector_end_of_row<>& x)
|
Chris@49
|
310 // {
|
Chris@49
|
311 // arma_extra_debug_sigprint();
|
Chris@49
|
312 // arma_ignore(x);
|
Chris@49
|
313 //
|
Chris@49
|
314 // ref.end_of_row();
|
Chris@49
|
315 //
|
Chris@49
|
316 // return ref;
|
Chris@49
|
317 // }
|
Chris@49
|
318
|
Chris@49
|
319
|
Chris@49
|
320
|
Chris@49
|
321
|
Chris@49
|
322 //
|
Chris@49
|
323 //
|
Chris@49
|
324 //
|
Chris@49
|
325
|
Chris@49
|
326
|
Chris@49
|
327
|
Chris@49
|
328 template<typename oT>
|
Chris@49
|
329 inline
|
Chris@49
|
330 field_injector_row<oT>::field_injector_row()
|
Chris@49
|
331 : n_cols(0)
|
Chris@49
|
332 {
|
Chris@49
|
333 arma_extra_debug_sigprint();
|
Chris@49
|
334
|
Chris@49
|
335 AA = new field<oT>;
|
Chris@49
|
336 BB = new field<oT>;
|
Chris@49
|
337
|
Chris@49
|
338 field<oT>& A = *AA;
|
Chris@49
|
339
|
Chris@49
|
340 A.set_size( field_prealloc_n_elem::val );
|
Chris@49
|
341 }
|
Chris@49
|
342
|
Chris@49
|
343
|
Chris@49
|
344
|
Chris@49
|
345 template<typename oT>
|
Chris@49
|
346 inline
|
Chris@49
|
347 field_injector_row<oT>::~field_injector_row()
|
Chris@49
|
348 {
|
Chris@49
|
349 arma_extra_debug_sigprint();
|
Chris@49
|
350
|
Chris@49
|
351 delete AA;
|
Chris@49
|
352 delete BB;
|
Chris@49
|
353 }
|
Chris@49
|
354
|
Chris@49
|
355
|
Chris@49
|
356
|
Chris@49
|
357 template<typename oT>
|
Chris@49
|
358 inline
|
Chris@49
|
359 void
|
Chris@49
|
360 field_injector_row<oT>::insert(const oT& val) const
|
Chris@49
|
361 {
|
Chris@49
|
362 arma_extra_debug_sigprint();
|
Chris@49
|
363
|
Chris@49
|
364 field<oT>& A = *AA;
|
Chris@49
|
365 field<oT>& B = *BB;
|
Chris@49
|
366
|
Chris@49
|
367 if(n_cols < A.n_elem)
|
Chris@49
|
368 {
|
Chris@49
|
369 A[n_cols] = val;
|
Chris@49
|
370 ++n_cols;
|
Chris@49
|
371 }
|
Chris@49
|
372 else
|
Chris@49
|
373 {
|
Chris@49
|
374 B.set_size(2 * A.n_elem);
|
Chris@49
|
375
|
Chris@49
|
376 for(uword i=0; i<n_cols; ++i)
|
Chris@49
|
377 {
|
Chris@49
|
378 B[i] = A[i];
|
Chris@49
|
379 }
|
Chris@49
|
380
|
Chris@49
|
381 B[n_cols] = val;
|
Chris@49
|
382 ++n_cols;
|
Chris@49
|
383
|
Chris@49
|
384 std::swap(AA, BB);
|
Chris@49
|
385 }
|
Chris@49
|
386 }
|
Chris@49
|
387
|
Chris@49
|
388
|
Chris@49
|
389
|
Chris@49
|
390 //
|
Chris@49
|
391 //
|
Chris@49
|
392 //
|
Chris@49
|
393
|
Chris@49
|
394
|
Chris@49
|
395 template<typename T1>
|
Chris@49
|
396 inline
|
Chris@49
|
397 field_injector<T1>::field_injector(T1& in_X, const typename field_injector<T1>::object_type& val)
|
Chris@49
|
398 : X(in_X)
|
Chris@49
|
399 , n_rows(1)
|
Chris@49
|
400 {
|
Chris@49
|
401 arma_extra_debug_sigprint();
|
Chris@49
|
402
|
Chris@49
|
403 typedef typename field_injector<T1>::object_type oT;
|
Chris@49
|
404
|
Chris@49
|
405 AA = new podarray< field_injector_row<oT>* >;
|
Chris@49
|
406 BB = new podarray< field_injector_row<oT>* >;
|
Chris@49
|
407
|
Chris@49
|
408 podarray< field_injector_row<oT>* >& A = *AA;
|
Chris@49
|
409
|
Chris@49
|
410 A.set_size(n_rows);
|
Chris@49
|
411
|
Chris@49
|
412 for(uword row=0; row<n_rows; ++row)
|
Chris@49
|
413 {
|
Chris@49
|
414 A[row] = new field_injector_row<oT>;
|
Chris@49
|
415 }
|
Chris@49
|
416
|
Chris@49
|
417 (*(A[0])).insert(val);
|
Chris@49
|
418 }
|
Chris@49
|
419
|
Chris@49
|
420
|
Chris@49
|
421
|
Chris@49
|
422 template<typename T1>
|
Chris@49
|
423 inline
|
Chris@49
|
424 field_injector<T1>::field_injector(T1& in_X, const injector_end_of_row<>& x)
|
Chris@49
|
425 : X(in_X)
|
Chris@49
|
426 , n_rows(1)
|
Chris@49
|
427 {
|
Chris@49
|
428 arma_extra_debug_sigprint();
|
Chris@49
|
429 arma_ignore(x);
|
Chris@49
|
430
|
Chris@49
|
431 typedef typename field_injector<T1>::object_type oT;
|
Chris@49
|
432
|
Chris@49
|
433 AA = new podarray< field_injector_row<oT>* >;
|
Chris@49
|
434 BB = new podarray< field_injector_row<oT>* >;
|
Chris@49
|
435
|
Chris@49
|
436 podarray< field_injector_row<oT>* >& A = *AA;
|
Chris@49
|
437
|
Chris@49
|
438 A.set_size(n_rows);
|
Chris@49
|
439
|
Chris@49
|
440 for(uword row=0; row<n_rows; ++row)
|
Chris@49
|
441 {
|
Chris@49
|
442 A[row] = new field_injector_row<oT>;
|
Chris@49
|
443 }
|
Chris@49
|
444
|
Chris@49
|
445 (*this).end_of_row();
|
Chris@49
|
446 }
|
Chris@49
|
447
|
Chris@49
|
448
|
Chris@49
|
449
|
Chris@49
|
450 template<typename T1>
|
Chris@49
|
451 inline
|
Chris@49
|
452 field_injector<T1>::~field_injector()
|
Chris@49
|
453 {
|
Chris@49
|
454 arma_extra_debug_sigprint();
|
Chris@49
|
455
|
Chris@49
|
456 typedef typename field_injector<T1>::object_type oT;
|
Chris@49
|
457
|
Chris@49
|
458 podarray< field_injector_row<oT>* >& A = *AA;
|
Chris@49
|
459
|
Chris@49
|
460 if(n_rows > 0)
|
Chris@49
|
461 {
|
Chris@49
|
462 uword max_n_cols = (*(A[0])).n_cols;
|
Chris@49
|
463
|
Chris@49
|
464 for(uword row=1; row<n_rows; ++row)
|
Chris@49
|
465 {
|
Chris@49
|
466 const uword n_cols = (*(A[row])).n_cols;
|
Chris@49
|
467
|
Chris@49
|
468 if(max_n_cols < n_cols)
|
Chris@49
|
469 {
|
Chris@49
|
470 max_n_cols = n_cols;
|
Chris@49
|
471 }
|
Chris@49
|
472 }
|
Chris@49
|
473
|
Chris@49
|
474 const uword max_n_rows = ((*(A[n_rows-1])).n_cols == 0) ? n_rows-1 : n_rows;
|
Chris@49
|
475
|
Chris@49
|
476 X.set_size(max_n_rows, max_n_cols);
|
Chris@49
|
477
|
Chris@49
|
478 for(uword row=0; row<max_n_rows; ++row)
|
Chris@49
|
479 {
|
Chris@49
|
480 const uword n_cols = (*(A[row])).n_cols;
|
Chris@49
|
481
|
Chris@49
|
482 for(uword col=0; col<n_cols; ++col)
|
Chris@49
|
483 {
|
Chris@49
|
484 const field<oT>& tmp = *((*(A[row])).AA);
|
Chris@49
|
485 X.at(row,col) = tmp[col];
|
Chris@49
|
486 }
|
Chris@49
|
487
|
Chris@49
|
488 for(uword col=n_cols; col<max_n_cols; ++col)
|
Chris@49
|
489 {
|
Chris@49
|
490 X.at(row,col) = oT();
|
Chris@49
|
491 }
|
Chris@49
|
492 }
|
Chris@49
|
493 }
|
Chris@49
|
494
|
Chris@49
|
495
|
Chris@49
|
496 for(uword row=0; row<n_rows; ++row)
|
Chris@49
|
497 {
|
Chris@49
|
498 delete A[row];
|
Chris@49
|
499 }
|
Chris@49
|
500
|
Chris@49
|
501 delete AA;
|
Chris@49
|
502 delete BB;
|
Chris@49
|
503 }
|
Chris@49
|
504
|
Chris@49
|
505
|
Chris@49
|
506
|
Chris@49
|
507 template<typename T1>
|
Chris@49
|
508 inline
|
Chris@49
|
509 void
|
Chris@49
|
510 field_injector<T1>::insert(const typename field_injector<T1>::object_type& val) const
|
Chris@49
|
511 {
|
Chris@49
|
512 arma_extra_debug_sigprint();
|
Chris@49
|
513
|
Chris@49
|
514 typedef typename field_injector<T1>::object_type oT;
|
Chris@49
|
515
|
Chris@49
|
516 podarray< field_injector_row<oT>* >& A = *AA;
|
Chris@49
|
517
|
Chris@49
|
518 (*(A[n_rows-1])).insert(val);
|
Chris@49
|
519 }
|
Chris@49
|
520
|
Chris@49
|
521
|
Chris@49
|
522
|
Chris@49
|
523
|
Chris@49
|
524 template<typename T1>
|
Chris@49
|
525 inline
|
Chris@49
|
526 void
|
Chris@49
|
527 field_injector<T1>::end_of_row() const
|
Chris@49
|
528 {
|
Chris@49
|
529 arma_extra_debug_sigprint();
|
Chris@49
|
530
|
Chris@49
|
531 typedef typename field_injector<T1>::object_type oT;
|
Chris@49
|
532
|
Chris@49
|
533 podarray< field_injector_row<oT>* >& A = *AA;
|
Chris@49
|
534 podarray< field_injector_row<oT>* >& B = *BB;
|
Chris@49
|
535
|
Chris@49
|
536 B.set_size( n_rows+1 );
|
Chris@49
|
537
|
Chris@49
|
538 for(uword row=0; row<n_rows; ++row)
|
Chris@49
|
539 {
|
Chris@49
|
540 B[row] = A[row];
|
Chris@49
|
541 }
|
Chris@49
|
542
|
Chris@49
|
543 for(uword row=n_rows; row<(n_rows+1); ++row)
|
Chris@49
|
544 {
|
Chris@49
|
545 B[row] = new field_injector_row<oT>;
|
Chris@49
|
546 }
|
Chris@49
|
547
|
Chris@49
|
548 std::swap(AA, BB);
|
Chris@49
|
549
|
Chris@49
|
550 n_rows += 1;
|
Chris@49
|
551 }
|
Chris@49
|
552
|
Chris@49
|
553
|
Chris@49
|
554
|
Chris@49
|
555 template<typename T1>
|
Chris@49
|
556 arma_inline
|
Chris@49
|
557 const field_injector<T1>&
|
Chris@49
|
558 operator<<(const field_injector<T1>& ref, const typename field_injector<T1>::object_type& val)
|
Chris@49
|
559 {
|
Chris@49
|
560 arma_extra_debug_sigprint();
|
Chris@49
|
561
|
Chris@49
|
562 ref.insert(val);
|
Chris@49
|
563
|
Chris@49
|
564 return ref;
|
Chris@49
|
565 }
|
Chris@49
|
566
|
Chris@49
|
567
|
Chris@49
|
568
|
Chris@49
|
569 template<typename T1>
|
Chris@49
|
570 arma_inline
|
Chris@49
|
571 const field_injector<T1>&
|
Chris@49
|
572 operator<<(const field_injector<T1>& ref, const injector_end_of_row<>& x)
|
Chris@49
|
573 {
|
Chris@49
|
574 arma_extra_debug_sigprint();
|
Chris@49
|
575 arma_ignore(x);
|
Chris@49
|
576
|
Chris@49
|
577 ref.end_of_row();
|
Chris@49
|
578
|
Chris@49
|
579 return ref;
|
Chris@49
|
580 }
|
Chris@49
|
581
|
Chris@49
|
582
|
Chris@49
|
583
|
Chris@49
|
584 //! @}
|