00001
00002
00003
00004 #include <fstream.h>
00005 #include <string>
00006 #include <strstream.h>
00007
00008 #include "Utility/safe-file.h"
00009 #include "IO/control-device.h"
00010 #include "IO/istream-control-device.h"
00011 #include "IO/multi-istream-control-device.h"
00012 #include "IO/command-line.h"
00013
00014 #include "Utility/pre-post-conditions.h"
00015
00016 std::string Mutator::description() const { return std::string("");}
00017
00018
00019 void ControlDevice::update() { impl->update(); print_unrecognized(cerr);}
00020
00021 void ControlDevice::print_values(std::ostream& out) const { impl->print_values(out);}
00022
00023 void ControlDevice::print_unrecognized(std::ostream& out) const { impl->print_unrecognized(out);}
00024
00025 void ControlDevice::attach_to(std::istream& in) { impl->attach_to(in);}
00026
00027 void ControlDevice::add(std::string const& name,Mutator* value_ref)
00028 { impl->add(name,value_ref);}
00029
00030 void ControlDevice::add(char const* nm,Mutator* value_ref)
00031 { add(std::string(nm),value_ref);}
00032
00033 void ControlDevice::register_at(ControlDevice& Ctrl, std::string const& prefix)
00034 { impl->register_at(Ctrl,prefix);}
00035
00036 std::string ControlDevice::name() const { return impl->name();}
00037
00038 ControlDevice ControlDevice::getSubDevice(std::string const& nm)
00039 {
00040 ControlDevice sub(impl->get_sub_device(nm));
00041
00042 return sub;
00043 }
00044
00045 ControlDevice ControlDevice::getSubDevice(char const* name)
00046 { return getSubDevice(std::string(name));}
00047
00048
00049
00050
00051
00052 ControlDevice GetStreamDevice(std::istream* in, const std::string& name)
00053 { return ControlDevice( new istream_control_device_impl(in,name));}
00054
00055 ControlDevice GetFileControlDevice(const std::string& filename, const std::string& name)
00056 { return GetFileControlDevice(filename.c_str(),name);}
00057
00058 ControlDevice GetFileControlDevice(const char* filename, const std::string& name) {
00059 std::ifstream * infile = new std::ifstream;
00060 file_interactive::open(*infile,filename);
00061 return ControlDevice(new istream_control_device_impl(infile, name));
00062 }
00063
00064
00065
00066
00067 ControlDevice GetDuplexControlDevice(std::istream& in2,
00068 const char* filename, const std::string& name) {
00069 std::ifstream * in1 = new std::ifstream(filename);
00070 return ControlDevice(new multi_istream_control_device(in1,&in2,name));
00071 }
00072
00073 ControlDevice GetDuplexControlDevice(std::istream* in2,
00074 const char* filename, const std::string& name) {
00075 std::ifstream * in1 = new std::ifstream(filename);
00076 return ControlDevice(new multi_istream_control_device(in1,in2,name));
00077 }
00078
00079 ControlDevice GetDuplexControlDevice(std::istream& in2,
00080 const std::string& filename, const std::string& name) {
00081 return GetDuplexControlDevice(in2,filename.c_str(),name);
00082 }
00083
00084 ControlDevice GetCommandlineAndFileControlDevice(int argc, char* argv[],
00085 const std::string& filename,
00086 const std::string& name)
00087 {
00088 Commandline cmd(argc,argv);
00089
00090 std::istrstream* in = new std::istrstream(cmd.c_str());
00091 return GetDuplexControlDevice(in,
00092 filename.c_str(),
00093 name);
00094 }