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