00001 #ifndef __rmRefArray_h 00002 #define __rmRefArray_h 00003 00004 #include "rmStatusArray.h" 00005 00020 template<class T> 00021 class rmRefArray : public rmStatusArray<T> 00022 { 00023 public: 00024 rmRefArray(){} 00025 virtual ~rmRefArray(){} 00026 00028 virtual int addElement(const T & aElement, unsigned long aID); 00030 virtual int modifyElement(unsigned long aID, const T & aElement); 00032 virtual int removeElement(unsigned long aID); 00033 00035 virtual long addRef(unsigned long aID); 00037 virtual long release(unsigned long aID); 00038 }; 00039 00058 template<class T> int 00059 rmRefArray<T>::addElement(const T & aElement, unsigned long aID) 00060 { 00061 if (aID > mMaxId) 00062 return RMCLIENT_ERROR_BASE_ID; 00063 00064 pair<map<unsigned long, T>::iterator, bool> ret; 00065 ret = mElementArray.insert(make_pair(aID, aElement)); 00066 00067 if(!ret.second) 00068 return RMCLIENT_ERROR_BASE_INSERT; 00069 00070 ret.first->second.refCnt = 0; 00071 00072 mMaxId++; 00073 if(mMaxId == 0) 00074 mMaxId++; 00075 00076 return RMCLIENT_SUCCESS; 00077 } 00078 00093 template<class T> int 00094 rmRefArray<T>::modifyElement(unsigned long aID, const T & aElement) 00095 { 00096 int ret; 00097 map<unsigned long, T>::iterator pos; 00098 00099 ret = findId(aID, &pos); 00100 if(ret) 00101 return ret; 00102 00103 if(pos->second.refCnt > 0) 00104 return RMCLIENT_ERROR_CC_REFCNT; 00105 00106 pos->second = aElement; 00107 00108 return RMCLIENT_SUCCESS; 00109 } 00110 00123 template<class T> int 00124 rmRefArray<T>::removeElement(unsigned long aID) 00125 { 00126 int ret; 00127 map<unsigned long, T>::iterator pos; 00128 00129 ret = findId(aID, &pos); 00130 if(ret) 00131 return ret; 00132 00133 if(pos->second.refCnt > 0) 00134 return RMCLIENT_ERROR_CC_REFCNT; 00135 00136 mElementArray.erase(pos); 00137 mPos = mElementArray.begin(); 00138 00139 return RMCLIENT_SUCCESS; 00140 } 00141 00151 template<class T> long 00152 rmRefArray<T>::addRef(unsigned long aID) 00153 { 00154 int ret; 00155 map<unsigned long, T>::iterator pos; 00156 00157 ret = findId(aID, &pos); 00158 if(ret) 00159 return -1; 00160 00161 if(pos->second.status != ACTIVE) 00162 return -1; 00163 00164 return ++(pos->second.refCnt); 00165 } 00166 00176 template<class T> long 00177 rmRefArray<T>::release(unsigned long aID) 00178 { 00179 int ret; 00180 map<unsigned long, T>::iterator pos; 00181 00182 ret = findId(aID, &pos); 00183 if(ret) 00184 return -1; 00185 00186 if(pos->second.status != ACTIVE) 00187 return -1; 00188 00189 return --(pos->second.refCnt); 00190 } 00191 00192 00193 #endif //__rmRefArray_h