00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_LETTER_COUPLE_LETTER_HXX
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_LETTER_COUPLE_LETTER_HXX
00019 
00020 # include <sstream>
00021 
00022 # include <vaucanson/algebra/implementation/letter/couple_letter.hh>
00023 
00024 namespace vcsn {
00025 
00026   namespace algebra {
00027 
00028     
00029     template <typename S, typename U, typename V, typename CharContainer>
00030     bool op_parse (const algebra::FreeMonoidBase<S>& set,
00031                    std::basic_string< std::pair<U, V> >& v,
00032                    const std::string& s,
00033                    typename std::string::const_iterator& i,
00034                    const CharContainer&)
00035     {
00036       typename std::string::const_iterator j = i;
00037 
00038       while (i != s.end ()) {
00039         if (*i != '(')
00040           break ;
00041         std::string sub (i, s.end ());
00042         std::istringstream is (sub);
00043         std::pair<U,V> p;
00044         is >> p;
00045         if (!set.alphabet ().contains (p))
00046           break ;
00047         int inc = sub.size () - is.str ().size ();
00048         for (int k = 0; k < inc; k++, i++) ;
00049         v += p;
00050       }
00051       return (i != j);
00052     }
00053 
00054   } 
00055 } 
00056 
00057 namespace std
00058 {
00059 
00060   template <typename U, typename V>
00061   std::ostream& operator<< (std::ostream& o, std::pair<U, V> p)
00062   {
00063     return o << "(" << p.first << "," << p.second << ")";
00064   }
00065 
00066   template <typename U, typename V, class Traits, class Allocator>
00067   std::ostream& operator<< (std::ostream& o,
00068                             std::basic_string<std::pair<U, V>, Traits, Allocator> s)
00069   {
00070     typename
00071       std::basic_string<std::pair<U, V>, Traits, Allocator>::const_iterator i;
00072     for (i = s.begin (); i != s.end (); ++i)
00073       o << "(" << i->first << "," << i->second << ")";
00074     return o;
00075   }
00076 
00077   template <typename U, typename V>
00078   std::istream& operator>> (std::istream& i, std::pair<U, V>& p)
00079   {
00080     char c = i.get ();
00081     if (c != '(')
00082       i.unget ();
00083     i >> p.first;
00084     c = i.get ();
00085     if (c != ',')
00086       i.unget ();
00087     i >> p.second;
00088     c = i.get ();
00089     if (c != ')')
00090       i.unget ();
00091     return i;
00092   }
00093 
00094 } 
00095 
00096 
00097 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_LETTER_COUPLE_LETTER_HXX