00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef SEQUENCE_H
00028 #define SEQUENCE_H
00029
00030 #include <stdlib.h>
00031
00032 class SequenceBase
00033 {
00034 public:
00035 SequenceBase(int _len, bool _reset = true)
00036 : len(_len), idx(0)
00037 {
00038 if (_reset)
00039 {
00040 reset(_len);
00041 }
00042 };
00043
00044 virtual ~SequenceBase() { };
00045
00046 virtual void reset(int _len)
00047 {
00048 len = _len;
00049 idx = 0;
00050 };
00051
00052 virtual void extend(int _len)
00053 {
00054 len = _len;
00055 };
00056
00057 int index(int _idx) { idx = _idx; return index(); };
00058 int next(void) { idx++; return index(); };
00059 int prev(void) { idx--; return index(); };
00060
00061
00062 protected:
00063 int index(void)
00064 {
00065 if( idx < 0 )
00066 {
00067 idx += len;
00068 }
00069 idx %= len;
00070 int retval = get();
00071 return retval;
00072 };
00073
00074 virtual int get(void) = 0;
00075
00076 int len;
00077 int idx;
00078 };
00079
00080 class SequenceInc : public SequenceBase
00081 {
00082 public:
00083 SequenceInc(int _len)
00084 : SequenceBase(_len) { };
00085
00086 protected:
00087 virtual int get(void) { return idx; };
00088 };
00089
00090 class SequenceDec : public SequenceBase
00091 {
00092 public:
00093 SequenceDec(int _len)
00094 : SequenceBase(_len) { };
00095
00096 protected:
00097 virtual int get(void)
00098 {
00099 return len - idx - 1;
00100 };
00101 };
00102
00103 class SequenceRandomBase : public SequenceBase
00104 {
00105 public:
00106 SequenceRandomBase(int _len, bool _reset = true)
00107 : SequenceBase(_len, _reset), seq(0)
00108 {
00109 if( _reset )
00110 {
00111 reset(_len);
00112 }
00113 };
00114
00115 virtual ~SequenceRandomBase()
00116 {
00117 if(seq)
00118 {
00119 delete seq;
00120 }
00121 };
00122
00123 virtual void reset(int _len)
00124 {
00125 SequenceBase::reset(_len);
00126 if(seq)
00127 {
00128 delete seq;
00129 }
00130 seq = new(int[len]);
00131 for( int i = 0 ; i < len ; i++ )
00132 {
00133 seq[i] = -1;
00134 }
00135 };
00136
00137 protected:
00138 virtual int get(void)
00139 {
00140 if( seq[idx] == -1 )
00141 {
00142 seq[idx] = create();
00143 }
00144 return seq[idx];
00145 };
00146
00147 virtual int create(void) = 0;
00148
00149 int *seq;
00150 };
00151
00152 class SequenceRandom : public SequenceRandomBase
00153 {
00154 public:
00155 SequenceRandom(int _len)
00156 : SequenceRandomBase(_len) {};
00157
00158 protected:
00159 virtual int create(void)
00160 {
00161 return (int)(((double)random()) * len / RAND_MAX);
00162 };
00163 };
00164
00165 #define MAP_IDX(idx) map[((idx) / sizeof(int))]
00166 #define MAP_MSK(idx) (1 << ((idx) % sizeof(int)))
00167 #define MAP_SET(map,idx) MAP_IDX(idx) |= MAP_MSK(idx)
00168 #define MAP_CLR(map,idx) MAP_IDX(idx) &= ~MAP_MSK(idx)
00169 #define MAP(map,idx) (MAP_IDX(idx) & MAP_MSK(idx))
00170
00171 class SequenceShuffle : public SequenceRandomBase
00172 {
00173 public:
00174 SequenceShuffle(int _len)
00175 : SequenceRandomBase(_len, false), map(0), used(0)
00176 {
00177 reset(_len);
00178 };
00179
00180 virtual ~SequenceShuffle()
00181 {
00182 if (map)
00183 {
00184 delete map;
00185 }
00186 };
00187
00188 virtual void reset(int _len)
00189 {
00190 SequenceRandomBase::reset(_len);
00191
00192 if(map)
00193 {
00194 delete map;
00195 }
00196
00197 map = new(int[(len / sizeof(int)) + 1]);
00198
00199 for( int i = 0 ; i < len ; i++ )
00200 {
00201 MAP_CLR(map,i);
00202 }
00203 };
00204
00205 protected:
00206 virtual int create(void)
00207 {
00208 while(1)
00209 {
00210 int i = (int)(((double)random()) * len / RAND_MAX);
00211 if( !MAP(map,i) )
00212 {
00213 MAP_SET(map,i);
00214 return i;
00215 }
00216 }
00217 };
00218
00219 int *map;
00220 int used;
00221 };
00222
00223 #endif // ndef SEQUENCE_H