00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #include <basix/port.hpp>
00014 #include <basix/string.hpp>
00015 
00017 
00018 namespace mmx {
00019 
00020 
00021 
00022 
00023 
00024 class output_string_port_rep: public port_rep {
00025   string& s;
00026 
00027 public:
00028   virtual syntactic expression () const {
00029     return syn ("output_string_port", syntactic (quote (s))); }
00030   bool is_output_port () { return true; }
00031   bool busy () { return true; }
00032   nat  can_write () { return (nat) (-1); }
00033   void write (const char* x, nat n) { s << string (x, n); }
00034 
00035 public:
00036   inline output_string_port_rep (string& s2): s (s2) {}
00037 };
00038 
00039 port
00040 output_string_port (string& s) {
00041   return (port_rep*) new output_string_port_rep (s);
00042 }
00043 
00044 
00045 
00046 
00047 
00048 class input_string_port_rep: public port_rep {
00049   string s;
00050   nat pos;
00051 
00052 public:
00053   virtual syntactic expression () const {
00054     return syn ("input_string_port", syntactic (quote (s (pos, N(s))))); }
00055   bool is_input_port () { return true; }
00056   bool busy () { return pos < N(s); }
00057   nat  can_read () { return N(s) - pos; }
00058   void read (char* x, nat n) {
00059     ASSERT (pos + n <= N(s), "no more input");
00060     mem_copy (x, inside (s, pos), n);
00061     pos += n; }
00062 
00063 public:
00064   inline input_string_port_rep (const string& s2): s (s2), pos (0) {}
00065 };
00066 
00067 port
00068 input_string_port (const string& s) {
00069   return (port_rep*) new input_string_port_rep (s);
00070 }
00071 
00072 
00073 
00074 
00075 
00076 class input_output_string_port_rep: public port_rep {
00077   string& s;
00078   nat pos;
00079 
00080 public:
00081   virtual syntactic expression () const {
00082     return syn ("input_output_string_port",
00083                 syntactic (quote (s (pos, N(s))))); }
00084   bool is_output_port () { return true; }
00085   bool is_input_port () { return true; }
00086   bool busy () { return true; }
00087   nat  can_write () { return (nat) (-1); }
00088   nat  can_read () { return N(s) - pos; }
00089   void write (const char* x, nat n) { s << string (x, n); }
00090   void read (char* x, nat n) {
00091     ASSERT (pos + n <= N(s), "no more input");
00092     mem_copy (x, inside (s, pos), n);
00093     pos += n;
00094     if (pos > ((N(s) >> 1) + 1024)) {
00095       s= s (pos, N(s));
00096       pos= 0;
00097     }
00098   }
00099 
00100 public:
00101   inline input_output_string_port_rep (string& s2): s (s2), pos (0) {}
00102 };
00103 
00104 port
00105 input_output_string_port (string& s) {
00106   return (port_rep*) new input_output_string_port_rep (s);
00107 }
00108 
00109 }