util.hh

Go to the documentation of this file.
00001 #ifndef UTIL_HH
00002 #define UTIL_HH
00003 
00004 #include <stdexcept>
00005 #include <vector>
00006 #include <stdio.h>
00007 
00008 namespace util {
00009 
00011   class io_error : public std::runtime_error
00012   {
00013   public:
00014     explicit io_error(const std::string&  __arg) 
00015       : runtime_error(__arg) { }
00016   };
00017 
00018   template <typename T>
00019   void write_vec_raw(FILE *file, const std::vector<T> &vec)
00020   {
00021     fprintf(file, "%zd:", vec.size());
00022     size_t ret = fwrite(&vec[0], sizeof(vec[0]), vec.size(), file);
00023     if (ret != vec.size())
00024       throw io_error("bit::Kneser::write_vec_raw() failed");
00025   }
00026 
00027   template <typename T>
00028   void read_vec_raw(FILE *file, std::vector<T> &vec)
00029   {
00030     size_t size;
00031     {
00032       int ret = fscanf(file, "%zd:", &size);
00033       if (ret != 1)
00034         throw io_error("bit::Kneser::read_vec_raw() failed");
00035     }
00036     vec.resize(size);
00037     if (size == 0)
00038       return;
00039     size_t ret = fread(&vec[0], sizeof(vec[0]), vec.size(), file);
00040     if (ret != vec.size())
00041       throw io_error("bit::Kneser::read_vec_raw() failed");
00042   }
00043 
00044 
00045   template <typename T>
00046   void write(FILE *file, const std::vector<T> &vec)
00047   {
00048     fprintf(file, "%zd:", vec.size());
00049     for (size_t i = 0; i < vec.size(); i++)
00050       util::write(file, vec[i]);
00051     if (ferror(file))
00052       throw io_error("bit::Kneser::write() failed");
00053   }
00054 
00055   template <typename T>
00056   void read(FILE *file, std::vector<T> &vec)
00057   {
00058     size_t size;
00059     int ret = fscanf(file, "%zd:", &size);
00060     if (ret != 1)
00061       throw io_error("bit::Kneser::read() failed");
00062     vec.resize(size);
00063     if (size == 0)
00064       return;
00065     for (size_t i = 0; i < vec.size(); i++)
00066       util::read(file, vec[i]);
00067   }
00068 
00069   template <>
00070   void write(FILE *file, const std::vector<int> &vec)
00071   {
00072     write_vec_raw(file, vec);
00073   }
00074 
00075   template <>
00076   void read(FILE *file, std::vector<int> &vec)
00077   {
00078     read_vec_raw(file, vec);
00079   }
00080 
00081   template <>
00082   void write(FILE *file, const std::vector<float> &vec)
00083   {
00084     write_vec_raw(file, vec);
00085   }
00086 
00087   template <>
00088   void read(FILE *file, std::vector<float> &vec)
00089   {
00090     read_vec_raw(file, vec);
00091   }
00092 
00093 };
00094 
00095 #endif /* UTIL_HH */

Generated on Mon Jan 8 15:51:03 2007 for bit by  doxygen 1.4.6