00001 #ifndef OPTFRAME_NSENUM_HPP_
00002 #define OPTFRAME_NSENUM_HPP_
00003
00004 #include "NSSeq.hpp"
00005 #include "RandGen.hpp"
00006
00007 using namespace std;
00008
00009 template<class R, class M = OPTFRAME_DEFAULT_MEMORY> class NSEnum;
00010
00011 template<class R, class M = OPTFRAME_DEFAULT_MEMORY>
00012 class NSEnumIterator: public NSIterator<R, M>
00013 {
00014 private:
00015 NSEnum<R, M>& ns;
00016 unsigned int move;
00017 unsigned int nsSize;
00018
00019 public:
00020
00021 NSEnumIterator(NSEnum<R, M>& _ns) :
00022 ns(_ns)
00023 {
00024 move = 0;
00025 nsSize = _ns.size();
00026 }
00027
00028 virtual ~NSEnumIterator()
00029 {
00030 }
00031
00032 void first()
00033 {
00034 move = 0;
00035 }
00036
00037 void next()
00038 {
00039 move++;
00040 }
00041
00042 bool isDone()
00043 {
00044 return move >= nsSize;
00045 }
00046
00047 Move<R, M>& current()
00048 {
00049 if (isDone())
00050 throw IteratorOutOfBound(move);
00051 return ns.move(move);
00052 }
00053
00054 Move<R, M>& at(unsigned int m)
00055 {
00056
00057 return ns.move(m);
00058 }
00059
00060 unsigned int size()
00061 {
00062 return nsSize;
00063 }
00064 };
00065
00066 template<class R, class M>
00067 class NSEnum: public NSSeq<R, M>
00068 {
00069
00070 protected:
00071 RandGen& rg;
00072
00073 public:
00074
00075 using NSSeq<R, M>::move;
00076
00077 NSEnum(RandGen& _rg):rg(_rg)
00078 {}
00079
00080 virtual ~NSEnum()
00081 {
00082 }
00083
00084 virtual Move<R, M>& move(const R&)
00085 {
00086 return move( rg.rand(size()));
00087 }
00088
00089 virtual NSIterator<R, M>& getIterator(const R&)
00090 {
00091 return *new NSEnumIterator<R, M> (*this);
00092 }
00093
00094 virtual Move<R, M>& move(unsigned int m) = 0;
00095
00096 virtual unsigned int size() = 0;
00097
00098 virtual void print() = 0;
00099 };
00100
00101 #endif