1 // This is core/vgl/io/vgl_io_box_3d.hxx
2 #ifndef vgl_io_box_3d_hxx_
3 #define vgl_io_box_3d_hxx_
4 //:
5 // \file
6 
7 #include <iostream>
8 #include "vgl_io_box_3d.h"
9 #include <vgl/vgl_box_3d.h>
10 #include <vsl/vsl_binary_io.h>
11 
12 //============================================================================
13 //: Binary save self to stream.
14 template<class T>
vsl_b_write(vsl_b_ostream & os,const vgl_box_3d<T> & p)15 void vsl_b_write(vsl_b_ostream &os, const vgl_box_3d<T> & p)
16 {
17   constexpr short io_version_no = 1;
18   vsl_b_write(os, io_version_no);
19   vsl_b_write(os, p.min_x());
20   vsl_b_write(os, p.min_y());
21   vsl_b_write(os, p.min_z());
22   vsl_b_write(os, p.max_x());
23   vsl_b_write(os, p.max_y());
24   vsl_b_write(os, p.max_z());
25 }
26 
27 //============================================================================
28 //: Binary load self from stream.
29 template<class T>
vsl_b_read(vsl_b_istream & is,vgl_box_3d<T> & p)30 void vsl_b_read(vsl_b_istream &is, vgl_box_3d<T> & p)
31 {
32   if (!is) return;
33 
34   short v;
35   T min_pos[3];
36   T max_pos[3];
37   vsl_b_read(is, v);
38   switch (v)
39   {
40    case 1:
41     vsl_b_read(is, min_pos[0]);
42     vsl_b_read(is, min_pos[1]);
43     vsl_b_read(is, min_pos[2]);
44     vsl_b_read(is, max_pos[0]);
45     vsl_b_read(is, max_pos[1]);
46     vsl_b_read(is, max_pos[2]);
47     p.set_min_position(min_pos);
48     p.set_max_position(max_pos);
49     break;
50 
51    default:
52     std::cerr << "I/O ERROR: vsl_b_read(vsl_b_istream&, vgl_box_3d<T>&)\n"
53              << "           Unknown version number "<< v << '\n';
54     is.is().clear(std::ios::badbit); // Set an unrecoverable IO error on stream
55     return;
56   }
57 }
58 
59 //============================================================================
60 //: Output a human readable summary to the stream
61 template<class T>
vsl_print_summary(std::ostream & os,const vgl_box_3d<T> & p)62 void vsl_print_summary(std::ostream& os,const vgl_box_3d<T> & p)
63 {
64   if (p.is_empty())
65     os<<"Empty 3d box\n";
66   else
67     os<<"3d box with opposite corners at ("
68       <<p.min_x() << ',' << p.min_y() << ',' << p.min_z() <<") and ("
69       <<p.max_x() << ',' << p.max_y() << ',' << p.max_z() <<")\n";
70 }
71 
72 #define VGL_IO_BOX_3D_INSTANTIATE(T) \
73 template void vsl_print_summary(std::ostream &, const vgl_box_3d<T > &); \
74 template void vsl_b_read(vsl_b_istream &, vgl_box_3d<T > &); \
75 template void vsl_b_write(vsl_b_ostream &, const vgl_box_3d<T > &)
76 
77 #endif // vgl_io_box_3d_hxx_
78