CMGDK r49-rc2
|
00001 # i f n d e f H G L _ S M A R T _ I N C L U D E 00002 00003 # d e f i n e H G L _ S M A R T _ I N C L U D E 00004 00005 00006 00007 # i n c l u d e < h g l / M a c r o . h > 00008 00009 # i n c l u d e < h g l / t h r e a d / A t o m i c . h > 00010 00011 # i n c l u d e < h g l / T y p e F u n c . h > 00012 00013 n a m e s p a c e h g l 00014 00015 { 00016 00017 s t r u c t R e f C o u n t 00018 00019 { 00020 00021 a t o m _ u i n t c o u n t ; 00022 00023 a t o m _ u i n t w e a k ; 00024 00025 00026 00027 p u b l i c : 00028 00029 00030 00031 R e f C o u n t ( ) 00032 00033 { 00034 00035 c o u n t = 1 ; 00036 00037 w e a k = 0 ; 00038 00039 } 00040 00041 00042 00043 v i r t u a l ~ R e f C o u n t ( ) 00044 00045 { 00046 00047 } 00048 00049 00050 00051 v i r t u a l v o i d D e l e t e ( ) = 0 ; 00052 00053 00054 00055 i n t i n c _ r e f ( ) 00056 00057 { 00058 00059 r e t u r n + + c o u n t ; 00060 00061 } 00062 00063 00064 00065 v i r t u a l i n t u n r e f ( ) 00066 00067 { 00068 00069 c o u n t - - ; 00070 00071 00072 00073 i f ( c o u n t < = 0 ) 00074 00075 { 00076 00077 D e l e t e ( ) ; 00078 00079 00080 00081 i f ( w e a k < = 0 ) 00082 00083 d e l e t e t h i s ; 00084 00085 00086 00087 r e t u r n 0 ; 00088 00089 } 00090 00091 00092 00093 r e t u r n c o u n t ; 00094 00095 } 00096 00097 00098 00099 i n t i n c _ r e f _ w e a k ( ) 00100 00101 { 00102 00103 r e t u r n + + w e a k ; 00104 00105 } 00106 00107 00108 00109 i n t u n r e f _ w e a k ( ) 00110 00111 { 00112 00113 w e a k - - ; 00114 00115 00116 00117 i f ( w e a k < = 0 ) 00118 00119 { 00120 00121 i f ( c o u n t < = 0 ) 00122 00123 { 00124 00125 d e l e t e t h i s ; 00126 00127 r e t u r n 0 ; 00128 00129 } 00130 00131 } 00132 00133 00134 00135 r e t u r n w e a k ; 00136 00137 } 00138 00139 } ; / / s t r u c t R e f C o u n t 00140 00141 00142 00143 t e m p l a t e < t y p e n a m e T > s t r u c t S m a r t D a t a : p u b l i c R e f C o u n t 00144 00145 { 00146 00147 T * d a t a ; 00148 00149 00150 00151 p u b l i c : 00152 00153 00154 00155 S m a r t D a t a ( T * p t r ) 00156 00157 { 00158 00159 d a t a = p t r ; 00160 00161 } 00162 00163 00164 00165 ~ S m a r t D a t a ( ) 00166 00167 { 00168 00169 D e l e t e ( ) ; 00170 00171 } 00172 00173 00174 00175 v o i d D e l e t e ( ) 00176 00177 { 00178 00179 S A F E _ C L E A R ( d a t a ) ; 00180 00181 } 00182 00183 } ; / / s t r u c t t e m p l a t e < t y p e n a m e T > s t r u c t S m a r t D a t a 00184 00185 00186 00187 t e m p l a t e < t y p e n a m e T > s t r u c t S m a r t A r r a y D a t a : p u b l i c R e f C o u n t 00188 00189 { 00190 00191 T * d a t a ; 00192 00193 00194 00195 p u b l i c : 00196 00197 00198 00199 S m a r t A r r a y D a t a ( T * p t r ) 00200 00201 { 00202 00203 d a t a = p t r ; 00204 00205 } 00206 00207 00208 00209 ~ S m a r t A r r a y D a t a ( ) 00210 00211 { 00212 00213 D e l e t e ( ) ; 00214 00215 } 00216 00217 00218 00219 v o i d D e l e t e ( ) 00220 00221 { 00222 00223 S A F E _ C L E A R _ A R R A Y ( d a t a ) ; 00224 00225 } 00226 00227 } ; / / s t r u c t t e m p l a t e < t y p e n a m e T > s t r u c t S m a r t A r r a y D a t a 00228 00229 00230 00231 t e m p l a t e < t y p e n a m e S D , t y p e n a m e T > c l a s s _ S m a r t 00232 00233 { 00234 00235 p r o t e c t e d : 00236 00237 00238 00239 t y p e d e f _ S m a r t < S D , T > S e l f C l a s s ; 00240 00241 00242 00243 S D * s d ; 00244 00245 00246 00247 p u b l i c : 00248 00249 00250 00251 _ S m a r t ( ) 00252 00253 { 00254 00255 s d = 0 ; 00256 00257 } 00258 00259 00260 00261 _ S m a r t ( T * p t r ) 00262 00263 { 00264 00265 s d = n e w S D ( p t r ) ; 00266 00267 } 00268 00269 00270 00271 _ S m a r t ( c o n s t S e l f C l a s s & s t ) 00272 00273 { 00274 00275 s d = 0 ; 00276 00277 00278 00279 s e t ( s t ) ; 00280 00281 } 00282 00283 00284 00285 v i r t u a l ~ _ S m a r t ( ) 00286 00287 { 00288 00289 } 00290 00291 00292 00293 T * s e t ( T * p t r ) 00294 00295 { 00296 00297 i f ( s d ) 00298 00299 s d - > u n r e f ( ) ; 00300 00301 00302 00303 i f ( ! p t r ) 00304 00305 { 00306 00307 s d = 0 ; 00308 00309 r e t u r n ( 0 ) ; 00310 00311 } 00312 00313 00314 00315 s d = n e w S D ( p t r ) ; 00316 00317 00318 00319 r e t u r n p t r ; 00320 00321 } 00322 00323 00324 00325 v o i d i n c _ r e f ( c o n s t S e l f C l a s s & s c ) 00326 00327 { 00328 00329 u n r e f ( ) ; 00330 00331 00332 00333 s d = s c . s d ; 00334 00335 00336 00337 i f ( s d ) 00338 00339 s d - > i n c _ r e f ( ) ; 00340 00341 } 00342 00343 00344 00345 v o i d u n r e f ( ) 00346 00347 { 00348 00349 i f ( s d ) 00350 00351 { 00352 00353 s d - > u n r e f ( ) ; 00354 00355 s d = 0 ; 00356 00357 } 00358 00359 } 00360 00361 00362 00363 v o i d i n c _ r e f _ w e a k ( c o n s t S e l f C l a s s & s c ) 00364 00365 { 00366 00367 u n r e f ( ) ; 00368 00369 00370 00371 s d = s c . s d ; 00372 00373 00374 00375 i f ( s d ) 00376 00377 s d - > i n c _ r e f _ w e a k ( ) ; 00378 00379 } 00380 00381 00382 00383 v o i d u n r e f _ w e a k ( ) 00384 00385 { 00386 00387 i f ( s d ) 00388 00389 { 00390 00391 s d - > u n r e f _ w e a k ( ) ; 00392 00393 s d = 0 ; 00394 00395 } 00396 00397 } 00398 00399 00400 00401 T * g e t ( ) c o n s t { r e t u r n s d ? s d - > d a t a : 0 ; } 00402 00403 b o o l v a l i d ( ) c o n s t { r e t u r n s d ; } 00404 00405 i n t u s e _ c o u n t ( ) c o n s t { r e t u r n s d ? s d - > c o u n t : - 1 ; } 00406 00407 b o o l o n l y ( ) c o n s t { r e t u r n s d ? s d - > c o u n t = = 1 : t r u e ; } 00408 00409 00410 00411 p u b l i c : 00412 00413 00414 00415 T & o p e r a t o r * ( ) c o n s t { r e t u r n * ( s d - > d a t a ) ; } 00416 00417 b o o l o p e r a t o r ! ( ) c o n s t { r e t u r n s d ? ! ( s d - > d a t a ) : t r u e ; } 00418 00419 00420 00421 o p e r a t o r T * ( ) c o n s t { r e t u r n ( s d ? s d - > d a t a : 0 ) ; } 00422 00423 T * o p e r a t o r - > ( ) c o n s t { r e t u r n ( s d ? s d - > d a t a : 0 ) ; } 00424 00425 00426 00427 b o o l o p e r a t o r = = ( c o n s t S e l f C l a s s & r p ) c o n s t { r e t u r n ( g e t ( ) = = r p . g e t ( ) ) ; } 00428 00429 b o o l o p e r a t o r = = ( c o n s t T * r p ) c o n s t { r e t u r n ( g e t ( ) = = r p ) ; } 00430 00431 00432 00433 b o o l o p e r a t o r ! = ( c o n s t S e l f C l a s s & r p ) c o n s t { r e t u r n ! ( o p e r a t o r = = ( r p ) ) ; } 00434 00435 b o o l o p e r a t o r ! = ( c o n s t T * r p ) c o n s t { r e t u r n ! ( o p e r a t o r = = ( r p ) ) ; } 00436 00437 } ; / / t e m p l a t e < t y p e n a m e T > c l a s s _ S m a r t 00438 00439 00440 00441 t e m p l a t e < t y p e n a m e T > c l a s s W e a k P t r ; 00442 00443 00444 00445 / * * 00446 00447 * qQNcpenc{|< b r > 00448 00449 * (uNꁨRʑ>eQ\O(uWvc 00450 00451 * / 00452 00453 t e m p l a t e < t y p e n a m e T > c l a s s S h a r e d P t r : p u b l i c _ S m a r t < S m a r t D a t a < T > , T > / / / qQNcpenc{| 00454 00455 { 00456 00457 f r i e n d c l a s s W e a k P t r < T > ; 00458 00459 00460 00461 p u b l i c : 00462 00463 00464 00465 t y p e d e f _ S m a r t < S m a r t D a t a < T > , T > S u p e r C l a s s ; 00466 00467 t y p e d e f S h a r e d P t r < T > S e l f C l a s s ; 00468 00469 00470 00471 p u b l i c : 00472 00473 00474 00475 S h a r e d P t r ( ) : S u p e r C l a s s ( ) { } 00476 00477 S h a r e d P t r ( T * p t r ) : S u p e r C l a s s ( p t r ) { } 00478 00479 S h a r e d P t r ( c o n s t S e l f C l a s s & s p ) : S u p e r C l a s s ( ) 00480 00481 { 00482 00483 o p e r a t o r = ( s p ) ; 00484 00485 } 00486 00487 00488 00489 S h a r e d P t r ( c o n s t W e a k P t r < T > & w p ) : S u p e r C l a s s ( ) 00490 00491 { 00492 00493 o p e r a t o r = ( w p ) ; 00494 00495 } 00496 00497 00498 00499 ~ S h a r e d P t r ( ) 00500 00501 { 00502 00503 S u p e r C l a s s : : u n r e f ( ) ; 00504 00505 } 00506 00507 00508 00509 o p e r a t o r T * ( ) 00510 00511 { 00512 00513 r e t u r n S u p e r C l a s s : : g e t ( ) ; 00514 00515 } 00516 00517 00518 00519 o p e r a t o r c o n s t T * ( ) c o n s t 00520 00521 { 00522 00523 r e t u r n S u p e r C l a s s : : g e t ( ) ; 00524 00525 } 00526 00527 00528 00529 T * o p e r a t o r = ( T * p t r ) 00530 00531 { 00532 00533 r e t u r n S u p e r C l a s s : : s e t ( p t r ) ; 00534 00535 } 00536 00537 00538 00539 S e l f C l a s s & o p e r a t o r = ( c o n s t S e l f C l a s s & s p ) 00540 00541 { 00542 00543 S u p e r C l a s s : : i n c _ r e f ( s p ) ; 00544 00545 00546 00547 r e t u r n ( * t h i s ) ; 00548 00549 } 00550 00551 00552 00553 S e l f C l a s s & o p e r a t o r = ( c o n s t W e a k P t r < T > & w p ) 00554 00555 { 00556 00557 S u p e r C l a s s : : i n c _ r e f ( w p ) ; 00558 00559 00560 00561 r e t u r n ( * t h i s ) ; 00562 00563 } 00564 00565 } ; / / t e m p l a t e < t y p e n a m e T > c l a s s S h a r e d P t r 00566 00567 00568 00569 t e m p l a t e < t y p e n a m e T > c l a s s W e a k A r r a y ; 00570 00571 00572 00573 / * * 00574 00575 * qQN5Rpenc{|[(WS h a r e d P t r vW@x 00576 NXRN[ ] d\O&{NS(W RdeO(ud e l e t e [ ] 00577 00578 * / 00579 00580 t e m p l a t e < t y p e n a m e T > c l a s s S h a r e d A r r a y : p u b l i c _ S m a r t < S m a r t A r r a y D a t a < T > , T > / / / qQN5Rpenc{| 00581 00582 { 00583 00584 f r i e n d c l a s s W e a k A r r a y < T > ; 00585 00586 00587 00588 p u b l i c : 00589 00590 00591 00592 t y p e d e f _ S m a r t < S m a r t A r r a y D a t a < T > , T > S u p e r C l a s s ; 00593 00594 t y p e d e f S h a r e d A r r a y < T > S e l f C l a s s ; 00595 00596 00597 00598 p u b l i c : 00599 00600 00601 00602 S h a r e d A r r a y ( ) : S u p e r C l a s s ( ) { } 00603 00604 S h a r e d A r r a y ( T * p t r ) : S u p e r C l a s s ( p t r ) { } 00605 00606 S h a r e d A r r a y ( c o n s t S e l f C l a s s & s a ) : S u p e r C l a s s ( ) 00607 00608 { 00609 00610 o p e r a t o r = ( s a ) ; 00611 00612 } 00613 00614 00615 00616 S h a r e d A r r a y ( c o n s t W e a k A r r a y < T > & w a ) : S u p e r C l a s s ( ) 00617 00618 { 00619 00620 o p e r a t o r = ( w a ) ; 00621 00622 } 00623 00624 00625 00626 ~ S h a r e d A r r a y ( ) 00627 00628 { 00629 00630 S u p e r C l a s s : : u n r e f ( ) ; 00631 00632 } 00633 00634 00635 00636 o p e r a t o r T * ( ) 00637 00638 { 00639 00640 r e t u r n S u p e r C l a s s : : g e t ( ) ; 00641 00642 } 00643 00644 00645 00646 o p e r a t o r c o n s t T * ( ) c o n s t 00647 00648 { 00649 00650 r e t u r n S u p e r C l a s s : : g e t ( ) ; 00651 00652 } 00653 00654 00655 00656 T & o p e r a t o r [ ] ( i n t n ) 00657 00658 { 00659 00660 r e t u r n S u p e r C l a s s : : s d - > d a t a [ n ] ; 00661 00662 } 00663 00664 00665 00666 S e l f C l a s s & o p e r a t o r = ( c o n s t S e l f C l a s s & s a p ) 00667 00668 { 00669 00670 S u p e r C l a s s : : i n c _ r e f ( s a p ) ; 00671 00672 00673 00674 r e t u r n ( * t h i s ) ; 00675 00676 } 00677 00678 00679 00680 S e l f C l a s s & o p e r a t o r = ( c o n s t W e a k P t r < T > & w p ) 00681 00682 { 00683 00684 S u p e r C l a s s : : i n c _ r e f ( w p ) ; 00685 00686 00687 00688 r e t u r n ( * t h i s ) ; 00689 00690 } 00691 00692 } ; / / t e m p l a t e < t y p e n a m e T > c l a s s S h a r e d A r r a y 00693 00694 00695 00696 t e m p l a t e < t y p e n a m e T > c l a s s W e a k P t r : p u b l i c _ S m a r t < S m a r t D a t a < T > , T > 00697 00698 { 00699 00700 f r i e n d c l a s s S h a r e d P t r < T > ; 00701 00702 00703 00704 p u b l i c : 00705 00706 00707 00708 t y p e d e f _ S m a r t < S m a r t D a t a < T > , T > S u p e r C l a s s ; 00709 00710 t y p e d e f W e a k P t r < T > S e l f C l a s s ; 00711 00712 00713 00714 p u b l i c : 00715 00716 00717 00718 W e a k P t r ( ) : S u p e r C l a s s ( ) { } 00719 00720 W e a k P t r ( c o n s t S h a r e d P t r < T > & s p ) : S u p e r C l a s s ( ) 00721 00722 { 00723 00724 o p e r a t o r = ( s p ) ; 00725 00726 } 00727 00728 00729 00730 W e a k P t r ( c o n s t S e l f C l a s s & w p ) : S u p e r C l a s s ( ) 00731 00732 { 00733 00734 o p e r a t o r = ( w p ) ; 00735 00736 } 00737 00738 00739 00740 ~ W e a k P t r ( ) 00741 00742 { 00743 00744 S u p e r C l a s s : : u n r e f _ w e a k ( ) ; 00745 00746 } 00747 00748 00749 00750 o p e r a t o r T * ( ) 00751 00752 { 00753 00754 r e t u r n S u p e r C l a s s : : g e t ( ) ; 00755 00756 } 00757 00758 00759 00760 o p e r a t o r c o n s t T * ( ) c o n s t 00761 00762 { 00763 00764 r e t u r n S u p e r C l a s s : : g e t ( ) ; 00765 00766 } 00767 00768 00769 00770 v i r t u a l S u p e r C l a s s & o p e r a t o r = ( c o n s t S h a r e d P t r < T > & s p ) 00771 00772 { 00773 00774 S u p e r C l a s s : : i n c _ r e f _ w e a k ( s p ) ; 00775 00776 00777 00778 r e t u r n ( * t h i s ) ; 00779 00780 } 00781 00782 00783 00784 v i r t u a l S e l f C l a s s & o p e r a t o r = ( c o n s t S e l f C l a s s & w p ) 00785 00786 { 00787 00788 S u p e r C l a s s : : i n c _ r e f _ w e a k ( w p ) ; 00789 00790 00791 00792 r e t u r n ( * t h i s ) ; 00793 00794 } 00795 00796 } ; / / t e m p l a t e < t y p e n a m e T > c l a s s W e a k P t r 00797 00798 00799 00800 t e m p l a t e < t y p e n a m e T > c l a s s W e a k A r r a y : p u b l i c _ S m a r t < S m a r t A r r a y D a t a < T > , T > 00801 00802 { 00803 00804 f r i e n d c l a s s S h a r e d A r r a y < T > ; 00805 00806 00807 00808 p u b l i c : 00809 00810 00811 00812 t y p e d e f _ S m a r t < S m a r t A r r a y D a t a < T > , T > S u p e r C l a s s ; 00813 00814 t y p e d e f W e a k A r r a y < T > S e l f C l a s s ; 00815 00816 00817 00818 p u b l i c : 00819 00820 00821 00822 W e a k A r r a y ( ) : S u p e r C l a s s ( ) { } 00823 00824 W e a k A r r a y ( c o n s t S h a r e d A r r a y < T > & s a p ) : S u p e r C l a s s ( ) 00825 00826 { 00827 00828 o p e r a t o r = ( s a p ) ; 00829 00830 } 00831 00832 00833 00834 W e a k A r r a y ( c o n s t W e a k A r r a y < T > & w a p ) : S u p e r C l a s s ( ) 00835 00836 { 00837 00838 o p e r a t o r = ( w a p ) ; 00839 00840 } 00841 00842 00843 00844 ~ W e a k A r r a y ( ) 00845 00846 { 00847 00848 S u p e r C l a s s : : u n r e f _ w e a k ( ) ; 00849 00850 } 00851 00852 00853 00854 o p e r a t o r T * ( ) 00855 00856 { 00857 00858 r e t u r n S u p e r C l a s s : : g e t ( ) ; 00859 00860 } 00861 00862 00863 00864 o p e r a t o r c o n s t T * ( ) c o n s t 00865 00866 { 00867 00868 r e t u r n S u p e r C l a s s : : g e t ( ) ; 00869 00870 } 00871 00872 00873 00874 v i r t u a l S u p e r C l a s s & o p e r a t o r = ( c o n s t S h a r e d A r r a y < T > & s a p ) 00875 00876 { 00877 00878 S u p e r C l a s s : : i n c _ r e f _ w e a k ( s a p ) ; 00879 00880 00881 00882 r e t u r n ( * t h i s ) ; 00883 00884 } 00885 00886 00887 00888 v i r t u a l S e l f C l a s s & o p e r a t o r = ( c o n s t S e l f C l a s s & w a p ) 00889 00890 { 00891 00892 S u p e r C l a s s : : i n c _ r e f _ w e a k ( w a p ) ; 00893 00894 00895 00896 r e t u r n ( * t h i s ) ; 00897 00898 } 00899 00900 } ; / / t e m p l a t e < t y p e n a m e T > c l a s s W e a k A r r a y 00901 00902 } / / n a m e s p a c e h g l 00903 00904 # e n d i f / / H G L _ S M A R T _ I N C L U D E 00905 00906