00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_IO_GZ_HH
00029 # define OLENA_IO_GZ_HH
00030
00031 # include <oln/io/stream_wrapper.hh>
00032 # include <oln/io/gz_stream.hh>
00033
00034 namespace oln {
00035
00036 namespace io {
00037
00038 namespace internal {
00039
00040
00046 template<>
00047 struct stream_wrapper<StreamGz>
00048 {
00049
00051
00052 static const std::string&
00053 name()
00054 {
00055 static const std::string name_("gz:");
00056 return name_;
00057 }
00058
00060
00061 static bool
00062 knows_ext(const std::string& ext)
00063 {
00064 return ext == "gz" || ext == "z";
00065 }
00066
00067
00069 static void
00070 adjust_name(std::string& name)
00071 {
00072 std::string ext = utils::extension(name);
00073 if (knows_ext(ext))
00074 name.erase(name.rfind('.'));
00075 }
00076
00081 static std::istream*
00082 wrap_in(std::string& name)
00083 {
00084 gz::zifstream* in = new gz::zifstream(name.c_str());
00085 if (!in->fail())
00086 {
00087 adjust_name(name);
00088 return in;
00089 }
00090 delete in;
00091 return 0;
00092 }
00093
00097 static std::ostream*
00098 wrap_out(std::string& name)
00099 {
00100 gz::zofstream* out = new gz::zofstream(name.c_str());
00101 if (!out->fail())
00102 {
00103 adjust_name(name);
00104 return out;
00105 }
00106 delete out;
00107 return 0;
00108 }
00109
00110 static void
00111 find(std::list<std::string>&, const std::string&)
00112 {}
00113 };
00114
00115 }
00116
00117 }
00118
00119 }
00120
00121 #endif // ! OLENA_IO_GZ_HH