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