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