GME  13
CoreUtilities.h
Go to the documentation of this file.
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