/* This file is part of Jellyfish. Jellyfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jellyfish is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Jellyfish. If not, see . */ #ifndef __JELLYFISH_FSTREAM_WITH_DEFAULT_HPP__ #define __JELLYFISH_FSTREAM_WITH_DEFAULT_HPP__ #include #include template class fstream_default : public Base { typedef Base super; static std::streambuf* open_file(const char* str, std::ios_base::openmode mode) { std::filebuf* fb = new std::filebuf; return fb->open(str, mode); } static std::streambuf* get_streambuf(const char* str, Base& def, std::ios_base::openmode mode) { return (str != 0) ? open_file(str, mode) : def.rdbuf(); } static std::streambuf* get_streambuf(const char* str, std::streambuf* buf, std::ios_base::openmode mode) { return (str != 0) ? open_file(str, mode) : buf; } bool do_close; public: fstream_default(const char* str, Base& def, std::ios_base::openmode mode = def_mode) : Base(get_streambuf(str, def, mode)), do_close(str != 0) { if(Base::rdbuf() == 0) Base::setstate(std::ios_base::badbit); } fstream_default(const char* str, std::streambuf* def, std::ios_base::openmode mode = def_mode) : Base(get_streambuf(str, def, mode)), do_close(str != 0) { if(Base::rdbuf() == 0) Base::setstate(std::ios_base::badbit); } ~fstream_default() { if(do_close) { delete Base::rdbuf(0); do_close = false; } } // Close is a noop at this point as GCC 4.4 has a problem with // Base::rdbuf in methods (breaks strict aliasing). Beats me! I // think it is a false positive. void close() {} }; typedef fstream_default ofstream_default; typedef fstream_default ifstream_default; #endif // __JELLYFISH_FSTREAM_WITH_DEFAULT_HPP__