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 if(_reset) { reset(_len); }
00038 };
00039
00040 virtual ~SequenceBase() {
00041 };
00042
00043 virtual void reset(int _len) {
00044 len = _len;
00045 idx = 0;
00046 };
00047
00048 virtual void extend(int _len) {
00049 len = _len;
00050 };
00051
00052 int index(int _idx) { idx = _idx; return index(); };
00053 int next(void) { idx++; return index(); };
00054 int prev(void) { idx--; return index(); };
00055
00056
00057 protected:
00058 int index(void) {
00059 if( idx < 0 ) {
00060 idx += len;
00061 }
00062 idx %= len;
00063 int retval = get();
00064 return retval;
00065 };
00066
00067 virtual int get(void) = 0;
00068
00069 int len;
00070 int idx;
00071 };
00072
00073 class SequenceInc : public SequenceBase
00074 {
00075 public:
00076 SequenceInc(int _len)
00077 : SequenceBase(_len) {
00078 };
00079
00080 protected:
00081 virtual int get(void) { return idx; };
00082 };
00083
00084 class SequenceDec : public SequenceBase
00085 {
00086 public:
00087 SequenceDec(int _len)
00088 : SequenceBase(_len) {
00089 };
00090
00091 protected:
00092 virtual int get(void) {
00093 return len - idx - 1;
00094 };
00095 };
00096
00097 class SequenceRandomBase : public SequenceBase
00098 {
00099 public:
00100 SequenceRandomBase(int _len, bool _reset = true)
00101 : SequenceBase(_len, _reset), seq(0) {
00102 if( _reset ) { reset(_len); }
00103 };
00104
00105 virtual ~SequenceRandomBase() {
00106 if( seq ) {
00107 delete seq;
00108 }
00109 };
00110
00111 virtual void reset(int _len) {
00112 SequenceBase::reset(_len);
00113 if( seq ) {
00114 delete seq;
00115 }
00116 seq = new(int[len]);
00117 for( int i = 0 ; i < len ; i++ ) {
00118 seq[i] = -1;
00119 }
00120 };
00121
00122 protected:
00123 virtual int get(void) {
00124 if( seq[idx] == -1 ) {
00125 seq[idx] = create();
00126 }
00127 return seq[idx];
00128 };
00129
00130 virtual int create(void) = 0;
00131
00132 int *seq;
00133 };
00134
00135 class SequenceRandom : public SequenceRandomBase
00136 {
00137 public:
00138 SequenceRandom(int _len)
00139 : SequenceRandomBase(_len) {};
00140
00141 protected:
00142 virtual int create(void) {
00143 return (int)(((double)rand()) * len / RAND_MAX);
00144 };
00145 };
00146
00147 #define MAP_IDX(idx) map[((idx) / sizeof(int))]
00148 #define MAP_MSK(idx) (1 << ((idx) % sizeof(int)))
00149 #define MAP_SET(map,idx) MAP_IDX(idx) |= MAP_MSK(idx)
00150 #define MAP_CLR(map,idx) MAP_IDX(idx) &= ~MAP_MSK(idx)
00151 #define MAP(map,idx) (MAP_IDX(idx) & MAP_MSK(idx))
00152
00153 class SequenceShuffle : public SequenceRandomBase
00154 {
00155 public:
00156 SequenceShuffle(int _len)
00157 : SequenceRandomBase(_len, false), map(0) {
00158 reset(_len);
00159 };
00160
00161 virtual ~SequenceShuffle() {
00162 if( map ) {
00163 delete map;
00164 }
00165 };
00166
00167 virtual void reset(int _len) {
00168 SequenceRandomBase::reset(_len);
00169 if( map ) {
00170 delete map;
00171 }
00172 map = new(int[(len / sizeof(int)) + 1]);
00173 for( int i = 0 ; i < len ; i++ ) {
00174 MAP_CLR(map,i);
00175 }
00176 };
00177
00178 protected:
00179 virtual int create(void) {
00180 while(1) {
00181 int i = (int)(((double)rand()) * len / RAND_MAX);
00182 if( !MAP(map,i) ) {
00183 MAP_SET(map,i);
00184 return i;
00185 }
00186 }
00187 };
00188
00189 int *map;
00190 int used;
00191 };
00192
00193 #endif // ndef SEQUENCE_H