- Main Page
- Classes
- Files

- File List

# OptFrame/NSEnum.hpp

    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                 // TODO: throw exception if m >= size
    00057                 return ns.move(m);
    00058         }
    00059
    00060         unsigned int size()
    00061         {
    00062                 return nsSize;
    00063         }
    00064 };
    00065
    00066 template<class R, class M> // M = OPTFRAME_DEFAULT_MEMORY already defined
    00067 class NSEnum: public NSSeq<R, M>
    00068 {
    00069
    00070 protected:
    00071         RandGen& rg;
    00072
    00073 public:
    00074
    00075         using NSSeq<R, M>::move; // prevents name hiding
    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 /*OPTFRAME_NSENUM_HPP_*/

All Classes Functions