00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef COH_MEMBER_HOLDER_HPP
00017 #define COH_MEMBER_HOLDER_HPP
00018
00019 #include "coherence/lang/compatibility.hpp"
00020
00021 #include "coherence/lang/Object.hpp"
00022 #include "coherence/lang/SmartMember.hpp"
00023 #include "coherence/lang/SynchronizedMemberReadBlock.hpp"
00024 #include "coherence/lang/SynchronizedMemberWriteBlock.hpp"
00025 #include "coherence/lang/TypedHandle.hpp"
00026 #include "coherence/lang/TypedHolder.hpp"
00027
00028 #include <ostream>
00029
00030 COH_OPEN_NAMESPACE2(coherence,lang)
00031
00032 class Object;
00033 template<class T> class MemberHandle;
00034 template<class T> class MemberView;
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 template<class T>
00053 class MemberHolder
00054 : public SmartMember
00055 {
00056
00057
00058 public:
00059
00060
00061
00062 typedef const T ValueType;
00063
00064
00065
00066
00067 typedef typename T::Handle ValueHandle;
00068
00069
00070
00071
00072 typedef typename T::View ValueView;
00073
00074
00075
00076
00077 typedef TypedHolder<T> GetType;
00078
00079
00080
00081
00082 public:
00083
00084
00085
00086 MemberHolder(Object& oParent)
00087 : SmartMember(oParent), m_fView(false), m_po(NULL)
00088 {
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 template<class DT> MemberHolder(Object& oParent, const TypedHandle<DT>& th)
00103 : SmartMember(oParent), m_fView(false), m_po(NULL)
00104 {
00105
00106 if (typeid(DT*) == typeid(const DT*))
00107 {
00108 MemberHolder<T>::setView(th);
00109 }
00110 else
00111 {
00112
00113
00114
00115
00116 MemberHolder<T>::setHandle((T*) get_pointer(th));
00117 }
00118 }
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 template<class DT> MemberHolder(Object& oParent, const TypedHolder<DT>& th)
00130 : SmartMember(oParent), m_fView(false), m_po(NULL)
00131 {
00132 operator=(th);
00133 }
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 template<class DT> MemberHolder(Object& oParent, const MemberHolder<DT>& that)
00144 : SmartMember(oParent), m_fView(false), m_po(NULL)
00145 {
00146 operator=(that);
00147 }
00148
00149
00150
00151
00152 ~MemberHolder()
00153 {
00154 try
00155 {
00156 setHandle(ValueHandle());
00157 }
00158 catch (const std::exception& e)
00159 {
00160
00161 std::cerr << "Error during ~MemberHolder: " << e.what() << std::endl;
00162 return;
00163 }
00164 }
00165
00166 protected:
00167
00168
00169
00170
00171
00172 MemberHolder()
00173 : SmartMember(), m_fView(false), m_po(NULL)
00174 {
00175 }
00176
00177 private:
00178
00179
00180
00181 MemberHolder(const MemberHolder&);
00182
00183
00184
00185
00186 public:
00187
00188
00189
00190
00191
00192
00193
00194
00195 MemberHolder& operator=(const MemberHolder& that)
00196 {
00197 operator=((TypedHolder<T>) that);
00198 return *this;
00199 }
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 template<class DT> MemberHolder& operator=(const MemberHolder<DT>& mh)
00210 {
00211 operator=((TypedHolder<DT>) mh);
00212 return *this;
00213 }
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 template<class DT> MemberHolder& operator=(const TypedHolder<DT>& th)
00224 {
00225 set(th);
00226 return *this;
00227 }
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237 template<class DT> MemberHolder& operator=(const TypedHandle<DT>& h)
00238 {
00239
00240 if (typeid(DT*) == typeid(const DT*))
00241 {
00242 setView(h);
00243 }
00244 else
00245 {
00246
00247
00248
00249
00250 setHandle((T*) get_pointer(h));
00251 }
00252 return *this;
00253 }
00254
00255 template<class DT>
00256 MemberHolder& operator=(MemberHandle<DT>& mh)
00257 {
00258 return operator=((ValueHandle) mh);
00259 }
00260
00261 template<class DT>
00262 MemberHolder& operator=(const MemberHandle<DT>& mh)
00263 {
00264 return operator=((ValueView) mh);
00265 }
00266
00267 template<class DT>
00268 MemberHolder& operator=(const MemberView<DT>& mv)
00269 {
00270 return operator=((ValueView) mv);
00271 }
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 MemberHolder& operator=(const T* cp)
00282 {
00283 return operator=((ValueView) cp);
00284 }
00285
00286
00287
00288
00289
00290
00291 operator ValueView() const
00292 {
00293 SynchronizedMemberReadBlock syncRead(getParent());
00294 return m_po;
00295 }
00296
00297
00298
00299
00300
00301
00302 template<class PT>
00303 operator TypedHandle<const PT>() const
00304 {
00305 return (ValueView) *this;
00306 }
00307
00308
00309
00310
00311
00312
00313 template<class PT>
00314 operator TypedHolder<PT>() const
00315 {
00316 return get();
00317 }
00318
00319
00320
00321
00322
00323
00324 ValueView operator->() const
00325 {
00326 return (ValueView) *this;
00327 }
00328
00329
00330
00331
00332
00333
00334
00335
00336 template<class AT>
00337 bool operator==(const MemberHolder<AT>& mh) const
00338 {
00339 typename MemberHolder<AT>::ValueView v = mh;
00340 return operator==(v);
00341 }
00342
00343
00344
00345
00346
00347
00348
00349
00350 template<class AT>
00351 bool operator!=(const MemberHolder<AT>& mh) const
00352 {
00353 return !operator==(mh);
00354 }
00355
00356
00357
00358
00359
00360
00361
00362
00363 template<class AT>
00364 bool operator==(const TypedHolder<AT>& th) const
00365 {
00366 return operator==(get_pointer((typename TypedHolder<AT>::ValueView) th));
00367 }
00368
00369
00370
00371
00372
00373
00374
00375
00376 template<class AT>
00377 bool operator!=(const TypedHolder<AT>& th) const
00378 {
00379 return !operator==(th);
00380 }
00381
00382
00383
00384
00385
00386
00387
00388
00389 template<class AT>
00390 bool operator==(const TypedHandle<AT>& h) const
00391 {
00392 return operator==(get_pointer(h));
00393 }
00394
00395
00396
00397
00398
00399
00400
00401
00402 template<class AT>
00403 bool operator!=(const TypedHandle<AT>& h) const
00404 {
00405 return !operator==(h);
00406 }
00407
00408
00409
00410
00411
00412
00413
00414
00415 bool operator==(const Object* cpThat) const
00416 {
00417 SynchronizedMemberReadBlock syncRead(getParent());
00418 return ((const Object*) m_po) == cpThat;
00419 }
00420
00421
00422
00423
00424
00425
00426
00427
00428 bool operator!=(const Object* cpThat) const
00429 {
00430 return !operator==(cpThat);
00431 }
00432
00433
00434
00435
00436 protected:
00437
00438
00439
00440
00441
00442
00443 void setView(const TypedHandle<const T>& v, SynchronizedMemberWriteBlock *pSync = NULL)
00444 {
00445 const T* cpNew = get_pointer(v);
00446 const T* cpAttach = (NULL == cpNew || NULL == cpNew->_attach() ? NULL : cpNew);
00447 const T* cpDetach = NULL;
00448 T* pDetach = NULL;
00449
00450
00451 {
00452 SynchronizedMemberWriteBlock syncWrite(getParent(), pSync);
00453 if (m_fView)
00454 {
00455 cpDetach = m_po;
00456 }
00457 else
00458 {
00459 pDetach = m_po;
00460 }
00461
00462 m_po = const_cast<T*>(cpAttach);
00463 m_fView = cpAttach != NULL;
00464 }
00465
00466 if (pDetach)
00467 {
00468 pDetach->_detach();
00469 }
00470 else if (cpDetach)
00471 {
00472 cpDetach->_detach();
00473 }
00474 }
00475
00476
00477
00478
00479
00480
00481
00482 void setHandle(const TypedHandle<T>& h, SynchronizedMemberWriteBlock *pSync = NULL)
00483 {
00484 T* pNew = get_pointer(h);
00485 T* pAttach = (NULL == pNew || NULL == pNew->_attach() ? NULL : pNew);
00486 T* pDetach = NULL;
00487 const T* cpDetach = NULL;
00488
00489
00490 {
00491 SynchronizedMemberWriteBlock syncWrite(getParent(), pSync);
00492 if (m_fView)
00493 {
00494 cpDetach = m_po;
00495 }
00496 else
00497 {
00498 pDetach = m_po;
00499 }
00500
00501 m_po = pAttach;
00502 m_fView = false;
00503 }
00504
00505 if (pDetach)
00506 {
00507 pDetach->_detach();
00508 }
00509 else if (cpDetach)
00510 {
00511 cpDetach->_detach();
00512 }
00513 }
00514
00515
00516
00517
00518
00519
00520
00521
00522 template<class DT> void set(const TypedHolder<DT>& th, SynchronizedMemberWriteBlock *pSync = NULL)
00523 {
00524 ValueHandle hThat = cast<typename DT::Handle>(th, false);
00525 if (NULL == hThat)
00526 {
00527 setView(th, pSync);
00528 }
00529 else
00530 {
00531 setHandle(hThat, pSync);
00532 }
00533 }
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544 TypedHolder<T> get(SynchronizedMemberReadBlock* pSync = NULL) const
00545 {
00546 SynchronizedMemberReadBlock syncRead(getParent(), pSync);
00547 if (m_fView)
00548 {
00549 return (ValueView) m_po;
00550 }
00551 return (ValueHandle) m_po;
00552 }
00553
00554
00555
00556
00557 private:
00558
00559
00560
00561
00562 bool m_fView;
00563
00564
00565
00566
00567 T* m_po;
00568
00569
00570
00571
00572
00573
00574
00575 template<class> friend class Array;
00576
00577
00578
00579
00580 friend class SynchronizedMemberReadBlock;
00581
00582
00583
00584
00585 friend class SynchronizedMemberWriteBlock;
00586 };
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600 template<class T> std::ostream& operator<<(std::ostream& out, const MemberHolder<T>& th)
00601 {
00602 out << (typename T::View) th;
00603 return out;
00604 }
00605
00606
00607
00608
00609
00610
00611 template<class T> void clear_handle(MemberHolder<T>& mh)
00612 {
00613 static TypedHandle<T> hNull;
00614 mh = hNull;
00615 }
00616
00617
00618
00619
00620
00621
00622
00623
00624 template<class T>
00625 bool is_null(const MemberHolder<T>& mh)
00626 {
00627 return NULL == mh;
00628 }
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641 template<class D, class T>
00642 D cast(const MemberHolder<T>& mh, bool fThrow = true)
00643 {
00644 return cast<D>((TypedHolder<T>) mh, fThrow);
00645 }
00646
00647
00648
00649
00650
00651
00652
00653
00654 template<class D, class T>
00655 bool instanceof(const MemberHolder<T>& mh)
00656 {
00657 return instanceof<D>((TypedHolder<T>) mh);
00658 }
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668 template<class AT, class T>
00669 bool operator==(const TypedHandle<AT>& h, const MemberHolder<T>& mh)
00670 {
00671 return mh == h;
00672 }
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682 template<class T>
00683 bool operator==(const Object* cpo, const MemberHolder<T>& mh)
00684 {
00685 return mh == cpo;
00686 }
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696 template<class AT, class T>
00697 bool operator!=(const TypedHandle<AT>& h, const MemberHolder<T>& mh)
00698 {
00699 return mh != h;
00700 }
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710 template<class T>
00711 bool operator!=(const Object* cpo, const MemberHolder<T>& mh)
00712 {
00713 return mh != cpo;
00714 }
00715
00716 COH_CLOSE_NAMESPACE2
00717
00718 #endif // COH_MEMBER_HOLDER_HPP
Copyright (c) 2000-2008 Oracle. All rights reserved.