00001 #ifndef __CKARRAYOPTIONS_H
00002 #define __CKARRAYOPTIONS_H
00003
00004 #include "ckarrayindex.h"
00005 #include "ckmulticast.h"
00006
00007
00011 class ArrayElement;
00012 class CkArrayListener : public PUP::able {
00013 int nInts;
00014 int dataOffset;
00015 public:
00016 CkArrayListener(int nInts_);
00017 CkArrayListener(CkMigrateMessage* m);
00018 virtual void pup(PUP::er& p);
00019 PUPable_abstract(CkArrayListener)
00020
00021
00022 virtual void ckRegister(CkArray* arrMgr, int dataOffset_);
00023
00025 inline int ckGetLen(void) const { return nInts; }
00027 inline int ckGetOffset(void) const { return dataOffset; }
00029 inline int* ckGetData(ArrayElement* el) const;
00030
00032 virtual void ckBeginInserting(void) {}
00034 virtual void ckEndInserting(void) {}
00035
00036
00037
00039 virtual void ckElementStamp(int* eltInfo) { (void)eltInfo; }
00041 virtual void ckElementCreating(ArrayElement* elt) { (void)elt; }
00044 virtual bool ckElementCreated(ArrayElement* elt) {
00045 (void)elt;
00046 return true;
00047 }
00048
00050 virtual void ckElementDied(ArrayElement* elt) { (void)elt; }
00051
00052
00054 virtual void ckElementLeaving(ArrayElement* elt) { (void)elt; }
00055
00058 virtual bool ckElementArriving(ArrayElement* elt) {
00059 (void)elt;
00060 return true;
00061 }
00062
00064 virtual void flushState() {}
00065 };
00066
00067
00069 class CkArrayOptions {
00070 friend class CkArray;
00071
00072 CkArrayIndex start, end, step;
00073 CkArrayIndex numInitial;
00074
00075 CkArrayIndex bounds;
00076 CkGroupID map;
00077 CkGroupID locMgr;
00078 CkGroupID mCastMgr;
00079 CkPupAblePtrVec<CkArrayListener> arrayListeners;
00080 CkCallback reductionClient;
00081 CkCallback initCallback;
00082 bool anytimeMigration;
00083 bool disableNotifyChildInRed;
00084 bool staticInsertion;
00085 bool broadcastViaScheduler;
00086 bool sectionAutoDelegate;
00087
00089 void init();
00090
00092 void updateIndices();
00093 void updateNumInitial();
00094
00095 public:
00096
00097 CkArrayOptions(void);
00098 CkArrayOptions(int ndims, int dims[]);
00099 CkArrayOptions(int ni1_);
00100 CkArrayOptions(int ni1_, int ni2_);
00101 CkArrayOptions(int ni1_, int ni2_, int ni3);
00102 CkArrayOptions(short ni1_, short ni2_, short ni3,
00103 short ni4_);
00104 CkArrayOptions(short ni1_, short ni2_, short ni3, short ni4_,
00105 short ni5_);
00106 CkArrayOptions(short ni1_, short ni2_, short ni3, short ni4_, short ni5_,
00107 short ni6_);
00108 CkArrayOptions(CkArrayIndex s, CkArrayIndex e,
00109 CkArrayIndex step);
00110
00116
00117 CkArrayOptions& setStart(CkArrayIndex s) {
00118 start = s;
00119 updateNumInitial();
00120 return *this;
00121 }
00122 CkArrayOptions& setEnd(CkArrayIndex e) {
00123 end = e;
00124 updateNumInitial();
00125 return *this;
00126 }
00127 CkArrayOptions& setStep(CkArrayIndex s) {
00128 step = s;
00129 updateNumInitial();
00130 return *this;
00131 }
00132
00134 CkArrayOptions& setNumInitial(int ni) {
00135 numInitial = CkArrayIndex1D(ni);
00136 updateIndices();
00137 return *this;
00138 }
00140 CkArrayOptions& setNumInitial(int ni1, int ni2) {
00141 numInitial = CkArrayIndex2D(ni1, ni2);
00142 updateIndices();
00143 return *this;
00144 }
00146 CkArrayOptions& setNumInitial(int ni1, int ni2, int ni3) {
00147 numInitial = CkArrayIndex3D(ni1, ni2, ni3);
00148 updateIndices();
00149 return *this;
00150 }
00152 CkArrayOptions& setNumInitial(short ni1, short ni2, short ni3, short ni4) {
00153 numInitial = CkArrayIndex4D(ni1, ni2, ni3, ni4);
00154 updateIndices();
00155 return *this;
00156 }
00158 CkArrayOptions& setNumInitial(short ni1, short ni2, short ni3, short ni4, short ni5) {
00159 numInitial = CkArrayIndex5D(ni1, ni2, ni3, ni4, ni5);
00160 updateIndices();
00161 return *this;
00162 }
00164 CkArrayOptions& setNumInitial(short ni1, short ni2, short ni3, short ni4, short ni5,
00165 short ni6) {
00166 numInitial = CkArrayIndex6D(ni1, ni2, ni3, ni4, ni5, ni6);
00167 updateIndices();
00168 return *this;
00169 }
00170
00172 CkArrayOptions& setBounds(int ni) {
00173 bounds = CkArrayIndex1D(ni);
00174 return *this;
00175 }
00177 CkArrayOptions& setBounds(int ni1, int ni2) {
00178 bounds = CkArrayIndex2D(ni1, ni2);
00179 return *this;
00180 }
00182 CkArrayOptions& setBounds(int ni1, int ni2, int ni3) {
00183 bounds = CkArrayIndex3D(ni1, ni2, ni3);
00184 return *this;
00185 }
00187 CkArrayOptions& setBounds(short ni1, short ni2, short ni3, short ni4) {
00188 bounds = CkArrayIndex4D(ni1, ni2, ni3, ni4);
00189 return *this;
00190 }
00192 CkArrayOptions& setBounds(short ni1, short ni2, short ni3, short ni4, short ni5) {
00193 bounds = CkArrayIndex5D(ni1, ni2, ni3, ni4, ni5);
00194 return *this;
00195 }
00197 CkArrayOptions& setBounds(short ni1, short ni2, short ni3, short ni4, short ni5,
00198 short ni6) {
00199 bounds = CkArrayIndex6D(ni1, ni2, ni3, ni4, ni5, ni6);
00200 return *this;
00201 }
00202
00204 CkArrayOptions& setMap(const CkGroupID& m) {
00205 map = m;
00206 return *this;
00207 }
00208
00210 CkArrayOptions& bindTo(const CkArrayID& b);
00211
00213 CkArrayOptions& setLocationManager(const CkGroupID& l) {
00214 locMgr = l;
00215 return *this;
00216 }
00217
00219 CkArrayOptions& setMcastManager(const CkGroupID& m) {
00220 mCastMgr = m;
00221 return *this;
00222 }
00223
00225 CkArrayOptions& addListener(CkArrayListener* listener);
00226
00227 CkArrayOptions& setAnytimeMigration(bool b) {
00228 anytimeMigration = b;
00229 return *this;
00230 }
00231 CkArrayOptions& setStaticInsertion(bool b);
00232 CkArrayOptions& setBroadcastViaScheduler(bool b) {
00233 broadcastViaScheduler = b;
00234 return *this;
00235 }
00236 CkArrayOptions& setSectionAutoDelegate(bool b) {
00237 sectionAutoDelegate = b;
00238 return *this;
00239 }
00240 CkArrayOptions& setReductionClient(CkCallback cb) {
00241 reductionClient = cb;
00242 return *this;
00243 }
00244 CkArrayOptions &setInitCallback(CkCallback cb) {
00245 initCallback = cb;
00246 return *this;
00247 }
00248
00249
00250 const CkArrayIndex& getStart(void) const { return start; }
00251 const CkArrayIndex& getEnd(void) const { return end; }
00252 const CkArrayIndex& getStep(void) const { return step; }
00253 const CkArrayIndex& getNumInitial(void) const { return numInitial; }
00254 const CkArrayIndex& getBounds(void) const { return bounds; }
00255 const CkGroupID& getMap(void) const { return map; }
00256 const CkGroupID& getLocationManager(void) const { return locMgr; }
00257 const CkGroupID& getMcastManager(void) const { return mCastMgr; }
00258 bool isSectionAutoDelegated(void) const { return sectionAutoDelegate; }
00259 const CkCallback &getInitCallback(void) const {return initCallback;}
00260 int getListeners(void) const { return arrayListeners.size(); }
00261 CkArrayListener* getListener(int listenerNum) {
00262 CkArrayListener* ret = arrayListeners[listenerNum];
00263 arrayListeners[listenerNum] = NULL;
00264 return ret;
00265 }
00266
00267 void pup(PUP::er& p);
00268 };
00269 PUPmarshall(CkArrayOptions)
00270
00271 #endif