00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef VCSN_AUTOMATA_IMPLEMENTATION_BMIG_BMIG_HANDLERS_OP_HXX
00018 # define VCSN_AUTOMATA_IMPLEMENTATION_BMIG_BMIG_HANDLERS_OP_HXX
00019 
00020 # include <vaucanson/misc/contract.hh>
00021 # include <vaucanson/automata/concept/handlers.hh>
00022 
00023 
00024 
00025 #define HOPERATOR(Op)                                   \
00026 template<typename T, typename U>                        \
00027 bool operator Op (const handler<transition_h, boost::multi_index::detail::hashed_index_iterator<T, U> >& h1,\
00028                   const handler<transition_h, boost::multi_index::detail::hashed_index_iterator<T, U> >& h2)\
00029 {                                                       \
00030   if (h1.value()->from_ == h2.value()->from_)           \
00031     if (h1.value()->to_ == h2.value()->to_)             \
00032       return h1.value()->label_ Op h2.value()->label_;  \
00033     else                                                \
00034       return h1.value()->to_ Op h2.value()->to_;        \
00035   else                                                  \
00036     return h1.value()->from_ Op h2.value()->from_;      \
00037 }
00038 
00039 namespace vcsn
00040 {
00041   HOPERATOR(<);
00042   HOPERATOR(>);
00043   HOPERATOR(<=);
00044   HOPERATOR(>=);
00045 }
00046 #undef HOPERATOR
00047 
00048 #define HOPERATOR(Op)                                   \
00049 template<typename T, typename U>                        \
00050 bool operator Op (const handler<transition_h,           \
00051                                 boost::multi_index::detail::hashed_index_iterator<T, U> >& h1,\
00052                   const handler<transition_h,           \
00053                                 boost::multi_index::detail::hashed_index_iterator<T, U> >& h2)\
00054 {                                                       \
00055   return h1.value() Op h2.value();                      \
00056 }
00057 namespace vcsn
00058 {
00059   HOPERATOR(==);
00060   HOPERATOR(!=);
00061 }
00062 #undef HOPERATOR
00063 
00064 
00065 
00066 
00067 #define HOPERATOR(Op)                                                           \
00068 inline                                                                          \
00069 bool operator Op (const handler<state_h, boost::shared_ptr<std::size_t> >& h1,  \
00070                   const handler<state_h, boost::shared_ptr<std::size_t> >& h2)  \
00071 {                                                                               \
00072   return h1.value() Op h2.value();                                              \
00073 }
00074 
00075 namespace vcsn
00076 {
00077   HOPERATOR(==);
00078   HOPERATOR(!=);
00079   HOPERATOR(<);
00080 
00081   inline
00082   bool operator> (const handler<state_h, boost::shared_ptr<std::size_t> >& h1,
00083                   const handler<state_h, boost::shared_ptr<std::size_t> >& h2)
00084   {
00085     return h2 > h1;
00086   }
00087 
00088   inline
00089   bool operator<= (const handler<state_h, boost::shared_ptr<std::size_t> >& h1,
00090                    const handler<state_h, boost::shared_ptr<std::size_t> >& h2)
00091   {
00092     return h1 < h2 || h1 == h2;
00093   }
00094 
00095   inline
00096   bool operator>= (const handler<state_h, boost::shared_ptr<std::size_t> >& h1,
00097                    const handler<state_h, boost::shared_ptr<std::size_t> >& h2)
00098   {
00099     return !(h1 < h2);
00100   }
00101 }
00102 #undef HOPERATOR
00103 
00104 #endif // ! VCSN_AUTOMATA_IMPLEMENTATION_BMIG_BMIG_HANDLERS_OP_HXX
00105