1 #include<libgeodecomp/config.h>
2 #ifdef LIBGEODECOMP_WITH_BOOST_SERIALIZATION
3 #ifndef LIBGEODECOMP_SERIALIZATION_H
4 #define LIBGEODECOMP_SERIALIZATION_H
5 
6 #include <libgeodecomp/misc/chronometer.h>
7 #include <libgeodecomp/misc/clonable.h>
8 #include <libgeodecomp/geometry/coord.h>
9 #include <libgeodecomp/geometry/coord.h>
10 #include <libgeodecomp/geometry/coord.h>
11 #include <libgeodecomp/geometry/coordbox.h>
12 #include <libgeodecomp/storage/defaultfilter.h>
13 #include <libgeodecomp/storage/filter.h>
14 #include <libgeodecomp/storage/filterbase.h>
15 #include <libgeodecomp/storage/fixedarray.h>
16 #include <libgeodecomp/geometry/floatcoord.h>
17 #include <libgeodecomp/geometry/floatcoord.h>
18 #include <libgeodecomp/geometry/floatcoord.h>
19 #include <libgeodecomp/io/hpxwritercollector.h>
20 #include <libgeodecomp/io/initializer.h>
21 #include <libgeodecomp/loadbalancer/loadbalancer.h>
22 #include <libgeodecomp/misc/nonpodtestcell.h>
23 #include <libgeodecomp/loadbalancer/oozebalancer.h>
24 #include <libgeodecomp/io/parallelwriter.h>
25 #include <libgeodecomp/geometry/region.h>
26 #include <libgeodecomp/io/serialbovwriter.h>
27 #include <libgeodecomp/storage/simplefilter.h>
28 #include <libgeodecomp/io/simpleinitializer.h>
29 #include <libgeodecomp/io/steerer.h>
30 #include <libgeodecomp/geometry/streak.h>
31 #include <libgeodecomp/loadbalancer/tracingbalancer.h>
32 #include <libgeodecomp/io/tracingwriter.h>
33 #include <libgeodecomp/io/writer.h>
34 
35 namespace LibGeoDecomp {
36 class Serialization
37 {
38 public:
39     template<typename ARCHIVE>
40     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Chronometer & object,const unsigned)41     static void serialize(ARCHIVE& archive, LibGeoDecomp::Chronometer& object, const unsigned /*version*/)
42     {
43         archive & object.totalTimes;
44     }
45 
46     template<typename ARCHIVE, typename BASE, typename IMPLEMENTATION>
47     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Clonable<BASE,IMPLEMENTATION> & object,const unsigned)48     static void serialize(ARCHIVE& archive, LibGeoDecomp::Clonable<BASE, IMPLEMENTATION>& object, const unsigned /*version*/)
49     {
50         archive & boost::serialization::base_object<BASE >(object);
51     }
52 
53     template<typename ARCHIVE>
54     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Coord<1> & object,const unsigned)55     static void serialize(ARCHIVE& archive, LibGeoDecomp::Coord<1 >& object, const unsigned /*version*/)
56     {
57         archive & object.c;
58     }
59 
60     template<typename ARCHIVE>
61     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Coord<2> & object,const unsigned)62     static void serialize(ARCHIVE& archive, LibGeoDecomp::Coord<2 >& object, const unsigned /*version*/)
63     {
64         archive & object.c;
65     }
66 
67     template<typename ARCHIVE>
68     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Coord<3> & object,const unsigned)69     static void serialize(ARCHIVE& archive, LibGeoDecomp::Coord<3 >& object, const unsigned /*version*/)
70     {
71         archive & object.c;
72     }
73 
74     template<typename ARCHIVE, int DIM>
75     inline
serialize(ARCHIVE & archive,LibGeoDecomp::CoordBox<DIM> & object,const unsigned)76     static void serialize(ARCHIVE& archive, LibGeoDecomp::CoordBox<DIM>& object, const unsigned /*version*/)
77     {
78         archive & object.dimensions;
79         archive & object.origin;
80     }
81 
82     template<typename ARCHIVE, typename CELL, typename MEMBER, typename EXTERNAL>
83     inline
serialize(ARCHIVE & archive,LibGeoDecomp::DefaultFilter<CELL,MEMBER,EXTERNAL> & object,const unsigned)84     static void serialize(ARCHIVE& archive, LibGeoDecomp::DefaultFilter<CELL, MEMBER, EXTERNAL>& object, const unsigned /*version*/)
85     {
86         archive & boost::serialization::base_object<LibGeoDecomp::Filter<CELL, MEMBER, EXTERNAL > >(object);
87     }
88 
89     template<typename ARCHIVE, typename CELL, typename MEMBER, typename EXTERNAL, int ARITY>
90     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Filter<CELL,MEMBER,EXTERNAL,ARITY> & object,const unsigned)91     static void serialize(ARCHIVE& archive, LibGeoDecomp::Filter<CELL, MEMBER, EXTERNAL, ARITY>& object, const unsigned /*version*/)
92     {
93         archive & boost::serialization::base_object<LibGeoDecomp::FilterBase<CELL > >(object);
94     }
95 
96     template<typename ARCHIVE, typename CELL>
97     inline
serialize(ARCHIVE & archive,LibGeoDecomp::FilterBase<CELL> & object,const unsigned)98     static void serialize(ARCHIVE& archive, LibGeoDecomp::FilterBase<CELL>& object, const unsigned /*version*/)
99     {
100     }
101 
102     template<typename ARCHIVE, typename T, int SIZE>
103     inline
serialize(ARCHIVE & archive,LibGeoDecomp::FixedArray<T,SIZE> & object,const unsigned)104     static void serialize(ARCHIVE& archive, LibGeoDecomp::FixedArray<T, SIZE>& object, const unsigned /*version*/)
105     {
106         archive & object.elements;
107         archive & object.store;
108     }
109 
110     template<typename ARCHIVE>
111     inline
serialize(ARCHIVE & archive,LibGeoDecomp::FloatCoord<1> & object,const unsigned)112     static void serialize(ARCHIVE& archive, LibGeoDecomp::FloatCoord<1 >& object, const unsigned /*version*/)
113     {
114         archive & object.c;
115     }
116 
117     template<typename ARCHIVE>
118     inline
serialize(ARCHIVE & archive,LibGeoDecomp::FloatCoord<2> & object,const unsigned)119     static void serialize(ARCHIVE& archive, LibGeoDecomp::FloatCoord<2 >& object, const unsigned /*version*/)
120     {
121         archive & object.c;
122     }
123 
124     template<typename ARCHIVE>
125     inline
serialize(ARCHIVE & archive,LibGeoDecomp::FloatCoord<3> & object,const unsigned)126     static void serialize(ARCHIVE& archive, LibGeoDecomp::FloatCoord<3 >& object, const unsigned /*version*/)
127     {
128         archive & object.c;
129     }
130 
131     template<typename ARCHIVE, typename CELL_TYPE, typename CONVERTER>
132     inline
serialize(ARCHIVE & archive,LibGeoDecomp::HpxWriterCollector<CELL_TYPE,CONVERTER> & object,const unsigned)133     static void serialize(ARCHIVE& archive, LibGeoDecomp::HpxWriterCollector<CELL_TYPE, CONVERTER>& object, const unsigned /*version*/)
134     {
135         archive & boost::serialization::base_object<LibGeoDecomp::Clonable<ParallelWriter<CELL_TYPE >, HpxWriterCollector<CELL_TYPE, CONVERTER > > >(object);
136         archive & object.sink;
137     }
138 
139     template<typename ARCHIVE, typename CELL>
140     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Initializer<CELL> & object,const unsigned)141     static void serialize(ARCHIVE& archive, LibGeoDecomp::Initializer<CELL>& object, const unsigned /*version*/)
142     {
143     }
144 
145     template<typename ARCHIVE>
146     inline
serialize(ARCHIVE & archive,LibGeoDecomp::LoadBalancer & object,const unsigned)147     static void serialize(ARCHIVE& archive, LibGeoDecomp::LoadBalancer& object, const unsigned /*version*/)
148     {
149     }
150 
151     template<typename ARCHIVE>
152     inline
serialize(ARCHIVE & archive,LibGeoDecomp::NonPoDTestCell & object,const unsigned)153     static void serialize(ARCHIVE& archive, LibGeoDecomp::NonPoDTestCell& object, const unsigned /*version*/)
154     {
155         archive & object.coord;
156         archive & object.cycleCounter;
157         archive & object.missingNeighbors;
158         archive & object.seenNeighbors;
159         archive & object.simSpace;
160     }
161 
162     template<typename ARCHIVE>
163     inline
serialize(ARCHIVE & archive,LibGeoDecomp::OozeBalancer & object,const unsigned)164     static void serialize(ARCHIVE& archive, LibGeoDecomp::OozeBalancer& object, const unsigned /*version*/)
165     {
166         archive & boost::serialization::base_object<LibGeoDecomp::LoadBalancer >(object);
167         archive & object.newLoadWeight;
168     }
169 
170     template<typename ARCHIVE, typename CELL_TYPE>
171     inline
serialize(ARCHIVE & archive,LibGeoDecomp::ParallelWriter<CELL_TYPE> & object,const unsigned)172     static void serialize(ARCHIVE& archive, LibGeoDecomp::ParallelWriter<CELL_TYPE>& object, const unsigned /*version*/)
173     {
174         archive & object.period;
175         archive & object.prefix;
176         archive & object.region;
177     }
178 
179     template<typename ARCHIVE, int DIM>
180     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Region<DIM> & object,const unsigned)181     static void serialize(ARCHIVE& archive, LibGeoDecomp::Region<DIM>& object, const unsigned /*version*/)
182     {
183         archive & object.geometryCacheTainted;
184         archive & object.indices;
185         archive & object.myBoundingBox;
186         archive & object.mySize;
187     }
188 
189     template<typename ARCHIVE, typename CELL_TYPE>
190     inline
serialize(ARCHIVE & archive,LibGeoDecomp::SerialBOVWriter<CELL_TYPE> & object,const unsigned)191     static void serialize(ARCHIVE& archive, LibGeoDecomp::SerialBOVWriter<CELL_TYPE>& object, const unsigned /*version*/)
192     {
193         archive & boost::serialization::base_object<LibGeoDecomp::Clonable<Writer<CELL_TYPE >, SerialBOVWriter<CELL_TYPE > > >(object);
194         archive & object.brickletDim;
195         archive & object.selector;
196     }
197 
198     template<typename ARCHIVE, typename CELL, typename MEMBER, typename EXTERNAL>
199     inline
serialize(ARCHIVE & archive,LibGeoDecomp::SimpleFilter<CELL,MEMBER,EXTERNAL> & object,const unsigned)200     static void serialize(ARCHIVE& archive, LibGeoDecomp::SimpleFilter<CELL, MEMBER, EXTERNAL>& object, const unsigned /*version*/)
201     {
202         archive & boost::serialization::base_object<LibGeoDecomp::Filter<CELL, MEMBER, EXTERNAL > >(object);
203     }
204 
205     template<typename ARCHIVE, typename CELL_TYPE>
206     inline
serialize(ARCHIVE & archive,LibGeoDecomp::SimpleInitializer<CELL_TYPE> & object,const unsigned)207     static void serialize(ARCHIVE& archive, LibGeoDecomp::SimpleInitializer<CELL_TYPE>& object, const unsigned /*version*/)
208     {
209         archive & boost::serialization::base_object<LibGeoDecomp::Initializer<CELL_TYPE > >(object);
210         archive & object.dimensions;
211         archive & object.steps;
212     }
213 
214     template<typename ARCHIVE, typename CELL_TYPE>
215     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Steerer<CELL_TYPE> & object,const unsigned)216     static void serialize(ARCHIVE& archive, LibGeoDecomp::Steerer<CELL_TYPE>& object, const unsigned /*version*/)
217     {
218         archive & object.period;
219         archive & object.region;
220     }
221 
222     template<typename ARCHIVE, int DIM>
223     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Streak<DIM> & object,const unsigned)224     static void serialize(ARCHIVE& archive, LibGeoDecomp::Streak<DIM>& object, const unsigned /*version*/)
225     {
226         archive & object.endX;
227         archive & object.origin;
228     }
229 
230     template<typename ARCHIVE>
231     inline
serialize(ARCHIVE & archive,LibGeoDecomp::TracingBalancer & object,const unsigned)232     static void serialize(ARCHIVE& archive, LibGeoDecomp::TracingBalancer& object, const unsigned /*version*/)
233     {
234         archive & boost::serialization::base_object<LibGeoDecomp::LoadBalancer >(object);
235         archive & object.balancer;
236         archive & object.stream;
237     }
238 
239     template<typename ARCHIVE, typename CELL_TYPE>
240     inline
serialize(ARCHIVE & archive,LibGeoDecomp::TracingWriter<CELL_TYPE> & object,const unsigned)241     static void serialize(ARCHIVE& archive, LibGeoDecomp::TracingWriter<CELL_TYPE>& object, const unsigned /*version*/)
242     {
243         archive & boost::serialization::base_object<LibGeoDecomp::Clonable<ParallelWriter<CELL_TYPE >, TracingWriter<CELL_TYPE > > >(object);
244         archive & boost::serialization::base_object<LibGeoDecomp::Clonable<Writer<CELL_TYPE >, TracingWriter<CELL_TYPE > > >(object);
245         archive & object.lastStep;
246         archive & object.maxSteps;
247         archive & object.outputRank;
248         archive & object.startTime;
249         archive & object.stream;
250     }
251 
252     template<typename ARCHIVE, typename CELL_TYPE>
253     inline
serialize(ARCHIVE & archive,LibGeoDecomp::Writer<CELL_TYPE> & object,const unsigned)254     static void serialize(ARCHIVE& archive, LibGeoDecomp::Writer<CELL_TYPE>& object, const unsigned /*version*/)
255     {
256         archive & object.period;
257         archive & object.prefix;
258     }
259 
260 };
261 }
262 
263 namespace boost {
264 namespace serialization {
265 
266 using namespace LibGeoDecomp;
267 
268 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::Chronometer & object,const unsigned version)269 void serialize(ARCHIVE& archive, LibGeoDecomp::Chronometer& object, const unsigned version)
270 {
271     Serialization::serialize(archive, object, version);
272 }
273 
274 template<class ARCHIVE, typename BASE, typename IMPLEMENTATION>
serialize(ARCHIVE & archive,LibGeoDecomp::Clonable<BASE,IMPLEMENTATION> & object,const unsigned version)275 void serialize(ARCHIVE& archive, LibGeoDecomp::Clonable<BASE, IMPLEMENTATION>& object, const unsigned version)
276 {
277     Serialization::serialize(archive, object, version);
278 }
279 
280 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::Coord<1> & object,const unsigned version)281 void serialize(ARCHIVE& archive, LibGeoDecomp::Coord<1 >& object, const unsigned version)
282 {
283     Serialization::serialize(archive, object, version);
284 }
285 
286 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::Coord<2> & object,const unsigned version)287 void serialize(ARCHIVE& archive, LibGeoDecomp::Coord<2 >& object, const unsigned version)
288 {
289     Serialization::serialize(archive, object, version);
290 }
291 
292 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::Coord<3> & object,const unsigned version)293 void serialize(ARCHIVE& archive, LibGeoDecomp::Coord<3 >& object, const unsigned version)
294 {
295     Serialization::serialize(archive, object, version);
296 }
297 
298 template<class ARCHIVE, int DIM>
serialize(ARCHIVE & archive,LibGeoDecomp::CoordBox<DIM> & object,const unsigned version)299 void serialize(ARCHIVE& archive, LibGeoDecomp::CoordBox<DIM>& object, const unsigned version)
300 {
301     Serialization::serialize(archive, object, version);
302 }
303 
304 template<class ARCHIVE, typename CELL, typename MEMBER, typename EXTERNAL>
serialize(ARCHIVE & archive,LibGeoDecomp::DefaultFilter<CELL,MEMBER,EXTERNAL> & object,const unsigned version)305 void serialize(ARCHIVE& archive, LibGeoDecomp::DefaultFilter<CELL, MEMBER, EXTERNAL>& object, const unsigned version)
306 {
307     Serialization::serialize(archive, object, version);
308 }
309 
310 template<class ARCHIVE, typename CELL, typename MEMBER, typename EXTERNAL, int ARITY>
serialize(ARCHIVE & archive,LibGeoDecomp::Filter<CELL,MEMBER,EXTERNAL,ARITY> & object,const unsigned version)311 void serialize(ARCHIVE& archive, LibGeoDecomp::Filter<CELL, MEMBER, EXTERNAL, ARITY>& object, const unsigned version)
312 {
313     Serialization::serialize(archive, object, version);
314 }
315 
316 template<class ARCHIVE, typename CELL>
serialize(ARCHIVE & archive,LibGeoDecomp::FilterBase<CELL> & object,const unsigned version)317 void serialize(ARCHIVE& archive, LibGeoDecomp::FilterBase<CELL>& object, const unsigned version)
318 {
319     Serialization::serialize(archive, object, version);
320 }
321 
322 template<class ARCHIVE, typename T, int SIZE>
serialize(ARCHIVE & archive,LibGeoDecomp::FixedArray<T,SIZE> & object,const unsigned version)323 void serialize(ARCHIVE& archive, LibGeoDecomp::FixedArray<T, SIZE>& object, const unsigned version)
324 {
325     Serialization::serialize(archive, object, version);
326 }
327 
328 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::FloatCoord<1> & object,const unsigned version)329 void serialize(ARCHIVE& archive, LibGeoDecomp::FloatCoord<1 >& object, const unsigned version)
330 {
331     Serialization::serialize(archive, object, version);
332 }
333 
334 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::FloatCoord<2> & object,const unsigned version)335 void serialize(ARCHIVE& archive, LibGeoDecomp::FloatCoord<2 >& object, const unsigned version)
336 {
337     Serialization::serialize(archive, object, version);
338 }
339 
340 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::FloatCoord<3> & object,const unsigned version)341 void serialize(ARCHIVE& archive, LibGeoDecomp::FloatCoord<3 >& object, const unsigned version)
342 {
343     Serialization::serialize(archive, object, version);
344 }
345 
346 template<class ARCHIVE, typename CELL_TYPE, typename CONVERTER>
serialize(ARCHIVE & archive,LibGeoDecomp::HpxWriterCollector<CELL_TYPE,CONVERTER> & object,const unsigned version)347 void serialize(ARCHIVE& archive, LibGeoDecomp::HpxWriterCollector<CELL_TYPE, CONVERTER>& object, const unsigned version)
348 {
349     Serialization::serialize(archive, object, version);
350 }
351 
352 template<class ARCHIVE, typename CELL>
serialize(ARCHIVE & archive,LibGeoDecomp::Initializer<CELL> & object,const unsigned version)353 void serialize(ARCHIVE& archive, LibGeoDecomp::Initializer<CELL>& object, const unsigned version)
354 {
355     Serialization::serialize(archive, object, version);
356 }
357 
358 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::LoadBalancer & object,const unsigned version)359 void serialize(ARCHIVE& archive, LibGeoDecomp::LoadBalancer& object, const unsigned version)
360 {
361     Serialization::serialize(archive, object, version);
362 }
363 
364 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::NonPoDTestCell & object,const unsigned version)365 void serialize(ARCHIVE& archive, LibGeoDecomp::NonPoDTestCell& object, const unsigned version)
366 {
367     Serialization::serialize(archive, object, version);
368 }
369 
370 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::OozeBalancer & object,const unsigned version)371 void serialize(ARCHIVE& archive, LibGeoDecomp::OozeBalancer& object, const unsigned version)
372 {
373     Serialization::serialize(archive, object, version);
374 }
375 
376 template<class ARCHIVE, typename CELL_TYPE>
serialize(ARCHIVE & archive,LibGeoDecomp::ParallelWriter<CELL_TYPE> & object,const unsigned version)377 void serialize(ARCHIVE& archive, LibGeoDecomp::ParallelWriter<CELL_TYPE>& object, const unsigned version)
378 {
379     Serialization::serialize(archive, object, version);
380 }
381 
382 template<class ARCHIVE, int DIM>
serialize(ARCHIVE & archive,LibGeoDecomp::Region<DIM> & object,const unsigned version)383 void serialize(ARCHIVE& archive, LibGeoDecomp::Region<DIM>& object, const unsigned version)
384 {
385     Serialization::serialize(archive, object, version);
386 }
387 
388 template<class ARCHIVE, typename CELL_TYPE>
serialize(ARCHIVE & archive,LibGeoDecomp::SerialBOVWriter<CELL_TYPE> & object,const unsigned version)389 void serialize(ARCHIVE& archive, LibGeoDecomp::SerialBOVWriter<CELL_TYPE>& object, const unsigned version)
390 {
391     Serialization::serialize(archive, object, version);
392 }
393 
394 template<class ARCHIVE, typename CELL, typename MEMBER, typename EXTERNAL>
serialize(ARCHIVE & archive,LibGeoDecomp::SimpleFilter<CELL,MEMBER,EXTERNAL> & object,const unsigned version)395 void serialize(ARCHIVE& archive, LibGeoDecomp::SimpleFilter<CELL, MEMBER, EXTERNAL>& object, const unsigned version)
396 {
397     Serialization::serialize(archive, object, version);
398 }
399 
400 template<class ARCHIVE, typename CELL_TYPE>
serialize(ARCHIVE & archive,LibGeoDecomp::SimpleInitializer<CELL_TYPE> & object,const unsigned version)401 void serialize(ARCHIVE& archive, LibGeoDecomp::SimpleInitializer<CELL_TYPE>& object, const unsigned version)
402 {
403     Serialization::serialize(archive, object, version);
404 }
405 
406 template<class ARCHIVE, typename CELL_TYPE>
serialize(ARCHIVE & archive,LibGeoDecomp::Steerer<CELL_TYPE> & object,const unsigned version)407 void serialize(ARCHIVE& archive, LibGeoDecomp::Steerer<CELL_TYPE>& object, const unsigned version)
408 {
409     Serialization::serialize(archive, object, version);
410 }
411 
412 template<class ARCHIVE, int DIM>
serialize(ARCHIVE & archive,LibGeoDecomp::Streak<DIM> & object,const unsigned version)413 void serialize(ARCHIVE& archive, LibGeoDecomp::Streak<DIM>& object, const unsigned version)
414 {
415     Serialization::serialize(archive, object, version);
416 }
417 
418 template<class ARCHIVE>
serialize(ARCHIVE & archive,LibGeoDecomp::TracingBalancer & object,const unsigned version)419 void serialize(ARCHIVE& archive, LibGeoDecomp::TracingBalancer& object, const unsigned version)
420 {
421     Serialization::serialize(archive, object, version);
422 }
423 
424 template<class ARCHIVE, typename CELL_TYPE>
serialize(ARCHIVE & archive,LibGeoDecomp::TracingWriter<CELL_TYPE> & object,const unsigned version)425 void serialize(ARCHIVE& archive, LibGeoDecomp::TracingWriter<CELL_TYPE>& object, const unsigned version)
426 {
427     Serialization::serialize(archive, object, version);
428 }
429 
430 template<class ARCHIVE, typename CELL_TYPE>
serialize(ARCHIVE & archive,LibGeoDecomp::Writer<CELL_TYPE> & object,const unsigned version)431 void serialize(ARCHIVE& archive, LibGeoDecomp::Writer<CELL_TYPE>& object, const unsigned version)
432 {
433     Serialization::serialize(archive, object, version);
434 }
435 
436 
437 }
438 }
439 
440 #endif
441 
442 #endif
443