mirror of
				https://github.com/boostorg/smart_ptr.git
				synced 2025-11-04 01:31:51 +01:00 
			
		
		
		
	Compare commits
	
		
			604 Commits
		
	
	
		
			boost-1.16
			...
			boost-1.55
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					9b964f6881 | ||
| 
						 | 
					be06392771 | ||
| 
						 | 
					fc20a29c99 | ||
| 
						 | 
					6eefc6bf81 | ||
| 
						 | 
					9355404d10 | ||
| 
						 | 
					240c66e633 | ||
| 
						 | 
					e497aec58a | ||
| 
						 | 
					579b347267 | ||
| 
						 | 
					3178d38137 | ||
| 
						 | 
					e39fcad839 | ||
| 
						 | 
					de6dc3a26e | ||
| 
						 | 
					72095a4804 | ||
| 
						 | 
					dcc1713c59 | ||
| 
						 | 
					f6d5257597 | ||
| 
						 | 
					d3a549e93a | ||
| 
						 | 
					c55ffa1cab | ||
| 
						 | 
					049d0698b7 | ||
| 
						 | 
					5ba3312519 | ||
| 
						 | 
					6a218a5ef2 | ||
| 
						 | 
					c14369aac9 | ||
| 
						 | 
					7ab4f6ce92 | ||
| 
						 | 
					c28bef2e9b | ||
| 
						 | 
					5fc6fe474b | ||
| 
						 | 
					d42ce87557 | ||
| 
						 | 
					b306c9751f | ||
| 
						 | 
					c03bfd0b4d | ||
| 
						 | 
					08e5894510 | ||
| 
						 | 
					3551d17566 | ||
| 
						 | 
					32fe0b8f26 | ||
| 
						 | 
					88c2baa20b | ||
| 
						 | 
					ea55019260 | ||
| 
						 | 
					2346941b15 | ||
| 
						 | 
					c7b6e56b30 | ||
| 
						 | 
					215771c83d | ||
| 
						 | 
					2805ae9362 | ||
| 
						 | 
					cb0797acf0 | ||
| 
						 | 
					e8103f9774 | ||
| 
						 | 
					71eb435412 | ||
| 
						 | 
					4a2dad1574 | ||
| 
						 | 
					babc72757d | ||
| 
						 | 
					c19cbc1892 | ||
| 
						 | 
					d065e4d971 | ||
| 
						 | 
					777b86a661 | ||
| 
						 | 
					aae5440854 | ||
| 
						 | 
					227d2e3255 | ||
| 
						 | 
					8bf183b373 | ||
| 
						 | 
					5017da2514 | ||
| 
						 | 
					c2048732d8 | ||
| 
						 | 
					5979c1d4bd | ||
| 
						 | 
					3090f6f4af | ||
| 
						 | 
					40073ef64f | ||
| 
						 | 
					b9970eda45 | ||
| 
						 | 
					9147489b4c | ||
| 
						 | 
					d1348ea05e | ||
| 
						 | 
					90db9a6435 | ||
| 
						 | 
					1c208ad3ea | ||
| 
						 | 
					5fc9bf5bc5 | ||
| 
						 | 
					c846d230f0 | ||
| 
						 | 
					7b097467d6 | ||
| 
						 | 
					7cb040edb0 | ||
| 
						 | 
					d6ac116b71 | ||
| 
						 | 
					8abc8889d1 | ||
| 
						 | 
					c5b47e2136 | ||
| 
						 | 
					7c0815c567 | ||
| 
						 | 
					210288f02e | ||
| 
						 | 
					cf7b6904e8 | ||
| 
						 | 
					b978919dd1 | ||
| 
						 | 
					1086aff971 | ||
| 
						 | 
					445e8d1728 | ||
| 
						 | 
					545745d649 | ||
| 
						 | 
					d71cc6ab08 | ||
| 
						 | 
					0d77fd0678 | ||
| 
						 | 
					6ca6d3ce6f | ||
| 
						 | 
					cfc82854d3 | ||
| 
						 | 
					b9d77d877e | ||
| 
						 | 
					1f50e3abe4 | ||
| 
						 | 
					697f338510 | ||
| 
						 | 
					f4386409d9 | ||
| 
						 | 
					ba349679f3 | ||
| 
						 | 
					a3b84f8586 | ||
| 
						 | 
					b0fd8a6b08 | ||
| 
						 | 
					4f5062004a | ||
| 
						 | 
					f040bed751 | ||
| 
						 | 
					2f8945a885 | ||
| 
						 | 
					2bd0778778 | ||
| 
						 | 
					eec640bfd7 | ||
| 
						 | 
					754fd941ee | ||
| 
						 | 
					e94f64039d | ||
| 
						 | 
					63b17c24ea | ||
| 
						 | 
					8a421c2098 | ||
| 
						 | 
					5fa1cbf6e1 | ||
| 
						 | 
					9f30442d1e | ||
| 
						 | 
					a4293f9dfa | ||
| 
						 | 
					28de0cb1e3 | ||
| 
						 | 
					a1b4fc8d95 | ||
| 
						 | 
					77971c6ff5 | ||
| 
						 | 
					1742c37942 | ||
| 
						 | 
					31e06b4a1d | ||
| 
						 | 
					22f1b092c9 | ||
| 
						 | 
					5a2771e585 | ||
| 
						 | 
					dad59f3325 | ||
| 
						 | 
					bad394b1e9 | ||
| 
						 | 
					f93110620a | ||
| 
						 | 
					6be1e3fceb | ||
| 
						 | 
					cf91287732 | ||
| 
						 | 
					0da6902267 | ||
| 
						 | 
					10f6ff8b77 | ||
| 
						 | 
					13f91c15f0 | ||
| 
						 | 
					a2c5208b8e | ||
| 
						 | 
					55583ac749 | ||
| 
						 | 
					c40b306647 | ||
| 
						 | 
					d9b9921d23 | ||
| 
						 | 
					6f91ea87c3 | ||
| 
						 | 
					ed79000ea8 | ||
| 
						 | 
					6e804e64b8 | ||
| 
						 | 
					395766e2d3 | ||
| 
						 | 
					774332f85a | ||
| 
						 | 
					f5990cab65 | ||
| 
						 | 
					6175baf858 | ||
| 
						 | 
					2fb567b3f2 | ||
| 
						 | 
					2b25579338 | ||
| 
						 | 
					a97cd2d0cc | ||
| 
						 | 
					e3b9389a24 | ||
| 
						 | 
					6ba78f76f6 | ||
| 
						 | 
					8c7954a53a | ||
| 
						 | 
					556b9fe563 | ||
| 
						 | 
					77ab953171 | ||
| 
						 | 
					991b02b03e | ||
| 
						 | 
					31d0c48f18 | ||
| 
						 | 
					1b49f08cb8 | ||
| 
						 | 
					034c12d244 | ||
| 
						 | 
					f884c53bd6 | ||
| 
						 | 
					07b4c17980 | ||
| 
						 | 
					1bc4f16ff8 | ||
| 
						 | 
					774a8d330c | ||
| 
						 | 
					0fd94d6d56 | ||
| 
						 | 
					866590ee97 | ||
| 
						 | 
					2a92df56f2 | ||
| 
						 | 
					a9cd84f43d | ||
| 
						 | 
					366472fc35 | ||
| 
						 | 
					2bfe13c9c4 | ||
| 
						 | 
					83e2510ce5 | ||
| 
						 | 
					31685fe551 | ||
| 
						 | 
					05e050abe0 | ||
| 
						 | 
					d261079616 | ||
| 
						 | 
					d52878df88 | ||
| 
						 | 
					4b0490c0ae | ||
| 
						 | 
					2f1b1acc7a | ||
| 
						 | 
					f0f9f72be6 | ||
| 
						 | 
					efdc390bc9 | ||
| 
						 | 
					d13f1d8694 | ||
| 
						 | 
					83c43617af | ||
| 
						 | 
					da323af72d | ||
| 
						 | 
					0c4aaef77c | ||
| 
						 | 
					440fcb7ba0 | ||
| 
						 | 
					18a6c1add8 | ||
| 
						 | 
					357d3c4d54 | ||
| 
						 | 
					4bb747fb27 | ||
| 
						 | 
					f13591ef2b | ||
| 
						 | 
					e3422efec6 | ||
| 
						 | 
					a01e4c3f83 | ||
| 
						 | 
					6f8dc5923c | ||
| 
						 | 
					7dc6b3d810 | ||
| 
						 | 
					2251b1d2df | ||
| 
						 | 
					8b3907ae81 | ||
| 
						 | 
					77f2d3f614 | ||
| 
						 | 
					93545d5cf2 | ||
| 
						 | 
					9e92c6354c | ||
| 
						 | 
					e12ed6864b | ||
| 
						 | 
					b541145a60 | ||
| 
						 | 
					ca344809ba | ||
| 
						 | 
					7802c695ef | ||
| 
						 | 
					71fa2cd658 | ||
| 
						 | 
					04be979670 | ||
| 
						 | 
					35f2af947c | ||
| 
						 | 
					3a578ac7c1 | ||
| 
						 | 
					9365853fde | ||
| 
						 | 
					16828c9c0a | ||
| 
						 | 
					2fe899cdfe | ||
| 
						 | 
					b45d011d5a | ||
| 
						 | 
					4094c23537 | ||
| 
						 | 
					f85a1bf406 | ||
| 
						 | 
					dbd62686a3 | ||
| 
						 | 
					e4f638025c | ||
| 
						 | 
					d8296b3933 | ||
| 
						 | 
					b4885a1dd6 | ||
| 
						 | 
					748b1baee8 | ||
| 
						 | 
					4880292c07 | ||
| 
						 | 
					6b25c57712 | ||
| 
						 | 
					373c52efa3 | ||
| 
						 | 
					acb6824ef7 | ||
| 
						 | 
					316d00c3fc | ||
| 
						 | 
					515be965bd | ||
| 
						 | 
					6ef32e1627 | ||
| 
						 | 
					2452705117 | ||
| 
						 | 
					bb076d67e6 | ||
| 
						 | 
					b08789b784 | ||
| 
						 | 
					5df69a8946 | ||
| 
						 | 
					dc6a8f0696 | ||
| 
						 | 
					af7d4fabad | ||
| 
						 | 
					d17a096407 | ||
| 
						 | 
					d7448b5746 | ||
| 
						 | 
					f22516d650 | ||
| 
						 | 
					b30aa1468a | ||
| 
						 | 
					5b17f88f0e | ||
| 
						 | 
					1c2d780f9e | ||
| 
						 | 
					2eb3991630 | ||
| 
						 | 
					3a4dc43924 | ||
| 
						 | 
					a055d9829e | ||
| 
						 | 
					f596092bac | ||
| 
						 | 
					4ba016d29e | ||
| 
						 | 
					7ca6d86bdc | ||
| 
						 | 
					b2a3c9e59d | ||
| 
						 | 
					60ae24f4ae | ||
| 
						 | 
					dba6ebbb01 | ||
| 
						 | 
					d2194e3b24 | ||
| 
						 | 
					5ab6b24856 | ||
| 
						 | 
					e6f6ec9fa3 | ||
| 
						 | 
					f854829d86 | ||
| 
						 | 
					7b5beeedde | ||
| 
						 | 
					9e41d1f194 | ||
| 
						 | 
					f49a2fb1e1 | ||
| 
						 | 
					87c6b6b403 | ||
| 
						 | 
					9db307eda5 | ||
| 
						 | 
					5a85c1f0f2 | ||
| 
						 | 
					f5ce4dbc4c | ||
| 
						 | 
					b2354d0a5e | ||
| 
						 | 
					e0ca42bb88 | ||
| 
						 | 
					bca336bf35 | ||
| 
						 | 
					6646d8acd2 | ||
| 
						 | 
					c66f0aeecc | ||
| 
						 | 
					ecb41cb150 | ||
| 
						 | 
					ed8db8b5f2 | ||
| 
						 | 
					4ba37fce95 | ||
| 
						 | 
					94db735438 | ||
| 
						 | 
					5b57eff9b8 | ||
| 
						 | 
					f980da560a | ||
| 
						 | 
					ffba68221b | ||
| 
						 | 
					4d45e5b9b5 | ||
| 
						 | 
					86d3f0aba7 | ||
| 
						 | 
					66a25bd4a9 | ||
| 
						 | 
					745dbedbaa | ||
| 
						 | 
					26f83e75ef | ||
| 
						 | 
					ce72827dc7 | ||
| 
						 | 
					6e8f075d42 | ||
| 
						 | 
					ae6c180be8 | ||
| 
						 | 
					54e12d03fd | ||
| 
						 | 
					469578e976 | ||
| 
						 | 
					97118668e2 | ||
| 
						 | 
					1c3813ce52 | ||
| 
						 | 
					b440e85452 | ||
| 
						 | 
					d889751bc0 | ||
| 
						 | 
					0609322489 | ||
| 
						 | 
					b215e34650 | ||
| 
						 | 
					2f70e81b73 | ||
| 
						 | 
					6284a1abef | ||
| 
						 | 
					c464a07ab1 | ||
| 
						 | 
					41d4167533 | ||
| 
						 | 
					4a98c2931c | ||
| 
						 | 
					75bc821afd | ||
| 
						 | 
					ebc0af9147 | ||
| 
						 | 
					db0969d97b | ||
| 
						 | 
					39551bdc1a | ||
| 
						 | 
					6412de1dd5 | ||
| 
						 | 
					8d2f7fc5ef | ||
| 
						 | 
					7c477960d3 | ||
| 
						 | 
					7e5d7011e6 | ||
| 
						 | 
					ffd73c39b3 | ||
| 
						 | 
					4fcee64483 | ||
| 
						 | 
					75cd88112c | ||
| 
						 | 
					203764eb51 | ||
| 
						 | 
					6e120f4bf1 | ||
| 
						 | 
					747c9a1d3e | ||
| 
						 | 
					7ce5b55f5c | ||
| 
						 | 
					e38d0daaab | ||
| 
						 | 
					f3e94d8ca0 | ||
| 
						 | 
					c36e023162 | ||
| 
						 | 
					00f744bf1e | ||
| 
						 | 
					24d1e6f8dd | ||
| 
						 | 
					ae0a48d544 | ||
| 
						 | 
					e427716dc2 | ||
| 
						 | 
					8c256502cc | ||
| 
						 | 
					a86b2f7fbf | ||
| 
						 | 
					a196f39cd0 | ||
| 
						 | 
					90b5a3736a | ||
| 
						 | 
					2d25f8f036 | ||
| 
						 | 
					3771707bb7 | ||
| 
						 | 
					239bb6d966 | ||
| 
						 | 
					25ca855127 | ||
| 
						 | 
					0127c06692 | ||
| 
						 | 
					9edd3beebc | ||
| 
						 | 
					92a027fbeb | ||
| 
						 | 
					7880720bc1 | ||
| 
						 | 
					235994873f | ||
| 
						 | 
					7bfddbccf6 | ||
| 
						 | 
					c6a4e93a05 | ||
| 
						 | 
					ff7e027648 | ||
| 
						 | 
					08f517b5b0 | ||
| 
						 | 
					6b3f961542 | ||
| 
						 | 
					0db2a88403 | ||
| 
						 | 
					afc17037de | ||
| 
						 | 
					0cee41d47e | ||
| 
						 | 
					eb3d3464db | ||
| 
						 | 
					8d2aeea3a8 | ||
| 
						 | 
					675d09723a | ||
| 
						 | 
					24c23b8064 | ||
| 
						 | 
					880c2e1062 | ||
| 
						 | 
					357f57d147 | ||
| 
						 | 
					8bacee46eb | ||
| 
						 | 
					4e4ec29fc9 | ||
| 
						 | 
					df1d8b27df | ||
| 
						 | 
					76722e125f | ||
| 
						 | 
					d24f6d3b97 | ||
| 
						 | 
					6ab6b66601 | ||
| 
						 | 
					559056c856 | ||
| 
						 | 
					13c128f98f | ||
| 
						 | 
					3ebc9b8f0b | ||
| 
						 | 
					361a7c3fd0 | ||
| 
						 | 
					faa675ad6a | ||
| 
						 | 
					319836fe78 | ||
| 
						 | 
					d0656015ad | ||
| 
						 | 
					f1a9148a43 | ||
| 
						 | 
					1942b64751 | ||
| 
						 | 
					a0eb5daf75 | ||
| 
						 | 
					6046a099ba | ||
| 
						 | 
					e0ee037e2d | ||
| 
						 | 
					13657c8bda | ||
| 
						 | 
					52587aaa05 | ||
| 
						 | 
					0669d41076 | ||
| 
						 | 
					8f2beee8e9 | ||
| 
						 | 
					3adfc7842c | ||
| 
						 | 
					613e684b30 | ||
| 
						 | 
					bfc0225cda | ||
| 
						 | 
					a67e505cf5 | ||
| 
						 | 
					adec862262 | ||
| 
						 | 
					c6bf857f8b | ||
| 
						 | 
					14024e2598 | ||
| 
						 | 
					34953d8a45 | ||
| 
						 | 
					09a0ba8c75 | ||
| 
						 | 
					b0eb65b433 | ||
| 
						 | 
					c830315dff | ||
| 
						 | 
					b07447aa6e | ||
| 
						 | 
					42a739b357 | ||
| 
						 | 
					7d59d29ad1 | ||
| 
						 | 
					5616a1a872 | ||
| 
						 | 
					e5c1e12a66 | ||
| 
						 | 
					8f317492ee | ||
| 
						 | 
					c81be1e2e7 | ||
| 
						 | 
					1bc58ea861 | ||
| 
						 | 
					27be736b8f | ||
| 
						 | 
					ef51f6a1de | ||
| 
						 | 
					6b00a55542 | ||
| 
						 | 
					858cefbfe8 | ||
| 
						 | 
					c7abff0099 | ||
| 
						 | 
					cb6cb636f7 | ||
| 
						 | 
					366d2666d4 | ||
| 
						 | 
					9c67a59d43 | ||
| 
						 | 
					7361e476b8 | ||
| 
						 | 
					e1bd18f6a6 | ||
| 
						 | 
					1346982b80 | ||
| 
						 | 
					c48f05dcb4 | ||
| 
						 | 
					53cc52127b | ||
| 
						 | 
					7fb399b3bb | ||
| 
						 | 
					93d69af60a | ||
| 
						 | 
					09c8685181 | ||
| 
						 | 
					15d6b2aace | ||
| 
						 | 
					feff6e40ea | ||
| 
						 | 
					26a93f224e | ||
| 
						 | 
					96f572b19b | ||
| 
						 | 
					d6c4633e89 | ||
| 
						 | 
					106a6d58d4 | ||
| 
						 | 
					debd953d8f | ||
| 
						 | 
					f2c5439644 | ||
| 
						 | 
					b4ec0e90fb | ||
| 
						 | 
					2d4eb92401 | ||
| 
						 | 
					192970b3b8 | ||
| 
						 | 
					7c36a640ae | ||
| 
						 | 
					794de98cd1 | ||
| 
						 | 
					dcdbaf1e57 | ||
| 
						 | 
					6dbec7621d | ||
| 
						 | 
					889cb6bee6 | ||
| 
						 | 
					11cddbbb45 | ||
| 
						 | 
					77c629b6e4 | ||
| 
						 | 
					d091ee85c0 | ||
| 
						 | 
					bc00d5fa1a | ||
| 
						 | 
					e760759414 | ||
| 
						 | 
					deab8ca1bb | ||
| 
						 | 
					300f8f7b9a | ||
| 
						 | 
					d7c841484a | ||
| 
						 | 
					f4dce1cb88 | ||
| 
						 | 
					b400d34bec | ||
| 
						 | 
					8f0bdd48f8 | ||
| 
						 | 
					6d6bcc7be9 | ||
| 
						 | 
					851d87a1bb | ||
| 
						 | 
					34f423f811 | ||
| 
						 | 
					190893a1ce | ||
| 
						 | 
					4244992d4d | ||
| 
						 | 
					4b502993b5 | ||
| 
						 | 
					a24ec3988a | ||
| 
						 | 
					23f7532a9f | ||
| 
						 | 
					a790191bc5 | ||
| 
						 | 
					86e9a322ba | ||
| 
						 | 
					98fa979aef | ||
| 
						 | 
					be0267f9a3 | ||
| 
						 | 
					44afc7e5cd | ||
| 
						 | 
					d2c7febd26 | ||
| 
						 | 
					ddf1f0fdcc | ||
| 
						 | 
					cd41426fe9 | ||
| 
						 | 
					89ea2156bc | ||
| 
						 | 
					fabd6e5755 | ||
| 
						 | 
					b60de38d28 | ||
| 
						 | 
					2dbfc89d4e | ||
| 
						 | 
					abb0d9e725 | ||
| 
						 | 
					d030182e87 | ||
| 
						 | 
					bd39e2eded | ||
| 
						 | 
					d04757128c | ||
| 
						 | 
					868062e81d | ||
| 
						 | 
					6bd66fe054 | ||
| 
						 | 
					c5bae28eeb | ||
| 
						 | 
					78a47d7619 | ||
| 
						 | 
					8eaf187dbd | ||
| 
						 | 
					d36a215554 | ||
| 
						 | 
					8448bbf0b9 | ||
| 
						 | 
					1dee6e0229 | ||
| 
						 | 
					e3f2329c14 | ||
| 
						 | 
					3e616752c9 | ||
| 
						 | 
					987a7d32fb | ||
| 
						 | 
					fafd9a863b | ||
| 
						 | 
					51e9783a21 | ||
| 
						 | 
					eee96e8059 | ||
| 
						 | 
					1ef2a5b059 | ||
| 
						 | 
					c5f7c973d9 | ||
| 
						 | 
					572a97d3c4 | ||
| 
						 | 
					a3d87ff623 | ||
| 
						 | 
					468f63261a | ||
| 
						 | 
					e60c1f9b49 | ||
| 
						 | 
					72bcb8ff46 | ||
| 
						 | 
					12b1871136 | ||
| 
						 | 
					9632464c45 | ||
| 
						 | 
					1311731e24 | ||
| 
						 | 
					980307a90a | ||
| 
						 | 
					1f9908be69 | ||
| 
						 | 
					0aaca2fffe | ||
| 
						 | 
					5dd2c62132 | ||
| 
						 | 
					fadc0716ce | ||
| 
						 | 
					ea285b4231 | ||
| 
						 | 
					8d6517484c | ||
| 
						 | 
					66a8e8b3c1 | ||
| 
						 | 
					c697e2ef21 | ||
| 
						 | 
					2e53e2e5d7 | ||
| 
						 | 
					8283ec826b | ||
| 
						 | 
					e32b2adfda | ||
| 
						 | 
					e555d33695 | ||
| 
						 | 
					de68e6ed1e | ||
| 
						 | 
					804b1483c7 | ||
| 
						 | 
					4b200e9847 | ||
| 
						 | 
					f34866e8a5 | ||
| 
						 | 
					45c799f40c | ||
| 
						 | 
					11a046f628 | ||
| 
						 | 
					b632f1ef20 | ||
| 
						 | 
					7f30268b10 | ||
| 
						 | 
					7504eff5af | ||
| 
						 | 
					8752c00ebf | ||
| 
						 | 
					d0c5e83def | ||
| 
						 | 
					f6b7ff4b34 | ||
| 
						 | 
					2314f20c4e | ||
| 
						 | 
					ff7410cad2 | ||
| 
						 | 
					57c0ad44f3 | ||
| 
						 | 
					ae60bcaffb | ||
| 
						 | 
					f2f616a95c | ||
| 
						 | 
					a8bb455df7 | ||
| 
						 | 
					9dcbc46225 | ||
| 
						 | 
					024f918b86 | ||
| 
						 | 
					0f05f41306 | ||
| 
						 | 
					4ea6decc7d | ||
| 
						 | 
					f79b8cb7ae | ||
| 
						 | 
					275cb77378 | ||
| 
						 | 
					b916445dd8 | ||
| 
						 | 
					c02fee7013 | ||
| 
						 | 
					e77889679f | ||
| 
						 | 
					b9dceb2340 | ||
| 
						 | 
					e84eb3f1ba | ||
| 
						 | 
					92999be436 | ||
| 
						 | 
					bd4f575567 | ||
| 
						 | 
					09016db3c3 | ||
| 
						 | 
					c2ee5172b0 | ||
| 
						 | 
					8436c4d271 | ||
| 
						 | 
					a09c2e556f | ||
| 
						 | 
					e650c7ff16 | ||
| 
						 | 
					c06b4206f2 | ||
| 
						 | 
					89435a6287 | ||
| 
						 | 
					5328674c2d | ||
| 
						 | 
					927fe73093 | ||
| 
						 | 
					053aa108e3 | ||
| 
						 | 
					b5e5c35696 | ||
| 
						 | 
					77ad156c52 | ||
| 
						 | 
					018c401e47 | ||
| 
						 | 
					f586d3f83e | ||
| 
						 | 
					3f0ebd4c71 | ||
| 
						 | 
					33077bda71 | ||
| 
						 | 
					547888d507 | ||
| 
						 | 
					af6fe18c9d | ||
| 
						 | 
					dca9628be3 | ||
| 
						 | 
					d84fa738ef | ||
| 
						 | 
					a322dc54dc | ||
| 
						 | 
					951c2b7e83 | ||
| 
						 | 
					23f68a5657 | ||
| 
						 | 
					ecb0b4478b | ||
| 
						 | 
					70255d46bb | ||
| 
						 | 
					4653c3673b | ||
| 
						 | 
					11eacab70e | ||
| 
						 | 
					110c0021e2 | ||
| 
						 | 
					4c5e355a0b | ||
| 
						 | 
					fbc9028313 | ||
| 
						 | 
					9b800d4f84 | ||
| 
						 | 
					513752eee5 | ||
| 
						 | 
					9eb1ba7e9f | ||
| 
						 | 
					fb5b1a20d2 | ||
| 
						 | 
					b89945d36a | ||
| 
						 | 
					220f35a0f1 | ||
| 
						 | 
					72f83165e0 | ||
| 
						 | 
					c17f8c36c1 | ||
| 
						 | 
					8e604a9da9 | ||
| 
						 | 
					3e0233a26c | ||
| 
						 | 
					aa98e2b37e | ||
| 
						 | 
					7b53c0040c | ||
| 
						 | 
					e6605637f8 | ||
| 
						 | 
					6dfe0896e3 | ||
| 
						 | 
					9f295cbb48 | ||
| 
						 | 
					76c19e6111 | ||
| 
						 | 
					6e6a2a013a | ||
| 
						 | 
					2482e00224 | ||
| 
						 | 
					7981b647c3 | ||
| 
						 | 
					875bab352c | ||
| 
						 | 
					862dc0001f | ||
| 
						 | 
					adc3ec3851 | ||
| 
						 | 
					5a6cd1cf3e | ||
| 
						 | 
					5e2f514140 | ||
| 
						 | 
					309e6dd82e | ||
| 
						 | 
					6c5d296722 | ||
| 
						 | 
					b1a1ab99aa | ||
| 
						 | 
					1b69c14f45 | ||
| 
						 | 
					cd8dea78e6 | ||
| 
						 | 
					d77b35f333 | ||
| 
						 | 
					6f7b927641 | ||
| 
						 | 
					d2e20cf56c | ||
| 
						 | 
					a6126b1370 | ||
| 
						 | 
					87f0accb23 | ||
| 
						 | 
					7add76dae8 | ||
| 
						 | 
					2a2f10fddd | ||
| 
						 | 
					0dd3285d56 | ||
| 
						 | 
					f9782387d9 | ||
| 
						 | 
					e1567707b1 | ||
| 
						 | 
					08df55159b | ||
| 
						 | 
					c29cc62d66 | ||
| 
						 | 
					6ed07733cb | ||
| 
						 | 
					ee3d3bd1e1 | ||
| 
						 | 
					758954a93f | ||
| 
						 | 
					590757e2b2 | ||
| 
						 | 
					ddd6d54426 | ||
| 
						 | 
					1a7cd887e4 | ||
| 
						 | 
					d3c76575f9 | ||
| 
						 | 
					b224270cc0 | ||
| 
						 | 
					8b5b780c2c | ||
| 
						 | 
					39c10f739d | ||
| 
						 | 
					4fdc84f29e | ||
| 
						 | 
					a8efe20862 | ||
| 
						 | 
					58c5711b47 | ||
| 
						 | 
					5d564a2f01 | ||
| 
						 | 
					09c1476063 | ||
| 
						 | 
					f255439ece | ||
| 
						 | 
					b104e9ae78 | ||
| 
						 | 
					4f964ce6ad | ||
| 
						 | 
					11ec515378 | ||
| 
						 | 
					1a9b1dd123 | ||
| 
						 | 
					a93dfc1837 | ||
| 
						 | 
					c5846378ab | ||
| 
						 | 
					aea7d0c9c8 | ||
| 
						 | 
					65c3f2dc85 | ||
| 
						 | 
					5fbc553611 | ||
| 
						 | 
					c41b060618 | ||
| 
						 | 
					c17921c417 | ||
| 
						 | 
					94287044ba | ||
| 
						 | 
					7c09884eac | ||
| 
						 | 
					a90a157ea6 | ||
| 
						 | 
					ac8d0f5505 | ||
| 
						 | 
					8f23f07740 | ||
| 
						 | 
					3b183163c9 | ||
| 
						 | 
					55a377b446 | ||
| 
						 | 
					2d342f0ddf | ||
| 
						 | 
					060ea4a573 | ||
| 
						 | 
					6a12efb77b | ||
| 
						 | 
					e57d3f4bc1 | ||
| 
						 | 
					16902b1f4f | ||
| 
						 | 
					cb1b1b7cc0 | ||
| 
						 | 
					26fe4c4078 | ||
| 
						 | 
					4e832788bf | ||
| 
						 | 
					db43d160b4 | ||
| 
						 | 
					1412e40490 | ||
| 
						 | 
					00c5642eb4 | ||
| 
						 | 
					d3347b6d08 | ||
| 
						 | 
					ed7e13da9f | ||
| 
						 | 
					90b7ec19d1 | ||
| 
						 | 
					468c41041b | 
							
								
								
									
										88
									
								
								compatibility.htm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								compatibility.htm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>Smart Pointer Changes</title>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
	</head>
 | 
			
		||||
	<body bgcolor="#ffffff" text="#000000">
 | 
			
		||||
		<h1><A href="../../index.htm"><img src="../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="277" height="86"
 | 
			
		||||
					border="0"></A>Smart Pointer Changes</h1>
 | 
			
		||||
		<p>The February 2002 change to the Boost smart pointers introduced a number of 
 | 
			
		||||
			changes. Since the previous version of the smart pointers was in use for a long 
 | 
			
		||||
			time, it's useful to have a detailed list of what changed from a library user's 
 | 
			
		||||
			point of view.</p>
 | 
			
		||||
		<p>Note that for compilers that don't support member templates well enough, a 
 | 
			
		||||
			separate implementation is used that lacks many of the new features and is more 
 | 
			
		||||
			like the old version.</p>
 | 
			
		||||
		<h2>Features Requiring Code Changes to Take Advantage</h2>
 | 
			
		||||
		<ul>
 | 
			
		||||
			<li>
 | 
			
		||||
				The smart pointer class templates now each have their own header file. For 
 | 
			
		||||
				compatibility, the <a href="../../boost/smart_ptr.hpp"><boost/smart_ptr.hpp></a>
 | 
			
		||||
			header now includes the headers for the four classic smart pointer class 
 | 
			
		||||
			templates.
 | 
			
		||||
			<li>
 | 
			
		||||
				The <b>weak_ptr</b>
 | 
			
		||||
			template was added.
 | 
			
		||||
			<li>
 | 
			
		||||
				The new <b>shared_ptr</b> and <b>shared_array</b> relax the requirement that 
 | 
			
		||||
				the pointed-to object's destructor must be visible when instantiating the <b>shared_ptr</b>
 | 
			
		||||
			destructor. This makes it easier to have shared_ptr members in classes without 
 | 
			
		||||
			explicit destructors.
 | 
			
		||||
			<li>
 | 
			
		||||
				A custom deallocator can be passed in when creating a <b>shared_ptr</b> or <b>shared_array</b>.
 | 
			
		||||
			<li>
 | 
			
		||||
				<b>shared_static_cast</b> and <b>shared_dynamic_cast</b> function templates are 
 | 
			
		||||
				provided which work for <b>shared_ptr</b> and <b>weak_ptr</b> as <b>static_cast</b>
 | 
			
		||||
				and <b>dynamic_cast</b>
 | 
			
		||||
			do for pointers.
 | 
			
		||||
			<li>
 | 
			
		||||
				The self-assignment misfeature has been removed from <b>shared_ptr::reset</b>, 
 | 
			
		||||
				although it is still present in <b>scoped_ptr</b>, and in <b>std::auto_ptr</b>. 
 | 
			
		||||
				Calling <b>reset</b> with a pointer to the object that's already owned by the <b>shared_ptr</b>
 | 
			
		||||
			results in undefined behavior (an assertion, or eventually a double-delete if 
 | 
			
		||||
			assertions are off).
 | 
			
		||||
			<li>
 | 
			
		||||
				The <b>BOOST_SMART_PTR_CONVERSION</b>
 | 
			
		||||
			feature has been removed.
 | 
			
		||||
			<li>
 | 
			
		||||
				<b>shared_ptr<void></b> is now allowed.</li>
 | 
			
		||||
		</ul>
 | 
			
		||||
		<h2>Features That Improve Robustness</h2>
 | 
			
		||||
		<ul>
 | 
			
		||||
			<li>
 | 
			
		||||
				The manipulation of use counts is now <a name="threadsafe">thread safe</a> on 
 | 
			
		||||
				Windows, Linux, and platforms that support pthreads. See the <a href="../../boost/detail/atomic_count.hpp">
 | 
			
		||||
					<boost/detail/atomic_count.hpp></a>
 | 
			
		||||
			file for details
 | 
			
		||||
			<li>
 | 
			
		||||
				The new shared_ptr will always delete the object using the pointer it was 
 | 
			
		||||
				originally constructed with. This prevents subtle problems that could happen if 
 | 
			
		||||
				the last <b>shared_ptr</b> was a pointer to a sub-object of a class that did 
 | 
			
		||||
				not have a virtual destructor.</li>
 | 
			
		||||
		</ul>
 | 
			
		||||
		<h2>Implementation Details</h2>
 | 
			
		||||
		<ul>
 | 
			
		||||
			<li>
 | 
			
		||||
				Some bugs in the assignment operator implementations and in <b>reset</b>
 | 
			
		||||
			have been fixed by using the "copy and swap" idiom.
 | 
			
		||||
			<li>
 | 
			
		||||
				Assertions have been added to check preconditions of various functions; 
 | 
			
		||||
				however, since these use the new <a href="../../boost/assert.hpp"><boost/assert.hpp></a>
 | 
			
		||||
			header, the assertions are disabled by default.
 | 
			
		||||
			<li>
 | 
			
		||||
				The partial specialization of <b>std::less</b> has been replaced by <b>operator<</b>
 | 
			
		||||
			overloads which accomplish the same thing without relying on undefined 
 | 
			
		||||
			behavior.
 | 
			
		||||
			<li>
 | 
			
		||||
				The incorrect overload of <b>std::swap</b> has been replaced by <b>boost::swap</b>, 
 | 
			
		||||
				which has many of the same advantages for generic programming but does not 
 | 
			
		||||
				violate the C++ standard.</li>
 | 
			
		||||
		</ul>
 | 
			
		||||
		<hr>
 | 
			
		||||
		<p>Revised 1 February 2002</p>
 | 
			
		||||
		<p><small>Copyright 2002 Darin Adler. Distributed under the Boost Software License, Version 
 | 
			
		||||
				1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A> or 
 | 
			
		||||
				copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										95
									
								
								enable_shared_from_this.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								enable_shared_from_this.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>Boost: enable_shared_from_this.hpp documentation</title>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
	</head>
 | 
			
		||||
	<body bgcolor="white" style="MARGIN-LEFT: 5%; MARGIN-RIGHT: 5%">
 | 
			
		||||
		<table border="0" width="100%">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td width="277"><A href="../../index.htm"> <img src="../../boost.png" alt="boost.png (6897 bytes)" width="277" height="86" border="0"></A>
 | 
			
		||||
				</td>
 | 
			
		||||
				<td align="center">
 | 
			
		||||
					<h1>enable_shared_from_this.hpp</h1>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td colspan="2" height="64"> </td>
 | 
			
		||||
			</tr>
 | 
			
		||||
		</table>
 | 
			
		||||
		<h3><a name="Purpose">Purpose</a></h3>
 | 
			
		||||
		<p>
 | 
			
		||||
			The header <STRONG><boost/enable_shared_from_this.hpp></STRONG> defines 
 | 
			
		||||
			the class template <STRONG>enable_shared_from_this</STRONG>. It is used as a 
 | 
			
		||||
			base class that allows a <A href="shared_ptr.htm">shared_ptr</A> to the current 
 | 
			
		||||
			object to be obtained from within a member function.
 | 
			
		||||
		</p>
 | 
			
		||||
		<P><STRONG>enable_shared_from_this<T></STRONG> defines two member functions 
 | 
			
		||||
			called <STRONG>shared_from_this</STRONG> that return a <STRONG>shared_ptr<T></STRONG>
 | 
			
		||||
			and <STRONG>shared_ptr<T const></STRONG>, depending on constness, to <STRONG>this</STRONG>.</P>
 | 
			
		||||
		<h3><a name="Example">Example</a></h3>
 | 
			
		||||
		<pre>
 | 
			
		||||
