genesis.hpp

Go to the documentation of this file.
00001 #define wali_nwa_query_details_GENESIS_HPP
00002 
00003 #ifndef wali_nwa_query_details_GENESIS_HPP
00004 #define wali_nwa_query_details_GENESIS_HPP
00005 
00006 #include "opennwa/Nwa.hpp"
00007 #include "opennwa/query/details/iterators.hpp"
00008 
00009 #include <utility>
00010 
00011 namespace opennwa
00012 {
00013     namespace query
00014     {
00015       namespace details
00016       {
00017         /// This namespace defines 
00018         namespace genesis
00019         {
00020 
00021           /// This turns return transitions into call transitions, mapping
00022           /// the symbols that correspond and dropping the call predecessor.
00023           struct ReturnTransitionToFakeCallTransformer
00024           {
00025             NWA::Call operator()(NWA::Return const & r) const
00026             {
00027               return NWA::Call(r.first, r.third, r.fourth);
00028             }
00029           };
00030 
00031 
00032           struct FromCallTransitions
00033           {
00034             typedef NWA::CallIterator Iterator;
00035 
00036             std::pair<Iterator, Iterator> getTransitions(NWA const & nwa) const
00037             {
00038               return std::make_pair(nwa.beginCallTrans(), nwa.endCallTrans());
00039             }
00040           };
00041 
00042 
00043           struct FromInternalTransitions
00044           {
00045             typedef NWA::InternalIterator Iterator;
00046 
00047             std::pair<Iterator, Iterator> getTransitions(NWA const & nwa) const
00048             {
00049               return std::make_pair(nwa.beginInternalTrans(), nwa.endInternalTrans());
00050             }
00051           };
00052 
00053 
00054           struct FromReturnTransitions
00055           {
00056             typedef NWA::ReturnIterator Iterator;
00057 
00058             std::pair<Iterator, Iterator> getTransitions(NWA const & nwa) const
00059             {
00060               return std::make_pair(nwa.beginReturnTrans(), nwa.endReturnTrans());
00061             }
00062           };
00063 
00064 
00065           struct FromAllTransitions
00066           {
00067             typedef iterators::iterator_base_wrapper<NWA::Call> _base_iterator;
00068             typedef iterators::iterator_sequence<_base_iterator> Iterator;
00069 
00070             std::pair<Iterator, Iterator> getTransitions(NWA const & nwa) const
00071             {
00072               Iterator sequence;
00073 
00074               // Calls
00075               iterators::cplusplus_iterator_adapter<NWA::CallIterator>
00076                 callBegin(nwa.beginCallTrans()),
00077                 callEnd(nwa.endCallTrans());
00078                 
00079               sequence.append_range(_base_iterator(callBegin),
00080                                     _base_iterator(callEnd));
00081 
00082               // Internals
00083               iterators::cplusplus_iterator_adapter<NWA::InternalIterator>
00084                 internalBegin(nwa.beginInternalTrans()),
00085                 internalEnd(nwa.endInternalTrans());
00086                 
00087               sequence.append_range(_base_iterator(internalBegin),
00088                                     _base_iterator(internalEnd));
00089 
00090               // Returns
00091 
00092               return std::make_pair(sequence, Iterator());
00093             }
00094           };
00095 
00096 
00097         }
00098     }
00099   }
00100 }
00101 
00102 // Yo, Emacs!
00103 // Local Variables:
00104 //   c-file-style: "ellemtel"
00105 //   c-basic-offset: 2
00106 // End:
00107 
00108 #endif