00001 #ifndef OPTFRAME_NSSEQ_PAIRSECOND_ADAPTER_HPP_
00002 #define OPTFRAME_NSSEQ_PAIRSECOND_ADAPTER_HPP_
00003
00004
00005 #include "../Move.hpp"
00006 #include "../NSSeq.hpp"
00007
00008 using namespace std;
00009
00010 template<class T1, class T2, class M = OPTFRAME_DEFAULT_MEMORY>
00011 class MovePairSecond: public Move<pair<T1, T2> , M>
00012 {
00013 protected:
00014 Move<T2, M>& m;
00015
00016 public:
00017
00018 MovePairSecond(Move<T2, M>& _m) :
00019 m(_m)
00020 {
00021 }
00022
00023 Move<T2, M>& get_m()
00024 {
00025 return m;
00026 }
00027
00028 virtual ~MovePairSecond()
00029 {
00030 delete &m;
00031 }
00032
00033 bool canBeApplied(const pair<T1, T2>& rep)
00034 {
00035 return m.canBeApplied(rep.second);
00036 }
00037
00038 Move<pair<T1, T2> , M>& apply(pair<T1, T2>& rep)
00039 {
00040 return *new MovePairSecond<T1, T2, M> (m.apply(rep.second));
00041 }
00042
00043 virtual bool operator==(const Move<pair<T1, T2> , M>& _m) const
00044 {
00045 const MovePairSecond<T1, T2, M>& m1 = (const MovePairSecond<T1, T2, M>&) _m;
00046 return m == m1.m;
00047 }
00048
00049 void print()
00050 {
00051 cout << "MovePairSecond: move = ";
00052 m.print();
00053 }
00054 };
00055
00056 class PairSecondAdapterIteratorOutOfBound
00057 {
00058 public:
00059 PairSecondAdapterIteratorOutOfBound()
00060 {
00061 }
00062 };
00063
00064 template<class T1, class T2, class M = OPTFRAME_DEFAULT_MEMORY, class MOVE = MovePairSecond<T1, T2, M> >
00065 class IteratorNSSeqPairSecond: public NSIterator<pair<T1, T2> , M>
00066 {
00067 private:
00068 NSIterator<T2, M>& iterator;
00069
00070 public:
00071
00072 IteratorNSSeqPairSecond(NSIterator<T2, M>& it) :
00073 iterator(it)
00074 {
00075 }
00076
00077 virtual ~IteratorNSSeqPairSecond()
00078 {
00079 delete &iterator;
00080 }
00081
00082 void first()
00083 {
00084 iterator.first();
00085 }
00086
00087 void next()
00088 {
00089 iterator.next();
00090 }
00091
00092 bool isDone()
00093 {
00094 return iterator.isDone();
00095 }
00096
00097 Move<pair<T1, T2> , M>& current()
00098 {
00099
00100 if (!iterator.isDone())
00101 return *new MOVE(iterator.current());
00102 else
00103 throw PairSecondAdapterIteratorOutOfBound();
00104 }
00105 };
00106
00107 template<class T1, class T2, class M = OPTFRAME_DEFAULT_MEMORY, class MOVE = MovePairSecond<T1, T2, M> >
00108 class NSSeqPairSecondAdapter: public NSSeq<pair<T1, T2> , M>
00109 {
00110 protected:
00111 NSSeq<T2, M>& ns;
00112
00113 public:
00114
00115 NSSeqPairSecondAdapter(NSSeq<T2, M>& _ns) :
00116 ns(_ns)
00117 {
00118 }
00119
00120 virtual ~NSSeqPairSecondAdapter()
00121 {
00122 }
00123
00124 Move<pair<T1, T2> , M>& move(const pair<T1, T2>& r)
00125 {
00126 return *new MOVE(ns.move(r.second));
00127 }
00128
00129 virtual NSIterator<pair<T1, T2> , M>& getIterator(const pair<T1, T2>& r)
00130 {
00131 return *new IteratorNSSeqPairSecond<T1, T2, M, MOVE> (ns.getIterator(r.second));
00132 }
00133
00134 virtual void print()
00135 {
00136 cout << "NSSeqPairSecondAdapter {" << endl;
00137 ns.print();
00138 cout << "}" << endl;
00139 }
00140 };
00141
00142 #endif