#include <boost/enable_shared_from_this.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <cassert>
 | 
			
		||||
 | 
			
		||||
class Y: public boost::enable_shared_from_this<Y>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    boost::shared_ptr<Y> f()
 | 
			
		||||
    {
 | 
			
		||||
        return shared_from_this();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr<Y> p(new Y);
 | 
			
		||||
    boost::shared_ptr<Y> q = p->f();
 | 
			
		||||
    assert(p == q);
 | 
			
		||||
    assert(!(p < q || q < p)); // p and q must share ownership
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
		<h3><a name="Synopsis">Synopsis</a></h3>
 | 
			
		||||
		<pre>
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> class enable_shared_from_this
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T> shared_from_this();
 | 
			
		||||
    shared_ptr<T const> shared_from_this() const;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
		<h4>template<class T> shared_ptr<T> 
 | 
			
		||||
			enable_shared_from_this<T>::shared_from_this();</h4>
 | 
			
		||||
		<h4>template<class T> shared_ptr<T const> 
 | 
			
		||||
			enable_shared_from_this<T>::shared_from_this() const;</h4>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Requires:</b> <STRONG>enable_shared_from_this<T></STRONG> must be an 
 | 
			
		||||
				accessible base class of <b>T</b>. <STRONG>*this</STRONG> must be a subobject 
 | 
			
		||||
				of an instance <STRONG>t</STRONG> of type <STRONG>T</STRONG> . There must exist 
 | 
			
		||||
				at least one <STRONG>shared_ptr</STRONG> instance <STRONG>p</STRONG> that <EM>owns</EM>
 | 
			
		||||
				<STRONG>t</STRONG>.
 | 
			
		||||
			</p>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Returns:</b> A <b>shared_ptr<T></b> instance <b>r</b> that shares 
 | 
			
		||||
				ownership with <b>p</b>.
 | 
			
		||||
			</p>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Postconditions:</b> <tt>r.get() == this</tt>.
 | 
			
		||||
			</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<p>
 | 
			
		||||
			<br>
 | 
			
		||||
			<small>Copyright <20> 2002, 2003 by Peter Dimov. Distributed under the Boost Software License, Version 
 | 
			
		||||
				1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A> or 
 | 
			
		||||
				copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										23
									
								
								example/scoped_ptr_example.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								example/scoped_ptr_example.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
// Boost scoped_ptr_example implementation file  -----------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  Distributed under the Boost
 | 
			
		||||
//  Software License, Version 1.0. (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr for documentation.
 | 
			
		||||
 | 
			
		||||
#include "scoped_ptr_example.hpp"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
class example::implementation
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
  ~implementation() { std::cout << "destroying implementation\n"; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
example::example() : _imp( new implementation ) {}
 | 
			
		||||
 | 
			
		||||
void example::do_something() { std::cout << "did something\n"; }
 | 
			
		||||
 | 
			
		||||
example::~example() {}
 | 
			
		||||
							
								
								
									
										29
									
								
								example/scoped_ptr_example.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								example/scoped_ptr_example.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
//  Boost scoped_ptr_example header file  ------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  Distributed under the Boost
 | 
			
		||||
//  Software License, Version 1.0. (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/utility.hpp>
 | 
			
		||||
#include <boost/scoped_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
//  The point of this example is to prove that even though
 | 
			
		||||
//  example::implementation is an incomplete type in translation units using
 | 
			
		||||
//  this header, scoped_ptr< implementation > is still valid because the type
 | 
			
		||||
//  is complete where it counts - in the inplementation translation unit where
 | 
			
		||||
//  destruction is actually instantiated.
 | 
			
		||||
 | 
			
		||||
class example : private boost::noncopyable
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
  example();
 | 
			
		||||
  ~example();
 | 
			
		||||
  void do_something();
 | 
			
		||||
 private:
 | 
			
		||||
  class implementation;
 | 
			
		||||
  boost::scoped_ptr< implementation > _imp; // hide implementation details
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								example/scoped_ptr_example_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								example/scoped_ptr_example_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
// Boost scoped_ptr_example_test main program  -------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  Distributed under the Boost
 | 
			
		||||
//  Software License, Version 1.0. (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr for documentation.
 | 
			
		||||
 | 
			
		||||
#include "scoped_ptr_example.hpp"
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  example my_example;
 | 
			
		||||
  my_example.do_something();
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								example/shared_ptr_example.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								example/shared_ptr_example.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
//  Boost shared_ptr_example.cpp  --------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  Distributed under the Boost
 | 
			
		||||
//  Software License, Version 1.0. (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr for documentation.
 | 
			
		||||
 | 
			
		||||
//  Revision History
 | 
			
		||||
//  21 May 01  Initial complete version (Beman Dawes)
 | 
			
		||||
 | 
			
		||||
//  The original code for this example appeared in the shared_ptr documentation.
 | 
			
		||||
//  Ray Gallimore pointed out that foo_set was missing a Compare template
 | 
			
		||||
//  argument, so would not work as intended.  At that point the code was
 | 
			
		||||
//  turned into an actual .cpp file so it could be compiled and tested.
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <set>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
//  The application will produce a series of
 | 
			
		||||
//  objects of type Foo which later must be
 | 
			
		||||
//  accessed both by occurrence (std::vector)
 | 
			
		||||
//  and by ordering relationship (std::set).
 | 
			
		||||
 | 
			
		||||
struct Foo
 | 
			
		||||
{ 
 | 
			
		||||
  Foo( int _x ) : x(_x) {}
 | 
			
		||||
  ~Foo() { std::cout << "Destructing a Foo with x=" << x << "\n"; }
 | 
			
		||||
  int x;
 | 
			
		||||
  /* ... */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef boost::shared_ptr<Foo> FooPtr;
 | 
			
		||||
 | 
			
		||||
struct FooPtrOps
 | 
			
		||||
{
 | 
			
		||||
  bool operator()( const FooPtr & a, const FooPtr & b )
 | 
			
		||||
    { return a->x > b->x; }
 | 
			
		||||
  void operator()( const FooPtr & a )
 | 
			
		||||
    { std::cout << a->x << "\n"; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  std::vector<FooPtr>         foo_vector;
 | 
			
		||||
  std::set<FooPtr,FooPtrOps>  foo_set; // NOT multiset!
 | 
			
		||||
 | 
			
		||||
  FooPtr foo_ptr( new Foo( 2 ) );
 | 
			
		||||
  foo_vector.push_back( foo_ptr );
 | 
			
		||||
  foo_set.insert( foo_ptr );
 | 
			
		||||
 | 
			
		||||
  foo_ptr.reset( new Foo( 1 ) );
 | 
			
		||||
  foo_vector.push_back( foo_ptr );
 | 
			
		||||
  foo_set.insert( foo_ptr );
 | 
			
		||||
 | 
			
		||||
  foo_ptr.reset( new Foo( 3 ) );
 | 
			
		||||
  foo_vector.push_back( foo_ptr );
 | 
			
		||||
  foo_set.insert( foo_ptr );
 | 
			
		||||
 | 
			
		||||
  foo_ptr.reset ( new Foo( 2 ) );
 | 
			
		||||
  foo_vector.push_back( foo_ptr );
 | 
			
		||||
  foo_set.insert( foo_ptr );
 | 
			
		||||
 | 
			
		||||
  std::cout << "foo_vector:\n";
 | 
			
		||||
  std::for_each( foo_vector.begin(), foo_vector.end(), FooPtrOps() );
 | 
			
		||||
  
 | 
			
		||||
  std::cout << "\nfoo_set:\n"; 
 | 
			
		||||
  std::for_each( foo_set.begin(), foo_set.end(), FooPtrOps() );
 | 
			
		||||
  std::cout << "\n";
 | 
			
		||||
 | 
			
		||||
//  Expected output:
 | 
			
		||||
//
 | 
			
		||||
//   foo_vector:
 | 
			
		||||
//   2
 | 
			
		||||
//   1
 | 
			
		||||
//   3
 | 
			
		||||
//   2
 | 
			
		||||
//   
 | 
			
		||||
//   foo_set:
 | 
			
		||||
//   3
 | 
			
		||||
//   2
 | 
			
		||||
//   1
 | 
			
		||||
//
 | 
			
		||||
//   Destructing a Foo with x=2
 | 
			
		||||
//   Destructing a Foo with x=1
 | 
			
		||||
//   Destructing a Foo with x=3
 | 
			
		||||
//   Destructing a Foo with x=2
 | 
			
		||||
   
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								example/shared_ptr_example2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								example/shared_ptr_example2.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
// Boost shared_ptr_example2 implementation file  -----------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  Distributed under the Boost
 | 
			
		||||
//  Software License, Version 1.0. (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr for documentation.
 | 
			
		||||
 | 
			
		||||
#include "shared_ptr_example2.hpp"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
class example::implementation
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
  ~implementation() { std::cout << "destroying implementation\n"; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
example::example() : _imp( new implementation ) {}
 | 
			
		||||
 | 
			
		||||
void example::do_something()
 | 
			
		||||
  { std::cout << "use_count() is " << _imp.use_count() << "\n"; }
 | 
			
		||||
							
								
								
									
										31
									
								
								example/shared_ptr_example2.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								example/shared_ptr_example2.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
//  Boost shared_ptr_example2 header file  -----------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  Distributed under the Boost
 | 
			
		||||
//  Software License, Version 1.0. (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
//  This example demonstrates the handle/body idiom (also called pimpl and
 | 
			
		||||
//  several other names).  It separates the interface (in this header file)
 | 
			
		||||
//  from the implementation (in shared_ptr_example2.cpp).
 | 
			
		||||
 | 
			
		||||
//  Note that even though example::implementation is an incomplete type in
 | 
			
		||||
//  some translation units using this header, shared_ptr< implementation >
 | 
			
		||||
//  is still valid because the type is complete where it counts - in the
 | 
			
		||||
//  shared_ptr_example2.cpp translation unit where functions requiring a
 | 
			
		||||
//  complete type are actually instantiated.
 | 
			
		||||
 | 
			
		||||
class example
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  example();
 | 
			
		||||
  void do_something();
 | 
			
		||||
private:
 | 
			
		||||
  class implementation;
 | 
			
		||||
  boost::shared_ptr< implementation > _imp; // hide implementation details
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								example/shared_ptr_example2_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								example/shared_ptr_example2_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
// Boost shared_ptr_example2_test main program  ------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  Distributed under the Boost
 | 
			
		||||
//  Software License, Version 1.0. (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr for documentation.
 | 
			
		||||
 | 
			
		||||
#include "shared_ptr_example2.hpp"
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  example a;
 | 
			
		||||
  a.do_something();
 | 
			
		||||
  example b(a);
 | 
			
		||||
  b.do_something();
 | 
			
		||||
  example c;
 | 
			
		||||
  c = a;
 | 
			
		||||
  c.do_something();
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								gccspeed.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gccspeed.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 6.4 KiB  | 
							
								
								
									
										21
									
								
								include/boost/detail/atomic_count.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								include/boost/detail/atomic_count.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count.hpp - thread/SMP safe reference counter
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										22
									
								
								include/boost/detail/lightweight_mutex.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								include/boost/detail/lightweight_mutex.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lightweight_mutex.hpp - lightweight mutex
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										135
									
								
								include/boost/detail/sp_typeinfo.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								include/boost/detail/sp_typeinfo.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,135 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_typeinfo.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2007 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_NO_TYPEID )
 | 
			
		||||
 | 
			
		||||
#include <boost/current_function.hpp>
 | 
			
		||||
#include <functional>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class sp_typeinfo
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_typeinfo( sp_typeinfo const& );
 | 
			
		||||
    sp_typeinfo& operator=( sp_typeinfo const& );
 | 
			
		||||
 | 
			
		||||
    char const * name_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit sp_typeinfo( char const * name ): name_( name )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator==( sp_typeinfo const& rhs ) const
 | 
			
		||||
    {
 | 
			
		||||
        return this == &rhs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator!=( sp_typeinfo const& rhs ) const
 | 
			
		||||
    {
 | 
			
		||||
        return this != &rhs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool before( sp_typeinfo const& rhs ) const
 | 
			
		||||
    {
 | 
			
		||||
        return std::less< sp_typeinfo const* >()( this, &rhs );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    char const* name() const
 | 
			
		||||
    {
 | 
			
		||||
        return name_;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T> struct sp_typeid_
 | 
			
		||||
{
 | 
			
		||||
    static sp_typeinfo ti_;
 | 
			
		||||
 | 
			
		||||
    static char const * name()
 | 
			
		||||
    {
 | 
			
		||||
        return BOOST_CURRENT_FUNCTION;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(__SUNPRO_CC)
 | 
			
		||||
// see #4199, the Sun Studio compiler gets confused about static initialization 
 | 
			
		||||
// constructor arguments. But an assignment works just fine. 
 | 
			
		||||
template<class T> sp_typeinfo sp_typeid_< T >::ti_ = sp_typeid_< T >::name();
 | 
			
		||||
#else
 | 
			
		||||
template<class T> sp_typeinfo sp_typeid_< T >::ti_(sp_typeid_< T >::name());
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> struct sp_typeid_< T & >: sp_typeid_< T >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T> struct sp_typeid_< T const >: sp_typeid_< T >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T> struct sp_typeid_< T volatile >: sp_typeid_< T >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T> struct sp_typeid_< T const volatile >: sp_typeid_< T >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_TYPEID(T) (boost::detail::sp_typeid_<T>::ti_)
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#include <typeinfo>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_NO_STD_TYPEINFO )
 | 
			
		||||
 | 
			
		||||
typedef ::type_info sp_typeinfo;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
typedef std::type_info sp_typeinfo;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_TYPEID(T) typeid(T)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										18
									
								
								include/boost/enable_shared_from_this.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								include/boost/enable_shared_from_this.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
#ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  enable_shared_from_this.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/enable_shared_from_this.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										48
									
								
								include/boost/get_pointer.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								include/boost/get_pointer.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
// Copyright Peter Dimov and David Abrahams 2002.
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
#ifndef GET_POINTER_DWA20021219_HPP
 | 
			
		||||
#define GET_POINTER_DWA20021219_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
// In order to avoid circular dependencies with Boost.TR1
 | 
			
		||||
// we make sure that our include of <memory> doesn't try to
 | 
			
		||||
// pull in the TR1 headers: that's why we use this header 
 | 
			
		||||
// rather than including <memory> directly:
 | 
			
		||||
#include <boost/config/no_tr1/memory.hpp>  // std::auto_ptr
 | 
			
		||||
 | 
			
		||||
namespace boost { 
 | 
			
		||||
 | 
			
		||||
// get_pointer(p) extracts a ->* capable pointer from p
 | 
			
		||||
 | 
			
		||||
template<class T> T * get_pointer(T * p)
 | 
			
		||||
{
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// get_pointer(shared_ptr<T> const & p) has been moved to shared_ptr.hpp
 | 
			
		||||
 | 
			
		||||
template<class T> T * get_pointer(std::auto_ptr<T> const& p)
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
			
		||||
 | 
			
		||||
template<class T> T * get_pointer( std::unique_ptr<T> const& p )
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> T * get_pointer( std::shared_ptr<T> const& p )
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // GET_POINTER_DWA20021219_HPP
 | 
			
		||||
							
								
								
									
										18
									
								
								include/boost/intrusive_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								include/boost/intrusive_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
#ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  intrusive_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/intrusive_ptr.html for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/intrusive_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										17
									
								
								include/boost/make_shared.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								include/boost/make_shared.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
#ifndef BOOST_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
#define BOOST_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  make_shared.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2007, 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/make_shared.html
 | 
			
		||||
//  for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/make_shared.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										53
									
								
								include/boost/memory_order.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								include/boost/memory_order.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
#ifndef BOOST_MEMORY_ORDER_HPP_INCLUDED
 | 
			
		||||
#define BOOST_MEMORY_ORDER_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  boost/memory_order.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Defines enum boost::memory_order per the C++0x working draft
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008, 2009 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Enum values are chosen so that code that needs to insert
 | 
			
		||||
// a trailing fence for acquire semantics can use a single
 | 
			
		||||
// test such as:
 | 
			
		||||
//
 | 
			
		||||
// if( mo & memory_order_acquire ) { ...fence... }
 | 
			
		||||
//
 | 
			
		||||
// For leading fences one can use:
 | 
			
		||||
//
 | 
			
		||||
// if( mo & memory_order_release ) { ...fence... }
 | 
			
		||||
//
 | 
			
		||||
// Architectures such as Alpha that need a fence on consume
 | 
			
		||||
// can use:
 | 
			
		||||
//
 | 
			
		||||
// if( mo & ( memory_order_acquire | memory_order_consume ) ) { ...fence... }
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
enum memory_order
 | 
			
		||||
{
 | 
			
		||||
    memory_order_relaxed = 0,
 | 
			
		||||
    memory_order_acquire = 1,
 | 
			
		||||
    memory_order_release = 2,
 | 
			
		||||
    memory_order_acq_rel = 3, // acquire | release
 | 
			
		||||
    memory_order_seq_cst = 7, // acq_rel | 4
 | 
			
		||||
    memory_order_consume = 8
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_MEMORY_ORDER_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										45
									
								
								include/boost/pointer_cast.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								include/boost/pointer_cast.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// (C) Copyright Ion Gaztanaga 2005. 
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. 
 | 
			
		||||
// (See accompanying file LICENSE_1_0.txt or copy at 
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_POINTER_CAST_HPP
 | 
			
		||||
#define BOOST_POINTER_CAST_HPP
 | 
			
		||||
 | 
			
		||||
namespace boost { 
 | 
			
		||||
 | 
			
		||||
//static_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* static_pointer_cast(U *ptr)
 | 
			
		||||
{  
 | 
			
		||||
   return static_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//dynamic_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* dynamic_pointer_cast(U *ptr)
 | 
			
		||||
{  
 | 
			
		||||
   return dynamic_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//const_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* const_pointer_cast(U *ptr)
 | 
			
		||||
{  
 | 
			
		||||
   return const_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//reinterpret_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* reinterpret_pointer_cast(U *ptr)
 | 
			
		||||
{  
 | 
			
		||||
   return reinterpret_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif   //BOOST_POINTER_CAST_HPP
 | 
			
		||||
							
								
								
									
										55
									
								
								include/boost/pointer_to_other.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								include/boost/pointer_to_other.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
#ifndef BOOST_POINTER_TO_OTHER_HPP_INCLUDED
 | 
			
		||||
#define BOOST_POINTER_TO_OTHER_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  pointer_to_other.hpp
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Ion Gaztanaga 2005.
 | 
			
		||||
//  Copyright (c) 2005 Peter Dimov.
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//
 | 
			
		||||
//  (See accompanying file LICENSE_1_0.txt or copy at 
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/pointer_to_other.html
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// Defines the same pointer type (raw or smart) to another pointee type
 | 
			
		||||
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
struct pointer_to_other;
 | 
			
		||||
 | 
			
		||||
template<class T, class U, 
 | 
			
		||||
         template<class> class Sp>
 | 
			
		||||
struct pointer_to_other< Sp<T>, U >
 | 
			
		||||
{
 | 
			
		||||
   typedef Sp<U> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class T2, class U, 
 | 
			
		||||
         template<class, class> class Sp>
 | 
			
		||||
struct pointer_to_other< Sp<T, T2>, U >
 | 
			
		||||
{
 | 
			
		||||
   typedef Sp<U, T2> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class T2, class T3, class U, 
 | 
			
		||||
         template<class, class, class> class Sp>
 | 
			
		||||
struct pointer_to_other< Sp<T, T2, T3>, U >
 | 
			
		||||
{
 | 
			
		||||
   typedef Sp<U, T2, T3> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
struct pointer_to_other< T*, U >
 | 
			
		||||
{
 | 
			
		||||
   typedef U* type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_POINTER_TO_OTHER_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										16
									
								
								include/boost/scoped_array.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								include/boost/scoped_array.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
#ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SCOPED_ARRAY_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/scoped_array.htm
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/scoped_array.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										16
									
								
								include/boost/scoped_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								include/boost/scoped_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
#ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SCOPED_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/scoped_ptr.htm
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/scoped_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										19
									
								
								include/boost/shared_array.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								include/boost/shared_array.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
#ifndef BOOST_SHARED_ARRAY_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SHARED_ARRAY_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  shared_array.hpp
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_array.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SHARED_ARRAY_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										19
									
								
								include/boost/shared_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								include/boost/shared_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
#ifndef BOOST_SHARED_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SHARED_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  shared_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001-2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
 | 
			
		||||
@@ -1,369 +1,31 @@
 | 
			
		||||
//  Boost smart_ptr.hpp header file  -----------------------------------------//
 | 
			
		||||
#ifndef BOOST_SMART_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. Permission to copy,
 | 
			
		||||
//  use, modify, sell and distribute this software is granted provided this
 | 
			
		||||
//  copyright notice appears in all copies. This software is provided "as is"
 | 
			
		||||
//  without express or implied warranty, and with no claim as to its
 | 
			
		||||
//  suitability for any purpose.
 | 
			
		||||
//
 | 
			
		||||
//  smart_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  For convenience, this header includes the rest of the smart
 | 
			
		||||
//  pointer library headers.
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2003 Peter Dimov  Distributed under the Boost
 | 
			
		||||
//  Software License, Version 1.0. (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/smart_ptr.htm
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org for most recent version including documentation.
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
//  Revision History
 | 
			
		||||
//  22 Jun 00  Remove #if continuations to fix GCC 2.95.2 problem (Beman Dawes)
 | 
			
		||||
//   1 Feb 00  Additional shared_ptr BOOST_NO_MEMBER_TEMPLATES workarounds
 | 
			
		||||
//             (Dave Abrahams)
 | 
			
		||||
//  31 Dec 99  Condition tightened for no member template friend workaround
 | 
			
		||||
//             (Dave Abrahams)
 | 
			
		||||
//  30 Dec 99  Moved BOOST_NMEMBER_TEMPLATES compatibility code to config.hpp
 | 
			
		||||
//             (Dave Abrahams)
 | 
			
		||||
//  30 Nov 99  added operator ==, operator !=, and std::swap and std::less
 | 
			
		||||
//             specializations for shared types (Darin Adler)
 | 
			
		||||
//  11 Oct 99  replaced op[](int) with op[](std::size_t) (Ed Brey, Valentin
 | 
			
		||||
//             Bonnard), added shared_ptr workaround for no member template
 | 
			
		||||
//             friends (Matthew Langston)
 | 
			
		||||
//  25 Sep 99  added shared_ptr::swap and shared_array::swap (Luis Coelho).
 | 
			
		||||
//  20 Jul 99  changed name to smart_ptr.hpp, #include <boost/config.hpp>,
 | 
			
		||||
//             #include <boost/utility.hpp> and use boost::noncopyable
 | 
			
		||||
//  17 May 99  remove scoped_array and shared_array operator*() as
 | 
			
		||||
//             unnecessary (Beman Dawes)
 | 
			
		||||
//  14 May 99  reorder code so no effects when bad_alloc thrown (Abrahams/Dawes)
 | 
			
		||||
//  13 May 99  remove certain throw() specifiers to avoid generated try/catch
 | 
			
		||||
//             code cost (Beman Dawes)
 | 
			
		||||
//  11 May 99  get() added, conversion to T* placed in macro guard (Valentin
 | 
			
		||||
//             Bonnard, Dave Abrahams, and others argued for elimination
 | 
			
		||||
//             of the automatic conversion)
 | 
			
		||||
//  28 Apr 99  #include <memory> fix (Valentin Bonnard)
 | 
			
		||||
//  28 Apr 99  rename transfer() to share() for clarity (Dave Abrahams)
 | 
			
		||||
//  28 Apr 99  remove unsafe shared_array template conversions(Valentin Bonnard)
 | 
			
		||||
//  28 Apr 99  p(r) changed to p(r.px) for clarity (Dave Abrahams)
 | 
			
		||||
//  21 Apr 99  reset() self assignment fix (Valentin Bonnard)
 | 
			
		||||
//  21 Apr 99  dispose() provided to improve clarity (Valentin Bonnard)
 | 
			
		||||
//  27 Apr 99  leak when new throws fixes (Dave Abrahams)
 | 
			
		||||
//  21 Oct 98  initial Version (Greg Colvin/Beman Dawes)
 | 
			
		||||
#include <boost/scoped_ptr.hpp>
 | 
			
		||||
#include <boost/scoped_array.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/shared_array.hpp>
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_SMART_PTR_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>   // for broken compiler workarounds
 | 
			
		||||
#include <cstddef>            // for std::size_t
 | 
			
		||||
#include <memory>             // for std::auto_ptr
 | 
			
		||||
#include <algorithm>          // for std::swap
 | 
			
		||||
#include <boost/utility.hpp>  // for boost::noncopyable
 | 
			
		||||
#include <functional>         // for std::less
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
//  scoped_ptr  --------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  scoped_ptr mimics a built-in pointer except that it guarantees deletion
 | 
			
		||||
//  of the object pointed to, either on destruction of the scoped_ptr or via
 | 
			
		||||
//  an explicit reset().  scoped_ptr is a simple solution for simple needs;
 | 
			
		||||
//  see shared_ptr (below) or std::auto_ptr if your needs are more complex.
 | 
			
		||||
 | 
			
		||||
template<typename T> class scoped_ptr : noncopyable {
 | 
			
		||||
 | 
			
		||||
  T* ptr;
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  typedef T element_type;
 | 
			
		||||
 | 
			
		||||
  explicit scoped_ptr( T* p=0 ) throw() : ptr(p) {}
 | 
			
		||||
  ~scoped_ptr()                 { delete ptr; }
 | 
			
		||||
 | 
			
		||||
  void reset( T* p=0 )          { if ( ptr != p ) { delete ptr; ptr = p; } }
 | 
			
		||||
  T& operator*() const throw()  { return *ptr; }
 | 
			
		||||
  T* operator->() const throw() { return ptr; }
 | 
			
		||||
  T* get() const throw()        { return ptr; }
 | 
			
		||||
#ifdef BOOST_SMART_PTR_CONVERSION
 | 
			
		||||
  // get() is safer! Define BOOST_SMART_PTR_CONVERSION at your own risk!
 | 
			
		||||
  operator T*() const throw()   { return ptr; } 
 | 
			
		||||
#endif
 | 
			
		||||
  };  // scoped_ptr
 | 
			
		||||
 | 
			
		||||
//  scoped_array  ------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to
 | 
			
		||||
//  is guaranteed, either on destruction of the scoped_array or via an explicit
 | 
			
		||||
//  reset(). See shared_array or std::vector if your needs are more complex.
 | 
			
		||||
 | 
			
		||||
template<typename T> class scoped_array : noncopyable {
 | 
			
		||||
 | 
			
		||||
  T* ptr;
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  typedef T element_type;
 | 
			
		||||
 | 
			
		||||
  explicit scoped_array( T* p=0 ) throw() : ptr(p) {}
 | 
			
		||||
  ~scoped_array()                    { delete [] ptr; }
 | 
			
		||||
 | 
			
		||||
  void reset( T* p=0 )               { if ( ptr != p ) {delete [] ptr; ptr=p;} }
 | 
			
		||||
 | 
			
		||||
  T* get() const throw()             { return ptr; }
 | 
			
		||||
#ifdef BOOST_SMART_PTR_CONVERSION
 | 
			
		||||
  // get() is safer! Define BOOST_SMART_PTR_CONVERSION at your own risk!
 | 
			
		||||
  operator T*() const throw()        { return ptr; }
 | 
			
		||||
#else 
 | 
			
		||||
  T& operator[](std::size_t i) const throw() { return ptr[i]; }
 | 
			
		||||
#endif
 | 
			
		||||
  };  // scoped_array
 | 
			
		||||
 | 
			
		||||
//  shared_ptr  --------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  An enhanced relative of scoped_ptr with reference counted copy semantics.
 | 
			
		||||
//  The object pointed to is deleted when the last shared_ptr pointing to it
 | 
			
		||||
//  is destroyed or reset.
 | 
			
		||||
 | 
			
		||||
template<typename T> class shared_ptr {
 | 
			
		||||
  public:
 | 
			
		||||
   typedef T element_type;
 | 
			
		||||
 | 
			
		||||
   explicit shared_ptr(T* p =0) : px(p) {
 | 
			
		||||
      try { pn = new long(1); }  // fix: prevent leak if new throws
 | 
			
		||||
      catch (...) { delete p; throw; } 
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   shared_ptr(const shared_ptr& r) throw() : px(r.px) { ++*(pn = r.pn); }
 | 
			
		||||
 | 
			
		||||
   ~shared_ptr() { dispose(); }
 | 
			
		||||
 | 
			
		||||
   shared_ptr& operator=(const shared_ptr& r) {
 | 
			
		||||
      share(r.px,r.pn);
 | 
			
		||||
      return *this;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_MEMBER_TEMPLATES )
 | 
			
		||||
   template<typename Y>
 | 
			
		||||
      shared_ptr(const shared_ptr<Y>& r) throw() : px(r.px) { 
 | 
			
		||||
         ++*(pn = r.pn); 
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   template<typename Y>
 | 
			
		||||
      shared_ptr(std::auto_ptr<Y>& r) { 
 | 
			
		||||
         pn = new long(1); // may throw
 | 
			
		||||
         px = r.release(); // fix: moved here to stop leak if new throws
 | 
			
		||||
      } 
 | 
			
		||||
 | 
			
		||||
   template<typename Y>
 | 
			
		||||
      shared_ptr& operator=(const shared_ptr<Y>& r) { 
 | 
			
		||||
         share(r.px,r.pn);
 | 
			
		||||
         return *this;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   template<typename Y>
 | 
			
		||||
      shared_ptr& operator=(std::auto_ptr<Y>& r) {
 | 
			
		||||
         // code choice driven by guarantee of "no effect if new throws"
 | 
			
		||||
         if (*pn == 1) { delete px; }
 | 
			
		||||
         else { // allocate new reference counter
 | 
			
		||||
           long * tmp = new long(1); // may throw
 | 
			
		||||
           --*pn; // only decrement once danger of new throwing is past
 | 
			
		||||
           pn = tmp;
 | 
			
		||||
         } // allocate new reference counter
 | 
			
		||||
         px = r.release(); // fix: moved here so doesn't leak if new throws 
 | 
			
		||||
         return *this;
 | 
			
		||||
      }
 | 
			
		||||
#else
 | 
			
		||||
      shared_ptr(std::auto_ptr<T>& r) { 
 | 
			
		||||
         pn = new long(1); // may throw
 | 
			
		||||
         px = r.release(); // fix: moved here to stop leak if new throws
 | 
			
		||||
      } 
 | 
			
		||||
 | 
			
		||||
      shared_ptr& operator=(std::auto_ptr<T>& r) {
 | 
			
		||||
         // code choice driven by guarantee of "no effect if new throws"
 | 
			
		||||
         if (*pn == 1) { delete px; }
 | 
			
		||||
         else { // allocate new reference counter
 | 
			
		||||
           long * tmp = new long(1); // may throw
 | 
			
		||||
           --*pn; // only decrement once danger of new throwing is past
 | 
			
		||||
           pn = tmp;
 | 
			
		||||
         } // allocate new reference counter
 | 
			
		||||
         px = r.release(); // fix: moved here so doesn't leak if new throws 
 | 
			
		||||
         return *this;
 | 
			
		||||
      }
 | 
			
		||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
# include <boost/weak_ptr.hpp>
 | 
			
		||||
# include <boost/intrusive_ptr.hpp>
 | 
			
		||||
# include <boost/enable_shared_from_this.hpp>
 | 
			
		||||
# include <boost/make_shared.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   void reset(T* p=0) {
 | 
			
		||||
      if ( px == p ) return;  // fix: self-assignment safe
 | 
			
		||||
      if (--*pn == 0) { delete px; }
 | 
			
		||||
      else { // allocate new reference counter
 | 
			
		||||
        try { pn = new long; }  // fix: prevent leak if new throws
 | 
			
		||||
        catch (...) {
 | 
			
		||||
          ++*pn;  // undo effect of --*pn above to meet effects guarantee 
 | 
			
		||||
          delete p;
 | 
			
		||||
          throw;
 | 
			
		||||
        } // catch
 | 
			
		||||
      } // allocate new reference counter
 | 
			
		||||
      *pn = 1;
 | 
			
		||||
      px = p;
 | 
			
		||||
   } // reset
 | 
			
		||||
 | 
			
		||||
   T& operator*() const throw()  { return *px; }
 | 
			
		||||
   T* operator->() const throw() { return px; }
 | 
			
		||||
   T* get() const throw()        { return px; }
 | 
			
		||||
 #ifdef BOOST_SMART_PTR_CONVERSION
 | 
			
		||||
   // get() is safer! Define BOOST_SMART_PTR_CONVERSION at your own risk!
 | 
			
		||||
   operator T*() const throw()   { return px; } 
 | 
			
		||||
 #endif
 | 
			
		||||
 | 
			
		||||
   long use_count() const throw(){ return *pn; }
 | 
			
		||||
   bool unique() const throw()   { return *pn == 1; }
 | 
			
		||||
 | 
			
		||||
   void swap(shared_ptr<T>& other) throw()
 | 
			
		||||
     { std::swap(px,other.px); std::swap(pn,other.pn); }
 | 
			
		||||
 | 
			
		||||
// Tasteless as this may seem, making all members public allows member templates
 | 
			
		||||
// to work in the absence of member template friends. (Matthew Langston)
 | 
			
		||||
// Don't split this line into two; that causes problems for some GCC 2.95.2 builds
 | 
			
		||||
#if defined(BOOST_NO_MEMBER_TEMPLATES) || !defined( BOOST_NO_MEMBER_TEMPLATE_FRIENDS )
 | 
			
		||||
   private:
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   T*     px;     // contained pointer
 | 
			
		||||
   long*  pn;     // ptr to reference counter
 | 
			
		||||
 | 
			
		||||
// Don't split this line into two; that causes problems for some GCC 2.95.2 builds
 | 
			
		||||
#if !defined( BOOST_NO_MEMBER_TEMPLATES ) && !defined( BOOST_NO_MEMBER_TEMPLATE_FRIENDS )
 | 
			
		||||
   template<typename Y> friend class shared_ptr;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   void dispose() { if (--*pn == 0) { delete px; delete pn; } }
 | 
			
		||||
 | 
			
		||||
   void share(T* rpx, long* rpn) {
 | 
			
		||||
      if (pn != rpn) {
 | 
			
		||||
         dispose();
 | 
			
		||||
         px = rpx;
 | 
			
		||||
         ++*(pn = rpn);
 | 
			
		||||
      }
 | 
			
		||||
   } // share
 | 
			
		||||
};  // shared_ptr
 | 
			
		||||
 | 
			
		||||
template<typename T, typename U>
 | 
			
		||||
  inline bool operator==(const shared_ptr<T>& a, const shared_ptr<U>& b)
 | 
			
		||||
    { return a.get() == b.get(); }
 | 
			
		||||
 | 
			
		||||
template<typename T, typename U>
 | 
			
		||||
  inline bool operator!=(const shared_ptr<T>& a, const shared_ptr<U>& b)
 | 
			
		||||
    { return a.get() != b.get(); }
 | 
			
		||||
 | 
			
		||||
//  shared_array  ------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  shared_array extends shared_ptr to arrays.
 | 
			
		||||
//  The array pointed to is deleted when the last shared_array pointing to it
 | 
			
		||||
//  is destroyed or reset.
 | 
			
		||||
 | 
			
		||||
template<typename T> class shared_array {
 | 
			
		||||
  public:
 | 
			
		||||
   typedef T element_type;
 | 
			
		||||
 | 
			
		||||
   explicit shared_array(T* p =0) : px(p) {
 | 
			
		||||
      try { pn = new long(1); }  // fix: prevent leak if new throws
 | 
			
		||||
      catch (...) { delete [] p; throw; } 
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   shared_array(const shared_array& r) throw() : px(r.px) { ++*(pn = r.pn); }
 | 
			
		||||
 | 
			
		||||
   ~shared_array() { dispose(); }
 | 
			
		||||
 | 
			
		||||
   shared_array& operator=(const shared_array& r) {
 | 
			
		||||
      if (pn != r.pn) {
 | 
			
		||||
         dispose();
 | 
			
		||||
         px = r.px;
 | 
			
		||||
         ++*(pn = r.pn);
 | 
			
		||||
      }
 | 
			
		||||
      return *this;
 | 
			
		||||
   } // operator=
 | 
			
		||||
 | 
			
		||||
   void reset(T* p=0) {
 | 
			
		||||
      if ( px == p ) return;  // fix: self-assignment safe
 | 
			
		||||
      if (--*pn == 0) { delete [] px; }
 | 
			
		||||
      else { // allocate new reference counter
 | 
			
		||||
        try { pn = new long; }  // fix: prevent leak if new throws
 | 
			
		||||
        catch (...) {
 | 
			
		||||
          ++*pn;  // undo effect of --*pn above to meet effects guarantee 
 | 
			
		||||
          delete [] p;
 | 
			
		||||
          throw;
 | 
			
		||||
        } // catch
 | 
			
		||||
      } // allocate new reference counter
 | 
			
		||||
      *pn = 1;
 | 
			
		||||
      px = p;
 | 
			
		||||
   } // reset
 | 
			
		||||
 | 
			
		||||
   T* get() const throw()             { return px; }
 | 
			
		||||
 #ifdef BOOST_SMART_PTR_CONVERSION
 | 
			
		||||
   // get() is safer! Define BOOST_SMART_PTR_CONVERSION at your own risk!
 | 
			
		||||
   operator T*() const throw()        { return px; }
 | 
			
		||||
 #else 
 | 
			
		||||
   T& operator[](std::size_t i) const throw() { return px[i]; }
 | 
			
		||||
 #endif
 | 
			
		||||
 | 
			
		||||
   long use_count() const throw()     { return *pn; }
 | 
			
		||||
   bool unique() const throw()        { return *pn == 1; }
 | 
			
		||||
 | 
			
		||||
   void swap(shared_array<T>& other) throw()
 | 
			
		||||
     { std::swap(px,other.px); std::swap(pn,other.pn); }
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
 | 
			
		||||
   T*     px;     // contained pointer
 | 
			
		||||
   long*  pn;     // ptr to reference counter
 | 
			
		||||
 | 
			
		||||
   void dispose() { if (--*pn == 0) { delete [] px; delete pn; } }
 | 
			
		||||
 | 
			
		||||
};  // shared_array
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  inline bool operator==(const shared_array<T>& a, const shared_array<T>& b)
 | 
			
		||||
    { return a.get() == b.get(); }
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  inline bool operator!=(const shared_array<T>& a, const shared_array<T>& b)
 | 
			
		||||
    { return a.get() != b.get(); }
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
//  specializations for things in namespace std  -----------------------------//
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
 | 
			
		||||
namespace std {
 | 
			
		||||
 | 
			
		||||
// Specialize std::swap to use the fast, non-throwing swap that's provided
 | 
			
		||||
// as a member function instead of using the default algorithm which creates
 | 
			
		||||
// a temporary and uses assignment.
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  inline void swap(boost::shared_ptr<T>& a, boost::shared_ptr<T>& b)
 | 
			
		||||
    { a.swap(b); }
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  inline void swap(boost::shared_array<T>& a, boost::shared_array<T>& b)
 | 
			
		||||
    { a.swap(b); }
 | 
			
		||||
 | 
			
		||||
// Specialize std::less so we can use shared pointers and arrays as keys in
 | 
			
		||||
// associative collections.
 | 
			
		||||
 | 
			
		||||
// It's still a controversial question whether this is better than supplying
 | 
			
		||||
// a full range of comparison operators (<, >, <=, >=).
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  struct less< boost::shared_ptr<T> >
 | 
			
		||||
    : binary_function<boost::shared_ptr<T>, boost::shared_ptr<T>, bool>
 | 
			
		||||
  {
 | 
			
		||||
    bool operator()(const boost::shared_ptr<T>& a,
 | 
			
		||||
        const boost::shared_ptr<T>& b) const
 | 
			
		||||
      { return less<T*>()(a.get(),b.get()); }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  struct less< boost::shared_array<T> >
 | 
			
		||||
    : binary_function<boost::shared_array<T>, boost::shared_array<T>, bool>
 | 
			
		||||
  {
 | 
			
		||||
    bool operator()(const boost::shared_array<T>& a,
 | 
			
		||||
        const boost::shared_array<T>& b) const
 | 
			
		||||
      { return less<T*>()(a.get(),b.get()); }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
} // namespace std
 | 
			
		||||
 | 
			
		||||
#endif  // ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
 | 
			
		||||
#endif  // BOOST_SMART_PTR_HPP
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										250
									
								
								include/boost/smart_ptr/allocate_shared_array.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								include/boost/smart_ptr/allocate_shared_array.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,250 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Glen Joseph Fernandes
 | 
			
		||||
 * glenfe at live dot com
 | 
			
		||||
 *
 | 
			
		||||
 * Distributed under the Boost Software License,
 | 
			
		||||
 * Version 1.0. (See accompanying file LICENSE_1_0.txt
 | 
			
		||||
 * or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/allocate_array_helper.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/array_deleter.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/array_traits.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_if_array.hpp>
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
			
		||||
#include <initializer_list>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
    template<typename T, typename A>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    allocate_shared(const A& allocator, std::size_t size) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        std::size_t n1 = size * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
			
		||||
    template<typename T, typename A, typename... Args>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    allocate_shared(const A& allocator, std::size_t size, Args&&... args) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        std::size_t n1 = size * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2, boost::detail::sp_forward<Args>(args)...);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T, typename A, typename... Args>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    allocate_shared(const A& allocator, Args&&... args) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        enum {
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2, boost::detail::sp_forward<Args>(args)...);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
 | 
			
		||||
    template<typename T, typename A>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    allocate_shared(const A& allocator, const T& list) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        typedef const T2 T3;
 | 
			
		||||
        enum {
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        T3* p3 = 0;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p3 = reinterpret_cast<T3*>(list);
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init_list(p2, p3);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T, typename A>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    allocate_shared(const A& allocator, std::size_t size,
 | 
			
		||||
        const typename boost::detail::array_inner<T>::type& list) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        typedef const T2 T3;
 | 
			
		||||
        enum {
 | 
			
		||||
            M = boost::detail::array_total<T1>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        T3* p3 = 0;
 | 
			
		||||
        std::size_t n1 = M * size;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p3 = reinterpret_cast<T3*>(list);
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->template init_list<M>(p2, p3);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T, typename A>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    allocate_shared(const A& allocator,
 | 
			
		||||
        const typename boost::detail::array_inner<T>::type& list) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        typedef const T2 T3;
 | 
			
		||||
        enum {
 | 
			
		||||
            M = boost::detail::array_total<T1>::size,
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        T3* p3 = 0;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p3 = reinterpret_cast<T3*>(list);
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->template init_list<M>(p2, p3);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
			
		||||
    template<typename T, typename A>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    allocate_shared(const A& allocator,
 | 
			
		||||
        std::initializer_list<typename boost::detail::array_inner<T>::type> list) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        typedef const T2 T3;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        T3* p3 = 0;
 | 
			
		||||
        std::size_t n1 = list.size() * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p3 = reinterpret_cast<T3*>(list.begin());
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init_list(p2, p3);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
			
		||||
    template<typename T, typename A>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    allocate_shared(const A& allocator, std::size_t size,
 | 
			
		||||
        typename boost::detail::array_base<T>::type&& value) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        std::size_t n1 = size * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2, boost::detail::sp_forward<T2>(value));
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T, typename A>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    allocate_shared(const A& allocator,
 | 
			
		||||
        typename boost::detail::array_base<T>::type&& value) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        enum {
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2, boost::detail::sp_forward<T2>(value));
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
    template<typename T, typename A>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    allocate_shared_noinit(const A& allocator, std::size_t size) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        std::size_t n1 = size * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->noinit(p2);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T, typename A>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    allocate_shared_noinit(const A& allocator) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        enum {
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        boost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->noinit(p2);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										59
									
								
								include/boost/smart_ptr/bad_weak_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								include/boost/smart_ptr/bad_weak_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/smart_ptr/bad_weak_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <exception>
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
# pragma warn -8026     // Functions with excep. spec. are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// The standard library that comes with Borland C++ 5.5.1, 5.6.4
 | 
			
		||||
// defines std::exception and its members as having C calling
 | 
			
		||||
// convention (-pc). When the definition of bad_weak_ptr
 | 
			
		||||
// is compiled with -ps, the compiler issues an error.
 | 
			
		||||
// Hence, the temporary #pragma option -pc below.
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && __BORLANDC__ <= 0x564
 | 
			
		||||
# pragma option push -pc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class bad_weak_ptr: public std::exception
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    virtual char const * what() const throw()
 | 
			
		||||
    {
 | 
			
		||||
        return "tr1::bad_weak_ptr";
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && __BORLANDC__ <= 0x564
 | 
			
		||||
# pragma option pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
# pragma warn .8026     // Functions with excep. spec. are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										169
									
								
								include/boost/smart_ptr/detail/allocate_array_helper.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								include/boost/smart_ptr/detail/allocate_array_helper.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,169 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Glen Joseph Fernandes 
 | 
			
		||||
 * glenfe at live dot com
 | 
			
		||||
 *
 | 
			
		||||
 * Distributed under the Boost Software License, 
 | 
			
		||||
 * Version 1.0. (See accompanying file LICENSE_1_0.txt 
 | 
			
		||||
 * or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ALLOCATE_ARRAY_HELPER_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ALLOCATE_ARRAY_HELPER_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/type_traits/alignment_of.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
    namespace detail {
 | 
			
		||||
        template<typename A, typename T, typename Y = char>
 | 
			
		||||
        class allocate_array_helper;
 | 
			
		||||
        template<typename A, typename T, typename Y>
 | 
			
		||||
        class allocate_array_helper<A, T[], Y> {
 | 
			
		||||
            template<typename A9, typename T9, typename Y9>
 | 
			
		||||
            friend class allocate_array_helper;
 | 
			
		||||
            typedef typename A::template rebind<Y>   ::other A2;
 | 
			
		||||
            typedef typename A::template rebind<char>::other A3;
 | 
			
		||||
        public:
 | 
			
		||||
            typedef typename A2::value_type      value_type;
 | 
			
		||||
            typedef typename A2::pointer         pointer;
 | 
			
		||||
            typedef typename A2::const_pointer   const_pointer;
 | 
			
		||||
            typedef typename A2::reference       reference;
 | 
			
		||||
            typedef typename A2::const_reference const_reference;
 | 
			
		||||
            typedef typename A2::size_type       size_type;
 | 
			
		||||
            typedef typename A2::difference_type difference_type;
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            struct rebind {
 | 
			
		||||
                typedef allocate_array_helper<A, T[], U> other;
 | 
			
		||||
            };
 | 
			
		||||
            allocate_array_helper(const A& allocator_, std::size_t size_, T** data_)
 | 
			
		||||
                : allocator(allocator_),
 | 
			
		||||
                  size(sizeof(T) * size_),
 | 
			
		||||
                  data(data_) {
 | 
			
		||||
            }
 | 
			
		||||
            template<class U>
 | 
			
		||||
            allocate_array_helper(const allocate_array_helper<A, T[], U>& other) 
 | 
			
		||||
                : allocator(other.allocator),
 | 
			
		||||
                  size(other.size),
 | 
			
		||||
                  data(other.data) {
 | 
			
		||||
            }
 | 
			
		||||
            pointer address(reference value) const {
 | 
			
		||||
                return allocator.address(value);
 | 
			
		||||
            }
 | 
			
		||||
            const_pointer address(const_reference value) const {
 | 
			
		||||
                return allocator.address(value);
 | 
			
		||||
            }
 | 
			
		||||
            size_type max_size() const {
 | 
			
		||||
                return allocator.max_size();
 | 
			
		||||
            }
 | 
			
		||||
            pointer allocate(size_type count, const void* value = 0) {
 | 
			
		||||
                std::size_t a1 = boost::alignment_of<T>::value;
 | 
			
		||||
                std::size_t n1 = count * sizeof(Y) + a1 - 1;
 | 
			
		||||
                char*  p1 = A3(allocator).allocate(n1 + size, value);
 | 
			
		||||
                char*  p2 = p1 + n1;
 | 
			
		||||
                while (std::size_t(p2) % a1 != 0) {
 | 
			
		||||
                    p2--;
 | 
			
		||||
                }
 | 
			
		||||
                *data = reinterpret_cast<T*>(p2);
 | 
			
		||||
                return  reinterpret_cast<Y*>(p1);
 | 
			
		||||
            }
 | 
			
		||||
            void deallocate(pointer memory, size_type count) {
 | 
			
		||||
                std::size_t a1 = boost::alignment_of<T>::value;
 | 
			
		||||
                std::size_t n1 = count * sizeof(Y) + a1 - 1;
 | 
			
		||||
                char*  p1 = reinterpret_cast<char*>(memory);
 | 
			
		||||
                A3(allocator).deallocate(p1, n1 + size);
 | 
			
		||||
            }
 | 
			
		||||
            void construct(pointer memory, const Y& value) {
 | 
			
		||||
                allocator.construct(memory, value);
 | 
			
		||||
            }
 | 
			
		||||
            void destroy(pointer memory) {
 | 
			
		||||
                allocator.destroy(memory);
 | 
			
		||||
            }
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            bool operator==(const allocate_array_helper<A, T[], U>& other) const {
 | 
			
		||||
                return allocator == other.allocator;
 | 
			
		||||
            }
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            bool operator!=(const allocate_array_helper<A, T[], U>& other) const {
 | 
			
		||||
                return !(*this == other); 
 | 
			
		||||
            }
 | 
			
		||||
        private:
 | 
			
		||||
            A2 allocator;
 | 
			
		||||
            std::size_t size;
 | 
			
		||||
            T** data;
 | 
			
		||||
        };
 | 
			
		||||
        template<typename A, typename T, std::size_t N, typename Y>
 | 
			
		||||
        class allocate_array_helper<A, T[N], Y> {
 | 
			
		||||
            template<typename A9, typename T9, typename Y9>
 | 
			
		||||
            friend class allocate_array_helper;
 | 
			
		||||
            typedef typename A::template rebind<Y>   ::other A2;
 | 
			
		||||
            typedef typename A::template rebind<char>::other A3;
 | 
			
		||||
        public:
 | 
			
		||||
            typedef typename A2::value_type      value_type;
 | 
			
		||||
            typedef typename A2::pointer         pointer;
 | 
			
		||||
            typedef typename A2::const_pointer   const_pointer;
 | 
			
		||||
            typedef typename A2::reference       reference;
 | 
			
		||||
            typedef typename A2::const_reference const_reference;
 | 
			
		||||
            typedef typename A2::size_type       size_type;
 | 
			
		||||
            typedef typename A2::difference_type difference_type;
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            struct rebind {
 | 
			
		||||
                typedef allocate_array_helper<A, T[N], U> other;
 | 
			
		||||
            };
 | 
			
		||||
            allocate_array_helper(const A& allocator_, T** data_)
 | 
			
		||||
                : allocator(allocator_),
 | 
			
		||||
                  data(data_) {
 | 
			
		||||
            }
 | 
			
		||||
            template<class U>
 | 
			
		||||
            allocate_array_helper(const allocate_array_helper<A, T[N], U>& other) 
 | 
			
		||||
                : allocator(other.allocator),
 | 
			
		||||
                  data(other.data) {
 | 
			
		||||
            }
 | 
			
		||||
            pointer address(reference value) const {
 | 
			
		||||
                return allocator.address(value);
 | 
			
		||||
            }
 | 
			
		||||
            const_pointer address(const_reference value) const {
 | 
			
		||||
                return allocator.address(value);
 | 
			
		||||
            }
 | 
			
		||||
            size_type max_size() const {
 | 
			
		||||
                return allocator.max_size();
 | 
			
		||||
            }
 | 
			
		||||
            pointer allocate(size_type count, const void* value = 0) {
 | 
			
		||||
                std::size_t a1 = boost::alignment_of<T>::value;
 | 
			
		||||
                std::size_t n1 = count * sizeof(Y) + a1 - 1;
 | 
			
		||||
                char*  p1 = A3(allocator).allocate(n1 + N1, value);
 | 
			
		||||
                char*  p2 = p1 + n1;
 | 
			
		||||
                while (std::size_t(p2) % a1 != 0) {
 | 
			
		||||
                    p2--;
 | 
			
		||||
                }
 | 
			
		||||
                *data = reinterpret_cast<T*>(p2);
 | 
			
		||||
                return  reinterpret_cast<Y*>(p1);
 | 
			
		||||
            }
 | 
			
		||||
            void deallocate(pointer memory, size_type count) {
 | 
			
		||||
                std::size_t a1 = boost::alignment_of<T>::value;
 | 
			
		||||
                std::size_t n1 = count * sizeof(Y) + a1 - 1;
 | 
			
		||||
                char*  p1 = reinterpret_cast<char*>(memory);
 | 
			
		||||
                A3(allocator).deallocate(p1, n1 + N1);
 | 
			
		||||
            }
 | 
			
		||||
            void construct(pointer memory, const Y& value) {
 | 
			
		||||
                allocator.construct(memory, value);
 | 
			
		||||
            }
 | 
			
		||||
            void destroy(pointer memory) {
 | 
			
		||||
                allocator.destroy(memory);
 | 
			
		||||
            }
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            bool operator==(const allocate_array_helper<A, T[N], U>& other) const {
 | 
			
		||||
                return allocator == other.allocator;
 | 
			
		||||
            }
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            bool operator!=(const allocate_array_helper<A, T[N], U>& other) const {
 | 
			
		||||
                return !(*this == other); 
 | 
			
		||||
            }
 | 
			
		||||
        private:
 | 
			
		||||
            enum {
 | 
			
		||||
                N1 = N * sizeof(T)
 | 
			
		||||
            };
 | 
			
		||||
            A2 allocator;
 | 
			
		||||
            T** data;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										124
									
								
								include/boost/smart_ptr/detail/array_deleter.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								include/boost/smart_ptr/detail/array_deleter.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,124 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Glen Joseph Fernandes
 | 
			
		||||
 * glenfe at live dot com
 | 
			
		||||
 *
 | 
			
		||||
 * Distributed under the Boost Software License,
 | 
			
		||||
 * Version 1.0. (See accompanying file LICENSE_1_0.txt
 | 
			
		||||
 * or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_DELETER_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ARRAY_DELETER_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/array_utility.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_forward.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
    namespace detail {
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        class array_deleter;
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        class array_deleter<T[]> {
 | 
			
		||||
        public:
 | 
			
		||||
            array_deleter(std::size_t size_)
 | 
			
		||||
                : size(size_),
 | 
			
		||||
                  object(0) {
 | 
			
		||||
            }
 | 
			
		||||
            ~array_deleter() {
 | 
			
		||||
                if (object) {
 | 
			
		||||
                    array_destroy(object, size);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            void init(T* memory) {
 | 
			
		||||
                array_init(memory, size);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
			
		||||
            void init(T* memory, T&& value) {
 | 
			
		||||
                array_init_value(memory, size, sp_forward<T>(value));
 | 
			
		||||
                object = memory;                
 | 
			
		||||
            }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
			
		||||
            template<typename... Args>
 | 
			
		||||
            void init(T* memory, Args&&... args) {
 | 
			
		||||
                array_init_args(memory, size, sp_forward<Args>(args)...);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
            void init_list(T* memory, const T* list) {
 | 
			
		||||
                array_init_list(memory, size, list);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
            template<std::size_t M>
 | 
			
		||||
            void init_list(T* memory, const T* list) {
 | 
			
		||||
                array_init_list<T, M>(memory, size, list);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
            void noinit(T* memory) {
 | 
			
		||||
                array_noinit(memory, size);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
            void operator()(const void*) {
 | 
			
		||||
                if (object) {
 | 
			
		||||
                    array_destroy(object, size);
 | 
			
		||||
                    object = 0;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        private:
 | 
			
		||||
            std::size_t size;
 | 
			
		||||
            T* object;
 | 
			
		||||
        };
 | 
			
		||||
        template<typename T, std::size_t N>
 | 
			
		||||
        class array_deleter<T[N]> {
 | 
			
		||||
        public:
 | 
			
		||||
            array_deleter()
 | 
			
		||||
                : object(0) {
 | 
			
		||||
            }
 | 
			
		||||
            ~array_deleter() {
 | 
			
		||||
                if (object) {
 | 
			
		||||
                    array_destroy(object, N);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            void init(T* memory) {
 | 
			
		||||
                array_init(memory, N);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
			
		||||
            void init(T* memory, T&& value) {
 | 
			
		||||
                array_init_value(memory, N, sp_forward<T>(value));
 | 
			
		||||
                object = memory;                
 | 
			
		||||
            }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
			
		||||
            template<typename... Args>
 | 
			
		||||
            void init(T* memory, Args&&... args) {
 | 
			
		||||
                array_init_args(memory, N, sp_forward<Args>(args)...);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
            void init_list(T* memory, const T* list) {
 | 
			
		||||
                array_init_list(memory, N, list);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
            template<std::size_t M>
 | 
			
		||||
            void init_list(T* memory, const T* list) {
 | 
			
		||||
                array_init_list<T, M>(memory, N, list);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
            void noinit(T* memory) {
 | 
			
		||||
                array_noinit(memory, N);
 | 
			
		||||
                object = memory;
 | 
			
		||||
            }
 | 
			
		||||
            void operator()(const void*) {
 | 
			
		||||
                if (object) {
 | 
			
		||||
                    array_destroy(object, N);
 | 
			
		||||
                    object = 0;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        private:
 | 
			
		||||
            T* object;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										53
									
								
								include/boost/smart_ptr/detail/array_traits.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								include/boost/smart_ptr/detail/array_traits.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Glen Joseph Fernandes 
 | 
			
		||||
 * glenfe at live dot com
 | 
			
		||||
 *
 | 
			
		||||
 * Distributed under the Boost Software License, 
 | 
			
		||||
 * Version 1.0. (See accompanying file LICENSE_1_0.txt 
 | 
			
		||||
 * or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_TRAITS_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ARRAY_TRAITS_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/type_traits/remove_cv.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
    namespace detail {
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        struct array_base {
 | 
			
		||||
            typedef typename boost::remove_cv<T>::type type;
 | 
			
		||||
        };
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        struct array_base<T[]> {
 | 
			
		||||
            typedef typename array_base<T>::type type;
 | 
			
		||||
        };
 | 
			
		||||
        template<typename T, std::size_t N>
 | 
			
		||||
        struct array_base<T[N]> {
 | 
			
		||||
            typedef typename array_base<T>::type type;
 | 
			
		||||
        };
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        struct array_total {
 | 
			
		||||
            enum {
 | 
			
		||||
                size = 1
 | 
			
		||||
            };
 | 
			
		||||
        };
 | 
			
		||||
        template<typename T, std::size_t N>
 | 
			
		||||
        struct array_total<T[N]> {
 | 
			
		||||
            enum {
 | 
			
		||||
                size = N * array_total<T>::size
 | 
			
		||||
            };
 | 
			
		||||
        };
 | 
			
		||||
        template<typename T> 
 | 
			
		||||
        struct array_inner;
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        struct array_inner<T[]> {
 | 
			
		||||
            typedef T type;
 | 
			
		||||
        };
 | 
			
		||||
        template<typename T, std::size_t N>
 | 
			
		||||
        struct array_inner<T[N]> {
 | 
			
		||||
            typedef T type;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										178
									
								
								include/boost/smart_ptr/detail/array_utility.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								include/boost/smart_ptr/detail/array_utility.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,178 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Glen Joseph Fernandes 
 | 
			
		||||
 * glenfe at live dot com
 | 
			
		||||
 *
 | 
			
		||||
 * Distributed under the Boost Software License, 
 | 
			
		||||
 * Version 1.0. (See accompanying file LICENSE_1_0.txt 
 | 
			
		||||
 * or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ARRAY_UTILITY_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ARRAY_UTILITY_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/type_traits/has_trivial_constructor.hpp>
 | 
			
		||||
#include <boost/type_traits/has_trivial_destructor.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
    namespace detail {
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_destroy(T*, std::size_t, boost::true_type) {
 | 
			
		||||
        }
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_destroy(T* memory, std::size_t size, boost::false_type) {
 | 
			
		||||
            for (std::size_t i = size; i > 0; ) {
 | 
			
		||||
                memory[--i].~T();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_destroy(T* memory, std::size_t size) {
 | 
			
		||||
            boost::has_trivial_destructor<T> type;
 | 
			
		||||
            array_destroy(memory, size, type);
 | 
			
		||||
        }
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_init(T* memory, std::size_t size, boost::true_type) {
 | 
			
		||||
            for (std::size_t i = 0; i < size; i++) {
 | 
			
		||||
                memory[i] = T();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_init(T* memory, std::size_t size, boost::false_type) {
 | 
			
		||||
#if !defined(BOOST_NO_EXCEPTIONS)
 | 
			
		||||
            std::size_t i = 0;
 | 
			
		||||
            try {
 | 
			
		||||
                for (; i < size; i++) {
 | 
			
		||||
                    void* p1 = memory + i;
 | 
			
		||||
                    ::new(p1) T();
 | 
			
		||||
                }
 | 
			
		||||
            } catch (...) {
 | 
			
		||||
                array_destroy(memory, i);
 | 
			
		||||
                throw;
 | 
			
		||||
            }
 | 
			
		||||
#else
 | 
			
		||||
            for (std::size_t i = 0; i < size; i++) {
 | 
			
		||||
                void* p1 = memory + i;
 | 
			
		||||
                ::new(p1) T();
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_init(T* memory, std::size_t size) {
 | 
			
		||||
            boost::has_trivial_default_constructor<T> type;            
 | 
			
		||||
            array_init(memory, size, type);
 | 
			
		||||
        }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_init_value(T* memory, std::size_t size, T&& value) {
 | 
			
		||||
#if !defined(BOOST_NO_EXCEPTIONS)
 | 
			
		||||
            std::size_t i = 0;
 | 
			
		||||
            try {
 | 
			
		||||
                for (; i < size; i++) {
 | 
			
		||||
                    void* p1 = memory + i;
 | 
			
		||||
                    ::new(p1) T(value);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (...) {
 | 
			
		||||
                array_destroy(memory, i);
 | 
			
		||||
                throw;
 | 
			
		||||
            }
 | 
			
		||||
#else
 | 
			
		||||
            for (std::size_t i = 0; i < size; i++) {
 | 
			
		||||
                void* p1 = memory + i;
 | 
			
		||||
                ::new(p1) T(value);
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
			
		||||
        template<typename T, typename... Args>
 | 
			
		||||
        inline void array_init_args(T* memory, std::size_t size, Args&&... args) {
 | 
			
		||||
#if !defined(BOOST_NO_EXCEPTIONS)
 | 
			
		||||
            std::size_t i = 0;
 | 
			
		||||
            try {
 | 
			
		||||
                for (; i < size; i++) {
 | 
			
		||||
                    void* p1 = memory + i;
 | 
			
		||||
                    ::new(p1) T(args...);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (...) {
 | 
			
		||||
                array_destroy(memory, i);
 | 
			
		||||
                throw;
 | 
			
		||||
            }
 | 
			
		||||
#else
 | 
			
		||||
            for (std::size_t i = 0; i < size; i++) {
 | 
			
		||||
                void* p1 = memory + i;
 | 
			
		||||
                ::new(p1) T(args...);
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_init_list(T* memory, std::size_t size, const T* list) {
 | 
			
		||||
#if !defined(BOOST_NO_EXCEPTIONS)
 | 
			
		||||
            std::size_t i = 0;
 | 
			
		||||
            try {
 | 
			
		||||
                for (; i < size; i++) {
 | 
			
		||||
                    void* p1 = memory + i;
 | 
			
		||||
                    ::new(p1) T(list[i]);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (...) {
 | 
			
		||||
                array_destroy(memory, i);
 | 
			
		||||
                throw;
 | 
			
		||||
            }
 | 
			
		||||
#else
 | 
			
		||||
            for (std::size_t i = 0; i < size; i++) {
 | 
			
		||||
                void* p1 = memory + i;
 | 
			
		||||
                ::new(p1) T(list[i]);
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
        template<typename T, std::size_t N>
 | 
			
		||||
        inline void array_init_list(T* memory, std::size_t size, const T* list) {
 | 
			
		||||
#if !defined(BOOST_NO_EXCEPTIONS)
 | 
			
		||||
            std::size_t i = 0;
 | 
			
		||||
            try {
 | 
			
		||||
                for (; i < size; i++) {
 | 
			
		||||
                    void* p1 = memory + i;
 | 
			
		||||
                    ::new(p1) T(list[i % N]);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (...) {
 | 
			
		||||
                array_destroy(memory, i);
 | 
			
		||||
                throw;
 | 
			
		||||
            }
 | 
			
		||||
#else
 | 
			
		||||
            for (std::size_t i = 0; i < size; i++) {
 | 
			
		||||
                void* p1 = memory + i;
 | 
			
		||||
                ::new(p1) T(list[i % N]);
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_noinit(T*, std::size_t, boost::true_type) {
 | 
			
		||||
        }
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_noinit(T* memory, std::size_t size, boost::false_type) {
 | 
			
		||||
#if !defined(BOOST_NO_EXCEPTIONS)
 | 
			
		||||
            std::size_t i = 0;
 | 
			
		||||
            try {
 | 
			
		||||
                for (; i < size; i++) {
 | 
			
		||||
                    void* p1 = memory + i;
 | 
			
		||||
                    ::new(p1) T;
 | 
			
		||||
                }
 | 
			
		||||
            } catch (...) {
 | 
			
		||||
                array_destroy(memory, i);
 | 
			
		||||
                throw;
 | 
			
		||||
            }
 | 
			
		||||
#else
 | 
			
		||||
            for (std::size_t i = 0; i < size; i++) {
 | 
			
		||||
                void* p1 = memory + i;
 | 
			
		||||
                ::new(p1) T;
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        inline void array_noinit(T* memory, std::size_t size) {
 | 
			
		||||
            boost::has_trivial_default_constructor<T> type;
 | 
			
		||||
            array_noinit(memory, size, type);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										119
									
								
								include/boost/smart_ptr/detail/atomic_count.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								include/boost/smart_ptr/detail/atomic_count.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count.hpp - thread/SMP safe reference counter
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  typedef <implementation-defined> boost::detail::atomic_count;
 | 
			
		||||
//
 | 
			
		||||
//  atomic_count a(n);
 | 
			
		||||
//
 | 
			
		||||
//    (n is convertible to long)
 | 
			
		||||
//
 | 
			
		||||
//    Effects: Constructs an atomic_count with an initial value of n
 | 
			
		||||
//
 | 
			
		||||
//  a;
 | 
			
		||||
//
 | 
			
		||||
//    Returns: (long) the current value of a
 | 
			
		||||
//
 | 
			
		||||
//  ++a;
 | 
			
		||||
//
 | 
			
		||||
//    Effects: Atomically increments the value of a
 | 
			
		||||
//    Returns: (long) the new value of a
 | 
			
		||||
//
 | 
			
		||||
//  --a;
 | 
			
		||||
//
 | 
			
		||||
//    Effects: Atomically decrements the value of a
 | 
			
		||||
//    Returns: (long) the new value of a
 | 
			
		||||
//
 | 
			
		||||
//    Important note: when --a returns zero, it must act as a
 | 
			
		||||
//      read memory barrier (RMB); i.e. the calling thread must
 | 
			
		||||
//      have a synchronized view of the memory
 | 
			
		||||
//
 | 
			
		||||
//    On Intel IA-32 (x86) memory is always synchronized, so this
 | 
			
		||||
//      is not a problem.
 | 
			
		||||
//
 | 
			
		||||
//    On many architectures the atomic instructions already act as
 | 
			
		||||
//      a memory barrier.
 | 
			
		||||
//
 | 
			
		||||
//    This property is necessary for proper reference counting, since
 | 
			
		||||
//      a thread can update the contents of a shared object, then
 | 
			
		||||
//      release its reference, and another thread may immediately
 | 
			
		||||
//      release the last reference causing object destruction.
 | 
			
		||||
//
 | 
			
		||||
//    The destructor needs to have a synchronized view of the
 | 
			
		||||
//      object to perform proper cleanup.
 | 
			
		||||
//
 | 
			
		||||
//    Original example by Alexander Terekhov:
 | 
			
		||||
//
 | 
			
		||||
//    Given:
 | 
			
		||||
//
 | 
			
		||||
//    - a mutable shared object OBJ;
 | 
			
		||||
//    - two threads THREAD1 and THREAD2 each holding 
 | 
			
		||||
//      a private smart_ptr object pointing to that OBJ.
 | 
			
		||||
//
 | 
			
		||||
//    t1: THREAD1 updates OBJ (thread-safe via some synchronization)
 | 
			
		||||
//      and a few cycles later (after "unlock") destroys smart_ptr;
 | 
			
		||||
//
 | 
			
		||||
//    t2: THREAD2 destroys smart_ptr WITHOUT doing any synchronization 
 | 
			
		||||
//      with respect to shared mutable object OBJ; OBJ destructors
 | 
			
		||||
//      are called driven by smart_ptr interface...
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_HAS_THREADS
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
typedef long atomic_count;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#elif defined(BOOST_AC_USE_PTHREADS)
 | 
			
		||||
#  include <boost/smart_ptr/detail/atomic_count_pthreads.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) )
 | 
			
		||||
#  include <boost/smart_ptr/detail/atomic_count_gcc_x86.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
 | 
			
		||||
#  include <boost/smart_ptr/detail/atomic_count_win32.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC )
 | 
			
		||||
#  include <boost/smart_ptr/detail/atomic_count_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
 | 
			
		||||
#  include <boost/smart_ptr/detail/atomic_count_gcc.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(BOOST_HAS_PTHREADS)
 | 
			
		||||
 | 
			
		||||
#  define BOOST_AC_USE_PTHREADS
 | 
			
		||||
#  include <boost/smart_ptr/detail/atomic_count_pthreads.hpp>
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
// Use #define BOOST_DISABLE_THREADS to avoid the error
 | 
			
		||||
#error Unrecognized threading platform
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										72
									
								
								include/boost/smart_ptr/detail/atomic_count_gcc.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								include/boost/smart_ptr/detail/atomic_count_gcc.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_gcc.hpp
 | 
			
		||||
//
 | 
			
		||||
//  atomic_count for GNU libstdc++ v3
 | 
			
		||||
//
 | 
			
		||||
//  http://gcc.gnu.org/onlinedocs/porting/Thread-safety.html
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright (c) 2002 Lars Gullik Bj<42>nnes <larsbj@lyx.org>
 | 
			
		||||
//  Copyright 2003-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if __GNUC__ * 100 + __GNUC_MINOR__ >= 402
 | 
			
		||||
# include <ext/atomicity.h> 
 | 
			
		||||
#else 
 | 
			
		||||
# include <bits/atomicity.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined(__GLIBCXX__) // g++ 3.4+
 | 
			
		||||
 | 
			
		||||
using __gnu_cxx::__atomic_add;
 | 
			
		||||
using __gnu_cxx::__exchange_and_add;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ) : value_( v ) {}
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return __exchange_and_add( &value_, +1 ) + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return __exchange_and_add( &value_, -1 ) - 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return __exchange_and_add( &value_, 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    mutable _Atomic_word value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										77
									
								
								include/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								include/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_gcc_x86.hpp
 | 
			
		||||
//
 | 
			
		||||
//  atomic_count for g++ on 486+/AMD64
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2007 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ) : value_( static_cast< int >( v ) ) {}
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_exchange_and_add( &value_, +1 ) + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_exchange_and_add( &value_, -1 ) - 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_exchange_and_add( &value_, 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    mutable int value_;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    static int atomic_exchange_and_add( int * pw, int dv )
 | 
			
		||||
    {
 | 
			
		||||
        // int r = *pw;
 | 
			
		||||
        // *pw += dv;
 | 
			
		||||
        // return r;
 | 
			
		||||
 | 
			
		||||
        int r;
 | 
			
		||||
 | 
			
		||||
        __asm__ __volatile__
 | 
			
		||||
        (
 | 
			
		||||
            "lock\n\t"
 | 
			
		||||
            "xadd %1, %0":
 | 
			
		||||
            "+m"( *pw ), "=r"( r ): // outputs (%0, %1)
 | 
			
		||||
            "1"( dv ): // inputs (%2 == %1)
 | 
			
		||||
            "memory", "cc" // clobbers
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										96
									
								
								include/boost/smart_ptr/detail/atomic_count_pthreads.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								include/boost/smart_ptr/detail/atomic_count_pthreads.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_pthreads.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  The generic pthread_mutex-based implementation sometimes leads to
 | 
			
		||||
//    inefficiencies. Example: a class with two atomic_count members
 | 
			
		||||
//    can get away with a single mutex.
 | 
			
		||||
//
 | 
			
		||||
//  Users can detect this situation by checking BOOST_AC_USE_PTHREADS.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        scoped_lock(pthread_mutex_t & m): m_(m)
 | 
			
		||||
        {
 | 
			
		||||
            pthread_mutex_lock(&m_);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            pthread_mutex_unlock(&m_);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        pthread_mutex_t & m_;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count(long v): value_(v)
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_init(&mutex_, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~atomic_count()
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_destroy(&mutex_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        scoped_lock lock(mutex_);
 | 
			
		||||
        return ++value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        scoped_lock lock(mutex_);
 | 
			
		||||
        return --value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        scoped_lock lock(mutex_);
 | 
			
		||||
        return value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    mutable pthread_mutex_t mutex_;
 | 
			
		||||
    long value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										59
									
								
								include/boost/smart_ptr/detail/atomic_count_solaris.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								include/boost/smart_ptr/detail/atomic_count_solaris.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_solaris.hpp
 | 
			
		||||
//   based on: boost/detail/atomic_count_win32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001-2005 Peter Dimov
 | 
			
		||||
//  Copyright (c) 2006 Michael van der Westhuizen
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <atomic.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( uint32_t v ): value_( v )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_inc_32_nv( &value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_dec_32_nv( &value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator uint32_t() const
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<uint32_t const volatile &>( value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count( atomic_count const & );
 | 
			
		||||
    atomic_count & operator=( atomic_count const & );
 | 
			
		||||
 | 
			
		||||
    uint32_t value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										61
									
								
								include/boost/smart_ptr/detail/atomic_count_sync.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								include/boost/smart_ptr/detail/atomic_count_sync.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_sync.hpp
 | 
			
		||||
//
 | 
			
		||||
//  atomic_count for g++ 4.1+
 | 
			
		||||
//
 | 
			
		||||
//  http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2007 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if defined( __ia64__ ) && defined( __INTEL_COMPILER )
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ) : value_( v ) {}
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return __sync_add_and_fetch( &value_, 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return __sync_add_and_fetch( &value_, -1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return __sync_fetch_and_add( &value_, 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    mutable long value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										63
									
								
								include/boost/smart_ptr/detail/atomic_count_win32.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								include/boost/smart_ptr/detail/atomic_count_win32.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_win32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/interlocked.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ): value_( v )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return BOOST_INTERLOCKED_INCREMENT( &value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return BOOST_INTERLOCKED_DECREMENT( &value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<long const volatile &>( value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count( atomic_count const & );
 | 
			
		||||
    atomic_count & operator=( atomic_count const & );
 | 
			
		||||
 | 
			
		||||
    long value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										42
									
								
								include/boost/smart_ptr/detail/lightweight_mutex.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								include/boost/smart_ptr/detail/lightweight_mutex.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lightweight_mutex.hpp - lightweight mutex
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  typedef <unspecified> boost::detail::lightweight_mutex;
 | 
			
		||||
//
 | 
			
		||||
//  boost::detail::lightweight_mutex is a header-only implementation of
 | 
			
		||||
//  a subset of the Mutex concept requirements:
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/doc/html/threads/concepts.html#threads.concepts.Mutex
 | 
			
		||||
//
 | 
			
		||||
//  It maps to a CRITICAL_SECTION on Windows or a pthread_mutex on POSIX.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_HAS_THREADS)
 | 
			
		||||
#  include <boost/smart_ptr/detail/lwm_nop.hpp>
 | 
			
		||||
#elif defined(BOOST_HAS_PTHREADS)
 | 
			
		||||
#  include <boost/smart_ptr/detail/lwm_pthreads.hpp>
 | 
			
		||||
#elif defined(BOOST_HAS_WINTHREADS) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
 | 
			
		||||
#  include <boost/smart_ptr/detail/lwm_win32_cs.hpp>
 | 
			
		||||
#else
 | 
			
		||||
// Use #define BOOST_DISABLE_THREADS to avoid the error
 | 
			
		||||
#  error Unrecognized threading platform
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										37
									
								
								include/boost/smart_ptr/detail/lwm_nop.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								include/boost/smart_ptr/detail/lwm_nop.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lwm_nop.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class lightweight_mutex
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef lightweight_mutex scoped_lock;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										87
									
								
								include/boost/smart_ptr/detail/lwm_pthreads.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								include/boost/smart_ptr/detail/lwm_pthreads.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lwm_pthreads.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class lightweight_mutex
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    pthread_mutex_t m_;
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex(lightweight_mutex const &);
 | 
			
		||||
    lightweight_mutex & operator=(lightweight_mutex const &);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
// HPUX 10.20 / DCE has a nonstandard pthread_mutex_init
 | 
			
		||||
 | 
			
		||||
#if defined(__hpux) && defined(_DECTHREADS_)
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_init( &m_, pthread_mutexattr_default ) == 0 );
 | 
			
		||||
#else
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class scoped_lock;
 | 
			
		||||
    friend class scoped_lock;
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        pthread_mutex_t & m_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock(scoped_lock const &);
 | 
			
		||||
        scoped_lock & operator=(scoped_lock const &);
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        scoped_lock(lightweight_mutex & m): m_(m.m_)
 | 
			
		||||
        {
 | 
			
		||||
            BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										108
									
								
								include/boost/smart_ptr/detail/lwm_win32_cs.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								include/boost/smart_ptr/detail/lwm_win32_cs.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,108 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lwm_win32_cs.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_USE_WINDOWS_H
 | 
			
		||||
#  include <windows.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_USE_WINDOWS_H
 | 
			
		||||
 | 
			
		||||
struct critical_section
 | 
			
		||||
{
 | 
			
		||||
    struct critical_section_debug * DebugInfo;
 | 
			
		||||
    long LockCount;
 | 
			
		||||
    long RecursionCount;
 | 
			
		||||
    void * OwningThread;
 | 
			
		||||
    void * LockSemaphore;
 | 
			
		||||
#if defined(_WIN64)
 | 
			
		||||
    unsigned __int64 SpinCount;
 | 
			
		||||
#else
 | 
			
		||||
    unsigned long SpinCount;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSection(critical_section *);
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall EnterCriticalSection(critical_section *);
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall LeaveCriticalSection(critical_section *);
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall DeleteCriticalSection(critical_section *);
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
typedef ::CRITICAL_SECTION critical_section;
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_USE_WINDOWS_H
 | 
			
		||||
 | 
			
		||||
class lightweight_mutex
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    critical_section cs_;
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex(lightweight_mutex const &);
 | 
			
		||||
    lightweight_mutex & operator=(lightweight_mutex const &);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
        InitializeCriticalSection(&cs_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
        DeleteCriticalSection(&cs_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class scoped_lock;
 | 
			
		||||
    friend class scoped_lock;
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        lightweight_mutex & m_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock(scoped_lock const &);
 | 
			
		||||
        scoped_lock & operator=(scoped_lock const &);
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock(lightweight_mutex & m): m_(m)
 | 
			
		||||
        {
 | 
			
		||||
            EnterCriticalSection(&m_.cs_);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            LeaveCriticalSection(&m_.cs_);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										157
									
								
								include/boost/smart_ptr/detail/make_array_helper.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								include/boost/smart_ptr/detail/make_array_helper.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,157 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Glen Joseph Fernandes 
 | 
			
		||||
 * glenfe at live dot com
 | 
			
		||||
 *
 | 
			
		||||
 * Distributed under the Boost Software License, 
 | 
			
		||||
 * Version 1.0. (See accompanying file LICENSE_1_0.txt 
 | 
			
		||||
 * or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_MAKE_ARRAY_HELPER_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_MAKE_ARRAY_HELPER_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/type_traits/alignment_of.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
    namespace detail {
 | 
			
		||||
        template<typename T, typename Y = char>
 | 
			
		||||
        class make_array_helper;
 | 
			
		||||
        template<typename T, typename Y>
 | 
			
		||||
        class make_array_helper<T[], Y> {
 | 
			
		||||
            template<typename T2, typename Y2>
 | 
			
		||||
            friend class make_array_helper;
 | 
			
		||||
        public:
 | 
			
		||||
            typedef Y           value_type;
 | 
			
		||||
            typedef Y*          pointer;
 | 
			
		||||
            typedef const Y*    const_pointer;
 | 
			
		||||
            typedef Y&          reference;
 | 
			
		||||
            typedef const Y&    const_reference;
 | 
			
		||||
            typedef std::size_t size_type;
 | 
			
		||||
            typedef ptrdiff_t   difference_type;
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            struct rebind {
 | 
			
		||||
                typedef make_array_helper<T[], U> other;
 | 
			
		||||
            };
 | 
			
		||||
            make_array_helper(std::size_t size_, T** data_)
 | 
			
		||||
                : size(sizeof(T) * size_),
 | 
			
		||||
                  data(data_) {
 | 
			
		||||
            }
 | 
			
		||||
            template<class U>
 | 
			
		||||
            make_array_helper(const make_array_helper<T[], U>& other) 
 | 
			
		||||
                : size(other.size),
 | 
			
		||||
                  data(other.data) {
 | 
			
		||||
            }
 | 
			
		||||
            pointer address(reference value) const {
 | 
			
		||||
                return &value;
 | 
			
		||||
            }
 | 
			
		||||
            const_pointer address(const_reference value) const {
 | 
			
		||||
                return &value;
 | 
			
		||||
            }
 | 
			
		||||
            size_type max_size() const {
 | 
			
		||||
                return static_cast<std::size_t>(-1) / sizeof(Y);
 | 
			
		||||
            }
 | 
			
		||||
            pointer allocate(size_type count, const void* = 0) {
 | 
			
		||||
                std::size_t a1 = boost::alignment_of<T>::value;
 | 
			
		||||
                std::size_t n1 = count * sizeof(Y) + a1 - 1;
 | 
			
		||||
                void*  p1 = ::operator new(n1 + size);
 | 
			
		||||
                char*  p2 = static_cast<char*>(p1) + n1;
 | 
			
		||||
                while (std::size_t(p2) % a1 != 0) {
 | 
			
		||||
                    p2--;
 | 
			
		||||
                }
 | 
			
		||||
                *data = reinterpret_cast<T*>(p2);
 | 
			
		||||
                return  reinterpret_cast<Y*>(p1);
 | 
			
		||||
            }
 | 
			
		||||
            void deallocate(pointer memory, size_type) {
 | 
			
		||||
                void* p1 = memory;
 | 
			
		||||
                ::operator delete(p1);
 | 
			
		||||
            }
 | 
			
		||||
            void construct(pointer memory, const Y& value) {
 | 
			
		||||
                void* p1 = memory;
 | 
			
		||||
                ::new(p1) Y(value);
 | 
			
		||||
            }
 | 
			
		||||
            void destroy(pointer memory) {
 | 
			
		||||
                memory->~Y();
 | 
			
		||||
            }
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            bool operator==(const make_array_helper<T[], U>&) const {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            bool operator!=(const make_array_helper<T[], U>& other) const {
 | 
			
		||||
                return !(*this == other); 
 | 
			
		||||
            }
 | 
			
		||||
        private:
 | 
			
		||||
            std::size_t size;
 | 
			
		||||
            T** data;
 | 
			
		||||
        };
 | 
			
		||||
        template<typename T, std::size_t N, typename Y>
 | 
			
		||||
        class make_array_helper<T[N], Y> {
 | 
			
		||||
            template<typename T2, typename Y2>
 | 
			
		||||
            friend class make_array_helper;
 | 
			
		||||
        public:
 | 
			
		||||
            typedef Y           value_type;
 | 
			
		||||
            typedef Y*          pointer;
 | 
			
		||||
            typedef const Y*    const_pointer;
 | 
			
		||||
            typedef Y&          reference;
 | 
			
		||||
            typedef const Y&    const_reference;
 | 
			
		||||
            typedef std::size_t size_type;
 | 
			
		||||
            typedef ptrdiff_t   difference_type;
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            struct rebind {
 | 
			
		||||
                typedef make_array_helper<T[N], U> other;
 | 
			
		||||
            };
 | 
			
		||||
            make_array_helper(T** data_)
 | 
			
		||||
                : data(data_) {
 | 
			
		||||
            }
 | 
			
		||||
            template<class U>
 | 
			
		||||
            make_array_helper(const make_array_helper<T[N], U>& other) 
 | 
			
		||||
                : data(other.data) {
 | 
			
		||||
            }
 | 
			
		||||
            pointer address(reference value) const {
 | 
			
		||||
                return &value;
 | 
			
		||||
            }
 | 
			
		||||
            const_pointer address(const_reference value) const {
 | 
			
		||||
                return &value;
 | 
			
		||||
            }
 | 
			
		||||
            size_type max_size() const {
 | 
			
		||||
                return static_cast<std::size_t>(-1) / sizeof(Y);
 | 
			
		||||
            }
 | 
			
		||||
            pointer allocate(size_type count, const void* = 0) {
 | 
			
		||||
                std::size_t a1 = boost::alignment_of<T>::value;
 | 
			
		||||
                std::size_t n1 = count * sizeof(Y) + a1 - 1;
 | 
			
		||||
                void*  p1 = ::operator new(n1 + N1);
 | 
			
		||||
                char*  p2 = static_cast<char*>(p1) + n1;
 | 
			
		||||
                while (std::size_t(p2) % a1 != 0) {
 | 
			
		||||
                    p2--;
 | 
			
		||||
                }
 | 
			
		||||
                *data = reinterpret_cast<T*>(p2);
 | 
			
		||||
                return  reinterpret_cast<Y*>(p1);
 | 
			
		||||
            }
 | 
			
		||||
            void deallocate(pointer memory, size_type) {
 | 
			
		||||
                void* p1 = memory;
 | 
			
		||||
                ::operator delete(p1);
 | 
			
		||||
            }
 | 
			
		||||
            void construct(pointer memory, const Y& value) {
 | 
			
		||||
                void* p1 = memory;
 | 
			
		||||
                ::new(p1) Y(value);
 | 
			
		||||
            }
 | 
			
		||||
            void destroy(pointer memory) {
 | 
			
		||||
                memory->~Y();
 | 
			
		||||
            }
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            bool operator==(const make_array_helper<T[N], U>&) const {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
            template<typename U>
 | 
			
		||||
            bool operator!=(const make_array_helper<T[N], U>& other) const {
 | 
			
		||||
                return !(*this == other); 
 | 
			
		||||
            }
 | 
			
		||||
        private:
 | 
			
		||||
            enum {
 | 
			
		||||
                N1 = N * sizeof(T)
 | 
			
		||||
            };
 | 
			
		||||
            T** data;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										63
									
								
								include/boost/smart_ptr/detail/operator_bool.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								include/boost/smart_ptr/detail/operator_bool.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
//  This header intentionally has no include guards.
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001-2009, 2012 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS ) && !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    explicit operator bool () const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, < 0x570) ) || defined(__CINT__)
 | 
			
		||||
 | 
			
		||||
    operator bool () const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif defined( _MANAGED )
 | 
			
		||||
 | 
			
		||||
    static void unspecified_bool( this_type*** )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    typedef void (*unspecified_bool_type)( this_type*** );
 | 
			
		||||
 | 
			
		||||
    operator unspecified_bool_type() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0? 0: unspecified_bool;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif \
 | 
			
		||||
    ( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, < 0x3200) ) || \
 | 
			
		||||
    ( defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 304) ) || \
 | 
			
		||||
    ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590) )
 | 
			
		||||
 | 
			
		||||
    typedef element_type * (this_type::*unspecified_bool_type)() const;
 | 
			
		||||
 | 
			
		||||
    operator unspecified_bool_type() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0? 0: &this_type::get;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef element_type * this_type::*unspecified_bool_type;
 | 
			
		||||
 | 
			
		||||
    operator unspecified_bool_type() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0? 0: &this_type::px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // operator! is redundant, but some compilers need it
 | 
			
		||||
    bool operator! () const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0;
 | 
			
		||||
    }
 | 
			
		||||
							
								
								
									
										199
									
								
								include/boost/smart_ptr/detail/quick_allocator.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										199
									
								
								include/boost/smart_ptr/detail/quick_allocator.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,199 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/quick_allocator.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2003 David Abrahams
 | 
			
		||||
//  Copyright (c) 2003 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/type_traits/type_with_alignment.hpp>
 | 
			
		||||
#include <boost/type_traits/alignment_of.hpp>
 | 
			
		||||
 | 
			
		||||
#include <new>              // ::operator new, ::operator delete
 | 
			
		||||
#include <cstddef>          // std::size_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_> union freeblock
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::type_with_alignment<align_>::type aligner_type;
 | 
			
		||||
    aligner_type aligner;
 | 
			
		||||
    char bytes[size];
 | 
			
		||||
    freeblock * next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_> struct allocator_impl
 | 
			
		||||
{
 | 
			
		||||
    typedef freeblock<size, align_> block;
 | 
			
		||||
 | 
			
		||||
    // It may seem odd to use such small pages.
 | 
			
		||||
    //
 | 
			
		||||
    // However, on a typical Windows implementation that uses
 | 
			
		||||
    // the OS allocator, "normal size" pages interact with the
 | 
			
		||||
    // "ordinary" operator new, slowing it down dramatically.
 | 
			
		||||
    //
 | 
			
		||||
    // 512 byte pages are handled by the small object allocator,
 | 
			
		||||
    // and don't interfere with ::new.
 | 
			
		||||
    //
 | 
			
		||||
    // The other alternative is to use much bigger pages (1M.)
 | 
			
		||||
    //
 | 
			
		||||
    // It is surprisingly easy to hit pathological behavior by
 | 
			
		||||
    // varying the page size. g++ 2.96 on Red Hat Linux 7.2,
 | 
			
		||||
    // for example, passionately dislikes 496. 512 seems OK.
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_QA_PAGE_SIZE)
 | 
			
		||||
 | 
			
		||||
    enum { items_per_page = BOOST_QA_PAGE_SIZE / size };
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    enum { items_per_page = 512 / size }; // 1048560 / size
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
 | 
			
		||||
    static lightweight_mutex & mutex()
 | 
			
		||||
    {
 | 
			
		||||
        static freeblock< sizeof( lightweight_mutex ), boost::alignment_of< lightweight_mutex >::value > fbm;
 | 
			
		||||
        static lightweight_mutex * pm = new( &fbm ) lightweight_mutex;
 | 
			
		||||
        return *pm;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static lightweight_mutex * mutex_init;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    static block * free;
 | 
			
		||||
    static block * page;
 | 
			
		||||
    static unsigned last;
 | 
			
		||||
 | 
			
		||||
    static inline void * alloc()
 | 
			
		||||
    {
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
        lightweight_mutex::scoped_lock lock( mutex() );
 | 
			
		||||
#endif
 | 
			
		||||
        if(block * x = free)
 | 
			
		||||
        {
 | 
			
		||||
            free = x->next;
 | 
			
		||||
            return x;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if(last == items_per_page)
 | 
			
		||||
            {
 | 
			
		||||
                // "Listen to me carefully: there is no memory leak"
 | 
			
		||||
                // -- Scott Meyers, Eff C++ 2nd Ed Item 10
 | 
			
		||||
                page = ::new block[items_per_page];
 | 
			
		||||
                last = 0;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return &page[last++];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline void * alloc(std::size_t n)
 | 
			
		||||
    {
 | 
			
		||||
        if(n != size) // class-specific new called for a derived object
 | 
			
		||||
        {
 | 
			
		||||
            return ::operator new(n);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
            lightweight_mutex::scoped_lock lock( mutex() );
 | 
			
		||||
#endif
 | 
			
		||||
            if(block * x = free)
 | 
			
		||||
            {
 | 
			
		||||
                free = x->next;
 | 
			
		||||
                return x;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if(last == items_per_page)
 | 
			
		||||
                {
 | 
			
		||||
                    page = ::new block[items_per_page];
 | 
			
		||||
                    last = 0;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return &page[last++];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline void dealloc(void * pv)
 | 
			
		||||
    {
 | 
			
		||||
        if(pv != 0) // 18.4.1.1/13
 | 
			
		||||
        {
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
            lightweight_mutex::scoped_lock lock( mutex() );
 | 
			
		||||
#endif
 | 
			
		||||
            block * pb = static_cast<block *>(pv);
 | 
			
		||||
            pb->next = free;
 | 
			
		||||
            free = pb;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline void dealloc(void * pv, std::size_t n)
 | 
			
		||||
    {
 | 
			
		||||
        if(n != size) // class-specific delete called for a derived object
 | 
			
		||||
        {
 | 
			
		||||
            ::operator delete(pv);
 | 
			
		||||
        }
 | 
			
		||||
        else if(pv != 0) // 18.4.1.1/13
 | 
			
		||||
        {
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
            lightweight_mutex::scoped_lock lock( mutex() );
 | 
			
		||||
#endif
 | 
			
		||||
            block * pb = static_cast<block *>(pv);
 | 
			
		||||
            pb->next = free;
 | 
			
		||||
            free = pb;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_>
 | 
			
		||||
  lightweight_mutex * allocator_impl<size, align_>::mutex_init = &allocator_impl<size, align_>::mutex();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_>
 | 
			
		||||
  freeblock<size, align_> * allocator_impl<size, align_>::free = 0;
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_>
 | 
			
		||||
  freeblock<size, align_> * allocator_impl<size, align_>::page = 0;
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_>
 | 
			
		||||
  unsigned allocator_impl<size, align_>::last = allocator_impl<size, align_>::items_per_page;
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct quick_allocator: public allocator_impl< sizeof(T), boost::alignment_of<T>::value >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										151
									
								
								include/boost/smart_ptr/detail/shared_array_nmt.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								include/boost/smart_ptr/detail/shared_array_nmt.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,151 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/shared_array_nmt.hpp - shared_array.hpp without member templates
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/throw_exception.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cstddef>          // for std::ptrdiff_t
 | 
			
		||||
#include <algorithm>        // for std::swap
 | 
			
		||||
#include <functional>       // for std::less
 | 
			
		||||
#include <new>              // for std::bad_alloc
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> class shared_array
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    typedef detail::atomic_count count_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
      
 | 
			
		||||
    explicit shared_array(T * p = 0): px(p)
 | 
			
		||||
    {
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try  // prevent leak if new throws
 | 
			
		||||
        {
 | 
			
		||||
            pn = new count_type(1);
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_array_delete(p);
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pn = new count_type(1);
 | 
			
		||||
 | 
			
		||||
        if(pn == 0)
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_array_delete(p);
 | 
			
		||||
            boost::throw_exception(std::bad_alloc());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~shared_array()
 | 
			
		||||
    {
 | 
			
		||||
        if(--*pn == 0)
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_array_delete(px);
 | 
			
		||||
            delete pn;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_array(shared_array const & r) : px(r.px)  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        pn = r.pn;
 | 
			
		||||
        ++*pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_array & operator=(shared_array const & r)
 | 
			
		||||
    {
 | 
			
		||||
        shared_array(r).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset(T * p = 0)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT(p == 0 || p != px);
 | 
			
		||||
        shared_array(p).swap(*this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * get() const  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T & operator[](std::ptrdiff_t i) const  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT(px != 0);
 | 
			
		||||
        BOOST_ASSERT(i >= 0);
 | 
			
		||||
        return px[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        return *pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool unique() const  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        return *pn == 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(shared_array<T> & other)  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        std::swap(px, other.px);
 | 
			
		||||
        std::swap(pn, other.pn);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    T * px;            // contained pointer
 | 
			
		||||
    count_type * pn;   // ptr to reference counter
 | 
			
		||||
      
 | 
			
		||||
};  // shared_array
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(shared_array<T> const & a, shared_array<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(shared_array<T> const & a, shared_array<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator<(shared_array<T> const & a, shared_array<T> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return std::less<T*>()(a.get(), b.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void swap(shared_array<T> & a, shared_array<T> & b)
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										603
									
								
								include/boost/smart_ptr/detail/shared_count.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										603
									
								
								include/boost/smart_ptr/detail/shared_count.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,603 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/shared_count.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
# pragma warn -8027     // Functions containing try are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/throw_exception.hpp>
 | 
			
		||||
#include <boost/smart_ptr/bad_weak_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_counted_base.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_counted_impl.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
// In order to avoid circular dependencies with Boost.TR1
 | 
			
		||||
// we make sure that our include of <memory> doesn't try to
 | 
			
		||||
// pull in the TR1 headers: that's why we use this header 
 | 
			
		||||
// rather than including <memory> directly:
 | 
			
		||||
#include <boost/config/no_tr1/memory.hpp>  // std::auto_ptr
 | 
			
		||||
#include <functional>       // std::less
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_EXCEPTIONS
 | 
			
		||||
# include <new>              // std::bad_alloc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
			
		||||
# include <boost/utility/addressof.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 | 
			
		||||
int const shared_count_id = 0x2C35F101;
 | 
			
		||||
int const   weak_count_id = 0x298C38A4;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct sp_nothrow_tag {};
 | 
			
		||||
 | 
			
		||||
template< class D > struct sp_inplace_tag
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
			
		||||
 | 
			
		||||
template< class T > class sp_reference_wrapper
 | 
			
		||||
{ 
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit sp_reference_wrapper( T & t): t_( boost::addressof( t ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template< class Y > void operator()( Y * p ) const
 | 
			
		||||
    {
 | 
			
		||||
        (*t_)( p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    T * t_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class D > struct sp_convert_reference
 | 
			
		||||
{
 | 
			
		||||
    typedef D type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class D > struct sp_convert_reference< D& >
 | 
			
		||||
{
 | 
			
		||||
    typedef sp_reference_wrapper< D > type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class weak_count;
 | 
			
		||||
 | 
			
		||||
class shared_count
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base * pi_;
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
    int id_;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    friend class weak_count;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    shared_count(): pi_(0) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> explicit shared_count( Y * p ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = new sp_counted_impl_p<Y>( p );
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_delete( p );
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = new sp_counted_impl_p<Y>( p );
 | 
			
		||||
 | 
			
		||||
        if( pi_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_delete( p );
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 )
 | 
			
		||||
    template<class Y, class D> shared_count( Y * p, D d ): pi_(0)
 | 
			
		||||
#else
 | 
			
		||||
    template<class P, class D> shared_count( P p, D d ): pi_(0)
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 )
 | 
			
		||||
        typedef Y* P;
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = new sp_counted_impl_pd<P, D>(p, d);
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            d(p); // delete p
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = new sp_counted_impl_pd<P, D>(p, d);
 | 
			
		||||
 | 
			
		||||
        if(pi_ == 0)
 | 
			
		||||
        {
 | 
			
		||||
            d(p); // delete p
 | 
			
		||||
            boost::throw_exception(std::bad_alloc());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
    template< class P, class D > shared_count( P p, sp_inplace_tag<D> ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = new sp_counted_impl_pd< P, D >( p );
 | 
			
		||||
        }
 | 
			
		||||
        catch( ... )
 | 
			
		||||
        {
 | 
			
		||||
            D::operator_fn( p ); // delete p
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = new sp_counted_impl_pd< P, D >( p );
 | 
			
		||||
 | 
			
		||||
        if( pi_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            D::operator_fn( p ); // delete p
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
    template<class P, class D, class A> shared_count( P p, D d, A a ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        typedef sp_counted_impl_pda<P, D, A> impl_type;
 | 
			
		||||
        typedef typename A::template rebind< impl_type >::other A2;
 | 
			
		||||
 | 
			
		||||
        A2 a2( a );
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
 | 
			
		||||
            new( static_cast< void* >( pi_ ) ) impl_type( p, d, a );
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            d( p );
 | 
			
		||||
 | 
			
		||||
            if( pi_ != 0 )
 | 
			
		||||
            {
 | 
			
		||||
                a2.deallocate( static_cast< impl_type* >( pi_ ), 1 );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
        if( pi_ != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            new( static_cast< void* >( pi_ ) ) impl_type( p, d, a );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            d( p );
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
    template< class P, class D, class A > shared_count( P p, sp_inplace_tag< D >, A a ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        typedef sp_counted_impl_pda< P, D, A > impl_type;
 | 
			
		||||
        typedef typename A::template rebind< impl_type >::other A2;
 | 
			
		||||
 | 
			
		||||
        A2 a2( a );
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
 | 
			
		||||
            new( static_cast< void* >( pi_ ) ) impl_type( p, a );
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            D::operator_fn( p );
 | 
			
		||||
 | 
			
		||||
            if( pi_ != 0 )
 | 
			
		||||
            {
 | 
			
		||||
                a2.deallocate( static_cast< impl_type* >( pi_ ), 1 );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
        if( pi_ != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            new( static_cast< void* >( pi_ ) ) impl_type( p, a );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            D::operator_fn( p );
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
 | 
			
		||||
    // auto_ptr<Y> is special cased to provide the strong guarantee
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    explicit shared_count( std::auto_ptr<Y> & r ): pi_( new sp_counted_impl_p<Y>( r.get() ) )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#ifdef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        if( pi_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            boost::throw_exception(std::bad_alloc());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        r.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif 
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D>
 | 
			
		||||
    explicit shared_count( std::unique_ptr<Y, D> & r ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        typedef typename sp_convert_reference<D>::type D2;
 | 
			
		||||
 | 
			
		||||
        D2 d2( r.get_deleter() );
 | 
			
		||||
        pi_ = new sp_counted_impl_pd< typename std::unique_ptr<Y, D>::pointer, D2 >( r.get(), d2 );
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        if( pi_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        r.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ~shared_count() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( pi_ != 0 ) pi_->release();
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        id_ = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_count(shared_count const & r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        if( pi_ != 0 ) pi_->add_ref_copy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    shared_count(shared_count && r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        r.pi_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    explicit shared_count(weak_count const & r); // throws bad_weak_ptr when r.use_count() == 0
 | 
			
		||||
    shared_count( weak_count const & r, sp_nothrow_tag ); // constructs an empty *this when r.use_count() == 0
 | 
			
		||||
 | 
			
		||||
    shared_count & operator= (shared_count const & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
 | 
			
		||||
        if( tmp != pi_ )
 | 
			
		||||
        {
 | 
			
		||||
            if( tmp != 0 ) tmp->add_ref_copy();
 | 
			
		||||
            if( pi_ != 0 ) pi_->release();
 | 
			
		||||
            pi_ = tmp;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(shared_count & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
        r.pi_ = pi_;
 | 
			
		||||
        pi_ = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ != 0? pi_->use_count(): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool unique() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return use_count() == 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool empty() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator==(shared_count const & a, shared_count const & b)
 | 
			
		||||
    {
 | 
			
		||||
        return a.pi_ == b.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator<(shared_count const & a, shared_count const & b)
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()( a.pi_, b.pi_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_deleter( sp_typeinfo const & ti ) const
 | 
			
		||||
    {
 | 
			
		||||
        return pi_? pi_->get_deleter( ti ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_untyped_deleter() const
 | 
			
		||||
    {
 | 
			
		||||
        return pi_? pi_->get_untyped_deleter(): 0;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class weak_count
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base * pi_;
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
    int id_;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    friend class shared_count;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    weak_count(): pi_(0) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count(shared_count const & r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        if(pi_ != 0) pi_->weak_add_ref();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count(weak_count const & r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        if(pi_ != 0) pi_->weak_add_ref();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// Move support
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    weak_count(weak_count && r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        r.pi_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ~weak_count() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if(pi_ != 0) pi_->weak_release();
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        id_ = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count & operator= (shared_count const & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
 | 
			
		||||
        if( tmp != pi_ )
 | 
			
		||||
        {
 | 
			
		||||
            if(tmp != 0) tmp->weak_add_ref();
 | 
			
		||||
            if(pi_ != 0) pi_->weak_release();
 | 
			
		||||
            pi_ = tmp;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count & operator= (weak_count const & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
 | 
			
		||||
        if( tmp != pi_ )
 | 
			
		||||
        {
 | 
			
		||||
            if(tmp != 0) tmp->weak_add_ref();
 | 
			
		||||
            if(pi_ != 0) pi_->weak_release();
 | 
			
		||||
            pi_ = tmp;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(weak_count & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
        r.pi_ = pi_;
 | 
			
		||||
        pi_ = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ != 0? pi_->use_count(): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool empty() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator==(weak_count const & a, weak_count const & b)
 | 
			
		||||
    {
 | 
			
		||||
        return a.pi_ == b.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator<(weak_count const & a, weak_count const & b)
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()(a.pi_, b.pi_);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline shared_count::shared_count( weak_count const & r ): pi_( r.pi_ )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
    if( pi_ == 0 || !pi_->add_ref_lock() )
 | 
			
		||||
    {
 | 
			
		||||
        boost::throw_exception( boost::bad_weak_ptr() );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ): pi_( r.pi_ )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
    if( pi_ != 0 && !pi_->add_ref_lock() )
 | 
			
		||||
    {
 | 
			
		||||
        pi_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
# pragma warn .8027     // Functions containing try are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										182
									
								
								include/boost/smart_ptr/detail/shared_ptr_nmt.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								include/boost/smart_ptr/detail/shared_ptr_nmt.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,182 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/shared_ptr_nmt.hpp - shared_ptr.hpp without member templates
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/throw_exception.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
# include <memory>          // for std::auto_ptr
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <algorithm>        // for std::swap
 | 
			
		||||
#include <functional>       // for std::less
 | 
			
		||||
#include <new>              // for std::bad_alloc
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> class shared_ptr
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    typedef detail::atomic_count count_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
    typedef T value_type;
 | 
			
		||||
 | 
			
		||||
    explicit shared_ptr(T * p = 0): px(p)
 | 
			
		||||
    {
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try  // prevent leak if new throws
 | 
			
		||||
        {
 | 
			
		||||
            pn = new count_type(1);
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_delete(p);
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pn = new count_type(1);
 | 
			
		||||
 | 
			
		||||
        if(pn == 0)
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_delete(p);
 | 
			
		||||
            boost::throw_exception(std::bad_alloc());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~shared_ptr()
 | 
			
		||||
    {
 | 
			
		||||
        if(--*pn == 0)
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_delete(px);
 | 
			
		||||
            delete pn;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_ptr(shared_ptr const & r): px(r.px)  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        pn = r.pn;
 | 
			
		||||
        ++*pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_ptr & operator=(shared_ptr const & r)
 | 
			
		||||
    {
 | 
			
		||||
        shared_ptr(r).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
 | 
			
		||||
    explicit shared_ptr(std::auto_ptr<T> & r)
 | 
			
		||||
    { 
 | 
			
		||||
        pn = new count_type(1); // may throw
 | 
			
		||||
        px = r.release(); // fix: moved here to stop leak if new throws
 | 
			
		||||
    } 
 | 
			
		||||
 | 
			
		||||
    shared_ptr & operator=(std::auto_ptr<T> & r)
 | 
			
		||||
    {
 | 
			
		||||
        shared_ptr(r).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    void reset(T * p = 0)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT(p == 0 || p != px);
 | 
			
		||||
        shared_ptr(p).swap(*this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T & operator*() const  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT(px != 0);
 | 
			
		||||
        return *px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * operator->() const  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT(px != 0);
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * get() const  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        return *pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool unique() const  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        return *pn == 1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    void swap(shared_ptr<T> & other)  // never throws
 | 
			
		||||
    {
 | 
			
		||||
        std::swap(px, other.px);
 | 
			
		||||
        std::swap(pn, other.pn);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    T * px;            // contained pointer
 | 
			
		||||
    count_type * pn;   // ptr to reference counter
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator<(shared_ptr<T> const & a, shared_ptr<T> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return std::less<T*>()(a.get(), b.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void swap(shared_ptr<T> & a, shared_ptr<T> & b)
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// get_pointer() enables boost::mem_fn to recognize shared_ptr
 | 
			
		||||
 | 
			
		||||
template<class T> inline T * get_pointer(shared_ptr<T> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										91
									
								
								include/boost/smart_ptr/detail/sp_convertible.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								include/boost/smart_ptr/detail/sp_convertible.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_convertible.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_NO_SFINAE )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ < 303 )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x630 )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template< class Y, class T > struct sp_convertible
 | 
			
		||||
{
 | 
			
		||||
    typedef char (&yes) [1];
 | 
			
		||||
    typedef char (&no)  [2];
 | 
			
		||||
 | 
			
		||||
    static yes f( T* );
 | 
			
		||||
    static no  f( ... );
 | 
			
		||||
 | 
			
		||||
    enum _vt { value = sizeof( (f)( static_cast<Y*>(0) ) ) == sizeof(yes) };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class Y, class T > struct sp_convertible< Y, T[] >
 | 
			
		||||
{
 | 
			
		||||
    enum _vt { value = false };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class Y, class T > struct sp_convertible< Y[], T[] >
 | 
			
		||||
{
 | 
			
		||||
    enum _vt { value = sp_convertible< Y[1], T[1] >::value };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class Y, std::size_t N, class T > struct sp_convertible< Y[N], T[] >
 | 
			
		||||
{
 | 
			
		||||
    enum _vt { value = sp_convertible< Y[1], T[1] >::value };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct sp_empty
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< bool > struct sp_enable_if_convertible_impl;
 | 
			
		||||
 | 
			
		||||
template<> struct sp_enable_if_convertible_impl<true>
 | 
			
		||||
{
 | 
			
		||||
    typedef sp_empty type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<> struct sp_enable_if_convertible_impl<false>
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class Y, class T > struct sp_enable_if_convertible: public sp_enable_if_convertible_impl< sp_convertible< Y, T >::value >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										79
									
								
								include/boost/smart_ptr/detail/sp_counted_base.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								include/boost/smart_ptr/detail/sp_counted_base.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2005, 2006 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_SP_DISABLE_THREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_SPINLOCK )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_spin.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_PTHREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_pt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __SNC__ )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) && !defined(__PATHSCALE__)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(__HP_aCC) && defined(__ia64)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && defined( __ia64__ ) && !defined( __INTEL_COMPILER ) && !defined(__PATHSCALE__)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __IBMCPP__ ) && defined( __powerpc )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __MWERKS__ ) && defined( __POWERPC__ )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && ( defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc ) ) && !defined(__PATHSCALE__) && !defined( _AIX )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && ( defined( __mips__ ) || defined( _mips ) ) && !defined(__PATHSCALE__)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__) && ( defined( __sparcv9 ) || ( defined( __sparcv8 ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 402 ) ) )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined(__CYGWIN__)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_w32.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( _AIX )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_aix.hpp>
 | 
			
		||||
 | 
			
		||||
#elif !defined( BOOST_HAS_THREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_spin.hpp>
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										151
									
								
								include/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								include/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,151 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_acc_ia64.hpp - aC++ on HP-UX IA64
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2007 Baruch Zilber
 | 
			
		||||
//  Copyright 2007 Boris Gubenko
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <machine/sys/inline.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    _Asm_fetchadd(_FASZ_W, _SEM_REL, pw, +1, _LDHINT_NONE);
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int r = static_cast<int>(_Asm_fetchadd(_FASZ_W, _SEM_REL, pw, -1, _LDHINT_NONE));
 | 
			
		||||
    if (1 == r)
 | 
			
		||||
    {
 | 
			
		||||
        _Asm_mf();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return r - 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int v = *pw;
 | 
			
		||||
    
 | 
			
		||||
    for (;;)
 | 
			
		||||
    {
 | 
			
		||||
        if (0 == v)
 | 
			
		||||
        {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        _Asm_mov_to_ar(_AREG_CCV,
 | 
			
		||||
                       v,
 | 
			
		||||
                       (_UP_CALL_FENCE | _UP_SYS_FENCE | _DOWN_CALL_FENCE | _DOWN_SYS_FENCE));
 | 
			
		||||
        int r = static_cast<int>(_Asm_cmpxchg(_SZ_W, _SEM_ACQ, pw, v + 1, _LDHINT_NONE));
 | 
			
		||||
        if (r == v)
 | 
			
		||||
        {
 | 
			
		||||
            return r + 1;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        v = r;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int use_count_;        // #shared
 | 
			
		||||
    int weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ ); // TODO use ld.acq here
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										143
									
								
								include/boost/smart_ptr/detail/sp_counted_base_aix.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								include/boost/smart_ptr/detail/sp_counted_base_aix.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,143 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_AIX_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_AIX_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_aix.hpp
 | 
			
		||||
//   based on: detail/sp_counted_base_w32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//  Copyright 2006 Michael van der Westhuizen
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <builtins.h>
 | 
			
		||||
#include <sys/atomic_op.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int32_t* pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    fetch_and_add( pw, 1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_decrement( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int32_t originalValue;
 | 
			
		||||
 | 
			
		||||
    __lwsync();
 | 
			
		||||
    originalValue = fetch_and_add( pw, -1 );
 | 
			
		||||
    __isync();
 | 
			
		||||
 | 
			
		||||
    return (originalValue - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_conditional_increment( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int32_t tmp = fetch_and_add( pw, 0 );
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        if( tmp == 0 ) return 0;
 | 
			
		||||
        if( compare_and_swap( pw, &tmp, tmp + 1 ) ) return (tmp + 1);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int32_t use_count_;        // #shared
 | 
			
		||||
    int32_t weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return fetch_and_add( const_cast<int32_t*>(&use_count_), 0 );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_AIX_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										171
									
								
								include/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								include/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,171 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_cw_ppc.hpp - CodeWarrior on PowerPC
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( register long * pw )
 | 
			
		||||
{
 | 
			
		||||
    register int a;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
loop:
 | 
			
		||||
 | 
			
		||||
    lwarx   a, 0, pw
 | 
			
		||||
    addi    a, a, 1
 | 
			
		||||
    stwcx.  a, 0, pw
 | 
			
		||||
    bne-    loop
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline long atomic_decrement( register long * pw )
 | 
			
		||||
{
 | 
			
		||||
    register int a;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
    sync
 | 
			
		||||
 | 
			
		||||
loop:
 | 
			
		||||
 | 
			
		||||
    lwarx   a, 0, pw
 | 
			
		||||
    addi    a, a, -1
 | 
			
		||||
    stwcx.  a, 0, pw
 | 
			
		||||
    bne-    loop
 | 
			
		||||
 | 
			
		||||
    isync
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline long atomic_conditional_increment( register long * pw )
 | 
			
		||||
{
 | 
			
		||||
    register int a;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
loop:
 | 
			
		||||
 | 
			
		||||
    lwarx   a, 0, pw
 | 
			
		||||
    cmpwi   a, 0
 | 
			
		||||
    beq     store
 | 
			
		||||
 | 
			
		||||
    addi    a, a, 1
 | 
			
		||||
 | 
			
		||||
store:
 | 
			
		||||
 | 
			
		||||
    stwcx.  a, 0, pw
 | 
			
		||||
    bne-    loop
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    long use_count_;        // #shared
 | 
			
		||||
    long weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<long const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										159
									
								
								include/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								include/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,159 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_cw_x86.hpp - CodeWarrion on 486+
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//  Copyright 2005 Rene Rivera
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int atomic_exchange_and_add( int * pw, int dv )
 | 
			
		||||
{
 | 
			
		||||
    // int r = *pw;
 | 
			
		||||
    // *pw += dv;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
        mov esi, [pw]
 | 
			
		||||
        mov eax, dv
 | 
			
		||||
        lock xadd dword ptr [esi], eax
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    //atomic_exchange_and_add( pw, 1 );
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
        mov esi, [pw]
 | 
			
		||||
        lock inc dword ptr [esi]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // int rv = *pw;
 | 
			
		||||
    // if( rv != 0 ) ++*pw;
 | 
			
		||||
    // return rv;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
        mov esi, [pw]
 | 
			
		||||
        mov eax, dword ptr [esi]
 | 
			
		||||
    L0:
 | 
			
		||||
        test eax, eax
 | 
			
		||||
        je L1
 | 
			
		||||
        mov ebx, eax
 | 
			
		||||
        inc ebx
 | 
			
		||||
        lock cmpxchg dword ptr [esi], ebx
 | 
			
		||||
        jne L0
 | 
			
		||||
    L1:
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int use_count_;        // #shared
 | 
			
		||||
    int weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &use_count_, -1 ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &weak_count_, -1 ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										158
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_gcc_ia64.hpp - g++ on IA64
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2006 Peter Dimov
 | 
			
		||||
//  Copyright 2005 Ben Hutchings
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    int tmp;
 | 
			
		||||
 | 
			
		||||
    // No barrier is required here but fetchadd always has an acquire or
 | 
			
		||||
    // release barrier associated with it.  We choose release as it should be
 | 
			
		||||
    // cheaper.
 | 
			
		||||
    __asm__ ("fetchadd4.rel %0=%1,1" :
 | 
			
		||||
         "=r"(tmp), "=m"(*pw) :
 | 
			
		||||
         "m"( *pw ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int rv;
 | 
			
		||||
 | 
			
		||||
    __asm__ ("     fetchadd4.rel %0=%1,-1 ;; \n"
 | 
			
		||||
             "     cmp.eq        p7,p0=1,%0 ;; \n"
 | 
			
		||||
             "(p7) ld4.acq       %0=%1    " :
 | 
			
		||||
             "=&r"(rv), "=m"(*pw) :
 | 
			
		||||
             "m"( *pw ) :
 | 
			
		||||
             "p7");
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int rv, tmp, tmp2;
 | 
			
		||||
 | 
			
		||||
    __asm__ ("0:   ld4          %0=%3           ;; \n"
 | 
			
		||||
         "     cmp.eq       p7,p0=0,%0        ;; \n"
 | 
			
		||||
         "(p7) br.cond.spnt 1f                \n"
 | 
			
		||||
         "     mov          ar.ccv=%0         \n"
 | 
			
		||||
         "     add          %1=1,%0           ;; \n"
 | 
			
		||||
         "     cmpxchg4.acq %2=%3,%1,ar.ccv ;; \n"
 | 
			
		||||
         "     cmp.ne       p7,p0=%0,%2       ;; \n"
 | 
			
		||||
         "(p7) br.cond.spnt 0b                \n"
 | 
			
		||||
         "     mov          %0=%1             ;; \n"
 | 
			
		||||
         "1:" : 
 | 
			
		||||
         "=&r"(rv), "=&r"(tmp), "=&r"(tmp2), "=m"(*pw) :
 | 
			
		||||
         "m"( *pw ) :
 | 
			
		||||
         "ar.ccv", "p7");
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int use_count_;        // #shared
 | 
			
		||||
    int weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ ); // TODO use ld.acq here
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										182
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,182 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_gcc_mips.hpp - g++ on MIPS
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2009, Spirent Communications, Inc.
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    int tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        ".set push\n\t"
 | 
			
		||||
        ".set mips2\n\t"
 | 
			
		||||
        "ll %0, %1\n\t"
 | 
			
		||||
        "addiu %0, 1\n\t"
 | 
			
		||||
        "sc %0, %1\n\t"
 | 
			
		||||
        ".set pop\n\t"
 | 
			
		||||
        "beqz %0, 0b":
 | 
			
		||||
        "=&r"( tmp ), "=m"( *pw ):
 | 
			
		||||
        "m"( *pw )
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int rv, tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        ".set push\n\t"
 | 
			
		||||
        ".set mips2\n\t"
 | 
			
		||||
        "ll %1, %2\n\t"
 | 
			
		||||
        "addiu %0, %1, -1\n\t"
 | 
			
		||||
        "sc %0, %2\n\t"
 | 
			
		||||
        ".set pop\n\t"
 | 
			
		||||
        "beqz %0, 0b\n\t"
 | 
			
		||||
        "addiu %0, %1, -1":
 | 
			
		||||
        "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
 | 
			
		||||
        "m"( *pw ):
 | 
			
		||||
        "memory"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int rv, tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        ".set push\n\t"
 | 
			
		||||
        ".set mips2\n\t"
 | 
			
		||||
        "ll %0, %2\n\t"
 | 
			
		||||
        "beqz %0, 1f\n\t"
 | 
			
		||||
        "addiu %1, %0, 1\n\t"
 | 
			
		||||
        "sc %1, %2\n\t"
 | 
			
		||||
        ".set pop\n\t"
 | 
			
		||||
        "beqz %1, 0b\n\t"
 | 
			
		||||
        "addiu %0, %0, 1\n\t"
 | 
			
		||||
        "1:":
 | 
			
		||||
        "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
 | 
			
		||||
        "m"( *pw ):
 | 
			
		||||
        "memory"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int use_count_;        // #shared
 | 
			
		||||
    int weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										182
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,182 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_gcc_ppc.hpp - g++ on PowerPC
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    int tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        "lwarx %1, 0, %2\n\t"
 | 
			
		||||
        "addi %1, %1, 1\n\t"
 | 
			
		||||
        "stwcx. %1, 0, %2\n\t"
 | 
			
		||||
        "bne- 0b":
 | 
			
		||||
 | 
			
		||||
        "=m"( *pw ), "=&b"( tmp ):
 | 
			
		||||
        "r"( pw ), "m"( *pw ):
 | 
			
		||||
        "cc"
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int rv;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "sync\n\t"
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        "lwarx %1, 0, %2\n\t"
 | 
			
		||||
        "addi %1, %1, -1\n\t"
 | 
			
		||||
        "stwcx. %1, 0, %2\n\t"
 | 
			
		||||
        "bne- 0b\n\t"
 | 
			
		||||
        "isync":
 | 
			
		||||
 | 
			
		||||
        "=m"( *pw ), "=&b"( rv ):
 | 
			
		||||
        "r"( pw ), "m"( *pw ):
 | 
			
		||||
        "memory", "cc"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int rv;
 | 
			
		||||
 | 
			
		||||
    __asm__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        "lwarx %1, 0, %2\n\t"
 | 
			
		||||
        "cmpwi %1, 0\n\t"
 | 
			
		||||
        "beq 1f\n\t"
 | 
			
		||||
        "addi %1, %1, 1\n\t"
 | 
			
		||||
        "1:\n\t"
 | 
			
		||||
        "stwcx. %1, 0, %2\n\t"
 | 
			
		||||
        "bne- 0b":
 | 
			
		||||
 | 
			
		||||
        "=m"( *pw ), "=&b"( rv ):
 | 
			
		||||
        "r"( pw ), "m"( *pw ):
 | 
			
		||||
        "cc"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int use_count_;        // #shared
 | 
			
		||||
    int weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										167
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,167 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_counted_base_gcc_sparc.hpp - g++ on Sparc V8+
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2006 Piotr Wyderski
 | 
			
		||||
//  Copyright (c) 2006 Tomas Puverle
 | 
			
		||||
//  Copyright (c) 2006 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Michael van der Westhuizen
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <inttypes.h> // int32_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int32_t compare_and_swap( int32_t * dest_, int32_t compare_, int32_t swap_ )
 | 
			
		||||
{
 | 
			
		||||
    __asm__ __volatile__( "cas [%1], %2, %0"
 | 
			
		||||
                        : "+r" (swap_)
 | 
			
		||||
                        : "r" (dest_), "r" (compare_)
 | 
			
		||||
                        : "memory" );
 | 
			
		||||
 | 
			
		||||
    return swap_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_fetch_and_add( int32_t * pw, int32_t dv )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // *pw += dv;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        int32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
        if( __builtin_expect((compare_and_swap(pw, r, r + dv) == r), 1) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    atomic_fetch_and_add( pw, 1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_decrement( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    return atomic_fetch_and_add( pw, -1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_conditional_increment( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        int32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( __builtin_expect( ( compare_and_swap( pw, r, r + 1 ) == r ), 1 ) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int32_t use_count_;        // #shared
 | 
			
		||||
    int32_t weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return const_cast< int32_t const volatile & >( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										174
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,174 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_gcc_x86.hpp - g++ on 486+ or AMD64
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int atomic_exchange_and_add( int * pw, int dv )
 | 
			
		||||
{
 | 
			
		||||
    // int r = *pw;
 | 
			
		||||
    // *pw += dv;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    int r;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "lock\n\t"
 | 
			
		||||
        "xadd %1, %0":
 | 
			
		||||
        "=m"( *pw ), "=r"( r ): // outputs (%0, %1)
 | 
			
		||||
        "m"( *pw ), "1"( dv ): // inputs (%2, %3 == %1)
 | 
			
		||||
        "memory", "cc" // clobbers
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    //atomic_exchange_and_add( pw, 1 );
 | 
			
		||||
 | 
			
		||||
    __asm__
 | 
			
		||||
    (
 | 
			
		||||
        "lock\n\t"
 | 
			
		||||
        "incl %0":
 | 
			
		||||
        "=m"( *pw ): // output (%0)
 | 
			
		||||
        "m"( *pw ): // input (%1)
 | 
			
		||||
        "cc" // clobbers
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // int rv = *pw;
 | 
			
		||||
    // if( rv != 0 ) ++*pw;
 | 
			
		||||
    // return rv;
 | 
			
		||||
 | 
			
		||||
    int rv, tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__
 | 
			
		||||
    (
 | 
			
		||||
        "movl %0, %%eax\n\t"
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        "test %%eax, %%eax\n\t"
 | 
			
		||||
        "je 1f\n\t"
 | 
			
		||||
        "movl %%eax, %2\n\t"
 | 
			
		||||
        "incl %2\n\t"
 | 
			
		||||
        "lock\n\t"
 | 
			
		||||
        "cmpxchgl %2, %0\n\t"
 | 
			
		||||
        "jne 0b\n\t"
 | 
			
		||||
        "1:":
 | 
			
		||||
        "=m"( *pw ), "=&a"( rv ), "=&r"( tmp ): // outputs (%0, %1, %2)
 | 
			
		||||
        "m"( *pw ): // input (%3)
 | 
			
		||||
        "cc" // clobbers
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int use_count_;        // #shared
 | 
			
		||||
    int weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &use_count_, -1 ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &weak_count_, -1 ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										108
									
								
								include/boost/smart_ptr/detail/sp_counted_base_nt.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								include/boost/smart_ptr/detail/sp_counted_base_nt.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,108 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_nt.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    long use_count_;        // #shared
 | 
			
		||||
    long weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        ++use_count_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        if( use_count_ == 0 ) return false;
 | 
			
		||||
        ++use_count_;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( --use_count_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        ++weak_count_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( --weak_count_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return use_count_;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										136
									
								
								include/boost/smart_ptr/detail/sp_counted_base_pt.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								include/boost/smart_ptr/detail/sp_counted_base_pt.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_pt.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    long use_count_;        // #shared
 | 
			
		||||
    long weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
    mutable pthread_mutex_t m_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
// HPUX 10.20 / DCE has a nonstandard pthread_mutex_init
 | 
			
		||||
 | 
			
		||||
#if defined(__hpux) && defined(_DECTHREADS_)
 | 
			
		||||
        pthread_mutex_init( &m_, pthread_mutexattr_default );
 | 
			
		||||
#else
 | 
			
		||||
        pthread_mutex_init( &m_, 0 );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_destroy( &m_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_lock( &m_ );
 | 
			
		||||
        ++use_count_;
 | 
			
		||||
        pthread_mutex_unlock( &m_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_lock( &m_ );
 | 
			
		||||
        bool r = use_count_ == 0? false: ( ++use_count_, true );
 | 
			
		||||
        pthread_mutex_unlock( &m_ );
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_lock( &m_ );
 | 
			
		||||
        long new_use_count = --use_count_;
 | 
			
		||||
        pthread_mutex_unlock( &m_ );
 | 
			
		||||
 | 
			
		||||
        if( new_use_count == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_lock( &m_ );
 | 
			
		||||
        ++weak_count_;
 | 
			
		||||
        pthread_mutex_unlock( &m_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_lock( &m_ );
 | 
			
		||||
        long new_weak_count = --weak_count_;
 | 
			
		||||
        pthread_mutex_unlock( &m_ );
 | 
			
		||||
 | 
			
		||||
        if( new_weak_count == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_lock( &m_ );
 | 
			
		||||
        long r = use_count_;
 | 
			
		||||
        pthread_mutex_unlock( &m_ );
 | 
			
		||||
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										162
									
								
								include/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								include/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,162 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SNC_PS3_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SNC_PS3_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_counted_base_gcc_sparc.hpp - g++ on Sparc V8+
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2006 Piotr Wyderski
 | 
			
		||||
//  Copyright (c) 2006 Tomas Puverle
 | 
			
		||||
//  Copyright (c) 2006 Peter Dimov
 | 
			
		||||
//  Copyright (c) 2011 Emil Dotchevski
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Michael van der Westhuizen
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <inttypes.h> // uint32_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline uint32_t compare_and_swap( uint32_t * dest_, uint32_t compare_, uint32_t swap_ )
 | 
			
		||||
{
 | 
			
		||||
    return __builtin_cellAtomicCompareAndSwap32(dest_,compare_,swap_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline uint32_t atomic_fetch_and_add( uint32_t * pw, uint32_t dv )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // *pw += dv;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        uint32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
        if( __builtin_expect((compare_and_swap(pw, r, r + dv) == r), 1) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( uint32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    (void) __builtin_cellAtomicIncr32( pw );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline uint32_t atomic_decrement( uint32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    return __builtin_cellAtomicDecr32( pw );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline uint32_t atomic_conditional_increment( uint32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        uint32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( __builtin_expect( ( compare_and_swap( pw, r, r + 1 ) == r ), 1 ) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    uint32_t use_count_;        // #shared
 | 
			
		||||
    uint32_t weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return const_cast< uint32_t const volatile & >( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SNC_PS3_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										114
									
								
								include/boost/smart_ptr/detail/sp_counted_base_solaris.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								include/boost/smart_ptr/detail/sp_counted_base_solaris.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,114 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_solaris.hpp
 | 
			
		||||
//   based on: detail/sp_counted_base_w32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//  Copyright 2006 Michael van der Westhuizen
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <atomic.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    uint32_t use_count_;        // #shared
 | 
			
		||||
    uint32_t weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_inc_32( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        for( ;; )
 | 
			
		||||
        {
 | 
			
		||||
            uint32_t tmp = static_cast< uint32_t const volatile& >( use_count_ );
 | 
			
		||||
            if( tmp == 0 ) return false;
 | 
			
		||||
            if( atomic_cas_32( &use_count_, tmp, tmp + 1 ) == tmp ) return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_dec_32_nv( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_inc_32( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_dec_32_nv( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<long const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										132
									
								
								include/boost/smart_ptr/detail/sp_counted_base_spin.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								include/boost/smart_ptr/detail/sp_counted_base_spin.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,132 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_spin.hpp - spinlock pool atomic emulation
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/spinlock_pool.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int atomic_exchange_and_add( int * pw, int dv )
 | 
			
		||||
{
 | 
			
		||||
    spinlock_pool<1>::scoped_lock lock( pw );
 | 
			
		||||
 | 
			
		||||
    int r = *pw;
 | 
			
		||||
    *pw += dv;
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    spinlock_pool<1>::scoped_lock lock( pw );
 | 
			
		||||
    ++*pw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    spinlock_pool<1>::scoped_lock lock( pw );
 | 
			
		||||
 | 
			
		||||
    int rv = *pw;
 | 
			
		||||
    if( rv != 0 ) ++*pw;
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int use_count_;        // #shared
 | 
			
		||||
    int weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &use_count_, -1 ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &weak_count_, -1 ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        spinlock_pool<1>::scoped_lock lock( &use_count_ );
 | 
			
		||||
        return use_count_;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										156
									
								
								include/boost/smart_ptr/detail/sp_counted_base_sync.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								include/boost/smart_ptr/detail/sp_counted_base_sync.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,156 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_counted_base_sync.hpp - g++ 4.1+ __sync intrinsics
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2007 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
 | 
			
		||||
#if defined( __ia64__ ) && defined( __INTEL_COMPILER )
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if INT_MAX >= 2147483647
 | 
			
		||||
 | 
			
		||||
typedef int sp_int32_t;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
typedef long sp_int32_t;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( sp_int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    __sync_fetch_and_add( pw, 1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline sp_int32_t atomic_decrement( sp_int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    return __sync_fetch_and_add( pw, -1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline sp_int32_t atomic_conditional_increment( sp_int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    sp_int32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        sp_int32_t r2 = __sync_val_compare_and_swap( pw, r, r + 1 );
 | 
			
		||||
 | 
			
		||||
        if( r2 == r )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            r = r2;
 | 
			
		||||
        }
 | 
			
		||||
    }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    sp_int32_t use_count_;        // #shared
 | 
			
		||||
    sp_int32_t weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return const_cast< sp_int32_t const volatile & >( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										151
									
								
								include/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								include/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,151 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_VACPP_PPC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_VACPP_PPC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_vacpp_ppc.hpp - xlC(vacpp) on POWER
 | 
			
		||||
//   based on: detail/sp_counted_base_w32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//  Copyright 2006 Michael van der Westhuizen
 | 
			
		||||
//  Copyright 2012 IBM Corp.
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
extern "builtin" void __lwsync(void);
 | 
			
		||||
extern "builtin" void __isync(void);
 | 
			
		||||
extern "builtin" int __fetch_and_add(volatile int* addr, int val);
 | 
			
		||||
extern "builtin" int __compare_and_swap(volatile int*, int*, int);
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int *pw )
 | 
			
		||||
{
 | 
			
		||||
   // ++*pw;
 | 
			
		||||
   __lwsync();
 | 
			
		||||
   __fetch_and_add(pw, 1);
 | 
			
		||||
   __isync();
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int *pw )
 | 
			
		||||
{
 | 
			
		||||
   // return --*pw;
 | 
			
		||||
   __lwsync();
 | 
			
		||||
   int originalValue = __fetch_and_add(pw, -1);
 | 
			
		||||
   __isync();
 | 
			
		||||
 | 
			
		||||
   return (originalValue - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int *pw )
 | 
			
		||||
{
 | 
			
		||||
   // if( *pw != 0 ) ++*pw;
 | 
			
		||||
   // return *pw;
 | 
			
		||||
 | 
			
		||||
   __lwsync();
 | 
			
		||||
   int v = *const_cast<volatile int*>(pw);
 | 
			
		||||
   for (;;)
 | 
			
		||||
   // loop until state is known
 | 
			
		||||
   {
 | 
			
		||||
      if (v == 0) return 0;
 | 
			
		||||
      if (__compare_and_swap(pw, &v, v + 1))
 | 
			
		||||
      {
 | 
			
		||||
         __isync(); return (v + 1);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int use_count_;        // #shared
 | 
			
		||||
    int weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
    char pad[64] __attribute__((__aligned__(64)));
 | 
			
		||||
            // pad to prevent false sharing
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return *const_cast<volatile int*>(&use_count_); 
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_VACPP_PPC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										131
									
								
								include/boost/smart_ptr/detail/sp_counted_base_w32.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								include/boost/smart_ptr/detail/sp_counted_base_w32.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,131 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_w32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/interlocked.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    long use_count_;        // #shared
 | 
			
		||||
    long weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_INTERLOCKED_INCREMENT( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        for( ;; )
 | 
			
		||||
        {
 | 
			
		||||
            long tmp = static_cast< long const volatile& >( use_count_ );
 | 
			
		||||
            if( tmp == 0 ) return false;
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1200 )
 | 
			
		||||
 | 
			
		||||
            // work around a code generation bug
 | 
			
		||||
 | 
			
		||||
            long tmp2 = tmp + 1;
 | 
			
		||||
            if( BOOST_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp2, tmp ) == tmp2 - 1 ) return true;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
            if( BOOST_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp + 1, tmp ) == tmp ) return true;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( BOOST_INTERLOCKED_DECREMENT( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_INTERLOCKED_INCREMENT( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( BOOST_INTERLOCKED_DECREMENT( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<long const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										254
									
								
								include/boost/smart_ptr/detail/sp_counted_impl.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										254
									
								
								include/boost/smart_ptr/detail/sp_counted_impl.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,254 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_impl.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_STD_ALLOCATOR) && defined(BOOST_SP_USE_QUICK_ALLOCATOR)
 | 
			
		||||
# error BOOST_SP_USE_STD_ALLOCATOR and BOOST_SP_USE_QUICK_ALLOCATOR are incompatible.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_counted_base.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
 | 
			
		||||
#include <boost/smart_ptr/detail/quick_allocator.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_STD_ALLOCATOR)
 | 
			
		||||
#include <memory>           // std::allocator
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <cstddef>          // std::size_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 | 
			
		||||
void sp_scalar_constructor_hook( void * px, std::size_t size, void * pn );
 | 
			
		||||
void sp_scalar_destructor_hook( void * px, std::size_t size, void * pn );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class X> class sp_counted_impl_p: public sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    X * px_;
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_p( sp_counted_impl_p const & );
 | 
			
		||||
    sp_counted_impl_p & operator= ( sp_counted_impl_p const & );
 | 
			
		||||
 | 
			
		||||
    typedef sp_counted_impl_p<X> this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit sp_counted_impl_p( X * px ): px_( px )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_constructor_hook( px, sizeof(X), this );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_destructor_hook( px_, sizeof(X), this );
 | 
			
		||||
#endif
 | 
			
		||||
        boost::checked_delete( px_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( detail::sp_typeinfo const & )
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_untyped_deleter()
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_STD_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
    void * operator new( std::size_t )
 | 
			
		||||
    {
 | 
			
		||||
        return std::allocator<this_type>().allocate( 1, static_cast<this_type *>(0) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator delete( void * p )
 | 
			
		||||
    {
 | 
			
		||||
        std::allocator<this_type>().deallocate( static_cast<this_type *>(p), 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
    void * operator new( std::size_t )
 | 
			
		||||
    {
 | 
			
		||||
        return quick_allocator<this_type>::alloc();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator delete( void * p )
 | 
			
		||||
    {
 | 
			
		||||
        quick_allocator<this_type>::dealloc( p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Borland's Codeguard trips up over the -Vx- option here:
 | 
			
		||||
//
 | 
			
		||||
#ifdef __CODEGUARD__
 | 
			
		||||
# pragma option push -Vx-
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class P, class D> class sp_counted_impl_pd: public sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    P ptr; // copy constructor must not throw
 | 
			
		||||
    D del; // copy constructor must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( sp_counted_impl_pd const & );
 | 
			
		||||
    sp_counted_impl_pd & operator= ( sp_counted_impl_pd const & );
 | 
			
		||||
 | 
			
		||||
    typedef sp_counted_impl_pd<P, D> this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    // pre: d(p) must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( P p, D & d ): ptr( p ), del( d )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( P p ): ptr( p ), del()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        del( ptr );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( detail::sp_typeinfo const & ti )
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID(D)? &reinterpret_cast<char&>( del ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_untyped_deleter()
 | 
			
		||||
    {
 | 
			
		||||
        return &reinterpret_cast<char&>( del );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_STD_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
    void * operator new( std::size_t )
 | 
			
		||||
    {
 | 
			
		||||
        return std::allocator<this_type>().allocate( 1, static_cast<this_type *>(0) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator delete( void * p )
 | 
			
		||||
    {
 | 
			
		||||
        std::allocator<this_type>().deallocate( static_cast<this_type *>(p), 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
    void * operator new( std::size_t )
 | 
			
		||||
    {
 | 
			
		||||
        return quick_allocator<this_type>::alloc();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator delete( void * p )
 | 
			
		||||
    {
 | 
			
		||||
        quick_allocator<this_type>::dealloc( p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class P, class D, class A> class sp_counted_impl_pda: public sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    P p_; // copy constructor must not throw
 | 
			
		||||
    D d_; // copy constructor must not throw
 | 
			
		||||
    A a_; // copy constructor must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( sp_counted_impl_pda const & );
 | 
			
		||||
    sp_counted_impl_pda & operator= ( sp_counted_impl_pda const & );
 | 
			
		||||
 | 
			
		||||
    typedef sp_counted_impl_pda<P, D, A> this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    // pre: d( p ) must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( P p, D & d, A a ): p_( p ), d_( d ), a_( a )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( P p, A a ): p_( p ), d_(), a_( a )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        d_( p_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        typedef typename A::template rebind< this_type >::other A2;
 | 
			
		||||
 | 
			
		||||
        A2 a2( a_ );
 | 
			
		||||
 | 
			
		||||
        this->~this_type();
 | 
			
		||||
        a2.deallocate( this, 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( detail::sp_typeinfo const & ti )
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID( D )? &reinterpret_cast<char&>( d_ ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_untyped_deleter()
 | 
			
		||||
    {
 | 
			
		||||
        return &reinterpret_cast<char&>( d_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef __CODEGUARD__
 | 
			
		||||
# pragma option pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										39
									
								
								include/boost/smart_ptr/detail/sp_forward.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								include/boost/smart_ptr/detail/sp_forward.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_FORWARD_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_FORWARD_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_forward.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2008,2012 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
template< class T > T&& sp_forward( T & t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return static_cast< T&& >( t );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_FORWARD_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										69
									
								
								include/boost/smart_ptr/detail/sp_has_sync.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								include/boost/smart_ptr/detail/sp_has_sync.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/smart_ptr/detail/sp_has_sync.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008, 2009 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  Defines the BOOST_SP_HAS_SYNC macro if the __sync_* intrinsics
 | 
			
		||||
//  are available.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_SP_NO_SYNC
 | 
			
		||||
 | 
			
		||||
#if defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 )
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_HAS_SYNC
 | 
			
		||||
 | 
			
		||||
#elif defined( __IBMCPP__ ) && ( __IBMCPP__ >= 1210 )
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_HAS_SYNC
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 )
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_HAS_SYNC
 | 
			
		||||
 | 
			
		||||
#if defined( __arm__ )  || defined( __armel__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __hppa ) || defined( __hppa__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __m68k__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __sh__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __sparc__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __INTEL_COMPILER ) && !defined( __ia64__ ) && ( __INTEL_COMPILER < 1110 )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__PATHSCALE__) && ((__PATHCC__ == 4) && (__PATHCC_MINOR__ < 9)) 
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SP_NO_SYNC
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										31
									
								
								include/boost/smart_ptr/detail/sp_if_array.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								include/boost/smart_ptr/detail/sp_if_array.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Glen Joseph Fernandes 
 | 
			
		||||
 * glenfe at live dot com
 | 
			
		||||
 *
 | 
			
		||||
 * Distributed under the Boost Software License, 
 | 
			
		||||
 * Version 1.0. (See accompanying file LICENSE_1_0.txt 
 | 
			
		||||
 * or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_IF_ARRAY_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_IF_ARRAY_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
    namespace detail {
 | 
			
		||||
        template<typename T> 
 | 
			
		||||
        struct sp_if_array;
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        struct sp_if_array<T[]> {
 | 
			
		||||
            typedef boost::shared_ptr<T[]> type;
 | 
			
		||||
        };
 | 
			
		||||
        template<typename T>
 | 
			
		||||
        struct sp_if_size_array;
 | 
			
		||||
        template<typename T, std::size_t N>
 | 
			
		||||
        struct sp_if_size_array<T[N]> {
 | 
			
		||||
            typedef boost::shared_ptr<T[N]> type;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										45
									
								
								include/boost/smart_ptr/detail/sp_nullptr_t.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								include/boost/smart_ptr/detail/sp_nullptr_t.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_NULLPTR_T_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_NULLPTR_T_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_nullptr_t.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2013 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined( __clang__ ) && !defined( _LIBCPP_VERSION ) && !defined( BOOST_NO_CXX11_DECLTYPE )
 | 
			
		||||
 | 
			
		||||
    typedef decltype(nullptr) sp_nullptr_t;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef std::nullptr_t sp_nullptr_t;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_NULLPTR_T_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										56
									
								
								include/boost/smart_ptr/detail/spinlock.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								include/boost/smart_ptr/detail/spinlock.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/spinlock.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  struct spinlock
 | 
			
		||||
//  {
 | 
			
		||||
//      void lock();
 | 
			
		||||
//      bool try_lock();
 | 
			
		||||
//      void unlock();
 | 
			
		||||
//
 | 
			
		||||
//      class scoped_lock;
 | 
			
		||||
//  };
 | 
			
		||||
//
 | 
			
		||||
//  #define BOOST_DETAIL_SPINLOCK_INIT <unspecified>
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_SP_USE_PTHREADS )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_pt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_gcc_arm.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_w32.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(BOOST_HAS_PTHREADS)
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_pt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif !defined(BOOST_HAS_THREADS)
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_nt.hpp>
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#  error Unrecognized threading platform
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										120
									
								
								include/boost/smart_ptr/detail/spinlock_gcc_arm.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								include/boost/smart_ptr/detail/spinlock_gcc_arm.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008, 2011 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7S__)
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_ARM_BARRIER "dmb"
 | 
			
		||||
# define BOOST_SP_ARM_HAS_LDREX
 | 
			
		||||
 | 
			
		||||
#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__)
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_ARM_BARRIER "mcr p15, 0, r0, c7, c10, 5"
 | 
			
		||||
# define BOOST_SP_ARM_HAS_LDREX
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_ARM_BARRIER ""
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    int v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        int r;
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_SP_ARM_HAS_LDREX
 | 
			
		||||
 | 
			
		||||
        __asm__ __volatile__(
 | 
			
		||||
            "ldrex %0, [%2]; \n"
 | 
			
		||||
            "cmp %0, %1; \n"
 | 
			
		||||
            "strexne %0, %1, [%2]; \n"
 | 
			
		||||
            BOOST_SP_ARM_BARRIER :
 | 
			
		||||
            "=&r"( r ): // outputs
 | 
			
		||||
            "r"( 1 ), "r"( &v_ ): // inputs
 | 
			
		||||
            "memory", "cc" );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        __asm__ __volatile__(
 | 
			
		||||
            "swp %0, %1, [%2];\n"
 | 
			
		||||
            BOOST_SP_ARM_BARRIER :
 | 
			
		||||
            "=&r"( r ): // outputs
 | 
			
		||||
            "r"( 1 ), "r"( &v_ ): // inputs
 | 
			
		||||
            "memory", "cc" );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        return r == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        for( unsigned k = 0; !try_lock(); ++k )
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::yield( k );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        __asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" );
 | 
			
		||||
        *const_cast< int volatile* >( &v_ ) = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        spinlock & sp_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock( scoped_lock const & );
 | 
			
		||||
        scoped_lock & operator=( scoped_lock const & );
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock( spinlock & sp ): sp_( sp )
 | 
			
		||||
        {
 | 
			
		||||
            sp.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            sp_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_SPINLOCK_INIT {0}
 | 
			
		||||
 | 
			
		||||
#undef BOOST_SP_ARM_BARRIER
 | 
			
		||||
#undef BOOST_SP_ARM_HAS_LDREX
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										89
									
								
								include/boost/smart_ptr/detail/spinlock_nt.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								include/boost/smart_ptr/detail/spinlock_nt.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool locked_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    inline bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        if( locked_ )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            locked_ = true;
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline void lock()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( !locked_ );
 | 
			
		||||
        locked_ = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( locked_ );
 | 
			
		||||
        locked_ = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        spinlock & sp_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock( scoped_lock const & );
 | 
			
		||||
        scoped_lock & operator=( scoped_lock const & );
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock( spinlock & sp ): sp_( sp )
 | 
			
		||||
        {
 | 
			
		||||
            sp.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            sp_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_SPINLOCK_INIT { false }
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										91
									
								
								include/boost/smart_ptr/detail/spinlock_pool.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								include/boost/smart_ptr/detail/spinlock_pool.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/spinlock_pool.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  spinlock_pool<0> is reserved for atomic<>, when/if it arrives
 | 
			
		||||
//  spinlock_pool<1> is reserved for shared_ptr reference counts
 | 
			
		||||
//  spinlock_pool<2> is reserved for shared_ptr atomic access
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/spinlock.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template< int I > class spinlock_pool
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    static spinlock pool_[ 41 ];
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    static spinlock & spinlock_for( void const * pv )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(__VMS) && __INITIAL_POINTER_SIZE == 64  
 | 
			
		||||
        std::size_t i = reinterpret_cast< unsigned long long >( pv ) % 41;
 | 
			
		||||
#else  
 | 
			
		||||
        std::size_t i = reinterpret_cast< std::size_t >( pv ) % 41;
 | 
			
		||||
#endif  
 | 
			
		||||
        return pool_[ i ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        spinlock & sp_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock( scoped_lock const & );
 | 
			
		||||
        scoped_lock & operator=( scoped_lock const & );
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock( void const * pv ): sp_( spinlock_for( pv ) )
 | 
			
		||||
        {
 | 
			
		||||
            sp_.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            sp_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< int I > spinlock spinlock_pool< I >::pool_[ 41 ] =
 | 
			
		||||
{
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										79
									
								
								include/boost/smart_ptr/detail/spinlock_pt.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								include/boost/smart_ptr/detail/spinlock_pt.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    pthread_mutex_t v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        return pthread_mutex_trylock( &v_ ) == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_lock( &v_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_unlock( &v_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        spinlock & sp_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock( scoped_lock const & );
 | 
			
		||||
        scoped_lock & operator=( scoped_lock const & );
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock( spinlock & sp ): sp_( sp )
 | 
			
		||||
        {
 | 
			
		||||
            sp.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            sp_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_SPINLOCK_INIT { PTHREAD_MUTEX_INITIALIZER }
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										87
									
								
								include/boost/smart_ptr/detail/spinlock_sync.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								include/boost/smart_ptr/detail/spinlock_sync.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( __ia64__ ) && defined( __INTEL_COMPILER )
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    int v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        int r = __sync_lock_test_and_set( &v_, 1 );
 | 
			
		||||
        return r == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        for( unsigned k = 0; !try_lock(); ++k )
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::yield( k );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        __sync_lock_release( &v_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        spinlock & sp_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock( scoped_lock const & );
 | 
			
		||||
        scoped_lock & operator=( scoped_lock const & );
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock( spinlock & sp ): sp_( sp )
 | 
			
		||||
        {
 | 
			
		||||
            sp.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            sp_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_SPINLOCK_INIT {0}
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										113
									
								
								include/boost/smart_ptr/detail/spinlock_w32.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								include/boost/smart_ptr/detail/spinlock_w32.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,113 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/interlocked.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
 | 
			
		||||
// BOOST_COMPILER_FENCE
 | 
			
		||||
 | 
			
		||||
#if defined(__INTEL_COMPILER)
 | 
			
		||||
 | 
			
		||||
#define BOOST_COMPILER_FENCE __memory_barrier();
 | 
			
		||||
 | 
			
		||||
#elif defined( _MSC_VER ) && _MSC_VER >= 1310
 | 
			
		||||
 | 
			
		||||
extern "C" void _ReadWriteBarrier();
 | 
			
		||||
#pragma intrinsic( _ReadWriteBarrier )
 | 
			
		||||
 | 
			
		||||
#define BOOST_COMPILER_FENCE _ReadWriteBarrier();
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__)
 | 
			
		||||
 | 
			
		||||
#define BOOST_COMPILER_FENCE __asm__ __volatile__( "" : : : "memory" );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#define BOOST_COMPILER_FENCE
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    long v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        long r = BOOST_INTERLOCKED_EXCHANGE( &v_, 1 );
 | 
			
		||||
 | 
			
		||||
        BOOST_COMPILER_FENCE
 | 
			
		||||
 | 
			
		||||
        return r == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        for( unsigned k = 0; !try_lock(); ++k )
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::yield( k );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_COMPILER_FENCE
 | 
			
		||||
        *const_cast< long volatile* >( &v_ ) = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        spinlock & sp_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock( scoped_lock const & );
 | 
			
		||||
        scoped_lock & operator=( scoped_lock const & );
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock( spinlock & sp ): sp_( sp )
 | 
			
		||||
        {
 | 
			
		||||
            sp.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            sp_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_SPINLOCK_INIT {0}
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										148
									
								
								include/boost/smart_ptr/detail/yield_k.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								include/boost/smart_ptr/detail/yield_k.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,148 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  yield_k.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  void yield( unsigned k );
 | 
			
		||||
//
 | 
			
		||||
//  Typical use:
 | 
			
		||||
//
 | 
			
		||||
//  for( unsigned k = 0; !try_lock(); ++k ) yield( k );
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
// BOOST_SMT_PAUSE
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && _MSC_VER >= 1310 && ( defined(_M_IX86) || defined(_M_X64) )
 | 
			
		||||
 | 
			
		||||
extern "C" void _mm_pause();
 | 
			
		||||
 | 
			
		||||
#define BOOST_SMT_PAUSE _mm_pause();
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
 | 
			
		||||
 | 
			
		||||
#define BOOST_SMT_PAUSE __asm__ __volatile__( "rep; nop" : : : "memory" );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ )
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_USE_WINDOWS_H )
 | 
			
		||||
# include <windows.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_USE_WINDOWS_H )
 | 
			
		||||
  extern "C" void __stdcall Sleep( unsigned long ms );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
inline void yield( unsigned k )
 | 
			
		||||
{
 | 
			
		||||
    if( k < 4 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
#if defined( BOOST_SMT_PAUSE )
 | 
			
		||||
    else if( k < 16 )
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_SMT_PAUSE
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    else if( k < 32 )
 | 
			
		||||
    {
 | 
			
		||||
        Sleep( 0 );
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        Sleep( 1 );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
#include <sched.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void yield( unsigned k )
 | 
			
		||||
{
 | 
			
		||||
    if( k < 4 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
#if defined( BOOST_SMT_PAUSE )
 | 
			
		||||
    else if( k < 16 )
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_SMT_PAUSE
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    else if( k < 32 || k & 1 )
 | 
			
		||||
    {
 | 
			
		||||
        sched_yield();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        // g++ -Wextra warns on {} or {0}
 | 
			
		||||
        struct timespec rqtp = { 0, 0 };
 | 
			
		||||
 | 
			
		||||
        // POSIX says that timespec has tv_sec and tv_nsec
 | 
			
		||||
        // But it doesn't guarantee order or placement
 | 
			
		||||
 | 
			
		||||
        rqtp.tv_sec = 0;
 | 
			
		||||
        rqtp.tv_nsec = 1000;
 | 
			
		||||
 | 
			
		||||
        nanosleep( &rqtp, 0 );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void yield( unsigned )
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										144
									
								
								include/boost/smart_ptr/enable_shared_from_raw.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								include/boost/smart_ptr/enable_shared_from_raw.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,144 @@
 | 
			
		||||
#ifndef BOOST_ENABLE_SHARED_FROM_RAW_HPP_INCLUDED
 | 
			
		||||
#define BOOST_ENABLE_SHARED_FROM_RAW_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  enable_shared_from_raw.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2002, 2009 Peter Dimov
 | 
			
		||||
//  Copyright 2008-2009 Frank Mori Hess
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/weak_ptr.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
template<typename T> boost::shared_ptr<T> shared_from_raw(T *);
 | 
			
		||||
template<typename T> boost::weak_ptr<T> weak_from_raw(T *);
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe );
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
class enable_shared_from_raw
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_raw()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_raw( enable_shared_from_raw const & )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_raw & operator=( enable_shared_from_raw const & )
 | 
			
		||||
    {
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~enable_shared_from_raw()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( shared_this_.use_count() <= 1 ); // make sure no dangling shared_ptr objects exist
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    void init_weak_once() const
 | 
			
		||||
    {
 | 
			
		||||
        if( weak_this_.expired() )
 | 
			
		||||
        {
 | 
			
		||||
            shared_this_.reset( static_cast<void*>(0), detail::esft2_deleter_wrapper() );
 | 
			
		||||
            weak_this_ = shared_this_;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 | 
			
		||||
public:
 | 
			
		||||
#else
 | 
			
		||||
private:
 | 
			
		||||
    template<class Y> friend class shared_ptr;
 | 
			
		||||
    template<typename T> friend boost::shared_ptr<T> shared_from_raw(T *);
 | 
			
		||||
    template<typename T> friend boost::weak_ptr<T> weak_from_raw(T *);
 | 
			
		||||
    template< class X, class Y > friend inline void detail::sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    shared_ptr<void> shared_from_this()
 | 
			
		||||
    {
 | 
			
		||||
        init_weak_once();
 | 
			
		||||
        return shared_ptr<void>( weak_this_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_ptr<const void> shared_from_this() const
 | 
			
		||||
    {
 | 
			
		||||
        init_weak_once();
 | 
			
		||||
        return shared_ptr<const void>( weak_this_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Note: invoked automatically by shared_ptr; do not call
 | 
			
		||||
    template<class X, class Y> void _internal_accept_owner( shared_ptr<X> * ppx, Y * py ) const
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( ppx != 0 );
 | 
			
		||||
 | 
			
		||||
        if( weak_this_.expired() )
 | 
			
		||||
        {
 | 
			
		||||
            weak_this_ = *ppx;
 | 
			
		||||
        }
 | 
			
		||||
        else if( shared_this_.use_count() != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            BOOST_ASSERT( ppx->unique() ); // no weak_ptrs should exist either, but there's no way to check that
 | 
			
		||||
 | 
			
		||||
            detail::esft2_deleter_wrapper * pd = boost::get_deleter<detail::esft2_deleter_wrapper>( shared_this_ );
 | 
			
		||||
            BOOST_ASSERT( pd != 0 );
 | 
			
		||||
 | 
			
		||||
            pd->set_deleter( *ppx );
 | 
			
		||||
 | 
			
		||||
            ppx->reset( shared_this_, ppx->get() );
 | 
			
		||||
            shared_this_.reset();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mutable weak_ptr<void> weak_this_;
 | 
			
		||||
private:
 | 
			
		||||
    mutable shared_ptr<void> shared_this_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
boost::shared_ptr<T> shared_from_raw(T *p)
 | 
			
		||||
{
 | 
			
		||||
    BOOST_ASSERT(p != 0);
 | 
			
		||||
    return boost::shared_ptr<T>(p->enable_shared_from_raw::shared_from_this(), p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
boost::weak_ptr<T> weak_from_raw(T *p)
 | 
			
		||||
{
 | 
			
		||||
    BOOST_ASSERT(p != 0);
 | 
			
		||||
    boost::weak_ptr<T> result;
 | 
			
		||||
    result._internal_aliasing_assign(p->enable_shared_from_raw::weak_this_, p);
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
    template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe )
 | 
			
		||||
    {
 | 
			
		||||
        if( pe != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
} // namepsace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_ENABLE_SHARED_FROM_RAW_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										79
									
								
								include/boost/smart_ptr/enable_shared_from_this.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								include/boost/smart_ptr/enable_shared_from_this.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  enable_shared_from_this.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2002, 2009 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/weak_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> class enable_shared_from_this
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_this() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_this(enable_shared_from_this const &) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_this & operator=(enable_shared_from_this const &) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~enable_shared_from_this() BOOST_NOEXCEPT // ~weak_ptr<T> newer throws, so this call also must not throw
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T> shared_from_this()
 | 
			
		||||
    {
 | 
			
		||||
        shared_ptr<T> p( weak_this_ );
 | 
			
		||||
        BOOST_ASSERT( p.get() == this );
 | 
			
		||||
        return p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T const> shared_from_this() const
 | 
			
		||||
    {
 | 
			
		||||
        shared_ptr<T const> p( weak_this_ );
 | 
			
		||||
        BOOST_ASSERT( p.get() == this );
 | 
			
		||||
        return p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public: // actually private, but avoids compiler template friendship issues
 | 
			
		||||
 | 
			
		||||
    // Note: invoked automatically by shared_ptr; do not call
 | 
			
		||||
    template<class X, class Y> void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const
 | 
			
		||||
    {
 | 
			
		||||
        if( weak_this_.expired() )
 | 
			
		||||
        {
 | 
			
		||||
            weak_this_ = shared_ptr<T>( *ppx, py );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    mutable weak_ptr<T> weak_this_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										324
									
								
								include/boost/smart_ptr/intrusive_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										324
									
								
								include/boost/smart_ptr/intrusive_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,324 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  intrusive_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/intrusive_ptr.html for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_convertible.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/config/no_tr1/functional.hpp>           // for std::less
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
#if !defined(BOOST_NO_IOSFWD)
 | 
			
		||||
#include <iosfwd>               // for std::basic_ostream
 | 
			
		||||
#else
 | 
			
		||||
#include <ostream>
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  intrusive_ptr
 | 
			
		||||
//
 | 
			
		||||
//  A smart pointer that uses intrusive reference counting.
 | 
			
		||||
//
 | 
			
		||||
//  Relies on unqualified calls to
 | 
			
		||||
//  
 | 
			
		||||
//      void intrusive_ptr_add_ref(T * p);
 | 
			
		||||
//      void intrusive_ptr_release(T * p);
 | 
			
		||||
//
 | 
			
		||||
//          (p != 0)
 | 
			
		||||
//
 | 
			
		||||
//  The object is responsible for destroying itself.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
template<class T> class intrusive_ptr
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    typedef intrusive_ptr this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr() BOOST_NOEXCEPT : px( 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr( T * p, bool add_ref = true ): px( p )
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 && add_ref ) intrusive_ptr_add_ref( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
 | 
			
		||||
    template<class U>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr( intrusive_ptr<U> const & rhs, typename boost::detail::sp_enable_if_convertible<U,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr( intrusive_ptr<U> const & rhs )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    : px( rhs.get() )
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 ) intrusive_ptr_add_ref( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr(intrusive_ptr const & rhs): px( rhs.px )
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 ) intrusive_ptr_add_ref( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~intrusive_ptr()
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 ) intrusive_ptr_release( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
 | 
			
		||||
    template<class U> intrusive_ptr & operator=(intrusive_ptr<U> const & rhs)
 | 
			
		||||
    {
 | 
			
		||||
        this_type(rhs).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Move support
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr(intrusive_ptr && rhs) BOOST_NOEXCEPT : px( rhs.px )
 | 
			
		||||
    {
 | 
			
		||||
        rhs.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr & operator=(intrusive_ptr && rhs) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< intrusive_ptr && >( rhs ) ).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr & operator=(intrusive_ptr const & rhs)
 | 
			
		||||
    {
 | 
			
		||||
        this_type(rhs).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr & operator=(T * rhs)
 | 
			
		||||
    {
 | 
			
		||||
        this_type(rhs).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type().swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset( T * rhs )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( rhs ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * get() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T & operator*() const
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
        return *px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * operator->() const
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
 | 
			
		||||
    void swap(intrusive_ptr & rhs) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        T * tmp = px;
 | 
			
		||||
        px = rhs.px;
 | 
			
		||||
        rhs.px = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    T * px;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(intrusive_ptr<T> const & a, U * b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(intrusive_ptr<T> const & a, U * b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(T * a, intrusive_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(T * a, intrusive_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if __GNUC__ == 2 && __GNUC_MINOR__ <= 96
 | 
			
		||||
 | 
			
		||||
// Resolve the ambiguity between our op!= and the one in rel_ops
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( intrusive_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, intrusive_ptr<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( intrusive_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, intrusive_ptr<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator<(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return std::less<T *>()(a.get(), b.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void swap(intrusive_ptr<T> & lhs, intrusive_ptr<T> & rhs)
 | 
			
		||||
{
 | 
			
		||||
    lhs.swap(rhs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mem_fn support
 | 
			
		||||
 | 
			
		||||
template<class T> T * get_pointer(intrusive_ptr<T> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return static_cast<T *>(p.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> const_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return const_cast<T *>(p.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return dynamic_cast<T *>(p.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// operator<<
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_NO_TEMPLATED_IOSTREAMS) || ( defined(__GNUC__) &&  (__GNUC__ < 3) )
 | 
			
		||||
 | 
			
		||||
template<class Y> std::ostream & operator<< (std::ostream & os, intrusive_ptr<Y> const & p)
 | 
			
		||||
{
 | 
			
		||||
    os << p.get();
 | 
			
		||||
    return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
// in STLport's no-iostreams mode no iostream symbols can be used
 | 
			
		||||
#ifndef _STLP_NO_IOSTREAMS
 | 
			
		||||
 | 
			
		||||
# if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, < 1300 && __SGI_STL_PORT)
 | 
			
		||||
// MSVC6 has problems finding std::basic_ostream through the using declaration in namespace _STL
 | 
			
		||||
using std::basic_ostream;
 | 
			
		||||
template<class E, class T, class Y> basic_ostream<E, T> & operator<< (basic_ostream<E, T> & os, intrusive_ptr<Y> const & p)
 | 
			
		||||
# else
 | 
			
		||||
template<class E, class T, class Y> std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, intrusive_ptr<Y> const & p)
 | 
			
		||||
# endif 
 | 
			
		||||
{
 | 
			
		||||
    os << p.get();
 | 
			
		||||
    return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // _STLP_NO_IOSTREAMS
 | 
			
		||||
 | 
			
		||||
#endif // __GNUC__ < 3
 | 
			
		||||
 | 
			
		||||
#endif // !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
// hash_value
 | 
			
		||||
 | 
			
		||||
template< class T > struct hash;
 | 
			
		||||
 | 
			
		||||
template< class T > std::size_t hash_value( boost::intrusive_ptr<T> const & p )
 | 
			
		||||
{
 | 
			
		||||
    return boost::hash< T* >()( p.get() );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										187
									
								
								include/boost/smart_ptr/intrusive_ref_counter.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								include/boost/smart_ptr/intrusive_ref_counter.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,187 @@
 | 
			
		||||
/*
 | 
			
		||||
 *          Copyright Andrey Semashev 2007 - 2013.
 | 
			
		||||
 * Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
 *    (See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
 *          http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 */
 | 
			
		||||
/*!
 | 
			
		||||
 * \file   intrusive_ref_counter.hpp
 | 
			
		||||
 * \author Andrey Semashev
 | 
			
		||||
 * \date   12.03.2009
 | 
			
		||||
 *
 | 
			
		||||
 * This header contains a reference counter class for \c intrusive_ptr.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_SMART_PTR_INTRUSIVE_REF_COUNTER_HPP_INCLUDED_
 | 
			
		||||
#define BOOST_SMART_PTR_INTRUSIVE_REF_COUNTER_HPP_INCLUDED_
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_HAS_PRAGMA_ONCE
 | 
			
		||||
#pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#pragma warning(push)
 | 
			
		||||
// This is a bogus MSVC warning, which is flagged by friend declarations of intrusive_ptr_add_ref and intrusive_ptr_release in intrusive_ref_counter:
 | 
			
		||||
// 'name' : the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
 | 
			
		||||
// Note that there is no inline specifier in the declarations.
 | 
			
		||||
#pragma warning(disable: 4396)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
namespace sp_adl_block {
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * \brief Thread unsafe reference counter policy for \c intrusive_ref_counter
 | 
			
		||||
 *
 | 
			
		||||
 * The policy instructs the \c intrusive_ref_counter base class to implement
 | 
			
		||||
 * a reference counter suitable for single threaded use only. Pointers to the same
 | 
			
		||||
 * object with this kind of reference counter must not be used by different threads.
 | 
			
		||||
 */
 | 
			
		||||
struct thread_unsafe_counter
 | 
			
		||||
{
 | 
			
		||||
    typedef unsigned int type;
 | 
			
		||||
 | 
			
		||||
    static unsigned int load(unsigned int const& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return counter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void increment(unsigned int& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        ++counter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static unsigned int decrement(unsigned int& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return --counter;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * \brief Thread safe reference counter policy for \c intrusive_ref_counter
 | 
			
		||||
 *
 | 
			
		||||
 * The policy instructs the \c intrusive_ref_counter base class to implement
 | 
			
		||||
 * a thread-safe reference counter, if the target platform supports multithreading.
 | 
			
		||||
 */
 | 
			
		||||
struct thread_safe_counter
 | 
			
		||||
{
 | 
			
		||||
    typedef boost::detail::atomic_count type;
 | 
			
		||||
 | 
			
		||||
    static unsigned int load(boost::detail::atomic_count const& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast< unsigned int >(static_cast< long >(counter));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void increment(boost::detail::atomic_count& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        ++counter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static unsigned int decrement(boost::detail::atomic_count& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return --counter;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT = thread_safe_counter >
 | 
			
		||||
class intrusive_ref_counter;
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
void intrusive_ptr_add_ref(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT;
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
void intrusive_ptr_release(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * \brief A reference counter base class
 | 
			
		||||
 *
 | 
			
		||||
 * This base class can be used with user-defined classes to add support
 | 
			
		||||
 * for \c intrusive_ptr. The class contains a reference counter defined by the \c CounterPolicyT.
 | 
			
		||||
 * Upon releasing the last \c intrusive_ptr referencing the object
 | 
			
		||||
 * derived from the \c intrusive_ref_counter class, operator \c delete
 | 
			
		||||
 * is automatically called on the pointer to the object.
 | 
			
		||||
 *
 | 
			
		||||
 * The other template parameter, \c DerivedT, is the user's class that derives from \c intrusive_ref_counter.
 | 
			
		||||
 */
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
class intrusive_ref_counter
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
    //! Reference counter type
 | 
			
		||||
    typedef typename CounterPolicyT::type counter_type;
 | 
			
		||||
    //! Reference counter
 | 
			
		||||
    mutable counter_type m_ref_counter;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    /*!
 | 
			
		||||
     * Default constructor
 | 
			
		||||
     *
 | 
			
		||||
     * \post <tt>use_count() == 0</tt>
 | 
			
		||||
     */
 | 
			
		||||
    intrusive_ref_counter() BOOST_NOEXCEPT : m_ref_counter(0)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
     * Copy constructor
 | 
			
		||||
     *
 | 
			
		||||
     * \post <tt>use_count() == 0</tt>
 | 
			
		||||
     */
 | 
			
		||||
    intrusive_ref_counter(intrusive_ref_counter const&) BOOST_NOEXCEPT : m_ref_counter(0)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
     * Assignment
 | 
			
		||||
     *
 | 
			
		||||
     * \post The reference counter is not modified after assignment
 | 
			
		||||
     */
 | 
			
		||||
    intrusive_ref_counter& operator= (intrusive_ref_counter const&) BOOST_NOEXCEPT { return *this; }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
     * \return The reference counter
 | 
			
		||||
     */
 | 
			
		||||
    unsigned int use_count() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return CounterPolicyT::load(m_ref_counter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    /*!
 | 
			
		||||
     * Destructor
 | 
			
		||||
     */
 | 
			
		||||
    BOOST_DEFAULTED_FUNCTION(~intrusive_ref_counter(), {})
 | 
			
		||||
 | 
			
		||||
    friend void intrusive_ptr_add_ref< DerivedT, CounterPolicyT >(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT;
 | 
			
		||||
    friend void intrusive_ptr_release< DerivedT, CounterPolicyT >(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
inline void intrusive_ptr_add_ref(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    CounterPolicyT::increment(p->m_ref_counter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
inline void intrusive_ptr_release(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    if (CounterPolicyT::decrement(p->m_ref_counter) == 0)
 | 
			
		||||
        delete static_cast< const DerivedT* >(p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace sp_adl_block
 | 
			
		||||
 | 
			
		||||
using sp_adl_block::intrusive_ref_counter;
 | 
			
		||||
using sp_adl_block::thread_unsafe_counter;
 | 
			
		||||
using sp_adl_block::thread_safe_counter;
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#pragma warning(pop)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_SMART_PTR_INTRUSIVE_REF_COUNTER_HPP_INCLUDED_
 | 
			
		||||
							
								
								
									
										22
									
								
								include/boost/smart_ptr/make_shared.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								include/boost/smart_ptr/make_shared.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  make_shared.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2007, 2008, 2012 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/make_shared.html
 | 
			
		||||
//  for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/make_shared_object.hpp>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( BOOST_NO_SFINAE )
 | 
			
		||||
# include <boost/smart_ptr/make_shared_array.hpp>
 | 
			
		||||
# include <boost/smart_ptr/allocate_shared_array.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										247
									
								
								include/boost/smart_ptr/make_shared_array.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								include/boost/smart_ptr/make_shared_array.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,247 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2012 Glen Joseph Fernandes
 | 
			
		||||
 * glenfe at live dot com
 | 
			
		||||
 *
 | 
			
		||||
 * Distributed under the Boost Software License,
 | 
			
		||||
 * Version 1.0. (See accompanying file LICENSE_1_0.txt
 | 
			
		||||
 * or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/array_deleter.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/array_traits.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/make_array_helper.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_if_array.hpp>
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
			
		||||
#include <initializer_list>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    make_shared(std::size_t size) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        std::size_t n1 = size * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::make_array_helper<T2[]> a1(n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
			
		||||
    template<typename T, typename... Args>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    make_shared(std::size_t size, Args&&... args) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        std::size_t n1 = size * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::make_array_helper<T2[]> a1(n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2, boost::detail::sp_forward<Args>(args)...);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T, typename... Args>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    make_shared(Args&&... args) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        enum {
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        boost::detail::make_array_helper<T2[N]> a1(&p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2, boost::detail::sp_forward<Args>(args)...);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    make_shared(const T& list) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        typedef const T2 T3;
 | 
			
		||||
        enum {
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        T3* p3 = 0;
 | 
			
		||||
        boost::detail::make_array_helper<T2[N]> a1(&p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p3 = reinterpret_cast<T3*>(list);
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init_list(p2, p3);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    make_shared(std::size_t size,
 | 
			
		||||
        const typename boost::detail::array_inner<T>::type& list) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        typedef const T2 T3;
 | 
			
		||||
        enum {
 | 
			
		||||
            M = boost::detail::array_total<T1>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        T3* p3 = 0;
 | 
			
		||||
        std::size_t n1 = M * size;
 | 
			
		||||
        boost::detail::make_array_helper<T2[]> a1(n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p3 = reinterpret_cast<T3*>(list);
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->template init_list<M>(p2, p3);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    make_shared(const typename boost::detail::array_inner<T>::type& list) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        typedef const T2 T3;
 | 
			
		||||
        enum {
 | 
			
		||||
            M = boost::detail::array_total<T1>::size,
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        T3* p3 = 0;
 | 
			
		||||
        boost::detail::make_array_helper<T2[N]> a1(&p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p3 = reinterpret_cast<T3*>(list);
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->template init_list<M>(p2, p3);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    make_shared(std::initializer_list<typename boost::detail::array_inner<T>::type> list) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        typedef const T2 T3;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        T3* p3 = 0;
 | 
			
		||||
        std::size_t n1 = list.size() * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::make_array_helper<T2[]> a1(n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p3 = reinterpret_cast<T3*>(list.begin());
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init_list(p2, p3);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    make_shared(std::size_t size,
 | 
			
		||||
        typename boost::detail::array_base<T>::type&& value) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        std::size_t n1 = size * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::make_array_helper<T2[]> a1(n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2, boost::detail::sp_forward<T2>(value));
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    make_shared(typename boost::detail::array_base<T>::type&& value) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        enum {
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        boost::detail::make_array_helper<T2[N]> a1(&p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->init(p2, boost::detail::sp_forward<T2>(value));
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    inline typename boost::detail::sp_if_array<T>::type
 | 
			
		||||
    make_shared_noinit(std::size_t size) {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        std::size_t n1 = size * boost::detail::array_total<T1>::size;
 | 
			
		||||
        boost::detail::make_array_helper<T2[]> a1(n1, &p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[]> d1(n1);
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->noinit(p2);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    inline typename boost::detail::sp_if_size_array<T>::type
 | 
			
		||||
    make_shared_noinit() {
 | 
			
		||||
        typedef typename boost::detail::array_inner<T>::type T1;
 | 
			
		||||
        typedef typename boost::detail::array_base<T1>::type T2;
 | 
			
		||||
        enum {
 | 
			
		||||
            N = boost::detail::array_total<T>::size
 | 
			
		||||
        };
 | 
			
		||||
        T1* p1 = 0;
 | 
			
		||||
        T2* p2 = 0;
 | 
			
		||||
        boost::detail::make_array_helper<T2[N]> a1(&p2);
 | 
			
		||||
        boost::detail::array_deleter<T2[N]> d1;
 | 
			
		||||
        boost::shared_ptr<T> s1(p1, d1, a1);
 | 
			
		||||
        typedef boost::detail::array_deleter<T2[N]>* D2;
 | 
			
		||||
        p1 = reinterpret_cast<T1*>(p2);
 | 
			
		||||
        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
 | 
			
		||||
        d2->noinit(p2);
 | 
			
		||||
        return boost::shared_ptr<T>(s1, p1);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										1032
									
								
								include/boost/smart_ptr/make_shared_object.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1032
									
								
								include/boost/smart_ptr/make_shared_object.hpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										57
									
								
								include/boost/smart_ptr/owner_less.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								include/boost/smart_ptr/owner_less.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_OWNER_LESS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_OWNER_LESS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  owner_less.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Frank Mori Hess
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/smart_ptr.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <functional>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
  template<typename T> class shared_ptr;
 | 
			
		||||
  template<typename T> class weak_ptr;
 | 
			
		||||
 | 
			
		||||
  namespace detail
 | 
			
		||||
  {
 | 
			
		||||
    template<typename T, typename U>
 | 
			
		||||
      struct generic_owner_less : public std::binary_function<T, T, bool>
 | 
			
		||||
    {
 | 
			
		||||
      bool operator()(const T &lhs, const T &rhs) const
 | 
			
		||||
      {
 | 
			
		||||
        return lhs.owner_before(rhs);
 | 
			
		||||
      }
 | 
			
		||||
      bool operator()(const T &lhs, const U &rhs) const
 | 
			
		||||
      {
 | 
			
		||||
        return lhs.owner_before(rhs);
 | 
			
		||||
      }
 | 
			
		||||
      bool operator()(const U &lhs, const T &rhs) const
 | 
			
		||||
      {
 | 
			
		||||
        return lhs.owner_before(rhs);
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
  } // namespace detail
 | 
			
		||||
 | 
			
		||||
  template<typename T> struct owner_less;
 | 
			
		||||
 | 
			
		||||
  template<typename T>
 | 
			
		||||
    struct owner_less<shared_ptr<T> >:
 | 
			
		||||
    public detail::generic_owner_less<shared_ptr<T>, weak_ptr<T> >
 | 
			
		||||
  {};
 | 
			
		||||
 | 
			
		||||
  template<typename T>
 | 
			
		||||
    struct owner_less<weak_ptr<T> >:
 | 
			
		||||
    public detail::generic_owner_less<weak_ptr<T>, shared_ptr<T> >
 | 
			
		||||
  {};
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_OWNER_LESS_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										132
									
								
								include/boost/smart_ptr/scoped_array.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								include/boost/smart_ptr/scoped_array.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,132 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/scoped_array.htm
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cstddef>            // for std::ptrdiff_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// Debug hooks
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 | 
			
		||||
void sp_array_constructor_hook(void * p);
 | 
			
		||||
void sp_array_destructor_hook(void * p);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to
 | 
			
		||||
//  is guaranteed, either on destruction of the scoped_array or via an explicit
 | 
			
		||||
//  reset(). Use shared_array or std::vector if your needs are more complex.
 | 
			
		||||
 | 
			
		||||
template<class T> class scoped_array // noncopyable
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    T * px;
 | 
			
		||||
 | 
			
		||||
    scoped_array(scoped_array const &);
 | 
			
		||||
    scoped_array & operator=(scoped_array const &);
 | 
			
		||||
 | 
			
		||||
    typedef scoped_array<T> this_type;
 | 
			
		||||
 | 
			
		||||
    void operator==( scoped_array const& ) const;
 | 
			
		||||
    void operator!=( scoped_array const& ) const;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    explicit scoped_array( T * p = 0 ) BOOST_NOEXCEPT : px( p )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_array_constructor_hook( px );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~scoped_array() // never throws
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_array_destructor_hook( px );
 | 
			
		||||
#endif
 | 
			
		||||
        boost::checked_array_delete( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset(T * p = 0) // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors
 | 
			
		||||
        this_type(p).swap(*this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T & operator[](std::ptrdiff_t i) const // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
        BOOST_ASSERT( i >= 0 );
 | 
			
		||||
        return px[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * get() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
 | 
			
		||||
    void swap(scoped_array & b) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        T * tmp = b.px;
 | 
			
		||||
        b.px = px;
 | 
			
		||||
        px = tmp;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( scoped_array<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, scoped_array<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( scoped_array<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, scoped_array<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> inline void swap(scoped_array<T> & a, scoped_array<T> & b) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										157
									
								
								include/boost/smart_ptr/scoped_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								include/boost/smart_ptr/scoped_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,157 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/scoped_ptr.htm
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
# include <memory>          // for std::auto_ptr
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// Debug hooks
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 | 
			
		||||
void sp_scalar_constructor_hook(void * p);
 | 
			
		||||
void sp_scalar_destructor_hook(void * p);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  scoped_ptr mimics a built-in pointer except that it guarantees deletion
 | 
			
		||||
//  of the object pointed to, either on destruction of the scoped_ptr or via
 | 
			
		||||
//  an explicit reset(). scoped_ptr is a simple solution for simple needs;
 | 
			
		||||
//  use shared_ptr or std::auto_ptr if your needs are more complex.
 | 
			
		||||
 | 
			
		||||
template<class T> class scoped_ptr // noncopyable
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    T * px;
 | 
			
		||||
 | 
			
		||||
    scoped_ptr(scoped_ptr const &);
 | 
			
		||||
    scoped_ptr & operator=(scoped_ptr const &);
 | 
			
		||||
 | 
			
		||||
    typedef scoped_ptr<T> this_type;
 | 
			
		||||
 | 
			
		||||
    void operator==( scoped_ptr const& ) const;
 | 
			
		||||
    void operator!=( scoped_ptr const& ) const;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    explicit scoped_ptr( T * p = 0 ): px( p ) // never throws
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_constructor_hook( px );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
 | 
			
		||||
    explicit scoped_ptr( std::auto_ptr<T> p ) BOOST_NOEXCEPT : px( p.release() )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_constructor_hook( px );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ~scoped_ptr() // never throws
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_destructor_hook( px );
 | 
			
		||||
#endif
 | 
			
		||||
        boost::checked_delete( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset(T * p = 0) // never throws
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors
 | 
			
		||||
        this_type(p).swap(*this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T & operator*() const // never throws
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
        return *px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * operator->() const // never throws
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * get() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
 | 
			
		||||
    void swap(scoped_ptr & b) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        T * tmp = b.px;
 | 
			
		||||
        b.px = px;
 | 
			
		||||
        px = tmp;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( scoped_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, scoped_ptr<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( scoped_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, scoped_ptr<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> inline void swap(scoped_ptr<T> & a, scoped_ptr<T> & b) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// get_pointer(p) is a generic way to say p.get()
 | 
			
		||||
 | 
			
		||||
template<class T> inline T * get_pointer(scoped_ptr<T> const & p) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										290
									
								
								include/boost/smart_ptr/shared_array.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										290
									
								
								include/boost/smart_ptr/shared_array.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,290 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_SHARED_ARRAY_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_SHARED_ARRAY_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  shared_array.hpp
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2012 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>   // for broken compiler workarounds
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
#include <boost/smart_ptr/detail/shared_array_nmt.hpp>
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#include <memory>             // TR1 cyclic inclusion fix
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/shared_count.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cstddef>            // for std::ptrdiff_t
 | 
			
		||||
#include <algorithm>          // for std::swap
 | 
			
		||||
#include <functional>         // for std::less
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  shared_array
 | 
			
		||||
//
 | 
			
		||||
//  shared_array extends shared_ptr to arrays.
 | 
			
		||||
//  The array pointed to is deleted when the last shared_array pointing to it
 | 
			
		||||
//  is destroyed or reset.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
template<class T> class shared_array
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    // Borland 5.5.1 specific workarounds
 | 
			
		||||
    typedef checked_array_deleter<T> deleter;
 | 
			
		||||
    typedef shared_array<T> this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    shared_array() BOOST_NOEXCEPT : px( 0 ), pn()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    explicit shared_array( Y * p ): px( p ), pn( p, checked_array_deleter<Y>() )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y[], T[] >();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Requirements: D's copy constructor must not throw
 | 
			
		||||
    //
 | 
			
		||||
    // shared_array will release p by calling d(p)
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D> shared_array( Y * p, D d ): px( p ), pn( p, d )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y[], T[] >();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // As above, but with allocator. A's copy constructor shall not throw.
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D, class A> shared_array( Y * p, D d, A a ): px( p ), pn( p, d, a )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y[], T[] >();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
//  generated copy constructor, destructor are fine...
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// ... except in C++0x, move disables the implicit copy
 | 
			
		||||
 | 
			
		||||
    shared_array( shared_array const & r ) BOOST_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_array( shared_array && r ) BOOST_NOEXCEPT : px( r.px ), pn()
 | 
			
		||||
    {
 | 
			
		||||
        pn.swap( r.pn );
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // conversion
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    shared_array( shared_array<Y> const & r, typename boost::detail::sp_enable_if_convertible< Y[], T[] >::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    shared_array( shared_array<Y> const & r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_NOEXCEPT : px( r.px ), pn( r.pn ) // never throws
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y[], T[] >();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // aliasing
 | 
			
		||||
 | 
			
		||||
    template< class Y >
 | 
			
		||||
    shared_array( shared_array<Y> const & r, element_type * p ) BOOST_NOEXCEPT : px( p ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // assignment
 | 
			
		||||
 | 
			
		||||
    shared_array & operator=( shared_array const & r ) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type( r ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1400)
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_array & operator=( shared_array<Y> const & r ) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type( r ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    shared_array & operator=( shared_array && r ) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< shared_array && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_array & operator=( shared_array<Y> && r ) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< shared_array<Y> && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    void reset() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type().swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> void reset( Y * p ) // Y must be complete
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors
 | 
			
		||||
        this_type( p ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D> void reset( Y * p, D d )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( p, d ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D, class A> void reset( Y * p, D d, A a )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( p, d, a ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> void reset( shared_array<Y> const & r, element_type * p )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( r, p ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T & operator[] (std::ptrdiff_t i) const // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT(px != 0);
 | 
			
		||||
        BOOST_ASSERT(i >= 0);
 | 
			
		||||
        return px[i];
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    T * get() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
 | 
			
		||||
    bool unique() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return pn.unique();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return pn.use_count();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(shared_array<T> & other) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        std::swap(px, other.px);
 | 
			
		||||
        pn.swap(other.pn);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * _internal_get_deleter( boost::detail::sp_typeinfo const & ti ) const
 | 
			
		||||
    {
 | 
			
		||||
        return pn.get_deleter( ti );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    template<class Y> friend class shared_array;
 | 
			
		||||
 | 
			
		||||
    T * px;                     // contained pointer
 | 
			
		||||
    detail::shared_count pn;    // reference counter
 | 
			
		||||
 | 
			
		||||
};  // shared_array
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==(shared_array<T> const & a, shared_array<T> const & b) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=(shared_array<T> const & a, shared_array<T> const & b) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( shared_array<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, shared_array<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( shared_array<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, shared_array<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator<(shared_array<T> const & a, shared_array<T> const & b) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return std::less<T*>()(a.get(), b.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void swap(shared_array<T> & a, shared_array<T> & b) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class D, class T > D * get_deleter( shared_array<T> const & p )
 | 
			
		||||
{
 | 
			
		||||
    return static_cast< D * >( p._internal_get_deleter( BOOST_SP_TYPEID(D) ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_SHARED_ARRAY_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										1035
									
								
								include/boost/smart_ptr/shared_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1035
									
								
								include/boost/smart_ptr/shared_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										253
									
								
								include/boost/smart_ptr/weak_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								include/boost/smart_ptr/weak_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,253 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  weak_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/weak_ptr.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <memory> // boost.TR1 include order fix
 | 
			
		||||
#include <boost/smart_ptr/detail/shared_count.hpp>
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> class weak_ptr
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    // Borland 5.5.1 specific workarounds
 | 
			
		||||
    typedef weak_ptr<T> this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef typename boost::detail::sp_element< T >::type element_type;
 | 
			
		||||
 | 
			
		||||
    weak_ptr() BOOST_NOEXCEPT : px(0), pn() // never throws in 1.30+
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
//  generated copy constructor, assignment, destructor are fine...
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// ... except in C++0x, move disables the implicit copy
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr const & r ) BOOST_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_ptr & operator=( weak_ptr const & r ) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        px = r.px;
 | 
			
		||||
        pn = r.pn;
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  The "obvious" converting constructor implementation:
 | 
			
		||||
//
 | 
			
		||||
//  template<class Y>
 | 
			
		||||
//  weak_ptr(weak_ptr<Y> const & r): px(r.px), pn(r.pn) // never throws
 | 
			
		||||
//  {
 | 
			
		||||
//  }
 | 
			
		||||
//
 | 
			
		||||
//  has a serious problem.
 | 
			
		||||
//
 | 
			
		||||
//  r.px may already have been invalidated. The px(r.px)
 | 
			
		||||
//  conversion may require access to *r.px (virtual inheritance).
 | 
			
		||||
//
 | 
			
		||||
//  It is not possible to avoid spurious access violations since
 | 
			
		||||
//  in multithreaded programs r.px may be invalidated at any point.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr<Y> const & r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_NOEXCEPT : px(r.lock().get()), pn(r.pn)
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr<Y> && r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr<Y> && r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_NOEXCEPT : px( r.lock().get() ), pn( static_cast< boost::detail::weak_count && >( r.pn ) )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // for better efficiency in the T == Y case
 | 
			
		||||
    weak_ptr( weak_ptr && r )
 | 
			
		||||
    BOOST_NOEXCEPT : px( r.px ), pn( static_cast< boost::detail::weak_count && >( r.pn ) )
 | 
			
		||||
    {
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // for better efficiency in the T == Y case
 | 
			
		||||
    weak_ptr & operator=( weak_ptr && r ) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< weak_ptr && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    weak_ptr( shared_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    weak_ptr( shared_ptr<Y> const & r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1300)
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    weak_ptr & operator=( weak_ptr<Y> const & r ) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
 | 
			
		||||
        px = r.lock().get();
 | 
			
		||||
        pn = r.pn;
 | 
			
		||||
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    weak_ptr & operator=( weak_ptr<Y> && r ) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< weak_ptr<Y> && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    weak_ptr & operator=( shared_ptr<Y> const & r ) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
 | 
			
		||||
        px = r.px;
 | 
			
		||||
        pn = r.pn;
 | 
			
		||||
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T> lock() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return shared_ptr<T>( *this, boost::detail::sp_nothrow_tag() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return pn.use_count();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool expired() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return pn.use_count() == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool _empty() const // extension, not in std::weak_ptr
 | 
			
		||||
    {
 | 
			
		||||
        return pn.empty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset() BOOST_NOEXCEPT // never throws in 1.30+
 | 
			
		||||
    {
 | 
			
		||||
        this_type().swap(*this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(this_type & other) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        std::swap(px, other.px);
 | 
			
		||||
        pn.swap(other.pn);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<typename Y>
 | 
			
		||||
    void _internal_aliasing_assign(weak_ptr<Y> const & r, element_type * px2)
 | 
			
		||||
    {
 | 
			
		||||
        px = px2;
 | 
			
		||||
        pn = r.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before( weak_ptr<Y> const & rhs ) const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return pn < rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before( shared_ptr<Y> const & rhs ) const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return pn < rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// Tasteless as this may seem, making all members public allows member templates
 | 
			
		||||
// to work in the absence of member template friends. (Matthew Langston)
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    template<class Y> friend class weak_ptr;
 | 
			
		||||
    template<class Y> friend class shared_ptr;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    element_type * px;            // contained pointer
 | 
			
		||||
    boost::detail::weak_count pn; // reference counter
 | 
			
		||||
 | 
			
		||||
};  // weak_ptr
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator<(weak_ptr<T> const & a, weak_ptr<U> const & b) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return a.owner_before( b );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										18
									
								
								include/boost/weak_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								include/boost/weak_ptr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
#ifndef BOOST_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  weak_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/weak_ptr.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/weak_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										15
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="refresh" content="0; URL=smart_ptr.htm">
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
Automatic redirection failed, please go to
 | 
			
		||||
<a href="smart_ptr.htm">smart_ptr.htm</a>.
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
<!--
 | 
			
		||||
	<09> Copyright Beman Dawes, 2001
 | 
			
		||||
	Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
	See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
	http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
-->
 | 
			
		||||
							
								
								
									
										299
									
								
								intrusive_ptr.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										299
									
								
								intrusive_ptr.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,299 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>intrusive_ptr</title>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
	</head>
 | 
			
		||||
	<body text="#000000" bgColor="#ffffff">
 | 
			
		||||
		<h1><A href="../../index.htm"><IMG height="86" alt="boost.png (6897 bytes)" src="../../boost.png" width="277" align="middle"
 | 
			
		||||
					border="0"></A>intrusive_ptr class template</h1>
 | 
			
		||||
		<p>
 | 
			
		||||
			<A href="#Introduction">Introduction</A><br>
 | 
			
		||||
			<A href="#Synopsis">Synopsis</A><br>
 | 
			
		||||
			<A href="#Members">Members</A><br>
 | 
			
		||||
			<A href="#functions">Free Functions</A><br>
 | 
			
		||||
		</p>
 | 
			
		||||
		<h2><a name="Introduction">Introduction</a></h2>
 | 
			
		||||
		<p>The <b>intrusive_ptr</b> class template stores a pointer to an object with an 
 | 
			
		||||
			embedded reference count. Every new <b>intrusive_ptr</b> instance increments 
 | 
			
		||||
			the reference count by using an unqualified call to the function <STRONG>intrusive_ptr_add_ref</STRONG>, 
 | 
			
		||||
			passing it the pointer as an argument. Similarly, when an <STRONG>intrusive_ptr</STRONG>
 | 
			
		||||
			is destroyed, it calls <STRONG>intrusive_ptr_release</STRONG>; this function is 
 | 
			
		||||
			responsible for destroying the object when its reference count drops to zero. 
 | 
			
		||||
			The user is expected to provide suitable definitions of these two functions. On 
 | 
			
		||||
			compilers that support argument-dependent lookup, <STRONG>intrusive_ptr_add_ref</STRONG>
 | 
			
		||||
			and <STRONG>intrusive_ptr_release</STRONG> should be defined in the namespace 
 | 
			
		||||
			that corresponds to their parameter; otherwise, the definitions need to go in 
 | 
			
		||||
			namespace <STRONG>boost</STRONG>. The library provides a helper base class template
 | 
			
		||||
			<STRONG><a href="intrusive_ref_counter.html">intrusive_ref_counter</a></STRONG> which may
 | 
			
		||||
			help adding support for <STRONG>intrusive_ptr</STRONG> to user's types.</p>
 | 
			
		||||
		<p>The class template is parameterized on <b>T</b>, the type of the object pointed 
 | 
			
		||||
			to. <STRONG>intrusive_ptr<T></STRONG> can be implicitly converted to <STRONG>intrusive_ptr<U></STRONG>
 | 
			
		||||
			whenever <STRONG>T*</STRONG> can be implicitly converted to <STRONG>U*</STRONG>.</p>
 | 
			
		||||
		<P>The main reasons to use <STRONG>intrusive_ptr</STRONG> are:</P>
 | 
			
		||||
		<UL>
 | 
			
		||||
			<LI>
 | 
			
		||||
			Some existing frameworks or OSes provide objects with embedded reference 
 | 
			
		||||
			counts;
 | 
			
		||||
			<LI>
 | 
			
		||||
				The memory footprint of <STRONG>intrusive_ptr</STRONG>
 | 
			
		||||
			is the same as the corresponding raw pointer;
 | 
			
		||||
			<LI>
 | 
			
		||||
				<STRONG>intrusive_ptr<T></STRONG> can be constructed from an arbitrary 
 | 
			
		||||
				raw pointer of type <STRONG>T *</STRONG>.</LI></UL>
 | 
			
		||||
		<P>As a general rule, if it isn't obvious whether <STRONG>intrusive_ptr</STRONG> better 
 | 
			
		||||
			fits your needs than <STRONG>shared_ptr</STRONG>, try a <STRONG>shared_ptr</STRONG>-based 
 | 
			
		||||
			design first.</P>
 | 
			
		||||
		<h2><a name="Synopsis">Synopsis</a></h2>
 | 
			
		||||
		<pre>namespace boost {
 | 
			
		||||
 | 
			
		||||
  template<class T> class intrusive_ptr {
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
      typedef T <A href="#element_type" >element_type</A>;
 | 
			
		||||
 | 
			
		||||
      <A href="#constructors" >intrusive_ptr</A>(); // never throws
 | 
			
		||||
      <A href="#constructors" >intrusive_ptr</A>(T * p, bool add_ref = true);
 | 
			
		||||
 | 
			
		||||
      <A href="#constructors" >intrusive_ptr</A>(intrusive_ptr const & r);
 | 
			
		||||
      template<class Y> <A href="#constructors" >intrusive_ptr</A>(intrusive_ptr<Y> const & r);
 | 
			
		||||
 | 
			
		||||
      <A href="#destructor" >~intrusive_ptr</A>();
 | 
			
		||||
 | 
			
		||||
      intrusive_ptr & <A href="#assignment" >operator=</A>(intrusive_ptr const & r);
 | 
			
		||||
      template<class Y> intrusive_ptr & <A href="#assignment" >operator=</A>(intrusive_ptr<Y> const & r);
 | 
			
		||||
      intrusive_ptr & <A href="#assignment" >operator=</A>(T * r);
 | 
			
		||||
 | 
			
		||||
      void <a href="#reset" >reset</a>();
 | 
			
		||||
      void <a href="#reset" >reset</a>(T * r);
 | 
			
		||||
 | 
			
		||||
      T & <A href="#indirection" >operator*</A>() const; // never throws
 | 
			
		||||
      T * <A href="#indirection" >operator-></A>() const; // never throws
 | 
			
		||||
      T * <A href="#get" >get</A>() const; // never throws
 | 
			
		||||
 | 
			
		||||
      operator <A href="#conversions" ><i>unspecified-bool-type</i></A>() const; // never throws
 | 
			
		||||
 | 
			
		||||
      void <A href="#swap" >swap</A>(intrusive_ptr & b); // never throws
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class T, class U>
 | 
			
		||||
    bool <A href="#comparison" >operator==</A>(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T, class U>
 | 
			
		||||
    bool <A href="#comparison" >operator!=</A>(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
    bool <A href="#comparison" >operator==</A>(intrusive_ptr<T> const & a, T * b); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
    bool <A href="#comparison" >operator!=</A>(intrusive_ptr<T> const & a, T * b); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
    bool <A href="#comparison" >operator==</A>(T * a, intrusive_ptr<T> const & b); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
    bool <A href="#comparison" >operator!=</A>(T * a, intrusive_ptr<T> const & b); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T, class U>
 | 
			
		||||
    bool <A href="#comparison" >operator<</A>(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T> void <A href="#free-swap" >swap</A>(intrusive_ptr<T> & a, intrusive_ptr<T> & b); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T> T * <A href="#get_pointer" >get_pointer</A>(intrusive_ptr<T> const & p); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T, class U>
 | 
			
		||||
    intrusive_ptr<T> <A href="#static_pointer_cast" >static_pointer_cast</A>(intrusive_ptr<U> const & r); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T, class U>
 | 
			
		||||
    intrusive_ptr<T> <A href="#const_pointer_cast" >const_pointer_cast</A>(intrusive_ptr<U> const & r); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class T, class U>
 | 
			
		||||
    intrusive_ptr<T> <A href="#dynamic_pointer_cast" >dynamic_pointer_cast</A>(intrusive_ptr<U> const & r); // never throws
 | 
			
		||||
 | 
			
		||||
  template<class E, class T, class Y>
 | 
			
		||||
    std::basic_ostream<E, T> & <A href="#insertion-operator" >operator<<</A> (std::basic_ostream<E, T> & os, intrusive_ptr<Y> const & p);
 | 
			
		||||
 | 
			
		||||
}</pre>
 | 
			
		||||
		<h2><a name="Members">Members</a></h2>
 | 
			
		||||
		<h3><a name="element_type">element_type</a></h3>
 | 
			
		||||
		<pre>typedef T element_type;</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p>Provides the type of the template parameter T.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3><a name="constructors">constructors</a></h3>
 | 
			
		||||
		<pre>intrusive_ptr(); // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Postconditions:</b> <code>get() == 0</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<pre>intrusive_ptr(T * p, bool add_ref = true);</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Effects:</b> <code>if(p != 0 && add_ref) intrusive_ptr_add_ref(p);</code>.</p>
 | 
			
		||||
			<p><b>Postconditions:</b> <code>get() == p</code>.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<pre>intrusive_ptr(intrusive_ptr const & r);
 | 
			
		||||
template<class Y> intrusive_ptr(intrusive_ptr<Y> const & r);</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Effects:</b> <code>if(r.get() != 0) intrusive_ptr_add_ref(r.get());</code>.</p>
 | 
			
		||||
			<p><b>Postconditions:</b> <code>get() == r.get()</code>.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3><a name="destructor">destructor</a></h3>
 | 
			
		||||
		<pre>~intrusive_ptr();</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<P><B>Effects:</B> <code>if(get() != 0) intrusive_ptr_release(get());</code>.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<H3><a name="assignment">assignment</a></H3>
 | 
			
		||||
		<pre>intrusive_ptr & operator=(intrusive_ptr const & r);
 | 
			
		||||
template<class Y> intrusive_ptr & operator=(intrusive_ptr<Y> const & r);
 | 
			
		||||
intrusive_ptr & operator=(T * r);</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<P><B>Effects:</B> Equivalent to <code>intrusive_ptr(r).swap(*this)</code>.</P>
 | 
			
		||||
			<P><B>Returns:</B> <code>*this</code>.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<H3><a name="reset">reset</a></H3>
 | 
			
		||||
		<pre>void reset();</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<P><B>Effects:</B> Equivalent to <code>intrusive_ptr().swap(*this)</code>.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<pre>void reset(T * r);</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<P><B>Effects:</B> Equivalent to <code>intrusive_ptr(r).swap(*this)</code>.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<h3><a name="indirection">indirection</a></h3>
 | 
			
		||||
		<pre>T & operator*() const; // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Requirements:</b> <code>get() != 0</code>.</p>
 | 
			
		||||
			<p><b>Returns:</b> <code>*get()</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<pre>T * operator->() const; // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Requirements:</b> <code>get() != 0</code>.</p>
 | 
			
		||||
			<p><b>Returns:</b> <code>get()</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3><a name="get">get</a></h3>
 | 
			
		||||
		<pre>T * get() const; // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Returns:</b> the stored pointer.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3><a name="conversions">conversions</a></h3>
 | 
			
		||||
		<pre>operator <i>unspecified-bool-type</i> () const; // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Returns:</b> an unspecified value that, when used in boolean contexts, is 
 | 
			
		||||
				equivalent to <code>get() != 0</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
			<P><B>Notes:</B> This conversion operator allows <b>intrusive_ptr</b> objects to be 
 | 
			
		||||
				used in boolean contexts, like <code>if (p && p->valid()) {}</code>. 
 | 
			
		||||
				The actual target type is typically a pointer to a member function, avoiding 
 | 
			
		||||
				many of the implicit conversion pitfalls.</P>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3><a name="swap">swap</a></h3>
 | 
			
		||||
		<pre>void swap(intrusive_ptr & b); // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Effects:</b> Exchanges the contents of the two smart pointers.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h2><a name="functions">Free Functions</a></h2>
 | 
			
		||||
		<h3><a name="comparison">comparison</a></h3>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  bool operator==(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b); // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Returns:</b> <code>a.get() == b.get()</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b); // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Returns:</b> <code>a.get() != b.get()</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  bool operator==(intrusive_ptr<T> const & a, U * b); // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Returns:</b> <code>a.get() == b</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  bool operator!=(intrusive_ptr<T> const & a, U * b); // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Returns:</b> <code>a.get() != b</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  bool operator==(T * a, intrusive_ptr<U> const & b); // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Returns:</b> <code>a == b.get()</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  bool operator!=(T * a, intrusive_ptr<U> const & b); // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Returns:</b> <code>a != b.get()</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  bool operator<(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b); // never throws</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Returns:</b> <code>std::less<T *>()(a.get(), b.get())</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> nothing.</p>
 | 
			
		||||
			<P><B>Notes:</B> Allows <STRONG>intrusive_ptr</STRONG> objects to be used as keys 
 | 
			
		||||
				in associative containers.</P>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3><a name="free-swap">swap</a></h3>
 | 
			
		||||
		<pre>template<class T>
 | 
			
		||||
  void swap(intrusive_ptr<T> & a, intrusive_ptr<T> & b); // never throws</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<P><B>Effects:</B> Equivalent to <code>a.swap(b)</code>.</P>
 | 
			
		||||
			<P><B>Throws:</B> nothing.</P>
 | 
			
		||||
			<P><B>Notes:</B> Matches the interface of <B>std::swap</B>. Provided as an aid to 
 | 
			
		||||
				generic programming.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<h3><a name="get_pointer">get_pointer</a></h3>
 | 
			
		||||
		<pre>template<class T>
 | 
			
		||||
  T * get_pointer(intrusive_ptr<T> const & p); // never throws</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<P><B>Returns:</B> <code>p.get()</code>.</P>
 | 
			
		||||
			<P><B>Throws:</B> nothing.</P>
 | 
			
		||||
			<P><B>Notes:</B> Provided as an aid to generic programming. Used by <A href="../bind/mem_fn.html">
 | 
			
		||||
					mem_fn</A>.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<h3><a name="static_pointer_cast">static_pointer_cast</a></h3>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & r); // never throws</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<P><B>Returns:</B> <code>intrusive_ptr<T>(static_cast<T*>(r.get()))</code>.</P>
 | 
			
		||||
			<P><B>Throws:</B> nothing.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<h3><a name="const_pointer_cast">const_pointer_cast</a></h3>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  intrusive_ptr<T> const_pointer_cast(intrusive_ptr<U> const & r); // never throws</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<P><B>Returns:</B> <code>intrusive_ptr<T>(const_cast<T*>(r.get()))</code>.</P>
 | 
			
		||||
			<P><B>Throws:</B> nothing.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<h3><a name="dynamic_pointer_cast">dynamic_pointer_cast</a></h3>
 | 
			
		||||
		<pre>template<class T, class U>
 | 
			
		||||
  intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U> const & r);</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<P><B>Returns:</B> <code>intrusive_ptr<T>(dynamic_cast<T*>(r.get()))</code>.</P>
 | 
			
		||||
			<P><B>Throws:</B> nothing.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<h3><a name="insertion-operator">operator<<</a></h3>
 | 
			
		||||
		<pre>template<class E, class T, class Y>
 | 
			
		||||
    std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, intrusive_ptr<Y> const & p);</pre>
 | 
			
		||||
		<BLOCKQUOTE>
 | 
			
		||||
			<p><STRONG>Effects:</STRONG> <code>os << p.get();</code>.</p>
 | 
			
		||||
			<P><B>Returns:</B> <code>os</code>.</P>
 | 
			
		||||
		</BLOCKQUOTE>
 | 
			
		||||
		<hr>
 | 
			
		||||
		<p>
 | 
			
		||||
			$Date$</p>
 | 
			
		||||
		<p>
 | 
			
		||||
			<small>Copyright <20> 2003-2005 Peter Dimov. Distributed under the Boost Software License, Version 
 | 
			
		||||
				1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A> or 
 | 
			
		||||
				copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										95
									
								
								intrusive_ref_counter.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								intrusive_ref_counter.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
    <head>
 | 
			
		||||
        <title>intrusive_ref_counter</title>
 | 
			
		||||
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
    </head>
 | 
			
		||||
    <body text="#000000" bgColor="#ffffff">
 | 
			
		||||
        <h1><A href="../../index.htm"><IMG height="86" alt="boost.png (6897 bytes)" src="../../boost.png" width="277" align="middle"
 | 
			
		||||
                    border="0"></A>basic_intrusive_ref_counter class template</h1>
 | 
			
		||||
        <p>
 | 
			
		||||
            <A href="#Introduction">Introduction</A><br>
 | 
			
		||||
            <A href="#Synopsis">Synopsis</A><br>
 | 
			
		||||
            <A href="#Members">Members</A><br>
 | 
			
		||||
        </p>
 | 
			
		||||
        <h2><a name="Introduction">Introduction</a></h2>
 | 
			
		||||
        <p>The <STRONG>intrusive_ref_counter</STRONG> class template implements a reference counter for a derived
 | 
			
		||||
            user's class that is intended to be used with <STRONG><a href="intrusive_ptr.html">intrusive_ptr</a></STRONG>.
 | 
			
		||||
            The base class has associated <STRONG>intrusive_ptr_add_ref</STRONG> and <STRONG>intrusive_ptr_release</STRONG> functions
 | 
			
		||||
            which modify the reference counter as needed and destroy the user's object when the counter drops to zero.</p>
 | 
			
		||||
        <p>The class template is parameterized on <STRONG>DerivedT</STRONG> and <STRONG>CounterPolicyT</STRONG> parameters.
 | 
			
		||||
            The first parameter is the user's class that derives from <STRONG>intrusive_ref_counter</STRONG>. This type
 | 
			
		||||
            is needed in order to destroy the object correctly when there are no references to it left.</p>
 | 
			
		||||
        <p>The second parameter is a policy that defines the nature of the reference counter.
 | 
			
		||||
            Boost.SmartPtr provides two such policies: <STRONG>thread_unsafe_counter</STRONG> and <STRONG>thread_safe_counter</STRONG>. The former
 | 
			
		||||
            instructs the <STRONG>intrusive_ref_counter</STRONG> base class to use a counter only suitable for a single-threaded use.
 | 
			
		||||
            Pointers to a single object that uses this kind of reference counter must not be used in different threads. The latter policy
 | 
			
		||||
            makes the reference counter thread-safe, unless the target platform doesn't support threading. Since in modern systems support for
 | 
			
		||||
            threading is common, the default counter policy is <STRONG>thread_safe_counter</STRONG>.</p>
 | 
			
		||||
        <h2><a name="Synopsis">Synopsis</a></h2>
 | 
			
		||||
        <pre>namespace boost {
 | 
			
		||||
 | 
			
		||||
  struct thread_unsafe_counter;
 | 
			
		||||
  struct thread_safe_counter;
 | 
			
		||||
 | 
			
		||||
  template<class DerivedT, class CounterPolicyT = thread_safe_counter>
 | 
			
		||||
  class intrusive_ref_counter
 | 
			
		||||
  {
 | 
			
		||||
  public:
 | 
			
		||||
      <A href="#constructors" >intrusive_ref_counter</A>() = noexcept;
 | 
			
		||||
      <A href="#constructors" >intrusive_ref_counter</A>(intrusive_ref_counter const & r) = noexcept;
 | 
			
		||||
 | 
			
		||||
      intrusive_ref_counter & <A href="#assignment" >operator=</A>(intrusive_ref_counter const & r) noexcept;
 | 
			
		||||
 | 
			
		||||
      unsigned int <a href="#use_count" >use_count</a>() const noexcept;
 | 
			
		||||
 | 
			
		||||
  protected:
 | 
			
		||||
      <A href="#destructor" >~intrusive_ref_counter</A>() = default;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
}</pre>
 | 
			
		||||
        <h2><a name="Members">Members</a></h2>
 | 
			
		||||
        <h3><a name="constructors">constructors</a></h3>
 | 
			
		||||
        <pre>intrusive_ref_counter();</pre>
 | 
			
		||||
        <blockquote>
 | 
			
		||||
            <p><b>Postconditions:</b> <code>use_count() == 0</code>.</p>
 | 
			
		||||
            <p><b>Throws:</b> nothing.</p>
 | 
			
		||||
            <P><B>Notes:</B> The pointer to the constructed object is expected to be passed to <STRONG>intrusive_ptr</STRONG>
 | 
			
		||||
            constructor, assignment operator or <STRONG>reset()</STRONG> method, which would increment the reference counter.</P>
 | 
			
		||||
        </blockquote>
 | 
			
		||||
        <pre>intrusive_ref_counter(intrusive_ref_counter const &);</pre>
 | 
			
		||||
        <blockquote>
 | 
			
		||||
            <p><b>Postconditions:</b> <code>use_count() == 0</code>.</p>
 | 
			
		||||
            <p><b>Throws:</b> nothing.</p>
 | 
			
		||||
            <P><B>Notes:</B> The pointer to the constructed object is expected to be passed to <STRONG>intrusive_ptr</STRONG>
 | 
			
		||||
            constructor, assignment operator or <STRONG>reset()</STRONG> method, which would increment the reference counter.</P>
 | 
			
		||||
        </blockquote>
 | 
			
		||||
        <h3><a name="destructor">destructor</a></h3>
 | 
			
		||||
        <pre>~intrusive_ref_counter();</pre>
 | 
			
		||||
        <BLOCKQUOTE>
 | 
			
		||||
            <p><b>Throws:</b> nothing.</p>
 | 
			
		||||
            <P><B>Effects:</B> Destroys the counter object.</P>
 | 
			
		||||
            <P><B>Notes:</B> The destructor is protected so that the object can only be destroyed through the <STRONG>DerivedT</STRONG> class.</P>
 | 
			
		||||
        </BLOCKQUOTE>
 | 
			
		||||
        <H3><a name="assignment">assignment</a></H3>
 | 
			
		||||
        <pre>intrusive_ref_counter & operator=(intrusive_ref_counter const & r) noexcept;</pre>
 | 
			
		||||
        <BLOCKQUOTE>
 | 
			
		||||
            <P><B>Effects:</B> Does nothing, reference counter is not modified.</P>
 | 
			
		||||
            <P><B>Returns:</B> <code>*this</code>.</P>
 | 
			
		||||
        </BLOCKQUOTE>
 | 
			
		||||
        <H3><a name="use_count">use_count</a></H3>
 | 
			
		||||
        <pre>unsigned int use_count() const noexcept;</pre>
 | 
			
		||||
        <BLOCKQUOTE>
 | 
			
		||||
            <p><b>Returns:</b> The current value of the reference counter.</p>
 | 
			
		||||
            <p><b>Throws:</b> nothing.</p>
 | 
			
		||||
            <P><B>Notes:</B> The returned value may not be actual in multi-threaded applications.</P>
 | 
			
		||||
        </BLOCKQUOTE>
 | 
			
		||||
        <hr>
 | 
			
		||||
        <p>
 | 
			
		||||
            $Date$</p>
 | 
			
		||||
        <p>
 | 
			
		||||
            <small>Copyright <20> 2013 Andrey Semashev. Distributed under the Boost Software License, Version 
 | 
			
		||||
                1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A> or 
 | 
			
		||||
                copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										119
									
								
								make_shared.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								make_shared.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>make_shared and allocate_shared</title>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
	</head>
 | 
			
		||||
	<body text="#000000" bgColor="#ffffff">
 | 
			
		||||
		<h1><A href="../../index.htm"><IMG height="86" alt="boost.png (6897 bytes)" src="../../boost.png" width="277" align="middle"
 | 
			
		||||
					border="0"></A>make_shared and allocate_shared function templates</h1>
 | 
			
		||||
		<p><A href="#Introduction">Introduction</A><br>
 | 
			
		||||
			<A href="#Synopsis">Synopsis</A><br>
 | 
			
		||||
			<A href="#functions">Free Functions</A><br>
 | 
			
		||||
			<A href="#example">Example</A><br>
 | 
			
		||||
		<h2><a name="Introduction">Introduction</a></h2>
 | 
			
		||||
		<p>Consistent use of <a href="shared_ptr.htm"><code>shared_ptr</code></a>
 | 
			
		||||
			can eliminate the need to use an explicit <code>delete</code>,
 | 
			
		||||
			but alone it provides no support in avoiding explicit <code>new</code>.
 | 
			
		||||
			There have been repeated requests from users for a factory function that creates
 | 
			
		||||
			an object of a given type and returns a <code>shared_ptr</code> to it.
 | 
			
		||||
			Besides convenience and style, such a function is also exception safe and
 | 
			
		||||
			considerably faster because it can use a single allocation for both the object
 | 
			
		||||
			and its corresponding control block, eliminating a significant portion of
 | 
			
		||||
			<code>shared_ptr</code>'s construction overhead.
 | 
			
		||||
			This eliminates one of the major efficiency complaints about <code>shared_ptr</code>.
 | 
			
		||||
		</p>
 | 
			
		||||
		<p>The header file <boost/make_shared.hpp> provides a family of overloaded function templates,
 | 
			
		||||
			<code>make_shared</code> and <code>allocate_shared</code>, to address this need.
 | 
			
		||||
			<code>make_shared</code> uses the global operator <code>new</code> to allocate memory,
 | 
			
		||||
			whereas <code>allocate_shared</code> uses an user-supplied allocator, allowing finer control.</p>
 | 
			
		||||
		<p>
 | 
			
		||||
			The rationale for choosing the name <code>make_shared</code> is that the expression
 | 
			
		||||
			<code>make_shared<Widget>()</code> can be read aloud and conveys the intended meaning.</p>
 | 
			
		||||
		<h2><a name="Synopsis">Synopsis</a></h2>
 | 
			
		||||
		<pre>namespace boost {
 | 
			
		||||
 | 
			
		||||
  template<typename T> class shared_ptr;
 | 
			
		||||
 | 
			
		||||
  template<typename T>
 | 
			
		||||
    shared_ptr<T> <a href="#functions">make_shared</a>();
 | 
			
		||||
 | 
			
		||||
  template<typename T, typename A>
 | 
			
		||||
    shared_ptr<T> <a href="#functions">allocate_shared</a>( A const & );
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )	// C++0x prototypes
 | 
			
		||||
 | 
			
		||||
  template<typename T, typename... Args>
 | 
			
		||||
    shared_ptr<T> <a href="#functions">make_shared</a>( Args && ... args );
 | 
			
		||||
 | 
			
		||||
  template<typename T, typename A, typename... Args>
 | 
			
		||||
    shared_ptr<T> <a href="#functions">allocate_shared</a>( A const & a, Args && ... args );
 | 
			
		||||
 | 
			
		||||
#else // no C++0X support
 | 
			
		||||
 | 
			
		||||
  template<typename T, typename Arg1 >
 | 
			
		||||
    shared_ptr<T> <a href="#functions">make_shared</a>( Arg1 const & arg1 );
 | 
			
		||||
  template<typename T, typename Arg1, typename Arg2 >
 | 
			
		||||
    shared_ptr<T> <a href="#functions">make_shared</a>( Arg1 const & arg1, Arg2 const & arg2 );
 | 
			
		||||
// ...
 | 
			
		||||
  template<typename T, typename Arg1, typename Arg2, ..., typename ArgN >
 | 
			
		||||
    shared_ptr<T> <a href="#functions">make_shared</a>( Arg1 const & arg1, Arg2 const & arg2, ..., ArgN const & argN );
 | 
			
		||||
 | 
			
		||||
  template<typename T, typename A, typename Arg1 >
 | 
			
		||||
    shared_ptr<T> <a href="#functions">allocate_shared</a>( A const & a, Arg1 const & arg1 );
 | 
			
		||||
  template<typename T, typename A, typename Arg1, typename Arg2 >
 | 
			
		||||
    shared_ptr<T> <a href="#functions">allocate_shared</a>( Arg1 const & arg1, Arg2 const & arg2 );
 | 
			
		||||
// ...
 | 
			
		||||
  template<typename T, typename A, typename Arg1, typename Arg2, ..., typename ArgN >
 | 
			
		||||
    shared_ptr<T> <a href="#functions">allocate_shared</a>( A const & a, Arg1 const & arg1, Arg2 const & arg2, ..., ArgN const & argN );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
}</pre>
 | 
			
		||||
		<h2><a name="functions">Free Functions</a></h2>
 | 
			
		||||
		<pre>template<class T, class... Args>
 | 
			
		||||
    shared_ptr<T> make_shared( Args && ... args );
 | 
			
		||||
template<class T, class A, class... Args>
 | 
			
		||||
    shared_ptr<T> allocate_shared( A const & a, Args && ... args );</pre>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p><b>Requires:</b> The expression <code>new( pv ) T( std::forward<Args>(args)... )</code>,
 | 
			
		||||
				where <code>pv</code> is a <code>void*</code> pointing to storage suitable
 | 
			
		||||
				to hold an object of type <code>T</code>,
 | 
			
		||||
				shall be well-formed.  <code>A</code> shall be an <em>Allocator</em>,
 | 
			
		||||
				as described in section 20.1.5 (<stong>Allocator requirements</strong>) of the C++ Standard.
 | 
			
		||||
				The copy constructor and destructor of <code>A</code> shall not throw.</p>
 | 
			
		||||
			<p><b>Effects:</b> Allocates memory suitable for an object of type <code>T</code>
 | 
			
		||||
				and constructs an object in it via the placement new expression <code>new( pv ) T()</code>
 | 
			
		||||
				or <code>new( pv ) T( std::forward<Args>(args)... )</code>.
 | 
			
		||||
				<code>allocate_shared</code> uses a copy of <code>a</code> to allocate memory.
 | 
			
		||||
				If an exception is thrown, has no effect.</p>
 | 
			
		||||
			<p><b>Returns:</b> A <code>shared_ptr</code> instance that stores and owns the address
 | 
			
		||||
				of the newly constructed object of type <code>T</code>.</p>
 | 
			
		||||
			<p><b>Postconditions:</b> <code>get() != 0 && use_count() == 1</code>.</p>
 | 
			
		||||
			<p><b>Throws:</b> <code>bad_alloc</code>, or an exception thrown from <code>A::allocate</code>
 | 
			
		||||
				or the constructor of <code>T</code>.</p>
 | 
			
		||||
			<p><b>Notes:</b> This implementation allocates the memory required for the
 | 
			
		||||
			returned <code>shared_ptr</code> and an object of type <code>T</code> in a single
 | 
			
		||||
			allocation. This provides efficiency equivalent to an intrusive smart pointer.</p>
 | 
			
		||||
			<p>The prototypes shown above are used if your compiler supports rvalue references
 | 
			
		||||
			and variadic templates.  They perfectly forward the <code>args</code> parameters to
 | 
			
		||||
			the constructors of <code>T</code>.</p>
 | 
			
		||||
			<p>Otherwise, the implementation will fall back on
 | 
			
		||||
			forwarding the arguments to the constructors of <code>T</code> as const references.
 | 
			
		||||
			If you need to pass a non-const reference to a constructor of <code>T</code>,
 | 
			
		||||
			you may do so by wrapping the parameter in a call to <code>boost::ref</code>.
 | 
			
		||||
			In addition, you will be
 | 
			
		||||
			limited to a maximum of 9 arguments (not counting the allocator argument of
 | 
			
		||||
			allocate_shared).</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h2><a name="example">Example</a></h2>
 | 
			
		||||
		<pre>boost::shared_ptr<std::string> x = boost::make_shared<std::string>("hello, world!");
 | 
			
		||||
std::cout << *x;</pre>
 | 
			
		||||
		<hr>
 | 
			
		||||
		<p>
 | 
			
		||||
			$Date: 2008-05-19 15:42:39 -0400 (Mon, 19 May 2008) $</p>
 | 
			
		||||
		<p><small>Copyright 2008 Peter Dimov. Copyright 2008 Frank Mori Hess.
 | 
			
		||||
				Distributed under the Boost Software License,
 | 
			
		||||
				Version 1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A>
 | 
			
		||||
				or copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										257
									
								
								make_shared_array.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										257
									
								
								make_shared_array.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,257 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
  <head>
 | 
			
		||||
    <title>make_shared and allocate_shared</title>
 | 
			
		||||
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
  </head>
 | 
			
		||||
  <body text="#000000" bgColor="#ffffff" link="#0000ff" vlink="#0000ff">
 | 
			
		||||
    <h1><IMG height="86" alt="boost.png (6897 bytes)" src="../../boost.png" 
 | 
			
		||||
      width="277" align="middle" border="0">make_shared and allocate_shared 
 | 
			
		||||
      for arrays</h1>
 | 
			
		||||
    <p><A href="#Introduction">Introduction</A><br>
 | 
			
		||||
      <A href="#Synopsis">Synopsis</A><br>
 | 
			
		||||
      <A href="#functions">Free Functions</A><br>
 | 
			
		||||
      <A href="#example">Example</A><br>
 | 
			
		||||
      <A href="#history">History</A><br></p>
 | 
			
		||||
    <h2><a name="Introduction">Introduction</a></h2>
 | 
			
		||||
    <p>Originally the Boost function templates <code>make_shared</code> and 
 | 
			
		||||
      <code>allocate_shared</code> were for efficient allocation of single 
 | 
			
		||||
      objects only. There was a need to have efficient, single, allocation of 
 | 
			
		||||
      arrays. One criticism of <a href="shared_array.htm">shared_array</a> was 
 | 
			
		||||
      always the lack of a <a href="make_shared.html">make_shared</a> utility 
 | 
			
		||||
      which ensures only a single allocation for an array.</p>
 | 
			
		||||
    <p>The header files <boost/smart_ptr/make_shared_array.hpp> and 
 | 
			
		||||
      <boost/smart_ptr/allocate_shared_array.hpp> provide new function 
 | 
			
		||||
      templates, <code>make_shared</code> and <code>allocate_shared</code>, 
 | 
			
		||||
      to address this need. <code>make_shared</code> uses the global 
 | 
			
		||||
      operator <code>new</code> to allocate memory, whereas 
 | 
			
		||||
      <code>allocate_shared</code> uses an user-supplied allocator, 
 | 
			
		||||
      allowing finer control.</p>
 | 
			
		||||
    <h2><a name="Synopsis">Synopsis</a></h2>
 | 
			
		||||
    <pre>namespace boost {
 | 
			
		||||
    template<typename U> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared</a>(size_t size);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared</a>(const A& allocator, size_t size);
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)   
 | 
			
		||||
    template<typename U, typename... Args> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared</a>(size_t size, Args&&... args);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename... Args> // U = T[N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared</a>(Args&&... args);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A, typename... Args> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared</a>(const A& allocator, size_t size, Args&&... args);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A, typename... Args> // U = T[N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared</a>(const A& allocator, Args&&... args);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)    
 | 
			
		||||
    template<typename U, typename... Args> // U = T[N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared</a>(const T (&list)[N]);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename... Args> // U = T[][N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared</a>(size_t size, const T (&list)[N]);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename... Args> // U = T[M][N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared</a>(const T (&list)[N]);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A, typename... Args> // U = T[N]
 | 
			
		||||
    shared_ptr<T[> <a href="#functions">allocate_shared</a>(const A& allocator, const T (&list)[N]);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A, typename... Args> // U = T[][N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared</a>(const A& allocator, size_t size, const T (&list)[N]);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A, typename... Args> // U = T[M][N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared</a>(const A& allocator, const T (&list)[N]);
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
			
		||||
    template<typename U, typename... Args> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared</a>(initializer_list<T> list);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A, typename... Args> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared</a>(const A& allocator, initializer_list<T> list);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)    
 | 
			
		||||
    template<typename U> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared</a>(size_t size, T&& value);
 | 
			
		||||
 | 
			
		||||
    template<typename U> // U = T[N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared</a>(T&& value);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared</a>(const A& allocator, size_t size, T&& value);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A> // U = T[N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared</a>(const A& allocator, T&& value);
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<typename U> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared_noinit</a>(size_t size);
 | 
			
		||||
 | 
			
		||||
    template<typename U> // U = T[N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">make_shared_noinit</a>();
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A> // U = T[]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared_noinit</a>(const A& allocator, size_t size);
 | 
			
		||||
 | 
			
		||||
    template<typename U, typename A> // U = T[N]
 | 
			
		||||
    shared_ptr<U> <a href="#functions">allocate_shared_noinit</a>(const A& allocator);
 | 
			
		||||
}</pre>
 | 
			
		||||
    <h2><a name="functions">Free Functions</a></h2>
 | 
			
		||||
    <pre>template<typename U, typename... Args> // U = T[]
 | 
			
		||||
shared_ptr<U> make_shared(size_t size, Args&&... args);
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A, typename... Args> // U = T[]
 | 
			
		||||
shared_ptr<U> allocate_shared(const A& allocator, size_t size, Args&&... args);</pre> 
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Requires:</b> The expression 
 | 
			
		||||
        <code>new(pointer) T(forward<Args>(args)...)</code>, where 
 | 
			
		||||
        <code>pointer</code> is a <code>void*</code> pointing to storage 
 | 
			
		||||
        suitable to hold an object of type <code>T</code>, shall be 
 | 
			
		||||
        well-formed. <code>A</code> shall be an <em>Allocator</em>, as 
 | 
			
		||||
        described in section 20.1.5 (<strong>Allocator requirements</strong>) 
 | 
			
		||||
        of the C++ Standard.  The copy constructor and destructor of 
 | 
			
		||||
        <code>A</code> shall not throw.</p>
 | 
			
		||||
      <p><b>Effects:</b> Allocates memory suitable for an array of type 
 | 
			
		||||
        <code>T</code> and size <code>size</code> and constructs an array 
 | 
			
		||||
        of objects in it via the placement new expression 
 | 
			
		||||
        <code>new(pointer) T()</code> or 
 | 
			
		||||
        <code>new(pointer) T(args...)</code>.
 | 
			
		||||
        <code>allocate_shared</code> uses a copy of 
 | 
			
		||||
        <code>allocator</code> to allocate memory.  If an exception is thrown, 
 | 
			
		||||
        has no effect.</p>
 | 
			
		||||
      <p><b>Returns:</b> A <code>shared_ptr</code> instance that stores and 
 | 
			
		||||
        owns the address of the newly constructed array of type <code>T</code> 
 | 
			
		||||
        and size <code>size</code>.</p>
 | 
			
		||||
      <p><b>Postconditions:</b> 
 | 
			
		||||
        <code>get() != 0 && use_count() == 1</code>.</p>
 | 
			
		||||
      <p><b>Throws:</b> <code>bad_alloc</code>, or an exception thrown from 
 | 
			
		||||
        <code>A::allocate</code> or the constructor of <code>T</code>.</p>
 | 
			
		||||
      <p><b>Notes:</b> This implementation allocates the memory required for 
 | 
			
		||||
        the returned <code>shared_ptr</code> and an array of type 
 | 
			
		||||
        <code>T</code> of size <code>size</code> in a single allocation. This 
 | 
			
		||||
        provides efficiency to equivalent to an intrusive smart array 
 | 
			
		||||
        pointer.</p>
 | 
			
		||||
      <p>The prototypes shown above are used if your compiler supports r-value
 | 
			
		||||
        references and variadic templates. They perfectly forward the 
 | 
			
		||||
        <code>args</code> parameters to the constructors of 
 | 
			
		||||
        <code>T</code> for each array element.</p>
 | 
			
		||||
      <p>Otherwise, you can use the overloads which take only the array size 
 | 
			
		||||
        (and the allocator in case of <code>allocate_shared</code>) and do not 
 | 
			
		||||
        take any constructor arguments. These overloads invoke the default 
 | 
			
		||||
        constructor of <code>T</code> for each array element.</p>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <pre>template<typename U, typename... Args> // U = T[N]
 | 
			
		||||
shared_ptr<U> make_shared(Args&&... args);
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A, typename... Args> // U = T[N]
 | 
			
		||||
shared_ptr<U> allocate_shared(const A& allocator, Args&&... args);</pre>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Description:</b> These overloads of the utilities above are for a 
 | 
			
		||||
        fixed size array.</p>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <pre>template<typename U, typename... Args> // U = T[]
 | 
			
		||||
shared_ptr<U> make_shared(initializer_list<T> list);
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A, typename... Args> // U = T[]
 | 
			
		||||
shared_ptr<U> allocate_shared(const A& allocator, initializer_list<T> list);</pre>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Description:</b> These overloads initialize the array elements 
 | 
			
		||||
        from the initializer list.</p>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <pre>template<typename U, typename... Args> // U = T[N]
 | 
			
		||||
shared_ptr<U> make_shared(const T (&list)[N]);
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A, typename... Args> // U = T[N]
 | 
			
		||||
shared_ptr<U> allocate_shared(const A& allocator, const T (&list)[N]);</pre>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Description:</b> These overloads of the utilities above are for a 
 | 
			
		||||
        fixed size array.</p>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <pre>template<typename U, typename... Args> // U = T[][N]
 | 
			
		||||
shared_ptr<U> make_shared(size_t size, const T (&list)[N]);
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A, typename... Args> // U = T[][N]
 | 
			
		||||
shared_ptr<U> allocate_shared(const A& allocator, size_t size, const T (&list)[N]);</pre>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Description:</b> These overloads initialize inner array elements 
 | 
			
		||||
        from the initializer list.</p>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <pre>template<typename U, typename... Args> // U = T[M][N]
 | 
			
		||||
shared_ptr<U> make_shared(const T (&list)[N]);
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A, typename... Args> // U = T[M][N]
 | 
			
		||||
shared_ptr<U> allocate_shared(const A& allocator, const T (&list)[N]);</pre>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Description:</b> These overloads of the utilities above are for a 
 | 
			
		||||
        fixed size array.</p>
 | 
			
		||||
    </blockquote>   
 | 
			
		||||
    <pre>template<typename U> // U = T[]
 | 
			
		||||
shared_ptr<U> make_shared(size_t size, T&& value);
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A> // U = T[]
 | 
			
		||||
shared_ptr<U> allocate_shared(const A& allocator, size_t size, T&& value);</pre>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Description:</b> These overloads initialize array elements with  
 | 
			
		||||
        the given value.</p>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <pre>template<typename U> // U = T[N]
 | 
			
		||||
shared_ptr<U> make_shared(T&& value);
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A> // U = T[N]
 | 
			
		||||
shared_ptr<U> allocate_shared(const A& allocator, T&& value);</pre>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Description:</b> These overloads of the utilities above are for a 
 | 
			
		||||
        fixed size array.</p>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <pre>template<typename U> // U = T[]
 | 
			
		||||
shared_ptr<U> make_shared_noinit(size_t size);
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A> // U = T[]
 | 
			
		||||
shared_ptr<U> allocate_shared_noinit(const A& allocator, size_t size);</pre>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Description:</b> These overloads do not perform any value 
 | 
			
		||||
        initialization of elements.</p>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <pre>template<typename U> // U = T[N]
 | 
			
		||||
shared_ptr<U> make_shared_noinit();
 | 
			
		||||
 | 
			
		||||
template<typename U, typename A> // U = T[N]
 | 
			
		||||
shared_ptr<U> allocate_shared_noinit(const A& allocator);</pre>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <p><b>Description:</b> These overloads of the utilities above are for a 
 | 
			
		||||
        fixed size array.</p>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <h2><a name="example">Example</a></h2>
 | 
			
		||||
    <p>An example of each overload of make_shared for arrays:</p>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
    <pre>boost::shared_ptr<int[]> a1 = boost::make_shared<int[]>(size);
 | 
			
		||||
boost::shared_ptr<point[]> a2 = boost::make_shared<point[]>(size, x, y);
 | 
			
		||||
boost::shared_ptr<point[5]> a3 = boost::make_shared<point[5]>(x, y);
 | 
			
		||||
boost::shared_ptr<int[]> a4 = boost::make_shared<int[]>({1, 2, 3});
 | 
			
		||||
boost::shared_ptr<int[3]> a5 = boost::make_shared<int[3]>({1, 2, 3});
 | 
			
		||||
boost::shared_ptr<int[][3]> a6 = boost::make_shared<int[][3]>(size, {1, 2, 3});
 | 
			
		||||
boost::shared_ptr<int[5][3]> a7 = boost::make_shared<int[5][3]>({1, 2, 3});
 | 
			
		||||
boost::shared_ptr<point[]> a8 = boost::make_shared<point[]>(size, {x, y});
 | 
			
		||||
boost::shared_ptr<point[5]> a9 = boost::make_shared<point[5]>({x, y});
 | 
			
		||||
boost::shared_ptr<int[]> a10 = boost::make_shared_noinit<int[]>(size);
 | 
			
		||||
boost::shared_ptr<int[5]> a11 = boost::make_shared_noinit<int[5]>();</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <h2><a name="history">History</a></h2>
 | 
			
		||||
    <p>November 2012. Glen Fernandes contributed implementations of 
 | 
			
		||||
      make_shared and allocate_shared for arrays.</p>
 | 
			
		||||
    <hr>
 | 
			
		||||
    <p>$Date: 2012-10-30 10:12:25 -0800 (Tue, 30 Oct 2012) $</p>
 | 
			
		||||
    <p><small>Copyright 2012 Glen Fernandes. Distributed under the Boost 
 | 
			
		||||
      Software License, Version 1.0. See accompanying file 
 | 
			
		||||
      <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A> or copy at 
 | 
			
		||||
      <A href="http://www.boost.org/LICENSE_1_0.txt">
 | 
			
		||||
      http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								msvcspeed.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								msvcspeed.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 6.0 KiB  | 
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user