00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 #ifndef __CVME_H
00039 #define __CVME_H
00040 
00041 #ifndef __CVMEPTR_H
00042 #include <CVMEptr.h>
00043 #endif
00044 
00045 #ifndef __REFPTR_H
00046 #include <Refptr.h>
00047 #endif
00048 
00049 template<class T>
00050 class CVME
00051 {
00052 private:
00053   CRefcountedPtr<CVMEptr<T> > m_pRCptr;  
00054                                          
00055   UInt_t   m_nOffset;                    
00056 
00057  public:
00058   
00059   enum VmeSpace {
00060     a16d16,
00061     a24d16,
00062     a24d32,
00063     a32d32,
00064     geo
00065   };
00066 
00067   
00068   CVME<T>(VmeSpace space, UInt_t base, UInt_t length, UInt_t crate=0);
00069   CVME<T>();
00070   CVME<T>(CVMEptr<T>* aCVMEptr);
00071   
00072   CVME<T>(const CVME& aCVME);
00073   
00074   CVME<T>& operator= (const CVME<T>& aCVME);
00075 
00076   
00077   int operator== (const CVME<T>& aCVME)
00078     {
00079       return (m_pRCptr == aCVME.m_pRCptr);
00080     }
00081 
00082   
00083  protected:
00084   void setRCptr(CVMEptr<T> aRCptr) { m_pRCptr = aRCptr; }
00085 
00086   
00087  public:
00088   UInt_t getOffset() { return m_nOffset;  }
00089   UInt_t getLength() { return m_pRCptr.operator*().getLength(); }
00090   Address_t getStart() { return m_pRCptr.operator*().getStart(); }
00091   Address_t getgenptr(UInt_t nOffset);
00092   Address_t getcurrptr();
00093 
00094   
00095  public:
00096   
00097   T& operator*();
00098   T* operator->();
00099   T& operator[] (UInt_t nOffset);
00100   T& operator[] (UInt_t nOffset) const;
00101 
00102   
00103   CVME<T>& operator+(UInt_t nOffset);
00104   CVME<T>& operator-(UInt_t nOffset);
00105   CVME<T>& operator+=(UInt_t nOffset);
00106   CVME<T>& operator-=(UInt_t nOffset);
00107 
00108   
00109   CVME<T>& operator++();
00110   CVME<T>& operator--();
00111 
00112   
00113   CVME<T>& operator++(Int_t);
00114   CVME<T>& operator--(Int_t);
00115 
00116   
00117  public:
00118   volatile UChar_t*      asChar();
00119   volatile UShort_t*  asShort();
00120   volatile ULong_t*   asLong();
00121 };
00122 
00123 
00124 
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138 
00139 template<class T>
00140 CVME<T>::CVME(VmeSpace space, UInt_t base, UInt_t length, UInt_t crate) :
00141   m_nOffset(0)
00142 {
00143   CRefcountedPtr<CVMEptr<T> > p(new CVMEptr<T>(space, base, length, crate));
00144   m_pRCptr = p;
00145 }
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 template<class T>
00157 CVME<T>::CVME() :
00158   m_nOffset(0)
00159 {
00160   m_pRCptr = 0;
00161 }
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 template<class T>
00175 CVME<T>::CVME(CVMEptr<T>* aCVMEptr) :
00176   m_nOffset(0)
00177 {
00178   m_pRCptr = CRefcountedPtr<CVMEptr<T> >(aCVMEptr);
00179 
00180 }
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 template<class T>
00192 CVME<T>::CVME(const CVME<T>& aCVME) :
00193   m_pRCptr(aCVME.m_pRCptr),
00194   m_nOffset(aCVME.m_nOffset)
00195 {
00196 
00197 }
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 template<class T>
00209 CVME<T>&
00210 CVME<T>::operator=(const CVME<T>& aCVME)
00211 {
00212   if(this != &aCVME) {
00213   
00214     m_nOffset = m_nOffset;
00215     m_pRCptr  = aCVME.m_pRCptr;
00216   }
00217   return *this;
00218 }
00219 
00220 
00221 
00222 
00223 
00224 
00225 
00226 
00227 
00228 
00229 
00230 template<class T>
00231 T&
00232 CVME<T>::operator*()
00233 {
00234   try {
00235     return (*m_pRCptr)[m_nOffset];
00236   }
00237   catch(CRangeError& re) {
00238     throw re;
00239   }
00240 }
00241 
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 template<class T>
00253 T*
00254 CVME<T>::operator->()
00255 {
00256   UInt_t nOffset = m_pRCptr->getOffset();
00257 
00258   try {
00259     m_pRCptr->setOffset(m_nOffset);
00260     T* ptr =  m_pRCptr.operator*().operator->();   
00261     m_pRCptr->setOffset(nOffset);
00262     return ptr;
00263   }
00264   catch(CRangeError& re) {
00265     m_pRCptr->setOffset(nOffset);                  
00266     throw re;
00267   }
00268 }
00269 
00270 
00271 
00272 
00273 
00274 
00275 
00276 
00277 
00278 
00279 
00280 
00281 
00282 template<class T>
00283 T&
00284 CVME<T>::operator[](UInt_t nOffset)
00285 {
00286   try {
00287     return m_pRCptr.operator*().operator[](nOffset + m_nOffset);
00288   }
00289   catch(CRangeError& re) { 
00290     throw re;
00291   }
00292 }
00293 
00294 
00295 
00296 
00297 
00298 
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 template<class T>
00307 T&
00308 CVME<T>::operator[](UInt_t nOffset) const
00309 {
00310   try {
00311     return m_pRCptr.operator*().operator[](nOffset + m_nOffset);
00312   }
00313   catch(CRangeError& re) {
00314     throw re;
00315   }
00316 }
00317 
00318 
00319 
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 
00328 
00329 
00330 
00331 
00332 
00333 
00334 template<class T>
00335 CVME<T>&
00336 CVME<T>::operator+(UInt_t nOffset)
00337 {
00338   CVME<T> result(*this);
00339   result.m_nOffset += nOffset;
00340   return result;
00341 
00342 }
00343 
00344 
00345 
00346 
00347 
00348 
00349 
00350 
00351 
00352 
00353 
00354 template<class T>
00355 CVME<T>&
00356 CVME<T>::operator-(UInt_t nOffset)
00357 {
00358   return operator+(-nOffset);
00359 
00360 }
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 
00371 
00372 
00373 
00374 
00375 template<class T>
00376 CVME<T>&
00377 CVME<T>::operator+=(UInt_t nOffset)
00378 {
00379   m_nOffset += nOffset;
00380   return *this;
00381 
00382 }
00383 
00384 
00385 
00386 
00387 
00388 
00389 
00390 
00391 
00392 
00393 
00394 
00395 
00396 
00397 template<class T>
00398 CVME<T>&
00399 CVME<T>::operator-=(UInt_t nOffset)
00400 {
00401   m_nOffset -= nOffset;
00402   return *this;
00403 
00404 }
00405 
00406 
00407 
00408 
00409 
00410 
00411 
00412 
00413 
00414 
00415 
00416 template<class T>
00417 CVME<T>&
00418 CVME<T>::operator++()
00419 {
00420   m_nOffset++;
00421   return *this;
00422 
00423 }
00424 
00425 
00426 
00427 
00428 
00429 
00430 
00431 
00432 
00433 
00434 
00435 template<class T>
00436 CVME<T>&
00437 CVME<T>::operator--()
00438 {
00439   m_nOffset--;
00440   return *this;
00441 
00442 }
00443 
00444 
00445 
00446 
00447 
00448 
00449 
00450 
00451 
00452 
00453 
00454 
00455 
00456 
00457 template<class T>
00458 CVME<T>&
00459 CVME<T>::operator++(Int_t n)
00460 {
00461   CVME<T> result(*this);
00462   m_nOffset++;
00463   return result;
00464 
00465 }
00466 
00467 
00468 
00469 
00470 
00471 
00472 
00473 
00474 
00475 
00476 
00477 
00478 
00479 
00480 template<class T>
00481 CVME<T>&
00482 CVME<T>::operator--(Int_t n)
00483 {
00484   CVME<T> result(*this);
00485   m_nOffset--;
00486   return result;
00487 
00488 }
00489 
00490 
00491 
00492 
00493 
00494 
00495 
00496 
00497 
00498 
00499 
00500 
00501 
00502 template<class T>
00503 Address_t
00504 CVME<T>::getgenptr(UInt_t nOffset)
00505 {
00506   Address_t p = m_pRCptr.operator*().getgenptr(nOffset+m_nOffset);
00507   if(p) return p;
00508   else return (Address_t)-1;
00509 }
00510 
00511 
00512 
00513 
00514 
00515 
00516 
00517 
00518 
00519 
00520 
00521 template<class T>
00522 Address_t
00523 CVME<T>::getcurrptr()
00524 {
00525   Address_t p = m_pRCptr.operator*().getgenptr(m_nOffset);
00526   return p;
00527 }
00528 
00529 
00530 
00531 
00532 
00533 
00534 
00535 
00536 
00537 
00538 
00539 template<class T>
00540 volatile UChar_t*
00541 CVME<T>::asChar()
00542 {
00543   volatile UChar_t* p = (UChar_t*)m_pRCptr->getStart();
00544   p         += m_pRCptr->getOffset() * sizeof(T)/sizeof(UChar_t);
00545 
00546   return p;
00547 
00548 }
00549 
00550 
00551 
00552 
00553 
00554 
00555 
00556 
00557 
00558 
00559 
00560 template<class T>
00561 volatile UShort_t*
00562 CVME<T>::asShort()
00563 {
00564   volatile UShort_t* p = (UShort_t*)m_pRCptr->getStart();
00565   p         += m_nOffset * sizeof(T)/sizeof(UShort_t);
00566 
00567   return p;
00568 }
00569 
00570 
00571 
00572 
00573 
00574 
00575 
00576 
00577 
00578 
00579 
00580 template<class T>
00581 volatile ULong_t*
00582 CVME<T>::asLong()
00583 {
00584   volatile ULong_t* p = (ULong_t*)m_pRCptr->getStart();
00585   p         += m_nOffset * sizeof(T)/sizeof(ULong_t);
00586 
00587   return p;
00588 }
00589 #endif