core/vsl/vsl_map_io.txx

Go to the documentation of this file.
00001 // This is core/vsl/vsl_map_io.txx
00002 #ifndef vsl_map_io_txx_
00003 #define vsl_map_io_txx_
00004 //:
00005 // \file
00006 // \brief Implementation binary IO functions for vcl_(multi)map<Key, T, Compare>
00007 // \author K.Y.McGaul
00008 //
00009 // \verbatim
00010 //  Modifications
00011 //   IMS - 22 June 2001 - Added IO for multimap
00012 // \endverbatim
00013 
00014 #include "vsl_map_io.h"
00015 #include <vsl/vsl_binary_io.h>
00016 
00017 //====================================================================================
00018 //: Write map to binary stream
00019 template <class Key, class T, class Compare>
00020 void vsl_b_write(vsl_b_ostream& s, const vcl_map<Key, T, Compare>& v)
00021 {
00022   const short version_no = 1;
00023   vsl_b_write(s, version_no);
00024   vsl_b_write(s, v.size());
00025   for (typename vcl_map<Key, T, Compare>::const_iterator iter = v.begin(); iter != v.end(); iter++)
00026   {
00027     vsl_b_write(s,(*iter).first);
00028     vsl_b_write(s,(*iter).second);
00029   }
00030 }
00031 
00032 //====================================================================================
00033 //: Read map from binary stream
00034 template <class Key, class T, class Compare>
00035 void vsl_b_read(vsl_b_istream& is, vcl_map<Key, T, Compare>& v)
00036 {
00037   if (!is) return;
00038 
00039   v.clear();
00040   unsigned map_size;
00041   short ver;
00042   vsl_b_read(is, ver);
00043   switch (ver)
00044   {
00045   case 1:
00046     vsl_b_read(is, map_size);
00047     for (unsigned i=0; i<map_size; i++)
00048     {
00049       Key first_val;
00050       T second_val;
00051       vsl_b_read(is, first_val);
00052       vsl_b_read(is, second_val);
00053       v[first_val] = second_val;
00054     }
00055     break;
00056   default:
00057     vcl_cerr << "I/O ERROR: vsl_b_read(vsl_b_istream&, vcl_map<K, T>&)\n"
00058              << "           Unknown version number "<< ver << '\n';
00059     is.is().clear(vcl_ios::badbit); // Set an unrecoverable IO error on stream
00060     return;
00061   }
00062 }
00063 
00064 //====================================================================================
00065 //: Output a human readable summary to the stream
00066 template <class Key, class T, class Compare>
00067 void vsl_print_summary(vcl_ostream& os, const vcl_map<Key, T, Compare> &v)
00068 {
00069   os << "Map size: " << v.size() << vcl_endl;
00070   unsigned i=0;
00071   for (typename vcl_map<Key, T, Compare>::const_iterator iter = v.begin();
00072        iter != v.end() && i< 5; ++iter,++i)
00073   {
00074     os << ' ' << i << ": ";
00075     vsl_print_summary(os, (*iter).first);
00076     os << ", ";
00077     vsl_print_summary(os, (*iter).second);
00078     os << vcl_endl;
00079   }
00080   if (v.size() > 5)
00081     os << " ...\n";
00082 }
00083 
00084 
00085 #define VSL_MAP_IO_INSTANTIATE(Key, T, Compare) \
00086 template void vsl_print_summary(vcl_ostream&, const vcl_map<Key, T, Compare >&); \
00087 template void vsl_b_write(vsl_b_ostream& s, const vcl_map<Key, T, Compare >& v); \
00088 template void vsl_b_read(vsl_b_istream& s, vcl_map<Key, T, Compare >& v)
00089 
00090 //====================================================================================
00091 //: Write multimap to binary stream
00092 template <class Key, class T, class Compare>
00093 void vsl_b_write(vsl_b_ostream& s, const vcl_multimap<Key, T, Compare>& v)
00094 {
00095   const short version_no = 1;
00096   vsl_b_write(s, version_no);
00097   vsl_b_write(s, v.size());
00098   for (typename vcl_multimap<Key, T, Compare>::const_iterator iter = v.begin();
00099        iter != v.end(); iter++)
00100   {
00101     vsl_b_write(s,(*iter).first);
00102     vsl_b_write(s,(*iter).second);
00103   }
00104 }
00105 
00106 //====================================================================================
00107 //: Read multimap from binary stream
00108 template <class Key, class T, class Compare>
00109 void vsl_b_read(vsl_b_istream& is, vcl_multimap<Key, T, Compare>& v)
00110 {
00111   if (!is) return;
00112 
00113   v.clear();
00114   unsigned multimap_size;
00115   short ver;
00116   vsl_b_read(is, ver);
00117   switch (ver)
00118   {
00119   case 1:
00120     vsl_b_read(is, multimap_size);
00121     for (unsigned i=0; i<multimap_size; i++)
00122     {
00123       Key first_val;
00124       T second_val;
00125       vsl_b_read(is, first_val);
00126       vsl_b_read(is, second_val);
00127       v.insert( vcl_make_pair(first_val, second_val));
00128     }
00129     break;
00130   default:
00131     vcl_cerr << "I/O ERROR: vsl_b_read(vsl_b_istream&, vcl_multimap<K, T>&)\n"
00132              << "           Unknown version number "<< ver << '\n';
00133     is.is().clear(vcl_ios::badbit); // Set an unrecoverable IO error on stream
00134     return;
00135   }
00136 }
00137 
00138 //====================================================================================
00139 //: Output a human readable summary to the stream
00140 template <class Key, class T, class Compare>
00141 void vsl_print_summary(vcl_ostream& os, const vcl_multimap<Key, T, Compare> &v)
00142 {
00143   os << "multimap size: " << v.size() << vcl_endl;
00144   unsigned i=0;
00145   for (typename vcl_multimap<Key, T, Compare>::const_iterator iter = v.begin();
00146        iter != v.end() && i< 5; ++iter,++i)
00147   {
00148     os << ' ' << i << ": ";
00149     vsl_print_summary(os, (*iter).first);
00150     os << ", ";
00151     vsl_print_summary(os, (*iter).second);
00152     os << vcl_endl;
00153   }
00154   if (v.size() > 5)
00155     os << " ...\n";
00156 }
00157 
00158 
00159 #define VSL_MULTIMAP_IO_INSTANTIATE(Key, T, Compare) \
00160 template void vsl_print_summary(vcl_ostream&, const vcl_multimap<Key, T, Compare >&); \
00161 template void vsl_b_write(vsl_b_ostream& s, const vcl_multimap<Key, T, Compare >& v); \
00162 template void vsl_b_read(vsl_b_istream& s, vcl_multimap<Key, T, Compare >& v)
00163 
00164 #endif // vsl_map_io_txx_

Generated on Fri Aug 29 05:05:52 2008 for core/vsl by  doxygen 1.5.1