GME
13
|
00001 00002 #ifndef MGA_COREUTILITIES_H 00003 #define MGA_COREUTILITIES_H 00004 00005 typedef OBJECTID OBJID; 00006 00007 #include <vector> 00008 00009 // --------------------------- ID Pair 00010 00011 struct metaobjidpair_type 00012 { 00013 long metaid; 00014 long objid; 00015 }; 00016 00017 static bool operator==(const metaobjidpair_type& a, const metaobjidpair_type& b) { return a.objid == b.objid && a.metaid == b.metaid; } 00018 00019 00020 struct metaobjidpair_hashfunc 00021 { 00022 size_t operator()(const metaobjidpair_type &idpair) const 00023 { 00024 return (((size_t)idpair.metaid) << 8) + ((size_t)idpair.objid); 00025 } 00026 }; 00027 00028 00029 00030 struct metaobjidpair_equalkey 00031 { 00032 bool operator()(const metaobjidpair_type &a, const metaobjidpair_type &b) const 00033 { 00034 return a.objid == b.objid && a.metaid == b.metaid; 00035 } 00036 }; 00037 00038 struct metaobjidpair_less 00039 { 00040 bool operator()(const metaobjidpair_type& a, const metaobjidpair_type& b) const 00041 { 00042 if( a.metaid < b.metaid ) 00043 return true; 00044 else if( a.metaid > b.metaid ) 00045 return false; 00046 else if( a.objid < b.objid ) 00047 return true; 00048 else 00049 return false; 00050 } 00051 }; 00052 00053 struct metaobjid2pair_hashfunc : public stdext::hash_compare<metaobjidpair_type, metaobjidpair_less> 00054 { 00055 size_t operator()(const metaobjidpair_type &idpair) const 00056 { 00057 return (((size_t)idpair.metaid) << 8) + ((size_t)idpair.objid); 00058 } 00059 bool operator()(const metaobjidpair_type &a, const metaobjidpair_type &b) const 00060 { 00061 // implement < logic here !!! 00062 return metaobjidpair_less()( a, b); 00063 } 00064 }; 00065 00066 inline void CopyTo(const metaobjidpair_type &idpair, VARIANT *v) 00067 { CopyTo((long*)&idpair, (long*)&idpair + 2, v); } 00068 00069 inline void CopyTo(const std::vector<metaobjidpair_type> &idpairs, VARIANT *v) 00070 { 00071 if(idpairs.empty()) 00072 { 00073 long*pnull=NULL; 00074 CopyTo(pnull,pnull, v); 00075 } 00076 else 00077 { 00078 CopyTo((long*)&idpairs[0], (long*)(&idpairs[0] + idpairs.size()), v); 00079 } 00080 } 00081 00082 inline void CopyTo(const VARIANT &v, metaobjidpair_type &idpair) 00083 { 00084 long bound = GetArrayLength(v); 00085 00086 if( bound <= 0 ) 00087 { 00088 idpair.metaid = METAID_NONE; 00089 idpair.objid = OBJID_NONE; 00090 } 00091 else if( bound == 2 ) 00092 CopyTo(v, (long*)&idpair, (long*)&idpair + 2); 00093 else 00094 HR_THROW(E_INVALIDARG); 00095 } 00096 00097 inline void GetArrayBounds(const VARIANT &v, metaobjidpair_type *&start, metaobjidpair_type *&end) 00098 { 00099 GetArrayStart(v, *(long**)&start); 00100 00101 ASSERT( GetArrayLength(v) % 2 == 0 ); 00102 end = start + (GetArrayLength(v) / 2); 00103 } 00104 00105 #endif//MGA_COREUTILITIES_H