
00001 #ifndef _CKOBJID_H_ 00002 #define _CKOBJID_H_ 00003 00004 union _ObjectID { 00005 struct { 00006 CkChareID id; 00007 } chare; 00008 struct { 00009 CkGroupID id; 00010 int onPE; 00011 } group; //also used for NodeGroups 00012 struct s_array{ 00013 CkGroupID id; //array id 00014 CkArrayIndexBase idx; //index 00015 } array; 00016 }; 00017 00018 extern int totalCompares; 00019 00020 class CkObjID { 00021 public: 00022 ChareType type; 00023 _ObjectID data; 00024 CkObjID(){ 00025 type = TypeInvalid; 00026 }; 00027 00028 inline operator CkHashCode()const{ 00029 CkHashCode ret=circleShift(type,25); 00030 switch(type){ 00031 case TypeChare: 00032 case TypeMainChare: 00033 ret += circleShift(data.chare.id.onPE,5); 00034 ret += circleShift((CmiInt8)data.chare.id.objPtr,3); 00035 break; 00036 case TypeGroup: 00037 case TypeNodeGroup: 00038 ret += circleShift(data.group.onPE,4); 00039 ret += circleShift(data.group.id.idx,6); 00040 break; 00041 case TypeArray: 00042 CkHashCode temp = data.array.idx.asChild().hash(); 00043 //ret = circleShift(ret,13); 00044 //ret += circleShift(temp,11); 00045 ret += temp; 00046 break; 00047 } 00048 return ret; 00049 } 00050 00051 inline bool operator == (const CkObjID &t) const{ 00052 00053 if(type != t.type){ 00054 return false; 00055 } 00056 switch (type){ 00057 case TypeChare: 00058 if((data.chare.id.onPE == t.data.chare.id.onPE) && (data.chare.id.objPtr == t.data.chare.id.objPtr)){ 00059 return true; 00060 }else{ 00061 return false; 00062 } 00063 //break; unreachable 00064 case TypeGroup: 00065 case TypeNodeGroup: 00066 if((data.group.onPE == t.data.group.onPE) && (data.group.id == t.data.group.id)){ 00067 return true; 00068 }else{ 00069 return false; 00070 } 00071 //break; unreachable 00072 case TypeArray: 00073 bool val; 00074 if(data.array.id == t.data.array.id && data.array.idx.asChild().compare(t.data.array.idx.asChild())){ 00075 val = true; 00076 }else{ 00077 val = false; 00078 } 00079 return val; 00080 // break; unreachable 00081 } 00082 return false; 00083 } 00084 00085 void* getObject(); 00086 00087 inline int guessPE(); 00088 00089 char *toString(char *buf) const; 00090 00091 inline void updatePosition(int PE); 00092 }; 00093 00094 PUPbytes(CkObjID) 00095 00096 typedef unsigned int MCount; //Message Count 00097 00098 #endif
1.5.5