GME
13
|
00001 #ifndef OclViolation_h 00002 #define OclViolation_h 00003 00004 #include "OCLCommon.h" 00005 #include "unknwn.h" 00006 // cannot use _com_ptr_t instead of IUnknown * 00007 // because of incluse mess 00008 // CComPtr does not work in vectors 00009 00010 namespace std { 00011 00012 class PtrVector : public vector<IUnknown *> //z! 00013 { 00014 public: 00015 PtrVector() : vector<IUnknown *>() 00016 { 00017 } 00018 00019 PtrVector(const PtrVector &vect) 00020 { 00021 copy(vect); 00022 } 00023 00024 PtrVector & operator =(const PtrVector &vect) 00025 { 00026 copy(vect); 00027 return *this; 00028 } 00029 00030 void copy(const PtrVector &vect) 00031 { 00032 int len = size(); 00033 for (int k=0; k<len; k++) 00034 { 00035 IUnknown *ptr = (*this)[k]; 00036 if (ptr) 00037 { 00038 ptr->Release(); 00039 (*this)[k] = NULL; 00040 } 00041 } 00042 clear(); 00043 size_t lenx = vect.size(); 00044 for (size_t kk=0; kk<lenx; kk++) 00045 { 00046 IUnknown *ptr = vect[kk]; 00047 if (ptr) 00048 ptr->AddRef(); 00049 push_back(ptr); 00050 } 00051 } 00052 00053 virtual ~PtrVector() 00054 { 00055 EraseAll(); 00056 } 00057 00058 void clear() 00059 { 00060 EraseAll(); 00061 vector<IUnknown *>::clear(); 00062 } 00063 00064 void pop_back() 00065 { 00066 IUnknown* element = back(); 00067 if (element) 00068 element->Release(); 00069 vector<IUnknown *>::pop_back(); 00070 } 00071 00072 iterator erase(iterator it) 00073 { 00074 if (*it) 00075 (*it)->Release(); 00076 return vector<IUnknown *>::erase(it); 00077 00078 } 00079 00080 iterator erase(iterator first, iterator last) 00081 { 00082 for (iterator t = first; t != last; t++) 00083 { 00084 if (*t) 00085 (*t)->Release(); 00086 } 00087 return vector<IUnknown *>::erase(first, last); 00088 } 00089 00090 void EraseAll() 00091 { 00092 int len = size(); 00093 for (int k=0; k<len; k++) 00094 { 00095 IUnknown *ptr = (*this)[k]; 00096 if (ptr) 00097 { 00098 ptr->Release(); 00099 (*this)[k] = NULL; 00100 } 00101 } 00102 } 00103 }; 00104 00105 }; // namespace std 00106 00107 namespace OclTree 00108 { 00109 struct Violation { 00110 bool bIsException; 00111 std::string strMessage; 00112 std::string strSignature; 00113 std::string methodName; 00114 Position position; 00115 StringVector vecVariables; 00116 StringVector vecObjects; 00117 std::PtrVector vecObjectsPtr; 00118 }; 00119 00120 typedef std::vector< Violation > ViolationVector; 00121 } 00122 00123 #endif // OclViolation_h