#ifndef _FILELIB_H_ #define _FILELIB_H_ #include #include #include #include #include #include "gzstream.h" bool FileExists(const std::string& file_name); bool DirectoryExists(const std::string& dir_name); // reads from standard in if filename is - // uncompresses if file ends with .gz // otherwise, reads from a normal file struct file_null_deleter { void operator()(void*) const {} }; template struct BaseFile { typedef Stream S; typedef boost::shared_ptr PS; void Reset() { ps_.reset(); } bool is_null() const { return !ps_; } operator bool() const { return ps_; } S* stream() { return ps_.get(); } S* operator->() { return ps_.get(); } // compat with old ReadFile * -> new Readfile. remove? S &get() const { return *ps_; } bool is_std() { return filename_=="-"; } std::string filename_; protected: PS ps_; static bool EndsWith(const std::string& f, const std::string& suf) { return (f.size() > suf.size()) && (f.rfind(suf) == f.size() - suf.size()); } }; class ReadFile : public BaseFile { public: ReadFile() { } explicit ReadFile(const std::string& filename) { Init(filename); } void Init(const std::string& filename) { filename_=filename; if (is_std()) { ps_=PS(&std::cin,file_null_deleter()); } else { if (!FileExists(filename)) { std::cerr << "File does not exist: " << filename << std::endl; abort(); } ps_.reset(EndsWith(filename, ".gz") ? static_cast(new igzstream(filename.c_str())) : static_cast(new std::ifstream(filename.c_str()))); if (!*ps_) { std::cerr << "Failed to open " << filename << std::endl; abort(); } } } }; class WriteFile : public BaseFile { public: WriteFile() {} explicit WriteFile(std::string const& filename) { Init(filename); } void Init(const std::string& filename) { filename_=filename; if (is_std()) { ps_=PS(&std::cout,file_null_deleter()); } else { ps_.reset(EndsWith(filename, ".gz") ? static_cast(new ogzstream(filename.c_str())) : static_cast(new std::ofstream(filename.c_str()))); if (!*ps_) { std::cerr << "Failed to open " << filename << std::endl; abort(); } } } ~WriteFile() { if (ps_) get() << std::flush; } }; #endif