00001 #ifndef PROPAGATEDUPDATELIST_H_
00002 #define PROPAGATEDUPDATELIST_H_
00003
00004 #include "globals.h"
00005
00006 #include "EvSimObjectPool.h"
00007 #include "EventTargetGroupPool.h"
00008 #include "UpdateLinksMap.h"
00009 #include "EvSimObject.h"
00010
00011 typedef vector<update_id_t> UpdateIDVector;
00012
00013 struct UpdateTarget
00014 {
00015 UpdateTarget(EvSimObject *object, UpdateIDVector * update_id_vec)
00016 : object(object), update_id_vec(update_id_vec) {};
00017
00018 UpdateTarget(EvSimObject *object, bool is_single_update_id, update_id_t update_id, UpdateIDVector *update_id_vec)
00019 : object(object), is_single_update_id(is_single_update_id)
00020 {
00021 if (is_single_update_id)
00022 this->update_id = update_id;
00023 else
00024 this->update_id_vec = update_id_vec;
00025 }
00026
00027 ~UpdateTarget() {}
00028
00029 EvSimObject * object;
00030 bool is_single_update_id;
00031 union {
00032 UpdateIDVector* update_id_vec;
00033 update_id_t update_id;
00034 };
00035 };
00036
00037
00038 class PropagatedUpdateList {
00039 public:
00040 typedef vector<UpdateTarget>::const_iterator const_iterator;
00041
00042 PropagatedUpdateList(EventTargetGroupPool & etgpool, UpdateLinksMap & upd_links_map, EvSimObjectPool & obj_pool)
00043 : etgpool(etgpool), upd_links_map(upd_links_map), obj_pool(obj_pool)
00044 {}
00045
00046
00047 ~PropagatedUpdateList();
00048
00049 void prepare();
00050
00051 const_iterator begin(event_target_group_id_t etg_id) {
00052 return update_list[etg_id].begin();
00053 }
00054
00055 const_iterator end(event_target_group_id_t etg_id) {
00056 return update_list[etg_id].end();
00057 }
00058
00059
00060 protected:
00061
00062 void createUpdateListForETG(event_target_group_id_t etg_id);
00063
00064 void printUpdateLinksMap();
00065 void printUpdateList();
00066
00067
00068 EventTargetGroupPool & etgpool;
00069 UpdateLinksMap & upd_links_map;
00070 EvSimObjectPool & obj_pool;
00071
00072 vector< vector< UpdateTarget > > update_list;
00073 };
00074
00075 #endif