vsl_map_io.hxx
Go to the documentation of this file.
1 // This is core/vsl/vsl_map_io.hxx
2 #ifndef vsl_map_io_hxx_
3 #define vsl_map_io_hxx_
4 //:
5 // \file
6 // \brief Implementation binary IO functions for vcl_(multi)map<Key, T, Compare>
7 // \author K.Y.McGaul
8 //
9 // \verbatim
10 // Modifications
11 // IMS - 22 June 2001 - Added IO for multimap
12 // \endverbatim
13 
14 #include <iostream>
15 #include "vsl_map_io.h"
16 #include <vsl/vsl_binary_io.h>
17 #include <vsl/vsl_indent.h>
18 #include <vsl/vsl_pair_io.h>
19 
20 //====================================================================================
21 //: Write map to binary stream
22 template <class Key, class T, class Compare>
23 void vsl_b_write(vsl_b_ostream& s, const std::map<Key, T, Compare>& v)
24 {
25  constexpr short version_no = 1;
27  vsl_b_write(s, v.size());
28  for (typename std::map<Key, T, Compare>::const_iterator iter = v.begin(); iter != v.end(); iter++)
29  {
30  vsl_b_write(s,(*iter).first);
31  vsl_b_write(s,(*iter).second);
32  }
33 }
34 
35 //====================================================================================
36 //: Read map from binary stream
37 template <class Key, class T, class Compare>
38 void vsl_b_read(vsl_b_istream& is, std::map<Key, T, Compare>& v)
39 {
40  if (!is) return;
41 
42  v.clear();
43  unsigned map_size;
44  short ver;
45  vsl_b_read(is, ver);
46  switch (ver)
47  {
48  case 1:
49  vsl_b_read(is, map_size);
50  for (unsigned i=0; i<map_size; i++)
51  {
52  Key first_val;
53  T second_val;
54  vsl_b_read(is, first_val);
55  vsl_b_read(is, second_val);
56  v[first_val] = second_val;
57  }
58  break;
59  default:
60  std::cerr << "I/O ERROR: vsl_b_read(vsl_b_istream&, std::map<K, T>&)\n"
61  << " Unknown version number "<< ver << '\n';
62  is.is().clear(std::ios::badbit); // Set an unrecoverable IO error on stream
63  return;
64  }
65 }
66 
67 //====================================================================================
68 //: Output a human readable summary to the stream
69 template <class Key, class T, class Compare>
70 void vsl_print_summary(std::ostream& os, const std::map<Key, T, Compare> &v)
71 {
72  os << "Map size: " << v.size() << '\n';
73  unsigned i=0;
74  for (typename std::map<Key, T, Compare>::const_iterator iter = v.begin();
75  iter != v.end() && i< 5; ++iter,++i)
76  {
77  os << vsl_indent() << ' ' << i << ": ";
78  vsl_print_summary(os, (*iter).first);
79  os << ", ";
80  vsl_indent_inc(os);
81  vsl_print_summary(os, (*iter).second);
82  os << '\n';
83  vsl_indent_dec(os);
84  }
85  if (v.size() > 5)
86  os << " ...\n";
87 }
88 
89 
90 #define VSL_MAP_IO_INSTANTIATE(Key, T, Compare) \
91 template void vsl_print_summary(std::ostream&, const std::map<Key, T, Compare >&); \
92 template void vsl_b_write(vsl_b_ostream& s, const std::map<Key, T, Compare >& v); \
93 template void vsl_b_read(vsl_b_istream& s, std::map<Key, T, Compare >& v)
94 
95 //====================================================================================
96 //: Write multimap to binary stream
97 template <class Key, class T, class Compare>
98 void vsl_b_write(vsl_b_ostream& s, const std::multimap<Key, T, Compare>& v)
99 {
100  constexpr short version_no = 1;
102  vsl_b_write(s, v.size());
103  for (typename std::multimap<Key, T, Compare>::const_iterator iter = v.begin();
104  iter != v.end(); iter++)
105  {
106  vsl_b_write(s,(*iter).first);
107  vsl_b_write(s,(*iter).second);
108  }
109 }
110 
111 //====================================================================================
112 //: Read multimap from binary stream
113 template <class Key, class T, class Compare>
114 void vsl_b_read(vsl_b_istream& is, std::multimap<Key, T, Compare>& v)
115 {
116  if (!is) return;
117 
118  v.clear();
119  unsigned multimap_size;
120  short ver;
121  vsl_b_read(is, ver);
122  switch (ver)
123  {
124  case 1:
125  vsl_b_read(is, multimap_size);
126  for (unsigned i=0; i<multimap_size; i++)
127  {
128  Key first_val;
129  T second_val;
130  vsl_b_read(is, first_val);
131  vsl_b_read(is, second_val);
132  v.insert( std::make_pair(first_val, second_val));
133  }
134  break;
135  default:
136  std::cerr << "I/O ERROR: vsl_b_read(vsl_b_istream&, std::multimap<K, T>&)\n"
137  << " Unknown version number "<< ver << '\n';
138  is.is().clear(std::ios::badbit); // Set an unrecoverable IO error on stream
139  return;
140  }
141 }
142 
143 //====================================================================================
144 //: Output a human readable summary to the stream
145 template <class Key, class T, class Compare>
146 void vsl_print_summary(std::ostream& os, const std::multimap<Key, T, Compare> &v)
147 {
148  os << "multimap size: " << v.size() << '\n';
149  unsigned i=0;
150  for (typename std::multimap<Key, T, Compare>::const_iterator iter = v.begin();
151  iter != v.end() && i< 5; ++iter,++i)
152  {
153  os << ' ' << i << ": ";
154  vsl_print_summary(os, (*iter).first);
155  os << ", ";
156  vsl_print_summary(os, (*iter).second);
157  os << '\n';
158  }
159  if (v.size() > 5)
160  os << " ...\n";
161 }
162 
163 
164 #define VSL_MULTIMAP_IO_INSTANTIATE(Key, T, Compare) \
165 template void vsl_print_summary(std::ostream&, const std::multimap<Key, T, Compare >&); \
166 template void vsl_b_write(vsl_b_ostream& s, const std::multimap<Key, T, Compare >& v); \
167 template void vsl_b_read(vsl_b_istream& s, std::multimap<Key, T, Compare >& v)
168 
169 #endif // vsl_map_io_hxx_
void vsl_print_summary(std::ostream &os, const std::map< Key, T, Compare > &v)
Output a human readable summary to the stream.
Definition: vsl_map_io.hxx:70
A binary output adaptor for any std::ostream.
Definition: vsl_binary_io.h:37
unsigned short version_no() const
Return the version number of the IO format of the file being read.
std::istream & is() const
A reference to the adaptor's stream.
void vsl_b_read(vsl_b_istream &is, std::map< Key, T, Compare > &v)
Read map from binary stream.
Definition: vsl_map_io.hxx:38
binary IO functions for std::map<Key, T, Compare>
void vsl_indent_inc(std::ostream &os)
Increments current indent for given stream.
Definition: vsl_indent.cxx:38
Put indents into output streams, to produce more legible printed output.
Definition: vsl_indent.h:88
void vsl_indent_dec(std::ostream &os)
Decrements current indent for given stream.
Definition: vsl_indent.cxx:44
An adaptor for any std::istream to make it suitable for binary input.
void vsl_b_write(vsl_b_ostream &s, const std::map< Key, T, Compare > &v)
Write map to binary stream.
Definition: vsl_map_io.hxx:23
Set of functions, and objects to perform binary IO.
binary IO functions for std::pair<S, T>