00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef IMP_FILE_H
00010 #define IMP_FILE_H
00011
00012 #include "kernel_config.h"
00013 #include "Pointer.h"
00014 #include "macros.h"
00015 #include "internal/ifile.h"
00016 #include <fstream>
00017 #include <iostream>
00018
00019 IMP_BEGIN_NAMESPACE
00020
00021 class Object;
00022
00023 #if !defined(IMP_DOXYGEN)
00024 template <class Stream>
00025 struct TextProxy {
00026 Stream *str_;
00027 Pointer<Object> ptr_;
00028 TextProxy(Stream *str, Object *ptr): str_(str), ptr_(ptr){}
00029 };
00030 #endif
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 class IMPEXPORT TextOutput
00047 {
00048 Pointer<internal::IOStorage<std::ostream> > out_;
00049 public:
00050 #ifndef IMP_DOXYGEN
00051
00052 TextOutput(int);
00053 TextOutput(double);
00054 TextOutput(const char *c);
00055 TextOutput(TextProxy<std::ostream> p);
00056 #endif
00057 TextOutput(){}
00058 TextOutput(std::string file_name);
00059 #ifndef SWIG
00060 TextOutput(std::ostream &out, std::string name="C++ stream");
00061 #endif
00062
00063 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
00064 operator std::ostream &() {
00065 return get_stream();
00066 }
00067 operator bool () {
00068 return out_ && out_->get_stream();
00069 }
00070 std::ostream &get_stream() {
00071 if (!out_) {
00072 IMP_THROW("Attempting to write to uninitialized text input",
00073 IOException);
00074 }
00075 return out_->get_stream();
00076 }
00077 #endif
00078 std::string get_name() const {
00079 return out_->get_name();
00080 }
00081 };
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 class IMPEXPORT TextInput
00095 {
00096 Pointer<internal::IOStorage<std::istream> > in_;
00097 public:
00098 #ifndef IMP_DOXYGEN
00099
00100 TextInput(int);
00101 TextInput(double);
00102 TextInput(const char *c);
00103 TextInput(TextProxy<std::istream> p);
00104 #endif
00105 TextInput(){}
00106 TextInput(std::string file_name);
00107 #ifndef SWIG
00108 TextInput(std::istream &out, std::string name="C++ stream");
00109 #endif
00110
00111 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
00112 operator std::istream &() {
00113 return get_stream();
00114 }
00115 operator bool () {
00116 return in_ && in_->get_stream();
00117 }
00118 std::istream &get_stream() {
00119 if (!in_) {
00120 IMP_THROW("Attempting to read from uninitialized text input",
00121 IOException);
00122 }
00123 return in_->get_stream();
00124 }
00125 #endif
00126 std::string get_name() const {
00127 return in_->get_name();
00128 }
00129 };
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 #ifndef SWIG
00140 IMPEXPORT void set_log_target(TextOutput l);
00141 IMPEXPORT TextOutput get_log_target();
00142 #endif
00143
00144
00145
00146
00147
00148
00149 class SetLogTarget: public RAII {
00150
00151
00152
00153
00154
00155
00156 TextOutput old_;
00157 public:
00158 IMP_RAII(SetLogTarget, (TextOutput to),
00159 old_=get_log_target();,
00160 set_log_target(to);,
00161 set_log_target(old_););
00162 };
00163
00164
00165 IMP_VALUES(TextInput);
00166 IMP_VALUES(TextOutput);
00167
00168 IMP_END_NAMESPACE
00169
00170 #endif