source: XIOS/trunk/src/array_new.hpp @ 680

Last change on this file since 680 was 680, checked in by rlacroix, 9 years ago

Rephrase some error messages so that they are clearer.

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 23.4 KB
Line 
1#ifndef __XIOS_ARRAY_HPP__
2#define __XIOS_ARRAY_HPP__
3
4#define BZ_COLUMN_MAJOR_ARRAY
5#include <blitz/array.h>
6#include "buffer_in.hpp"
7#include "buffer_out.hpp"
8#include "message.hpp"
9#include <cmath>
10
11using namespace blitz;
12BZ_DECLARE_FUNCTION(round)
13
14namespace xios
15{
16  template <typename T_numtype,int N_rank>
17  class CArray : public Array<T_numtype,N_rank>, public virtual CBaseType
18  {
19    private:
20      bool initialized;
21
22    public:
23      typedef typename Array<T_numtype,N_rank>::T_default_storage T_default_storage;
24      using Array<T_numtype,N_rank>::operator =;
25
26      template<typename T_expr> explicit CArray(_bz_ArrayExpr<T_expr> expr)
27        : Array<T_numtype,N_rank>(expr)
28        , initialized(true)
29      {}
30
31      CArray(GeneralArrayStorage<N_rank> storage = T_default_storage())
32        : Array<T_numtype,N_rank>(storage)
33        , initialized(false)
34      {}
35
36      explicit CArray(int length0, GeneralArrayStorage<N_rank> storage = T_default_storage())
37        : Array<T_numtype,N_rank>(length0, storage)
38        , initialized(true)
39      {}
40
41      CArray(int length0, int length1, GeneralArrayStorage<N_rank> storage = T_default_storage())
42        : Array<T_numtype,N_rank>(length0, length1, storage)
43        , initialized(true)
44      {}
45
46      CArray(int length0, int length1, int length2, GeneralArrayStorage<N_rank> storage = T_default_storage())
47        : Array<T_numtype,N_rank>(length0, length1, length2, storage)
48        , initialized(true)
49      {}
50
51      CArray(int length0, int length1, int length2, int length3, GeneralArrayStorage<N_rank> storage = T_default_storage())
52        : Array<T_numtype,N_rank>(length0, length1, length2, length3, storage)
53        , initialized(true)
54      {}
55
56      CArray(int length0, int length1, int length2, int length3, int length4, GeneralArrayStorage<N_rank> storage = T_default_storage())
57        : Array<T_numtype,N_rank>(length0,length1, length2, length3, length4, storage)
58        , initialized(true)
59      {}
60
61      CArray(int length0, int length1, int length2, int length3, int length4, int length5, GeneralArrayStorage<N_rank> storage = T_default_storage())
62        : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, storage)
63        , initialized(true)
64      {}
65
66      CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, GeneralArrayStorage<N_rank> storage = T_default_storage())
67        : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, storage)
68        , initialized(true)
69      {}
70
71      CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, int length7,
72             GeneralArrayStorage<N_rank> storage = T_default_storage())
73        : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, storage)
74        , initialized(true)
75      {}
76
77      CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6,
78             int length7, int length8, GeneralArrayStorage<N_rank> storage = T_default_storage())
79       : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, length8, storage)
80       , initialized(true)
81      {}
82
83      CArray(int length0, int length1, int length2, int length3, int length4,
84             int length5, int length6, int length7, int length8, int length9, GeneralArrayStorage<N_rank> storage = T_default_storage())
85        : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, length8, length9, storage)
86        , initialized(true)
87      {}
88
89      CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6,
90             int length7, int length8, int length9, int length10, GeneralArrayStorage<N_rank> storage = T_default_storage())
91       : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, length8, length9, length10, storage)
92       , initialized(true)
93      {}
94
95      CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, GeneralArrayStorage<N_rank> storage = T_default_storage())
96        : Array<T_numtype,N_rank>(dataFirst, shape, storage)
97        , initialized(true)
98      {}
99
100      CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, TinyVector<diffType, N_rank> stride,
101             GeneralArrayStorage<N_rank> storage = T_default_storage())
102        : Array<T_numtype,N_rank>(dataFirst, shape, stride, storage)
103        , initialized(true)
104      {}
105
106      CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, preexistingMemoryPolicy deletionPolicy,
107            GeneralArrayStorage<N_rank> storage = T_default_storage())
108        : Array<T_numtype,N_rank>(dataFirst, shape, deletionPolicy, storage)
109        , initialized(true)
110      {}
111
112      CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, TinyVector<diffType, N_rank> stride,
113             preexistingMemoryPolicy deletionPolicy, GeneralArrayStorage<N_rank> storage = T_default_storage())
114        : Array<T_numtype,N_rank>(dataFirst, shape, stride, deletionPolicy, storage)
115        , initialized(true)
116      {}
117
118      CArray(const TinyVector<int, N_rank>& extent, GeneralArrayStorage<N_rank> storage = T_default_storage())
119        : Array<T_numtype,N_rank>(extent, storage)
120        , initialized(true)
121      {}
122
123      CArray(const TinyVector<int, N_rank>& lbounds, const TinyVector<int, N_rank>& extent,
124             const GeneralArrayStorage<N_rank>& storage)
125        : Array<T_numtype,N_rank>(lbounds, extent, storage)
126        , initialized(true)
127      {}
128
129      CArray(Range r0, GeneralArrayStorage<N_rank> storage = T_default_storage())
130        : Array<T_numtype,N_rank>(r0, storage)
131        , initialized(true)
132      {}
133
134      CArray(Range r0, Range r1, GeneralArrayStorage<N_rank> storage = T_default_storage())
135        : Array<T_numtype,N_rank>(r0, r1, storage)
136        , initialized(true)
137      {}
138
139      CArray(Range r0, Range r1, Range r2, GeneralArrayStorage<N_rank> storage = T_default_storage())
140        : Array<T_numtype,N_rank>(r0, r1, r2, storage)
141        , initialized(true)
142      {}
143
144      CArray(Range r0, Range r1, Range r2, Range r3, GeneralArrayStorage<N_rank> storage = T_default_storage())
145        : Array<T_numtype,N_rank>(r0, r1, r2, r3, storage)
146        , initialized(true)
147      {}
148
149      CArray(Range r0, Range r1, Range r2, Range r3, Range r4, GeneralArrayStorage<N_rank> storage = T_default_storage())
150        : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, storage)
151        , initialized(true)
152      {}
153
154      CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, GeneralArrayStorage<N_rank> storage = T_default_storage())
155        : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, storage)
156        , initialized(true)
157      {}
158
159      CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6,
160             GeneralArrayStorage<N_rank> storage = T_default_storage())
161        : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, storage)
162        , initialized(true)
163      {}
164
165      CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7,
166             GeneralArrayStorage<N_rank> storage = T_default_storage())
167        : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, storage)
168        , initialized(true)
169      {}
170
171      CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
172             Range r6, Range r7, Range r8, GeneralArrayStorage<N_rank> storage = T_default_storage())
173        : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, r8, storage)
174        , initialized(true)
175      {}
176
177      CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
178             Range r6, Range r7, Range r8, Range r9, GeneralArrayStorage<N_rank> storage = T_default_storage())
179        : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, storage)
180        , initialized(true)
181      {}
182
183      CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7,
184             Range r8, Range r9, Range r10, GeneralArrayStorage<N_rank> storage = T_default_storage())
185        : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, storage)
186        , initialized(true)
187      {}
188
189      CArray(const CArray<T_numtype, N_rank>& array)
190        : Array<T_numtype,N_rank>(array)
191        , initialized(array.initialized)
192      {}
193
194      CArray(const Array<T_numtype, N_rank>& array)
195        : Array<T_numtype,N_rank>(array)
196        , initialized(true)
197      {}
198
199      CArray(const TinyVector<int,N_rank-1>& shape, int lastExtent, const GeneralArrayStorage<N_rank>& storage)
200        : Array<T_numtype,N_rank>(shape, lastExtent, storage)
201        , initialized(true)
202      {}
203
204      CArray(Array<T_numtype, N_rank>& array, Range r0)
205        : Array<T_numtype,N_rank>(array, r0)
206        , initialized(true)
207      {}
208
209      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1)
210        : Array<T_numtype,N_rank>(array, r0, r1)
211        , initialized(true)
212      {}
213
214      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2)
215        : Array<T_numtype,N_rank>( array, r0, r1, r2)
216        , initialized(true)
217      {}
218
219      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3)
220        : Array<T_numtype,N_rank>(array, r0, r1, r2, r3)
221        , initialized(true)
222      {}
223
224      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
225             Range r3, Range r4)
226        : Array<T_numtype,N_rank>(array, r0, r1, r2, r3,  r4)
227        , initialized(true)
228      {}
229
230      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
231             Range r3, Range r4, Range r5)
232        : Array<T_numtype,N_rank>( array, r0, r1, r2, r3, r4, r5)
233        , initialized(true)
234      {}
235
236      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3,
237             Range r4, Range r5, Range r6)
238        : Array<T_numtype,N_rank>( array, r0, r1, r2, r3, r4, r5, r6)
239        , initialized(true)
240      {}
241
242      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4,
243             Range r5, Range r6, Range r7)
244        : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7)
245        , initialized(true)
246      {}
247
248      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
249             Range r6, Range r7, Range r8)
250        : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7, r8)
251        , initialized(true)
252      {}
253
254      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
255             Range r6, Range r7, Range r8, Range r9)
256        : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9)
257        , initialized(true)
258      {}
259
260      CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6,
261             Range r7, Range r8, Range r9, Range r10)
262        : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10)
263        , initialized(true)
264      {}
265
266      CArray(Array<T_numtype, N_rank>& array, const RectDomain<N_rank>& subdomain)
267        : Array<T_numtype,N_rank>(array, subdomain)
268        , initialized(true)
269      {}
270
271      CArray(Array<T_numtype, N_rank>& array, const StridedDomain<N_rank>& subdomain)
272        : Array<T_numtype,N_rank>(array, subdomain)
273        , initialized(true)
274      {}
275
276      template<int N_rank2, typename R0, typename R1, typename R2, typename R3, typename R4, typename R5,
277                            typename R6, typename R7, typename R8, typename R9, typename R10>
278      CArray(Array<T_numtype,N_rank2>& array, R0 r0, R1 r1, R2 r2, R3 r3, R4 r4, R5 r5, R6 r6, R7 r7, R8 r8, R9 r9, R10 r10)
279        : Array<T_numtype,N_rank>(array, r0,r1, r2, r3, r4, r5, r6, r7, r8, r9, r10)
280        , initialized(true)
281      {}
282
283      virtual ~CArray() {}
284
285      CArray<T_numtype, N_rank> copy() const
286      {
287        CArray<T_numtype, N_rank> copy = Array<T_numtype, N_rank>::copy();
288        copy.initialized = initialized;
289        return copy;
290      }
291
292      void reference(const CArray<T_numtype, N_rank>& array)
293      {
294        Array<T_numtype,N_rank>::reference(array);
295        initialized = array.initialized;
296      }
297
298      void reference(const Array<T_numtype,N_rank>& array)
299      {
300        Array<T_numtype,N_rank>::reference(array);
301        initialized = true;
302      }
303
304      void resize(int extent)
305      {
306        Array<T_numtype,N_rank>::resize(extent);
307        initialized = true;
308      }
309      void resize(int extent1, int extent2)
310      {
311        Array<T_numtype,N_rank>::resize(extent1, extent2);
312        initialized = true;
313      }
314      void resize(int extent1, int extent2, int extent3)
315      {
316        Array<T_numtype,N_rank>::resize(extent1, extent2, extent3);
317        initialized = true;
318      }
319      void resize(int extent1, int extent2, int extent3, int extent4)
320      {
321        Array<T_numtype,N_rank>::resize(extent1, extent2, extent3, extent4);
322        initialized = true;
323      }
324      void resize(int extent1, int extent2, int extent3, int extent4, int extent5)
325      {
326        Array<T_numtype,N_rank>::resize(extent1, extent2, extent3, extent4, extent5);
327        initialized = true;
328      }
329      void resize(int extent1, int extent2, int extent3, int extent4, int extent5, int extent6)
330      {
331        Array<T_numtype,N_rank>::resize(extent1, extent2, extent3, extent4, extent5, extent6);
332        initialized = true;
333      }
334      void resize(int extent1, int extent2, int extent3, int extent4, int extent5,
335                  int extent6, int extent7)
336      {
337        Array<T_numtype,N_rank>::resize(extent1, extent2, extent3, extent4, extent5,
338                                        extent6, extent7);
339        initialized = true;
340      }
341      void resize(int extent1, int extent2, int extent3, int extent4, int extent5,
342                  int extent6, int extent7, int extent8)
343      {
344        Array<T_numtype,N_rank>::resize(extent1, extent2, extent3, extent4, extent5,
345                                        extent6, extent7, extent8);
346        initialized = true;
347      }
348      void resize(int extent1, int extent2, int extent3, int extent4, int extent5,
349                  int extent6, int extent7, int extent8, int extent9)
350      {
351        Array<T_numtype,N_rank>::resize(extent1, extent2, extent3, extent4, extent5,
352                                        extent6, extent7, extent8, extent9);
353        initialized = true;
354      }
355      void resize(int extent1, int extent2, int extent3, int extent4, int extent5,
356                  int extent6, int extent7, int extent8, int extent9, int extent10)
357      {
358        Array<T_numtype,N_rank>::resize(extent1, extent2, extent3, extent4, extent5,
359                                        extent6, extent7, extent8, extent9, extent10);
360        initialized = true;
361      }
362      void resize(int extent1, int extent2, int extent3, int extent4, int extent5, int extent6,
363                  int extent7, int extent8, int extent9, int extent10, int extent11)
364      {
365        Array<T_numtype,N_rank>::resize(extent1, extent2, extent3, extent4, extent5, extent6,
366                                        extent7, extent8, extent9, extent10, extent11);
367        initialized = true;
368      }
369
370      void resize(Range r1)
371      {
372        Array<T_numtype,N_rank>::resize(r1);
373        initialized = true;
374      }
375      void resize(Range r1, Range r2)
376      {
377        Array<T_numtype,N_rank>::resize(r1, r2);
378        initialized = true;
379      }
380      void resize(Range r1, Range r2, Range r3)
381      {
382        Array<T_numtype,N_rank>::resize(r1, r2, r3);
383        initialized = true;
384      }
385      void resize(Range r1, Range r2, Range r3, Range r4)
386      {
387        Array<T_numtype,N_rank>::resize(r1, r2, r3, r4);
388        initialized = true;
389      }
390      void resize(Range r1, Range r2, Range r3, Range r4, Range r5)
391      {
392        Array<T_numtype,N_rank>::resize(r1, r2, r3, r4, r5);
393        initialized = true;
394      }
395      void resize(Range r1, Range r2, Range r3, Range r4, Range r5, Range r6)
396      {
397        Array<T_numtype,N_rank>::resize(r1, r2, r3, r4, r5, r6);
398        initialized = true;
399      }
400      void resize(Range r1, Range r2, Range r3, Range r4, Range r5,
401                  Range r6, Range r7)
402      {
403        Array<T_numtype,N_rank>::resize(r1, r2, r3, r4, r5,
404                                        r6, r7);
405        initialized = true;
406      }
407      void resize(Range r1, Range r2, Range r3, Range r4, Range r5,
408                  Range r6, Range r7, Range r8)
409      {
410        Array<T_numtype,N_rank>::resize(r1, r2, r3, r4, r5,
411                                        r6, r7, r8);
412        initialized = true;
413      }
414      void resize(Range r1, Range r2, Range r3, Range r4, Range r5,
415                  Range r6, Range r7, Range r8, Range r9)
416      {
417        Array<T_numtype,N_rank>::resize(r1, r2, r3, r4, r5,
418                                        r6, r7, r8, r9);
419        initialized = true;
420      }
421      void resize(Range r1, Range r2, Range r3, Range r4, Range r5,
422                  Range r6, Range r7, Range r8, Range r9, Range r10)
423      {
424        Array<T_numtype,N_rank>::resize(r1, r2, r3, r4, r5,
425                                        r6, r7, r8, r9, r10);
426        initialized = true;
427      }
428      void resize(Range r1, Range r2, Range r3, Range r4, Range r5, Range r6,
429                  Range r7, Range r8, Range r9, Range r10, Range r11)
430      {
431        Array<T_numtype,N_rank>::resize(r1, r2, r3, r4, r5, r6,
432                                        r7, r8, r9, r10, r11);
433        initialized = true;
434      }
435
436      void resize(const TinyVector<int,N_rank>& extent)
437      {
438        Array<T_numtype,N_rank>::resize(extent);
439        initialized = true;
440      }
441
442      void resizeAndPreserve(const TinyVector<int,N_rank>& extent)
443      {
444        Array<T_numtype,N_rank>::resizeAndPreserve(extent);
445        initialized = true;
446      }
447
448      void resizeAndPreserve(int extent)
449      {
450        Array<T_numtype,N_rank>::resizeAndPreserve(extent);
451        initialized = true;
452      }
453      void resizeAndPreserve(int extent1, int extent2)
454      {
455        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2);
456        initialized = true;
457      }
458      void resizeAndPreserve(int extent1, int extent2, int extent3)
459      {
460        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2, extent3);
461        initialized = true;
462      }
463      void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4)
464      {
465        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2, extent3, extent4);
466        initialized = true;
467      }
468      void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, int extent5)
469      {
470        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2, extent3, extent4, extent5);
471        initialized = true;
472      }
473      void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4,
474                             int extent5, int extent6)
475      {
476        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2, extent3, extent4,
477                                                   extent5, extent6);
478        initialized = true;
479      }
480      void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4,
481                             int extent5, int extent6, int extent7)
482      {
483        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2, extent3, extent4,
484                                                   extent5, extent6, extent7);
485        initialized = true;
486      }
487      void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4,
488                             int extent5, int extent6, int extent7, int extent8)
489      {
490        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2, extent3, extent4,
491                                                   extent5, extent6, extent7, extent8);
492        initialized = true;
493      }
494      void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, int extent5,
495                             int extent6, int extent7, int extent8, int extent9)
496      {
497        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2, extent3, extent4, extent5,
498                                                   extent6, extent7, extent8, extent9);
499        initialized = true;
500      }
501      void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, int extent5,
502                             int extent6, int extent7, int extent8, int extent9, int extent10)
503      {
504        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2, extent3, extent4, extent5,
505                                                   extent6, extent7, extent8, extent9, extent10);
506        initialized = true;
507      }
508      void resizeAndPreserve(int extent1, int extent2, int extent3, int extent4, int extent5, int extent6,
509                             int extent7, int extent8, int extent9, int extent10, int extent11)
510      {
511        Array<T_numtype,N_rank>::resizeAndPreserve(extent1, extent2, extent3, extent4, extent5, extent6,
512                                                   extent7, extent8, extent9, extent10, extent11);
513        initialized = true;
514      }
515
516      virtual void fromString(const string& str) { istringstream iss(str); iss >> *this; initialized = true; }
517      virtual string toString(void) const { ostringstream oss; oss << *this; return oss.str(); }
518      virtual void reset(void) { this->free(); initialized = false; }
519      virtual bool isEmpty(void) const { return !initialized; }
520      virtual size_t size(void) const { return (this->dimensions() + 1) * sizeof(int) + sizeof(size_t) + this->numElements() * sizeof(T_numtype); }
521
522      virtual CBaseType* clone(void) const { return new CArray(*this); }
523
524      virtual bool toBuffer(CBufferOut& buffer) const
525      {
526        bool ret;
527        ret =  buffer.put(this->dimensions());
528        ret &= buffer.put(this->shape().data(), this->dimensions());
529        ret &= buffer.put(this->numElements());
530        ret &= buffer.put(this->dataFirst(), this->numElements());
531        return ret;
532      }
533
534      virtual bool fromBuffer(CBufferIn& buffer)
535      {
536        bool ret;
537        int numDim;
538        TinyVector<int,N_rank> vect;
539        size_t ne;
540
541        ret =  buffer.get(numDim);
542        ret &= buffer.get(vect.data(), N_rank);
543        this->resize(vect);
544        ret &= buffer.get(ne);
545        ret &= buffer.get(this->dataFirst(), ne);
546
547        initialized = true;
548
549        return ret;
550      }
551  };
552
553  template <typename T_numtype,int N_rank> inline CBufferOut& operator<<(CBufferOut& buffer, const CArray<T_numtype,N_rank>& array)
554  {
555    if (!array.toBuffer(buffer)) ERROR("template <typename T_numtype,int N_rank> inline CBufferOut& operator<<(CBufferOut& buffer, const CArray& array)",
556                                       << "Not enough free space in buffer to queue the array.");
557    return buffer;
558  }
559
560  template <typename T_numtype,int N_rank> inline CBufferIn& operator>>(CBufferIn& buffer, CArray<T_numtype, N_rank>& array)
561  {
562    if (!array.fromBuffer(buffer)) ERROR("template <typename T_numtype,int N_rank> inline CBufferIn& operator>>(CBufferIn& buffer, CArray& array)",
563                                         << "Not enough data in buffer to unqueue the array.");
564    return buffer;
565  }
566
567  template <typename T_numtype,int N_rank> inline CMessage& operator<<(CMessage& msg, const CArray<T_numtype, N_rank>& array)
568  {
569    msg.push(array);
570    return msg;
571  }
572
573  template <typename T_numtype,int N_rank> inline CMessage& operator<<(CMessage& msg, CArray<T_numtype, N_rank>& array)
574  {
575    msg.push(array);
576    return msg;
577  }
578}
579
580#endif
Note: See TracBrowser for help on using the repository browser.