00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef SEQCOUNTER_H
00019 #define SEQCOUNTER_H
00020
00021
00022 #include <odinseq/seqvec.h>
00023 #include <odinseq/seqdriver.h>
00024 #include <odinseq/seqtree.h>
00025
00032 class SeqCounter;
00033 class SeqObjList;
00034
00038 class SeqCounterDriver : public SeqDriverBase {
00039
00040 public:
00041 SeqCounterDriver() {}
00042 virtual ~SeqCounterDriver() {}
00043
00047 virtual bool prep_driver() = 0;
00048
00053 virtual void update_driver(const SeqCounter* counter, const SeqObjList* seqlist, const List<SeqVector,const SeqVector*,const SeqVector&>* vectors) const = 0;
00054
00058 virtual double get_preduration () const = 0;
00059
00063 virtual double get_postduration() const = 0;
00064
00068 virtual double get_preduration_inloop() const = 0;
00069
00073 virtual double get_postduration_inloop() const = 0;
00074
00075
00080 virtual bool create_program(programContext& context, const STD_string& loopkernel) const = 0;
00081
00085 virtual STD_string get_program_head(programContext& context, const STD_string& loopkernel, unsigned int times) const = 0;
00086
00090 virtual STD_string get_program_tail(programContext& context, const STD_string& loopkernel, unsigned int times) const = 0;
00091
00095 virtual STD_string get_program_head_unrolled(programContext& context, unsigned int index) const = 0;
00096
00100 virtual STD_string get_program_iterator(programContext& context) const = 0;
00101
00102
00106 virtual void pre_vecprepevent (eventContext& context) const = 0;
00107
00112 virtual void post_vecprepevent(eventContext& context, int repcounter) const = 0;
00113
00117 virtual void outdate_cache() const = 0;
00118
00123 virtual bool unroll_program(const SeqCounter* counter, const SeqObjList* seqlist, const List<SeqVector,const SeqVector*,const SeqVector&>* vectors, programContext& context) const = 0;
00124
00128 virtual SeqCounterDriver* clone_driver() const = 0;
00129 };
00130
00131
00132
00134
00135
00139 class SeqCounter : public Handled<const SeqCounter*>, public virtual SeqTreeObj {
00140
00141 public:
00145 SeqCounter(const STD_string& object_label = "unnamedSeqCounter");
00146
00150 SeqCounter(const SeqCounter& sc);
00151
00152
00153 virtual ~SeqCounter() {}
00154
00158 SeqCounter& operator = (const SeqCounter& sc);
00159
00163 virtual int get_times() const;
00164
00165
00169 virtual void add_vector(const SeqVector& seqvector);
00170
00171
00172
00173
00174 int get_counter() const {return counter;}
00175 bool counter_is_active() const {return counter!=-1;}
00176 void init_counter(unsigned int start=0) const;
00177 void increment_counter() const {counter++;}
00178 void disable_counter() const {counter=-1;}
00179
00180
00181 bool prep_veciterations() const;
00182
00183
00184 protected:
00185
00186
00187 mutable STD_list<const SeqVector*>::const_iterator veciter;
00188 STD_list<const SeqVector*>::const_iterator get_vecbegin() const {return vectors.get_const_begin();}
00189 STD_list<const SeqVector*>::const_iterator get_vecend() const {return vectors.get_const_end();}
00190 unsigned int n_vectors() const {return vectors.size();}
00191
00192 List<SeqVector,const SeqVector*,const SeqVector&> vectors;
00193
00194
00195 void clear_vectorlist() {vectors.clear();}
00196
00197
00198 mutable SeqDriverInterface<SeqCounterDriver> counterdriver;
00199
00200
00201
00202 bool prep();
00203 void clear_container();
00204
00205 private:
00206 friend class SeqVector;
00207
00208
00209
00210 virtual bool unroll_program(programContext& context) const {return true;}
00211
00212 void set_vechandler_for_all() const;
00213
00214 mutable int counter;
00215
00216
00217 };
00218
00222 #endif