mirror of
				https://github.com/boostorg/utility.git
				synced 2025-11-04 02:11:45 +01:00 
			
		
		
		
	Compare commits
	
		
			336 Commits
		
	
	
		
			svn-branch
			...
			boost-1.46
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					3a1ac407c0 | ||
| 
						 | 
					8176af84e1 | ||
| 
						 | 
					71e78a0081 | ||
| 
						 | 
					f7e4b0e399 | ||
| 
						 | 
					b7d4b6edae | ||
| 
						 | 
					fb1d2effef | ||
| 
						 | 
					94b91e8c92 | ||
| 
						 | 
					d7cf3628f7 | ||
| 
						 | 
					a4b8043e68 | ||
| 
						 | 
					b273cd3914 | ||
| 
						 | 
					ca7db1f361 | ||
| 
						 | 
					b4a08fc80e | ||
| 
						 | 
					9da96d9737 | ||
| 
						 | 
					a991936c96 | ||
| 
						 | 
					6239e685a2 | ||
| 
						 | 
					2a7e81e07f | ||
| 
						 | 
					e601fcb9c9 | ||
| 
						 | 
					f29a5db08e | ||
| 
						 | 
					22743ee125 | ||
| 
						 | 
					e3c982287a | ||
| 
						 | 
					13da21e7b1 | ||
| 
						 | 
					82e1111bb8 | ||
| 
						 | 
					b3ffef536d | ||
| 
						 | 
					9339b32178 | ||
| 
						 | 
					3770221507 | ||
| 
						 | 
					e2c98762db | ||
| 
						 | 
					e6cb3a77ee | ||
| 
						 | 
					bbccfbbab4 | ||
| 
						 | 
					8af4250c3c | ||
| 
						 | 
					e30889304c | ||
| 
						 | 
					b4dee80e61 | ||
| 
						 | 
					74a6a693d3 | ||
| 
						 | 
					bf713ad47a | ||
| 
						 | 
					76b17c497b | ||
| 
						 | 
					a47dce770c | ||
| 
						 | 
					dab1e8e522 | ||
| 
						 | 
					3de5974419 | ||
| 
						 | 
					7eb1536590 | ||
| 
						 | 
					583422cda2 | ||
| 
						 | 
					9339431e03 | ||
| 
						 | 
					ee146a02a1 | ||
| 
						 | 
					c131cbd0b2 | ||
| 
						 | 
					f2349baf7d | ||
| 
						 | 
					f8bef7ba95 | ||
| 
						 | 
					e54cbf3053 | ||
| 
						 | 
					8745ca628a | ||
| 
						 | 
					ba61e9d796 | ||
| 
						 | 
					d5291d08b8 | ||
| 
						 | 
					afe74fffbc | ||
| 
						 | 
					61755605af | ||
| 
						 | 
					cd12e322bd | ||
| 
						 | 
					09a0137016 | ||
| 
						 | 
					a1d3ec6c53 | ||
| 
						 | 
					5be3004e6c | ||
| 
						 | 
					d387905150 | ||
| 
						 | 
					b514e40733 | ||
| 
						 | 
					8cb975feb7 | ||
| 
						 | 
					ffe151458e | ||
| 
						 | 
					4003a9f74a | ||
| 
						 | 
					211eb04f33 | ||
| 
						 | 
					e57213b298 | ||
| 
						 | 
					b02677375f | ||
| 
						 | 
					61a6015b5a | ||
| 
						 | 
					51f9adbfa1 | ||
| 
						 | 
					682032a340 | ||
| 
						 | 
					eaaf17a88f | ||
| 
						 | 
					48cfd42123 | ||
| 
						 | 
					76aa5d2f27 | ||
| 
						 | 
					67afd7e315 | ||
| 
						 | 
					75cf20cace | ||
| 
						 | 
					ce67dde4f0 | ||
| 
						 | 
					a69e872a91 | ||
| 
						 | 
					91385ac627 | ||
| 
						 | 
					61e9b93f7c | ||
| 
						 | 
					d97b303777 | ||
| 
						 | 
					e3640e45c2 | ||
| 
						 | 
					3900e8ece4 | ||
| 
						 | 
					e27fc4a853 | ||
| 
						 | 
					b7cd171b2b | ||
| 
						 | 
					f7aa9a8935 | ||
| 
						 | 
					0af1959b30 | ||
| 
						 | 
					5f0cf4f5de | ||
| 
						 | 
					0282c8a141 | ||
| 
						 | 
					b2e6a82adb | ||
| 
						 | 
					6725719bd9 | ||
| 
						 | 
					390372294a | ||
| 
						 | 
					ffbbf38e12 | ||
| 
						 | 
					9e73b2c6ae | ||
| 
						 | 
					97e11b024e | ||
| 
						 | 
					118e473a3d | ||
| 
						 | 
					d4b6193f94 | ||
| 
						 | 
					633832e872 | ||
| 
						 | 
					d420c98a53 | ||
| 
						 | 
					862cb2a4e0 | ||
| 
						 | 
					d153ab4daa | ||
| 
						 | 
					561f83b991 | ||
| 
						 | 
					b012f16ee5 | ||
| 
						 | 
					3d96ab26d4 | ||
| 
						 | 
					8652bf51ec | ||
| 
						 | 
					57124703f9 | ||
| 
						 | 
					53f6d10652 | ||
| 
						 | 
					ebe853ff2f | ||
| 
						 | 
					487a5c1ea5 | ||
| 
						 | 
					9168cb9c61 | ||
| 
						 | 
					e1991374ae | ||
| 
						 | 
					c4338b1ce8 | ||
| 
						 | 
					ddd8a58ae0 | ||
| 
						 | 
					d0ee9a7c28 | ||
| 
						 | 
					10e83b490b | ||
| 
						 | 
					4b24dba257 | ||
| 
						 | 
					28061ba3a8 | ||
| 
						 | 
					5d53e3f837 | ||
| 
						 | 
					e86ce1cb1f | ||
| 
						 | 
					f15c96ffb0 | ||
| 
						 | 
					a487f72329 | ||
| 
						 | 
					9f08ed6de0 | ||
| 
						 | 
					2077d0dace | ||
| 
						 | 
					7f2348269b | ||
| 
						 | 
					6b6e1c3252 | ||
| 
						 | 
					55f303baec | ||
| 
						 | 
					d264005c11 | ||
| 
						 | 
					2cde009bb1 | ||
| 
						 | 
					7bfb7c8a61 | ||
| 
						 | 
					5c42397244 | ||
| 
						 | 
					782c132d99 | ||
| 
						 | 
					36899afa3f | ||
| 
						 | 
					7e3e326faf | ||
| 
						 | 
					7019e18149 | ||
| 
						 | 
					49faf23433 | ||
| 
						 | 
					62836f2928 | ||
| 
						 | 
					1ecf3ceb74 | ||
| 
						 | 
					2aa48414c9 | ||
| 
						 | 
					d215f2176c | ||
| 
						 | 
					c286d62223 | ||
| 
						 | 
					3fd0ea6e75 | ||
| 
						 | 
					b050431638 | ||
| 
						 | 
					b311fcefb2 | ||
| 
						 | 
					899c92420c | ||
| 
						 | 
					64a0e0cb20 | ||
| 
						 | 
					ece6992540 | ||
| 
						 | 
					6098304ea8 | ||
| 
						 | 
					28fff2d821 | ||
| 
						 | 
					0ce3885d59 | ||
| 
						 | 
					1823481d96 | ||
| 
						 | 
					cce5d77d2b | ||
| 
						 | 
					3c5c2bc107 | ||
| 
						 | 
					7a036f6f3a | ||
| 
						 | 
					e632b0fb1f | ||
| 
						 | 
					17bee9d43f | ||
| 
						 | 
					177ee78bbb | ||
| 
						 | 
					f1ec0c4d04 | ||
| 
						 | 
					4a564744fe | ||
| 
						 | 
					492a8ad213 | ||
| 
						 | 
					8827b8ed8b | ||
| 
						 | 
					8849fbc52d | ||
| 
						 | 
					67f3ca090a | ||
| 
						 | 
					8efae71f4a | ||
| 
						 | 
					50bc75a802 | ||
| 
						 | 
					ad0bcf4a00 | ||
| 
						 | 
					f1c86c35c4 | ||
| 
						 | 
					a5b85eda07 | ||
| 
						 | 
					bafe37fdab | ||
| 
						 | 
					be50b95508 | ||
| 
						 | 
					96d573d6ca | ||
| 
						 | 
					9b52e49fda | ||
| 
						 | 
					2412b864d6 | ||
| 
						 | 
					94865eabe6 | ||
| 
						 | 
					50268d1b29 | ||
| 
						 | 
					ad9108c1dc | ||
| 
						 | 
					ab479794f3 | ||
| 
						 | 
					691e4b6c34 | ||
| 
						 | 
					28596e678d | ||
| 
						 | 
					1beca24dd8 | ||
| 
						 | 
					721764937f | ||
| 
						 | 
					a511007d0f | ||
| 
						 | 
					8ce58b1675 | ||
| 
						 | 
					97b8966337 | ||
| 
						 | 
					9ed68b8321 | ||
| 
						 | 
					79bbf71d0d | ||
| 
						 | 
					ac93de7c1b | ||
| 
						 | 
					88099a882f | ||
| 
						 | 
					d731b8e1c5 | ||
| 
						 | 
					ac1567b3fc | ||
| 
						 | 
					c1fd670480 | ||
| 
						 | 
					01274cf6ac | ||
| 
						 | 
					8080673977 | ||
| 
						 | 
					a470b591fb | ||
| 
						 | 
					e1a63495b6 | ||
| 
						 | 
					7300ac83f1 | ||
| 
						 | 
					882d38c2c7 | ||
| 
						 | 
					33041ad664 | ||
| 
						 | 
					6a2aa822f8 | ||
| 
						 | 
					d5554eb6d7 | ||
| 
						 | 
					13bdfb8bbd | ||
| 
						 | 
					74462349c2 | ||
| 
						 | 
					09ab16bfc1 | ||
| 
						 | 
					ec46e40809 | ||
| 
						 | 
					b3a971e7e9 | ||
| 
						 | 
					7ddb559887 | ||
| 
						 | 
					ea8c99b1d5 | ||
| 
						 | 
					56b0846099 | ||
| 
						 | 
					42e0001370 | ||
| 
						 | 
					cd8f85afee | ||
| 
						 | 
					bddd52c4b9 | ||
| 
						 | 
					6aa648d315 | ||
| 
						 | 
					8f03aeac4e | ||
| 
						 | 
					3bb2568fad | ||
| 
						 | 
					01e91a3799 | ||
| 
						 | 
					55f3c351a3 | ||
| 
						 | 
					3f72b10182 | ||
| 
						 | 
					71cb8cb574 | ||
| 
						 | 
					9ff18c2c96 | ||
| 
						 | 
					c950825ef4 | ||
| 
						 | 
					66ca84a45d | ||
| 
						 | 
					d5ea07c737 | ||
| 
						 | 
					06404f7d39 | ||
| 
						 | 
					aa0096bf42 | ||
| 
						 | 
					2d860e2574 | ||
| 
						 | 
					66514f61ff | ||
| 
						 | 
					63cde4d3fd | ||
| 
						 | 
					1950f292df | ||
| 
						 | 
					005c2f3cc8 | ||
| 
						 | 
					09f7aab52d | ||
| 
						 | 
					92a0602190 | ||
| 
						 | 
					30a40f9f76 | ||
| 
						 | 
					c9a3ab1d04 | ||
| 
						 | 
					d9f8bae673 | ||
| 
						 | 
					0782034333 | ||
| 
						 | 
					3c7b409460 | ||
| 
						 | 
					0808883f3c | ||
| 
						 | 
					ee3551e8dc | ||
| 
						 | 
					2f69501e55 | ||
| 
						 | 
					95da2e90de | ||
| 
						 | 
					5b83f641a8 | ||
| 
						 | 
					6dd93ab916 | ||
| 
						 | 
					c730ab4ffb | ||
| 
						 | 
					505d419a1b | ||
| 
						 | 
					d968b5f5b9 | ||
| 
						 | 
					e55610a0d0 | ||
| 
						 | 
					bf968794c9 | ||
| 
						 | 
					ce6e9c6698 | ||
| 
						 | 
					7ac180ed54 | ||
| 
						 | 
					d809d4e832 | ||
| 
						 | 
					271ea9e901 | ||
| 
						 | 
					7cd572a326 | ||
| 
						 | 
					90c56ba2ce | ||
| 
						 | 
					a5439500f5 | ||
| 
						 | 
					c0f0a4f51d | ||
| 
						 | 
					7594e00460 | ||
| 
						 | 
					f66e844ff1 | ||
| 
						 | 
					62e8cc2b36 | ||
| 
						 | 
					30236f8915 | ||
| 
						 | 
					155e787ea3 | ||
| 
						 | 
					1d60d49136 | ||
| 
						 | 
					2dffdac9fe | ||
| 
						 | 
					ddf00eb29d | ||
| 
						 | 
					0a6acd8ce8 | ||
| 
						 | 
					745322e797 | ||
| 
						 | 
					9f10fc03ce | ||
| 
						 | 
					84fbb3c896 | ||
| 
						 | 
					865c707756 | ||
| 
						 | 
					871f3a6779 | ||
| 
						 | 
					aaca5ca871 | ||
| 
						 | 
					5a4e19989f | ||
| 
						 | 
					6ea398c446 | ||
| 
						 | 
					1bd83d43e8 | ||
| 
						 | 
					5ca5b4102b | ||
| 
						 | 
					aca7699046 | ||
| 
						 | 
					e702a944ca | ||
| 
						 | 
					a157c345ee | ||
| 
						 | 
					dcb2dd4736 | ||
| 
						 | 
					ae19cd6236 | ||
| 
						 | 
					3ab4d38931 | ||
| 
						 | 
					18c7fb72b5 | ||
| 
						 | 
					6bb092a9b1 | ||
| 
						 | 
					f721b8b28c | ||
| 
						 | 
					e5ba34472d | ||
| 
						 | 
					082ae17eaf | ||
| 
						 | 
					dd86e09ab4 | ||
| 
						 | 
					baff23116e | ||
| 
						 | 
					e549baf93a | ||
| 
						 | 
					30d46adcb7 | ||
| 
						 | 
					e854726be0 | ||
| 
						 | 
					d198bd9d96 | ||
| 
						 | 
					5eb23cecd0 | ||
| 
						 | 
					eff2c75bba | ||
| 
						 | 
					325bd73df7 | ||
| 
						 | 
					0fcc554abd | ||
| 
						 | 
					b685784155 | ||
| 
						 | 
					ac90fdc611 | ||
| 
						 | 
					51077e49f5 | ||
| 
						 | 
					0c3199f72d | ||
| 
						 | 
					62675a3bcd | ||
| 
						 | 
					c26dbaa620 | ||
| 
						 | 
					8201624959 | ||
| 
						 | 
					f2116413d6 | ||
| 
						 | 
					b0baebeb0a | ||
| 
						 | 
					fb943b77d5 | ||
| 
						 | 
					b4b39510fc | ||
| 
						 | 
					6f0f05ba12 | ||
| 
						 | 
					f0b64b6229 | ||
| 
						 | 
					4229488989 | ||
| 
						 | 
					acd2e6ef2b | ||
| 
						 | 
					c26aaed71f | ||
| 
						 | 
					326d7ad4d7 | ||
| 
						 | 
					c76a2f4aab | ||
| 
						 | 
					d8b0ff2d7e | ||
| 
						 | 
					996ce2d307 | ||
| 
						 | 
					167fa4154f | ||
| 
						 | 
					0c7e7c3c39 | ||
| 
						 | 
					9d8f8f41dc | ||
| 
						 | 
					39c4445b39 | ||
| 
						 | 
					7819b022ad | ||
| 
						 | 
					65d27e7f86 | ||
| 
						 | 
					212a70bf77 | ||
| 
						 | 
					6b5dc18a46 | ||
| 
						 | 
					0917f83b9c | ||
| 
						 | 
					7322bd3903 | ||
| 
						 | 
					e998010184 | ||
| 
						 | 
					918a1c93e4 | ||
| 
						 | 
					14c87853c2 | ||
| 
						 | 
					d5a5b84a40 | ||
| 
						 | 
					35d3c03d19 | ||
| 
						 | 
					8933fbb254 | ||
| 
						 | 
					c320330cd5 | ||
| 
						 | 
					822b46a3df | ||
| 
						 | 
					a821ef6e2c | ||
| 
						 | 
					491db15997 | ||
| 
						 | 
					b6c826a139 | ||
| 
						 | 
					7b472a05ee | ||
| 
						 | 
					9a07bc0d9b | ||
| 
						 | 
					154d6bb198 | ||
| 
						 | 
					0dde936e61 | ||
| 
						 | 
					918bf25039 | ||
| 
						 | 
					04fda4fb4e | ||
| 
						 | 
					e14a250d6e | 
							
								
								
									
										199
									
								
								Assignable.html
									
									
									
									
									
								
							
							
						
						
									
										199
									
								
								Assignable.html
									
									
									
									
									
								
							@@ -1,116 +1,109 @@
 | 
			
		||||
<HTML>
 | 
			
		||||
<!--
 | 
			
		||||
  -- Copyright (c) Jeremy Siek 2000
 | 
			
		||||
  --
 | 
			
		||||
  -- Permission to use, copy, modify, distribute and sell this software
 | 
			
		||||
  -- and its documentation for any purpose is hereby granted without fee,
 | 
			
		||||
  -- provided that the above copyright notice appears in all copies and
 | 
			
		||||
  -- that both that copyright notice and this permission notice appear
 | 
			
		||||
  -- in supporting documentation.  Silicon Graphics makes no
 | 
			
		||||
  -- representations about the suitability of this software for any
 | 
			
		||||
  -- purpose.  It is provided "as is" without express or implied warranty.
 | 
			
		||||
  -->
 | 
			
		||||
<Head>
 | 
			
		||||
<Title>Assignable</Title>
 | 
			
		||||
</HEAD>
 | 
			
		||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" 
 | 
			
		||||
        ALINK="#ff0000"> 
 | 
			
		||||
<IMG SRC="../../c++boost.gif" 
 | 
			
		||||
     ALT="C++ Boost" width="277" height="86"> 
 | 
			
		||||
<!--end header-->
 | 
			
		||||
<BR Clear>
 | 
			
		||||
<H1>Assignable</H1>
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
 | 
			
		||||
<h3>Description</h3>
 | 
			
		||||
A type is Assignable if it is possible to assign one object of the type
 | 
			
		||||
to another object of that type.
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
  <meta http-equiv="Content-Language" content="en-us">
 | 
			
		||||
  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
 | 
			
		||||
 | 
			
		||||
  <title>Assignable</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<h3>Notation</h3>
 | 
			
		||||
<Table>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>T</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
is type that is a model of Assignable
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<body bgcolor="#FFFFFF" link="#0000EE" text="#000000" vlink="#551A8B" alink=
 | 
			
		||||
"#FF0000">
 | 
			
		||||
  <img src="../../boost.png" alt="C++ Boost" width="277" height=
 | 
			
		||||
  "86"><br clear="none">
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>t</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
is an object of type <tt>T</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</tr>
 | 
			
		||||
  <h1>Assignable</h1>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>u</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
is an object of type <tt>T</tt> or possibly <tt>const T</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</tr>
 | 
			
		||||
  <h3>Description</h3>
 | 
			
		||||
 | 
			
		||||
</table>
 | 
			
		||||
<h3>Definitions</h3>
 | 
			
		||||
<h3>Valid expressions</h3>
 | 
			
		||||
<Table border>
 | 
			
		||||
<TR>
 | 
			
		||||
<TH>
 | 
			
		||||
Name
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Expression
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Return type
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Semantics
 | 
			
		||||
</TH>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Assignment
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>t = u</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>T&</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>t</tt> is equivalent to <tt>u</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
  <p>A type is Assignable if it is possible to assign one object of the type
 | 
			
		||||
  to another object of that type.</p>
 | 
			
		||||
 | 
			
		||||
</table>
 | 
			
		||||
  <h3>Notation</h3>
 | 
			
		||||
 | 
			
		||||
  <table summary="">
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top"><tt>T</tt></td>
 | 
			
		||||
 | 
			
		||||
</table>
 | 
			
		||||
<h3>Models</h3>
 | 
			
		||||
      <td valign="top">is type that is a model of Assignable</td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
<UL>
 | 
			
		||||
<LI><tt>int</tt>
 | 
			
		||||
<LI><tt>std::pair</tt>
 | 
			
		||||
</UL>
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top"><tt>t</tt></td>
 | 
			
		||||
 | 
			
		||||
<h3>See also</h3>
 | 
			
		||||
<a href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</A>
 | 
			
		||||
and 
 | 
			
		||||
<A href="./CopyConstructible.html">CopyConstructible</A>
 | 
			
		||||
      <td valign="top">is an object of type <tt>T</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
<HR>
 | 
			
		||||
<TABLE>
 | 
			
		||||
<TR valign=top>
 | 
			
		||||
<TD nowrap>Copyright © 2000</TD><TD>
 | 
			
		||||
<A HREF=http://www.lsc.nd.edu/~jsiek>Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
 | 
			
		||||
</TD></TR></TABLE>
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top"><tt>u</tt></td>
 | 
			
		||||
 | 
			
		||||
</BODY>
 | 
			
		||||
</HTML> 
 | 
			
		||||
      <td valign="top">is an object of type <tt>T</tt> or possibly <tt>const
 | 
			
		||||
      T</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <h3>Definitions</h3>
 | 
			
		||||
 | 
			
		||||
  <h3>Valid expressions</h3>
 | 
			
		||||
 | 
			
		||||
  <table border summary="">
 | 
			
		||||
    <tr>
 | 
			
		||||
      <th>Name</th>
 | 
			
		||||
 | 
			
		||||
      <th>Expression</th>
 | 
			
		||||
 | 
			
		||||
      <th>Return type</th>
 | 
			
		||||
 | 
			
		||||
      <th>Semantics</th>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Assignment</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>t = u</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>T&</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>t</tt> is equivalent to <tt>u</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <h3>Models</h3>
 | 
			
		||||
 | 
			
		||||
  <ul>
 | 
			
		||||
    <li><tt>int</tt></li>
 | 
			
		||||
 | 
			
		||||
    <li><tt>std::pair</tt></li>
 | 
			
		||||
  </ul>
 | 
			
		||||
 | 
			
		||||
  <h3>See also</h3>
 | 
			
		||||
 | 
			
		||||
  <p><a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>
 | 
			
		||||
  and <a href="./CopyConstructible.html">CopyConstructible</a><br></p>
 | 
			
		||||
  <hr>
 | 
			
		||||
 | 
			
		||||
  <p><a href="http://validator.w3.org/check?uri=referer"><img border="0" src=
 | 
			
		||||
  "../../doc/images/valid-html401.png" alt="Valid HTML 4.01 Transitional"
 | 
			
		||||
  height="31" width="88"></a></p>
 | 
			
		||||
 | 
			
		||||
  <p>Revised 
 | 
			
		||||
  <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->05 December, 2006<!--webbot bot="Timestamp" endspan i-checksum="38516" --></p>
 | 
			
		||||
 | 
			
		||||
  <table summary="">
 | 
			
		||||
    <tr valign="top">
 | 
			
		||||
      <td nowrap><i>Copyright © 2000</i></td>
 | 
			
		||||
 | 
			
		||||
      <td><i><a href="http://www.lsc.nd.edu/~jsiek">Jeremy Siek</a>, Univ.of
 | 
			
		||||
      Notre Dame (<a href=
 | 
			
		||||
      "mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</a>)</i></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <p><i>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>)</i></p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1036
									
								
								Collection.html
									
									
									
									
									
								
							
							
						
						
									
										1036
									
								
								Collection.html
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,178 +1,139 @@
 | 
			
		||||
<HTML>
 | 
			
		||||
<!--
 | 
			
		||||
  -- Copyright (c) Jeremy Siek 2000
 | 
			
		||||
  --
 | 
			
		||||
  -- Permission to use, copy, modify, distribute and sell this software
 | 
			
		||||
  -- and its documentation for any purpose is hereby granted without fee,
 | 
			
		||||
  -- provided that the above copyright notice appears in all copies and
 | 
			
		||||
  -- that both that copyright notice and this permission notice appear
 | 
			
		||||
  -- in supporting documentation.  Silicon Graphics makes no
 | 
			
		||||
  -- representations about the suitability of this software for any
 | 
			
		||||
  -- purpose.  It is provided "as is" without express or implied warranty.
 | 
			
		||||
  -->
 | 
			
		||||
<Head>
 | 
			
		||||
<Title>Copy Constructible</Title>
 | 
			
		||||
</HEAD>
 | 
			
		||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" 
 | 
			
		||||
        ALINK="#ff0000"> 
 | 
			
		||||
<IMG SRC="../../c++boost.gif" 
 | 
			
		||||
     ALT="C++ Boost" width="277" height="86"> 
 | 
			
		||||
<!--end header-->
 | 
			
		||||
<BR Clear>
 | 
			
		||||
<H1>Copy Constructible</H1>
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
 | 
			
		||||
<h3>Description</h3>
 | 
			
		||||
A type is Copy Constructible if it is possible to copy objects of that
 | 
			
		||||
type.
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
  <meta http-equiv="Content-Language" content="en-us">
 | 
			
		||||
  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
 | 
			
		||||
 | 
			
		||||
<h3>Notation</h3>
 | 
			
		||||
<Table>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>T</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
is type that is a model of Copy Constructible
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
  <title>Copy Constructible</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>t</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
is an object of type <tt>T</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</tr>
 | 
			
		||||
<body bgcolor="#FFFFFF" link="#0000EE" text="#000000" vlink="#551A8B" alink=
 | 
			
		||||
"#FF0000">
 | 
			
		||||
  <img src="../../boost.png" alt="C++ Boost" width="277" height=
 | 
			
		||||
  "86"><br clear="none">
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>u</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
is an object of type <tt>const T</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</tr>
 | 
			
		||||
  <h1>Copy Constructible</h1>
 | 
			
		||||
 | 
			
		||||
</table>
 | 
			
		||||
<h3>Definitions</h3>
 | 
			
		||||
<h3>Valid expressions</h3>
 | 
			
		||||
<Table border>
 | 
			
		||||
<TR>
 | 
			
		||||
<TH>
 | 
			
		||||
Name
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Expression
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Return type
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Semantics
 | 
			
		||||
</TH>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Copy constructor
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>T(t)</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>T</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>t</tt> is equivalent to <tt>T(t)</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
  <h3>Description</h3>
 | 
			
		||||
 | 
			
		||||
  <p>A type is Copy Constructible if it is possible to copy objects of that
 | 
			
		||||
  type.</p>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Copy constructor
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<pre>
 | 
			
		||||
  <h3>Notation</h3>
 | 
			
		||||
 | 
			
		||||
  <table summary="">
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top"><tt>T</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">is type that is a model of Copy Constructible</td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top"><tt>t</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">is an object of type <tt>T</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top"><tt>u</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">is an object of type <tt>const T</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <h3>Definitions</h3>
 | 
			
		||||
 | 
			
		||||
  <h3>Valid expressions</h3>
 | 
			
		||||
 | 
			
		||||
  <table border summary="">
 | 
			
		||||
    <tr>
 | 
			
		||||
      <th>Name</th>
 | 
			
		||||
 | 
			
		||||
      <th>Expression</th>
 | 
			
		||||
 | 
			
		||||
      <th>Return type</th>
 | 
			
		||||
 | 
			
		||||
      <th>Semantics</th>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Copy constructor</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>T(t)</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>T</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>t</tt> is equivalent to <tt>T(t)</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Copy constructor</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">
 | 
			
		||||
        <pre>
 | 
			
		||||
T(u)
 | 
			
		||||
</pre>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>T</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>u</tt> is equivalent to <tt>T(u)</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
      </td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>T</tt></td>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Destructor
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<pre>
 | 
			
		||||
      <td valign="top"><tt>u</tt> is equivalent to <tt>T(u)</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Destructor</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">
 | 
			
		||||
        <pre>
 | 
			
		||||
t.~T()
 | 
			
		||||
</pre>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>T</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
 
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
      </td>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Address Operator
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<pre>
 | 
			
		||||
      <td valign="top"><tt>T</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"> </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Address Operator</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">
 | 
			
		||||
        <pre>
 | 
			
		||||
&t
 | 
			
		||||
</pre>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>T*</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
denotes the address of <tt>t</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
      </td>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Address Operator
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<pre>
 | 
			
		||||
      <td valign="top"><tt>T*</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">denotes the address of <tt>t</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Address Operator</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">
 | 
			
		||||
        <pre>
 | 
			
		||||
&u
 | 
			
		||||
</pre>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>T*</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
denotes the address of <tt>u</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
      </td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>T*</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">denotes the address of <tt>u</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
</table>
 | 
			
		||||
  <h3>Models</h3>
 | 
			
		||||
 | 
			
		||||
  <ul>
 | 
			
		||||
    <li><tt>int</tt></li>
 | 
			
		||||
 | 
			
		||||
</table>
 | 
			
		||||
<h3>Models</h3>
 | 
			
		||||
    <li><tt>std::pair</tt></li>
 | 
			
		||||
  </ul>
 | 
			
		||||
 | 
			
		||||
<UL>
 | 
			
		||||
<LI><tt>int</tt>
 | 
			
		||||
<LI><tt>std::pair</tt>
 | 
			
		||||
</UL>
 | 
			
		||||
 | 
			
		||||
<h3>Concept Checking Class</h3>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
  <h3>Concept Checking Class</h3>
 | 
			
		||||
  <pre>
 | 
			
		||||
  template <class T>
 | 
			
		||||
  struct CopyConstructibleConcept
 | 
			
		||||
  {
 | 
			
		||||
@@ -192,19 +153,33 @@ denotes the address of <tt>u</tt>
 | 
			
		||||
  };
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3>See also</h3>
 | 
			
		||||
<A
 | 
			
		||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default Constructible</A>
 | 
			
		||||
and 
 | 
			
		||||
<A hrefa="./Assignable.html">Assignable</A>
 | 
			
		||||
  <h3>See also</h3>
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
<HR>
 | 
			
		||||
<TABLE>
 | 
			
		||||
<TR valign=top>
 | 
			
		||||
<TD nowrap>Copyright © 2000</TD><TD>
 | 
			
		||||
<A HREF=http://www.lsc.nd.edu/~jsiek>Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
 | 
			
		||||
</TD></TR></TABLE>
 | 
			
		||||
  <p><a href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default
 | 
			
		||||
  Constructible</a> and <a href="./Assignable.html">Assignable</a><br></p>
 | 
			
		||||
  <hr>
 | 
			
		||||
 | 
			
		||||
</BODY>
 | 
			
		||||
</HTML> 
 | 
			
		||||
  <p><a href="http://validator.w3.org/check?uri=referer"><img border="0" src=
 | 
			
		||||
  "../../doc/images/valid-html401.png" alt="Valid HTML 4.01 Transitional"
 | 
			
		||||
  height="31" width="88"></a></p>
 | 
			
		||||
 | 
			
		||||
  <p>Revised 
 | 
			
		||||
  <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->05
 | 
			
		||||
  December, 2006<!--webbot bot="Timestamp" endspan i-checksum="38516" --></p>
 | 
			
		||||
 | 
			
		||||
  <table summary="">
 | 
			
		||||
    <tr valign="top">
 | 
			
		||||
      <td nowrap><i>Copyright © 2000</i></td>
 | 
			
		||||
 | 
			
		||||
      <td><i><a href="http://www.lsc.nd.edu/~jsiek">Jeremy Siek</a>, Univ.of
 | 
			
		||||
      Notre Dame (<a href=
 | 
			
		||||
      "mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</a>)</i></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <p><i>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>)</i></p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,212 +1,210 @@
 | 
			
		||||
<HTML>
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
 | 
			
		||||
<html>
 | 
			
		||||
<!--
 | 
			
		||||
  -- Copyright (c) Jeremy Siek 2000
 | 
			
		||||
  --
 | 
			
		||||
  -- Permission to use, copy, modify, distribute and sell this software
 | 
			
		||||
  -- and its documentation for any purpose is hereby granted without fee,
 | 
			
		||||
  -- provided that the above copyright notice appears in all copies and
 | 
			
		||||
  -- that both that copyright notice and this permission notice appear
 | 
			
		||||
  -- in supporting documentation.  Silicon Graphics makes no
 | 
			
		||||
  -- representations about the suitability of this software for any
 | 
			
		||||
  -- purpose.  It is provided "as is" without express or implied warranty.
 | 
			
		||||
  == Copyright (c) 1996-1999
 | 
			
		||||
  == Silicon Graphics Computer Systems, Inc.
 | 
			
		||||
  ==
 | 
			
		||||
  == Permission to use, copy, modify, distribute and sell this software
 | 
			
		||||
  == and its documentation for any purpose is hereby granted without fee,
 | 
			
		||||
  == provided that the above copyright notice appears in all copies and
 | 
			
		||||
  == that both that copyright notice and this permission notice appear
 | 
			
		||||
  == in supporting documentation.  Silicon Graphics makes no
 | 
			
		||||
  == representations about the suitability of this software for any
 | 
			
		||||
  == purpose.  It is provided "as is" without express or implied warranty.
 | 
			
		||||
  ==
 | 
			
		||||
  == Copyright (c) 1994
 | 
			
		||||
  == Hewlett-Packard Company
 | 
			
		||||
  ==
 | 
			
		||||
  == Permission to use, copy, modify, distribute and sell this software
 | 
			
		||||
  == and its documentation for any purpose is hereby granted without fee,
 | 
			
		||||
  == provided that the above copyright notice appears in all copies and
 | 
			
		||||
  == that both that copyright notice and this permission notice appear
 | 
			
		||||
  == in supporting documentation.  Hewlett-Packard Company makes no
 | 
			
		||||
  == representations about the suitability of this software for any
 | 
			
		||||
  == purpose.  It is provided "as is" without express or implied warranty.
 | 
			
		||||
  ==
 | 
			
		||||
  -->
 | 
			
		||||
<!--
 | 
			
		||||
  -- Copyright (c) 1996-1999
 | 
			
		||||
  -- Silicon Graphics Computer Systems, Inc.
 | 
			
		||||
  --
 | 
			
		||||
  -- Permission to use, copy, modify, distribute and sell this software
 | 
			
		||||
  -- and its documentation for any purpose is hereby granted without fee,
 | 
			
		||||
  -- provided that the above copyright notice appears in all copies and
 | 
			
		||||
  -- that both that copyright notice and this permission notice appear
 | 
			
		||||
  -- in supporting documentation.  Silicon Graphics makes no
 | 
			
		||||
  -- representations about the suitability of this software for any
 | 
			
		||||
  -- purpose.  It is provided "as is" without express or implied warranty.
 | 
			
		||||
  --
 | 
			
		||||
  -- Copyright (c) 1994
 | 
			
		||||
  -- Hewlett-Packard Company
 | 
			
		||||
  --
 | 
			
		||||
  -- Permission to use, copy, modify, distribute and sell this software
 | 
			
		||||
  -- and its documentation for any purpose is hereby granted without fee,
 | 
			
		||||
  -- provided that the above copyright notice appears in all copies and
 | 
			
		||||
  -- that both that copyright notice and this permission notice appear
 | 
			
		||||
  -- in supporting documentation.  Hewlett-Packard Company makes no
 | 
			
		||||
  -- representations about the suitability of this software for any
 | 
			
		||||
  -- purpose.  It is provided "as is" without express or implied warranty.
 | 
			
		||||
  --
 | 
			
		||||
  -->
 | 
			
		||||
<Head>
 | 
			
		||||
<Title>LessThanComparable</Title>
 | 
			
		||||
</Head>
 | 
			
		||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" 
 | 
			
		||||
        ALINK="#ff0000"> 
 | 
			
		||||
<IMG SRC="../../c++boost.gif" 
 | 
			
		||||
     ALT="C++ Boost" width="277" height="86"> 
 | 
			
		||||
<!--end header-->
 | 
			
		||||
<BR Clear>
 | 
			
		||||
<H1>LessThanComparable</H1>
 | 
			
		||||
 | 
			
		||||
<h3>Description</h3>
 | 
			
		||||
A type is LessThanComparable if it is ordered: it must
 | 
			
		||||
be possible to compare two objects of that type using <tt>operator<</tt>, and
 | 
			
		||||
<tt>operator<</tt> must be a strict weak ordering relation.
 | 
			
		||||
<head>
 | 
			
		||||
  <meta http-equiv="Content-Language" content="en-us">
 | 
			
		||||
  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
 | 
			
		||||
 | 
			
		||||
  <title>LessThanComparable</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<h3>Refinement of</h3>
 | 
			
		||||
<h3>Associated types</h3>
 | 
			
		||||
<h3>Notation</h3>
 | 
			
		||||
<Table>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>X</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
A type that is a model of LessThanComparable
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>x</tt>, <tt>y</tt>, <tt>z</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Object of type <tt>X</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</tr>
 | 
			
		||||
</table>
 | 
			
		||||
<h3>Definitions</h3>
 | 
			
		||||
Consider the relation <tt>!(x < y) && !(y < x)</tt>.  If this relation is
 | 
			
		||||
transitive (that is, if <tt>!(x < y) && !(y < x) && !(y < z) && !(z < y)</tt>
 | 
			
		||||
implies <tt>!(x < z) && !(z < x)</tt>), then it satisfies the mathematical
 | 
			
		||||
definition of an equivalence relation.  In this case, <tt>operator<</tt>
 | 
			
		||||
is a <i>strict weak ordering</i>.
 | 
			
		||||
<P>
 | 
			
		||||
If <tt>operator<</tt> is a strict weak ordering, and if each equivalence class
 | 
			
		||||
has only a single element, then <tt>operator<</tt> is a <i>total ordering</i>.
 | 
			
		||||
<h3>Valid expressions</h3>
 | 
			
		||||
<Table border>
 | 
			
		||||
<TR>
 | 
			
		||||
<TH>
 | 
			
		||||
Name
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Expression
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Type requirements
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Return type
 | 
			
		||||
</TH>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Less
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>x < y</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
 
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Convertible to <tt>bool</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
</table>
 | 
			
		||||
<body bgcolor="#FFFFFF" link="#0000EE" text="#000000" vlink="#551A8B" alink=
 | 
			
		||||
"#FF0000">
 | 
			
		||||
  <img src="../../boost.png" alt="C++ Boost" width="277" height=
 | 
			
		||||
  "86"><br clear="none">
 | 
			
		||||
 | 
			
		||||
  <h1>LessThanComparable</h1>
 | 
			
		||||
 | 
			
		||||
  <h3>Description</h3>
 | 
			
		||||
 | 
			
		||||
<h3>Expression semantics</h3>
 | 
			
		||||
<Table border>
 | 
			
		||||
<TR>
 | 
			
		||||
<TH>
 | 
			
		||||
Name
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Expression
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Precondition
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Semantics
 | 
			
		||||
</TH>
 | 
			
		||||
<TH>
 | 
			
		||||
Postcondition
 | 
			
		||||
</TH>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Less
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>x < y</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>x</tt> and <tt>y</tt> are in the domain of <tt><</tt>
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
 
 | 
			
		||||
</TD>
 | 
			
		||||
</table>
 | 
			
		||||
  <p>A type is LessThanComparable if it is ordered: it must be possible to
 | 
			
		||||
  compare two objects of that type using <tt>operator<</tt>, and
 | 
			
		||||
  <tt>operator<</tt> must be a strict weak ordering relation.</p>
 | 
			
		||||
 | 
			
		||||
  <h3>Refinement of</h3>
 | 
			
		||||
 | 
			
		||||
<h3>Complexity guarantees</h3>
 | 
			
		||||
<h3>Invariants</h3>
 | 
			
		||||
<Table border>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Irreflexivity
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>x < x</tt> must be false.
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Antisymmetry
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>x < y</tt> implies !(y < x) <A href="#2">[2]</A>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Transitivity
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>x < y</tt> and <tt>y < z</tt> implies <tt>x < z</tt> <A href="#3">[3]</A>
 | 
			
		||||
</TD>
 | 
			
		||||
</tr>
 | 
			
		||||
</table>
 | 
			
		||||
<h3>Models</h3>
 | 
			
		||||
<UL>
 | 
			
		||||
<LI>
 | 
			
		||||
int
 | 
			
		||||
</UL>
 | 
			
		||||
<h3>Notes</h3>
 | 
			
		||||
<P><A name="1">[1]</A>
 | 
			
		||||
Only <tt>operator<</tt> is fundamental; the other inequality operators
 | 
			
		||||
are essentially syntactic sugar.
 | 
			
		||||
<P><A name="2">[2]</A>
 | 
			
		||||
Antisymmetry is a theorem, not an axiom: it follows from
 | 
			
		||||
irreflexivity and transitivity.
 | 
			
		||||
<P><A name="3">[3]</A>
 | 
			
		||||
Because of irreflexivity and transitivity, <tt>operator<</tt> always
 | 
			
		||||
satisfies the definition of a <i>partial ordering</i>.  The definition of
 | 
			
		||||
a <i>strict weak ordering</i> is stricter, and the definition of a
 | 
			
		||||
<i>total ordering</i> is stricter still.
 | 
			
		||||
<h3>See also</h3>
 | 
			
		||||
<A href="http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</A>, <A href="http://www.sgi.com/tech/stl/StrictWeakOrdering.html">StrictWeakOrdering</A>
 | 
			
		||||
  <h3>Associated types</h3>
 | 
			
		||||
 | 
			
		||||
  <h3>Notation</h3>
 | 
			
		||||
 | 
			
		||||
  <table summary="">
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top"><tt>X</tt></td>
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
<HR>
 | 
			
		||||
<TABLE>
 | 
			
		||||
<TR valign=top>
 | 
			
		||||
<TD nowrap>Copyright © 2000</TD><TD>
 | 
			
		||||
<A HREF=http://www.lsc.nd.edu/~jsiek>Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
 | 
			
		||||
</TD></TR></TABLE>
 | 
			
		||||
      <td valign="top">A type that is a model of LessThanComparable</td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
</BODY>
 | 
			
		||||
</HTML> 
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top"><tt>x</tt>, <tt>y</tt>, <tt>z</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">Object of type <tt>X</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <h3>Definitions</h3>
 | 
			
		||||
 | 
			
		||||
  <p>Consider the relation <tt>!(x < y) && !(y < x)</tt>. If
 | 
			
		||||
  this relation is transitive (that is, if <tt>!(x < y) && !(y
 | 
			
		||||
  < x) && !(y < z) && !(z < y)</tt> implies <tt>!(x
 | 
			
		||||
  < z) && !(z < x)</tt>), then it satisfies the mathematical
 | 
			
		||||
  definition of an equivalence relation. In this case, <tt>operator<</tt>
 | 
			
		||||
  is a <i>strict weak ordering</i>.</p>
 | 
			
		||||
 | 
			
		||||
  <p>If <tt>operator<</tt> is a strict weak ordering, and if each
 | 
			
		||||
  equivalence class has only a single element, then <tt>operator<</tt> is
 | 
			
		||||
  a <i>total ordering</i>.</p>
 | 
			
		||||
 | 
			
		||||
  <h3>Valid expressions</h3>
 | 
			
		||||
 | 
			
		||||
  <table border summary="">
 | 
			
		||||
    <tr>
 | 
			
		||||
      <th>Name</th>
 | 
			
		||||
 | 
			
		||||
      <th>Expression</th>
 | 
			
		||||
 | 
			
		||||
      <th>Type requirements</th>
 | 
			
		||||
 | 
			
		||||
      <th>Return type</th>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Less</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>x < y</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"> </td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top">Convertible to <tt>bool</tt></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <h3>Expression semantics</h3>
 | 
			
		||||
 | 
			
		||||
  <table border summary="">
 | 
			
		||||
    <tr>
 | 
			
		||||
      <th>Name</th>
 | 
			
		||||
 | 
			
		||||
      <th>Expression</th>
 | 
			
		||||
 | 
			
		||||
      <th>Precondition</th>
 | 
			
		||||
 | 
			
		||||
      <th>Semantics</th>
 | 
			
		||||
 | 
			
		||||
      <th>Postcondition</th>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Less</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>x < y</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>x</tt> and <tt>y</tt> are in the domain of
 | 
			
		||||
      <tt><</tt></td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"> </td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <h3>Complexity guarantees</h3>
 | 
			
		||||
 | 
			
		||||
  <h3>Invariants</h3>
 | 
			
		||||
 | 
			
		||||
  <table border summary="">
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Irreflexivity</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>x < x</tt> must be false.</td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Antisymmetry</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>x < y</tt> implies !(y < x) <a href=
 | 
			
		||||
      "#n2">[2]</a></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td valign="top">Transitivity</td>
 | 
			
		||||
 | 
			
		||||
      <td valign="top"><tt>x < y</tt> and <tt>y < z</tt> implies <tt>x
 | 
			
		||||
      < z</tt> <a href="#n3">[3]</a></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <h3>Models</h3>
 | 
			
		||||
 | 
			
		||||
  <ul>
 | 
			
		||||
    <li>int</li>
 | 
			
		||||
  </ul>
 | 
			
		||||
 | 
			
		||||
  <h3>Notes</h3>
 | 
			
		||||
 | 
			
		||||
  <p><a name="n1" id="n1">[1]</a> Only <tt>operator<</tt> is fundamental;
 | 
			
		||||
  the other inequality operators are essentially syntactic sugar.</p>
 | 
			
		||||
 | 
			
		||||
  <p><a name="n2" id="n2">[2]</a> Antisymmetry is a theorem, not an axiom: it
 | 
			
		||||
  follows from irreflexivity and transitivity.</p>
 | 
			
		||||
 | 
			
		||||
  <p><a name="n3" id="n3">[3]</a> Because of irreflexivity and transitivity,
 | 
			
		||||
  <tt>operator<</tt> always satisfies the definition of a <i>partial
 | 
			
		||||
  ordering</i>. The definition of a <i>strict weak ordering</i> is stricter,
 | 
			
		||||
  and the definition of a <i>total ordering</i> is stricter still.</p>
 | 
			
		||||
 | 
			
		||||
  <h3>See also</h3>
 | 
			
		||||
 | 
			
		||||
  <p><a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</a>,
 | 
			
		||||
  <a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/StrictWeakOrdering.html">StrictWeakOrdering</a><br>
 | 
			
		||||
  </p>
 | 
			
		||||
  <hr>
 | 
			
		||||
 | 
			
		||||
  <p><a href="http://validator.w3.org/check?uri=referer"><img border="0" src=
 | 
			
		||||
  "../../doc/images/valid-html401.png" alt="Valid HTML 4.01 Transitional"
 | 
			
		||||
  height="31" width="88"></a></p>
 | 
			
		||||
 | 
			
		||||
  <p>Revised 
 | 
			
		||||
  <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->05
 | 
			
		||||
  December, 2006<!--webbot bot="Timestamp" endspan i-checksum="38516" --></p>
 | 
			
		||||
 | 
			
		||||
  <table summary="">
 | 
			
		||||
    <tr valign="top">
 | 
			
		||||
      <td nowrap><i>Copyright © 2000</i></td>
 | 
			
		||||
 | 
			
		||||
      <td><i><a href="http://www.lsc.nd.edu/~jsiek">Jeremy Siek</a>, Univ.of
 | 
			
		||||
      Notre Dame (<a href=
 | 
			
		||||
      "mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</a>)</i></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <p><i>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>)</i></p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,92 +1,95 @@
 | 
			
		||||
<HTML>
 | 
			
		||||
<!--
 | 
			
		||||
  -- Copyright (c) Jeremy Siek 2000
 | 
			
		||||
  --
 | 
			
		||||
  -- Permission to use, copy, modify, distribute and sell this software
 | 
			
		||||
  -- and its documentation for any purpose is hereby granted without fee,
 | 
			
		||||
  -- provided that the above copyright notice appears in all copies and
 | 
			
		||||
  -- that both that copyright notice and this permission notice appear
 | 
			
		||||
  -- in supporting documentation.  Silicon Graphics makes no
 | 
			
		||||
  -- representations about the suitability of this software for any
 | 
			
		||||
  -- purpose.  It is provided "as is" without express or implied warranty.
 | 
			
		||||
  -->
 | 
			
		||||
<Head>
 | 
			
		||||
<Title>MultiPassInputIterator</Title>
 | 
			
		||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" 
 | 
			
		||||
	ALINK="#ff0000"> 
 | 
			
		||||
<IMG SRC="../../c++boost.gif" 
 | 
			
		||||
     ALT="C++ Boost" width="277" height="86"> 
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
 | 
			
		||||
<BR Clear>
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
  <meta http-equiv="Content-Language" content="en-us">
 | 
			
		||||
  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
 | 
			
		||||
 | 
			
		||||
<H2>
 | 
			
		||||
<A NAME="concept:MultiPassInputIterator"></A>
 | 
			
		||||
Multi-Pass Input Iterator
 | 
			
		||||
</H2>
 | 
			
		||||
  <title>MultiPassInputIterator</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
This concept is a refinement of <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>,
 | 
			
		||||
adding the requirements that the iterator can be used to make multiple
 | 
			
		||||
passes through a range, and that if <TT>it1 == it2</TT> and
 | 
			
		||||
<TT>it1</TT> is dereferenceable then <TT>++it1 == ++it2</TT>. The
 | 
			
		||||
Multi-Pass Input Iterator is very similar to the <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/ForwardIterator.hmtl">Forward Iterator</a>. The
 | 
			
		||||
only difference is that a <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/ForwardIterator.hmtl">Forward Iterator</a>
 | 
			
		||||
requires the <TT>reference</TT> type to be <TT>value_type&</TT>, whereas
 | 
			
		||||
MultiPassInputIterator is like <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>
 | 
			
		||||
in that the <TT>reference</TT> type merely has to be convertible to
 | 
			
		||||
<TT>value_type</TT>.
 | 
			
		||||
<body bgcolor="#FFFFFF" link="#0000EE" text="#000000" vlink="#551A8B" alink=
 | 
			
		||||
"#FF0000">
 | 
			
		||||
  <img src="../../boost.png" alt="C++ Boost" width="277" height=
 | 
			
		||||
  "86"><br clear="none">
 | 
			
		||||
 | 
			
		||||
  <h2><a name="concept:MultiPassInputIterator" id=
 | 
			
		||||
  "concept:MultiPassInputIterator"></a> Multi-Pass Input Iterator</h2>
 | 
			
		||||
 | 
			
		||||
<h3>Design Notes</h3>
 | 
			
		||||
  <p>This concept is a refinement of <a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>, adding
 | 
			
		||||
  the requirements that the iterator can be used to make multiple passes
 | 
			
		||||
  through a range, and that if <tt>it1 == it2</tt> and <tt>it1</tt> is
 | 
			
		||||
  dereferenceable then <tt>++it1 == ++it2</tt>. The Multi-Pass Input Iterator
 | 
			
		||||
  is very similar to the <a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/ForwardIterator.html">Forward Iterator</a>.
 | 
			
		||||
  The only difference is that a <a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/ForwardIterator.html">Forward Iterator</a>
 | 
			
		||||
  requires the <tt>reference</tt> type to be <tt>value_type&</tt>,
 | 
			
		||||
  whereas MultiPassInputIterator is like <a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a> in that
 | 
			
		||||
  the <tt>reference</tt> type merely has to be convertible to
 | 
			
		||||
  <tt>value_type</tt>.</p>
 | 
			
		||||
 | 
			
		||||
comments by Valentin Bonnard:
 | 
			
		||||
  <h3>Design Notes</h3>
 | 
			
		||||
 | 
			
		||||
<p> I think that introducing Multi-Pass Input Iterator isn't the right
 | 
			
		||||
solution. Do you also want to define Multi-Pass Bidirectionnal Iterator
 | 
			
		||||
and Multi-Pass Random Access Iterator ? I don't, definitly. It only
 | 
			
		||||
confuses the issue. The problem lies into the existing hierarchy of
 | 
			
		||||
iterators, which mixes movabillity, modifiabillity and lvalue-ness,
 | 
			
		||||
and these are clearly independant.
 | 
			
		||||
  <p>comments by Valentin Bonnard:</p>
 | 
			
		||||
 | 
			
		||||
<p> The terms Forward, Bidirectionnal and Random Access are about
 | 
			
		||||
movabillity and shouldn't be used to mean anything else.  In a
 | 
			
		||||
completly orthogonal way, iterators can be immutable, mutable, or
 | 
			
		||||
neither.  Lvalueness of iterators is also orthogonal with
 | 
			
		||||
immutabillity.  With these clean concepts, your Multi-Pass Input Iterator
 | 
			
		||||
is just called a Forward Iterator.
 | 
			
		||||
  <p>I think that introducing Multi-Pass Input Iterator isn't the right
 | 
			
		||||
  solution. Do you also want to define Multi-Pass Bidirectionnal Iterator and
 | 
			
		||||
  Multi-Pass Random Access Iterator ? I don't, definitly. It only confuses
 | 
			
		||||
  the issue. The problem lies into the existing hierarchy of iterators, which
 | 
			
		||||
  mixes movabillity, modifiabillity and lvalue-ness, and these are clearly
 | 
			
		||||
  independant.</p>
 | 
			
		||||
 | 
			
		||||
<p>                
 | 
			
		||||
Other translations are:<br>
 | 
			
		||||
std::Forward Iterator -> ForwardIterator & Lvalue Iterator<br>
 | 
			
		||||
std::Bidirectionnal Iterator -> Bidirectionnal Iterator & Lvalue Iterator<br>
 | 
			
		||||
std::Random Access Iterator -> Random Access Iterator & Lvalue Iterator<br>
 | 
			
		||||
  <p>The terms Forward, Bidirectionnal and Random Access are about
 | 
			
		||||
  movabillity and shouldn't be used to mean anything else. In a completly
 | 
			
		||||
  orthogonal way, iterators can be immutable, mutable, or neither. Lvalueness
 | 
			
		||||
  of iterators is also orthogonal with immutabillity. With these clean
 | 
			
		||||
  concepts, your Multi-Pass Input Iterator is just called a Forward
 | 
			
		||||
  Iterator.</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Note that in practice the only operation not allowed on my 
 | 
			
		||||
Forward Iterator which is allowed on std::Forward Iterator is 
 | 
			
		||||
<tt>&*it</tt>. I think that <tt>&*</tt> is rarely needed in generic code.
 | 
			
		||||
  <p>Other translations are:<br>
 | 
			
		||||
  std::Forward Iterator -> ForwardIterator & Lvalue Iterator<br>
 | 
			
		||||
  std::Bidirectionnal Iterator -> Bidirectionnal Iterator & Lvalue
 | 
			
		||||
  Iterator<br>
 | 
			
		||||
  std::Random Access Iterator -> Random Access Iterator & Lvalue
 | 
			
		||||
  Iterator<br></p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
reply by Jeremy Siek:
 | 
			
		||||
  <p>Note that in practice the only operation not allowed on my Forward
 | 
			
		||||
  Iterator which is allowed on std::Forward Iterator is <tt>&*it</tt>. I
 | 
			
		||||
  think that <tt>&*</tt> is rarely needed in generic code.</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The above analysis by Valentin is right on. Of course, there is
 | 
			
		||||
the problem with backward compatibility. The current STL implementations
 | 
			
		||||
are based on the old definition of Forward Iterator. The right course
 | 
			
		||||
of action is to get Forward Iterator, etc. changed in the C++ standard.
 | 
			
		||||
Once that is done we can drop Multi-Pass Input Iterator.
 | 
			
		||||
  <p>reply by Jeremy Siek:</p>
 | 
			
		||||
 | 
			
		||||
  <p>The above analysis by Valentin is right on. Of course, there is the
 | 
			
		||||
  problem with backward compatibility. The current STL implementations are
 | 
			
		||||
  based on the old definition of Forward Iterator. The right course of action
 | 
			
		||||
  is to get Forward Iterator, etc. changed in the C++ standard. Once that is
 | 
			
		||||
  done we can drop Multi-Pass Input Iterator.<br></p>
 | 
			
		||||
  <hr>
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
<HR>
 | 
			
		||||
<TABLE>
 | 
			
		||||
<TR valign=top>
 | 
			
		||||
<TD nowrap>Copyright © 2000</TD><TD>
 | 
			
		||||
<a HREF="../../people/jeremy_siek.htm">Jeremy Siek</a>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
 | 
			
		||||
</TD></TR></TABLE>
 | 
			
		||||
  <p><a href="http://validator.w3.org/check?uri=referer"><img border="0" src=
 | 
			
		||||
  "../../doc/images/valid-html401.png" alt="Valid HTML 4.01 Transitional"
 | 
			
		||||
  height="31" width="88"></a></p>
 | 
			
		||||
 | 
			
		||||
</BODY>
 | 
			
		||||
</HTML> 
 | 
			
		||||
  <p>Revised 
 | 
			
		||||
  <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->05
 | 
			
		||||
  December, 2006<!--webbot bot="Timestamp" endspan i-checksum="38516" --></p>
 | 
			
		||||
 | 
			
		||||
  <table summary="">
 | 
			
		||||
    <tr valign="top">
 | 
			
		||||
      <td nowrap><i>Copyright © 2000</i></td>
 | 
			
		||||
 | 
			
		||||
      <td><i><a href="http://www.lsc.nd.edu/~jsiek">Jeremy Siek</a>, Univ.of
 | 
			
		||||
      Notre Dame (<a href=
 | 
			
		||||
      "mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</a>)</i></td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
  <p><i>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>)</i></p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
</HEAD>
 | 
			
		||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" 
 | 
			
		||||
        ALINK="#ff0000"> 
 | 
			
		||||
<IMG SRC="../../c++boost.gif" 
 | 
			
		||||
<IMG SRC="../../boost.png" 
 | 
			
		||||
     ALT="C++ Boost" width="277" height="86"> 
 | 
			
		||||
<!--end header-->
 | 
			
		||||
<BR Clear>
 | 
			
		||||
@@ -115,10 +115,9 @@ struct equal_pointees_t : std::binary_function<OptionalPointee,OptionalPointe
 | 
			
		||||
} ;
 | 
			
		||||
</pre>
 | 
			
		||||
<p>The preceding generic function and function object have the following semantics:<br>
 | 
			
		||||
If both x and y have valid pointees, it compares values via (*x == *y) or (*x < 
 | 
			
		||||
*y).<br>
 | 
			
		||||
If only one has a valid pointee, returns false.<br>
 | 
			
		||||
If both have invalid pointees, returns true.</p>
 | 
			
		||||
If both <b>x</b> and <b>y</b> have valid pointees, it compares values via <code>(*x == *y)</code>.<br>
 | 
			
		||||
If only one has a valid pointee, returns <code>false</code>.<br>
 | 
			
		||||
If both have invalid pointees, returns <code>true</code>.</p>
 | 
			
		||||
<a name="less"></a>
 | 
			
		||||
<p><u>Less-than relation:</u></p>
 | 
			
		||||
<pre>template<class OptionalPointee>
 | 
			
		||||
@@ -135,24 +134,31 @@ struct less_pointees_t : std::binary_function<OptionalPointee,OptionalPointee
 | 
			
		||||
} ;
 | 
			
		||||
</pre>
 | 
			
		||||
<p>The preceding generic function and function object have the following semantics:<br>
 | 
			
		||||
If both x and y have valid pointees, it compares values via (*x == *y) or (*x < 
 | 
			
		||||
*y).<br>
 | 
			
		||||
If only one has a valid pointee, returns false.<br>
 | 
			
		||||
If both have invalid pointees, returns false.</p>
 | 
			
		||||
<p>All these functions and function 
 | 
			
		||||
If <b>y</b> has an invalid pointee, returns <code>false</code>.<br>
 | 
			
		||||
Else, if <b>x</b> has an invalid pointee, returns <code>true</code>.<br>
 | 
			
		||||
Else, ( <b>x</b> and <b>y</b> have valid pointees), compares values via <code>(*x < 
 | 
			
		||||
*y).</code></p>
 | 
			
		||||
<p><br>
 | 
			
		||||
All these functions and function 
 | 
			
		||||
objects are is implemented in <a href="../../boost/utility/compare_pointees.hpp">compare_pointees.hpp</a></p>
 | 
			
		||||
<p>Notice that OptionalPointee does not imply aliasing (and optional<> for instance does not alias);
 | 
			
		||||
so direct usage of relational operators with the implied aliasing of shallow semantics
 | 
			
		||||
-as with pointers- should not be used with generic code written for this concept.</p>
 | 
			
		||||
 | 
			
		||||
<h3>Acknowledgements</h3>
 | 
			
		||||
<p>Based on the original concept developed by Augustus Saunders.
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
</p>
 | 
			
		||||
<HR>
 | 
			
		||||
<TABLE>
 | 
			
		||||
<TR valign=top>
 | 
			
		||||
<TD nowrap>Copyright © 2003</TD><TD>
 | 
			
		||||
<A HREF="mailto:fernando_cacciola@hotmail.com">Fernando Cacciola</A>,
 | 
			
		||||
based on the original concept developed by Augustus Saunders.
 | 
			
		||||
<A HREF="mailto:fernando_cacciola@hotmail.com">Fernando Cacciola</A>
 | 
			
		||||
</TD></TR></TABLE>
 | 
			
		||||
 | 
			
		||||
<p>Distributed under the Boost Software License, Version 1.0. See
 | 
			
		||||
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p>
 | 
			
		||||
 | 
			
		||||
</BODY>
 | 
			
		||||
</HTML>
 | 
			
		||||
							
								
								
									
										76
									
								
								addressof_fn_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								addressof_fn_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  addressof_fn_test.cpp: addressof( f )
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/addressof.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_test.hpp>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void f0()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f1(int)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f2(int, int)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f3(int, int, int)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f4(int, int, int, int)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f5(int, int, int, int, int)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f6(int, int, int, int, int, int)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f7(int, int, int, int, int, int, int)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f8(int, int, int, int, int, int, int, int)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f9(int, int, int, int, int, int, int, int, int)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    BOOST_TEST( boost::addressof( f0 ) == &f0 );
 | 
			
		||||
    BOOST_TEST( boost::addressof( f1 ) == &f1 );
 | 
			
		||||
    BOOST_TEST( boost::addressof( f2 ) == &f2 );
 | 
			
		||||
    BOOST_TEST( boost::addressof( f3 ) == &f3 );
 | 
			
		||||
    BOOST_TEST( boost::addressof( f4 ) == &f4 );
 | 
			
		||||
    BOOST_TEST( boost::addressof( f5 ) == &f5 );
 | 
			
		||||
    BOOST_TEST( boost::addressof( f6 ) == &f6 );
 | 
			
		||||
    BOOST_TEST( boost::addressof( f7 ) == &f7 );
 | 
			
		||||
    BOOST_TEST( boost::addressof( f8 ) == &f8 );
 | 
			
		||||
    BOOST_TEST( boost::addressof( f9 ) == &f9 );
 | 
			
		||||
 | 
			
		||||
    return boost::report_errors();
 | 
			
		||||
}
 | 
			
		||||
@@ -1,46 +1,94 @@
 | 
			
		||||
// Copyright (C) 2002 Brad King (brad.king@kitware.com) 
 | 
			
		||||
//                    Doug Gregor (gregod@cs.rpi.edu)
 | 
			
		||||
//                    Douglas Gregor (gregod@cs.rpi.edu)
 | 
			
		||||
//
 | 
			
		||||
// Permission to copy, use, sell and distribute this software is granted
 | 
			
		||||
// provided this copyright notice appears in all copies.
 | 
			
		||||
// Permission to modify the code and to distribute modified code is granted
 | 
			
		||||
// provided this copyright notice appears in all copies, and a notice
 | 
			
		||||
// that the code was modified is included with the copyright notice.
 | 
			
		||||
//
 | 
			
		||||
// This software is provided "as is" without express or implied warranty,
 | 
			
		||||
// and with no claim as to its suitability for any purpose.
 | 
			
		||||
// 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)
 | 
			
		||||
 | 
			
		||||
// For more information, see http://www.boost.org
 | 
			
		||||
 | 
			
		||||
#define BOOST_INCLUDE_MAIN
 | 
			
		||||
#include <boost/test/test_tools.hpp>
 | 
			
		||||
#include <boost/utility.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/addressof.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
 | 
			
		||||
#pragma warning(push, 3)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
 | 
			
		||||
#pragma warning(pop)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_test.hpp>
 | 
			
		||||
 | 
			
		||||
template<class T> void scalar_test( T * = 0 )
 | 
			
		||||
{
 | 
			
		||||
    T* px = new T();
 | 
			
		||||
 | 
			
		||||
    T& x = *px;
 | 
			
		||||
    BOOST_TEST( boost::addressof(x) == px );
 | 
			
		||||
 | 
			
		||||
    const T& cx = *px;
 | 
			
		||||
    const T* pcx = boost::addressof(cx);
 | 
			
		||||
    BOOST_TEST( pcx == px );
 | 
			
		||||
 | 
			
		||||
    volatile T& vx = *px;
 | 
			
		||||
    volatile T* pvx = boost::addressof(vx);
 | 
			
		||||
    BOOST_TEST( pvx == px );
 | 
			
		||||
 | 
			
		||||
    const volatile T& cvx = *px;
 | 
			
		||||
    const volatile T* pcvx = boost::addressof(cvx);
 | 
			
		||||
    BOOST_TEST( pcvx == px );
 | 
			
		||||
 | 
			
		||||
    delete px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void array_test( T * = 0 )
 | 
			
		||||
{
 | 
			
		||||
    T nrg[3] = {1,2,3};
 | 
			
		||||
    T (*pnrg)[3] = &nrg;
 | 
			
		||||
    BOOST_TEST( boost::addressof(nrg) == pnrg );
 | 
			
		||||
 | 
			
		||||
    T const cnrg[3] = {1,2,3};
 | 
			
		||||
    T const (*pcnrg)[3] = &cnrg;
 | 
			
		||||
    BOOST_TEST( boost::addressof(cnrg) == pcnrg );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct addressable
 | 
			
		||||
{
 | 
			
		||||
    addressable( int = 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct useless_type {};
 | 
			
		||||
 | 
			
		||||
class nonaddressable {
 | 
			
		||||
public:
 | 
			
		||||
  void dummy(); // Silence GCC warning: all member of class are private
 | 
			
		||||
 | 
			
		||||
    nonaddressable( int = 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void dummy(); // Silence GCC warning: all member of class are private
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  useless_type operator&() const;
 | 
			
		||||
 | 
			
		||||
    useless_type operator&() const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int test_main(int, char*[])
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  nonaddressable* px = new nonaddressable();
 | 
			
		||||
    scalar_test<char>();
 | 
			
		||||
    scalar_test<int>();
 | 
			
		||||
    scalar_test<addressable>();
 | 
			
		||||
    scalar_test<nonaddressable>();
 | 
			
		||||
 | 
			
		||||
  nonaddressable& x = *px;
 | 
			
		||||
  BOOST_TEST(boost::addressof(x) == px);
 | 
			
		||||
    array_test<char>();
 | 
			
		||||
    array_test<int>();
 | 
			
		||||
    array_test<addressable>();
 | 
			
		||||
    array_test<nonaddressable>();
 | 
			
		||||
 | 
			
		||||
  const nonaddressable& cx = *px;
 | 
			
		||||
  BOOST_TEST(boost::addressof(cx) == static_cast<const nonaddressable*>(px));
 | 
			
		||||
 | 
			
		||||
  volatile nonaddressable& vx = *px;
 | 
			
		||||
  BOOST_TEST(boost::addressof(vx) == static_cast<volatile nonaddressable*>(px));
 | 
			
		||||
 | 
			
		||||
  const volatile nonaddressable& cvx = *px;
 | 
			
		||||
  BOOST_TEST(boost::addressof(cvx) == static_cast<const volatile nonaddressable*>(px));
 | 
			
		||||
  
 | 
			
		||||
  return 0;
 | 
			
		||||
    return boost::report_errors();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										95
									
								
								addressof_test2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								addressof_test2.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
// Copyright (C) 2002 Brad King (brad.king@kitware.com) 
 | 
			
		||||
//                    Douglas Gregor (gregod@cs.rpi.edu)
 | 
			
		||||
//
 | 
			
		||||
// Copyright 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)
 | 
			
		||||
 | 
			
		||||
// For more information, see http://www.boost.org
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/addressof.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
 | 
			
		||||
#pragma warning(push, 3)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
 | 
			
		||||
#pragma warning(pop)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_test.hpp>
 | 
			
		||||
 | 
			
		||||
template<class T> void scalar_test( T * = 0 )
 | 
			
		||||
{
 | 
			
		||||
    T* px = new T();
 | 
			
		||||
 | 
			
		||||
    T& x = *px;
 | 
			
		||||
    BOOST_TEST( boost::addressof(x) == px );
 | 
			
		||||
 | 
			
		||||
    const T& cx = *px;
 | 
			
		||||
    const T* pcx = boost::addressof(cx);
 | 
			
		||||
    BOOST_TEST( pcx == px );
 | 
			
		||||
 | 
			
		||||
    volatile T& vx = *px;
 | 
			
		||||
    volatile T* pvx = boost::addressof(vx);
 | 
			
		||||
    BOOST_TEST( pvx == px );
 | 
			
		||||
 | 
			
		||||
    const volatile T& cvx = *px;
 | 
			
		||||
    const volatile T* pcvx = boost::addressof(cvx);
 | 
			
		||||
    BOOST_TEST( pcvx == px );
 | 
			
		||||
 | 
			
		||||
    delete px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void array_test( T * = 0 )
 | 
			
		||||
{
 | 
			
		||||
    T nrg[3] = {1,2,3};
 | 
			
		||||
    T (*pnrg)[3] = &nrg;
 | 
			
		||||
    BOOST_TEST( boost::addressof(nrg) == pnrg );
 | 
			
		||||
 | 
			
		||||
    T const cnrg[3] = {1,2,3};
 | 
			
		||||
    T const (*pcnrg)[3] = &cnrg;
 | 
			
		||||
    BOOST_TEST( boost::addressof(cnrg) == pcnrg );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class convertible {
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    convertible( int = 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class U> operator U () const
 | 
			
		||||
    {
 | 
			
		||||
        return U();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class convertible2 {
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    convertible2( int = 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator convertible2* () const
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    scalar_test<convertible>();
 | 
			
		||||
    scalar_test<convertible2>();
 | 
			
		||||
 | 
			
		||||
    array_test<convertible>();
 | 
			
		||||
    array_test<convertible2>();
 | 
			
		||||
 | 
			
		||||
    return boost::report_errors();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								assert.html
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								assert.html
									
									
									
									
									
								
							@@ -7,10 +7,9 @@
 | 
			
		||||
	<body bgcolor="white" style="MARGIN-LEFT: 5%; MARGIN-RIGHT: 5%">
 | 
			
		||||
		<table border="0" width="100%">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td width="277">
 | 
			
		||||
					<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86">
 | 
			
		||||
				<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="middle">
 | 
			
		||||
				<td align="center">
 | 
			
		||||
					<h1>assert.hpp</h1>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
@@ -48,10 +47,15 @@ void assertion_failed(char const * expr, char const * function, char const * fil
 | 
			
		||||
		<P>As is the case with <STRONG><cassert></STRONG>, <STRONG><boost/assert.hpp></STRONG>
 | 
			
		||||
			can be included multiple times in a single translation unit. <STRONG>BOOST_ASSERT</STRONG>
 | 
			
		||||
			will be redefined each time as specified above.</P>
 | 
			
		||||
		<p><STRONG><boost/assert.hpp></STRONG> also defines the macro <STRONG>BOOST_VERIFY</STRONG>. 
 | 
			
		||||
			It has exactly the same behavior as <STRONG>BOOST_ASSERT</STRONG>, except that 
 | 
			
		||||
			the expression that is passed to <STRONG>BOOST_VERIFY</STRONG> is always 
 | 
			
		||||
			evaluated. This is useful when the asserted expression has desirable side 
 | 
			
		||||
			effects; it can also help suppress warnings about unused variables when the 
 | 
			
		||||
			only use of the variable is inside an assertion.</p>
 | 
			
		||||
		<p><br>
 | 
			
		||||
			<small>Copyright <20> 2002 by Peter Dimov. Permission to copy, use, modify, sell and 
 | 
			
		||||
				distribute this document is granted provided this copyright notice appears in 
 | 
			
		||||
				all copies. This document is provided "as is" without express or implied 
 | 
			
		||||
				warranty, and with no claim as to its suitability for any purpose.</small></p>
 | 
			
		||||
			<small>Copyright <20> 2002, 2007 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>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,10 +3,9 @@
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
//  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.
 | 
			
		||||
// 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/lightweight_test.hpp>
 | 
			
		||||
@@ -52,13 +51,18 @@ void test_disabled()
 | 
			
		||||
 | 
			
		||||
#define BOOST_ENABLE_ASSERT_HANDLER
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
 | 
			
		||||
int handler_invoked = 0;
 | 
			
		||||
 | 
			
		||||
void boost::assertion_failed(char const * expr, char const * function, char const * file, long line)
 | 
			
		||||
{
 | 
			
		||||
    std::printf("Expression: %s\nFunction: %s\nFile: %s\nLine: %ld\n\n", expr, function, file, line);
 | 
			
		||||
#if !defined(BOOST_NO_STDC_NAMESPACE)
 | 
			
		||||
    using std::printf;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    printf("Expression: %s\nFunction: %s\nFile: %s\nLine: %ld\n\n", expr, function, file, line);
 | 
			
		||||
    ++handler_invoked;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,15 +5,14 @@
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="white" link="blue" text="black" vlink="purple" alink="red"> 
 | 
			
		||||
<h1><img src="../../c++boost.gif" alt="C++ Boost" align="middle"
 | 
			
		||||
<h1><img src="../../boost.png" alt="C++ Boost" align="middle"
 | 
			
		||||
width="277" height="86">Base-from-Member Idiom</h1>
 | 
			
		||||
 | 
			
		||||
<p>The class template <code>boost::base_from_member</code> provides
 | 
			
		||||
a workaround for a class that needs to initialize a base class with a
 | 
			
		||||
member.  The class template is in <cite><a
 | 
			
		||||
href="../../boost/utility/base_from_member.hpp">boost/utility/base_from_member.hpp</a></cite>
 | 
			
		||||
which is included in <i><a href="../../boost/utility.hpp">boost/utility.hpp</a></i>.
 | 
			
		||||
The class template is forward declared in <i><a href="../../boost/utility_fwd.hpp">boost/utility_fwd.hpp</a></i>.</p>
 | 
			
		||||
which is included in <i><a href="../../boost/utility.hpp">boost/utility.hpp</a></i>.</p>
 | 
			
		||||
 | 
			
		||||
<p>There is test/example code in <cite><a
 | 
			
		||||
href="base_from_member_test.cpp">base_from_member_test.cpp</a></cite>.</p>
 | 
			
		||||
@@ -130,6 +129,10 @@ particular member type does not need to concern itself with the integer.</p>
 | 
			
		||||
<h2><a name="synopsis">Synopsis</a></h2>
 | 
			
		||||
 | 
			
		||||
<blockquote><pre>
 | 
			
		||||
#ifndef BOOST_BASE_FROM_MEMBER_MAX_ARITY
 | 
			
		||||
#define BOOST_BASE_FROM_MEMBER_MAX_ARITY  10
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template < typename MemberType, int UniqueID = 0 >
 | 
			
		||||
class boost::base_from_member
 | 
			
		||||
{
 | 
			
		||||
@@ -171,6 +174,14 @@ the template parameters of a templated constructor, make sure that
 | 
			
		||||
the arguments are already close as possible to the actual type used in
 | 
			
		||||
the data member's desired constructor.</p>
 | 
			
		||||
 | 
			
		||||
<p>The <var>BOOST_BASE_FROM_MEMBER_MAX_ARITY</var> macro constant specifies
 | 
			
		||||
the maximum argument length for the constructor templates.  The constant
 | 
			
		||||
may be overridden if more (or less) argument configurations are needed.  The
 | 
			
		||||
constant may be read for code that is expandable like the class template and
 | 
			
		||||
needs to maintain the same maximum size.  (Example code would be a class that
 | 
			
		||||
uses this class template as a base class for a member with a flexible set of
 | 
			
		||||
constructors.)</p>
 | 
			
		||||
 | 
			
		||||
<h2><a name="usage">Usage</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>With the starting example, the <code>fdoutbuf</code> sub-object needs
 | 
			
		||||
@@ -323,7 +334,7 @@ with the exact pointer type used in <code>switcher</code>'s constructor.</p>
 | 
			
		||||
<h3><a name="contributors">Contributors</a></h3>
 | 
			
		||||
 | 
			
		||||
<dl>
 | 
			
		||||
	<dt><a href="../../people/ed_brey.htm">Ed Brey</a>
 | 
			
		||||
	<dt><a href="http://www.boost.org/people/ed_brey.htm">Ed Brey</a>
 | 
			
		||||
	<dd>Suggested some interface changes.
 | 
			
		||||
 | 
			
		||||
	<dt><a href="http://www.moocat.org">R. Samuel Klatchko</a> (<a
 | 
			
		||||
@@ -332,21 +343,26 @@ with the exact pointer type used in <code>switcher</code>'s constructor.</p>
 | 
			
		||||
	<dd>Invented the idiom of how to use a class member for initializing
 | 
			
		||||
		a base class.
 | 
			
		||||
 | 
			
		||||
	<dt><a href="../../people/dietmar_kuehl.htm">Dietmar Kuehl</a>
 | 
			
		||||
	<dt><a href="http://www.boost.org/people/dietmar_kuehl.htm">Dietmar Kuehl</a>
 | 
			
		||||
	<dd>Popularized the base-from-member idiom in his
 | 
			
		||||
		<a href="http://www.informatik.uni-konstanz.de/~kuehl/c++/iostream/">IOStream
 | 
			
		||||
		example classes</a>.
 | 
			
		||||
 | 
			
		||||
	<dt><a href="../../people/daryle_walker.html">Daryle Walker</a>
 | 
			
		||||
	<dt>Jonathan Turkanis
 | 
			
		||||
	<dd>Supplied an implementation of generating the constructor templates that
 | 
			
		||||
		can be controlled and automated with macros.  The implementation uses
 | 
			
		||||
		the <a href="../preprocessor/index.html">Preprocessor library</a>.
 | 
			
		||||
 | 
			
		||||
	<dt><a href="http://www.boost.org/people/daryle_walker.html">Daryle Walker</a>
 | 
			
		||||
	<dd>Started the library.  Contributed the test file <cite><a
 | 
			
		||||
		href="base_from_member_test.cpp">base_from_member_test.cpp</a></cite>.
 | 
			
		||||
</dl>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
<p>Revised: 14 June 2003</p>
 | 
			
		||||
<p>Revised: 28 August 2004</p>
 | 
			
		||||
 | 
			
		||||
<p>Copyright 2001, 2003 Daryle Walker.  Use, modification, and distribution
 | 
			
		||||
<p>Copyright 2001, 2003, 2004 Daryle Walker.  Use, modification, and distribution
 | 
			
		||||
are subject to the Boost Software License, Version 1.0.  (See accompanying
 | 
			
		||||
file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or a copy at <<a
 | 
			
		||||
href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>>.)</p>
 | 
			
		||||
 
 | 
			
		||||
@@ -281,7 +281,7 @@ object_id_compare::operator ()
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            return a.second->before( *b.second );
 | 
			
		||||
            return a.second->before( *b.second ) != 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,7 @@
 | 
			
		||||
// (C) Copyright David Abrahams 2000. 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.
 | 
			
		||||
// (C) Copyright David Abrahams 2000.
 | 
			
		||||
// 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 <vector>
 | 
			
		||||
#include <string>
 | 
			
		||||
@@ -15,6 +14,7 @@
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <boost/detail/binary_search.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#if defined(__SGI_STL_PORT) ? defined(__SGI_STL_OWN_IOSTREAMS) : (!defined(__GNUC__) || __GNUC__ > 2)
 | 
			
		||||
# define USE_SSTREAM
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										647
									
								
								binary_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										647
									
								
								binary_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,647 @@
 | 
			
		||||
/*=============================================================================
 | 
			
		||||
    Copyright (c) 2006, 2007 Matthew Calabrese
 | 
			
		||||
 | 
			
		||||
    Use, modification and distribution is subject to 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/test/minimal.hpp>
 | 
			
		||||
#include <boost/utility/binary.hpp>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
#pragma warning(disable:4996) // warning C4996: 'std::equal': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Note: This file tests every single valid bit-grouping on its own, and some
 | 
			
		||||
      random combinations of bit-groupings.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
std::size_t const num_random_test_values = 32;
 | 
			
		||||
 | 
			
		||||
// Note: These hex values should all correspond with the binary array below
 | 
			
		||||
unsigned int const random_unsigned_ints_hex[num_random_test_values]
 | 
			
		||||
  = { 0x0103u, 0x77ebu, 0x5f36u, 0x1f18u, 0xc530u, 0xa73au, 0xd6f8u, 0x0919u
 | 
			
		||||
    , 0xfbb0u, 0x3e7cu, 0xd0e9u, 0x22c8u, 0x724eu, 0x14fau, 0xd98eu, 0x40b5
 | 
			
		||||
    , 0xeba0u, 0xfe50u, 0x688au, 0x1b05u, 0x5f9cu, 0xe4fcu, 0xa7b8u, 0xd3acu
 | 
			
		||||
    , 0x1dddu, 0xbf04u, 0x8352u, 0xe89cu, 0x7506u, 0xe767u, 0xf489u, 0xe167
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
unsigned int const random_unsigned_ints_binary[num_random_test_values]
 | 
			
		||||
  = { BOOST_BINARY( 0 00010000 0011 ), BOOST_BINARY( 0 11101 1111  101011 )
 | 
			
		||||
    , BOOST_BINARY( 010111 1100110 1 1 0 ), BOOST_BINARY( 000 1 11110 00 11000 )
 | 
			
		||||
    , BOOST_BINARY( 110 001010 0110 000 ), BOOST_BINARY( 1010 01110011 1010 )
 | 
			
		||||
    , BOOST_BINARY( 11 010 1 101111 1000 ), BOOST_BINARY( 0000 100100 0110 01 )
 | 
			
		||||
    , BOOST_BINARY( 1111 101110 11 0000 ), BOOST_BINARY( 00111110 01111100 )
 | 
			
		||||
    , BOOST_BINARY( 11  010 000111 01001 ), BOOST_BINARY( 00100 010110   01000 )
 | 
			
		||||
    , BOOST_BINARY( 01 11001001 001110 ), BOOST_BINARY( 0010 1001111 1010 )
 | 
			
		||||
    , BOOST_BINARY( 1101 1 00110 0 01110 ), BOOST_BINARY( 100 000 01011010 1 )
 | 
			
		||||
    , BOOST_BINARY( 11 1010 1110 1000 00 ), BOOST_BINARY( 11111 110010 10000 )
 | 
			
		||||
    , BOOST_BINARY( 01101 00010 001010 ), BOOST_BINARY( 000 11011 000001 01 )
 | 
			
		||||
    , BOOST_BINARY( 01 01111 1100111 00 ), BOOST_BINARY( 1 110010 0111111 00 )
 | 
			
		||||
    , BOOST_BINARY( 101 0011 11 01110 00 ), BOOST_BINARY( 110100 1 110101 100 )
 | 
			
		||||
    , BOOST_BINARY( 00 1110111 011 101 ), BOOST_BINARY( 1011 1111 00000 100 )
 | 
			
		||||
    , BOOST_BINARY( 1000 00110 101 0010 ), BOOST_BINARY( 1110  10001 001110 0 )
 | 
			
		||||
    , BOOST_BINARY( 011 1010100 000 110 ), BOOST_BINARY( 1110 0111 01100 111 )
 | 
			
		||||
    , BOOST_BINARY( 11110 10010 001001 ), BOOST_BINARY( 11 1000010 1100 111 )
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
unsigned int const unsigned_ints_1_bit[2] =
 | 
			
		||||
{ BOOST_BINARY( 0 )
 | 
			
		||||
, BOOST_BINARY( 1 )
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
unsigned int const unsigned_ints_2_bits[4] =
 | 
			
		||||
{ BOOST_BINARY( 00 )
 | 
			
		||||
, BOOST_BINARY( 01 )
 | 
			
		||||
, BOOST_BINARY( 10 )
 | 
			
		||||
, BOOST_BINARY( 11 )
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
unsigned int const unsigned_ints_3_bits[8] =
 | 
			
		||||
{ BOOST_BINARY( 000 )
 | 
			
		||||
, BOOST_BINARY( 001 )
 | 
			
		||||
, BOOST_BINARY( 010 )
 | 
			
		||||
, BOOST_BINARY( 011 )
 | 
			
		||||
, BOOST_BINARY( 100 )
 | 
			
		||||
, BOOST_BINARY( 101 )
 | 
			
		||||
, BOOST_BINARY( 110 )
 | 
			
		||||
, BOOST_BINARY( 111 )
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
unsigned int const unsigned_ints_4_bits[16] =
 | 
			
		||||
{ BOOST_BINARY( 0000 )
 | 
			
		||||
, BOOST_BINARY( 0001 )
 | 
			
		||||
, BOOST_BINARY( 0010 )
 | 
			
		||||
, BOOST_BINARY( 0011 )
 | 
			
		||||
, BOOST_BINARY( 0100 )
 | 
			
		||||
, BOOST_BINARY( 0101 )
 | 
			
		||||
, BOOST_BINARY( 0110 )
 | 
			
		||||
, BOOST_BINARY( 0111 )
 | 
			
		||||
, BOOST_BINARY( 1000 )
 | 
			
		||||
, BOOST_BINARY( 1001 )
 | 
			
		||||
, BOOST_BINARY( 1010 )
 | 
			
		||||
, BOOST_BINARY( 1011 )
 | 
			
		||||
, BOOST_BINARY( 1100 )
 | 
			
		||||
, BOOST_BINARY( 1101 )
 | 
			
		||||
, BOOST_BINARY( 1110 )
 | 
			
		||||
, BOOST_BINARY( 1111 )
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
unsigned int const unsigned_ints_5_bits[32] =
 | 
			
		||||
{ BOOST_BINARY( 00000 )
 | 
			
		||||
, BOOST_BINARY( 00001 )
 | 
			
		||||
, BOOST_BINARY( 00010 )
 | 
			
		||||
, BOOST_BINARY( 00011 )
 | 
			
		||||
, BOOST_BINARY( 00100 )
 | 
			
		||||
, BOOST_BINARY( 00101 )
 | 
			
		||||
, BOOST_BINARY( 00110 )
 | 
			
		||||
, BOOST_BINARY( 00111 )
 | 
			
		||||
, BOOST_BINARY( 01000 )
 | 
			
		||||
, BOOST_BINARY( 01001 )
 | 
			
		||||
, BOOST_BINARY( 01010 )
 | 
			
		||||
, BOOST_BINARY( 01011 )
 | 
			
		||||
, BOOST_BINARY( 01100 )
 | 
			
		||||
, BOOST_BINARY( 01101 )
 | 
			
		||||
, BOOST_BINARY( 01110 )
 | 
			
		||||
, BOOST_BINARY( 01111 )
 | 
			
		||||
, BOOST_BINARY( 10000 )
 | 
			
		||||
, BOOST_BINARY( 10001 )
 | 
			
		||||
, BOOST_BINARY( 10010 )
 | 
			
		||||
, BOOST_BINARY( 10011 )
 | 
			
		||||
, BOOST_BINARY( 10100 )
 | 
			
		||||
, BOOST_BINARY( 10101 )
 | 
			
		||||
, BOOST_BINARY( 10110 )
 | 
			
		||||
, BOOST_BINARY( 10111 )
 | 
			
		||||
, BOOST_BINARY( 11000 )
 | 
			
		||||
, BOOST_BINARY( 11001 )
 | 
			
		||||
, BOOST_BINARY( 11010 )
 | 
			
		||||
, BOOST_BINARY( 11011 )
 | 
			
		||||
, BOOST_BINARY( 11100 )
 | 
			
		||||
, BOOST_BINARY( 11101 )
 | 
			
		||||
, BOOST_BINARY( 11110 )
 | 
			
		||||
, BOOST_BINARY( 11111 )
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
unsigned int const unsigned_ints_6_bits[64] =
 | 
			
		||||
{ BOOST_BINARY( 000000 )
 | 
			
		||||
, BOOST_BINARY( 000001 )
 | 
			
		||||
, BOOST_BINARY( 000010 )
 | 
			
		||||
, BOOST_BINARY( 000011 )
 | 
			
		||||
, BOOST_BINARY( 000100 )
 | 
			
		||||
, BOOST_BINARY( 000101 )
 | 
			
		||||
, BOOST_BINARY( 000110 )
 | 
			
		||||
, BOOST_BINARY( 000111 )
 | 
			
		||||
, BOOST_BINARY( 001000 )
 | 
			
		||||
, BOOST_BINARY( 001001 )
 | 
			
		||||
, BOOST_BINARY( 001010 )
 | 
			
		||||
, BOOST_BINARY( 001011 )
 | 
			
		||||
, BOOST_BINARY( 001100 )
 | 
			
		||||
, BOOST_BINARY( 001101 )
 | 
			
		||||
, BOOST_BINARY( 001110 )
 | 
			
		||||
, BOOST_BINARY( 001111 )
 | 
			
		||||
, BOOST_BINARY( 010000 )
 | 
			
		||||
, BOOST_BINARY( 010001 )
 | 
			
		||||
, BOOST_BINARY( 010010 )
 | 
			
		||||
, BOOST_BINARY( 010011 )
 | 
			
		||||
, BOOST_BINARY( 010100 )
 | 
			
		||||
, BOOST_BINARY( 010101 )
 | 
			
		||||
, BOOST_BINARY( 010110 )
 | 
			
		||||
, BOOST_BINARY( 010111 )
 | 
			
		||||
, BOOST_BINARY( 011000 )
 | 
			
		||||
, BOOST_BINARY( 011001 )
 | 
			
		||||
, BOOST_BINARY( 011010 )
 | 
			
		||||
, BOOST_BINARY( 011011 )
 | 
			
		||||
, BOOST_BINARY( 011100 )
 | 
			
		||||
, BOOST_BINARY( 011101 )
 | 
			
		||||
, BOOST_BINARY( 011110 )
 | 
			
		||||
, BOOST_BINARY( 011111 )
 | 
			
		||||
, BOOST_BINARY( 100000 )
 | 
			
		||||
, BOOST_BINARY( 100001 )
 | 
			
		||||
, BOOST_BINARY( 100010 )
 | 
			
		||||
, BOOST_BINARY( 100011 )
 | 
			
		||||
, BOOST_BINARY( 100100 )
 | 
			
		||||
, BOOST_BINARY( 100101 )
 | 
			
		||||
, BOOST_BINARY( 100110 )
 | 
			
		||||
, BOOST_BINARY( 100111 )
 | 
			
		||||
, BOOST_BINARY( 101000 )
 | 
			
		||||
, BOOST_BINARY( 101001 )
 | 
			
		||||
, BOOST_BINARY( 101010 )
 | 
			
		||||
, BOOST_BINARY( 101011 )
 | 
			
		||||
, BOOST_BINARY( 101100 )
 | 
			
		||||
, BOOST_BINARY( 101101 )
 | 
			
		||||
, BOOST_BINARY( 101110 )
 | 
			
		||||
, BOOST_BINARY( 101111 )
 | 
			
		||||
, BOOST_BINARY( 110000 )
 | 
			
		||||
, BOOST_BINARY( 110001 )
 | 
			
		||||
, BOOST_BINARY( 110010 )
 | 
			
		||||
, BOOST_BINARY( 110011 )
 | 
			
		||||
, BOOST_BINARY( 110100 )
 | 
			
		||||
, BOOST_BINARY( 110101 )
 | 
			
		||||
, BOOST_BINARY( 110110 )
 | 
			
		||||
, BOOST_BINARY( 110111 )
 | 
			
		||||
, BOOST_BINARY( 111000 )
 | 
			
		||||
, BOOST_BINARY( 111001 )
 | 
			
		||||
, BOOST_BINARY( 111010 )
 | 
			
		||||
, BOOST_BINARY( 111011 )
 | 
			
		||||
, BOOST_BINARY( 111100 )
 | 
			
		||||
, BOOST_BINARY( 111101 )
 | 
			
		||||
, BOOST_BINARY( 111110 )
 | 
			
		||||
, BOOST_BINARY( 111111 )
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
unsigned int const unsigned_ints_7_bits[128] =
 | 
			
		||||
{ BOOST_BINARY( 0000000 )
 | 
			
		||||
, BOOST_BINARY( 0000001 )
 | 
			
		||||
, BOOST_BINARY( 0000010 )
 | 
			
		||||
, BOOST_BINARY( 0000011 )
 | 
			
		||||
, BOOST_BINARY( 0000100 )
 | 
			
		||||
, BOOST_BINARY( 0000101 )
 | 
			
		||||
, BOOST_BINARY( 0000110 )
 | 
			
		||||
, BOOST_BINARY( 0000111 )
 | 
			
		||||
, BOOST_BINARY( 0001000 )
 | 
			
		||||
, BOOST_BINARY( 0001001 )
 | 
			
		||||
, BOOST_BINARY( 0001010 )
 | 
			
		||||
, BOOST_BINARY( 0001011 )
 | 
			
		||||
, BOOST_BINARY( 0001100 )
 | 
			
		||||
, BOOST_BINARY( 0001101 )
 | 
			
		||||
, BOOST_BINARY( 0001110 )
 | 
			
		||||
, BOOST_BINARY( 0001111 )
 | 
			
		||||
, BOOST_BINARY( 0010000 )
 | 
			
		||||
, BOOST_BINARY( 0010001 )
 | 
			
		||||
, BOOST_BINARY( 0010010 )
 | 
			
		||||
, BOOST_BINARY( 0010011 )
 | 
			
		||||
, BOOST_BINARY( 0010100 )
 | 
			
		||||
, BOOST_BINARY( 0010101 )
 | 
			
		||||
, BOOST_BINARY( 0010110 )
 | 
			
		||||
, BOOST_BINARY( 0010111 )
 | 
			
		||||
, BOOST_BINARY( 0011000 )
 | 
			
		||||
, BOOST_BINARY( 0011001 )
 | 
			
		||||
, BOOST_BINARY( 0011010 )
 | 
			
		||||
, BOOST_BINARY( 0011011 )
 | 
			
		||||
, BOOST_BINARY( 0011100 )
 | 
			
		||||
, BOOST_BINARY( 0011101 )
 | 
			
		||||
, BOOST_BINARY( 0011110 )
 | 
			
		||||
, BOOST_BINARY( 0011111 )
 | 
			
		||||
, BOOST_BINARY( 0100000 )
 | 
			
		||||
, BOOST_BINARY( 0100001 )
 | 
			
		||||
, BOOST_BINARY( 0100010 )
 | 
			
		||||
, BOOST_BINARY( 0100011 )
 | 
			
		||||
, BOOST_BINARY( 0100100 )
 | 
			
		||||
, BOOST_BINARY( 0100101 )
 | 
			
		||||
, BOOST_BINARY( 0100110 )
 | 
			
		||||
, BOOST_BINARY( 0100111 )
 | 
			
		||||
, BOOST_BINARY( 0101000 )
 | 
			
		||||
, BOOST_BINARY( 0101001 )
 | 
			
		||||
, BOOST_BINARY( 0101010 )
 | 
			
		||||
, BOOST_BINARY( 0101011 )
 | 
			
		||||
, BOOST_BINARY( 0101100 )
 | 
			
		||||
, BOOST_BINARY( 0101101 )
 | 
			
		||||
, BOOST_BINARY( 0101110 )
 | 
			
		||||
, BOOST_BINARY( 0101111 )
 | 
			
		||||
, BOOST_BINARY( 0110000 )
 | 
			
		||||
, BOOST_BINARY( 0110001 )
 | 
			
		||||
, BOOST_BINARY( 0110010 )
 | 
			
		||||
, BOOST_BINARY( 0110011 )
 | 
			
		||||
, BOOST_BINARY( 0110100 )
 | 
			
		||||
, BOOST_BINARY( 0110101 )
 | 
			
		||||
, BOOST_BINARY( 0110110 )
 | 
			
		||||
, BOOST_BINARY( 0110111 )
 | 
			
		||||
, BOOST_BINARY( 0111000 )
 | 
			
		||||
, BOOST_BINARY( 0111001 )
 | 
			
		||||
, BOOST_BINARY( 0111010 )
 | 
			
		||||
, BOOST_BINARY( 0111011 )
 | 
			
		||||
, BOOST_BINARY( 0111100 )
 | 
			
		||||
, BOOST_BINARY( 0111101 )
 | 
			
		||||
, BOOST_BINARY( 0111110 )
 | 
			
		||||
, BOOST_BINARY( 0111111 )
 | 
			
		||||
, BOOST_BINARY( 1000000 )
 | 
			
		||||
, BOOST_BINARY( 1000001 )
 | 
			
		||||
, BOOST_BINARY( 1000010 )
 | 
			
		||||
, BOOST_BINARY( 1000011 )
 | 
			
		||||
, BOOST_BINARY( 1000100 )
 | 
			
		||||
, BOOST_BINARY( 1000101 )
 | 
			
		||||
, BOOST_BINARY( 1000110 )
 | 
			
		||||
, BOOST_BINARY( 1000111 )
 | 
			
		||||
, BOOST_BINARY( 1001000 )
 | 
			
		||||
, BOOST_BINARY( 1001001 )
 | 
			
		||||
, BOOST_BINARY( 1001010 )
 | 
			
		||||
, BOOST_BINARY( 1001011 )
 | 
			
		||||
, BOOST_BINARY( 1001100 )
 | 
			
		||||
, BOOST_BINARY( 1001101 )
 | 
			
		||||
, BOOST_BINARY( 1001110 )
 | 
			
		||||
, BOOST_BINARY( 1001111 )
 | 
			
		||||
, BOOST_BINARY( 1010000 )
 | 
			
		||||
, BOOST_BINARY( 1010001 )
 | 
			
		||||
, BOOST_BINARY( 1010010 )
 | 
			
		||||
, BOOST_BINARY( 1010011 )
 | 
			
		||||
, BOOST_BINARY( 1010100 )
 | 
			
		||||
, BOOST_BINARY( 1010101 )
 | 
			
		||||
, BOOST_BINARY( 1010110 )
 | 
			
		||||
, BOOST_BINARY( 1010111 )
 | 
			
		||||
, BOOST_BINARY( 1011000 )
 | 
			
		||||
, BOOST_BINARY( 1011001 )
 | 
			
		||||
, BOOST_BINARY( 1011010 )
 | 
			
		||||
, BOOST_BINARY( 1011011 )
 | 
			
		||||
, BOOST_BINARY( 1011100 )
 | 
			
		||||
, BOOST_BINARY( 1011101 )
 | 
			
		||||
, BOOST_BINARY( 1011110 )
 | 
			
		||||
, BOOST_BINARY( 1011111 )
 | 
			
		||||
, BOOST_BINARY( 1100000 )
 | 
			
		||||
, BOOST_BINARY( 1100001 )
 | 
			
		||||
, BOOST_BINARY( 1100010 )
 | 
			
		||||
, BOOST_BINARY( 1100011 )
 | 
			
		||||
, BOOST_BINARY( 1100100 )
 | 
			
		||||
, BOOST_BINARY( 1100101 )
 | 
			
		||||
, BOOST_BINARY( 1100110 )
 | 
			
		||||
, BOOST_BINARY( 1100111 )
 | 
			
		||||
, BOOST_BINARY( 1101000 )
 | 
			
		||||
, BOOST_BINARY( 1101001 )
 | 
			
		||||
, BOOST_BINARY( 1101010 )
 | 
			
		||||
, BOOST_BINARY( 1101011 )
 | 
			
		||||
, BOOST_BINARY( 1101100 )
 | 
			
		||||
, BOOST_BINARY( 1101101 )
 | 
			
		||||
, BOOST_BINARY( 1101110 )
 | 
			
		||||
, BOOST_BINARY( 1101111 )
 | 
			
		||||
, BOOST_BINARY( 1110000 )
 | 
			
		||||
, BOOST_BINARY( 1110001 )
 | 
			
		||||
, BOOST_BINARY( 1110010 )
 | 
			
		||||
, BOOST_BINARY( 1110011 )
 | 
			
		||||
, BOOST_BINARY( 1110100 )
 | 
			
		||||
, BOOST_BINARY( 1110101 )
 | 
			
		||||
, BOOST_BINARY( 1110110 )
 | 
			
		||||
, BOOST_BINARY( 1110111 )
 | 
			
		||||
, BOOST_BINARY( 1111000 )
 | 
			
		||||
, BOOST_BINARY( 1111001 )
 | 
			
		||||
, BOOST_BINARY( 1111010 )
 | 
			
		||||
, BOOST_BINARY( 1111011 )
 | 
			
		||||
, BOOST_BINARY( 1111100 )
 | 
			
		||||
, BOOST_BINARY( 1111101 )
 | 
			
		||||
, BOOST_BINARY( 1111110 )
 | 
			
		||||
, BOOST_BINARY( 1111111 )
 | 
			
		||||
};
 | 
			
		||||
unsigned int const unsigned_ints_8_bits[256] =
 | 
			
		||||
{ BOOST_BINARY( 00000000 )
 | 
			
		||||
, BOOST_BINARY( 00000001 )
 | 
			
		||||
, BOOST_BINARY( 00000010 )
 | 
			
		||||
, BOOST_BINARY( 00000011 )
 | 
			
		||||
, BOOST_BINARY( 00000100 )
 | 
			
		||||
, BOOST_BINARY( 00000101 )
 | 
			
		||||
, BOOST_BINARY( 00000110 )
 | 
			
		||||
, BOOST_BINARY( 00000111 )
 | 
			
		||||
, BOOST_BINARY( 00001000 )
 | 
			
		||||
, BOOST_BINARY( 00001001 )
 | 
			
		||||
, BOOST_BINARY( 00001010 )
 | 
			
		||||
, BOOST_BINARY( 00001011 )
 | 
			
		||||
, BOOST_BINARY( 00001100 )
 | 
			
		||||
, BOOST_BINARY( 00001101 )
 | 
			
		||||
, BOOST_BINARY( 00001110 )
 | 
			
		||||
, BOOST_BINARY( 00001111 )
 | 
			
		||||
, BOOST_BINARY( 00010000 )
 | 
			
		||||
, BOOST_BINARY( 00010001 )
 | 
			
		||||
, BOOST_BINARY( 00010010 )
 | 
			
		||||
, BOOST_BINARY( 00010011 )
 | 
			
		||||
, BOOST_BINARY( 00010100 )
 | 
			
		||||
, BOOST_BINARY( 00010101 )
 | 
			
		||||
, BOOST_BINARY( 00010110 )
 | 
			
		||||
, BOOST_BINARY( 00010111 )
 | 
			
		||||
, BOOST_BINARY( 00011000 )
 | 
			
		||||
, BOOST_BINARY( 00011001 )
 | 
			
		||||
, BOOST_BINARY( 00011010 )
 | 
			
		||||
, BOOST_BINARY( 00011011 )
 | 
			
		||||
, BOOST_BINARY( 00011100 )
 | 
			
		||||
, BOOST_BINARY( 00011101 )
 | 
			
		||||
, BOOST_BINARY( 00011110 )
 | 
			
		||||
, BOOST_BINARY( 00011111 )
 | 
			
		||||
, BOOST_BINARY( 00100000 )
 | 
			
		||||
, BOOST_BINARY( 00100001 )
 | 
			
		||||
, BOOST_BINARY( 00100010 )
 | 
			
		||||
, BOOST_BINARY( 00100011 )
 | 
			
		||||
, BOOST_BINARY( 00100100 )
 | 
			
		||||
, BOOST_BINARY( 00100101 )
 | 
			
		||||
, BOOST_BINARY( 00100110 )
 | 
			
		||||
, BOOST_BINARY( 00100111 )
 | 
			
		||||
, BOOST_BINARY( 00101000 )
 | 
			
		||||
, BOOST_BINARY( 00101001 )
 | 
			
		||||
, BOOST_BINARY( 00101010 )
 | 
			
		||||
, BOOST_BINARY( 00101011 )
 | 
			
		||||
, BOOST_BINARY( 00101100 )
 | 
			
		||||
, BOOST_BINARY( 00101101 )
 | 
			
		||||
, BOOST_BINARY( 00101110 )
 | 
			
		||||
, BOOST_BINARY( 00101111 )
 | 
			
		||||
, BOOST_BINARY( 00110000 )
 | 
			
		||||
, BOOST_BINARY( 00110001 )
 | 
			
		||||
, BOOST_BINARY( 00110010 )
 | 
			
		||||
, BOOST_BINARY( 00110011 )
 | 
			
		||||
, BOOST_BINARY( 00110100 )
 | 
			
		||||
, BOOST_BINARY( 00110101 )
 | 
			
		||||
, BOOST_BINARY( 00110110 )
 | 
			
		||||
, BOOST_BINARY( 00110111 )
 | 
			
		||||
, BOOST_BINARY( 00111000 )
 | 
			
		||||
, BOOST_BINARY( 00111001 )
 | 
			
		||||
, BOOST_BINARY( 00111010 )
 | 
			
		||||
, BOOST_BINARY( 00111011 )
 | 
			
		||||
, BOOST_BINARY( 00111100 )
 | 
			
		||||
, BOOST_BINARY( 00111101 )
 | 
			
		||||
, BOOST_BINARY( 00111110 )
 | 
			
		||||
, BOOST_BINARY( 00111111 )
 | 
			
		||||
, BOOST_BINARY( 01000000 )
 | 
			
		||||
, BOOST_BINARY( 01000001 )
 | 
			
		||||
, BOOST_BINARY( 01000010 )
 | 
			
		||||
, BOOST_BINARY( 01000011 )
 | 
			
		||||
, BOOST_BINARY( 01000100 )
 | 
			
		||||
, BOOST_BINARY( 01000101 )
 | 
			
		||||
, BOOST_BINARY( 01000110 )
 | 
			
		||||
, BOOST_BINARY( 01000111 )
 | 
			
		||||
, BOOST_BINARY( 01001000 )
 | 
			
		||||
, BOOST_BINARY( 01001001 )
 | 
			
		||||
, BOOST_BINARY( 01001010 )
 | 
			
		||||
, BOOST_BINARY( 01001011 )
 | 
			
		||||
, BOOST_BINARY( 01001100 )
 | 
			
		||||
, BOOST_BINARY( 01001101 )
 | 
			
		||||
, BOOST_BINARY( 01001110 )
 | 
			
		||||
, BOOST_BINARY( 01001111 )
 | 
			
		||||
, BOOST_BINARY( 01010000 )
 | 
			
		||||
, BOOST_BINARY( 01010001 )
 | 
			
		||||
, BOOST_BINARY( 01010010 )
 | 
			
		||||
, BOOST_BINARY( 01010011 )
 | 
			
		||||
, BOOST_BINARY( 01010100 )
 | 
			
		||||
, BOOST_BINARY( 01010101 )
 | 
			
		||||
, BOOST_BINARY( 01010110 )
 | 
			
		||||
, BOOST_BINARY( 01010111 )
 | 
			
		||||
, BOOST_BINARY( 01011000 )
 | 
			
		||||
, BOOST_BINARY( 01011001 )
 | 
			
		||||
, BOOST_BINARY( 01011010 )
 | 
			
		||||
, BOOST_BINARY( 01011011 )
 | 
			
		||||
, BOOST_BINARY( 01011100 )
 | 
			
		||||
, BOOST_BINARY( 01011101 )
 | 
			
		||||
, BOOST_BINARY( 01011110 )
 | 
			
		||||
, BOOST_BINARY( 01011111 )
 | 
			
		||||
, BOOST_BINARY( 01100000 )
 | 
			
		||||
, BOOST_BINARY( 01100001 )
 | 
			
		||||
, BOOST_BINARY( 01100010 )
 | 
			
		||||
, BOOST_BINARY( 01100011 )
 | 
			
		||||
, BOOST_BINARY( 01100100 )
 | 
			
		||||
, BOOST_BINARY( 01100101 )
 | 
			
		||||
, BOOST_BINARY( 01100110 )
 | 
			
		||||
, BOOST_BINARY( 01100111 )
 | 
			
		||||
, BOOST_BINARY( 01101000 )
 | 
			
		||||
, BOOST_BINARY( 01101001 )
 | 
			
		||||
, BOOST_BINARY( 01101010 )
 | 
			
		||||
, BOOST_BINARY( 01101011 )
 | 
			
		||||
, BOOST_BINARY( 01101100 )
 | 
			
		||||
, BOOST_BINARY( 01101101 )
 | 
			
		||||
, BOOST_BINARY( 01101110 )
 | 
			
		||||
, BOOST_BINARY( 01101111 )
 | 
			
		||||
, BOOST_BINARY( 01110000 )
 | 
			
		||||
, BOOST_BINARY( 01110001 )
 | 
			
		||||
, BOOST_BINARY( 01110010 )
 | 
			
		||||
, BOOST_BINARY( 01110011 )
 | 
			
		||||
, BOOST_BINARY( 01110100 )
 | 
			
		||||
, BOOST_BINARY( 01110101 )
 | 
			
		||||
, BOOST_BINARY( 01110110 )
 | 
			
		||||
, BOOST_BINARY( 01110111 )
 | 
			
		||||
, BOOST_BINARY( 01111000 )
 | 
			
		||||
, BOOST_BINARY( 01111001 )
 | 
			
		||||
, BOOST_BINARY( 01111010 )
 | 
			
		||||
, BOOST_BINARY( 01111011 )
 | 
			
		||||
, BOOST_BINARY( 01111100 )
 | 
			
		||||
, BOOST_BINARY( 01111101 )
 | 
			
		||||
, BOOST_BINARY( 01111110 )
 | 
			
		||||
, BOOST_BINARY( 01111111 )
 | 
			
		||||
, BOOST_BINARY( 10000000 )
 | 
			
		||||
, BOOST_BINARY( 10000001 )
 | 
			
		||||
, BOOST_BINARY( 10000010 )
 | 
			
		||||
, BOOST_BINARY( 10000011 )
 | 
			
		||||
, BOOST_BINARY( 10000100 )
 | 
			
		||||
, BOOST_BINARY( 10000101 )
 | 
			
		||||
, BOOST_BINARY( 10000110 )
 | 
			
		||||
, BOOST_BINARY( 10000111 )
 | 
			
		||||
, BOOST_BINARY( 10001000 )
 | 
			
		||||
, BOOST_BINARY( 10001001 )
 | 
			
		||||
, BOOST_BINARY( 10001010 )
 | 
			
		||||
, BOOST_BINARY( 10001011 )
 | 
			
		||||
, BOOST_BINARY( 10001100 )
 | 
			
		||||
, BOOST_BINARY( 10001101 )
 | 
			
		||||
, BOOST_BINARY( 10001110 )
 | 
			
		||||
, BOOST_BINARY( 10001111 )
 | 
			
		||||
, BOOST_BINARY( 10010000 )
 | 
			
		||||
, BOOST_BINARY( 10010001 )
 | 
			
		||||
, BOOST_BINARY( 10010010 )
 | 
			
		||||
, BOOST_BINARY( 10010011 )
 | 
			
		||||
, BOOST_BINARY( 10010100 )
 | 
			
		||||
, BOOST_BINARY( 10010101 )
 | 
			
		||||
, BOOST_BINARY( 10010110 )
 | 
			
		||||
, BOOST_BINARY( 10010111 )
 | 
			
		||||
, BOOST_BINARY( 10011000 )
 | 
			
		||||
, BOOST_BINARY( 10011001 )
 | 
			
		||||
, BOOST_BINARY( 10011010 )
 | 
			
		||||
, BOOST_BINARY( 10011011 )
 | 
			
		||||
, BOOST_BINARY( 10011100 )
 | 
			
		||||
, BOOST_BINARY( 10011101 )
 | 
			
		||||
, BOOST_BINARY( 10011110 )
 | 
			
		||||
, BOOST_BINARY( 10011111 )
 | 
			
		||||
, BOOST_BINARY( 10100000 )
 | 
			
		||||
, BOOST_BINARY( 10100001 )
 | 
			
		||||
, BOOST_BINARY( 10100010 )
 | 
			
		||||
, BOOST_BINARY( 10100011 )
 | 
			
		||||
, BOOST_BINARY( 10100100 )
 | 
			
		||||
, BOOST_BINARY( 10100101 )
 | 
			
		||||
, BOOST_BINARY( 10100110 )
 | 
			
		||||
, BOOST_BINARY( 10100111 )
 | 
			
		||||
, BOOST_BINARY( 10101000 )
 | 
			
		||||
, BOOST_BINARY( 10101001 )
 | 
			
		||||
, BOOST_BINARY( 10101010 )
 | 
			
		||||
, BOOST_BINARY( 10101011 )
 | 
			
		||||
, BOOST_BINARY( 10101100 )
 | 
			
		||||
, BOOST_BINARY( 10101101 )
 | 
			
		||||
, BOOST_BINARY( 10101110 )
 | 
			
		||||
, BOOST_BINARY( 10101111 )
 | 
			
		||||
, BOOST_BINARY( 10110000 )
 | 
			
		||||
, BOOST_BINARY( 10110001 )
 | 
			
		||||
, BOOST_BINARY( 10110010 )
 | 
			
		||||
, BOOST_BINARY( 10110011 )
 | 
			
		||||
, BOOST_BINARY( 10110100 )
 | 
			
		||||
, BOOST_BINARY( 10110101 )
 | 
			
		||||
, BOOST_BINARY( 10110110 )
 | 
			
		||||
, BOOST_BINARY( 10110111 )
 | 
			
		||||
, BOOST_BINARY( 10111000 )
 | 
			
		||||
, BOOST_BINARY( 10111001 )
 | 
			
		||||
, BOOST_BINARY( 10111010 )
 | 
			
		||||
, BOOST_BINARY( 10111011 )
 | 
			
		||||
, BOOST_BINARY( 10111100 )
 | 
			
		||||
, BOOST_BINARY( 10111101 )
 | 
			
		||||
, BOOST_BINARY( 10111110 )
 | 
			
		||||
, BOOST_BINARY( 10111111 )
 | 
			
		||||
, BOOST_BINARY( 11000000 )
 | 
			
		||||
, BOOST_BINARY( 11000001 )
 | 
			
		||||
, BOOST_BINARY( 11000010 )
 | 
			
		||||
, BOOST_BINARY( 11000011 )
 | 
			
		||||
, BOOST_BINARY( 11000100 )
 | 
			
		||||
, BOOST_BINARY( 11000101 )
 | 
			
		||||
, BOOST_BINARY( 11000110 )
 | 
			
		||||
, BOOST_BINARY( 11000111 )
 | 
			
		||||
, BOOST_BINARY( 11001000 )
 | 
			
		||||
, BOOST_BINARY( 11001001 )
 | 
			
		||||
, BOOST_BINARY( 11001010 )
 | 
			
		||||
, BOOST_BINARY( 11001011 )
 | 
			
		||||
, BOOST_BINARY( 11001100 )
 | 
			
		||||
, BOOST_BINARY( 11001101 )
 | 
			
		||||
, BOOST_BINARY( 11001110 )
 | 
			
		||||
, BOOST_BINARY( 11001111 )
 | 
			
		||||
, BOOST_BINARY( 11010000 )
 | 
			
		||||
, BOOST_BINARY( 11010001 )
 | 
			
		||||
, BOOST_BINARY( 11010010 )
 | 
			
		||||
, BOOST_BINARY( 11010011 )
 | 
			
		||||
, BOOST_BINARY( 11010100 )
 | 
			
		||||
, BOOST_BINARY( 11010101 )
 | 
			
		||||
, BOOST_BINARY( 11010110 )
 | 
			
		||||
, BOOST_BINARY( 11010111 )
 | 
			
		||||
, BOOST_BINARY( 11011000 )
 | 
			
		||||
, BOOST_BINARY( 11011001 )
 | 
			
		||||
, BOOST_BINARY( 11011010 )
 | 
			
		||||
, BOOST_BINARY( 11011011 )
 | 
			
		||||
, BOOST_BINARY( 11011100 )
 | 
			
		||||
, BOOST_BINARY( 11011101 )
 | 
			
		||||
, BOOST_BINARY( 11011110 )
 | 
			
		||||
, BOOST_BINARY( 11011111 )
 | 
			
		||||
, BOOST_BINARY( 11100000 )
 | 
			
		||||
, BOOST_BINARY( 11100001 )
 | 
			
		||||
, BOOST_BINARY( 11100010 )
 | 
			
		||||
, BOOST_BINARY( 11100011 )
 | 
			
		||||
, BOOST_BINARY( 11100100 )
 | 
			
		||||
, BOOST_BINARY( 11100101 )
 | 
			
		||||
, BOOST_BINARY( 11100110 )
 | 
			
		||||
, BOOST_BINARY( 11100111 )
 | 
			
		||||
, BOOST_BINARY( 11101000 )
 | 
			
		||||
, BOOST_BINARY( 11101001 )
 | 
			
		||||
, BOOST_BINARY( 11101010 )
 | 
			
		||||
, BOOST_BINARY( 11101011 )
 | 
			
		||||
, BOOST_BINARY( 11101100 )
 | 
			
		||||
, BOOST_BINARY( 11101101 )
 | 
			
		||||
, BOOST_BINARY( 11101110 )
 | 
			
		||||
, BOOST_BINARY( 11101111 )
 | 
			
		||||
, BOOST_BINARY( 11110000 )
 | 
			
		||||
, BOOST_BINARY( 11110001 )
 | 
			
		||||
, BOOST_BINARY( 11110010 )
 | 
			
		||||
, BOOST_BINARY( 11110011 )
 | 
			
		||||
, BOOST_BINARY( 11110100 )
 | 
			
		||||
, BOOST_BINARY( 11110101 )
 | 
			
		||||
, BOOST_BINARY( 11110110 )
 | 
			
		||||
, BOOST_BINARY( 11110111 )
 | 
			
		||||
, BOOST_BINARY( 11111000 )
 | 
			
		||||
, BOOST_BINARY( 11111001 )
 | 
			
		||||
, BOOST_BINARY( 11111010 )
 | 
			
		||||
, BOOST_BINARY( 11111011 )
 | 
			
		||||
, BOOST_BINARY( 11111100 )
 | 
			
		||||
, BOOST_BINARY( 11111101 )
 | 
			
		||||
, BOOST_BINARY( 11111110 )
 | 
			
		||||
, BOOST_BINARY( 11111111 )
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct left_is_not_one_less_than_right
 | 
			
		||||
{
 | 
			
		||||
  bool operator ()( unsigned int left, unsigned int right ) const
 | 
			
		||||
  {
 | 
			
		||||
    return right != left + 1;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< std::size_t Size >
 | 
			
		||||
bool is_ascending_from_0_array( unsigned int const (&array)[Size] )
 | 
			
		||||
{
 | 
			
		||||
  unsigned int const* const curr = array,
 | 
			
		||||
                    * const end  = array + Size;
 | 
			
		||||
 | 
			
		||||
  return    ( *curr == 0 )
 | 
			
		||||
         && (    std::adjacent_find( curr, end
 | 
			
		||||
                                   , left_is_not_one_less_than_right()
 | 
			
		||||
                                   )
 | 
			
		||||
              == end
 | 
			
		||||
            );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::size_t const unsigned_int_id = 1,
 | 
			
		||||
                  unsigned_long_int_id = 2;
 | 
			
		||||
 | 
			
		||||
typedef char (&unsigned_int_id_type)[unsigned_int_id];
 | 
			
		||||
typedef char (&unsigned_long_int_id_type)[unsigned_long_int_id];
 | 
			
		||||
 | 
			
		||||
// Note: Functions only used for type checking
 | 
			
		||||
unsigned_int_id_type      binary_type_checker( unsigned int );
 | 
			
		||||
unsigned_long_int_id_type binary_type_checker( unsigned long int );
 | 
			
		||||
 | 
			
		||||
int test_main( int, char *[] )
 | 
			
		||||
{
 | 
			
		||||
  BOOST_CHECK( is_ascending_from_0_array( unsigned_ints_1_bit ) );
 | 
			
		||||
  BOOST_CHECK( is_ascending_from_0_array( unsigned_ints_2_bits ) );
 | 
			
		||||
  BOOST_CHECK( is_ascending_from_0_array( unsigned_ints_3_bits ) );
 | 
			
		||||
  BOOST_CHECK( is_ascending_from_0_array( unsigned_ints_4_bits ) );
 | 
			
		||||
  BOOST_CHECK( is_ascending_from_0_array( unsigned_ints_5_bits ) );
 | 
			
		||||
  BOOST_CHECK( is_ascending_from_0_array( unsigned_ints_6_bits ) );
 | 
			
		||||
  BOOST_CHECK( is_ascending_from_0_array( unsigned_ints_7_bits ) );
 | 
			
		||||
  BOOST_CHECK( is_ascending_from_0_array( unsigned_ints_8_bits ) );
 | 
			
		||||
 | 
			
		||||
  BOOST_CHECK( std::equal( &random_unsigned_ints_hex[0]
 | 
			
		||||
                         , random_unsigned_ints_hex + num_random_test_values
 | 
			
		||||
                         , &random_unsigned_ints_binary[0]
 | 
			
		||||
                         )
 | 
			
		||||
             );
 | 
			
		||||
 | 
			
		||||
  BOOST_CHECK(    sizeof( binary_type_checker( BOOST_BINARY_U( 110100 1010 ) ) )
 | 
			
		||||
               == unsigned_int_id
 | 
			
		||||
             );
 | 
			
		||||
 | 
			
		||||
  BOOST_CHECK(    sizeof( binary_type_checker( BOOST_BINARY_UL( 11110 ) ) )
 | 
			
		||||
               == unsigned_long_int_id
 | 
			
		||||
             );
 | 
			
		||||
 | 
			
		||||
  BOOST_CHECK(    sizeof( binary_type_checker( BOOST_BINARY_LU( 10 0001 ) ) )
 | 
			
		||||
               == unsigned_long_int_id
 | 
			
		||||
             );
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -12,7 +12,7 @@ content="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot">
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF"
 | 
			
		||||
vlink="#800080">
 | 
			
		||||
 | 
			
		||||
<h1><img src="../../c++boost.gif" width="276" height="86">Header
 | 
			
		||||
<h1><img src="../../boost.png" width="276" height="86">Header
 | 
			
		||||
<<a href="../../boost/detail/call_traits.hpp">boost/call_traits.hpp</a>></h1>
 | 
			
		||||
 | 
			
		||||
<p>All of the contents of <boost/call_traits.hpp> are
 | 
			
		||||
@@ -606,7 +606,7 @@ template <bool opt>
 | 
			
		||||
struct filler
 | 
			
		||||
{
 | 
			
		||||
   template <typename I, typename T>
 | 
			
		||||
   static void do_fill(I first, I last, typename boost::call_traits<T>::param_type val);
 | 
			
		||||
   static void do_fill(I first, I last, typename boost::call_traits<T>::param_type val)
 | 
			
		||||
   {
 | 
			
		||||
      while(first != last)
 | 
			
		||||
      {
 | 
			
		||||
@@ -740,25 +740,16 @@ specialisation).</p>
 | 
			
		||||
 | 
			
		||||
<p>Revised 01 September 2000</p>
 | 
			
		||||
 | 
			
		||||
<p><EFBFBD> Copyright boost.org 2000. Permission to copy, use, modify,
 | 
			
		||||
sell and distribute this document is granted provided this
 | 
			
		||||
copyright notice appears in all copies. This document is provided
 | 
			
		||||
"as is" without express or implied warranty, and with
 | 
			
		||||
no claim as to its suitability for any purpose.</p>
 | 
			
		||||
 | 
			
		||||
<p>Based on contributions by Steve Cleary, Beman Dawes, Howard
 | 
			
		||||
Hinnant and John Maddock.</p>
 | 
			
		||||
 | 
			
		||||
<p>Maintained by <a href="mailto:john@johnmaddock.co.uk">John
 | 
			
		||||
Maddock</a>, the latest version of this file can be found at <a
 | 
			
		||||
href="http://www.boost.org/">www.boost.org</a>, and the boost
 | 
			
		||||
discussion list at <a
 | 
			
		||||
href="http://www.yahoogroups.com/list/boost">www.yahoogroups.com/list/boost</a>.</p>
 | 
			
		||||
 | 
			
		||||
<p>.</p>
 | 
			
		||||
 | 
			
		||||
<p> </p>
 | 
			
		||||
 | 
			
		||||
<p> </p>
 | 
			
		||||
   <p>
 | 
			
		||||
      Copyright 2000 Steve Cleary, Beman Dawes, Howard
 | 
			
		||||
      Hinnant and John Maddock. <br/>
 | 
			
		||||
      Use, modification and distribution are subject to the
 | 
			
		||||
      Boost Software License, Version 1.0.
 | 
			
		||||
      (See accompanying file LICENSE_1_0.txt
 | 
			
		||||
      or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
 | 
			
		||||
         http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
      </a>).
 | 
			
		||||
   </p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,14 +12,18 @@
 | 
			
		||||
// 03 Oct 2000:
 | 
			
		||||
//    Enabled extra tests for VC6.
 | 
			
		||||
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <iomanip>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <typeinfo>
 | 
			
		||||
#include <boost/call_traits.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/type_traits/type_traits_test.hpp>
 | 
			
		||||
#include <libs/type_traits/test/test.hpp>
 | 
			
		||||
#include <libs/type_traits/test/check_type.hpp>
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
#pragma warning(disable:4181) // : warning C4181: qualifier applied to reference type; ignored
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// a way prevent warnings for unused variables
 | 
			
		||||
template<class T> inline void unused_variable(const T&) {}
 | 
			
		||||
@@ -52,7 +56,8 @@ struct contained
 | 
			
		||||
   const_reference const_get()const { return v_; }
 | 
			
		||||
   // pass value:
 | 
			
		||||
   void call(param_type){}
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
   contained& operator=(const contained&);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
@@ -77,6 +82,8 @@ struct contained<T[N]>
 | 
			
		||||
   reference get() { return v_; }
 | 
			
		||||
   const_reference const_get()const { return v_; }
 | 
			
		||||
   void call(param_type){}
 | 
			
		||||
private:
 | 
			
		||||
   contained& operator=(const contained&);
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -121,9 +128,9 @@ void call_traits_checker<T>::operator()(param_type p)
 | 
			
		||||
   T t(p);
 | 
			
		||||
   contained<T> c(t);
 | 
			
		||||
   cout << "checking contained<" << typeid(T).name() << ">..." << endl;
 | 
			
		||||
   assert(t == c.value());
 | 
			
		||||
   assert(t == c.get());
 | 
			
		||||
   assert(t == c.const_get());
 | 
			
		||||
   BOOST_CHECK(t == c.value());
 | 
			
		||||
   BOOST_CHECK(t == c.get());
 | 
			
		||||
   BOOST_CHECK(t == c.const_get());
 | 
			
		||||
#ifndef __ICL
 | 
			
		||||
   //cout << "typeof contained<" << typeid(T).name() << ">::v_ is:           " << typeid(&contained<T>::v_).name() << endl;
 | 
			
		||||
   cout << "typeof contained<" << typeid(T).name() << ">::value() is:      " << typeid(&contained<T>::value).name() << endl;
 | 
			
		||||
@@ -145,11 +152,11 @@ struct call_traits_checker<T[N]>
 | 
			
		||||
      cout << "checking contained<" << typeid(T[N]).name() << ">..." << endl;
 | 
			
		||||
      unsigned int i = 0;
 | 
			
		||||
      for(i = 0; i < N; ++i)
 | 
			
		||||
         assert(t[i] == c.value()[i]);
 | 
			
		||||
         BOOST_CHECK(t[i] == c.value()[i]);
 | 
			
		||||
      for(i = 0; i < N; ++i)
 | 
			
		||||
         assert(t[i] == c.get()[i]);
 | 
			
		||||
         BOOST_CHECK(t[i] == c.get()[i]);
 | 
			
		||||
      for(i = 0; i < N; ++i)
 | 
			
		||||
         assert(t[i] == c.const_get()[i]);
 | 
			
		||||
         BOOST_CHECK(t[i] == c.const_get()[i]);
 | 
			
		||||
 | 
			
		||||
      cout << "typeof contained<" << typeid(T[N]).name() << ">::v_ is:         " << typeid(&contained<T[N]>::v_).name() << endl;
 | 
			
		||||
      cout << "typeof contained<" << typeid(T[N]).name() << ">::value is:      " << typeid(&contained<T[N]>::value).name() << endl;
 | 
			
		||||
@@ -167,7 +174,7 @@ template <class W, class U>
 | 
			
		||||
void check_wrap(const W& w, const U& u)
 | 
			
		||||
{
 | 
			
		||||
   cout << "checking " << typeid(W).name() << "..." << endl;
 | 
			
		||||
   assert(w.value() == u);
 | 
			
		||||
   BOOST_CHECK(w.value() == u);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
@@ -178,8 +185,8 @@ template <class T, class U, class V>
 | 
			
		||||
void check_make_pair(T c, U u, V v)
 | 
			
		||||
{
 | 
			
		||||
   cout << "checking std::pair<" << typeid(c.first).name() << ", " << typeid(c.second).name() << ">..." << endl;
 | 
			
		||||
   assert(c.first == u);
 | 
			
		||||
   assert(c.second == v);
 | 
			
		||||
   BOOST_CHECK(c.first == u);
 | 
			
		||||
   BOOST_CHECK(c.second == v);
 | 
			
		||||
   cout << endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -197,7 +204,7 @@ struct comparible_UDT
 | 
			
		||||
   bool operator == (const comparible_UDT& v){ return v.i_ == i_; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[ ])
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
   call_traits_checker<comparible_UDT> c1;
 | 
			
		||||
   comparible_UDT u;
 | 
			
		||||
@@ -231,73 +238,67 @@ int main(int argc, char *argv[ ])
 | 
			
		||||
   typedef int& r_type;
 | 
			
		||||
   typedef const r_type cr_type;
 | 
			
		||||
 | 
			
		||||
   type_test(comparible_UDT, boost::call_traits<comparible_UDT>::value_type)
 | 
			
		||||
   type_test(comparible_UDT&, boost::call_traits<comparible_UDT>::reference)
 | 
			
		||||
   type_test(const comparible_UDT&, boost::call_traits<comparible_UDT>::const_reference)
 | 
			
		||||
   type_test(const comparible_UDT&, boost::call_traits<comparible_UDT>::param_type)
 | 
			
		||||
   type_test(int, boost::call_traits<int>::value_type)
 | 
			
		||||
   type_test(int&, boost::call_traits<int>::reference)
 | 
			
		||||
   type_test(const int&, boost::call_traits<int>::const_reference)
 | 
			
		||||
   type_test(const int, boost::call_traits<int>::param_type)
 | 
			
		||||
   type_test(int*, boost::call_traits<int*>::value_type)
 | 
			
		||||
   type_test(int*&, boost::call_traits<int*>::reference)
 | 
			
		||||
   type_test(int*const&, boost::call_traits<int*>::const_reference)
 | 
			
		||||
   type_test(int*const, boost::call_traits<int*>::param_type)
 | 
			
		||||
   BOOST_CHECK_TYPE(comparible_UDT, boost::call_traits<comparible_UDT>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(comparible_UDT&, boost::call_traits<comparible_UDT>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const comparible_UDT&, boost::call_traits<comparible_UDT>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const comparible_UDT&, boost::call_traits<comparible_UDT>::param_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(int, boost::call_traits<int>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(int&, boost::call_traits<int>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int&, boost::call_traits<int>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int, boost::call_traits<int>::param_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(int*, boost::call_traits<int*>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(int*&, boost::call_traits<int*>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(int*const&, boost::call_traits<int*>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(int*const, boost::call_traits<int*>::param_type);
 | 
			
		||||
#if defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
   type_test(int&, boost::call_traits<int&>::value_type)
 | 
			
		||||
   type_test(int&, boost::call_traits<int&>::reference)
 | 
			
		||||
   type_test(const int&, boost::call_traits<int&>::const_reference)
 | 
			
		||||
   type_test(int&, boost::call_traits<int&>::param_type)
 | 
			
		||||
   BOOST_CHECK_TYPE(int&, boost::call_traits<int&>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(int&, boost::call_traits<int&>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int&, boost::call_traits<int&>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(int&, boost::call_traits<int&>::param_type);
 | 
			
		||||
#if !(defined(__GNUC__) && ((__GNUC__ < 3) || (__GNUC__ == 3) && (__GNUC_MINOR__ < 1)))
 | 
			
		||||
   type_test(int&, boost::call_traits<cr_type>::value_type)
 | 
			
		||||
   type_test(int&, boost::call_traits<cr_type>::reference)
 | 
			
		||||
   type_test(const int&, boost::call_traits<cr_type>::const_reference)
 | 
			
		||||
   type_test(int&, boost::call_traits<cr_type>::param_type)
 | 
			
		||||
   BOOST_CHECK_TYPE(int&, boost::call_traits<cr_type>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(int&, boost::call_traits<cr_type>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int&, boost::call_traits<cr_type>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(int&, boost::call_traits<cr_type>::param_type);
 | 
			
		||||
#else
 | 
			
		||||
   std::cout << "Your compiler cannot instantiate call_traits<int&const>, skipping four tests (4 errors)" << std::endl;
 | 
			
		||||
   failures += 4;
 | 
			
		||||
   test_count += 4;
 | 
			
		||||
#endif
 | 
			
		||||
   type_test(const int&, boost::call_traits<const int&>::value_type)
 | 
			
		||||
   type_test(const int&, boost::call_traits<const int&>::reference)
 | 
			
		||||
   type_test(const int&, boost::call_traits<const int&>::const_reference)
 | 
			
		||||
   type_test(const int&, boost::call_traits<const int&>::param_type)
 | 
			
		||||
   BOOST_CHECK_TYPE(const int&, boost::call_traits<const int&>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int&, boost::call_traits<const int&>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int&, boost::call_traits<const int&>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int&, boost::call_traits<const int&>::param_type);
 | 
			
		||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
   type_test(const int*, boost::call_traits<int[3]>::value_type)
 | 
			
		||||
   type_test(int(&)[3], boost::call_traits<int[3]>::reference)
 | 
			
		||||
   type_test(const int(&)[3], boost::call_traits<int[3]>::const_reference)
 | 
			
		||||
   type_test(const int*const, boost::call_traits<int[3]>::param_type)
 | 
			
		||||
   type_test(const int*, boost::call_traits<const int[3]>::value_type)
 | 
			
		||||
   type_test(const int(&)[3], boost::call_traits<const int[3]>::reference)
 | 
			
		||||
   type_test(const int(&)[3], boost::call_traits<const int[3]>::const_reference)
 | 
			
		||||
   type_test(const int*const, boost::call_traits<const int[3]>::param_type)
 | 
			
		||||
   BOOST_CHECK_TYPE(const int*, boost::call_traits<int[3]>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(int(&)[3], boost::call_traits<int[3]>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int(&)[3], boost::call_traits<int[3]>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int*const, boost::call_traits<int[3]>::param_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int*, boost::call_traits<const int[3]>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int(&)[3], boost::call_traits<const int[3]>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int(&)[3], boost::call_traits<const int[3]>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const int*const, boost::call_traits<const int[3]>::param_type);
 | 
			
		||||
   // test with abstract base class:
 | 
			
		||||
   type_test(test_abc1, boost::call_traits<test_abc1>::value_type)
 | 
			
		||||
   type_test(test_abc1&, boost::call_traits<test_abc1>::reference)
 | 
			
		||||
   type_test(const test_abc1&, boost::call_traits<test_abc1>::const_reference)
 | 
			
		||||
   type_test(const test_abc1&, boost::call_traits<test_abc1>::param_type)
 | 
			
		||||
   BOOST_CHECK_TYPE(test_abc1, boost::call_traits<test_abc1>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(test_abc1&, boost::call_traits<test_abc1>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const test_abc1&, boost::call_traits<test_abc1>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const test_abc1&, boost::call_traits<test_abc1>::param_type);
 | 
			
		||||
#else
 | 
			
		||||
   std::cout << "You're compiler does not support partial template specialiation, skipping 8 tests (8 errors)" << std::endl;
 | 
			
		||||
   failures += 12;
 | 
			
		||||
   test_count += 12;
 | 
			
		||||
#endif
 | 
			
		||||
#else
 | 
			
		||||
   std::cout << "You're compiler does not support partial template specialiation, skipping 20 tests (20 errors)" << std::endl;
 | 
			
		||||
   failures += 24;
 | 
			
		||||
   test_count += 24;
 | 
			
		||||
#endif
 | 
			
		||||
   // test with an incomplete type:
 | 
			
		||||
   type_test(incomplete_type, boost::call_traits<incomplete_type>::value_type)
 | 
			
		||||
   type_test(incomplete_type&, boost::call_traits<incomplete_type>::reference)
 | 
			
		||||
   type_test(const incomplete_type&, boost::call_traits<incomplete_type>::const_reference)
 | 
			
		||||
   type_test(const incomplete_type&, boost::call_traits<incomplete_type>::param_type)
 | 
			
		||||
   BOOST_CHECK_TYPE(incomplete_type, boost::call_traits<incomplete_type>::value_type);
 | 
			
		||||
   BOOST_CHECK_TYPE(incomplete_type&, boost::call_traits<incomplete_type>::reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const incomplete_type&, boost::call_traits<incomplete_type>::const_reference);
 | 
			
		||||
   BOOST_CHECK_TYPE(const incomplete_type&, boost::call_traits<incomplete_type>::param_type);
 | 
			
		||||
 | 
			
		||||
   return check_result(argc, argv);
 | 
			
		||||
   return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// define call_traits tests to check that the assertions in the docs do actually work
 | 
			
		||||
// this is an instantiate only set of tests:
 | 
			
		||||
// this is an compile-time only set of tests:
 | 
			
		||||
//
 | 
			
		||||
template <typename T, bool isarray = false>
 | 
			
		||||
struct call_traits_test
 | 
			
		||||
@@ -409,23 +410,3 @@ template struct call_traits_test<int[2], true>;
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && _MSC_VER <= 1300
 | 
			
		||||
unsigned int expected_failures = 14;
 | 
			
		||||
#elif defined(__SUNPRO_CC)
 | 
			
		||||
#if(__SUNPRO_CC <= 0x520)
 | 
			
		||||
unsigned int expected_failures = 18;
 | 
			
		||||
#elif(__SUNPRO_CC < 0x530)
 | 
			
		||||
unsigned int expected_failures = 17;
 | 
			
		||||
#else
 | 
			
		||||
unsigned int expected_failures = 6;
 | 
			
		||||
#endif
 | 
			
		||||
#elif defined(__BORLANDC__)
 | 
			
		||||
unsigned int expected_failures = 2;
 | 
			
		||||
#elif (defined(__GNUC__) && ((__GNUC__ < 3) || (__GNUC__ == 3) && (__GNUC_MINOR__ < 1)))
 | 
			
		||||
unsigned int expected_failures = 4;
 | 
			
		||||
#elif defined(__HP_aCC)
 | 
			
		||||
unsigned int expected_failures = 24;
 | 
			
		||||
#else
 | 
			
		||||
unsigned int expected_failures = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,9 @@
 | 
			
		||||
	<body bgcolor="white" style="MARGIN-LEFT: 5%; MARGIN-RIGHT: 5%">
 | 
			
		||||
		<table border="0" width="100%">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td width="277">
 | 
			
		||||
					<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86">
 | 
			
		||||
				<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="middle">
 | 
			
		||||
				<td align="center">
 | 
			
		||||
					<h1>checked_delete.hpp</h1>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
@@ -116,9 +115,8 @@ template<class T> struct checked_array_deleter
 | 
			
		||||
		</p>
 | 
			
		||||
		<p>
 | 
			
		||||
			<br>
 | 
			
		||||
			<small>Copyright <20> 2002 by Peter Dimov. Permission to copy, use, modify, sell and 
 | 
			
		||||
				distribute this document is granted provided this copyright notice appears in 
 | 
			
		||||
				all copies. This document is provided "as is" without express or implied 
 | 
			
		||||
				warranty, and with no claim as to its suitability for any purpose.</small></p>
 | 
			
		||||
			<small>Copyright <20> 2002 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>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
//  Boost checked_delete test program  ---------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.
 | 
			
		||||
//  See accompanying license for terms and conditions of use.
 | 
			
		||||
//  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/utility for documentation.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,30 +1,19 @@
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Type"
 | 
			
		||||
content="text/html; charset=iso-8859-1">
 | 
			
		||||
<meta name="Template"
 | 
			
		||||
content="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot">
 | 
			
		||||
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
 | 
			
		||||
<title>Header </title>
 | 
			
		||||
<boost/compressed_pair.hpp>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF"
 | 
			
		||||
vlink="#800080">
 | 
			
		||||
 | 
			
		||||
<h2><img src="../../c++boost.gif" width="276" height="86">Header
 | 
			
		||||
<<a href="../../boost/detail/compressed_pair.hpp">boost/compressed_pair.hpp</a>></h2>
 | 
			
		||||
 | 
			
		||||
<p>All of the contents of <boost/compressed_pair.hpp> are
 | 
			
		||||
defined inside namespace boost.</p>
 | 
			
		||||
 | 
			
		||||
<p>The class compressed pair is very similar to std::pair, but if
 | 
			
		||||
either of the template arguments are empty classes, then the
 | 
			
		||||
"empty base-class optimisation" is applied to compress
 | 
			
		||||
the size of the pair.</p>
 | 
			
		||||
 | 
			
		||||
<pre>template <class T1, class T2>
 | 
			
		||||
   <head>
 | 
			
		||||
      <title>Header </title>
 | 
			
		||||
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
      <meta name="Template" content="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot">
 | 
			
		||||
      <meta name="GENERATOR" content="Microsoft FrontPage 5.0">
 | 
			
		||||
      <boostcompressed_pair.hpp>
 | 
			
		||||
   </head>
 | 
			
		||||
   <body bgcolor="#ffffff" text="#000000" link="#0000ff" vlink="#800080">
 | 
			
		||||
      <h2><img src="../../boost.png" width="276" height="86">Header <<a href="../../boost/detail/compressed_pair.hpp">boost/compressed_pair.hpp</a>></h2>
 | 
			
		||||
      <p>All of the contents of <boost/compressed_pair.hpp> are defined inside 
 | 
			
		||||
         namespace boost.</p>
 | 
			
		||||
      <p>The class compressed pair is very similar to std::pair, but if either of the 
 | 
			
		||||
         template arguments are empty classes, then the "empty base-class optimisation" 
 | 
			
		||||
         is applied to compress the size of the pair.</p>
 | 
			
		||||
      <pre>template <class T1, class T2>
 | 
			
		||||
class compressed_pair
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
@@ -52,47 +41,36 @@ public:
 | 
			
		||||
 | 
			
		||||
	void swap(compressed_pair& y);
 | 
			
		||||
};</pre>
 | 
			
		||||
      <p>The two members of the pair can be accessed using the member functions first() 
 | 
			
		||||
         and second(). Note that not all member functions can be instantiated for all 
 | 
			
		||||
         template parameter types. In particular compressed_pair can be instantiated for 
 | 
			
		||||
         reference and array types, however in these cases the range of constructors 
 | 
			
		||||
         that can be used are limited. If types T1 and T2 are the same type, then there 
 | 
			
		||||
         is only one version of the single-argument constructor, and this constructor 
 | 
			
		||||
         initialises both values in the pair to the passed value.</p>
 | 
			
		||||
      <P>Note that if either member is a POD type, then that member is not 
 | 
			
		||||
         zero-initialized by the compressed_pair default constructor: it's up to you to 
 | 
			
		||||
         supply an initial value for these types if you want them to have a default 
 | 
			
		||||
         value.</P>
 | 
			
		||||
      <p>Note that compressed_pair can not be instantiated if either of the template 
 | 
			
		||||
         arguments is a union type, unless there is compiler support for 
 | 
			
		||||
         boost::is_union, or if boost::is_union is specialised for the union type.</p>
 | 
			
		||||
      <p>Finally, a word of caution for Visual C++ 6 users: if either argument is an 
 | 
			
		||||
         empty type, then assigning to that member will produce memory corruption, 
 | 
			
		||||
         unless the empty type has a "do nothing" assignment operator defined. This is 
 | 
			
		||||
         due to a bug in the way VC6 generates implicit assignment operators.</p>
 | 
			
		||||
      <h3>Acknowledgements</h3>
 | 
			
		||||
      <p>Based on contributions by Steve Cleary, Beman Dawes, Howard Hinnant and John 
 | 
			
		||||
         Maddock.</p>
 | 
			
		||||
      <p>Maintained by <a href="mailto:john@johnmaddock.co.uk">John Maddock</a>, the 
 | 
			
		||||
         latest version of this file can be found at <a href="http://www.boost.org">www.boost.org</a>, 
 | 
			
		||||
         and the boost discussion list at <a href="http://www.yahoogroups.com/list/boost">www.yahoogroups.com/list/boost</a>.</p>
 | 
			
		||||
      <hr>
 | 
			
		||||
      <p>Revised
 | 
			
		||||
      <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->07 November 2007<!--webbot bot="Timestamp" endspan i-checksum="40338" --></p>
 | 
			
		||||
      <p><EFBFBD> Copyright Beman Dawes, 2000.</p>
 | 
			
		||||
<p>Distributed under the Boost Software License, Version 1.0. See
 | 
			
		||||
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a></p>
 | 
			
		||||
 | 
			
		||||
<p>The two members of the pair can be accessed using the member
 | 
			
		||||
functions first() and second(). Note that not all member
 | 
			
		||||
functions can be instantiated for all template parameter types.
 | 
			
		||||
In particular compressed_pair can be instantiated for reference
 | 
			
		||||
and array types, however in these cases the range of constructors
 | 
			
		||||
that can be used are limited. If types T1 and T2 are the same
 | 
			
		||||
type, then there is only one version of the single-argument
 | 
			
		||||
constructor, and this constructor initialises both values in the
 | 
			
		||||
pair to the passed value.</p>
 | 
			
		||||
 | 
			
		||||
<p>Note that compressed_pair can not be instantiated if either of
 | 
			
		||||
the template arguments is a union type, unless there is compiler
 | 
			
		||||
support for boost::is_union, or if boost::is_union is specialised
 | 
			
		||||
for the union type.</p>
 | 
			
		||||
 | 
			
		||||
<p>Finally, a word of caution for Visual C++ 6 users: if either
 | 
			
		||||
argument is an empty type, then assigning to that member will
 | 
			
		||||
produce memory corruption, unless the empty type has a "do
 | 
			
		||||
nothing" assignment operator defined. This is due to a bug
 | 
			
		||||
in the way VC6 generates implicit assignment operators.</p>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
<p>Revised 08 May 2001</p>
 | 
			
		||||
 | 
			
		||||
<p><EFBFBD> Copyright boost.org 2000. Permission to copy, use, modify,
 | 
			
		||||
sell and distribute this document is granted provided this
 | 
			
		||||
copyright notice appears in all copies. This document is provided
 | 
			
		||||
"as is" without express or implied warranty, and with
 | 
			
		||||
no claim as to its suitability for any purpose.</p>
 | 
			
		||||
 | 
			
		||||
<p>Based on contributions by Steve Cleary, Beman Dawes, Howard
 | 
			
		||||
Hinnant and John Maddock.</p>
 | 
			
		||||
 | 
			
		||||
<p>Maintained by <a href="mailto:john@johnmaddock.co.uk">John
 | 
			
		||||
Maddock</a>, the latest version of this file can be found at <a
 | 
			
		||||
href="http://www.boost.org">www.boost.org</a>, and the boost
 | 
			
		||||
discussion list at <a
 | 
			
		||||
href="http://www.yahoogroups.com/list/boost">www.yahoogroups.com/list/boost</a>.</p>
 | 
			
		||||
 | 
			
		||||
<p> </p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
   </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -14,29 +14,23 @@
 | 
			
		||||
#include <cassert>
 | 
			
		||||
 | 
			
		||||
#include <boost/compressed_pair.hpp>
 | 
			
		||||
#include <boost/type_traits/type_traits_test.hpp>
 | 
			
		||||
#define BOOST_INCLUDE_MAIN
 | 
			
		||||
#include <boost/test/test_tools.hpp>
 | 
			
		||||
 | 
			
		||||
using namespace boost;
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
 | 
			
		||||
template <> struct is_empty<empty_UDT>
 | 
			
		||||
{ static const bool value = true; };
 | 
			
		||||
template <> struct is_empty<empty_POD_UDT>
 | 
			
		||||
{ static const bool value = true; };
 | 
			
		||||
template <> struct is_POD<empty_POD_UDT>
 | 
			
		||||
{ static const bool value = true; };
 | 
			
		||||
#else
 | 
			
		||||
template <> struct is_empty<empty_UDT>
 | 
			
		||||
{ enum{ value = true }; };
 | 
			
		||||
template <> struct is_empty<empty_POD_UDT>
 | 
			
		||||
{ enum{ value = true }; };
 | 
			
		||||
template <> struct is_POD<empty_POD_UDT>
 | 
			
		||||
{ enum{ value = true }; };
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
struct empty_UDT
 | 
			
		||||
{
 | 
			
		||||
   ~empty_UDT(){};
 | 
			
		||||
   empty_UDT& operator=(const empty_UDT&){ return *this; }
 | 
			
		||||
   bool operator==(const empty_UDT&)const
 | 
			
		||||
   { return true; }
 | 
			
		||||
};
 | 
			
		||||
struct empty_POD_UDT
 | 
			
		||||
{
 | 
			
		||||
   empty_POD_UDT& operator=(const empty_POD_UDT&){ return *this; }
 | 
			
		||||
   bool operator==(const empty_POD_UDT&)const
 | 
			
		||||
   { return true; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct non_empty1
 | 
			
		||||
{ 
 | 
			
		||||
@@ -85,47 +79,47 @@ void compressed_pair_tester<T1, T2>::test(first_param_type p1, second_param_type
 | 
			
		||||
   // first param construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp2(p1);
 | 
			
		||||
   cp2.second() = p2;
 | 
			
		||||
   BOOST_TEST(cp2.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp2.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp2.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp2.second() == p2);
 | 
			
		||||
   // second param construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp3(p2);
 | 
			
		||||
   cp3.first() = p1;
 | 
			
		||||
   BOOST_TEST(cp3.second() == p2);
 | 
			
		||||
   BOOST_TEST(cp3.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp3.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp3.first() == p1);
 | 
			
		||||
   // both param construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp4(p1, p2);
 | 
			
		||||
   BOOST_TEST(cp4.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp4.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp4.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp4.second() == p2);
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp5(p3, p4);
 | 
			
		||||
   BOOST_TEST(cp5.first() == p3);
 | 
			
		||||
   BOOST_TEST(cp5.second() == p4);
 | 
			
		||||
   BOOST_CHECK(cp5.first() == p3);
 | 
			
		||||
   BOOST_CHECK(cp5.second() == p4);
 | 
			
		||||
   // check const members:
 | 
			
		||||
   const boost::compressed_pair<T1,T2>& cpr1 = cp4;
 | 
			
		||||
   BOOST_TEST(cpr1.first() == p1);
 | 
			
		||||
   BOOST_TEST(cpr1.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cpr1.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cpr1.second() == p2);
 | 
			
		||||
 | 
			
		||||
   // copy construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp6(cp4);
 | 
			
		||||
   BOOST_TEST(cp6.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp6.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp6.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp6.second() == p2);
 | 
			
		||||
   // assignment:
 | 
			
		||||
   cp1 = cp4;
 | 
			
		||||
   BOOST_TEST(cp1.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp1.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp1.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp1.second() == p2);
 | 
			
		||||
   cp1 = cp5;
 | 
			
		||||
   BOOST_TEST(cp1.first() == p3);
 | 
			
		||||
   BOOST_TEST(cp1.second() == p4);
 | 
			
		||||
   BOOST_CHECK(cp1.first() == p3);
 | 
			
		||||
   BOOST_CHECK(cp1.second() == p4);
 | 
			
		||||
   // swap:
 | 
			
		||||
   cp4.swap(cp5);
 | 
			
		||||
   BOOST_TEST(cp4.first() == p3);
 | 
			
		||||
   BOOST_TEST(cp4.second() == p4);
 | 
			
		||||
   BOOST_TEST(cp5.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp5.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp4.first() == p3);
 | 
			
		||||
   BOOST_CHECK(cp4.second() == p4);
 | 
			
		||||
   BOOST_CHECK(cp5.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp5.second() == p2);
 | 
			
		||||
   swap(cp4,cp5);
 | 
			
		||||
   BOOST_TEST(cp4.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp4.second() == p2);
 | 
			
		||||
   BOOST_TEST(cp5.first() == p3);
 | 
			
		||||
   BOOST_TEST(cp5.second() == p4);
 | 
			
		||||
   BOOST_CHECK(cp4.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp4.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp5.first() == p3);
 | 
			
		||||
   BOOST_CHECK(cp5.second() == p4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
@@ -154,20 +148,20 @@ void compressed_pair_reference_tester<T1, T2>::test(first_param_type p1, second_
 | 
			
		||||
#endif
 | 
			
		||||
   // both param construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp4(p1, p2);
 | 
			
		||||
   BOOST_TEST(cp4.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp4.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp4.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp4.second() == p2);
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp5(p3, p4);
 | 
			
		||||
   BOOST_TEST(cp5.first() == p3);
 | 
			
		||||
   BOOST_TEST(cp5.second() == p4);
 | 
			
		||||
   BOOST_CHECK(cp5.first() == p3);
 | 
			
		||||
   BOOST_CHECK(cp5.second() == p4);
 | 
			
		||||
   // check const members:
 | 
			
		||||
   const boost::compressed_pair<T1,T2>& cpr1 = cp4;
 | 
			
		||||
   BOOST_TEST(cpr1.first() == p1);
 | 
			
		||||
   BOOST_TEST(cpr1.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cpr1.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cpr1.second() == p2);
 | 
			
		||||
 | 
			
		||||
   // copy construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp6(cp4);
 | 
			
		||||
   BOOST_TEST(cp6.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp6.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp6.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp6.second() == p2);
 | 
			
		||||
   // assignment:
 | 
			
		||||
   // VC6 bug:
 | 
			
		||||
   // When second() is an empty class, VC6 performs the
 | 
			
		||||
@@ -180,8 +174,8 @@ void compressed_pair_reference_tester<T1, T2>::test(first_param_type p1, second_
 | 
			
		||||
   // settings - some generate the problem others do not.
 | 
			
		||||
   cp4.first() = p3;
 | 
			
		||||
   cp4.second() = p4;
 | 
			
		||||
   BOOST_TEST(cp4.first() == p3);
 | 
			
		||||
   BOOST_TEST(cp4.second() == p4);
 | 
			
		||||
   BOOST_CHECK(cp4.first() == p3);
 | 
			
		||||
   BOOST_CHECK(cp4.second() == p4);
 | 
			
		||||
}
 | 
			
		||||
//
 | 
			
		||||
// supplimentary tests for case where first arg only is a reference type:
 | 
			
		||||
@@ -205,8 +199,8 @@ void compressed_pair_reference1_tester<T1, T2>::test(first_param_type p1, second
 | 
			
		||||
   // first param construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp2(p1);
 | 
			
		||||
   cp2.second() = p2;
 | 
			
		||||
   BOOST_TEST(cp2.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp2.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp2.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp2.second() == p2);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
//
 | 
			
		||||
@@ -231,8 +225,8 @@ void compressed_pair_reference2_tester<T1, T2>::test(first_param_type p1, second
 | 
			
		||||
   // second param construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp3(p2);
 | 
			
		||||
   cp3.first() = p1;
 | 
			
		||||
   BOOST_TEST(cp3.second() == p2);
 | 
			
		||||
   BOOST_TEST(cp3.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp3.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp3.first() == p1);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -259,14 +253,14 @@ void compressed_pair_array1_tester<T1, T2>::test(first_param_type p1, second_par
 | 
			
		||||
   // second param construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp3(p2);
 | 
			
		||||
   cp3.first()[0] = p1[0];
 | 
			
		||||
   BOOST_TEST(cp3.second() == p2);
 | 
			
		||||
   BOOST_TEST(cp3.first()[0] == p1[0]);
 | 
			
		||||
   BOOST_CHECK(cp3.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cp3.first()[0] == p1[0]);
 | 
			
		||||
   // check const members:
 | 
			
		||||
   const boost::compressed_pair<T1,T2>& cpr1 = cp3;
 | 
			
		||||
   BOOST_TEST(cpr1.first()[0] == p1[0]);
 | 
			
		||||
   BOOST_TEST(cpr1.second() == p2);
 | 
			
		||||
   BOOST_CHECK(cpr1.first()[0] == p1[0]);
 | 
			
		||||
   BOOST_CHECK(cpr1.second() == p2);
 | 
			
		||||
 | 
			
		||||
   BOOST_TEST(sizeof(T1) == sizeof(cp1.first()));
 | 
			
		||||
   BOOST_CHECK(sizeof(T1) == sizeof(cp1.first()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class T1, class T2>
 | 
			
		||||
@@ -289,14 +283,14 @@ void compressed_pair_array2_tester<T1, T2>::test(first_param_type p1, second_par
 | 
			
		||||
   // first param construct:
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp2(p1);
 | 
			
		||||
   cp2.second()[0] = p2[0];
 | 
			
		||||
   BOOST_TEST(cp2.first() == p1);
 | 
			
		||||
   BOOST_TEST(cp2.second()[0] == p2[0]);
 | 
			
		||||
   BOOST_CHECK(cp2.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cp2.second()[0] == p2[0]);
 | 
			
		||||
   // check const members:
 | 
			
		||||
   const boost::compressed_pair<T1,T2>& cpr1 = cp2;
 | 
			
		||||
   BOOST_TEST(cpr1.first() == p1);
 | 
			
		||||
   BOOST_TEST(cpr1.second()[0] == p2[0]);
 | 
			
		||||
   BOOST_CHECK(cpr1.first() == p1);
 | 
			
		||||
   BOOST_CHECK(cpr1.second()[0] == p2[0]);
 | 
			
		||||
 | 
			
		||||
   BOOST_TEST(sizeof(T2) == sizeof(cp1.second()));
 | 
			
		||||
   BOOST_CHECK(sizeof(T2) == sizeof(cp1.second()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class T1, class T2>
 | 
			
		||||
@@ -318,15 +312,15 @@ void compressed_pair_array_tester<T1, T2>::test(first_param_type p1, second_para
 | 
			
		||||
   boost::compressed_pair<T1,T2> cp1;
 | 
			
		||||
   cp1.first()[0] = p1[0];
 | 
			
		||||
   cp1.second()[0] = p2[0];
 | 
			
		||||
   BOOST_TEST(cp1.first()[0] == p1[0]);
 | 
			
		||||
   BOOST_TEST(cp1.second()[0] == p2[0]);
 | 
			
		||||
   BOOST_CHECK(cp1.first()[0] == p1[0]);
 | 
			
		||||
   BOOST_CHECK(cp1.second()[0] == p2[0]);
 | 
			
		||||
   // check const members:
 | 
			
		||||
   const boost::compressed_pair<T1,T2>& cpr1 = cp1;
 | 
			
		||||
   BOOST_TEST(cpr1.first()[0] == p1[0]);
 | 
			
		||||
   BOOST_TEST(cpr1.second()[0] == p2[0]);
 | 
			
		||||
   BOOST_CHECK(cpr1.first()[0] == p1[0]);
 | 
			
		||||
   BOOST_CHECK(cpr1.second()[0] == p2[0]);
 | 
			
		||||
 | 
			
		||||
   BOOST_TEST(sizeof(T1) == sizeof(cp1.first()));
 | 
			
		||||
   BOOST_TEST(sizeof(T2) == sizeof(cp1.second()));
 | 
			
		||||
   BOOST_CHECK(sizeof(T1) == sizeof(cp1.first()));
 | 
			
		||||
   BOOST_CHECK(sizeof(T2) == sizeof(cp1.second()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int test_main(int, char *[])
 | 
			
		||||
 
 | 
			
		||||
@@ -1,325 +0,0 @@
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 | 
			
		||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
 | 
			
		||||
<meta name="ProgId" content="FrontPage.Editor.Document">
 | 
			
		||||
<title>Counting Iterator Adaptor Documentation</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
 | 
			
		||||
<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)"
 | 
			
		||||
align="center" width="277" height="86">
 | 
			
		||||
 | 
			
		||||
<h1>Counting Iterator Adaptor</h1>
 | 
			
		||||
 | 
			
		||||
Defined in header
 | 
			
		||||
<a href="../../boost/counting_iterator.hpp">boost/counting_iterator.hpp</a>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
How would you fill up a vector with the numbers zero
 | 
			
		||||
through one hundred using <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/copy.html"><tt>std::copy()</tt></a>? The
 | 
			
		||||
only iterator operation missing from builtin integer types is an
 | 
			
		||||
<tt>operator*()</tt> that returns the current
 | 
			
		||||
value of the integer.  The counting iterator adaptor adds this crucial piece of
 | 
			
		||||
functionality to whatever type it wraps. One can use the
 | 
			
		||||
counting iterator adaptor not only with integer types, but with any
 | 
			
		||||
type that is <tt>Incrementable</tt> (see type requirements <a href="#requirements">below</a>).  The
 | 
			
		||||
following <b>pseudo-code</b> shows the general idea of how the
 | 
			
		||||
counting iterator is implemented.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
  // inside a hypothetical counting_iterator class...
 | 
			
		||||
  typedef Incrementable value_type;
 | 
			
		||||
  value_type counting_iterator::operator*() const {
 | 
			
		||||
    return this->base; // no dereference!
 | 
			
		||||
  }
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
All of the other operators of the counting iterator behave in the same
 | 
			
		||||
fashion as the <tt>Incrementable</tt> base type.
 | 
			
		||||
 | 
			
		||||
<h2>Synopsis</h2>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
namespace boost {
 | 
			
		||||
  template <class Incrementable>
 | 
			
		||||
  struct <a href="#counting_iterator_traits">counting_iterator_traits</a>;
 | 
			
		||||
 | 
			
		||||
  template <class Incrementable>
 | 
			
		||||
  struct <a href="#counting_iterator_generator">counting_iterator_generator</a>;
 | 
			
		||||
 | 
			
		||||
  template <class Incrementable>
 | 
			
		||||
  typename counting_iterator_generator<Incrementable>::type
 | 
			
		||||
  <a href="#make_counting_iterator">make_counting_iterator</a>(Incrementable x);
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
<h2><a name="counting_iterator_generator">The Counting Iterator Type
 | 
			
		||||
Generator</a></h2>
 | 
			
		||||
 | 
			
		||||
The class template <tt>counting_iterator_generator<Incrementable></tt> is a <a href="../../more/generic_programming.html#type_generator">type generator</a> for counting iterators.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
template <class Incrementable>
 | 
			
		||||
class counting_iterator_generator
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    typedef <a href="./iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...> type;
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
In this example we use the counting iterator generator to create a
 | 
			
		||||
counting iterator, and count from zero to four.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <boost/counting_iterator.hpp>
 | 
			
		||||
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  // Example of using counting_iterator_generator
 | 
			
		||||
  std::cout << "counting from 0 to 4:" << std::endl;
 | 
			
		||||
  boost::counting_iterator_generator<int>::type first(0), last(4);
 | 
			
		||||
  std::copy(first, last, std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // to be continued...
 | 
			
		||||
</pre>
 | 
			
		||||
The output from this part is:
 | 
			
		||||
<pre>
 | 
			
		||||
counting from 0 to 4:
 | 
			
		||||
0 1 2 3 
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
<Table border>
 | 
			
		||||
<TR>
 | 
			
		||||
<TH>Parameter</TH><TH>Description</TH>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>Incrementable</tt></TD>
 | 
			
		||||
<TD>The type being wrapped by the adaptor.</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
</Table>
 | 
			
		||||
 | 
			
		||||
<h3>Model of</h3>
 | 
			
		||||
 | 
			
		||||
If the <tt>Incrementable</tt> type has all of the functionality of a
 | 
			
		||||
<a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
Access Iterator</a> except the <tt>operator*()</tt>, then the counting
 | 
			
		||||
iterator will be a model of <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
Access Iterator</a>. If the <tt>Incrementable</tt> type has less
 | 
			
		||||
functionality, then the counting iterator will have correspondingly
 | 
			
		||||
less functionality.
 | 
			
		||||
 | 
			
		||||
<h3><a name="requirements">Type Requirements</a></h3>
 | 
			
		||||
 | 
			
		||||
The <tt>Incrementable</tt> type must be <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default
 | 
			
		||||
Constructible</a>, <a href="./CopyConstructible.html">Copy
 | 
			
		||||
Constructible</a>, and <a href="./Assignable.html">Assignable</a>.
 | 
			
		||||
Also, the <tt>Incrementable</tt> type must provide access to an
 | 
			
		||||
associated <tt>difference_type</tt> and <tt>iterator_category</tt>
 | 
			
		||||
through the <a
 | 
			
		||||
href="#counting_iterator_traits"><tt>counting_iterator_traits</tt></a>
 | 
			
		||||
class.
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Furthermore, if you wish to create a counting iterator that is a <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/ForwardIterator.html"> Forward
 | 
			
		||||
Iterator</a>, then the following expressions must be valid:
 | 
			
		||||
<pre>
 | 
			
		||||
Incrementable i, j;
 | 
			
		||||
++i         // pre-increment
 | 
			
		||||
i == j      // operator equal
 | 
			
		||||
</pre>
 | 
			
		||||
If you wish to create a counting iterator that is a <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/BidirectionalIterator.html">
 | 
			
		||||
Bidirectional Iterator</a>, then pre-decrement is also required:
 | 
			
		||||
<pre>
 | 
			
		||||
--i
 | 
			
		||||
</pre>
 | 
			
		||||
If you wish to create a counting iterator that is a <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html"> Random
 | 
			
		||||
Access Iterator</a>, then these additional expressions are also required:
 | 
			
		||||
<pre>
 | 
			
		||||
<a href="#counting_iterator_traits">counting_iterator_traits</a><Incrementable>::difference_type n;
 | 
			
		||||
i += n
 | 
			
		||||
n = i - j
 | 
			
		||||
i < j
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Members</h3>
 | 
			
		||||
 | 
			
		||||
The counting iterator type implements the member functions and
 | 
			
		||||
operators required of the <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
Access Iterator</a> concept. In addition it has the following
 | 
			
		||||
constructor:
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
counting_iterator_generator::type(const Incrementable& i)
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
<hr>
 | 
			
		||||
<p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h2><a name="make_counting_iterator">The Counting Iterator Object Generator</a></h2>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
template <class Incrementable>
 | 
			
		||||
typename counting_iterator_generator<Incrementable>::type
 | 
			
		||||
make_counting_iterator(Incrementable base);
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
An <a href="../../more/generic_programming.html#object_generator">object
 | 
			
		||||
generator</a> function that provides a convenient way to create counting
 | 
			
		||||
iterators.<p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
In this example we count from negative five to positive five, this
 | 
			
		||||
time using the <tt>make_counting_iterator()</tt> function to save some
 | 
			
		||||
typing.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
  // continuing from previous example...
 | 
			
		||||
 | 
			
		||||
  std::cout << "counting from -5 to 4:" << std::endl;
 | 
			
		||||
  std::copy(boost::make_counting_iterator(-5),
 | 
			
		||||
	    boost::make_counting_iterator(5),
 | 
			
		||||
	    std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // to be continued...
 | 
			
		||||
</pre>
 | 
			
		||||
The output from this part is:
 | 
			
		||||
<pre>
 | 
			
		||||
counting from -5 to 4:
 | 
			
		||||
-5 -4 -3 -2 -1 0 1 2 3 4 
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
In the next example we create an array of numbers, and then create a
 | 
			
		||||
second array of pointers, where each pointer is the address of a
 | 
			
		||||
number in the first array. The counting iterator makes it easy to do
 | 
			
		||||
this since dereferencing a counting iterator that is wrapping an
 | 
			
		||||
iterator over the array of numbers just returns a pointer to the
 | 
			
		||||
current location in the array. We then use the <a
 | 
			
		||||
href="./indirect_iterator.htm">indirect iterator adaptor</a> to print
 | 
			
		||||
out the number in the array by accessing the numbers through the array
 | 
			
		||||
of pointers.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
  // continuing from previous example...
 | 
			
		||||
 | 
			
		||||
  const int N = 7;
 | 
			
		||||
  std::vector<int> numbers;
 | 
			
		||||
  // Fill "numbers" array with [0,N)
 | 
			
		||||
  std::copy(boost::make_counting_iterator(0), boost::make_counting_iterator(N),
 | 
			
		||||
	    std::back_inserter(numbers));
 | 
			
		||||
 | 
			
		||||
  std::vector<std::vector<int>::iterator> pointers;
 | 
			
		||||
 | 
			
		||||
  // Use counting iterator to fill in the array of pointers.
 | 
			
		||||
  std::copy(boost::make_counting_iterator(numbers.begin()),
 | 
			
		||||
	    boost::make_counting_iterator(numbers.end()),
 | 
			
		||||
	    std::back_inserter(pointers));
 | 
			
		||||
 | 
			
		||||
  // Use indirect iterator to print out numbers by accessing
 | 
			
		||||
  // them through the array of pointers.
 | 
			
		||||
  std::cout << "indirectly printing out the numbers from 0 to " 
 | 
			
		||||
	    << N << std::endl;
 | 
			
		||||
  std::copy(boost::make_indirect_iterator(pointers.begin()),
 | 
			
		||||
	    boost::make_indirect_iterator(pointers.end()),
 | 
			
		||||
	    std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
</pre>
 | 
			
		||||
The output is:
 | 
			
		||||
<pre>
 | 
			
		||||
indirectly printing out the numbers from 0 to 7
 | 
			
		||||
0 1 2 3 4 5 6 
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
<h2><a name="counting_iterator_traits">Counting Iterator Traits</a></h2>
 | 
			
		||||
 | 
			
		||||
The counting iterator adaptor needs to determine the appropriate
 | 
			
		||||
<tt>difference_type</tt> and <tt>iterator_category</tt> to use based on the
 | 
			
		||||
<tt>Incrementable</tt> type supplied by the user.  The
 | 
			
		||||
<tt>counting_iterator_traits</tt> class provides these types.  If the
 | 
			
		||||
<tt>Incrementable</tt> type is an integral type or an iterator, these types
 | 
			
		||||
will be correctly deduced by the <tt>counting_iterator_traits</tt> provided by
 | 
			
		||||
the library. Otherwise, the user must specialize
 | 
			
		||||
<tt>counting_iterator_traits</tt> for her type or add nested typedefs to
 | 
			
		||||
her type to fulfill the needs of
 | 
			
		||||
<a href="http://www.sgi.com/tech/stl/iterator_traits.html">
 | 
			
		||||
<tt>std::iterator_traits</tt></a>.
 | 
			
		||||
 | 
			
		||||
<p>The following pseudocode describes how the <tt>counting_iterator_traits</tt> are determined:
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
template <class Incrementable>
 | 
			
		||||
struct counting_iterator_traits
 | 
			
		||||
{
 | 
			
		||||
  if (numeric_limits<Incrementable>::is_specialized) {
 | 
			
		||||
    if (!numeric_limits<Incrementable>::is_integer)
 | 
			
		||||
       COMPILE_TIME_ERROR;
 | 
			
		||||
 | 
			
		||||
    if (!numeric_limits<Incrementable>::is_bounded
 | 
			
		||||
        && numeric_limits<Incrementable>::is_signed) {
 | 
			
		||||
        typedef Incrementable difference_type;
 | 
			
		||||
    }
 | 
			
		||||
    else if (numeric_limits<Incrementable>::is_integral) {
 | 
			
		||||
        typedef <i>next-larger-signed-type-or-intmax_t</i> difference_type;
 | 
			
		||||
    }
 | 
			
		||||
    typedef std::random_access_iterator_tag iterator_category;   
 | 
			
		||||
  } else {
 | 
			
		||||
    typedef std::iterator_traits<Incrementable>::difference_type difference_type;
 | 
			
		||||
    typedef std::iterator_traits<Incrementable>::iterator_category iterator_category;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>The italicized sections above are implementation details, but it is important
 | 
			
		||||
to know that the <tt>difference_type</tt> for integral types is selected so that
 | 
			
		||||
it can always represent the difference between two values if such a built-in
 | 
			
		||||
integer exists. On platforms with a working <tt>std::numeric_limits</tt>
 | 
			
		||||
implementation, the <tt>difference_type</tt> for any variable-length signed
 | 
			
		||||
integer type <tt>T</tt> is <tt>T</tt> itself.
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
<p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan -->19 Aug 2001<!--webbot bot="Timestamp" endspan i-checksum="14767" --></p>
 | 
			
		||||
<p><EFBFBD> Copyright Jeremy Siek 2000. Permission to copy, use,
 | 
			
		||||
modify, sell and distribute this document is granted provided this copyright
 | 
			
		||||
notice appears in all copies. This document is provided "as is"
 | 
			
		||||
without express or implied warranty, and with no claim as to its suitability for
 | 
			
		||||
any purpose.</p>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
<!--  LocalWords:  html charset alt gif hpp incrementable const namespace htm
 | 
			
		||||
 -->
 | 
			
		||||
<!--  LocalWords:  struct  typename iostream int Siek CopyConstructible pre
 | 
			
		||||
 -->
 | 
			
		||||
 | 
			
		||||
@@ -1,60 +0,0 @@
 | 
			
		||||
// (C) Copyright Jeremy Siek 2000. 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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <boost/iterator/counting_iterator.hpp>
 | 
			
		||||
#include <boost/iterator/indirect_iterator.hpp>
 | 
			
		||||
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  // Example of using counting_iterator_generator
 | 
			
		||||
  std::cout << "counting from 0 to 4:" << std::endl;
 | 
			
		||||
  boost::counting_iterator<int> first(0), last(4);
 | 
			
		||||
  std::copy(first, last, std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // Example of using make_counting_iterator()
 | 
			
		||||
  std::cout << "counting from -5 to 4:" << std::endl;
 | 
			
		||||
  std::copy(boost::make_counting_iterator(-5),
 | 
			
		||||
            boost::make_counting_iterator(5),
 | 
			
		||||
            std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // Example of using counting iterator to create an array of pointers.
 | 
			
		||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
 | 
			
		||||
  const
 | 
			
		||||
#endif 
 | 
			
		||||
      int N = 7;
 | 
			
		||||
  std::vector<int> numbers;
 | 
			
		||||
  // Fill "numbers" array with [0,N)
 | 
			
		||||
  std::copy(
 | 
			
		||||
      boost::make_counting_iterator(0)
 | 
			
		||||
      , boost::make_counting_iterator(N)
 | 
			
		||||
      , std::back_inserter(numbers));
 | 
			
		||||
 | 
			
		||||
  std::vector<std::vector<int>::iterator> pointers;
 | 
			
		||||
 | 
			
		||||
  // Use counting iterator to fill in the array of pointers.
 | 
			
		||||
  // causes an ICE with MSVC6
 | 
			
		||||
  std::copy(boost::make_counting_iterator(numbers.begin()),
 | 
			
		||||
            boost::make_counting_iterator(numbers.end()),
 | 
			
		||||
            std::back_inserter(pointers));
 | 
			
		||||
 | 
			
		||||
  // Use indirect iterator to print out numbers by accessing
 | 
			
		||||
  // them through the array of pointers.
 | 
			
		||||
  std::cout << "indirectly printing out the numbers from 0 to " 
 | 
			
		||||
            << N << std::endl;
 | 
			
		||||
  std::copy(boost::make_indirect_iterator(pointers.begin()),
 | 
			
		||||
            boost::make_indirect_iterator(pointers.end()),
 | 
			
		||||
            std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -7,10 +7,9 @@
 | 
			
		||||
	<body bgcolor="white" style="MARGIN-LEFT: 5%; MARGIN-RIGHT: 5%">
 | 
			
		||||
		<table border="0" width="100%">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td width="277">
 | 
			
		||||
					<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86">
 | 
			
		||||
				<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="middle">
 | 
			
		||||
				<td align="center">
 | 
			
		||||
					<h1>current_function.hpp</h1>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
@@ -30,9 +29,8 @@
 | 
			
		||||
			function. On such compilers, the string literal has an unspecified value.</p>
 | 
			
		||||
		<p>
 | 
			
		||||
			<br>
 | 
			
		||||
			<small>Copyright <20> 2002 by Peter Dimov. Permission to copy, use, modify, sell and 
 | 
			
		||||
				distribute this document is granted provided this copyright notice appears in 
 | 
			
		||||
				all copies. This document is provided "as is" without express or implied 
 | 
			
		||||
				warranty, and with no claim as to its suitability for any purpose.</small></p>
 | 
			
		||||
			<small>Copyright <20> 2002 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>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,18 +12,22 @@
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
//  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.
 | 
			
		||||
// 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/current_function.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
 | 
			
		||||
void message(char const * file, long line, char const * func, char const * msg)
 | 
			
		||||
{
 | 
			
		||||
    std::printf("%s(%ld): %s in function '%s'\n", file, line, msg, func);
 | 
			
		||||
#if !defined(BOOST_NO_STDC_NAMESPACE)
 | 
			
		||||
    using std::printf;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    printf("%s(%ld): %s in function '%s'\n", file, line, msg, func);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define MESSAGE(msg) message(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION, msg)
 | 
			
		||||
@@ -31,4 +35,6 @@ void message(char const * file, long line, char const * func, char const * msg)
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    MESSAGE("assertion failed");
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										68
									
								
								doc/Jamfile.v2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								doc/Jamfile.v2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
			
		||||
 | 
			
		||||
# Copyright John Maddock 2005. Use, modification, and distribution are
 | 
			
		||||
# subject to 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)
 | 
			
		||||
 | 
			
		||||
project : requirements
 | 
			
		||||
        # Path for links to Boost:
 | 
			
		||||
        <xsl:param>boost.root=../../../..
 | 
			
		||||
        
 | 
			
		||||
        # Some general style settings:
 | 
			
		||||
        <xsl:param>table.footnote.number.format=1
 | 
			
		||||
        <xsl:param>footnote.number.format=1
 | 
			
		||||
 | 
			
		||||
        # HTML options first:
 | 
			
		||||
        # Use graphics not text for navigation:
 | 
			
		||||
        <xsl:param>navig.graphics=1
 | 
			
		||||
       # PDF Options:
 | 
			
		||||
        # TOC Generation: this is needed for FOP-0.9 and later:
 | 
			
		||||
        <xsl:param>fop1.extensions=0
 | 
			
		||||
        <xsl:param>xep.extensions=1
 | 
			
		||||
        # TOC generation: this is needed for FOP 0.2, but must not be set to zero for FOP-0.9!
 | 
			
		||||
        <xsl:param>fop.extensions=0
 | 
			
		||||
        # No indent on body text:
 | 
			
		||||
        <xsl:param>body.start.indent=0pt
 | 
			
		||||
        # Margin size:
 | 
			
		||||
        <xsl:param>page.margin.inner=0.5in
 | 
			
		||||
        # Margin size:
 | 
			
		||||
        <xsl:param>page.margin.outer=0.5in
 | 
			
		||||
        # Paper type = A4
 | 
			
		||||
        <xsl:param>paper.type=A4
 | 
			
		||||
        # Yes, we want graphics for admonishments:
 | 
			
		||||
        <xsl:param>admon.graphics=1
 | 
			
		||||
        # Set this one for PDF generation *only*:
 | 
			
		||||
        # default pnd graphics are awful in PDF form,
 | 
			
		||||
        # better use SVG's instead:
 | 
			
		||||
        <format>pdf:<xsl:param>admon.graphics.extension=".svg"
 | 
			
		||||
        <format>pdf:<xsl:param>admon.graphics.path=$(boost-images)/
 | 
			
		||||
        <format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/utility/doc/html
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
using quickbook ;
 | 
			
		||||
 | 
			
		||||
path-constant boost-images : ../../../doc/src/images ;
 | 
			
		||||
 | 
			
		||||
xml declval : declval.qbk ;
 | 
			
		||||
boostbook standalone
 | 
			
		||||
    :
 | 
			
		||||
        declval
 | 
			
		||||
    :
 | 
			
		||||
        # File name of HTML output:
 | 
			
		||||
        <xsl:param>root.filename=declval
 | 
			
		||||
        # How far down we chunk nested sections, basically all of them:
 | 
			
		||||
        <xsl:param>chunk.section.depth=0
 | 
			
		||||
        # Don't put the first section on the same page as the TOC:
 | 
			
		||||
        <xsl:param>chunk.first.sections=0
 | 
			
		||||
        # How far down sections get TOC's
 | 
			
		||||
        <xsl:param>toc.section.depth=1
 | 
			
		||||
        # Max depth in each TOC:
 | 
			
		||||
        <xsl:param>toc.max.depth=1
 | 
			
		||||
        # How far down we go with TOC's
 | 
			
		||||
        <xsl:param>generate.section.toc.level=1
 | 
			
		||||
        
 | 
			
		||||
     ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										104
									
								
								doc/declval.qbk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								doc/declval.qbk
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,104 @@
 | 
			
		||||
[/
 | 
			
		||||
 / Copyright (c) 2008 Howard Hinnant
 | 
			
		||||
 / Copyright (c) 2008 Beman Dawes
 | 
			
		||||
 / Copyright (c) 2009-20010 Vicente J. Botet Escriba
 | 
			
		||||
 /
 | 
			
		||||
 / 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)
 | 
			
		||||
 /]
 | 
			
		||||
 | 
			
		||||
[article Declval
 | 
			
		||||
    [quickbook 1.5]
 | 
			
		||||
    [authors [Hinnant, Howard]]
 | 
			
		||||
    [authors [Dawes, Beman]]
 | 
			
		||||
    [authors [Botet Escriba, Vicente J.]]
 | 
			
		||||
    [copyright 2008 Howard Hinnant]
 | 
			
		||||
    [copyright 2008 Beman Dawes]
 | 
			
		||||
    [copyright 2009-2010 Vicente J. Botet Escriba]
 | 
			
		||||
    [license
 | 
			
		||||
        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])
 | 
			
		||||
    ]
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[/===============]
 | 
			
		||||
[section Overview]
 | 
			
		||||
[/===============]
 | 
			
		||||
 | 
			
		||||
The motivation for `declval` was introduced in [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2958.html#Value N2958: 
 | 
			
		||||
Moving Swap Forward]. Here follows a rewording of this chapter.
 | 
			
		||||
 | 
			
		||||
With the provision of decltype, late-specified return types, and default template-arguments for function templates a 
 | 
			
		||||
new generation of SFINAE patterns will emerge to at least partially compensate the lack of concepts on the C++0x timescale. 
 | 
			
		||||
Using this technique, it is sometimes necessary to obtain an object of a known type in a non-using context, e.g. given the declaration 
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
  T&& declval(); // not used
 | 
			
		||||
  
 | 
			
		||||
as part of the function template declaration 
 | 
			
		||||
 | 
			
		||||
  template<class To, class From>
 | 
			
		||||
  decltype(static_cast<To>(declval<From>())) convert(From&&);
 | 
			
		||||
  
 | 
			
		||||
or as part of a class template definition 
 | 
			
		||||
 | 
			
		||||
  template<class> class result_of;
 | 
			
		||||
 | 
			
		||||
  template<class Fn, class... ArgTypes>
 | 
			
		||||
  struct result_of<Fn(ArgTypes...)> 
 | 
			
		||||
  {
 | 
			
		||||
    typedef decltype(declval<Fn>()(declval<ArgTypes>()...)) type;
 | 
			
		||||
  };
 | 
			
		||||
  
 | 
			
		||||
The role of the function template declval() is a transformation of a type T into a value without using or evaluating this function. 
 | 
			
		||||
The name is supposed to direct the reader's attention to the fact that the expression `declval<T>()` is an lvalue if and only if 
 | 
			
		||||
T is an lvalue-reference, otherwise an rvalue. To extend the domain of this function we can do a bit better by changing its declaration to 
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
  typename std::add_rvalue_reference<T>::type declval(); // not used
 | 
			
		||||
  
 | 
			
		||||
which ensures that we can also use cv void as template parameter. The careful reader might have noticed that `declval()` 
 | 
			
		||||
already exists under the name create() as part of the definition of the semantics of the type trait is_convertible in the C==0x standard. 
 | 
			
		||||
 | 
			
		||||
The provision of a new library component that allows the production of values in unevaluated expressions is considered as 
 | 
			
		||||
important to realize constrained templates in C++0x where concepts are not available. 
 | 
			
		||||
This extremely light-weight function is expected to be part of the daily tool-box of the C++0x programmer. 
 | 
			
		||||
 | 
			
		||||
[endsect]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[/=================]
 | 
			
		||||
[section:reference Reference ]
 | 
			
		||||
[/=================]
 | 
			
		||||
 | 
			
		||||
`#include <boost/utility/declval.hpp>`
 | 
			
		||||
 | 
			
		||||
    namespace boost {
 | 
			
		||||
 | 
			
		||||
        template <typename T>
 | 
			
		||||
        typename add_rvalue_reference<T>::type declval(); //noexcept; // as unevaluated operand
 | 
			
		||||
 | 
			
		||||
    }  // namespace boost
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The library provides the function template declval to simplify the definition of expressions which occur as unevaluated operands.
 | 
			
		||||
 | 
			
		||||
        template <typename T>
 | 
			
		||||
        typename add_rvalue_reference<T>::type declval();
 | 
			
		||||
 | 
			
		||||
[*Remarks:] If this function is used, the program is ill-formed.
 | 
			
		||||
 | 
			
		||||
[*Remarks:] The template parameter T of declval may be an incomplete type.
 | 
			
		||||
 | 
			
		||||
[*Example:]
 | 
			
		||||
 | 
			
		||||
    template <class To, class From>
 | 
			
		||||
    decltype(static_cast<To>(declval<From>())) convert(From&&);
 | 
			
		||||
 | 
			
		||||
Declares a function template convert which only participats in overloading if the type From can be explicitly converted to type To. 
 | 
			
		||||
 | 
			
		||||
[endsect]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										163
									
								
								doc/html/declval.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								doc/html/declval.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,163 @@
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
 | 
			
		||||
<title>Declval</title>
 | 
			
		||||
<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
 | 
			
		||||
<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
 | 
			
		||||
<link rel="home" href="declval.html" title="Declval">
 | 
			
		||||
</head>
 | 
			
		||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 | 
			
		||||
<table cellpadding="2" width="100%"><tr>
 | 
			
		||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
 | 
			
		||||
<td align="center"><a href="../../../../index.html">Home</a></td>
 | 
			
		||||
<td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
 | 
			
		||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
 | 
			
		||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
 | 
			
		||||
<td align="center"><a href="../../../../more/index.htm">More</a></td>
 | 
			
		||||
</tr></table>
 | 
			
		||||
<hr>
 | 
			
		||||
<div class="spirit-nav"></div>
 | 
			
		||||
<div class="article" lang="en">
 | 
			
		||||
<div class="titlepage">
 | 
			
		||||
<div>
 | 
			
		||||
<div><h2 class="title">
 | 
			
		||||
<a name="declval"></a>Declval</h2></div>
 | 
			
		||||
<div><div class="authorgroup">
 | 
			
		||||
<div class="author"><h3 class="author">
 | 
			
		||||
<span class="firstname">Howard</span> <span class="surname">Hinnant</span>
 | 
			
		||||
</h3></div>
 | 
			
		||||
<div class="author"><h3 class="author">
 | 
			
		||||
<span class="firstname">Beman</span> <span class="surname">Dawes</span>
 | 
			
		||||
</h3></div>
 | 
			
		||||
<div class="author"><h3 class="author">
 | 
			
		||||
<span class="firstname">Vicente J.</span> <span class="surname">Botet Escriba</span>
 | 
			
		||||
</h3></div>
 | 
			
		||||
</div></div>
 | 
			
		||||
<div><p class="copyright">Copyright © 2008 Howard Hinnant</p></div>
 | 
			
		||||
<div><p class="copyright">Copyright © 2008 Beman Dawes</p></div>
 | 
			
		||||
<div><p class="copyright">Copyright © 2009 -2010 Vicente J. Botet Escriba</p></div>
 | 
			
		||||
<div><div class="legalnotice">
 | 
			
		||||
<a name="id879409"></a><p>
 | 
			
		||||
        Distributed under the Boost Software License, Version 1.0. (See accompanying
 | 
			
		||||
        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
 | 
			
		||||
      </p>
 | 
			
		||||
</div></div>
 | 
			
		||||
</div>
 | 
			
		||||
<hr>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="toc">
 | 
			
		||||
<p><b>Table of Contents</b></p>
 | 
			
		||||
<dl>
 | 
			
		||||
<dt><span class="section"><a href="declval.html#declval.overview">Overview</a></span></dt>
 | 
			
		||||
<dt><span class="section"><a href="declval.html#declval.reference"> Reference </a></span></dt>
 | 
			
		||||
</dl>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="section" lang="en">
 | 
			
		||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
 | 
			
		||||
<a name="declval.overview"></a><a class="link" href="declval.html#declval.overview" title="Overview">Overview</a>
 | 
			
		||||
</h2></div></div></div>
 | 
			
		||||
<p>
 | 
			
		||||
      The motivation for <code class="computeroutput"><span class="identifier">declval</span></code>
 | 
			
		||||
      was introduced in <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2958.html#Value" target="_top">N2958:
 | 
			
		||||
      Moving Swap Forward</a>. Here follows a rewording of this chapter.
 | 
			
		||||
    </p>
 | 
			
		||||
<p>
 | 
			
		||||
      With the provision of decltype, late-specified return types, and default template-arguments
 | 
			
		||||
      for function templates a new generation of SFINAE patterns will emerge to at
 | 
			
		||||
      least partially compensate the lack of concepts on the C++0x timescale. Using
 | 
			
		||||
      this technique, it is sometimes necessary to obtain an object of a known type
 | 
			
		||||
      in a non-using context, e.g. given the declaration
 | 
			
		||||
    </p>
 | 
			
		||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
 | 
			
		||||
<span class="identifier">T</span><span class="special">&&</span> <span class="identifier">declval</span><span class="special">();</span> <span class="comment">// not used
 | 
			
		||||
</span></pre>
 | 
			
		||||
<p>
 | 
			
		||||
      as part of the function template declaration
 | 
			
		||||
    </p>
 | 
			
		||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">To</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">From</span><span class="special">></span>
 | 
			
		||||
<span class="identifier">decltype</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">To</span><span class="special">>(</span><span class="identifier">declval</span><span class="special"><</span><span class="identifier">From</span><span class="special">>()))</span> <span class="identifier">convert</span><span class="special">(</span><span class="identifier">From</span><span class="special">&&);</span>
 | 
			
		||||
</pre>
 | 
			
		||||
<p>
 | 
			
		||||
      or as part of a class template definition
 | 
			
		||||
    </p>
 | 
			
		||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span><span class="special">></span> <span class="keyword">class</span> <span class="identifier">result_of</span><span class="special">;</span>
 | 
			
		||||
 | 
			
		||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">class</span><span class="special">...</span> <span class="identifier">ArgTypes</span><span class="special">></span>
 | 
			
		||||
<span class="keyword">struct</span> <span class="identifier">result_of</span><span class="special"><</span><span class="identifier">Fn</span><span class="special">(</span><span class="identifier">ArgTypes</span><span class="special">...)></span> 
 | 
			
		||||
<span class="special">{</span>
 | 
			
		||||
  <span class="keyword">typedef</span> <span class="identifier">decltype</span><span class="special">(</span><span class="identifier">declval</span><span class="special"><</span><span class="identifier">Fn</span><span class="special">>()(</span><span class="identifier">declval</span><span class="special"><</span><span class="identifier">ArgTypes</span><span class="special">>()...))</span> <span class="identifier">type</span><span class="special">;</span>
 | 
			
		||||
<span class="special">};</span>
 | 
			
		||||
</pre>
 | 
			
		||||
<p>
 | 
			
		||||
      The role of the function template declval() is a transformation of a type T
 | 
			
		||||
      into a value without using or evaluating this function. The name is supposed
 | 
			
		||||
      to direct the reader's attention to the fact that the expression <code class="computeroutput"><span class="identifier">declval</span><span class="special"><</span><span class="identifier">T</span><span class="special">>()</span></code> is
 | 
			
		||||
      an lvalue if and only if T is an lvalue-reference, otherwise an rvalue. To
 | 
			
		||||
      extend the domain of this function we can do a bit better by changing its declaration
 | 
			
		||||
      to
 | 
			
		||||
    </p>
 | 
			
		||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></span>
 | 
			
		||||
<span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">add_rvalue_reference</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">declval</span><span class="special">();</span> <span class="comment">// not used
 | 
			
		||||
</span></pre>
 | 
			
		||||
<p>
 | 
			
		||||
      which ensures that we can also use cv void as template parameter. The careful
 | 
			
		||||
      reader might have noticed that <code class="computeroutput"><span class="identifier">declval</span><span class="special">()</span></code> already exists under the name create() as
 | 
			
		||||
      part of the definition of the semantics of the type trait is_convertible in
 | 
			
		||||
      the C==0x standard.
 | 
			
		||||
    </p>
 | 
			
		||||
<p>
 | 
			
		||||
      The provision of a new library component that allows the production of values
 | 
			
		||||
      in unevaluated expressions is considered as important to realize constrained
 | 
			
		||||
      templates in C++0x where concepts are not available. This extremely light-weight
 | 
			
		||||
      function is expected to be part of the daily tool-box of the C++0x programmer.
 | 
			
		||||
    </p>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="section" lang="en">
 | 
			
		||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
 | 
			
		||||
<a name="declval.reference"></a><a class="link" href="declval.html#declval.reference" title="Reference"> Reference </a>
 | 
			
		||||
</h2></div></div></div>
 | 
			
		||||
<p>
 | 
			
		||||
      <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">/</span><span class="identifier">declval</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
 | 
			
		||||
    </p>
 | 
			
		||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
 | 
			
		||||
 | 
			
		||||
    <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
 | 
			
		||||
    <span class="keyword">typename</span> <span class="identifier">add_rvalue_reference</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">declval</span><span class="special">();</span> <span class="comment">//noexcept; // as unevaluated operand
 | 
			
		||||
</span>
 | 
			
		||||
<span class="special">}</span>  <span class="comment">// namespace boost
 | 
			
		||||
</span></pre>
 | 
			
		||||
<p>
 | 
			
		||||
      The library provides the function template declval to simplify the definition
 | 
			
		||||
      of expressions which occur as unevaluated operands.
 | 
			
		||||
    </p>
 | 
			
		||||
<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
 | 
			
		||||
<span class="keyword">typename</span> <span class="identifier">add_rvalue_reference</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">type</span> <span class="identifier">declval</span><span class="special">();</span>
 | 
			
		||||
</pre>
 | 
			
		||||
<p>
 | 
			
		||||
      <span class="bold"><strong>Remarks:</strong></span> If this function is used, the program
 | 
			
		||||
      is ill-formed.
 | 
			
		||||
    </p>
 | 
			
		||||
<p>
 | 
			
		||||
      <span class="bold"><strong>Remarks:</strong></span> The template parameter T of declval
 | 
			
		||||
      may be an incomplete type.
 | 
			
		||||
    </p>
 | 
			
		||||
<p>
 | 
			
		||||
      <span class="bold"><strong>Example:</strong></span>
 | 
			
		||||
    </p>
 | 
			
		||||
<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">To</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">From</span><span class="special">></span>
 | 
			
		||||
<span class="identifier">decltype</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">To</span><span class="special">>(</span><span class="identifier">declval</span><span class="special"><</span><span class="identifier">From</span><span class="special">>()))</span> <span class="identifier">convert</span><span class="special">(</span><span class="identifier">From</span><span class="special">&&);</span>
 | 
			
		||||
</pre>
 | 
			
		||||
<p>
 | 
			
		||||
      Declares a function template convert which only participats in overloading
 | 
			
		||||
      if the type From can be explicitly converted to type To.
 | 
			
		||||
    </p>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
 | 
			
		||||
<td align="left"><p><small>Last revised: September 16, 2010 at 16:19:10 GMT</small></p></td>
 | 
			
		||||
<td align="right"><div class="copyright-footer"></div></td>
 | 
			
		||||
</tr></table>
 | 
			
		||||
<hr>
 | 
			
		||||
<div class="spirit-nav"></div>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h1>
 | 
			
		||||
<img border="0" src="../../c++boost.gif" align="center" width="277" height="86">enable_if</h1>
 | 
			
		||||
<img border="0" src="../../boost.png" align="center" width="277" height="86">enable_if</h1>
 | 
			
		||||
<BR>
 | 
			
		||||
<BR>
 | 
			
		||||
Copyright 2003 Jaakko Järvi, Jeremiah Willcock, Andrew Lumsdaine.<BR>
 | 
			
		||||
@@ -128,7 +128,7 @@ When valid, <TT>enable_if_c<B, T>::type</TT> equals <TT>T</TT>.
 | 
			
		||||
The <TT>enable_if_c</TT> template can thus be used for controlling when functions are considered for
 | 
			
		||||
overload resolution and when they are not. 
 | 
			
		||||
For example, the following function is defined for all arithmetic types (according to the
 | 
			
		||||
classification of the <A HREF="http://www.boost.org/libs/type_traits">Boost type_traits library</A>):
 | 
			
		||||
classification of the <A HREF="../type_traits/index.html">Boost type_traits library</A>):
 | 
			
		||||
<PRE>template <class T>
 | 
			
		||||
typename enable_if_c<boost::is_arithmetic<T>::value, T>::type 
 | 
			
		||||
foo(T t) { return t; }
 | 
			
		||||
@@ -303,7 +303,7 @@ foo(T t);
 | 
			
		||||
<UL><LI>
 | 
			
		||||
Use an extra dummy parameter which disambiguates the functions. Use a default value for
 | 
			
		||||
it to hide the parameter from the caller. For example:
 | 
			
		||||
<PRE>template <class T> struct dummy { dummy(int) {} };
 | 
			
		||||
<PRE>template <int> struct dummy { dummy(int) {} };
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
typename enable_if<boost::is_arithmetic<T>, T>::type 
 | 
			
		||||
@@ -366,17 +366,18 @@ David Vandevoorde and Nicolai M. Josuttis.
 | 
			
		||||
<EM>C++ Templates: The Complete Guide</EM>.
 | 
			
		||||
Addison-Wesley, 2002.</DL>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<hr></hr>
 | 
			
		||||
 | 
			
		||||
<B>Contributed by:</B> <BR>
 | 
			
		||||
Jaakko Järvi, Jeremiah Willcock and Andrew Lumsdaine<BR>
 | 
			
		||||
<hr/>
 | 
			
		||||
   <p>Copyright Jaakko Järvi, Jeremiah Willcock and Andrew Lumsdaine<BR>
 | 
			
		||||
<EM>{jajarvi|jewillco|lums}@osl.iu.edu</EM><BR>
 | 
			
		||||
Indiana University<BR>
 | 
			
		||||
Open Systems Lab
 | 
			
		||||
Open Systems Lab<br/>
 | 
			
		||||
Use, modification and distribution are subject to the
 | 
			
		||||
Boost Software License, Version 1.0.
 | 
			
		||||
(See accompanying file LICENSE_1_0.txt
 | 
			
		||||
or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
 | 
			
		||||
   http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
</a>).
 | 
			
		||||
</p>
 | 
			
		||||
<!--HTMLFOOT-->
 | 
			
		||||
<!--ENDHTML-->
 | 
			
		||||
<!--FOOTER-->
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								enable_if/test/Jamfile.v2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								enable_if/test/Jamfile.v2
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
# Copyright David Abrahams 2003.
 | 
			
		||||
# 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)
 | 
			
		||||
 | 
			
		||||
# For more information, see http://www.boost.org/
 | 
			
		||||
 | 
			
		||||
project
 | 
			
		||||
    : requirements <library>/boost/test//boost_test_exec_monitor
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
test-suite utility/enable_if
 | 
			
		||||
        :
 | 
			
		||||
        [ run constructors.cpp ]
 | 
			
		||||
        [ run dummy_arg_disambiguation.cpp ]
 | 
			
		||||
        [ run lazy.cpp ]
 | 
			
		||||
        [ run lazy_test.cpp ]
 | 
			
		||||
        [ run member_templates.cpp ]
 | 
			
		||||
        [ run namespace_disambiguation.cpp ]
 | 
			
		||||
        [ run no_disambiguation.cpp ]
 | 
			
		||||
        [ run partial_specializations.cpp ]
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
// Boost enable_if library
 | 
			
		||||
 | 
			
		||||
// Copyright 2003 © The Trustees of Indiana University.
 | 
			
		||||
// Copyright 2003 (c) The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification, and distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
//    Authors: Jaakko Järvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//             Jeremiah Willcock (jewillco at osl.iu.edu)
 | 
			
		||||
//             Andrew Lumsdaine (lums at osl.iu.edu)
 | 
			
		||||
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
// Boost enable_if library
 | 
			
		||||
 | 
			
		||||
// Copyright 2003 © The Trustees of Indiana University.
 | 
			
		||||
// Copyright 2003 (c) The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification, and distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
//    Authors: Jaakko Järvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//             Jeremiah Willcock (jewillco at osl.iu.edu)
 | 
			
		||||
//             Andrew Lumsdaine (lums at osl.iu.edu)
 | 
			
		||||
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
// Boost enable_if library
 | 
			
		||||
 | 
			
		||||
// Copyright 2003 © The Trustees of Indiana University.
 | 
			
		||||
// Copyright 2003 (c) The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification, and distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
//    Authors: Jaakko Järvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//             Jeremiah Willcock (jewillco at osl.iu.edu)
 | 
			
		||||
//             Andrew Lumsdaine (lums at osl.iu.edu)
 | 
			
		||||
 | 
			
		||||
@@ -61,7 +61,7 @@ mult(const T& x, const U& y) {return x * y;}
 | 
			
		||||
#if 1
 | 
			
		||||
template <class T, class U>
 | 
			
		||||
typename lazy_enable_if_c<
 | 
			
		||||
  is_int<T>::value && is_int<U>::value,
 | 
			
		||||
  is_int<T>::value & is_int<U>::value,
 | 
			
		||||
  mult_traits<T, U> 
 | 
			
		||||
>::type
 | 
			
		||||
mult(const T& x, const U& y) {return x * y;}
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
// Boost enable_if library
 | 
			
		||||
 | 
			
		||||
// Copyright 2003 © The Trustees of Indiana University.
 | 
			
		||||
// Copyright 2003 (c) The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification, and distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
//    Authors: Jaakko Järvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//             Jeremiah Willcock (jewillco at osl.iu.edu)
 | 
			
		||||
//             Andrew Lumsdaine (lums at osl.iu.edu)
 | 
			
		||||
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
// Boost enable_if library
 | 
			
		||||
 | 
			
		||||
// Copyright 2003 © The Trustees of Indiana University.
 | 
			
		||||
// Copyright 2003 (c) The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification, and distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
//    Authors: Jaakko Järvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//             Jeremiah Willcock (jewillco at osl.iu.edu)
 | 
			
		||||
//             Andrew Lumsdaine (lums at osl.iu.edu)
 | 
			
		||||
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
// Boost enable_if library
 | 
			
		||||
 | 
			
		||||
// Copyright 2003 © The Trustees of Indiana University.
 | 
			
		||||
// Copyright 2003 (c) The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification, and distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
//    Authors: Jaakko Järvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//             Jeremiah Willcock (jewillco at osl.iu.edu)
 | 
			
		||||
//             Andrew Lumsdaine (lums at osl.iu.edu)
 | 
			
		||||
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
// Boost enable_if library
 | 
			
		||||
 | 
			
		||||
// Copyright 2003 © The Trustees of Indiana University.
 | 
			
		||||
// Copyright 2003 (c) The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification, and distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
//    Authors: Jaakko Järvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//             Jeremiah Willcock (jewillco at osl.iu.edu)
 | 
			
		||||
//             Andrew Lumsdaine (lums at osl.iu.edu)
 | 
			
		||||
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
// Boost enable_if library
 | 
			
		||||
 | 
			
		||||
// Copyright 2003 © The Trustees of Indiana University.
 | 
			
		||||
// Copyright 2003 (c) The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification, and distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
//    Authors: Jaakko Järvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//             Jeremiah Willcock (jewillco at osl.iu.edu)
 | 
			
		||||
//             Andrew Lumsdaine (lums at osl.iu.edu)
 | 
			
		||||
 | 
			
		||||
@@ -1,273 +0,0 @@
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 | 
			
		||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
 | 
			
		||||
<meta name="ProgId" content="FrontPage.Editor.Document">
 | 
			
		||||
<title>Filter Iterator Adaptor Documentation</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
 | 
			
		||||
<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)"
 | 
			
		||||
align="center" width="277" height="86">
 | 
			
		||||
 | 
			
		||||
<h1>Filter Iterator Adaptor</h1>
 | 
			
		||||
 | 
			
		||||
Defined in header
 | 
			
		||||
<a href="../../boost/iterator_adaptors.hpp">boost/iterator_adaptors.hpp</a>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The filter iterator adaptor creates a view of an iterator range in
 | 
			
		||||
which some elements of the range are skipped over. A <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/Predicate.html">Predicate</a>
 | 
			
		||||
function object controls which elements are skipped. When the
 | 
			
		||||
predicate is applied to an element, if it returns <tt>true</tt> then
 | 
			
		||||
the element is retained and if it returns <tt>false</tt> then the
 | 
			
		||||
element is skipped over.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h2>Synopsis</h2>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
namespace boost {
 | 
			
		||||
  template <class Predicate, class BaseIterator, ...>
 | 
			
		||||
  class filter_iterator_generator;
 | 
			
		||||
 | 
			
		||||
  template <class Predicate, class BaseIterator>
 | 
			
		||||
  typename filter_iterator_generator<Predicate, BaseIterator>::type
 | 
			
		||||
  make_filter_iterator(BaseIterator first, BaseIterator last, const Predicate& p = Predicate());
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
<h2><a name="filter_iterator_generator">The Filter Iterator Type
 | 
			
		||||
Generator</a></h2>
 | 
			
		||||
 | 
			
		||||
The class <tt>filter_iterator_generator</tt> is a helper class whose
 | 
			
		||||
purpose is to construct a filter iterator type.  The template
 | 
			
		||||
parameters for this class are the <tt>Predicate</tt> function object
 | 
			
		||||
type and the <tt>BaseIterator</tt> type that is being wrapped.  In
 | 
			
		||||
most cases the associated types for the wrapped iterator can be
 | 
			
		||||
deduced from <tt>std::iterator_traits</tt>, but in some situations the
 | 
			
		||||
user may want to override these types, so there are also template
 | 
			
		||||
parameters for each of the iterator's associated types.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
template <class Predicate, class BaseIterator,
 | 
			
		||||
          class Value, class Reference, class Pointer, class Category, class Distance>
 | 
			
		||||
class filter_iterator_generator
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  typedef <tt><a href="./iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...></tt> type; // the resulting filter iterator type 
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
The following example uses filter iterator to print out all the
 | 
			
		||||
positive integers in an array. 
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
struct is_positive_number {
 | 
			
		||||
  bool operator()(int x) { return 0 < x; }
 | 
			
		||||
};
 | 
			
		||||
int main() {
 | 
			
		||||
  int numbers[] = { 0, -1, 4, -3, 5, 8, -2 };
 | 
			
		||||
  const int N = sizeof(numbers)/sizeof(int);
 | 
			
		||||
 | 
			
		||||
  typedef boost::filter_iterator_generator<is_positive_number, int*, int>::type FilterIter;
 | 
			
		||||
  is_positive_number predicate;
 | 
			
		||||
  FilterIter::policies_type policies(predicate, numbers + N);
 | 
			
		||||
  FilterIter filter_iter_first(numbers, policies);
 | 
			
		||||
  FilterIter filter_iter_last(numbers + N, policies);
 | 
			
		||||
 | 
			
		||||
  std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
The output is:
 | 
			
		||||
<pre>
 | 
			
		||||
4 5 8
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
<Table border>
 | 
			
		||||
<TR>
 | 
			
		||||
<TH>Parameter</TH><TH>Description</TH>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><a href="http://www.sgi.com/tech/stl/Predicate.html"><tt>Predicate</tt></a></TD>
 | 
			
		||||
<TD>The function object that determines which elements are retained and which elements are skipped.
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>BaseIterator</tt></TD>
 | 
			
		||||
<TD>The iterator type being wrapped. This type must at least be a model
 | 
			
		||||
 of the <a href="http://www.sgi.com/tech/stl/InputIterator">InputIterator</a> concept.</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>Value</tt></TD>
 | 
			
		||||
<TD>The <tt>value_type</tt> of the resulting iterator,
 | 
			
		||||
unless const. If const, a conforming compiler strips constness for the
 | 
			
		||||
<tt>value_type</tt>. Typically the default for this parameter is the
 | 
			
		||||
appropriate type<a href="#1">[1]</a>.<br> <b>Default:</b>
 | 
			
		||||
<tt>std::iterator_traits<BaseIterator>::value_type</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>Reference</tt></TD>
 | 
			
		||||
<TD>The <tt>reference</tt> type of the resulting iterator, and in
 | 
			
		||||
particular, the result type of <tt>operator*()</tt>. Typically the default for
 | 
			
		||||
this parameter is the appropriate type.<br> <b>Default:</b> If
 | 
			
		||||
<tt>Value</tt> is supplied, <tt>Value&</tt> is used. Otherwise
 | 
			
		||||
<tt>std::iterator_traits<BaseIterator>::reference</tt> is
 | 
			
		||||
used.</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>Pointer</tt></TD>
 | 
			
		||||
<TD>The <tt>pointer</tt> type of the resulting iterator, and in
 | 
			
		||||
 particular, the result type of <tt>operator->()</tt>. 
 | 
			
		||||
 Typically the default for
 | 
			
		||||
this parameter is the appropriate type.<br>
 | 
			
		||||
<b>Default:</b> If <tt>Value</tt> was supplied, then <tt>Value*</tt>,
 | 
			
		||||
otherwise <tt>std::iterator_traits<BaseIterator>::pointer</tt>.</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>Category</tt></TD>
 | 
			
		||||
<TD>The <tt>iterator_category</tt> type for the resulting iterator.
 | 
			
		||||
Typically the
 | 
			
		||||
default for this parameter is the appropriate type. If you override
 | 
			
		||||
this parameter, do not use <tt>bidirectional_iterator_tag</tt>
 | 
			
		||||
because filter iterators can not go in reverse.<br>
 | 
			
		||||
<b>Default:</b> <tt>std::iterator_traits<BaseIterator>::iterator_category</tt></TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>Distance</tt></TD>
 | 
			
		||||
<TD>The <tt>difference_type</tt> for the resulting iterator. Typically the default for
 | 
			
		||||
this parameter is the appropriate type.<br>
 | 
			
		||||
<b>Default:</b> <tt>std::iterator_traits<BaseIterator>::difference_type</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Model of</h3>
 | 
			
		||||
 | 
			
		||||
The filter iterator adaptor (the type
 | 
			
		||||
<tt>filter_iterator_generator<...>::type</tt>) may be a model of <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a> or <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>
 | 
			
		||||
depending on the adapted iterator type.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Members</h3>
 | 
			
		||||
 | 
			
		||||
The filter iterator type implements all of the member functions and
 | 
			
		||||
operators required of the <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>
 | 
			
		||||
concept.  In addition it has the following constructor:
 | 
			
		||||
 | 
			
		||||
<pre>filter_iterator_generator::type(const BaseIterator& it, const Policies& p = Policies())</pre>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The policies type has only one public function, which is its constructor:
 | 
			
		||||
 | 
			
		||||
<pre>filter_iterator_generator::policies_type(const Predicate& p, const BaseIterator& end)</pre>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
<hr>
 | 
			
		||||
<p>
 | 
			
		||||
 | 
			
		||||
<h2><a name="make_filter_iterator">The Make Filter Iterator Function</a></h2>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
template <class Predicate, class BaseIterator>
 | 
			
		||||
typename filter_generator<Predicate, BaseIterator>::type
 | 
			
		||||
make_filter_iterator(BaseIterator first, BaseIterator last, const Predicate& p = Predicate())
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
This function provides a convenient way to create filter iterators.
 | 
			
		||||
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
In this example we print out all numbers in the array that are
 | 
			
		||||
greater than negative two.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  int numbers[] = { 0, -1, 4, -3, 5, 8, -2 };
 | 
			
		||||
  const int N = sizeof(numbers)/sizeof(int);
 | 
			
		||||
 | 
			
		||||
  std::copy(boost::make_filter_iterator(numbers, numbers + N, 
 | 
			
		||||
					std::bind2nd(std::greater<int>(), -2)),
 | 
			
		||||
	    boost::make_filter_iterator(numbers + N, numbers + N, 
 | 
			
		||||
					std::bind2nd(std::greater<int>(), -2)),
 | 
			
		||||
	    std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
The output is:
 | 
			
		||||
<pre>
 | 
			
		||||
0 -1 4 5 8 
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
In the next example we print the positive numbers using the
 | 
			
		||||
<tt>make_filter_iterator()</tt> function.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
struct is_positive_number {
 | 
			
		||||
  bool operator()(int x) { return 0 < x; }
 | 
			
		||||
};
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  int numbers[] = { 0, -1, 4, -3, 5, 8, -2 };
 | 
			
		||||
  const int N = sizeof(numbers)/sizeof(int);
 | 
			
		||||
 | 
			
		||||
  std::copy(boost::make_filter_iterator<is_positive_number>(numbers, numbers + N),
 | 
			
		||||
	    boost::make_filter_iterator<is_positive_number>(numbers + N, numbers + N),
 | 
			
		||||
	    std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
The output is:
 | 
			
		||||
<pre>
 | 
			
		||||
4 5 8
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Notes</h3>
 | 
			
		||||
 | 
			
		||||
<a name="1">[1]</a> If the compiler does not support partial
 | 
			
		||||
specialization and the wrapped iterator type is a builtin pointer then
 | 
			
		||||
the <tt>Value</tt> type must be explicitly specified (don't use the
 | 
			
		||||
default).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
<p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan -->09 Mar 2001<!--webbot bot="Timestamp" endspan i-checksum="14894" --></p>
 | 
			
		||||
<p><EFBFBD> Copyright Jeremy Siek 2000. Permission to copy, use,
 | 
			
		||||
modify, sell and distribute this document is granted provided this copyright
 | 
			
		||||
notice appears in all copies. This document is provided "as is"
 | 
			
		||||
without express or implied warranty, and with no claim as to its suitability for
 | 
			
		||||
any purpose.</p>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,62 +0,0 @@
 | 
			
		||||
// Example of using the filter iterator adaptor from
 | 
			
		||||
// boost/iterator_adaptors.hpp.
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Jeremy Siek 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.
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <boost/iterator/filter_iterator.hpp>
 | 
			
		||||
 | 
			
		||||
struct is_positive_number {
 | 
			
		||||
  bool operator()(int x) { return 0 < x; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 };
 | 
			
		||||
  const int N = sizeof(numbers_)/sizeof(int);
 | 
			
		||||
  
 | 
			
		||||
  typedef int* base_iterator;
 | 
			
		||||
  base_iterator numbers(numbers_);
 | 
			
		||||
  
 | 
			
		||||
  // Example using make_filter_iterator()
 | 
			
		||||
  std::copy(boost::make_filter_iterator<is_positive_number>(numbers, numbers + N),
 | 
			
		||||
            boost::make_filter_iterator<is_positive_number>(numbers + N, numbers + N),
 | 
			
		||||
            std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // Example using filter_iterator
 | 
			
		||||
  typedef boost::filter_iterator<is_positive_number, base_iterator>
 | 
			
		||||
    FilterIter;
 | 
			
		||||
  
 | 
			
		||||
  is_positive_number predicate;
 | 
			
		||||
  FilterIter filter_iter_first(predicate, numbers, numbers + N);
 | 
			
		||||
  FilterIter filter_iter_last(predicate, numbers + N, numbers + N);
 | 
			
		||||
 | 
			
		||||
  std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // Another example using make_filter_iterator()
 | 
			
		||||
  std::copy(
 | 
			
		||||
      boost::make_filter_iterator(
 | 
			
		||||
          std::bind2nd(std::greater<int>(), -2)
 | 
			
		||||
        , numbers, numbers + N)
 | 
			
		||||
            
 | 
			
		||||
    , boost::make_filter_iterator(
 | 
			
		||||
          std::bind2nd(std::greater<int>(), -2)
 | 
			
		||||
        , numbers + N, numbers + N)
 | 
			
		||||
      
 | 
			
		||||
    , std::ostream_iterator<int>(std::cout, " ")
 | 
			
		||||
  );
 | 
			
		||||
  
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  
 | 
			
		||||
  
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,47 +0,0 @@
 | 
			
		||||
// (C) Copyright Jeremy Siek 2001. 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.
 | 
			
		||||
 | 
			
		||||
// Revision History:
 | 
			
		||||
 | 
			
		||||
// 27 Feb 2001   Jeremy Siek
 | 
			
		||||
//      Initial checkin.
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <boost/function_output_iterator.hpp>
 | 
			
		||||
 | 
			
		||||
struct string_appender
 | 
			
		||||
{
 | 
			
		||||
    string_appender(std::string& s)
 | 
			
		||||
        : m_str(&s)
 | 
			
		||||
    {}
 | 
			
		||||
    
 | 
			
		||||
    void operator()(const std::string& x) const
 | 
			
		||||
    {
 | 
			
		||||
        *m_str += x;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::string* m_str;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  std::vector<std::string> x;
 | 
			
		||||
  x.push_back("hello");
 | 
			
		||||
  x.push_back(" ");
 | 
			
		||||
  x.push_back("world");
 | 
			
		||||
  x.push_back("!");
 | 
			
		||||
 | 
			
		||||
  std::string s = "";
 | 
			
		||||
  std::copy(x.begin(), x.end(), 
 | 
			
		||||
            boost::make_function_output_iterator(string_appender(s)));
 | 
			
		||||
  
 | 
			
		||||
  std::cout << s << std::endl;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,169 +0,0 @@
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
 | 
			
		||||
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
    <meta name="generator" content="HTML Tidy, see www.w3.org">
 | 
			
		||||
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 | 
			
		||||
    <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
 | 
			
		||||
    <meta name="ProgId" content="FrontPage.Editor.Document">
 | 
			
		||||
 | 
			
		||||
    <title>Function Output Iterator Adaptor Documentation</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
        
 | 
			
		||||
    <img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align=
 | 
			
		||||
    "center" width="277" height="86"> 
 | 
			
		||||
 | 
			
		||||
    <h1>Function Output Iterator Adaptor</h1>
 | 
			
		||||
    Defined in header <a href=
 | 
			
		||||
    "../../boost/function_output_iterator.hpp">boost/function_output_iterator.hpp</a> 
 | 
			
		||||
 | 
			
		||||
    <p>The function output iterator adaptor makes it easier to create
 | 
			
		||||
    custom output iterators. The adaptor takes a <a
 | 
			
		||||
    href="http://www.sgi.com/tech/stl/UnaryFunction.html">Unary
 | 
			
		||||
    Function</a> and creates a model of <a
 | 
			
		||||
    href="http://www.sgi.com/tech/stl/OutputIterator.html">Output
 | 
			
		||||
    Iterator</a>. Each item assigned to the output iterator is passed
 | 
			
		||||
    as an argument to the unary function.  The motivation for this
 | 
			
		||||
    iterator is that creating a C++ Standard conforming output
 | 
			
		||||
    iterator is non-trivial, particularly because the proper
 | 
			
		||||
    implementation usually requires a proxy object. On the other hand,
 | 
			
		||||
    creating a function (or function object) is much simpler.
 | 
			
		||||
 | 
			
		||||
    <h2>Synopsis</h2>
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
namespace boost {
 | 
			
		||||
  template <class UnaryFunction>
 | 
			
		||||
  class function_output_iterator;
 | 
			
		||||
 | 
			
		||||
  template <class UnaryFunction>
 | 
			
		||||
  function_output_iterator<UnaryFunction>
 | 
			
		||||
  make_function_output_iterator(const UnaryFunction& f = UnaryFunction())
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h3>Example</h3>
 | 
			
		||||
    
 | 
			
		||||
    In this example we create an output iterator that appends
 | 
			
		||||
    each item onto the end of a string, using the <tt>string_appender</tt>
 | 
			
		||||
    function. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <boost/function_output_iterator.hpp>
 | 
			
		||||
 | 
			
		||||
struct string_appender {
 | 
			
		||||
  string_appender(std::string& s) : m_str(s) { }
 | 
			
		||||
  void operator()(const std::string& x) const {
 | 
			
		||||
    m_str += x;
 | 
			
		||||
  }
 | 
			
		||||
  std::string& m_str;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  std::vector<std::string> x;
 | 
			
		||||
  x.push_back("hello");
 | 
			
		||||
  x.push_back(" ");
 | 
			
		||||
  x.push_back("world");
 | 
			
		||||
  x.push_back("!");
 | 
			
		||||
 | 
			
		||||
  std::string s = "";
 | 
			
		||||
  std::copy(x.begin(), x.end(), 
 | 
			
		||||
            boost::make_function_output_iterator(string_appender(s)));
 | 
			
		||||
  
 | 
			
		||||
  std::cout << s << std::endl;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="function_output_iterator">The Function Output Iterator Class</a></h2>
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
template <class UnaryFunction>
 | 
			
		||||
class function_output_iterator;
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    The <tt>function_output_iterator</tt> class creates an <a
 | 
			
		||||
    href="http://www.sgi.com/tech/stl/OutputIterator.html">Output
 | 
			
		||||
    Iterator</a> out of a
 | 
			
		||||
    <a href="http://www.sgi.com/tech/stl/UnaryFunction.html">Unary
 | 
			
		||||
    Function</a>. Each item assigned to the output iterator is passed
 | 
			
		||||
    as an argument to the unary function.
 | 
			
		||||
 | 
			
		||||
    <h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
    <table border>
 | 
			
		||||
      <tr>
 | 
			
		||||
        <th>Parameter
 | 
			
		||||
 | 
			
		||||
        <th>Description
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>UnaryFunction</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The function type being wrapped. The return type of the
 | 
			
		||||
        function is not used, so it can be <tt>void</tt>.  The
 | 
			
		||||
        function must be a model of <a
 | 
			
		||||
        href="http://www.sgi.com/tech/stl/UnaryFunction.html">Unary
 | 
			
		||||
        Function</a>.</td>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3>Concept Model</h3>
 | 
			
		||||
    The function output iterator class is a model of <a
 | 
			
		||||
    href="http://www.sgi.com/tech/stl/OutputIterator.html">Output
 | 
			
		||||
    Iterator</a>.
 | 
			
		||||
 | 
			
		||||
    <h2>Members</h3>
 | 
			
		||||
    The function output iterator implements the member functions
 | 
			
		||||
    and operators required of the <a
 | 
			
		||||
    href="http://www.sgi.com/tech/stl/OutputIterator.html">Output
 | 
			
		||||
    Iterator</a> concept. In addition it has the following constructor:
 | 
			
		||||
<pre>
 | 
			
		||||
explicit function_output_iterator(const UnaryFunction& f = UnaryFunction())
 | 
			
		||||
</pre>
 | 
			
		||||
   <br>    
 | 
			
		||||
    <br>
 | 
			
		||||
 | 
			
		||||
    <hr>
 | 
			
		||||
    <h2><a name="make_function_output_iterator">The Function Output Iterator Object
 | 
			
		||||
    Generator</a></h2>
 | 
			
		||||
 | 
			
		||||
    The <tt>make_function_output_iterator()</tt> function provides a
 | 
			
		||||
    more convenient way to create function output iterator objects. The
 | 
			
		||||
    function saves the user the trouble of explicitly writing out the
 | 
			
		||||
    iterator types. If the default argument is used, the function
 | 
			
		||||
    type must be provided as an explicit template argument.
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
template <class UnaryFunction>
 | 
			
		||||
function_output_iterator<UnaryFunction>
 | 
			
		||||
make_function_output_iterator(const UnaryFunction& f = UnaryFunction())
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <p>© Copyright Jeremy Siek 2001. Permission to copy, use,
 | 
			
		||||
    modify, sell and distribute this document is granted provided this
 | 
			
		||||
    copyright notice appears in all copies. This document is provided
 | 
			
		||||
    "as is" without express or implied warranty, and with no claim as
 | 
			
		||||
    to its suitability for any purpose.
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,33 +1,37 @@
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
<title>Generator Iterator Adaptor Documentation</title>
 | 
			
		||||
  <meta http-equiv="Content-Language" content="en-us">
 | 
			
		||||
  <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
 | 
			
		||||
 | 
			
		||||
  <title>Generator Iterator Adaptor Documentation</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
        
 | 
			
		||||
<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align="center" width="277" height="86"> 
 | 
			
		||||
  <img src="../../boost.png" alt="boost.png (6897 bytes)" align="middle"
 | 
			
		||||
  width="277" height="86">
 | 
			
		||||
 | 
			
		||||
<h1>Generator Iterator Adaptor</h1>
 | 
			
		||||
Defined in header <a href="../../boost/generator_iterator.hpp">boost/generator_iterator.hpp</a> 
 | 
			
		||||
<p>
 | 
			
		||||
The generator iterator adaptor makes it easier to create custom input
 | 
			
		||||
iterators from 0-ary functions and function objects.  The adaptor
 | 
			
		||||
takes a
 | 
			
		||||
<a href="http://www.sgi.com/tech/stl/Generator.html">Generator</a>
 | 
			
		||||
and creates a model of
 | 
			
		||||
<a href="http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>.
 | 
			
		||||
Each increment retrieves an item from the generator and makes it
 | 
			
		||||
available to be retrieved by dereferencing.  The motivation for this
 | 
			
		||||
iterator is that some concepts can be more naturally expressed as a
 | 
			
		||||
generator, while most STL algorithms expect an iterator.  An example
 | 
			
		||||
is the <a href="../random/index.html">Random Number</a> library.
 | 
			
		||||
  <h1>Generator Iterator Adaptor</h1>
 | 
			
		||||
 | 
			
		||||
<h2>Synopsis</h2>
 | 
			
		||||
  <p>Defined in header <a href=
 | 
			
		||||
  "../../boost/generator_iterator.hpp">boost/generator_iterator.hpp</a></p>
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
  <p>The generator iterator adaptor makes it easier to create custom input
 | 
			
		||||
  iterators from 0-ary functions and function objects. The adaptor takes a
 | 
			
		||||
  <a href="http://www.sgi.com/tech/stl/Generator.html">Generator</a> and
 | 
			
		||||
  creates a model of <a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>. Each
 | 
			
		||||
  increment retrieves an item from the generator and makes it available to be
 | 
			
		||||
  retrieved by dereferencing. The motivation for this iterator is that some
 | 
			
		||||
  concepts can be more naturally expressed as a generator, while most STL
 | 
			
		||||
  algorithms expect an iterator. An example is the <a href=
 | 
			
		||||
  "../random/index.html">Random Number</a> library.</p>
 | 
			
		||||
 | 
			
		||||
  <h2>Synopsis</h2>
 | 
			
		||||
 | 
			
		||||
  <blockquote>
 | 
			
		||||
    <pre>
 | 
			
		||||
namespace boost {
 | 
			
		||||
  template <class Generator>
 | 
			
		||||
  class generator_iterator_policies;
 | 
			
		||||
@@ -40,87 +44,85 @@ namespace boost {
 | 
			
		||||
  make_generator_iterator(Generator & gen);
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
  </blockquote>
 | 
			
		||||
  <hr>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
  <h2>The Generator Iterator Generator Class</h2>
 | 
			
		||||
 | 
			
		||||
<h2>The Generator Iterator Generator Class</h2>
 | 
			
		||||
 | 
			
		||||
The class generator_iterator_generator is a helper class whose purpose
 | 
			
		||||
is to construct a generator iterator type. The template parameter for
 | 
			
		||||
this class is the Generator function object type that is being
 | 
			
		||||
wrapped.  The generator iterator adaptor only holds a reference (or
 | 
			
		||||
pointer) to the function object, therefore the function object must
 | 
			
		||||
outlive the generator iterator adaptor constructed from it.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
template <class Generator>
 | 
			
		||||
  <p>The class generator_iterator_generator is a helper class whose purpose
 | 
			
		||||
  is to construct a generator iterator type. The template parameter for this
 | 
			
		||||
  class is the Generator function object type that is being wrapped. The
 | 
			
		||||
  generator iterator adaptor only holds a reference (or pointer) to the
 | 
			
		||||
  function object, therefore the function object must outlive the generator
 | 
			
		||||
  iterator adaptor constructed from it.</p>
 | 
			
		||||
  <pre>
 | 
			
		||||
template <class Generator>
 | 
			
		||||
class generator_iterator_generator
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  typedef <a href="iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...> type; // the resulting generator iterator type 
 | 
			
		||||
  typedef <i>unspecified</i> type; // the resulting generator iterator type 
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
  <h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
<h3>Template Parameters</h3>
 | 
			
		||||
  <table border summary="">
 | 
			
		||||
    <tr>
 | 
			
		||||
      <th>Parameter</th>
 | 
			
		||||
 | 
			
		||||
<table border>
 | 
			
		||||
<tr>
 | 
			
		||||
<th>Parameter</th>
 | 
			
		||||
<th>Description</th>
 | 
			
		||||
</tr>
 | 
			
		||||
      <th>Description</th>
 | 
			
		||||
    </tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td><tt><a href="http://www.sgi.com/tech/stl/Generator.html">Generator</a></tt> 
 | 
			
		||||
<td>The generator (0-ary function object) type being
 | 
			
		||||
wrapped.  The return type of the function must be defined as
 | 
			
		||||
<tt>Generator::result_type</tt>.  The function object must be a model
 | 
			
		||||
of
 | 
			
		||||
<a href="http://www.sgi.com/tech/stl/Generator.html">Generator</a>.
 | 
			
		||||
</td>
 | 
			
		||||
</table>
 | 
			
		||||
    <tr>
 | 
			
		||||
      <td><tt><a href=
 | 
			
		||||
      "http://www.sgi.com/tech/stl/Generator.html">Generator</a></tt></td>
 | 
			
		||||
 | 
			
		||||
<h3>Concept Model</h3>
 | 
			
		||||
The generator iterator class is a model of
 | 
			
		||||
<a href="http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>.
 | 
			
		||||
      <td>The generator (0-ary function object) type being wrapped. The
 | 
			
		||||
      return type of the function must be defined as
 | 
			
		||||
      <tt>Generator::result_type</tt>. The function object must be a model of
 | 
			
		||||
      <a href=
 | 
			
		||||
      "http://www.sgi.com/tech/stl/Generator.html">Generator</a>.</td>
 | 
			
		||||
    </tr>
 | 
			
		||||
  </table>
 | 
			
		||||
 | 
			
		||||
<h3>Members</h3>
 | 
			
		||||
The generator iterator implements the member functions
 | 
			
		||||
and operators required of the
 | 
			
		||||
<a href="http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>
 | 
			
		||||
concept.
 | 
			
		||||
  <h3>Concept Model</h3>
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
  <p>The generator iterator class is a model of <a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>.</p>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
<h2><a name="make_generator_iterator">The Generator Iterator Object Generator</a></h2>
 | 
			
		||||
  <h3>Members</h3>
 | 
			
		||||
 | 
			
		||||
The <tt>make_generator_iterator()</tt> function provides a
 | 
			
		||||
convenient way to create generator iterator objects. The function
 | 
			
		||||
saves the user the trouble of explicitly writing out the iterator
 | 
			
		||||
types.
 | 
			
		||||
  <p>The generator iterator implements the member functions and operators
 | 
			
		||||
  required of the <a href=
 | 
			
		||||
  "http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>
 | 
			
		||||
  concept.<br></p>
 | 
			
		||||
  <hr>
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
  <h2><a name="make_generator_iterator" id="make_generator_iterator">The
 | 
			
		||||
  Generator Iterator Object Generator</a></h2>
 | 
			
		||||
 | 
			
		||||
  <p>The <tt>make_generator_iterator()</tt> function provides a convenient
 | 
			
		||||
  way to create generator iterator objects. The function saves the user the
 | 
			
		||||
  trouble of explicitly writing out the iterator types.</p>
 | 
			
		||||
 | 
			
		||||
  <blockquote>
 | 
			
		||||
    <pre>
 | 
			
		||||
template <class Generator>
 | 
			
		||||
typename generator_iterator_generator<Generator>::type
 | 
			
		||||
make_generator_iterator(Generator & gen);
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
  </blockquote>
 | 
			
		||||
  <hr>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
  <h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
  <p>The following program shows how <code>generator_iterator</code>
 | 
			
		||||
  transforms a generator into an input iterator.</p>
 | 
			
		||||
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
The following program shows how <code>generator_iterator</code>
 | 
			
		||||
transforms a generator into an input iterator.
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <boost/generator_iterator.hpp>
 | 
			
		||||
  <blockquote>
 | 
			
		||||
    <pre>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <boost/generator_iterator.hpp>
 | 
			
		||||
 | 
			
		||||
class my_generator
 | 
			
		||||
{
 | 
			
		||||
@@ -140,11 +142,22 @@ int main()
 | 
			
		||||
    std::cout << *it << std::endl;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
  </blockquote>
 | 
			
		||||
  <hr>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
  <p><a href="http://validator.w3.org/check?uri=referer"><img border="0" src=
 | 
			
		||||
  "../../doc/images/valid-html401.png" alt="Valid HTML 4.01 Transitional"
 | 
			
		||||
  height="31" width="88"></a></p>
 | 
			
		||||
 | 
			
		||||
Written by Jens Maurer.
 | 
			
		||||
  <p>Revised 
 | 
			
		||||
  <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->05 December, 2006<!--webbot bot="Timestamp" endspan i-checksum="38516" --></p>
 | 
			
		||||
 | 
			
		||||
  <p><i>Copyright © 2001 <a href=
 | 
			
		||||
  "http://www.boost.org/people/jens_maurer.htm">Jens Maurer</a></i></p>
 | 
			
		||||
 | 
			
		||||
  <p><i>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>)</i></p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,366 +0,0 @@
 | 
			
		||||
// (C) Copyright David Abrahams 2001. 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.
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org for most recent version including documentation.
 | 
			
		||||
//
 | 
			
		||||
// Revision History
 | 
			
		||||
// 11 Feb 2001  Compile with Borland, re-enable failing tests (David Abrahams)
 | 
			
		||||
// 29 Jan 2001  Initial revision (David Abrahams)
 | 
			
		||||
 | 
			
		||||
#include <boost/half_open_range.hpp>
 | 
			
		||||
#include <boost/utility.hpp>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <list>
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <stdexcept>
 | 
			
		||||
#ifndef BOOST_NO_LIMITS
 | 
			
		||||
# include <limits>
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef BOOST_NO_SLIST
 | 
			
		||||
# include <slist>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
inline unsigned unsigned_random(unsigned max)
 | 
			
		||||
{
 | 
			
		||||
    return (max > 0) ? (unsigned)rand() % max : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Special tests for ranges supporting random access
 | 
			
		||||
template <class T>
 | 
			
		||||
void category_test_1(
 | 
			
		||||
    const boost::half_open_range<T>& r, std::random_access_iterator_tag)
 | 
			
		||||
{
 | 
			
		||||
    typedef boost::half_open_range<T> range;
 | 
			
		||||
    typedef typename range::size_type size_type;
 | 
			
		||||
    size_type size = r.size();
 | 
			
		||||
 | 
			
		||||
    // pick a random offset
 | 
			
		||||
    size_type offset = unsigned_random(size);
 | 
			
		||||
 | 
			
		||||
    typename range::value_type x = *(r.begin() + offset);
 | 
			
		||||
    // test contains(value_type)
 | 
			
		||||
    assert(r.contains(r.start()) == !r.empty());
 | 
			
		||||
    assert(!r.contains(r.finish()));
 | 
			
		||||
    assert(r.contains(x) == (offset != size));
 | 
			
		||||
 | 
			
		||||
    range::const_iterator p = r.find(x);
 | 
			
		||||
    assert((p == r.end()) == (x == r.finish()));
 | 
			
		||||
    assert(r.find(r.finish()) == r.end());
 | 
			
		||||
 | 
			
		||||
    if (offset != size)
 | 
			
		||||
    {
 | 
			
		||||
        assert(x == r[offset]);
 | 
			
		||||
        assert(x == r.at(offset));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool caught_out_of_range = false;
 | 
			
		||||
    try {
 | 
			
		||||
        bool never_initialized = x == r.at(size);
 | 
			
		||||
        (void)never_initialized;
 | 
			
		||||
    }
 | 
			
		||||
    catch(std::out_of_range&)
 | 
			
		||||
    {
 | 
			
		||||
        caught_out_of_range = true;
 | 
			
		||||
    }
 | 
			
		||||
    catch(...)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
    assert(caught_out_of_range);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Those tests must be skipped for other ranges
 | 
			
		||||
template <class T>
 | 
			
		||||
void category_test_1(
 | 
			
		||||
    const boost::half_open_range<T>&, std::forward_iterator_tag)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned indices[][2] = { {0,0},{0,1},{0,2},{0,3},
 | 
			
		||||
                                {1,1},{1,2},{1,3},
 | 
			
		||||
                                      {2,2},{2,3},
 | 
			
		||||
                                            {3,3}};
 | 
			
		||||
 | 
			
		||||
template <class Range>
 | 
			
		||||
void category_test_2(
 | 
			
		||||
    const std::vector<Range>& ranges, unsigned i, unsigned j, std::random_access_iterator_tag)
 | 
			
		||||
{
 | 
			
		||||
    typedef Range range;
 | 
			
		||||
    const range& ri = ranges[i];
 | 
			
		||||
    const range& rj = ranges[j];
 | 
			
		||||
 | 
			
		||||
    if (indices[i][0] <= indices[j][0] && indices[i][1] >= indices[j][1])
 | 
			
		||||
        assert(ri.contains(rj));
 | 
			
		||||
 | 
			
		||||
    if (ri.contains(rj))
 | 
			
		||||
        assert((ri & rj) == rj);
 | 
			
		||||
    assert(boost::intersects(ri, rj) == !(ri & rj).empty());
 | 
			
		||||
 | 
			
		||||
    range t1(ri);
 | 
			
		||||
    t1 &= rj;
 | 
			
		||||
    assert(t1 == range(indices[i][0] > indices[j][0] ? ri.start() : rj.start(),
 | 
			
		||||
                       indices[i][1] < indices[j][1] ? ri.finish() : rj.finish()));
 | 
			
		||||
    assert(t1 == (ri & rj));
 | 
			
		||||
    
 | 
			
		||||
    range t2(ri);
 | 
			
		||||
    t2 |= rj;
 | 
			
		||||
    
 | 
			
		||||
    if (ri.empty())
 | 
			
		||||
        assert(t2 == rj);
 | 
			
		||||
    else if (rj.empty())
 | 
			
		||||
        assert(t2 == ri);
 | 
			
		||||
    else
 | 
			
		||||
        assert(t2 == range(indices[i][0] < indices[j][0] ? ri.start() : rj.start(),
 | 
			
		||||
                           indices[i][1] > indices[j][1] ? ri.finish() : rj.finish()));
 | 
			
		||||
    assert(t2 == (ri | rj));
 | 
			
		||||
    if (i == j)
 | 
			
		||||
        assert(ri == rj);
 | 
			
		||||
    
 | 
			
		||||
    if (ri.empty() || rj.empty())
 | 
			
		||||
        assert((ri == rj) == (ri.empty() && rj.empty()));
 | 
			
		||||
    else
 | 
			
		||||
        assert((ri == rj) == (ri.start() == rj.start() && ri.finish() == rj.finish()));
 | 
			
		||||
 | 
			
		||||
    assert((ri == rj) == !(ri != rj));
 | 
			
		||||
 | 
			
		||||
    bool same = ri == rj;
 | 
			
		||||
    bool one_empty = ri.empty() != rj.empty();
 | 
			
		||||
 | 
			
		||||
    std::less<range> less;
 | 
			
		||||
    std::less_equal<range> less_equal;
 | 
			
		||||
    std::greater<range> greater;
 | 
			
		||||
    std::greater_equal<range> greater_equal;
 | 
			
		||||
    
 | 
			
		||||
    if (same)
 | 
			
		||||
    {
 | 
			
		||||
        assert(greater_equal(ri,rj));
 | 
			
		||||
        assert(less_equal(ri,rj));
 | 
			
		||||
        assert(!greater(ri,rj));
 | 
			
		||||
        assert(!less(ri,rj));
 | 
			
		||||
    }
 | 
			
		||||
    else if (one_empty)
 | 
			
		||||
    {
 | 
			
		||||
        const range& empty = ri.empty() ? ri : rj;
 | 
			
		||||
        const range& non_empty = rj.empty() ? ri : rj;
 | 
			
		||||
        
 | 
			
		||||
        assert(less(empty,non_empty));
 | 
			
		||||
        assert(less_equal(empty,non_empty));
 | 
			
		||||
        assert(!greater(empty,non_empty));
 | 
			
		||||
        assert(!greater_equal(empty,non_empty));
 | 
			
		||||
        assert(!less(non_empty,empty));
 | 
			
		||||
        assert(!less_equal(non_empty,empty));
 | 
			
		||||
        assert(greater(non_empty,empty));
 | 
			
		||||
        assert(greater_equal(non_empty,empty));
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        if (indices[i][0] < indices[j][0] ||
 | 
			
		||||
            indices[i][0] == indices[j][0] && indices[i][1] < indices[j][1])
 | 
			
		||||
        {
 | 
			
		||||
            assert(!greater_equal(ri,rj));
 | 
			
		||||
            assert(less(ri,rj));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (indices[i][0] < indices[j][0] ||
 | 
			
		||||
            indices[i][0] == indices[j][0] && indices[i][1] <= indices[j][1])
 | 
			
		||||
        {
 | 
			
		||||
            assert(!greater(ri,rj));
 | 
			
		||||
            assert(less_equal(ri,rj));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (indices[i][0] > indices[j][0] ||
 | 
			
		||||
            indices[i][0] == indices[j][0] && indices[i][1] > indices[j][1])
 | 
			
		||||
        {
 | 
			
		||||
            assert(!less_equal(ri,rj));
 | 
			
		||||
            assert(greater(ri,rj));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (indices[i][0] > indices[j][0] ||
 | 
			
		||||
            indices[i][0] == indices[j][0] && indices[i][1] >= indices[j][1])
 | 
			
		||||
        {
 | 
			
		||||
            assert(!less(ri,rj));
 | 
			
		||||
            assert(greater_equal(ri,rj));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template <class Range>
 | 
			
		||||
void category_test_2(
 | 
			
		||||
    const std::vector<Range>&, unsigned, unsigned, std::forward_iterator_tag)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
void category_test_2(
 | 
			
		||||
    const std::vector<boost::half_open_range<T> >&, unsigned, unsigned, std::bidirectional_iterator_tag)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class Range>
 | 
			
		||||
void test_back(Range& x, std::bidirectional_iterator_tag)
 | 
			
		||||
{
 | 
			
		||||
    assert(x.back() == boost::prior(x.finish()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class Range>
 | 
			
		||||
void test_back(Range& x, std::forward_iterator_tag)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
boost::half_open_range<T> range_identity(const boost::half_open_range<T>& x)
 | 
			
		||||
{
 | 
			
		||||
    return x;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
void test(T x0, T x1, T x2, T x3)
 | 
			
		||||
{
 | 
			
		||||
    std::vector<boost::half_open_range<T> > ranges;
 | 
			
		||||
    typedef boost::half_open_range<T> range;
 | 
			
		||||
 | 
			
		||||
    T bounds[4] = { x0, x1, x2, x3 };
 | 
			
		||||
 | 
			
		||||
    const std::size_t num_ranges = sizeof(indices)/sizeof(*indices);
 | 
			
		||||
    // test construction
 | 
			
		||||
    for (std::size_t n = 0; n < num_ranges;++n)
 | 
			
		||||
    {
 | 
			
		||||
        T start = bounds[indices[n][0]];
 | 
			
		||||
        T finish = bounds[indices[n][1]];
 | 
			
		||||
        boost::half_open_range<T> r(start, finish);
 | 
			
		||||
        ranges.push_back(r);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // test implicit conversion from std::pair<T,T>
 | 
			
		||||
    range converted = std::pair<T,T>(x0,x0);
 | 
			
		||||
    (void)converted;
 | 
			
		||||
 | 
			
		||||
    // test assignment, equality and inequality
 | 
			
		||||
    range r00 = range(x0, x0);
 | 
			
		||||
    assert(r00 == range(x0,x0));
 | 
			
		||||
    assert(r00 == range(x1,x1)); // empty ranges are all equal
 | 
			
		||||
    if (x3 != x0)
 | 
			
		||||
        assert(r00 != range(x0, x3));
 | 
			
		||||
    r00 = range(x0, x3);
 | 
			
		||||
    assert(r00 == range(x0, x3));
 | 
			
		||||
    if (x3 != x0)
 | 
			
		||||
        assert(r00 != range(x0, x0));
 | 
			
		||||
 | 
			
		||||
    typedef typename range::iterator iterator;
 | 
			
		||||
    typedef typename iterator::iterator_category category;
 | 
			
		||||
    
 | 
			
		||||
    for (unsigned i = 0; i < num_ranges; ++i)
 | 
			
		||||
    {
 | 
			
		||||
        const range& r = ranges[i];
 | 
			
		||||
            
 | 
			
		||||
        // test begin(), end(), basic iteration.
 | 
			
		||||
        unsigned count = 0;
 | 
			
		||||
        for (range::const_iterator p = r.begin(), finish = r.end();
 | 
			
		||||
             p != finish;
 | 
			
		||||
             ++p, ++count)
 | 
			
		||||
        {
 | 
			
		||||
            assert(count < 2100);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // test size(), empty(), front(), back()
 | 
			
		||||
        assert((unsigned)r.size() == count);
 | 
			
		||||
        if (indices[i][0] == indices[i][1])
 | 
			
		||||
            assert(r.empty());
 | 
			
		||||
        if (r.empty())
 | 
			
		||||
            assert(r.size() == 0);
 | 
			
		||||
        if (!r.empty())
 | 
			
		||||
        {
 | 
			
		||||
            assert(r.front() == r.start());
 | 
			
		||||
            test_back(r, category());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
            // test swap
 | 
			
		||||
        range r1(r);
 | 
			
		||||
        range r2(x0,x3);
 | 
			
		||||
        const bool same = r1 == r2;
 | 
			
		||||
        r1.swap(r2);
 | 
			
		||||
        assert(r1 == range(x0,x3));
 | 
			
		||||
        assert(r2 == r);
 | 
			
		||||
        if (!same) {
 | 
			
		||||
            assert(r1 != r);
 | 
			
		||||
            assert(r2 != range(x0,x3));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // do individual tests for random-access iterators
 | 
			
		||||
        category_test_1(r, category());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (unsigned j = 0; j < num_ranges; ++j) {
 | 
			
		||||
        for (unsigned k = 0; k < num_ranges; ++k) {
 | 
			
		||||
            category_test_2(ranges, j, k, category());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class Integer>
 | 
			
		||||
void test_integer(Integer* = 0) // default arg works around MSVC bug
 | 
			
		||||
{
 | 
			
		||||
    Integer a = 0;
 | 
			
		||||
    Integer b = a + unsigned_random(128 - a);
 | 
			
		||||
    Integer c = b + unsigned_random(128 - b);
 | 
			
		||||
    Integer d = c + unsigned_random(128 - c);
 | 
			
		||||
 | 
			
		||||
    test(a, b, c, d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class Container>
 | 
			
		||||
void test_container(Container* = 0)  // default arg works around MSVC bug
 | 
			
		||||
{
 | 
			
		||||
    Container c(unsigned_random(1673));
 | 
			
		||||
 | 
			
		||||
    const typename Container::size_type offset1 = unsigned_random(c.size());
 | 
			
		||||
    const typename Container::size_type offset2 = unsigned_random(c.size() - offset1);
 | 
			
		||||
    typename Container::iterator internal1 = c.begin();
 | 
			
		||||
    std::advance(internal1, offset1);
 | 
			
		||||
    typename Container::iterator internal2 = internal1;
 | 
			
		||||
    std::advance(internal2, offset2);
 | 
			
		||||
    
 | 
			
		||||
    test(c.begin(), internal1, internal2, c.end());
 | 
			
		||||
 | 
			
		||||
    typedef typename Container::const_iterator const_iterator;
 | 
			
		||||
    test(const_iterator(c.begin()),
 | 
			
		||||
         const_iterator(internal1),
 | 
			
		||||
         const_iterator(internal2),
 | 
			
		||||
         const_iterator(c.end()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    // Test the built-in integer types.
 | 
			
		||||
    test_integer<char>();
 | 
			
		||||
    test_integer<unsigned char>();
 | 
			
		||||
    test_integer<signed char>();
 | 
			
		||||
    test_integer<wchar_t>();
 | 
			
		||||
    test_integer<short>();
 | 
			
		||||
    test_integer<unsigned short>();
 | 
			
		||||
    test_integer<int>();
 | 
			
		||||
    test_integer<unsigned int>();
 | 
			
		||||
    test_integer<long>();
 | 
			
		||||
    test_integer<unsigned long>();
 | 
			
		||||
#if defined(BOOST_HAS_LONG_LONG)
 | 
			
		||||
    test_integer<long long>();
 | 
			
		||||
    test_integer<unsigned long long>();
 | 
			
		||||
#endif
 | 
			
		||||
    // Some tests on container iterators, to prove we handle a few different categories
 | 
			
		||||
    test_container<std::vector<int> >();
 | 
			
		||||
    test_container<std::list<int> >();
 | 
			
		||||
#ifndef BOOST_NO_SLIST
 | 
			
		||||
    test_container<BOOST_STD_EXTENSION_NAMESPACE::slist<int> >();
 | 
			
		||||
#endif
 | 
			
		||||
    // Also prove that we can handle raw pointers.
 | 
			
		||||
    int array[2000];
 | 
			
		||||
    const std::size_t a = 0;
 | 
			
		||||
    const std::size_t b = a + unsigned_random(2000 - a);
 | 
			
		||||
    const std::size_t c = b + unsigned_random(2000 - b);
 | 
			
		||||
    test(array, array+b, array+c, array+2000);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										296
									
								
								in_place_factories.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								in_place_factories.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,296 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//SoftQuad Software//DTD HoTMetaL PRO 5.0::19981217::extensions to HTML 4.0//EN" "hmpro5.dtd">
 | 
			
		||||
 | 
			
		||||
<HTML>
 | 
			
		||||
 | 
			
		||||
<HEAD>
 | 
			
		||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
 | 
			
		||||
<TITLE>In_place_factory Documentation</TITLE>
 | 
			
		||||
</HEAD>
 | 
			
		||||
 | 
			
		||||
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080">
 | 
			
		||||
<H2 align="left"><IMG SRC="../../boost.png" WIDTH="276" HEIGHT="86"></H2>
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
  <blockquote>
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      <blockquote>
 | 
			
		||||
        <blockquote>
 | 
			
		||||
          <blockquote>
 | 
			
		||||
<H2 align="left">Header <<A
 | 
			
		||||
HREF="../../boost/utility/in_place_factory.hpp">boost/utility/in_place_factory.hpp</A>> </H2>
 | 
			
		||||
 | 
			
		||||
<H2 align="left">Header <<A
 | 
			
		||||
HREF="../../boost/utility/typed_in_place_factory.hpp">boost/utility/typed_in_place_factory.hpp</A>> </H2>
 | 
			
		||||
 | 
			
		||||
          </blockquote>
 | 
			
		||||
        </blockquote>
 | 
			
		||||
      </blockquote>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
  </blockquote>
 | 
			
		||||
</blockquote>
 | 
			
		||||
<p> </p>
 | 
			
		||||
 | 
			
		||||
<H2>Contents</H2>
 | 
			
		||||
<DL CLASS="page-index">
 | 
			
		||||
  <DT><A HREF="#mot">Motivation</A></DT>
 | 
			
		||||
  <DT><A HREF="#framework">Framework</A></DT>
 | 
			
		||||
  <DT><A HREF="#specification">Specification</A></DT>
 | 
			
		||||
  <DT><A HREF="#container-usage">Container-side Usage</A></DT>
 | 
			
		||||
  <DT><A HREF="#user-usage">User-side Usage</A></DT>
 | 
			
		||||
</DL>
 | 
			
		||||
 | 
			
		||||
<HR>
 | 
			
		||||
 | 
			
		||||
<H2><A NAME="mot"></A>Motivation</H2>
 | 
			
		||||
 | 
			
		||||
<p>Suppose we have a class</p>
 | 
			
		||||
<pre>struct X
 | 
			
		||||
{
 | 
			
		||||
  X ( int, std:::string ) ;
 | 
			
		||||
} ;</pre>
 | 
			
		||||
<p>And a container for it which supports an empty state (that is, which can contain zero objects):</p>
 | 
			
		||||
<pre>struct C
 | 
			
		||||
{
 | 
			
		||||
   C() : contained_(0) {}
 | 
			
		||||
  ~C() { delete contained_ ; }
 | 
			
		||||
  X* contained_ ;
 | 
			
		||||
} ;</pre>
 | 
			
		||||
<p>A container designed to support an empty state typically doesn't require the contained type to be DefaultConstructible,
 | 
			
		||||
but it typically requires it to be CopyConstructible as a mechanism to
 | 
			
		||||
initialize the object to store:</p>
 | 
			
		||||
<pre>struct C
 | 
			
		||||
{
 | 
			
		||||
   C() : contained_(0) {}
 | 
			
		||||
   C ( X const& v ) : contained_ ( new X(v) ) {}
 | 
			
		||||
  ~C() { delete contained_ ; }
 | 
			
		||||
  X* contained_ ;
 | 
			
		||||
} ;</pre>
 | 
			
		||||
<p>There is a subtle problem with this: since the mechanism used to initialize the stored object is copy construction,
 | 
			
		||||
there must exist a previously constructed source object to copy from. This
 | 
			
		||||
object is likely to be temporary and serve no purpose besides being the source</p>
 | 
			
		||||
<pre>void foo()
 | 
			
		||||
{
 | 
			
		||||
  // Temporary object created.
 | 
			
		||||
  C c( X(123,"hello") ) ;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
<p>A solution to this problem is to support direct construction of the contained
 | 
			
		||||
object right in the container's storage.<br>
 | 
			
		||||
In this scheme, the user supplies the arguments for the X constructor
 | 
			
		||||
directly to the container:</p>
 | 
			
		||||
<pre>struct C
 | 
			
		||||
{
 | 
			
		||||
   C() : contained_(0) {}
 | 
			
		||||
   C ( X const& v ) : contained_ ( new X(v) ) {}
 | 
			
		||||
   C ( int a0, std::string a1 ) : contained_ ( new X(a0,a1) ) {}
 | 
			
		||||
  ~C() { delete contained_ ; }
 | 
			
		||||
  X* contained_ ;
 | 
			
		||||
} ;</pre>
 | 
			
		||||
<pre>void foo()
 | 
			
		||||
{
 | 
			
		||||
  // Wrapped object constructed in-place
 | 
			
		||||
  // No temporary created.
 | 
			
		||||
  C c(123,"hello") ;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
<p>Clearly, this solution doesn't scale well since the container must duplicate all the constructor overloads from the contained type
 | 
			
		||||
(at least all those which are to be supported directly in the container).</p>
 | 
			
		||||
 | 
			
		||||
<H2><A NAME="framework"></A>Framework</H2>
 | 
			
		||||
<p>
 | 
			
		||||
This library proposes a framework to allow some containers to directly contruct contained objects in-place without requiring
 | 
			
		||||
the entire set of constructor overloads from the contained type. It also allows the container to remove the CopyConstuctible
 | 
			
		||||
requirement from the contained type since objects can be directly constructed in-place without need of a copy.<br>
 | 
			
		||||
The only requirement on the container is that it must provide proper storage (that is, correctly aligned and sized).
 | 
			
		||||
Naturally, the container will typically support uninitialized storage to avoid the in-place construction to override
 | 
			
		||||
a fully-constructed object (as this would defeat the purpose of in-place construction)
 | 
			
		||||
</p>
 | 
			
		||||
<p>For this purpose, the framework provides two families of classes collectively called: InPlaceFactories and TypedInPlaceFactories.<br>
 | 
			
		||||
Essentially, these classes hold a sequence of actual parameters and a method to contruct an object in place using these parameters.
 | 
			
		||||
Each member of the family differs only in the number (and type) of the parameter list. The first family
 | 
			
		||||
takes the type of the object to construct directly in method provided for that
 | 
			
		||||
purpose, whereas the second family incorporates that type in the factory class
 | 
			
		||||
itself..</p>
 | 
			
		||||
<p>From the container POV, using the framework amounts to calling the factory's method to contruct the object in place.
 | 
			
		||||
From the user POV, it amounts to creating the right factory object to hold the parameters and pass it to the container.<br>
 | 
			
		||||
The following simplified example shows the basic idea. A complete example follows the formal specification of the framework:</p>
 | 
			
		||||
<pre>struct C
 | 
			
		||||
{
 | 
			
		||||
   template<class InPlaceFactory>
 | 
			
		||||
   C ( InPlaceFactory const& aFactory )
 | 
			
		||||
    :
 | 
			
		||||
    contained_ ( uninitialized_storage() )
 | 
			
		||||
   {
 | 
			
		||||
     aFactory.template apply<X>(contained_);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  ~C() 
 | 
			
		||||
  { 
 | 
			
		||||
    contained_ -> X::~X();
 | 
			
		||||
    delete[] contained_ ; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  char* uninitialized_storage() { return new char[sizeof(X)] ; }
 | 
			
		||||
 | 
			
		||||
  char* contained_ ;
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
void foo()
 | 
			
		||||
{
 | 
			
		||||
  C c( in_place(123,"hello") ) ;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<HR>
 | 
			
		||||
 | 
			
		||||
<H2><A NAME="specification">Specification</A></H2>
 | 
			
		||||
 | 
			
		||||
<p>The following is the first member of the family of 'in_place_factory' classes, along with its corresponding helper template function.
 | 
			
		||||
The rest of the family varies only in the number and type of template (and constructor) parameters.</p>
 | 
			
		||||
<PRE>namespace boost {
 | 
			
		||||
 | 
			
		||||
struct in_place_factory_base {} ;
 | 
			
		||||
 | 
			
		||||
template<class A0>
 | 
			
		||||
class in_place_factory : public in_place_factory_base
 | 
			
		||||
{
 | 
			
		||||
  public:</PRE>
 | 
			
		||||
 | 
			
		||||
<PRE>    in_place_factory ( A0 const& a0 ) : m_a0(a0) {}
 | 
			
		||||
 | 
			
		||||
    template< class T >
 | 
			
		||||
    void apply ( void* address ) const
 | 
			
		||||
    {
 | 
			
		||||
      new (address) T(m_a0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  private:</PRE>
 | 
			
		||||
 | 
			
		||||
<PRE>    A0 const& m_a0 ;
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
template<class A0>
 | 
			
		||||
in_place_factory<A0> in_place ( A0 const& a0 )
 | 
			
		||||
{
 | 
			
		||||
  return in_place_factory<A0>(a0);
 | 
			
		||||
}
 | 
			
		||||
</PRE>
 | 
			
		||||
 | 
			
		||||
<p>Similarly, the following is the first member of the family of 'typed_in_place_factory' classes, along with its corresponding
 | 
			
		||||
helper template function. The rest of the family varies only in the number and type of template (and constructor) parameters.</p>
 | 
			
		||||
<PRE>namespace boost {
 | 
			
		||||
 | 
			
		||||
struct typed_in_place_factory_base {} ;
 | 
			
		||||
 | 
			
		||||
template<class T, class A0>
 | 
			
		||||
class typed_in_place_factory : public typed_in_place_factory_base
 | 
			
		||||
{
 | 
			
		||||
  public:</PRE>
 | 
			
		||||
 | 
			
		||||
<PRE>    typed_in_place_factory ( A0 const& a0 ) : m_a0(a0) {}
 | 
			
		||||
 | 
			
		||||
    void apply ( void* address ) const
 | 
			
		||||
    {
 | 
			
		||||
      new (address) T(m_a0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  private:</PRE>
 | 
			
		||||
 | 
			
		||||
<PRE>    A0 const& m_a0 ;
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
template<class T, class A0>
 | 
			
		||||
typed_in_place_factory<A0> in_place ( A0 const& a0 )
 | 
			
		||||
{
 | 
			
		||||
  return typed_in_place_factory<T,A0>(a0);
 | 
			
		||||
}</PRE>
 | 
			
		||||
 | 
			
		||||
<PRE>}
 | 
			
		||||
</PRE>
 | 
			
		||||
 | 
			
		||||
<p>As you can see, the 'in_place_factory' and 'typed_in_place_factory' template classes varies only in the way they specify
 | 
			
		||||
the target type: in the first family, the type is given as a template argument to the apply member function while in the
 | 
			
		||||
second it is given directly as part of the factory class.<br>
 | 
			
		||||
When the container holds a unique non-polymorphic type (such as the case of Boost.Optional), it knows the exact dynamic-type
 | 
			
		||||
of the contained object and can pass it to the apply() method of a (non-typed) factory.
 | 
			
		||||
In this case, end users can use an 'in_place_factory' instance which can be constructed without the type of the object to construct.<br>
 | 
			
		||||
However, if the container holds heterogeneous or polymorphic objects (such as the case of Boost.Variant), the dynamic-type
 | 
			
		||||
of the object to be constructed must be known by the factory itslef. In this case, end users must use a 'typed_in_place_factory'
 | 
			
		||||
instead.</p>
 | 
			
		||||
 | 
			
		||||
<HR>
 | 
			
		||||
 | 
			
		||||
<h2><A NAME="container-usage">Container-side Usage</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>As shown in the introductory simplified example, the container class must
 | 
			
		||||
contain methods that accept an instance of
 | 
			
		||||
these factories and pass the object's storage to the factory's apply method.<br>
 | 
			
		||||
However, the type of the factory class cannot be completly specified in the container class because that would
 | 
			
		||||
defeat the whole purpose of the factories which is to allow the container to accept a variadic argument list
 | 
			
		||||
for the constructor of its contained object.<br>
 | 
			
		||||
The correct function overload must be based on the only distinctive and common
 | 
			
		||||
characteristic of all the classes in each family, the base class.<br>
 | 
			
		||||
Depending on the container class, you can use 'enable_if' to generate the right overload, or use the following
 | 
			
		||||
dispatch technique (used in the Boost.Optional class):
 | 
			
		||||
</p>
 | 
			
		||||
<pre>struct C
 | 
			
		||||
{
 | 
			
		||||
   C() : contained_(0) {}
 | 
			
		||||
   C ( X const& v ) : contained_ ( new X(v) ) {}
 | 
			
		||||
 | 
			
		||||
   template<class Expr>
 | 
			
		||||
   C ( Expr const& expr )
 | 
			
		||||
    :
 | 
			
		||||
    contained_ ( uninitialized_storage() )
 | 
			
		||||
   {
 | 
			
		||||
    construct(expr,&expr)
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  ~C() { delete contained_ ; }
 | 
			
		||||
 | 
			
		||||
  template<class InPlaceFactory>
 | 
			
		||||
  void construct ( InPlaceFactory const& aFactory, boost::in_place_factory_base* )
 | 
			
		||||
  {
 | 
			
		||||
    aFactory.template apply<X>(contained_);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template<class TypedInPlaceFactory>
 | 
			
		||||
  void construct ( TypedInPlaceFactory const& aFactory, boost::typed_in_place_factory_base* )
 | 
			
		||||
  {
 | 
			
		||||
    aFactory.apply(contained_);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  X* uninitialized_storage() { return static_cast<X*>(new char[sizeof(X)]) ; }
 | 
			
		||||
 | 
			
		||||
  X* contained_ ;
 | 
			
		||||
} ;
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
<h2><A NAME="user-usage">User-side Usage</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>End users pass to the container an instance of a factory object holding the actual parameters needed to construct the
 | 
			
		||||
contained object directly within the container. For this, the helper template function 'in_place' is used.<br>
 | 
			
		||||
The call 'in_place(a0,a1,a2,...,an)' constructs a (non-typed) 'in_place_factory' instance with the given argument list.<br>
 | 
			
		||||
The call 'in_place<T>(a0,a1,a2,...,an)' constructs a 'typed_in_place_factory' instance with the given argument list for the
 | 
			
		||||
type 'T'.</p>
 | 
			
		||||
<pre>void foo()
 | 
			
		||||
{
 | 
			
		||||
  C a( in_place(123,"hello") ) ;    // in_place_factory passed
 | 
			
		||||
  C b( in_place<X>(456,"world") ) ; // typed_in_place_factory passed
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<P>Revised September 17, 2004</P>
 | 
			
		||||
<p><EFBFBD> Copyright Fernando Luis Cacciola Carballal, 2004</p>
 | 
			
		||||
<p> Use, modification, and distribution are subject to 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">
 | 
			
		||||
www.boost.org/LICENSE_1_0.txt</a>)</p>
 | 
			
		||||
<P>Developed by <A HREF="mailto:fernando_cacciola@hotmail.com">Fernando Cacciola</A>,
 | 
			
		||||
the latest version of this file can be found at <A
 | 
			
		||||
HREF="http://www.boost.org">www.boost.org</A>, and the boost
 | 
			
		||||
<A HREF="http://www.boost.org/more/mailing_lists.htm#main">discussion lists</A></P>
 | 
			
		||||
</BODY>
 | 
			
		||||
</HTML>
 | 
			
		||||
@@ -2,11 +2,11 @@
 | 
			
		||||
//  boost/assert.hpp - BOOST_ASSERT(expr)
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright (c) 2007 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  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.
 | 
			
		||||
// 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)
 | 
			
		||||
//
 | 
			
		||||
//  Note: There are no include guards. This is intentional.
 | 
			
		||||
//
 | 
			
		||||
@@ -33,6 +33,18 @@ void assertion_failed(char const * expr, char const * function, char const * fil
 | 
			
		||||
#define BOOST_ASSERT(expr) ((expr)? ((void)0): ::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__))
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
# include <assert.h>
 | 
			
		||||
# include <assert.h> // .h to support old libraries w/o <cassert> - effect is the same
 | 
			
		||||
# define BOOST_ASSERT(expr) assert(expr)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef BOOST_VERIFY
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_DISABLE_ASSERTS) || ( !defined(BOOST_ENABLE_ASSERT_HANDLER) && defined(NDEBUG) )
 | 
			
		||||
 | 
			
		||||
# define BOOST_VERIFY(expr) ((void)(expr))
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
# define BOOST_VERIFY(expr) BOOST_ASSERT(expr)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -10,15 +10,13 @@
 | 
			
		||||
//
 | 
			
		||||
//  boost/checked_delete.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 1999, 2000, 2001, 2002 boost.org
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov
 | 
			
		||||
//  Copyright (c) 2003 Daniel Frey
 | 
			
		||||
//  Copyright (c) 2003 Howard Hinnant
 | 
			
		||||
//
 | 
			
		||||
//  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.
 | 
			
		||||
//  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/utility/checked_delete.html for documentation.
 | 
			
		||||
//
 | 
			
		||||
 
 | 
			
		||||
@@ -12,10 +12,9 @@
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
//  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.
 | 
			
		||||
// 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/utility/current_function.html
 | 
			
		||||
//
 | 
			
		||||
@@ -33,6 +32,10 @@ inline void current_function_helper()
 | 
			
		||||
 | 
			
		||||
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
 | 
			
		||||
 | 
			
		||||
#elif defined(__DMC__) && (__DMC__ >= 0x810)
 | 
			
		||||
 | 
			
		||||
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
 | 
			
		||||
 | 
			
		||||
#elif defined(__FUNCSIG__)
 | 
			
		||||
 | 
			
		||||
# define BOOST_CURRENT_FUNCTION __FUNCSIG__
 | 
			
		||||
 
 | 
			
		||||
@@ -21,13 +21,11 @@
 | 
			
		||||
#ifndef BOOST_CONFIG_HPP
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_ARITHMETIC_TYPE_TRAITS_HPP
 | 
			
		||||
#include <boost/type_traits/arithmetic_traits.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef BOOST_COMPOSITE_TYPE_TRAITS_HPP
 | 
			
		||||
#include <boost/type_traits/composite_traits.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
#include <boost/type_traits/is_arithmetic.hpp>
 | 
			
		||||
#include <boost/type_traits/is_pointer.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost{
 | 
			
		||||
 | 
			
		||||
@@ -60,7 +58,7 @@ struct ct_imp<T, isp, true>
 | 
			
		||||
template <typename T, bool b1>
 | 
			
		||||
struct ct_imp<T, true, b1>
 | 
			
		||||
{
 | 
			
		||||
   typedef T const param_type;
 | 
			
		||||
   typedef const T param_type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -78,7 +76,7 @@ public:
 | 
			
		||||
   // however compiler bugs prevent this - instead pass three bool's to
 | 
			
		||||
   // ct_imp<T,bool,bool,bool> and add an extra partial specialisation
 | 
			
		||||
   // of ct_imp to handle the logic. (JM)
 | 
			
		||||
   typedef typename detail::ct_imp<
 | 
			
		||||
   typedef typename boost::detail::ct_imp<
 | 
			
		||||
      T,
 | 
			
		||||
      ::boost::is_pointer<T>::value,
 | 
			
		||||
      ::boost::is_arithmetic<T>::value
 | 
			
		||||
@@ -94,7 +92,7 @@ struct call_traits<T&>
 | 
			
		||||
   typedef T& param_type;  // hh removed const
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x560)
 | 
			
		||||
#if BOOST_WORKAROUND( __BORLANDC__,  < 0x5A0 )
 | 
			
		||||
// these are illegal specialisations; cv-qualifies applied to
 | 
			
		||||
// references have no effect according to [8.3.2p1],
 | 
			
		||||
// C++ Builder requires them though as it treats cv-qualified
 | 
			
		||||
@@ -123,8 +121,17 @@ struct call_traits<T&const volatile>
 | 
			
		||||
   typedef const T& const_reference;
 | 
			
		||||
   typedef T& param_type;  // hh removed const
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
struct call_traits< T * >
 | 
			
		||||
{
 | 
			
		||||
   typedef T * value_type;
 | 
			
		||||
   typedef T * & reference;
 | 
			
		||||
   typedef T * const & const_reference;
 | 
			
		||||
   typedef T * const param_type;  // hh removed const
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef __SUNPRO_CC
 | 
			
		||||
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
 | 
			
		||||
template <typename T, std::size_t N>
 | 
			
		||||
struct call_traits<T [N]>
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,9 @@
 | 
			
		||||
// compressed_pair: pair that "compresses" empty members
 | 
			
		||||
// (see libs/utility/compressed_pair.htm)
 | 
			
		||||
//
 | 
			
		||||
// JM changes 25 Jan 2004:
 | 
			
		||||
// For the case where T1 == T2 and both are empty, then first() and second()
 | 
			
		||||
// should return different objects.
 | 
			
		||||
// JM changes 25 Jan 2000:
 | 
			
		||||
// Removed default arguments from compressed_pair_switch to get
 | 
			
		||||
// C++ Builder 4 to accept them
 | 
			
		||||
@@ -18,16 +21,16 @@
 | 
			
		||||
#define BOOST_DETAIL_COMPRESSED_PAIR_HPP
 | 
			
		||||
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#ifndef BOOST_OBJECT_TYPE_TRAITS_HPP
 | 
			
		||||
#include <boost/type_traits/object_traits.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef BOOST_SAME_TRAITS_HPP
 | 
			
		||||
#include <boost/type_traits/same_traits.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef BOOST_CALL_TRAITS_HPP
 | 
			
		||||
#include <boost/call_traits.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/type_traits/remove_cv.hpp>
 | 
			
		||||
#include <boost/type_traits/is_empty.hpp>
 | 
			
		||||
#include <boost/type_traits/is_same.hpp>
 | 
			
		||||
#include <boost/call_traits.hpp>
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
# pragma warning(push)
 | 
			
		||||
# pragma warning(disable:4512)
 | 
			
		||||
#endif 
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -133,7 +136,7 @@ namespace details
 | 
			
		||||
 | 
			
		||||
   template <class T1, class T2>
 | 
			
		||||
   class compressed_pair_imp<T1, T2, 1>
 | 
			
		||||
      : private T1
 | 
			
		||||
      : protected ::boost::remove_cv<T1>::type
 | 
			
		||||
   {
 | 
			
		||||
   public:
 | 
			
		||||
      typedef T1                                                 first_type;
 | 
			
		||||
@@ -175,7 +178,7 @@ namespace details
 | 
			
		||||
 | 
			
		||||
   template <class T1, class T2>
 | 
			
		||||
   class compressed_pair_imp<T1, T2, 2>
 | 
			
		||||
      : private T2
 | 
			
		||||
      : protected ::boost::remove_cv<T2>::type
 | 
			
		||||
   {
 | 
			
		||||
   public:
 | 
			
		||||
      typedef T1                                                 first_type;
 | 
			
		||||
@@ -218,8 +221,8 @@ namespace details
 | 
			
		||||
 | 
			
		||||
   template <class T1, class T2>
 | 
			
		||||
   class compressed_pair_imp<T1, T2, 3>
 | 
			
		||||
      : private T1,
 | 
			
		||||
        private T2
 | 
			
		||||
      : protected ::boost::remove_cv<T1>::type,
 | 
			
		||||
        protected ::boost::remove_cv<T2>::type
 | 
			
		||||
   {
 | 
			
		||||
   public:
 | 
			
		||||
      typedef T1                                                 first_type;
 | 
			
		||||
@@ -254,11 +257,14 @@ namespace details
 | 
			
		||||
 | 
			
		||||
   // JM
 | 
			
		||||
   // 4    T1 == T2, T1 and T2 both empty
 | 
			
		||||
   //      Note does not actually store an instance of T2 at all -
 | 
			
		||||
   //      but reuses T1 base class for both first() and second().
 | 
			
		||||
   //      Originally this did not store an instance of T2 at all
 | 
			
		||||
   //      but that led to problems beause it meant &x.first() == &x.second()
 | 
			
		||||
   //      which is not true for any other kind of pair, so now we store an instance
 | 
			
		||||
   //      of T2 just in case the user is relying on first() and second() returning
 | 
			
		||||
   //      different objects (albeit both empty).
 | 
			
		||||
   template <class T1, class T2>
 | 
			
		||||
   class compressed_pair_imp<T1, T2, 4>
 | 
			
		||||
      : private T1
 | 
			
		||||
      : protected ::boost::remove_cv<T1>::type
 | 
			
		||||
   {
 | 
			
		||||
   public:
 | 
			
		||||
      typedef T1                                                 first_type;
 | 
			
		||||
@@ -272,20 +278,21 @@ namespace details
 | 
			
		||||
 | 
			
		||||
      compressed_pair_imp() {}
 | 
			
		||||
 | 
			
		||||
      compressed_pair_imp(first_param_type x, second_param_type)
 | 
			
		||||
         : first_type(x) {}
 | 
			
		||||
      compressed_pair_imp(first_param_type x, second_param_type y)
 | 
			
		||||
         : first_type(x), m_second(y) {}
 | 
			
		||||
 | 
			
		||||
      compressed_pair_imp(first_param_type x)
 | 
			
		||||
         : first_type(x) {}
 | 
			
		||||
         : first_type(x), m_second(x) {}
 | 
			
		||||
 | 
			
		||||
      first_reference       first()       {return *this;}
 | 
			
		||||
      first_const_reference first() const {return *this;}
 | 
			
		||||
 | 
			
		||||
      second_reference       second()       {return *this;}
 | 
			
		||||
      second_const_reference second() const {return *this;}
 | 
			
		||||
      second_reference       second()       {return m_second;}
 | 
			
		||||
      second_const_reference second() const {return m_second;}
 | 
			
		||||
 | 
			
		||||
      void swap(::boost::compressed_pair<T1,T2>&) {}
 | 
			
		||||
   private:
 | 
			
		||||
      T2 m_second;
 | 
			
		||||
   };
 | 
			
		||||
 | 
			
		||||
   // 5    T1 == T2 and are not empty:   //JM
 | 
			
		||||
@@ -428,7 +435,9 @@ swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
 | 
			
		||||
 | 
			
		||||
} // boost
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
# pragma warning(pop)
 | 
			
		||||
#endif 
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_DETAIL_COMPRESSED_PAIR_HPP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -292,22 +292,24 @@ public:
 | 
			
		||||
   typedef typename call_traits<second_type>::const_reference second_const_reference;
 | 
			
		||||
 | 
			
		||||
            compressed_pair_4() : T1() {}
 | 
			
		||||
            compressed_pair_4(first_param_type x, second_param_type) : T1(x) {}
 | 
			
		||||
            compressed_pair_4(first_param_type x, second_param_type y) : T1(x), m_second(y) {}
 | 
			
		||||
   // only one single argument constructor since T1 == T2
 | 
			
		||||
   explicit compressed_pair_4(first_param_type x) : T1(x) {}
 | 
			
		||||
   explicit compressed_pair_4(first_param_type x) : T1(x), m_second(x) {}
 | 
			
		||||
   compressed_pair_4(const ::boost::compressed_pair<T1,T2>& x)
 | 
			
		||||
      : T1(x.first()){}
 | 
			
		||||
      : T1(x.first()), m_second(x.second()) {}
 | 
			
		||||
 | 
			
		||||
   first_reference       first()       { return *this; }
 | 
			
		||||
   first_const_reference first() const { return *this; }
 | 
			
		||||
 | 
			
		||||
   second_reference       second()       { return *this; }
 | 
			
		||||
   second_const_reference second() const { return *this; }
 | 
			
		||||
   second_reference       second()       { return m_second; }
 | 
			
		||||
   second_const_reference second() const { return m_second; }
 | 
			
		||||
 | 
			
		||||
   void swap(compressed_pair_4& y)
 | 
			
		||||
   {
 | 
			
		||||
      // no need to swap empty base classes:
 | 
			
		||||
   }
 | 
			
		||||
private:
 | 
			
		||||
   T2 m_second;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// T1 == T2, not empty
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								include/boost/exception.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								include/boost/exception.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, 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)
 | 
			
		||||
 | 
			
		||||
#ifndef UUID_1D94A7C6054E11DB9804B622A1EF5492
 | 
			
		||||
#define UUID_1D94A7C6054E11DB9804B622A1EF5492
 | 
			
		||||
 | 
			
		||||
#error The header <boost/exception.hpp> has been deprecated. Please #include <boost/exception/all.hpp> instead.
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,8 +1,7 @@
 | 
			
		||||
// (C) Copyright Jens Maurer 2001. 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.
 | 
			
		||||
// (C) Copyright Jens Maurer 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)
 | 
			
		||||
//
 | 
			
		||||
// Revision History:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,8 @@
 | 
			
		||||
//  Boost next_prior.hpp header file  ---------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Boost.org 1999-2003. 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.
 | 
			
		||||
//  (C) Copyright Dave Abrahams and Daniel Walker 1999-2003. 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/utility for documentation.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,8 @@
 | 
			
		||||
//  Boost noncopyable.hpp header file  --------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Boost.org 1999-2003. 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.
 | 
			
		||||
//  (C) Copyright Beman Dawes 1999-2003. 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/utility for documentation.
 | 
			
		||||
 | 
			
		||||
@@ -18,15 +16,20 @@ namespace boost {
 | 
			
		||||
 | 
			
		||||
//  Contributed by Dave Abrahams
 | 
			
		||||
 | 
			
		||||
class noncopyable
 | 
			
		||||
namespace noncopyable_  // protection from unintended ADL
 | 
			
		||||
{
 | 
			
		||||
 protected:
 | 
			
		||||
    noncopyable() {}
 | 
			
		||||
    ~noncopyable() {}
 | 
			
		||||
 private:  // emphasize the following members are private
 | 
			
		||||
    noncopyable( const noncopyable& );
 | 
			
		||||
    const noncopyable& operator=( const noncopyable& );
 | 
			
		||||
};
 | 
			
		||||
  class noncopyable
 | 
			
		||||
  {
 | 
			
		||||
   protected:
 | 
			
		||||
      noncopyable() {}
 | 
			
		||||
      ~noncopyable() {}
 | 
			
		||||
   private:  // emphasize the following members are private
 | 
			
		||||
      noncopyable( const noncopyable& );
 | 
			
		||||
      const noncopyable& operator=( const noncopyable& );
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef noncopyable_::noncopyable noncopyable;
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,18 @@
 | 
			
		||||
//  Boost operators.hpp header file  ----------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright David Abrahams, Jeremy Siek, and Daryle Walker 1999-2001.
 | 
			
		||||
//  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.
 | 
			
		||||
//  (C) Copyright David Abrahams, Jeremy Siek, Daryle Walker 1999-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/utility/operators.htm for documentation.
 | 
			
		||||
 | 
			
		||||
//  Revision History
 | 
			
		||||
//  07 Aug 08 Added "euclidean" spelling. (Daniel Frey)
 | 
			
		||||
//  03 Apr 08 Make sure "convertible to bool" is sufficient
 | 
			
		||||
//            for T::operator<, etc. (Daniel Frey)
 | 
			
		||||
//  24 May 07 Changed empty_base to depend on T, see
 | 
			
		||||
//            http://svn.boost.org/trac/boost/ticket/979
 | 
			
		||||
//  21 Oct 02 Modified implementation of operators to allow compilers with a
 | 
			
		||||
//            correct named return value optimization (NRVO) to produce optimal
 | 
			
		||||
//            code.  (Daniel Frey)
 | 
			
		||||
@@ -91,15 +95,15 @@
 | 
			
		||||
namespace boost {
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
template <typename T> class empty_base {
 | 
			
		||||
 | 
			
		||||
// Helmut Zeisel, empty base class optimization bug with GCC 3.0.0
 | 
			
		||||
#if defined(__GNUC__) && __GNUC__==3 && __GNUC_MINOR__==0 && __GNU_PATCHLEVEL__==0
 | 
			
		||||
class empty_base {
 | 
			
		||||
  bool dummy; 
 | 
			
		||||
};
 | 
			
		||||
#else
 | 
			
		||||
class empty_base {};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
@@ -120,37 +124,37 @@ namespace boost
 | 
			
		||||
//  Note that friend functions defined in a class are implicitly inline.
 | 
			
		||||
//  See the C++ std, 11.4 [class.friend] paragraph 5
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct less_than_comparable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend bool operator<=(const T& x, const U& y) { return !(x > y); }
 | 
			
		||||
     friend bool operator>=(const T& x, const U& y) { return !(x < y); }
 | 
			
		||||
     friend bool operator<=(const T& x, const U& y) { return !static_cast<bool>(x > y); }
 | 
			
		||||
     friend bool operator>=(const T& x, const U& y) { return !static_cast<bool>(x < y); }
 | 
			
		||||
     friend bool operator>(const U& x, const T& y)  { return y < x; }
 | 
			
		||||
     friend bool operator<(const U& x, const T& y)  { return y > x; }
 | 
			
		||||
     friend bool operator<=(const U& x, const T& y) { return !(y < x); }
 | 
			
		||||
     friend bool operator>=(const U& x, const T& y) { return !(y > x); }
 | 
			
		||||
     friend bool operator<=(const U& x, const T& y) { return !static_cast<bool>(y < x); }
 | 
			
		||||
     friend bool operator>=(const U& x, const T& y) { return !static_cast<bool>(y > x); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct less_than_comparable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend bool operator>(const T& x, const T& y)  { return y < x; }
 | 
			
		||||
     friend bool operator<=(const T& x, const T& y) { return !(y < x); }
 | 
			
		||||
     friend bool operator>=(const T& x, const T& y) { return !(x < y); }
 | 
			
		||||
     friend bool operator<=(const T& x, const T& y) { return !static_cast<bool>(y < x); }
 | 
			
		||||
     friend bool operator>=(const T& x, const T& y) { return !static_cast<bool>(x < y); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct equality_comparable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend bool operator==(const U& y, const T& x) { return x == y; }
 | 
			
		||||
     friend bool operator!=(const U& y, const T& x) { return !(x == y); }
 | 
			
		||||
     friend bool operator!=(const T& y, const U& x) { return !(y == x); }
 | 
			
		||||
     friend bool operator!=(const U& y, const T& x) { return !static_cast<bool>(x == y); }
 | 
			
		||||
     friend bool operator!=(const T& y, const U& x) { return !static_cast<bool>(y == x); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct equality_comparable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend bool operator!=(const T& x, const T& y) { return !(x == y); }
 | 
			
		||||
     friend bool operator!=(const T& x, const T& y) { return !static_cast<bool>(x == y); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// A macro which produces "name_2left" from "name".
 | 
			
		||||
@@ -166,7 +170,7 @@ struct equality_comparable1 : B
 | 
			
		||||
// implementation available.
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_OPERATOR_COMMUTATIVE( NAME, OP )                         \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>            \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >        \
 | 
			
		||||
struct NAME##2 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( const T& lhs, const U& rhs )                          \
 | 
			
		||||
@@ -175,33 +179,33 @@ struct NAME##2 : B                                                            \
 | 
			
		||||
    { T nrv( rhs ); nrv OP##= lhs; return nrv; }                              \
 | 
			
		||||
};                                                                            \
 | 
			
		||||
                                                                              \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>                     \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >                 \
 | 
			
		||||
struct NAME##1 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( const T& lhs, const T& rhs )                          \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                              \
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( NAME, OP )           \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>  \
 | 
			
		||||
struct NAME##2 : B                                                  \
 | 
			
		||||
{                                                                   \
 | 
			
		||||
  friend T operator OP( const T& lhs, const U& rhs )                \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                    \
 | 
			
		||||
};                                                                  \
 | 
			
		||||
                                                                    \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>  \
 | 
			
		||||
struct BOOST_OPERATOR2_LEFT(NAME) : B                               \
 | 
			
		||||
{                                                                   \
 | 
			
		||||
  friend T operator OP( const U& lhs, const T& rhs )                \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                    \
 | 
			
		||||
};                                                                  \
 | 
			
		||||
                                                                    \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>           \
 | 
			
		||||
struct NAME##1 : B                                                  \
 | 
			
		||||
{                                                                   \
 | 
			
		||||
  friend T operator OP( const T& lhs, const T& rhs )                \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                    \
 | 
			
		||||
#define BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( NAME, OP )               \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >  \
 | 
			
		||||
struct NAME##2 : B                                                      \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
  friend T operator OP( const T& lhs, const U& rhs )                    \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                        \
 | 
			
		||||
};                                                                      \
 | 
			
		||||
                                                                        \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >  \
 | 
			
		||||
struct BOOST_OPERATOR2_LEFT(NAME) : B                                   \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
  friend T operator OP( const U& lhs, const T& rhs )                    \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                        \
 | 
			
		||||
};                                                                      \
 | 
			
		||||
                                                                        \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >           \
 | 
			
		||||
struct NAME##1 : B                                                      \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
  friend T operator OP( const T& lhs, const T& rhs )                    \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                        \
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#else // defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS)
 | 
			
		||||
@@ -211,35 +215,35 @@ struct NAME##1 : B                                                  \
 | 
			
		||||
// BOOST_OPERATOR2_LEFT(NAME) only looks cool, but doesn't provide
 | 
			
		||||
// optimization opportunities to the compiler :)
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_OPERATOR_COMMUTATIVE( NAME, OP )                         \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>            \
 | 
			
		||||
struct NAME##2 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( T lhs, const U& rhs ) { return lhs OP##= rhs; }       \
 | 
			
		||||
  friend T operator OP( const U& lhs, T rhs ) { return rhs OP##= lhs; }       \
 | 
			
		||||
};                                                                            \
 | 
			
		||||
                                                                              \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>                     \
 | 
			
		||||
struct NAME##1 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( T lhs, const T& rhs ) { return lhs OP##= rhs; }       \
 | 
			
		||||
#define BOOST_BINARY_OPERATOR_COMMUTATIVE( NAME, OP )                   \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >  \
 | 
			
		||||
struct NAME##2 : B                                                      \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
  friend T operator OP( T lhs, const U& rhs ) { return lhs OP##= rhs; } \
 | 
			
		||||
  friend T operator OP( const U& lhs, T rhs ) { return rhs OP##= lhs; } \
 | 
			
		||||
};                                                                      \
 | 
			
		||||
                                                                        \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >           \
 | 
			
		||||
struct NAME##1 : B                                                      \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
  friend T operator OP( T lhs, const T& rhs ) { return lhs OP##= rhs; } \
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( NAME, OP )               \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>      \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >  \
 | 
			
		||||
struct NAME##2 : B                                                      \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
  friend T operator OP( T lhs, const U& rhs ) { return lhs OP##= rhs; } \
 | 
			
		||||
};                                                                      \
 | 
			
		||||
                                                                        \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>      \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >  \
 | 
			
		||||
struct BOOST_OPERATOR2_LEFT(NAME) : B                                   \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
  friend T operator OP( const U& lhs, const T& rhs )                    \
 | 
			
		||||
    { return T( lhs ) OP##= rhs; }                                      \
 | 
			
		||||
};                                                                      \
 | 
			
		||||
                                                                        \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>               \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >           \
 | 
			
		||||
struct NAME##1 : B                                                      \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
  friend T operator OP( T lhs, const T& rhs ) { return lhs OP##= rhs; } \
 | 
			
		||||
@@ -262,7 +266,7 @@ BOOST_BINARY_OPERATOR_COMMUTATIVE( orable, | )
 | 
			
		||||
 | 
			
		||||
//  incrementable and decrementable contributed by Jeremy Siek
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct incrementable : B
 | 
			
		||||
{
 | 
			
		||||
  friend T operator++(T& x, int)
 | 
			
		||||
@@ -275,7 +279,7 @@ private: // The use of this typedef works around a Borland bug
 | 
			
		||||
  typedef T incrementable_type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct decrementable : B
 | 
			
		||||
{
 | 
			
		||||
  friend T operator--(T& x, int)
 | 
			
		||||
@@ -290,7 +294,7 @@ private: // The use of this typedef works around a Borland bug
 | 
			
		||||
 | 
			
		||||
//  Iterator operator classes (contributed by Jeremy Siek) ------------------//
 | 
			
		||||
 | 
			
		||||
template <class T, class P, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class P, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct dereferenceable : B
 | 
			
		||||
{
 | 
			
		||||
  P operator->() const
 | 
			
		||||
@@ -299,7 +303,7 @@ struct dereferenceable : B
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class I, class R, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class I, class R, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct indexable : B
 | 
			
		||||
{
 | 
			
		||||
  R operator[](I n) const
 | 
			
		||||
@@ -314,14 +318,14 @@ struct indexable : B
 | 
			
		||||
#if defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS)
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_OPERATOR( NAME, OP )                                     \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>            \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >        \
 | 
			
		||||
struct NAME##2 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( const T& lhs, const U& rhs )                          \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                              \
 | 
			
		||||
};                                                                            \
 | 
			
		||||
                                                                              \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>                     \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >                 \
 | 
			
		||||
struct NAME##1 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( const T& lhs, const T& rhs )                          \
 | 
			
		||||
@@ -331,13 +335,13 @@ struct NAME##1 : B                                                            \
 | 
			
		||||
#else // defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS)
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_OPERATOR( NAME, OP )                                     \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>            \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >        \
 | 
			
		||||
struct NAME##2 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( T lhs, const U& rhs ) { return lhs OP##= rhs; }       \
 | 
			
		||||
};                                                                            \
 | 
			
		||||
                                                                              \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>                     \
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >                 \
 | 
			
		||||
struct NAME##1 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( T lhs, const T& rhs ) { return lhs OP##= rhs; }       \
 | 
			
		||||
@@ -350,209 +354,209 @@ BOOST_BINARY_OPERATOR( right_shiftable, >> )
 | 
			
		||||
 | 
			
		||||
#undef BOOST_BINARY_OPERATOR
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct equivalent2 : B
 | 
			
		||||
{
 | 
			
		||||
  friend bool operator==(const T& x, const U& y)
 | 
			
		||||
  {
 | 
			
		||||
    return !(x < y) && !(x > y);
 | 
			
		||||
    return !static_cast<bool>(x < y) && !static_cast<bool>(x > y);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct equivalent1 : B
 | 
			
		||||
{
 | 
			
		||||
  friend bool operator==(const T&x, const T&y)
 | 
			
		||||
  {
 | 
			
		||||
    return !(x < y) && !(y < x);
 | 
			
		||||
    return !static_cast<bool>(x < y) && !static_cast<bool>(y < x);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct partially_ordered2 : B
 | 
			
		||||
{
 | 
			
		||||
  friend bool operator<=(const T& x, const U& y)
 | 
			
		||||
    { return (x < y) || (x == y); }
 | 
			
		||||
    { return static_cast<bool>(x < y) || static_cast<bool>(x == y); }
 | 
			
		||||
  friend bool operator>=(const T& x, const U& y)
 | 
			
		||||
    { return (x > y) || (x == y); }
 | 
			
		||||
    { return static_cast<bool>(x > y) || static_cast<bool>(x == y); }
 | 
			
		||||
  friend bool operator>(const U& x, const T& y)
 | 
			
		||||
    { return y < x; }
 | 
			
		||||
  friend bool operator<(const U& x, const T& y)
 | 
			
		||||
    { return y > x; }
 | 
			
		||||
  friend bool operator<=(const U& x, const T& y)
 | 
			
		||||
    { return (y > x) || (y == x); }
 | 
			
		||||
    { return static_cast<bool>(y > x) || static_cast<bool>(y == x); }
 | 
			
		||||
  friend bool operator>=(const U& x, const T& y)
 | 
			
		||||
    { return (y < x) || (y == x); }
 | 
			
		||||
    { return static_cast<bool>(y < x) || static_cast<bool>(y == x); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct partially_ordered1 : B
 | 
			
		||||
{
 | 
			
		||||
  friend bool operator>(const T& x, const T& y)
 | 
			
		||||
    { return y < x; }
 | 
			
		||||
  friend bool operator<=(const T& x, const T& y)
 | 
			
		||||
    { return (x < y) || (x == y); }
 | 
			
		||||
    { return static_cast<bool>(x < y) || static_cast<bool>(x == y); }
 | 
			
		||||
  friend bool operator>=(const T& x, const T& y)
 | 
			
		||||
    { return (y < x) || (x == y); }
 | 
			
		||||
    { return static_cast<bool>(y < x) || static_cast<bool>(x == y); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//  Combined operator classes (contributed by Daryle Walker) ----------------//
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct totally_ordered2
 | 
			
		||||
    : less_than_comparable2<T, U
 | 
			
		||||
    , equality_comparable2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct totally_ordered1
 | 
			
		||||
    : less_than_comparable1<T
 | 
			
		||||
    , equality_comparable1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct additive2
 | 
			
		||||
    : addable2<T, U
 | 
			
		||||
    , subtractable2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct additive1
 | 
			
		||||
    : addable1<T
 | 
			
		||||
    , subtractable1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct multiplicative2
 | 
			
		||||
    : multipliable2<T, U
 | 
			
		||||
    , dividable2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct multiplicative1
 | 
			
		||||
    : multipliable1<T
 | 
			
		||||
    , dividable1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct integer_multiplicative2
 | 
			
		||||
    : multiplicative2<T, U
 | 
			
		||||
    , modable2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct integer_multiplicative1
 | 
			
		||||
    : multiplicative1<T
 | 
			
		||||
    , modable1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct arithmetic2
 | 
			
		||||
    : additive2<T, U
 | 
			
		||||
    , multiplicative2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct arithmetic1
 | 
			
		||||
    : additive1<T
 | 
			
		||||
    , multiplicative1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct integer_arithmetic2
 | 
			
		||||
    : additive2<T, U
 | 
			
		||||
    , integer_multiplicative2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct integer_arithmetic1
 | 
			
		||||
    : additive1<T
 | 
			
		||||
    , integer_multiplicative1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct bitwise2
 | 
			
		||||
    : xorable2<T, U
 | 
			
		||||
    , andable2<T, U
 | 
			
		||||
    , orable2<T, U, B
 | 
			
		||||
      > > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct bitwise1
 | 
			
		||||
    : xorable1<T
 | 
			
		||||
    , andable1<T
 | 
			
		||||
    , orable1<T, B
 | 
			
		||||
      > > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct unit_steppable
 | 
			
		||||
    : incrementable<T
 | 
			
		||||
    , decrementable<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct shiftable2
 | 
			
		||||
    : left_shiftable2<T, U
 | 
			
		||||
    , right_shiftable2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct shiftable1
 | 
			
		||||
    : left_shiftable1<T
 | 
			
		||||
    , right_shiftable1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ring_operators2
 | 
			
		||||
    : additive2<T, U
 | 
			
		||||
    , subtractable2_left<T, U
 | 
			
		||||
    , multipliable2<T, U, B
 | 
			
		||||
      > > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ring_operators1
 | 
			
		||||
    : additive1<T
 | 
			
		||||
    , multipliable1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ordered_ring_operators2
 | 
			
		||||
    : ring_operators2<T, U
 | 
			
		||||
    , totally_ordered2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ordered_ring_operators1
 | 
			
		||||
    : ring_operators1<T
 | 
			
		||||
    , totally_ordered1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct field_operators2
 | 
			
		||||
    : ring_operators2<T, U
 | 
			
		||||
    , dividable2<T, U
 | 
			
		||||
    , dividable2_left<T, U, B
 | 
			
		||||
      > > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct field_operators1
 | 
			
		||||
    : ring_operators1<T
 | 
			
		||||
    , dividable1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ordered_field_operators2
 | 
			
		||||
    : field_operators2<T, U
 | 
			
		||||
    , totally_ordered2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ordered_field_operators1
 | 
			
		||||
    : field_operators1<T
 | 
			
		||||
    , totally_ordered1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct euclidian_ring_operators2
 | 
			
		||||
    : ring_operators2<T, U
 | 
			
		||||
    , dividable2<T, U
 | 
			
		||||
@@ -561,43 +565,71 @@ struct euclidian_ring_operators2
 | 
			
		||||
    , modable2_left<T, U, B
 | 
			
		||||
      > > > > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct euclidian_ring_operators1
 | 
			
		||||
    : ring_operators1<T
 | 
			
		||||
    , dividable1<T
 | 
			
		||||
    , modable1<T, B
 | 
			
		||||
      > > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ordered_euclidian_ring_operators2
 | 
			
		||||
    : totally_ordered2<T, U
 | 
			
		||||
    , euclidian_ring_operators2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ordered_euclidian_ring_operators1
 | 
			
		||||
    : totally_ordered1<T
 | 
			
		||||
    , euclidian_ring_operators1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
      
 | 
			
		||||
template <class T, class P, class B = ::boost::detail::empty_base>
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct euclidean_ring_operators2
 | 
			
		||||
    : ring_operators2<T, U
 | 
			
		||||
    , dividable2<T, U
 | 
			
		||||
    , dividable2_left<T, U
 | 
			
		||||
    , modable2<T, U
 | 
			
		||||
    , modable2_left<T, U, B
 | 
			
		||||
      > > > > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct euclidean_ring_operators1
 | 
			
		||||
    : ring_operators1<T
 | 
			
		||||
    , dividable1<T
 | 
			
		||||
    , modable1<T, B
 | 
			
		||||
      > > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ordered_euclidean_ring_operators2
 | 
			
		||||
    : totally_ordered2<T, U
 | 
			
		||||
    , euclidean_ring_operators2<T, U, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct ordered_euclidean_ring_operators1
 | 
			
		||||
    : totally_ordered1<T
 | 
			
		||||
    , euclidean_ring_operators1<T, B
 | 
			
		||||
      > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class P, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct input_iteratable
 | 
			
		||||
    : equality_comparable1<T
 | 
			
		||||
    , incrementable<T
 | 
			
		||||
    , dereferenceable<T, P, B
 | 
			
		||||
      > > > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct output_iteratable
 | 
			
		||||
    : incrementable<T, B
 | 
			
		||||
      > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class P, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class P, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct forward_iteratable
 | 
			
		||||
    : input_iteratable<T, P, B
 | 
			
		||||
      > {};
 | 
			
		||||
 | 
			
		||||
template <class T, class P, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class P, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct bidirectional_iteratable
 | 
			
		||||
    : forward_iteratable<T, P
 | 
			
		||||
    , decrementable<T, B
 | 
			
		||||
@@ -607,7 +639,7 @@ struct bidirectional_iteratable
 | 
			
		||||
//  which is an indirect base class of bidirectional_iterable,
 | 
			
		||||
//  random_access_iteratable must not be derived from totally_ordered1
 | 
			
		||||
//  but from less_than_comparable1 only. (Helmut Zeisel, 02-Dec-2001)
 | 
			
		||||
template <class T, class P, class D, class R, class B = ::boost::detail::empty_base>
 | 
			
		||||
template <class T, class P, class D, class R, class B = ::boost::detail::empty_base<T> >
 | 
			
		||||
struct random_access_iteratable
 | 
			
		||||
    : bidirectional_iteratable<T, P
 | 
			
		||||
    , less_than_comparable1<T
 | 
			
		||||
@@ -651,20 +683,20 @@ struct random_access_iteratable
 | 
			
		||||
 | 
			
		||||
     // Otherwise, because a Borland C++ 5.5 bug prevents a using declaration
 | 
			
		||||
     // from working, we are forced to use inheritance for that compiler.
 | 
			
		||||
#    define BOOST_IMPORT_TEMPLATE4(template_name)                                          \
 | 
			
		||||
     template <class T, class U, class V, class W, class B = ::boost::detail::empty_base>  \
 | 
			
		||||
#    define BOOST_IMPORT_TEMPLATE4(template_name)                                             \
 | 
			
		||||
     template <class T, class U, class V, class W, class B = ::boost::detail::empty_base<T> > \
 | 
			
		||||
     struct template_name : ::template_name<T, U, V, W, B> {};
 | 
			
		||||
 | 
			
		||||
#    define BOOST_IMPORT_TEMPLATE3(template_name)                                 \
 | 
			
		||||
     template <class T, class U, class V, class B = ::boost::detail::empty_base>  \
 | 
			
		||||
#    define BOOST_IMPORT_TEMPLATE3(template_name)                                    \
 | 
			
		||||
     template <class T, class U, class V, class B = ::boost::detail::empty_base<T> > \
 | 
			
		||||
     struct template_name : ::template_name<T, U, V, B> {};
 | 
			
		||||
 | 
			
		||||
#    define BOOST_IMPORT_TEMPLATE2(template_name)                              \
 | 
			
		||||
     template <class T, class U, class B = ::boost::detail::empty_base>        \
 | 
			
		||||
#    define BOOST_IMPORT_TEMPLATE2(template_name)                           \
 | 
			
		||||
     template <class T, class U, class B = ::boost::detail::empty_base<T> > \
 | 
			
		||||
     struct template_name : ::template_name<T, U, B> {};
 | 
			
		||||
 | 
			
		||||
#    define BOOST_IMPORT_TEMPLATE1(template_name)                              \
 | 
			
		||||
     template <class T, class B = ::boost::detail::empty_base>                 \
 | 
			
		||||
#    define BOOST_IMPORT_TEMPLATE1(template_name)                  \
 | 
			
		||||
     template <class T, class B = ::boost::detail::empty_base<T> > \
 | 
			
		||||
     struct template_name : ::template_name<T, B> {};
 | 
			
		||||
 | 
			
		||||
#  endif // BOOST_NO_USING_TEMPLATE
 | 
			
		||||
@@ -675,7 +707,7 @@ struct random_access_iteratable
 | 
			
		||||
// Here's where we put it all together, defining the xxxx forms of the templates
 | 
			
		||||
// in namespace boost. We also define specializations of is_chained_base<> for
 | 
			
		||||
// the xxxx, xxxx1, and xxxx2 templates, importing them into boost:: as
 | 
			
		||||
// neccessary.
 | 
			
		||||
// necessary.
 | 
			
		||||
//
 | 
			
		||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
 | 
			
		||||
@@ -700,7 +732,7 @@ template<class T> struct is_chained_base {
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
// Import a 4-type-argument operator template into boost (if neccessary) and
 | 
			
		||||
// Import a 4-type-argument operator template into boost (if necessary) and
 | 
			
		||||
// provide a specialization of 'is_chained_base<>' for it.
 | 
			
		||||
# define BOOST_OPERATOR_TEMPLATE4(template_name4)                     \
 | 
			
		||||
  BOOST_IMPORT_TEMPLATE4(template_name4)                              \
 | 
			
		||||
@@ -709,7 +741,7 @@ template<class T> struct is_chained_base {
 | 
			
		||||
    typedef ::boost::detail::true_t value;                            \
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
// Import a 3-type-argument operator template into boost (if neccessary) and
 | 
			
		||||
// Import a 3-type-argument operator template into boost (if necessary) and
 | 
			
		||||
// provide a specialization of 'is_chained_base<>' for it.
 | 
			
		||||
# define BOOST_OPERATOR_TEMPLATE3(template_name3)                     \
 | 
			
		||||
  BOOST_IMPORT_TEMPLATE3(template_name3)                              \
 | 
			
		||||
@@ -718,7 +750,7 @@ template<class T> struct is_chained_base {
 | 
			
		||||
    typedef ::boost::detail::true_t value;                            \
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
// Import a 2-type-argument operator template into boost (if neccessary) and
 | 
			
		||||
// Import a 2-type-argument operator template into boost (if necessary) and
 | 
			
		||||
// provide a specialization of 'is_chained_base<>' for it.
 | 
			
		||||
# define BOOST_OPERATOR_TEMPLATE2(template_name2)                  \
 | 
			
		||||
  BOOST_IMPORT_TEMPLATE2(template_name2)                           \
 | 
			
		||||
@@ -727,7 +759,7 @@ template<class T> struct is_chained_base {
 | 
			
		||||
    typedef ::boost::detail::true_t value;                         \
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
// Import a 1-type-argument operator template into boost (if neccessary) and
 | 
			
		||||
// Import a 1-type-argument operator template into boost (if necessary) and
 | 
			
		||||
// provide a specialization of 'is_chained_base<>' for it.
 | 
			
		||||
# define BOOST_OPERATOR_TEMPLATE1(template_name1)                  \
 | 
			
		||||
  BOOST_IMPORT_TEMPLATE1(template_name1)                           \
 | 
			
		||||
@@ -753,7 +785,7 @@ template<class T> struct is_chained_base {
 | 
			
		||||
# define BOOST_OPERATOR_TEMPLATE(template_name)                    \
 | 
			
		||||
template <class T                                                  \
 | 
			
		||||
         ,class U = T                                              \
 | 
			
		||||
         ,class B = ::boost::detail::empty_base                    \
 | 
			
		||||
         ,class B = ::boost::detail::empty_base<T>                 \
 | 
			
		||||
         ,class O = typename is_chained_base<U>::value             \
 | 
			
		||||
         >                                                         \
 | 
			
		||||
struct template_name : template_name##2<T, U, B> {};               \
 | 
			
		||||
@@ -789,7 +821,7 @@ BOOST_OPERATOR_TEMPLATE1(template_name##1)
 | 
			
		||||
   // In this case we can only assume that template_name<> is equivalent to the
 | 
			
		||||
   // more commonly needed template_name1<> form.
 | 
			
		||||
#  define BOOST_OPERATOR_TEMPLATE(template_name)                   \
 | 
			
		||||
   template <class T, class B = ::boost::detail::empty_base>       \
 | 
			
		||||
   template <class T, class B = ::boost::detail::empty_base<T> >   \
 | 
			
		||||
   struct template_name : template_name##1<T, B> {};
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
@@ -836,6 +868,8 @@ BOOST_OPERATOR_TEMPLATE(field_operators)
 | 
			
		||||
BOOST_OPERATOR_TEMPLATE(ordered_field_operators)
 | 
			
		||||
BOOST_OPERATOR_TEMPLATE(euclidian_ring_operators)
 | 
			
		||||
BOOST_OPERATOR_TEMPLATE(ordered_euclidian_ring_operators)
 | 
			
		||||
BOOST_OPERATOR_TEMPLATE(euclidean_ring_operators)
 | 
			
		||||
BOOST_OPERATOR_TEMPLATE(ordered_euclidean_ring_operators)
 | 
			
		||||
BOOST_OPERATOR_TEMPLATE2(input_iteratable)
 | 
			
		||||
BOOST_OPERATOR_TEMPLATE1(output_iteratable)
 | 
			
		||||
BOOST_OPERATOR_TEMPLATE2(forward_iteratable)
 | 
			
		||||
 
 | 
			
		||||
@@ -10,18 +10,18 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/utility/addressof.hpp>
 | 
			
		||||
#include <boost/mpl/bool.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  ref.hpp - ref/cref, useful helper functions
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (C) 1999, 2000 Jaakko J<EFBFBD>rvi (jaakko.jarvi@cs.utu.fi)
 | 
			
		||||
//  Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
 | 
			
		||||
//  Copyright (C) 2001, 2002 Peter Dimov
 | 
			
		||||
//  Copyright (C) 2002 David Abrahams
 | 
			
		||||
//
 | 
			
		||||
//  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.
 | 
			
		||||
// 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/bind/ref.html for documentation.
 | 
			
		||||
//
 | 
			
		||||
@@ -34,13 +34,13 @@ template<class T> class reference_wrapper
 | 
			
		||||
public:
 | 
			
		||||
    typedef T type;
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1300 )
 | 
			
		||||
 | 
			
		||||
    explicit reference_wrapper(T& t): t_(&t) {}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    explicit reference_wrapper(T& t): t_(addressof(t)) {}
 | 
			
		||||
    explicit reference_wrapper(T& t): t_(boost::addressof(t)) {}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -55,7 +55,7 @@ private:
 | 
			
		||||
    T* t_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
# if defined(__BORLANDC__) && (__BORLANDC__ <= 0x570)
 | 
			
		||||
# if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) )
 | 
			
		||||
#  define BOOST_REF_CONST
 | 
			
		||||
# else
 | 
			
		||||
#  define BOOST_REF_CONST const
 | 
			
		||||
@@ -74,18 +74,13 @@ template<class T> inline reference_wrapper<T const> BOOST_REF_CONST cref(T const
 | 
			
		||||
# undef BOOST_REF_CONST
 | 
			
		||||
 | 
			
		||||
# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
class is_reference_wrapper
 | 
			
		||||
    : public mpl::false_
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
class is_reference_wrapper<reference_wrapper<T> >
 | 
			
		||||
    : public mpl::true_
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
class unwrap_reference
 | 
			
		||||
{
 | 
			
		||||
@@ -93,12 +88,30 @@ class unwrap_reference
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
class unwrap_reference<reference_wrapper<T> >
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
#  define AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(X) \
 | 
			
		||||
template<typename T> \
 | 
			
		||||
class is_reference_wrapper< X > \
 | 
			
		||||
    : public mpl::true_ \
 | 
			
		||||
{ \
 | 
			
		||||
}; \
 | 
			
		||||
\
 | 
			
		||||
template<typename T> \
 | 
			
		||||
class unwrap_reference< X > \
 | 
			
		||||
{ \
 | 
			
		||||
 public: \
 | 
			
		||||
    typedef T type; \
 | 
			
		||||
}; \
 | 
			
		||||
/**/
 | 
			
		||||
 | 
			
		||||
AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T>)
 | 
			
		||||
#if !defined(BOOST_NO_CV_SPECIALIZATIONS)
 | 
			
		||||
AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T> const)
 | 
			
		||||
AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T> volatile)
 | 
			
		||||
AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF(reference_wrapper<T> const volatile)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#  undef AUX_REFERENCE_WRAPPER_METAFUNCTIONS_DEF
 | 
			
		||||
 | 
			
		||||
# else // no partial specialization
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
@@ -160,6 +173,17 @@ class unwrap_reference
 | 
			
		||||
 | 
			
		||||
# endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
 | 
			
		||||
template <class T> inline typename unwrap_reference<T>::type&
 | 
			
		||||
unwrap_ref(T& t)
 | 
			
		||||
{
 | 
			
		||||
    return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline T* get_pointer( reference_wrapper<T> const & r )
 | 
			
		||||
{
 | 
			
		||||
    return r.get_pointer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_REF_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								include/boost/swap.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								include/boost/swap.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
// Copyright (C) 2007 Joseph Gauterin
 | 
			
		||||
//
 | 
			
		||||
// 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_SWAP_HPP
 | 
			
		||||
#define BOOST_SWAP_HPP
 | 
			
		||||
 | 
			
		||||
#include "boost/utility/swap.hpp"
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
//  Boost utility.hpp header file  -------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright 1999-2003 Boost.org.  Use, modification, and distribution are
 | 
			
		||||
//  Copyright 1999-2003 Aleksey Gurtovoy.  Use, modification, and distribution are
 | 
			
		||||
//  subject to the Boost Software License, Version 1.0.  (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)
 | 
			
		||||
 | 
			
		||||
@@ -10,7 +10,9 @@
 | 
			
		||||
#define BOOST_UTILITY_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/addressof.hpp>
 | 
			
		||||
#include <boost/utility/base_from_member.hpp>  
 | 
			
		||||
#include <boost/utility/base_from_member.hpp>
 | 
			
		||||
#include <boost/utility/binary.hpp>
 | 
			
		||||
#include <boost/utility/enable_if.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/next_prior.hpp>
 | 
			
		||||
#include <boost/noncopyable.hpp>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,11 @@
 | 
			
		||||
// Copyright (C) 2002 Brad King (brad.king@kitware.com) 
 | 
			
		||||
//                    Doug Gregor (gregod@cs.rpi.edu)
 | 
			
		||||
//                    Peter Dimov
 | 
			
		||||
//                    Douglas Gregor (gregod@cs.rpi.edu)
 | 
			
		||||
//
 | 
			
		||||
// Permission to copy, use, sell and distribute this software is granted
 | 
			
		||||
// provided this copyright notice appears in all copies.
 | 
			
		||||
// Permission to modify the code and to distribute modified code is granted
 | 
			
		||||
// provided this copyright notice appears in all copies, and a notice
 | 
			
		||||
// that the code was modified is included with the copyright notice.
 | 
			
		||||
// Copyright (C) 2002, 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// This software is provided "as is" without express or implied warranty,
 | 
			
		||||
// and with no claim as to its suitability for any purpose.
 | 
			
		||||
// 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)
 | 
			
		||||
 | 
			
		||||
// For more information, see http://www.boost.org
 | 
			
		||||
 | 
			
		||||
@@ -18,26 +14,89 @@
 | 
			
		||||
 | 
			
		||||
# include <boost/config.hpp>
 | 
			
		||||
# include <boost/detail/workaround.hpp>
 | 
			
		||||
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
 | 
			
		||||
#  include <boost/type_traits/add_pointer.hpp>
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
// Do not make addressof() inline. Breaks MSVC 7. (Peter Dimov)
 | 
			
		||||
 | 
			
		||||
// VC7 strips const from nested classes unless we add indirection here
 | 
			
		||||
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
 | 
			
		||||
template <typename T> typename add_pointer<T>::type
 | 
			
		||||
# else
 | 
			
		||||
template <typename T> T*
 | 
			
		||||
# endif
 | 
			
		||||
addressof(T& v)
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
  return reinterpret_cast<T*>(
 | 
			
		||||
       &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> struct addr_impl_ref
 | 
			
		||||
{
 | 
			
		||||
    T & v_;
 | 
			
		||||
 | 
			
		||||
    inline addr_impl_ref( T & v ): v_( v ) {}
 | 
			
		||||
    inline operator T& () const { return v_; }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    addr_impl_ref & operator=(const addr_impl_ref &);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T> struct addressof_impl
 | 
			
		||||
{
 | 
			
		||||
    static inline T * f( T & v, long )
 | 
			
		||||
    {
 | 
			
		||||
        return reinterpret_cast<T*>(
 | 
			
		||||
            &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline T * f( T * v, int )
 | 
			
		||||
    {
 | 
			
		||||
        return v;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
template<class T> T * addressof( T & v )
 | 
			
		||||
{
 | 
			
		||||
#if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x610 ) )
 | 
			
		||||
 | 
			
		||||
    return boost::detail::addressof_impl<T>::f( v, 0 );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    return boost::detail::addressof_impl<T>::f( boost::detail::addr_impl_ref<T>( v ), 0 );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined( __SUNPRO_CC ) && BOOST_WORKAROUND( __SUNPRO_CC, BOOST_TESTED_AT( 0x590 ) )
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> struct addressof_addp
 | 
			
		||||
{
 | 
			
		||||
    typedef T * type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
template< class T, std::size_t N >
 | 
			
		||||
typename detail::addressof_addp< T[N] >::type addressof( T (&t)[N] )
 | 
			
		||||
{
 | 
			
		||||
    return &t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Borland doesn't like casting an array reference to a char reference
 | 
			
		||||
// but these overloads work around the problem.
 | 
			
		||||
#if defined( __BORLANDC__ ) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
 | 
			
		||||
template<typename T,std::size_t N>
 | 
			
		||||
T (*addressof(T (&t)[N]))[N]
 | 
			
		||||
{
 | 
			
		||||
   return reinterpret_cast<T(*)[N]>(&t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T,std::size_t N>
 | 
			
		||||
const T (*addressof(const T (&t)[N]))[N]
 | 
			
		||||
{
 | 
			
		||||
   return reinterpret_cast<const T(*)[N]>(&t);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_UTILITY_ADDRESSOF_HPP
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,53 @@
 | 
			
		||||
//  boost utility/base_from_member.hpp header file  --------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright 2001, 2003 Daryle Walker.  Use, modification, and distribution are
 | 
			
		||||
//  subject to the Boost Software License, Version 1.0.  (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)
 | 
			
		||||
//  Copyright 2001, 2003, 2004 Daryle Walker.  Use, modification, and
 | 
			
		||||
//  distribution are subject to the Boost Software License, Version 1.0.  (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or a copy at
 | 
			
		||||
//  <http://www.boost.org/LICENSE_1_0.txt>.)
 | 
			
		||||
 | 
			
		||||
//  See <http://www.boost.org/libs/utility/> for the library's home page.
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_UTILITY_BASE_FROM_MEMBER_HPP
 | 
			
		||||
#define BOOST_UTILITY_BASE_FROM_MEMBER_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/utility_fwd.hpp>  // required for parameter defaults
 | 
			
		||||
#include <boost/preprocessor/arithmetic/inc.hpp>
 | 
			
		||||
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
 | 
			
		||||
#include <boost/preprocessor/repetition/enum_params.hpp>
 | 
			
		||||
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  Base-from-member arity configuration macro  ------------------------------//
 | 
			
		||||
 | 
			
		||||
// The following macro determines how many arguments will be in the largest
 | 
			
		||||
// constructor template of base_from_member.  Constructor templates will be
 | 
			
		||||
// generated from one argument to this maximum.  Code from other files can read
 | 
			
		||||
// this number if they need to always match the exact maximum base_from_member
 | 
			
		||||
// uses.  The maximum constructor length can be changed by overriding the
 | 
			
		||||
// #defined constant.  Make sure to apply the override, if any, for all source
 | 
			
		||||
// files during project compiling for consistency.
 | 
			
		||||
 | 
			
		||||
// Contributed by Jonathan Turkanis
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_BASE_FROM_MEMBER_MAX_ARITY
 | 
			
		||||
#define BOOST_BASE_FROM_MEMBER_MAX_ARITY  10
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  An iteration of a constructor template for base_from_member  -------------//
 | 
			
		||||
 | 
			
		||||
// A macro that should expand to:
 | 
			
		||||
//     template < typename T1, ..., typename Tn >
 | 
			
		||||
//     base_from_member( T1 x1, ..., Tn xn )
 | 
			
		||||
//         : member( x1, ..., xn )
 | 
			
		||||
//         {}
 | 
			
		||||
// This macro should only persist within this file.
 | 
			
		||||
 | 
			
		||||
#define BOOST_PRIVATE_CTR_DEF( z, n, data )                            \
 | 
			
		||||
    template < BOOST_PP_ENUM_PARAMS(n, typename T) >                   \
 | 
			
		||||
    explicit base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) )  \
 | 
			
		||||
        : member( BOOST_PP_ENUM_PARAMS(n, x) )                         \
 | 
			
		||||
        {}                                                             \
 | 
			
		||||
    /**/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
@@ -24,7 +62,7 @@ namespace boost
 | 
			
		||||
 | 
			
		||||
// Contributed by Daryle Walker
 | 
			
		||||
 | 
			
		||||
template < typename MemberType, int UniqueID >
 | 
			
		||||
template < typename MemberType, int UniqueID = 0 >
 | 
			
		||||
class base_from_member
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
@@ -34,66 +72,16 @@ protected:
 | 
			
		||||
        : member()
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1 >
 | 
			
		||||
    explicit base_from_member( T1 x1 )
 | 
			
		||||
        : member( x1 )
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1, typename T2 >
 | 
			
		||||
    base_from_member( T1 x1, T2 x2 )
 | 
			
		||||
        : member( x1, x2 )
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1, typename T2, typename T3 >
 | 
			
		||||
    base_from_member( T1 x1, T2 x2, T3 x3 )
 | 
			
		||||
        : member( x1, x2, x3 ) 
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1, typename T2, typename T3, typename T4 >
 | 
			
		||||
    base_from_member( T1 x1, T2 x2, T3 x3, T4 x4 )
 | 
			
		||||
        : member( x1, x2, x3, x4 ) 
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1, typename T2, typename T3, typename T4, typename T5 >
 | 
			
		||||
    base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5 )
 | 
			
		||||
        : member( x1, x2, x3, x4, x5 ) 
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
     typename T6 >
 | 
			
		||||
    base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6 )
 | 
			
		||||
        : member( x1, x2, x3, x4, x5, x6 ) 
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
     typename T6, typename T7 >
 | 
			
		||||
    base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6, T7 x7 )
 | 
			
		||||
        : member( x1, x2, x3, x4, x5, x6, x7 ) 
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
     typename T6, typename T7, typename T8 >
 | 
			
		||||
    base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6, T7 x7, T8 x8 )
 | 
			
		||||
        : member( x1, x2, x3, x4, x5, x6, x7, x8 ) 
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
     typename T6, typename T7, typename T8, typename T9 >
 | 
			
		||||
    base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6, T7 x7, T8 x8,
 | 
			
		||||
     T9 x9 )
 | 
			
		||||
        : member( x1, x2, x3, x4, x5, x6, x7, x8, x9 ) 
 | 
			
		||||
        {}
 | 
			
		||||
 | 
			
		||||
    template< typename T1, typename T2, typename T3, typename T4, typename T5,
 | 
			
		||||
     typename T6, typename T7, typename T8, typename T9, typename T10 >
 | 
			
		||||
    base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6, T7 x7, T8 x8,
 | 
			
		||||
     T9 x9, T10 x10 )
 | 
			
		||||
        : member( x1, x2, x3, x4, x5, x6, x7, x8, x9, x10 ) 
 | 
			
		||||
        {}
 | 
			
		||||
    BOOST_PP_REPEAT_FROM_TO( 1, BOOST_PP_INC(BOOST_BASE_FROM_MEMBER_MAX_ARITY),
 | 
			
		||||
     BOOST_PRIVATE_CTR_DEF, _ )
 | 
			
		||||
 | 
			
		||||
};  // boost::base_from_member
 | 
			
		||||
 | 
			
		||||
}  // namespace boost
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Undo any private macros
 | 
			
		||||
#undef BOOST_PRIVATE_CTR_DEF
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif  // BOOST_UTILITY_BASE_FROM_MEMBER_HPP
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										708
									
								
								include/boost/utility/binary.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										708
									
								
								include/boost/utility/binary.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,708 @@
 | 
			
		||||
/*=============================================================================
 | 
			
		||||
    Copyright (c) 2005 Matthew Calabrese
 | 
			
		||||
 | 
			
		||||
    Use, modification and distribution is subject to 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_UTILITY_BINARY_HPP
 | 
			
		||||
#define BOOST_UTILITY_BINARY_HPP
 | 
			
		||||
 | 
			
		||||
/*=============================================================================
 | 
			
		||||
 | 
			
		||||
    Binary Literal Utility
 | 
			
		||||
    ______________________
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    The following code works by converting the input bit pattern into a
 | 
			
		||||
    Boost.Preprocessor sequence, then converting groupings of 3 bits each into
 | 
			
		||||
    the corresponding octal digit, and finally concatenating all of the digits
 | 
			
		||||
    together along with a leading zero. This yields a standard octal literal
 | 
			
		||||
    with the desired value as specified in bits.
 | 
			
		||||
 | 
			
		||||
==============================================================================*/
 | 
			
		||||
 | 
			
		||||
#include <boost/preprocessor/control/deduce_d.hpp>
 | 
			
		||||
#include <boost/preprocessor/facilities/identity.hpp>
 | 
			
		||||
#include <boost/preprocessor/cat.hpp>
 | 
			
		||||
#include <boost/preprocessor/seq/cat.hpp>
 | 
			
		||||
#include <boost/preprocessor/seq/transform.hpp>
 | 
			
		||||
#include <boost/preprocessor/arithmetic/mod.hpp>
 | 
			
		||||
#include <boost/preprocessor/seq/size.hpp>
 | 
			
		||||
#include <boost/preprocessor/facilities/empty.hpp>
 | 
			
		||||
#include <boost/preprocessor/control/while.hpp>
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY( bit_groupings )                                          \
 | 
			
		||||
  BOOST_BINARY_LITERAL_D( BOOST_PP_DEDUCE_D(), bit_groupings ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_U( bit_groupings )                                        \
 | 
			
		||||
  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, U ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_L( bit_groupings )                                        \
 | 
			
		||||
  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, L ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_UL( bit_groupings )                                       \
 | 
			
		||||
  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, UL ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_LU( bit_groupings )                                       \
 | 
			
		||||
  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, LU ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_LL( bit_groupings )                                       \
 | 
			
		||||
  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, LL ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_ULL( bit_groupings )                                      \
 | 
			
		||||
  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, ULL ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_LLU( bit_groupings )                                      \
 | 
			
		||||
  BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, LLU ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_SUFFIXED_BINARY_LITERAL( bit_groupings, suffix )                 \
 | 
			
		||||
  BOOST_SUFFIXED_BINARY_LITERAL_D( BOOST_PP_DEDUCE_D(), bit_groupings, suffix ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_SUFFIXED_BINARY_LITERAL_D( d, bit_groupings, suffix )            \
 | 
			
		||||
  BOOST_PP_CAT( BOOST_BINARY_LITERAL_D( d, bit_groupings ), suffix ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_BINARY_LITERAL_D( d, bit_groupings )                             \
 | 
			
		||||
  BOOST_PP_SEQ_CAT                                                             \
 | 
			
		||||
  ( (0) BOOST_DETAIL_CREATE_BINARY_LITERAL_OCTAL_SEQUENCE( d, bit_groupings )  \
 | 
			
		||||
  ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_CREATE_BINARY_LITERAL_OCTAL_SEQUENCE( d, bit_groupings )  \
 | 
			
		||||
  BOOST_PP_SEQ_TRANSFORM                                                       \
 | 
			
		||||
  ( BOOST_DETAIL_TRIPLE_TO_OCTAL_OPERATION                                     \
 | 
			
		||||
  , BOOST_PP_NIL                                                               \
 | 
			
		||||
  , BOOST_PP_IDENTITY( BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_TRIPLE_SEQUENCE )()\
 | 
			
		||||
    ( BOOST_DETAIL_COMPLETE_TRIPLE_SEQUENCE                                    \
 | 
			
		||||
      (                                                                        \
 | 
			
		||||
        d                                                                      \
 | 
			
		||||
      , BOOST_DETAIL_CREATE_BINARY_LITERAL_BIT_SEQUENCE( d, bit_groupings )    \
 | 
			
		||||
      )                                                                        \
 | 
			
		||||
    )                                                                          \
 | 
			
		||||
  ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_TRIPLE_SEQUENCE( bit_sequence )   \
 | 
			
		||||
  BOOST_PP_CAT                                                                 \
 | 
			
		||||
  ( BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_1 bit_sequence      \
 | 
			
		||||
  , END_BIT                                                                    \
 | 
			
		||||
  ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BITS_PER_OCTIT 3
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_COMPLETE_TRIPLE_SEQUENCE( d, incomplete_nibble_sequence ) \
 | 
			
		||||
  BOOST_PP_CAT                                                                 \
 | 
			
		||||
  ( BOOST_DETAIL_CREATE_TRIPLE_COMPLETION_SEQUENCE_                            \
 | 
			
		||||
  , BOOST_PP_MOD_D( d                                                          \
 | 
			
		||||
                  , BOOST_PP_SEQ_SIZE( incomplete_nibble_sequence )            \
 | 
			
		||||
                  , BOOST_DETAIL_BITS_PER_OCTIT                                \
 | 
			
		||||
                  )                                                            \
 | 
			
		||||
  )                                                                            \
 | 
			
		||||
  incomplete_nibble_sequence 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_FIXED_COMPL( bit )                                        \
 | 
			
		||||
  BOOST_PP_CAT( BOOST_DETAIL_FIXED_COMPL_, bit )
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_FIXED_COMPL_0 1 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_FIXED_COMPL_1 0 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_CREATE_BINARY_LITERAL_BIT_SEQUENCE( d, bit_groupings )    \
 | 
			
		||||
  BOOST_PP_EMPTY                                                               \
 | 
			
		||||
  BOOST_PP_CAT( BOOST_PP_WHILE_, d )                                           \
 | 
			
		||||
  ( BOOST_DETAIL_BINARY_LITERAL_PREDICATE                                      \
 | 
			
		||||
  , BOOST_DETAIL_BINARY_LITERAL_OPERATION                                      \
 | 
			
		||||
  , bit_groupings ()                                                           \
 | 
			
		||||
  ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_PREDICATE( d, state )                      \
 | 
			
		||||
  BOOST_DETAIL_FIXED_COMPL( BOOST_DETAIL_IS_NULLARY_ARGS( state ) ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_OPERATION( d, state )                      \
 | 
			
		||||
  BOOST_DETAIL_SPLIT_AND_SWAP                                                  \
 | 
			
		||||
  ( BOOST_PP_CAT( BOOST_DETAIL_BINARY_LITERAL_ELEMENT_, state ) ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_TRIPLE_TO_OCTAL_OPERATION( s, dummy_param, tuple )        \
 | 
			
		||||
  BOOST_DETAIL_TERNARY_TRIPLE_TO_OCTAL tuple 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_TERNARY_TRIPLE_TO_OCTAL( bit2, bit1, bit0 )               \
 | 
			
		||||
  BOOST_DETAIL_TRIPLE_TO_OCTAL_ ## bit2 ## bit1 ## bit0 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_CREATE_TRIPLE_COMPLETION_SEQUENCE_1 (0)(0)
 | 
			
		||||
#define BOOST_DETAIL_CREATE_TRIPLE_COMPLETION_SEQUENCE_2 (0)
 | 
			
		||||
#define BOOST_DETAIL_CREATE_TRIPLE_COMPLETION_SEQUENCE_0  
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_1END_BIT  
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_1( bit )        \
 | 
			
		||||
  ( ( bit, BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_2 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_2( bit )        \
 | 
			
		||||
  bit, BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_3 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_3( bit )        \
 | 
			
		||||
  bit ) ) BOOST_DETAIL_CONVERT_BIT_SEQUENCE_TO_PARENTHETIC_TUPLE_1 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_SPLIT_AND_SWAP( params )                                  \
 | 
			
		||||
  BOOST_PP_IDENTITY( BOOST_DETAIL_SPLIT_AND_SWAP_PARAMS )()( params )
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_SPLIT_AND_SWAP_PARAMS( first_param, second_param )        \
 | 
			
		||||
  second_param first_param 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_LEFT_OF_COMMA( params )                                   \
 | 
			
		||||
  BOOST_PP_IDENTITY( BOOST_DETAIL_FIRST_MACRO_PARAM )()( params ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_FIRST_MACRO_PARAM( first_param, second_param )            \
 | 
			
		||||
  first_param 
 | 
			
		||||
 | 
			
		||||
/* Begin derived concepts from Chaos by Paul Mensonides */
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_IS_NULLARY_ARGS( param )                                  \
 | 
			
		||||
  BOOST_DETAIL_LEFT_OF_COMMA                                                   \
 | 
			
		||||
  ( BOOST_PP_CAT( BOOST_DETAIL_IS_NULLARY_ARGS_R_                              \
 | 
			
		||||
                , BOOST_DETAIL_IS_NULLARY_ARGS_C param                         \
 | 
			
		||||
                )                                                              \
 | 
			
		||||
  ) 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_IS_NULLARY_ARGS_C()                                       \
 | 
			
		||||
  1 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_IS_NULLARY_ARGS_R_1                                       \
 | 
			
		||||
  1, BOOST_PP_NIL 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_IS_NULLARY_ARGS_R_BOOST_DETAIL_IS_NULLARY_ARGS_C          \
 | 
			
		||||
  0, BOOST_PP_NIL 
 | 
			
		||||
 | 
			
		||||
/* End derived concepts from Chaos by Paul Mensonides */
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_TRIPLE_TO_OCTAL_000 0 
 | 
			
		||||
#define BOOST_DETAIL_TRIPLE_TO_OCTAL_001 1 
 | 
			
		||||
#define BOOST_DETAIL_TRIPLE_TO_OCTAL_010 2 
 | 
			
		||||
#define BOOST_DETAIL_TRIPLE_TO_OCTAL_011 3 
 | 
			
		||||
#define BOOST_DETAIL_TRIPLE_TO_OCTAL_100 4 
 | 
			
		||||
#define BOOST_DETAIL_TRIPLE_TO_OCTAL_101 5 
 | 
			
		||||
#define BOOST_DETAIL_TRIPLE_TO_OCTAL_110 6 
 | 
			
		||||
#define BOOST_DETAIL_TRIPLE_TO_OCTAL_111 7 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0 (0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1 (1), 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00 (0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01 (0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10 (1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11 (1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00 (0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01 (0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10 (1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11 (1)(1), 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000 (0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001 (0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010 (0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011 (0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100 (1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101 (1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110 (1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111 (1)(1)(1), 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000 (0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001 (0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010 (0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011 (0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100 (0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101 (0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110 (0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111 (0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000 (1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001 (1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010 (1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011 (1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100 (1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101 (1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110 (1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111 (1)(1)(1)(1), 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000 (0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001 (0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010 (0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011 (0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100 (0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101 (0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110 (0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111 (0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000 (0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001 (0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010 (0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011 (0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100 (0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101 (0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110 (0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111 (0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000 (1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001 (1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010 (1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011 (1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100 (1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101 (1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110 (1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111 (1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000 (1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001 (1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010 (1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011 (1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100 (1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101 (1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110 (1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111 (1)(1)(1)(1)(1), 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000000 (0)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000001 (0)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000010 (0)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000011 (0)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000100 (0)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000101 (0)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000110 (0)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_000111 (0)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001000 (0)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001001 (0)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001010 (0)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001011 (0)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001100 (0)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001101 (0)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001110 (0)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_001111 (0)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010000 (0)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010001 (0)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010010 (0)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010011 (0)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010100 (0)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010101 (0)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010110 (0)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_010111 (0)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011000 (0)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011001 (0)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011010 (0)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011011 (0)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011100 (0)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011101 (0)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011110 (0)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_011111 (0)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100000 (1)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100001 (1)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100010 (1)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100011 (1)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100100 (1)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100101 (1)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100110 (1)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_100111 (1)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101000 (1)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101001 (1)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101010 (1)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101011 (1)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101100 (1)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101101 (1)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101110 (1)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_101111 (1)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110000 (1)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110001 (1)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110010 (1)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110011 (1)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110100 (1)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110101 (1)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110110 (1)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_110111 (1)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111000 (1)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111001 (1)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111010 (1)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111011 (1)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111100 (1)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111101 (1)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111110 (1)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_111111 (1)(1)(1)(1)(1)(1), 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000000 (0)(0)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000001 (0)(0)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000010 (0)(0)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000011 (0)(0)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000100 (0)(0)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000101 (0)(0)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000110 (0)(0)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0000111 (0)(0)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001000 (0)(0)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001001 (0)(0)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001010 (0)(0)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001011 (0)(0)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001100 (0)(0)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001101 (0)(0)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001110 (0)(0)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0001111 (0)(0)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010000 (0)(0)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010001 (0)(0)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010010 (0)(0)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010011 (0)(0)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010100 (0)(0)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010101 (0)(0)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010110 (0)(0)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0010111 (0)(0)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011000 (0)(0)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011001 (0)(0)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011010 (0)(0)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011011 (0)(0)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011100 (0)(0)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011101 (0)(0)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011110 (0)(0)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0011111 (0)(0)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100000 (0)(1)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100001 (0)(1)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100010 (0)(1)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100011 (0)(1)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100100 (0)(1)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100101 (0)(1)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100110 (0)(1)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0100111 (0)(1)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101000 (0)(1)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101001 (0)(1)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101010 (0)(1)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101011 (0)(1)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101100 (0)(1)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101101 (0)(1)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101110 (0)(1)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0101111 (0)(1)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110000 (0)(1)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110001 (0)(1)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110010 (0)(1)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110011 (0)(1)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110100 (0)(1)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110101 (0)(1)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110110 (0)(1)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0110111 (0)(1)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111000 (0)(1)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111001 (0)(1)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111010 (0)(1)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111011 (0)(1)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111100 (0)(1)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111101 (0)(1)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111110 (0)(1)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_0111111 (0)(1)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000000 (1)(0)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000001 (1)(0)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000010 (1)(0)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000011 (1)(0)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000100 (1)(0)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000101 (1)(0)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000110 (1)(0)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1000111 (1)(0)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001000 (1)(0)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001001 (1)(0)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001010 (1)(0)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001011 (1)(0)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001100 (1)(0)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001101 (1)(0)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001110 (1)(0)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1001111 (1)(0)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010000 (1)(0)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010001 (1)(0)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010010 (1)(0)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010011 (1)(0)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010100 (1)(0)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010101 (1)(0)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010110 (1)(0)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1010111 (1)(0)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011000 (1)(0)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011001 (1)(0)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011010 (1)(0)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011011 (1)(0)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011100 (1)(0)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011101 (1)(0)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011110 (1)(0)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1011111 (1)(0)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100000 (1)(1)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100001 (1)(1)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100010 (1)(1)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100011 (1)(1)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100100 (1)(1)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100101 (1)(1)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100110 (1)(1)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1100111 (1)(1)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101000 (1)(1)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101001 (1)(1)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101010 (1)(1)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101011 (1)(1)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101100 (1)(1)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101101 (1)(1)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101110 (1)(1)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1101111 (1)(1)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110000 (1)(1)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110001 (1)(1)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110010 (1)(1)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110011 (1)(1)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110100 (1)(1)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110101 (1)(1)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110110 (1)(1)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1110111 (1)(1)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111000 (1)(1)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111001 (1)(1)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111010 (1)(1)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111011 (1)(1)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111100 (1)(1)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111101 (1)(1)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111110 (1)(1)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_1111111 (1)(1)(1)(1)(1)(1)(1), 
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000000 (0)(0)(0)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000001 (0)(0)(0)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000010 (0)(0)(0)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000011 (0)(0)(0)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000100 (0)(0)(0)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000101 (0)(0)(0)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000110 (0)(0)(0)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00000111 (0)(0)(0)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001000 (0)(0)(0)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001001 (0)(0)(0)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001010 (0)(0)(0)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001011 (0)(0)(0)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001100 (0)(0)(0)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001101 (0)(0)(0)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001110 (0)(0)(0)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00001111 (0)(0)(0)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010000 (0)(0)(0)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010001 (0)(0)(0)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010010 (0)(0)(0)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010011 (0)(0)(0)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010100 (0)(0)(0)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010101 (0)(0)(0)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010110 (0)(0)(0)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00010111 (0)(0)(0)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011000 (0)(0)(0)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011001 (0)(0)(0)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011010 (0)(0)(0)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011011 (0)(0)(0)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011100 (0)(0)(0)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011101 (0)(0)(0)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011110 (0)(0)(0)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00011111 (0)(0)(0)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100000 (0)(0)(1)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100001 (0)(0)(1)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100010 (0)(0)(1)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100011 (0)(0)(1)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100100 (0)(0)(1)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100101 (0)(0)(1)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100110 (0)(0)(1)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00100111 (0)(0)(1)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101000 (0)(0)(1)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101001 (0)(0)(1)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101010 (0)(0)(1)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101011 (0)(0)(1)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101100 (0)(0)(1)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101101 (0)(0)(1)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101110 (0)(0)(1)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00101111 (0)(0)(1)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110000 (0)(0)(1)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110001 (0)(0)(1)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110010 (0)(0)(1)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110011 (0)(0)(1)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110100 (0)(0)(1)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110101 (0)(0)(1)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110110 (0)(0)(1)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00110111 (0)(0)(1)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111000 (0)(0)(1)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111001 (0)(0)(1)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111010 (0)(0)(1)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111011 (0)(0)(1)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111100 (0)(0)(1)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111101 (0)(0)(1)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111110 (0)(0)(1)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_00111111 (0)(0)(1)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000000 (0)(1)(0)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000001 (0)(1)(0)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000010 (0)(1)(0)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000011 (0)(1)(0)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000100 (0)(1)(0)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000101 (0)(1)(0)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000110 (0)(1)(0)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01000111 (0)(1)(0)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001000 (0)(1)(0)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001001 (0)(1)(0)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001010 (0)(1)(0)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001011 (0)(1)(0)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001100 (0)(1)(0)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001101 (0)(1)(0)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001110 (0)(1)(0)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01001111 (0)(1)(0)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010000 (0)(1)(0)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010001 (0)(1)(0)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010010 (0)(1)(0)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010011 (0)(1)(0)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010100 (0)(1)(0)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010101 (0)(1)(0)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010110 (0)(1)(0)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01010111 (0)(1)(0)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011000 (0)(1)(0)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011001 (0)(1)(0)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011010 (0)(1)(0)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011011 (0)(1)(0)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011100 (0)(1)(0)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011101 (0)(1)(0)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011110 (0)(1)(0)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01011111 (0)(1)(0)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100000 (0)(1)(1)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100001 (0)(1)(1)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100010 (0)(1)(1)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100011 (0)(1)(1)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100100 (0)(1)(1)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100101 (0)(1)(1)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100110 (0)(1)(1)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01100111 (0)(1)(1)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101000 (0)(1)(1)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101001 (0)(1)(1)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101010 (0)(1)(1)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101011 (0)(1)(1)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101100 (0)(1)(1)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101101 (0)(1)(1)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101110 (0)(1)(1)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01101111 (0)(1)(1)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110000 (0)(1)(1)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110001 (0)(1)(1)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110010 (0)(1)(1)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110011 (0)(1)(1)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110100 (0)(1)(1)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110101 (0)(1)(1)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110110 (0)(1)(1)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01110111 (0)(1)(1)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111000 (0)(1)(1)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111001 (0)(1)(1)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111010 (0)(1)(1)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111011 (0)(1)(1)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111100 (0)(1)(1)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111101 (0)(1)(1)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111110 (0)(1)(1)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_01111111 (0)(1)(1)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000000 (1)(0)(0)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000001 (1)(0)(0)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000010 (1)(0)(0)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000011 (1)(0)(0)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000100 (1)(0)(0)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000101 (1)(0)(0)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000110 (1)(0)(0)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10000111 (1)(0)(0)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001000 (1)(0)(0)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001001 (1)(0)(0)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001010 (1)(0)(0)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001011 (1)(0)(0)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001100 (1)(0)(0)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001101 (1)(0)(0)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001110 (1)(0)(0)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10001111 (1)(0)(0)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010000 (1)(0)(0)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010001 (1)(0)(0)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010010 (1)(0)(0)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010011 (1)(0)(0)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010100 (1)(0)(0)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010101 (1)(0)(0)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010110 (1)(0)(0)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10010111 (1)(0)(0)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011000 (1)(0)(0)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011001 (1)(0)(0)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011010 (1)(0)(0)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011011 (1)(0)(0)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011100 (1)(0)(0)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011101 (1)(0)(0)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011110 (1)(0)(0)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10011111 (1)(0)(0)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100000 (1)(0)(1)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100001 (1)(0)(1)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100010 (1)(0)(1)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100011 (1)(0)(1)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100100 (1)(0)(1)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100101 (1)(0)(1)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100110 (1)(0)(1)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10100111 (1)(0)(1)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101000 (1)(0)(1)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101001 (1)(0)(1)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101010 (1)(0)(1)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101011 (1)(0)(1)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101100 (1)(0)(1)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101101 (1)(0)(1)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101110 (1)(0)(1)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10101111 (1)(0)(1)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110000 (1)(0)(1)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110001 (1)(0)(1)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110010 (1)(0)(1)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110011 (1)(0)(1)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110100 (1)(0)(1)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110101 (1)(0)(1)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110110 (1)(0)(1)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10110111 (1)(0)(1)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111000 (1)(0)(1)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111001 (1)(0)(1)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111010 (1)(0)(1)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111011 (1)(0)(1)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111100 (1)(0)(1)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111101 (1)(0)(1)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111110 (1)(0)(1)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_10111111 (1)(0)(1)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000000 (1)(1)(0)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000001 (1)(1)(0)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000010 (1)(1)(0)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000011 (1)(1)(0)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000100 (1)(1)(0)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000101 (1)(1)(0)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000110 (1)(1)(0)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11000111 (1)(1)(0)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001000 (1)(1)(0)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001001 (1)(1)(0)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001010 (1)(1)(0)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001011 (1)(1)(0)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001100 (1)(1)(0)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001101 (1)(1)(0)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001110 (1)(1)(0)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11001111 (1)(1)(0)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010000 (1)(1)(0)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010001 (1)(1)(0)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010010 (1)(1)(0)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010011 (1)(1)(0)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010100 (1)(1)(0)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010101 (1)(1)(0)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010110 (1)(1)(0)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11010111 (1)(1)(0)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011000 (1)(1)(0)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011001 (1)(1)(0)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011010 (1)(1)(0)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011011 (1)(1)(0)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011100 (1)(1)(0)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011101 (1)(1)(0)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011110 (1)(1)(0)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11011111 (1)(1)(0)(1)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100000 (1)(1)(1)(0)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100001 (1)(1)(1)(0)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100010 (1)(1)(1)(0)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100011 (1)(1)(1)(0)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100100 (1)(1)(1)(0)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100101 (1)(1)(1)(0)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100110 (1)(1)(1)(0)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11100111 (1)(1)(1)(0)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101000 (1)(1)(1)(0)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101001 (1)(1)(1)(0)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101010 (1)(1)(1)(0)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101011 (1)(1)(1)(0)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101100 (1)(1)(1)(0)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101101 (1)(1)(1)(0)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101110 (1)(1)(1)(0)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11101111 (1)(1)(1)(0)(1)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110000 (1)(1)(1)(1)(0)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110001 (1)(1)(1)(1)(0)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110010 (1)(1)(1)(1)(0)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110011 (1)(1)(1)(1)(0)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110100 (1)(1)(1)(1)(0)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110101 (1)(1)(1)(1)(0)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110110 (1)(1)(1)(1)(0)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11110111 (1)(1)(1)(1)(0)(1)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111000 (1)(1)(1)(1)(1)(0)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111001 (1)(1)(1)(1)(1)(0)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111010 (1)(1)(1)(1)(1)(0)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111011 (1)(1)(1)(1)(1)(0)(1)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111100 (1)(1)(1)(1)(1)(1)(0)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111101 (1)(1)(1)(1)(1)(1)(0)(1), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111110 (1)(1)(1)(1)(1)(1)(1)(0), 
 | 
			
		||||
#define BOOST_DETAIL_BINARY_LITERAL_ELEMENT_11111111 (1)(1)(1)(1)(1)(1)(1)(1), 
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
// 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/lib/optional for documentation.
 | 
			
		||||
// See http://www.boost.org/libs/optional for documentation.
 | 
			
		||||
//
 | 
			
		||||
// You are welcome to contact the author at:
 | 
			
		||||
//  fernando_cacciola@hotmail.com
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								include/boost/utility/declval.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								include/boost/utility/declval.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
//  common_type.hpp  ---------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright 2010 Vicente J. Botet Escriba
 | 
			
		||||
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_TYPE_TRAITS_EXT_DECLVAL__HPP
 | 
			
		||||
#define BOOST_TYPE_TRAITS_EXT_DECLVAL__HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
#include <boost/type_traits/add_rvalue_reference.hpp>
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------------------//
 | 
			
		||||
//                                                                            //
 | 
			
		||||
//                           C++03 implementation of                          //
 | 
			
		||||
//                          Written by Vicente J. Botet Escriba               //
 | 
			
		||||
//~ 20.3.4 Function template declval [declval]
 | 
			
		||||
//~ 1 The library provides the function template declval to simplify the definition of expressions which occur as
 | 
			
		||||
//~ unevaluated operands.
 | 
			
		||||
//~ 2 Remarks: If this function is used, the program is ill-formed.
 | 
			
		||||
//~ 3 Remarks: The template parameter T of declval may be an incomplete type.
 | 
			
		||||
//~ [ Example:
 | 
			
		||||
 | 
			
		||||
//~ template <class To, class From>
 | 
			
		||||
//~ decltype(static_cast<To>(declval<From>())) convert(From&&);
 | 
			
		||||
 | 
			
		||||
//~ declares a function template convert which only participats in overloading if the type From can be
 | 
			
		||||
//~ explicitly converted to type To. For another example see class template common_type (20.7.6.6). <20>end
 | 
			
		||||
//~ example ]
 | 
			
		||||
//                                                                            //
 | 
			
		||||
//----------------------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    typename add_rvalue_reference<T>::type declval(); //noexcept; // as unevaluated operand
 | 
			
		||||
 | 
			
		||||
}  // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // BOOST_TYPE_TRAITS_EXT_DECLVAL__HPP
 | 
			
		||||
							
								
								
									
										36
									
								
								include/boost/utility/detail/in_place_factory_prefix.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								include/boost/utility/detail/in_place_factory_prefix.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
 | 
			
		||||
// Copyright (C) 2007, Tobias Schwinger.
 | 
			
		||||
//
 | 
			
		||||
// Use, modification, and distribution is subject to 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/optional for documentation.
 | 
			
		||||
//
 | 
			
		||||
// You are welcome to contact the author at:
 | 
			
		||||
//  fernando_cacciola@hotmail.com
 | 
			
		||||
//
 | 
			
		||||
#ifndef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_04APR2007_HPP
 | 
			
		||||
#define BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_04APR2007_HPP
 | 
			
		||||
 | 
			
		||||
#include <new>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/preprocessor/cat.hpp>
 | 
			
		||||
#include <boost/preprocessor/punctuation/paren.hpp>
 | 
			
		||||
#include <boost/preprocessor/iteration/iterate.hpp>
 | 
			
		||||
#include <boost/preprocessor/repetition/repeat.hpp>
 | 
			
		||||
#include <boost/preprocessor/repetition/enum.hpp>
 | 
			
		||||
#include <boost/preprocessor/repetition/enum_params.hpp>
 | 
			
		||||
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
 | 
			
		||||
#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
 | 
			
		||||
 | 
			
		||||
#define BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT(z,n,_) BOOST_PP_CAT(m_a,n) BOOST_PP_LPAREN() BOOST_PP_CAT(a,n) BOOST_PP_RPAREN()
 | 
			
		||||
#define BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL(z,n,_) BOOST_PP_CAT(A,n) const& BOOST_PP_CAT(m_a,n);
 | 
			
		||||
 | 
			
		||||
#define BOOST_MAX_INPLACE_FACTORY_ARITY 10
 | 
			
		||||
 | 
			
		||||
#undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_04APR2007_HPP
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								include/boost/utility/detail/in_place_factory_suffix.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								include/boost/utility/detail/in_place_factory_suffix.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
 | 
			
		||||
// Copyright (C) 2007, Tobias Schwinger.
 | 
			
		||||
//
 | 
			
		||||
// Use, modification, and distribution is subject to 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/optional for documentation.
 | 
			
		||||
//
 | 
			
		||||
// You are welcome to contact the author at:
 | 
			
		||||
//  fernando_cacciola@hotmail.com
 | 
			
		||||
//
 | 
			
		||||
#ifndef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_04APR2007_HPP
 | 
			
		||||
#define BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_04APR2007_HPP
 | 
			
		||||
 | 
			
		||||
#undef BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT
 | 
			
		||||
#undef BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL
 | 
			
		||||
#undef BOOST_MAX_INPLACE_FACTORY_ARITY
 | 
			
		||||
 | 
			
		||||
#undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_04APR2007_HPP
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										148
									
								
								include/boost/utility/detail/result_of_iterate.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								include/boost/utility/detail/result_of_iterate.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,148 @@
 | 
			
		||||
// Boost result_of library
 | 
			
		||||
 | 
			
		||||
//  Copyright Douglas Gregor 2004. Use, modification and
 | 
			
		||||
//  distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
// For more information, see http://www.boost.org/libs/utility
 | 
			
		||||
#if !defined(BOOST_PP_IS_ITERATING)
 | 
			
		||||
# error Boost result_of - do not include this file!
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// CWPro8 requires an argument in a function type specialization
 | 
			
		||||
#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3002)) && BOOST_PP_ITERATION() == 0
 | 
			
		||||
# define BOOST_RESULT_OF_ARGS void
 | 
			
		||||
#else
 | 
			
		||||
# define BOOST_RESULT_OF_ARGS BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
 | 
			
		||||
template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
struct tr1_result_of<F(BOOST_RESULT_OF_ARGS)>
 | 
			
		||||
    : mpl::if_<
 | 
			
		||||
          mpl::or_< is_pointer<F>, is_member_function_pointer<F> >
 | 
			
		||||
        , boost::detail::tr1_result_of_impl<
 | 
			
		||||
            typename remove_cv<F>::type, 
 | 
			
		||||
            typename remove_cv<F>::type(BOOST_RESULT_OF_ARGS), 
 | 
			
		||||
            (boost::detail::has_result_type<F>::value)>
 | 
			
		||||
        , boost::detail::tr1_result_of_impl<
 | 
			
		||||
            F,
 | 
			
		||||
            F(BOOST_RESULT_OF_ARGS), 
 | 
			
		||||
            (boost::detail::has_result_type<F>::value)> >::type { };
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_DECLTYPE) && defined(BOOST_RESULT_OF_USE_DECLTYPE)
 | 
			
		||||
 | 
			
		||||
// As of N2588, C++0x result_of only supports function call
 | 
			
		||||
// expressions of the form f(x). This precludes support for member
 | 
			
		||||
// function pointers, which are invoked with expressions of the form
 | 
			
		||||
// o->*f(x). This implementation supports both.
 | 
			
		||||
template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
struct result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
 | 
			
		||||
    : mpl::if_<
 | 
			
		||||
          mpl::or_< is_pointer<F>, is_member_function_pointer<F> >
 | 
			
		||||
        , detail::tr1_result_of_impl<
 | 
			
		||||
            typename remove_cv<F>::type, 
 | 
			
		||||
            typename remove_cv<F>::type(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false
 | 
			
		||||
          >
 | 
			
		||||
        , detail::cpp0x_result_of_impl<
 | 
			
		||||
              F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))
 | 
			
		||||
          >
 | 
			
		||||
      >::type
 | 
			
		||||
{};
 | 
			
		||||
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
# define BOOST_RESULT_OF_STATIC_MEMBERS(z, n, _) \
 | 
			
		||||
     static T ## n t ## n; \
 | 
			
		||||
  /**/
 | 
			
		||||
 | 
			
		||||
template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
class cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
 | 
			
		||||
{
 | 
			
		||||
  static F f;
 | 
			
		||||
  BOOST_PP_REPEAT(BOOST_PP_ITERATION(), BOOST_RESULT_OF_STATIC_MEMBERS, _)
 | 
			
		||||
public:
 | 
			
		||||
  typedef decltype(f(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),t))) type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail 
 | 
			
		||||
 | 
			
		||||
#else // defined(BOOST_NO_DECLTYPE)
 | 
			
		||||
 | 
			
		||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
 | 
			
		||||
template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
struct result_of<F(BOOST_RESULT_OF_ARGS)>
 | 
			
		||||
    : tr1_result_of<F(BOOST_RESULT_OF_ARGS)> { };
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // defined(BOOST_NO_DECLTYPE)
 | 
			
		||||
 | 
			
		||||
#undef BOOST_RESULT_OF_ARGS
 | 
			
		||||
 | 
			
		||||
#if BOOST_PP_ITERATION() >= 1 
 | 
			
		||||
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
template<typename R,  typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
struct tr1_result_of_impl<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
 | 
			
		||||
{
 | 
			
		||||
  typedef R type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename R,  typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
struct tr1_result_of_impl<R (&)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
 | 
			
		||||
{
 | 
			
		||||
  typedef R type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
 | 
			
		||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
struct tr1_result_of_impl<R (T0::*)
 | 
			
		||||
                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)),
 | 
			
		||||
                 FArgs, false>
 | 
			
		||||
{
 | 
			
		||||
  typedef R type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
struct tr1_result_of_impl<R (T0::*)
 | 
			
		||||
                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
 | 
			
		||||
                     const,
 | 
			
		||||
                 FArgs, false>
 | 
			
		||||
{
 | 
			
		||||
  typedef R type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
struct tr1_result_of_impl<R (T0::*)
 | 
			
		||||
                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
 | 
			
		||||
                     volatile,
 | 
			
		||||
                 FArgs, false>
 | 
			
		||||
{
 | 
			
		||||
  typedef R type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
 | 
			
		||||
         BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
 | 
			
		||||
struct tr1_result_of_impl<R (T0::*)
 | 
			
		||||
                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
 | 
			
		||||
                     const volatile,
 | 
			
		||||
                 FArgs, false>
 | 
			
		||||
{
 | 
			
		||||
  typedef R type;
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
// Boost enable_if library
 | 
			
		||||
 | 
			
		||||
// Copyright 2003 <EFBFBD> The Trustees of Indiana University.
 | 
			
		||||
// Copyright 2003 (c) The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification, and distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
//    Authors: Jaakko J<EFBFBD>rvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)
 | 
			
		||||
//             Jeremiah Willcock (jewillco at osl.iu.edu)
 | 
			
		||||
//             Andrew Lumsdaine (lums at osl.iu.edu)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										88
									
								
								include/boost/utility/in_place_factory.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								include/boost/utility/in_place_factory.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
 | 
			
		||||
// Copyright (C) 2007, Tobias Schwinger.
 | 
			
		||||
//
 | 
			
		||||
// Use, modification, and distribution is subject to 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/optional for documentation.
 | 
			
		||||
//
 | 
			
		||||
// You are welcome to contact the author at:
 | 
			
		||||
//  fernando_cacciola@hotmail.com
 | 
			
		||||
//
 | 
			
		||||
#ifndef BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
 | 
			
		||||
#ifndef BOOST_PP_IS_ITERATING
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/detail/in_place_factory_prefix.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
class in_place_factory_base {} ;
 | 
			
		||||
 | 
			
		||||
#define  BOOST_PP_ITERATION_LIMITS (0, BOOST_MAX_INPLACE_FACTORY_ARITY)
 | 
			
		||||
#define  BOOST_PP_FILENAME_1 <boost/utility/in_place_factory.hpp>
 | 
			
		||||
#include BOOST_PP_ITERATE()
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/detail/in_place_factory_suffix.hpp>
 | 
			
		||||
 | 
			
		||||
#define BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP
 | 
			
		||||
#else
 | 
			
		||||
#define N BOOST_PP_ITERATION()
 | 
			
		||||
 | 
			
		||||
#if N
 | 
			
		||||
template< BOOST_PP_ENUM_PARAMS(N, class A) >
 | 
			
		||||
#endif
 | 
			
		||||
class BOOST_PP_CAT(in_place_factory,N)
 | 
			
		||||
  : 
 | 
			
		||||
  public in_place_factory_base
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
  explicit BOOST_PP_CAT(in_place_factory,N)
 | 
			
		||||
      ( BOOST_PP_ENUM_BINARY_PARAMS(N,A,const& a) )
 | 
			
		||||
#if N > 0
 | 
			
		||||
    : BOOST_PP_ENUM(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _)
 | 
			
		||||
#endif
 | 
			
		||||
  {}
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
  void* apply(void* address
 | 
			
		||||
      BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) const
 | 
			
		||||
  {
 | 
			
		||||
    return new(address) T( BOOST_PP_ENUM_PARAMS(N, m_a) );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template<class T>
 | 
			
		||||
  void* apply(void* address, std::size_t n
 | 
			
		||||
      BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) const
 | 
			
		||||
  {
 | 
			
		||||
    for(char* next = address = this->BOOST_NESTED_TEMPLATE apply<T>(address);
 | 
			
		||||
        !! --n;)
 | 
			
		||||
      this->BOOST_NESTED_TEMPLATE apply<T>(next = next+sizeof(T));
 | 
			
		||||
    return address; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  BOOST_PP_REPEAT(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if N > 0
 | 
			
		||||
template< BOOST_PP_ENUM_PARAMS(N, class A) >
 | 
			
		||||
inline BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) >
 | 
			
		||||
in_place( BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) )
 | 
			
		||||
{
 | 
			
		||||
  return BOOST_PP_CAT(in_place_factory,N)< BOOST_PP_ENUM_PARAMS(N, A) >
 | 
			
		||||
      ( BOOST_PP_ENUM_PARAMS(N, a) );
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
inline in_place_factory0 in_place()
 | 
			
		||||
{
 | 
			
		||||
  return in_place_factory0();
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef N
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										100
									
								
								include/boost/utility/result_of.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								include/boost/utility/result_of.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
			
		||||
// Boost result_of library
 | 
			
		||||
 | 
			
		||||
//  Copyright Douglas Gregor 2004. Use, modification and
 | 
			
		||||
//  distribution is subject to 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)
 | 
			
		||||
 | 
			
		||||
// For more information, see http://www.boost.org/libs/utility
 | 
			
		||||
#ifndef BOOST_RESULT_OF_HPP
 | 
			
		||||
#define BOOST_RESULT_OF_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/preprocessor/iteration/iterate.hpp> 
 | 
			
		||||
#include <boost/preprocessor/punctuation/comma_if.hpp> 
 | 
			
		||||
#include <boost/preprocessor/repetition/enum_params.hpp> 
 | 
			
		||||
#include <boost/preprocessor/repetition/enum_shifted_params.hpp> 
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
#include <boost/mpl/has_xxx.hpp>
 | 
			
		||||
#include <boost/mpl/if.hpp>
 | 
			
		||||
#include <boost/mpl/bool.hpp>
 | 
			
		||||
#include <boost/mpl/or.hpp>
 | 
			
		||||
#include <boost/type_traits/is_pointer.hpp>
 | 
			
		||||
#include <boost/type_traits/is_member_function_pointer.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_cv.hpp>
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_RESULT_OF_NUM_ARGS
 | 
			
		||||
#  define BOOST_RESULT_OF_NUM_ARGS 10
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
template<typename F> struct result_of;
 | 
			
		||||
template<typename F> struct tr1_result_of; // a TR1-style implementation of result_of
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)
 | 
			
		||||
 | 
			
		||||
template<typename F, typename FArgs, bool HasResultType> struct tr1_result_of_impl;
 | 
			
		||||
template<typename F> struct cpp0x_result_of_impl;
 | 
			
		||||
 | 
			
		||||
template<typename F>
 | 
			
		||||
struct result_of_void_impl
 | 
			
		||||
{
 | 
			
		||||
  typedef void type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename R>
 | 
			
		||||
struct result_of_void_impl<R (*)(void)>
 | 
			
		||||
{
 | 
			
		||||
  typedef R type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename R>
 | 
			
		||||
struct result_of_void_impl<R (&)(void)>
 | 
			
		||||
{
 | 
			
		||||
  typedef R type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Determine the return type of a function pointer or pointer to member.
 | 
			
		||||
template<typename F, typename FArgs>
 | 
			
		||||
struct result_of_pointer
 | 
			
		||||
  : tr1_result_of_impl<typename remove_cv<F>::type, FArgs, false> { };
 | 
			
		||||
 | 
			
		||||
template<typename F, typename FArgs>
 | 
			
		||||
struct tr1_result_of_impl<F, FArgs, true>
 | 
			
		||||
{
 | 
			
		||||
  typedef typename F::result_type type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename FArgs>
 | 
			
		||||
struct is_function_with_no_args : mpl::false_ {};
 | 
			
		||||
 | 
			
		||||
template<typename F>
 | 
			
		||||
struct is_function_with_no_args<F(void)> : mpl::true_ {};
 | 
			
		||||
 | 
			
		||||
template<typename F, typename FArgs>
 | 
			
		||||
struct result_of_nested_result : F::template result<FArgs>
 | 
			
		||||
{};
 | 
			
		||||
 | 
			
		||||
template<typename F, typename FArgs>
 | 
			
		||||
struct tr1_result_of_impl<F, FArgs, false>
 | 
			
		||||
  : mpl::if_<is_function_with_no_args<FArgs>,
 | 
			
		||||
             result_of_void_impl<F>,
 | 
			
		||||
             result_of_nested_result<F, FArgs> >::type
 | 
			
		||||
{};
 | 
			
		||||
 | 
			
		||||
} // end namespace detail
 | 
			
		||||
 | 
			
		||||
#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,BOOST_RESULT_OF_NUM_ARGS,<boost/utility/detail/result_of_iterate.hpp>))
 | 
			
		||||
#include BOOST_PP_ITERATE()
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#  define BOOST_NO_RESULT_OF 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_RESULT_OF_HPP
 | 
			
		||||
							
								
								
									
										55
									
								
								include/boost/utility/swap.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								include/boost/utility/swap.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
// Copyright (C) 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker
 | 
			
		||||
//
 | 
			
		||||
// 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)
 | 
			
		||||
// For more information, see http://www.boost.org
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_UTILITY_SWAP_HPP
 | 
			
		||||
#define BOOST_UTILITY_SWAP_HPP
 | 
			
		||||
 | 
			
		||||
// Note: the implementation of this utility contains various workarounds:
 | 
			
		||||
// - swap_impl is put outside the boost namespace, to avoid infinite
 | 
			
		||||
// recursion (causing stack overflow) when swapping objects of a primitive
 | 
			
		||||
// type.
 | 
			
		||||
// - swap_impl has a using-directive, rather than a using-declaration,
 | 
			
		||||
// because some compilers (including MSVC 7.1, Borland 5.9.3, and
 | 
			
		||||
// Intel 8.1) don't do argument-dependent lookup when it has a
 | 
			
		||||
// using-declaration instead.
 | 
			
		||||
// - boost::swap has two template arguments, instead of one, to
 | 
			
		||||
// avoid ambiguity when swapping objects of a Boost type that does
 | 
			
		||||
// not have its own boost::swap overload.
 | 
			
		||||
 | 
			
		||||
#include <algorithm> //for std::swap
 | 
			
		||||
#include <cstddef> //for std::size_t
 | 
			
		||||
 | 
			
		||||
namespace boost_swap_impl
 | 
			
		||||
{
 | 
			
		||||
  template<class T>
 | 
			
		||||
  void swap_impl(T& left, T& right)
 | 
			
		||||
  {
 | 
			
		||||
    using namespace std;//use std::swap if argument dependent lookup fails
 | 
			
		||||
    swap(left,right);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template<class T, std::size_t N>
 | 
			
		||||
  void swap_impl(T (& left)[N], T (& right)[N])
 | 
			
		||||
  {
 | 
			
		||||
    for (std::size_t i = 0; i < N; ++i)
 | 
			
		||||
    {
 | 
			
		||||
      ::boost_swap_impl::swap_impl(left[i], right[i]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
  template<class T1, class T2>
 | 
			
		||||
  void swap(T1& left, T2& right)
 | 
			
		||||
  {
 | 
			
		||||
    ::boost_swap_impl::swap_impl(left, right);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										77
									
								
								include/boost/utility/typed_in_place_factory.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								include/boost/utility/typed_in_place_factory.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
 | 
			
		||||
// Copyright (C) 2007, Tobias Schwinger.
 | 
			
		||||
//
 | 
			
		||||
// Use, modification, and distribution is subject to 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/optional for documentation.
 | 
			
		||||
//
 | 
			
		||||
// You are welcome to contact the author at:
 | 
			
		||||
//  fernando_cacciola@hotmail.com
 | 
			
		||||
//
 | 
			
		||||
#ifndef BOOST_UTILITY_TYPED_INPLACE_FACTORY_04APR2007_HPP
 | 
			
		||||
#ifndef BOOST_PP_IS_ITERATING
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/detail/in_place_factory_prefix.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
class typed_in_place_factory_base {} ;
 | 
			
		||||
 | 
			
		||||
#define  BOOST_PP_ITERATION_LIMITS (0, BOOST_MAX_INPLACE_FACTORY_ARITY)
 | 
			
		||||
#define  BOOST_PP_FILENAME_1 <boost/utility/typed_in_place_factory.hpp>
 | 
			
		||||
#include BOOST_PP_ITERATE()
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/detail/in_place_factory_suffix.hpp>
 | 
			
		||||
 | 
			
		||||
#define BOOST_UTILITY_TYPED_INPLACE_FACTORY_04APR2007_HPP
 | 
			
		||||
#else 
 | 
			
		||||
#define N BOOST_PP_ITERATION()
 | 
			
		||||
 | 
			
		||||
template< class T BOOST_PP_ENUM_TRAILING_PARAMS(N,class A) >
 | 
			
		||||
class BOOST_PP_CAT(typed_in_place_factory,N) 
 | 
			
		||||
  : 
 | 
			
		||||
  public typed_in_place_factory_base
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
  typedef T value_type;
 | 
			
		||||
 | 
			
		||||
  explicit BOOST_PP_CAT(typed_in_place_factory,N) 
 | 
			
		||||
      ( BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) )
 | 
			
		||||
#if N > 0
 | 
			
		||||
    : BOOST_PP_ENUM(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _)
 | 
			
		||||
#endif
 | 
			
		||||
  {}
 | 
			
		||||
 | 
			
		||||
  void* apply (void* address) const
 | 
			
		||||
  {
 | 
			
		||||
    return new(address) T( BOOST_PP_ENUM_PARAMS(N, m_a) );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void* apply (void* address, std::size_t n) const
 | 
			
		||||
  {
 | 
			
		||||
    for(void* next = address = this->apply(address); !! --n;)
 | 
			
		||||
      this->apply(next = static_cast<char *>(next) + sizeof(T));
 | 
			
		||||
    return address; 
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  BOOST_PP_REPEAT(N, BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class T BOOST_PP_ENUM_TRAILING_PARAMS(N, class A) >
 | 
			
		||||
inline BOOST_PP_CAT(typed_in_place_factory,N)<
 | 
			
		||||
    T BOOST_PP_ENUM_TRAILING_PARAMS(N, A) >
 | 
			
		||||
in_place( BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a) )
 | 
			
		||||
{
 | 
			
		||||
  return BOOST_PP_CAT(typed_in_place_factory,N)< 
 | 
			
		||||
      T BOOST_PP_ENUM_TRAILING_PARAMS(N, A) >( BOOST_PP_ENUM_PARAMS(N, a) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef N
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -1,82 +1,258 @@
 | 
			
		||||
// (C) 2002, Fernando Luis Cacciola Carballal.
 | 
			
		||||
// (C) Copyright 2002-2008, Fernando Luis Cacciola Carballal.
 | 
			
		||||
//
 | 
			
		||||
// This material is provided "as is", with absolutely no warranty expressed
 | 
			
		||||
// or implied. Any use is at your own risk.
 | 
			
		||||
//
 | 
			
		||||
// Permission to use or copy this software for any purpose is hereby granted
 | 
			
		||||
// without fee, provided the above notices are retained on all copies.
 | 
			
		||||
// Permission to modify the code and to distribute modified code is granted,
 | 
			
		||||
// provided the above notices are retained, and a notice that the code was
 | 
			
		||||
// modified is included with the above copyright notice.
 | 
			
		||||
// 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)
 | 
			
		||||
//
 | 
			
		||||
// 21 Ago 2002 (Created) Fernando Cacciola
 | 
			
		||||
// 24 Dec 2007 (Refactored and worked around various compiler bugs) Fernando Cacciola, Niels Dekker
 | 
			
		||||
// 23 May 2008 (Fixed operator= const issue, added initialized_value) Niels Dekker, Fernando Cacciola
 | 
			
		||||
// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola
 | 
			
		||||
// 20 Feb 2009 (Fixed logical const-ness issues) Niels Dekker, Fernando Cacciola
 | 
			
		||||
// 03 Apr 2010 (Added initialized<T>, suggested by Jeffrey Hellrung, fixing #3472) Niels Dekker
 | 
			
		||||
// 30 May 2010 (Made memset call conditional, fixing #3869) Niels Dekker
 | 
			
		||||
//
 | 
			
		||||
#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
 | 
			
		||||
#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
 | 
			
		||||
 | 
			
		||||
#include "boost/detail/select_type.hpp"
 | 
			
		||||
#include "boost/type_traits/cv_traits.hpp"
 | 
			
		||||
// Note: The implementation of boost::value_initialized had to deal with the
 | 
			
		||||
// fact that various compilers haven't fully implemented value-initialization.
 | 
			
		||||
// The constructor of boost::value_initialized<T> works around these compiler
 | 
			
		||||
// issues, by clearing the bytes of T, before constructing the T object it
 | 
			
		||||
// contains. More details on these issues are at libs/utility/value_init.htm
 | 
			
		||||
 | 
			
		||||
#include <boost/aligned_storage.hpp>
 | 
			
		||||
#include <boost/config.hpp> // For BOOST_NO_COMPLETE_VALUE_INITIALIZATION.
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
#include <boost/static_assert.hpp>
 | 
			
		||||
#include <boost/type_traits/cv_traits.hpp>
 | 
			
		||||
#include <boost/type_traits/alignment_of.hpp>
 | 
			
		||||
#include <boost/swap.hpp>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <new>
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
#pragma warning(push)
 | 
			
		||||
#if _MSC_VER >= 1310
 | 
			
		||||
// It is safe to ignore the following warning from MSVC 7.1 or higher:
 | 
			
		||||
// "warning C4351: new behavior: elements of array will be default initialized"
 | 
			
		||||
#pragma warning(disable: 4351)
 | 
			
		||||
// It is safe to ignore the following MSVC warning, which may pop up when T is 
 | 
			
		||||
// a const type: "warning C4512: assignment operator could not be generated".
 | 
			
		||||
#pragma warning(disable: 4512)
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_COMPLETE_VALUE_INITIALIZATION
 | 
			
		||||
  // Implementation detail: The macro BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED 
 | 
			
		||||
  // suggests that a workaround should be applied, because of compiler issues 
 | 
			
		||||
  // regarding value-initialization.
 | 
			
		||||
  #define BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Implementation detail: The macro BOOST_DETAIL_VALUE_INIT_WORKAROUND
 | 
			
		||||
// switches the value-initialization workaround either on or off.
 | 
			
		||||
#ifndef BOOST_DETAIL_VALUE_INIT_WORKAROUND
 | 
			
		||||
  #ifdef BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED
 | 
			
		||||
  #define BOOST_DETAIL_VALUE_INIT_WORKAROUND 1
 | 
			
		||||
  #else
 | 
			
		||||
  #define BOOST_DETAIL_VALUE_INIT_WORKAROUND 0
 | 
			
		||||
  #endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
namespace vinit_detail {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
class const_T_base
 | 
			
		||||
class initialized
 | 
			
		||||
{
 | 
			
		||||
  protected :
 | 
			
		||||
  private :
 | 
			
		||||
    struct wrapper
 | 
			
		||||
    {
 | 
			
		||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
 | 
			
		||||
      typename
 | 
			
		||||
#endif 
 | 
			
		||||
      remove_const<T>::type data;
 | 
			
		||||
 | 
			
		||||
   const_T_base() : x() {}
 | 
			
		||||
      wrapper()
 | 
			
		||||
      :
 | 
			
		||||
      data()
 | 
			
		||||
      {
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
   T x ;
 | 
			
		||||
} ;
 | 
			
		||||
      wrapper(T const & arg)
 | 
			
		||||
      :
 | 
			
		||||
      data(arg)
 | 
			
		||||
      {
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct non_const_T_base
 | 
			
		||||
{
 | 
			
		||||
  protected :
 | 
			
		||||
    mutable
 | 
			
		||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
 | 
			
		||||
      typename
 | 
			
		||||
#endif 
 | 
			
		||||
      aligned_storage<sizeof(wrapper), alignment_of<wrapper>::value>::type x;
 | 
			
		||||
 | 
			
		||||
   non_const_T_base() : x() {}
 | 
			
		||||
    wrapper * wrapper_address() const
 | 
			
		||||
    {
 | 
			
		||||
      return static_cast<wrapper *>( static_cast<void*>(&x));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   mutable T x ;
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct select_base
 | 
			
		||||
{
 | 
			
		||||
  typedef typename
 | 
			
		||||
    detail::if_true< ::boost::is_const<T>::value >
 | 
			
		||||
      ::template then< const_T_base<T>, non_const_T_base<T> >::type type ;
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
} // namespace vinit_detail
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
class value_initialized : private vinit_detail::select_base<T>::type
 | 
			
		||||
{
 | 
			
		||||
  public :
 | 
			
		||||
 | 
			
		||||
    value_initialized() {}
 | 
			
		||||
    initialized()
 | 
			
		||||
    {
 | 
			
		||||
#if BOOST_DETAIL_VALUE_INIT_WORKAROUND
 | 
			
		||||
      std::memset(&x, 0, sizeof(x));
 | 
			
		||||
#endif
 | 
			
		||||
      new (wrapper_address()) wrapper();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator T&() const { return this->x ; }
 | 
			
		||||
    initialized(initialized const & arg)
 | 
			
		||||
    {
 | 
			
		||||
      new (wrapper_address()) wrapper( static_cast<wrapper const &>(*(arg.wrapper_address())));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T& data() const { return this->x ; }
 | 
			
		||||
    explicit initialized(T const & arg)
 | 
			
		||||
    {
 | 
			
		||||
      new (wrapper_address()) wrapper(arg);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    initialized & operator=(initialized const & arg)
 | 
			
		||||
    {
 | 
			
		||||
      // Assignment is only allowed when T is non-const.
 | 
			
		||||
      BOOST_STATIC_ASSERT( ! is_const<T>::value );
 | 
			
		||||
      *wrapper_address() = static_cast<wrapper const &>(*(arg.wrapper_address()));
 | 
			
		||||
      return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~initialized()
 | 
			
		||||
    {
 | 
			
		||||
      wrapper_address()->wrapper::~wrapper();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T const & data() const
 | 
			
		||||
    {
 | 
			
		||||
      return wrapper_address()->data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T& data()
 | 
			
		||||
    {
 | 
			
		||||
      return wrapper_address()->data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(initialized & arg)
 | 
			
		||||
    {
 | 
			
		||||
      ::boost::swap( this->data(), arg.data() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator T const &() const
 | 
			
		||||
    {
 | 
			
		||||
      return wrapper_address()->data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator T&()
 | 
			
		||||
    {
 | 
			
		||||
      return wrapper_address()->data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
T const& get ( initialized<T> const& x )
 | 
			
		||||
{
 | 
			
		||||
  return x.data() ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
T& get ( initialized<T>& x )
 | 
			
		||||
{
 | 
			
		||||
  return x.data() ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
void swap ( initialized<T> & lhs, initialized<T> & rhs )
 | 
			
		||||
{
 | 
			
		||||
  lhs.swap(rhs) ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
class value_initialized
 | 
			
		||||
{
 | 
			
		||||
  private :
 | 
			
		||||
 | 
			
		||||
    // initialized<T> does value-initialization by default.
 | 
			
		||||
    initialized<T> m_data;
 | 
			
		||||
 | 
			
		||||
  public :
 | 
			
		||||
    
 | 
			
		||||
    value_initialized()
 | 
			
		||||
    :
 | 
			
		||||
    m_data()
 | 
			
		||||
    { }
 | 
			
		||||
    
 | 
			
		||||
    T const & data() const
 | 
			
		||||
    {
 | 
			
		||||
      return m_data.data();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T& data()
 | 
			
		||||
    {
 | 
			
		||||
      return m_data.data();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(value_initialized & arg)
 | 
			
		||||
    {
 | 
			
		||||
      m_data.swap(arg.m_data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator T const &() const
 | 
			
		||||
    {
 | 
			
		||||
      return m_data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator T&()
 | 
			
		||||
    {
 | 
			
		||||
      return m_data;
 | 
			
		||||
    }
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
T const& get ( value_initialized<T> const& x )
 | 
			
		||||
{
 | 
			
		||||
  return x.data() ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
T& get ( value_initialized<T>& x )
 | 
			
		||||
{
 | 
			
		||||
  return x.data() ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
void swap ( value_initialized<T> & lhs, value_initialized<T> & rhs )
 | 
			
		||||
{
 | 
			
		||||
  lhs.swap(rhs) ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class initialized_value_t
 | 
			
		||||
{
 | 
			
		||||
  public :
 | 
			
		||||
    
 | 
			
		||||
    template <class T> operator T() const
 | 
			
		||||
    {
 | 
			
		||||
      return initialized<T>().data();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
initialized_value_t const initialized_value = {} ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
#pragma warning(pop)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +0,0 @@
 | 
			
		||||
//  Boost utility_fwd.hpp header file  ---------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright 2001, 2003 Boost.org.  Use, modification, and distribution are
 | 
			
		||||
//  subject to the Boost Software License, Version 1.0.  (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)
 | 
			
		||||
 | 
			
		||||
//  See <http://www.boost.org/libs/utility/> for the library's home page.
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_UTILITY_FWD_HPP
 | 
			
		||||
#define BOOST_UTILITY_FWD_HPP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  From <boost/utility/base_from_member.hpp>  -------------------------------//
 | 
			
		||||
 | 
			
		||||
template < typename MemberType, int UniqueID = 0 >
 | 
			
		||||
    class base_from_member;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  From <boost/noncopyable.hpp>  --------------------------------------------//
 | 
			
		||||
 | 
			
		||||
class noncopyable;
 | 
			
		||||
 | 
			
		||||
// Also has a few function templates
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}  // namespace boost
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif  // BOOST_UTILITY_FWD_HPP
 | 
			
		||||
							
								
								
									
										20
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								index.html
									
									
									
									
									
								
							@@ -7,7 +7,7 @@
 | 
			
		||||
		<title>Boost Utility Library</title>
 | 
			
		||||
	</head>
 | 
			
		||||
	<body bgcolor="#FFFFFF">
 | 
			
		||||
		<h1><IMG SRC="../../c++boost.gif" WIDTH="276" HEIGHT="86" align="center">Boost 
 | 
			
		||||
		<h1><IMG SRC="../../boost.png" WIDTH="276" HEIGHT="86" align="center">Boost 
 | 
			
		||||
			Utility Library</h1>
 | 
			
		||||
		<p>The Boost Utility Library isn't really a single library at all. It is just a 
 | 
			
		||||
			collection for components too small to be called libraries in their own right.</p>
 | 
			
		||||
@@ -19,16 +19,26 @@
 | 
			
		||||
				<a href="call_traits.htm">call_traits</a><br>
 | 
			
		||||
				<a href="checked_delete.html">checked_delete</a><br>
 | 
			
		||||
				<a href="compressed_pair.htm">compressed_pair</a><br>
 | 
			
		||||
				<a href="current_function.html">current_function</a><br>
 | 
			
		||||
				<a href="doc/html/declval.html">declval</a><br>
 | 
			
		||||
				<a href="enable_if.html">enable_if</a><br>
 | 
			
		||||
                <a href="iterator_adaptors.htm">iterator_adaptors</a><br>
 | 
			
		||||
            <a href="iterator_adaptors.htm">iterator_adaptors</a><br>
 | 
			
		||||
            <a href="generator_iterator.htm">generator iterator adaptors</a><br>
 | 
			
		||||
				<a href="operators.htm">operators</a><br>
 | 
			
		||||
				<a href="swap.html">swap</a><br>
 | 
			
		||||
				<a href="throw_exception.html">throw_exception</a><br>
 | 
			
		||||
				<a href="utility.htm">utility</a><br>
 | 
			
		||||
                <a href="value_init.htm">value_init</a></p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<hr>
 | 
			
		||||
		<p>© Copyright Beman Dawes, 2001</p>
 | 
			
		||||
        <p>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">
 | 
			
		||||
        www.boost.org/LICENSE_1_0.txt</a>)</p>
 | 
			
		||||
		<p>Revised 
 | 
			
		||||
			<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->01 September, 2003<!--webbot bot="Timestamp" endspan i-checksum="38582" --></p>
 | 
			
		||||
		<p> </p>
 | 
			
		||||
	</body>
 | 
			
		||||
			<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->07 November, 2006<!--webbot bot="Timestamp" endspan i-checksum="39368" --></p>
 | 
			
		||||
		</body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,444 +0,0 @@
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
 | 
			
		||||
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
    <meta name="generator" content="HTML Tidy, see www.w3.org">
 | 
			
		||||
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 | 
			
		||||
    <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
 | 
			
		||||
    <meta name="ProgId" content="FrontPage.Editor.Document">
 | 
			
		||||
 | 
			
		||||
    <title>Indirect Iterator Adaptor Documentation</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
	
 | 
			
		||||
    <img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align=
 | 
			
		||||
    "center" width="277" height="86"> 
 | 
			
		||||
 | 
			
		||||
    <h1>Indirect Iterator Adaptor</h1>
 | 
			
		||||
    Defined in header <a href=
 | 
			
		||||
    "../../boost/iterator_adaptors.hpp">boost/iterator_adaptors.hpp</a> 
 | 
			
		||||
 | 
			
		||||
    <p>The indirect iterator adaptor augments an iterator by applying an
 | 
			
		||||
    <b>extra</b> dereference inside of <tt>operator*()</tt>. For example, this
 | 
			
		||||
    iterator makes it possible to view a container of pointers or
 | 
			
		||||
    smart-pointers (e.g. <tt>std::list<boost::shared_ptr<foo>
 | 
			
		||||
    ></tt>) as if it were a container of the pointed-to type. The following
 | 
			
		||||
    <b>pseudo-code</b> shows the basic idea of the indirect iterator:
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
// inside a hypothetical indirect_iterator class...
 | 
			
		||||
typedef std::iterator_traits<BaseIterator>::value_type Pointer;
 | 
			
		||||
typedef std::iterator_traits<Pointer>::reference reference;
 | 
			
		||||
 | 
			
		||||
reference indirect_iterator::operator*() const {
 | 
			
		||||
  return **this->base_iterator;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h2>Synopsis</h2>
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
namespace boost {
 | 
			
		||||
  template <class BaseIterator,
 | 
			
		||||
            class Value, class Reference, class Category, class Pointer>
 | 
			
		||||
  struct indirect_iterator_generator;
 | 
			
		||||
  
 | 
			
		||||
  template <class BaseIterator,
 | 
			
		||||
            class Value, class Reference, class ConstReference, 
 | 
			
		||||
            class Category, class Pointer, class ConstPointer>
 | 
			
		||||
  struct indirect_iterator_pair_generator;
 | 
			
		||||
 | 
			
		||||
  template <class BaseIterator>
 | 
			
		||||
  typename indirect_iterator_generator<BaseIterator>::type
 | 
			
		||||
  make_indirect_iterator(BaseIterator base)  
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="indirect_iterator_generator">The Indirect Iterator Type
 | 
			
		||||
    Generator</a></h2>
 | 
			
		||||
    The <tt>indirect_iterator_generator</tt> template is a <a href=
 | 
			
		||||
    "../../more/generic_programming.html#type_generator">generator</a> of
 | 
			
		||||
    indirect iterator types. The main template parameter for this class is the
 | 
			
		||||
    <tt>BaseIterator</tt> type that is being wrapped. In most cases the type of
 | 
			
		||||
    the elements being pointed to can be deduced using
 | 
			
		||||
    <tt>std::iterator_traits</tt>, but in some situations the user may want to
 | 
			
		||||
    override this type, so there are also template parameters that allow a user
 | 
			
		||||
    to control the <tt>value_type</tt>, <tt>pointer</tt>, and
 | 
			
		||||
    <tt>reference</tt> types of the resulting iterators. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
template <class BaseIterator,
 | 
			
		||||
          class Value, class Reference, class Pointer>
 | 
			
		||||
class indirect_iterator_generator
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  typedef <tt><a href=
 | 
			
		||||
"./iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...></tt> type; // the resulting indirect iterator type 
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h3>Example</h3>
 | 
			
		||||
    This example uses the <tt>indirect_iterator_generator</tt> to create
 | 
			
		||||
    indirect iterators which dereference the pointers stored in the
 | 
			
		||||
    <tt>pointers_to_chars</tt> array to access the <tt>char</tt>s in the
 | 
			
		||||
    <tt>characters</tt> array. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <boost/iterator_adaptors.hpp>
 | 
			
		||||
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  char characters[] = "abcdefg";
 | 
			
		||||
  const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char
 | 
			
		||||
  char* pointers_to_chars[N];                        // at the end.
 | 
			
		||||
  for (int i = 0; i < N; ++i)
 | 
			
		||||
    pointers_to_chars[i] = &characters[i];
 | 
			
		||||
  
 | 
			
		||||
  boost::indirect_iterator_generator<char**, char>::type 
 | 
			
		||||
    indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N);
 | 
			
		||||
 | 
			
		||||
  std::copy(indirect_first, indirect_last, std::ostream_iterator<char>(std::cout, ","));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  
 | 
			
		||||
  // to be continued...
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
    <table border>
 | 
			
		||||
      <tr>
 | 
			
		||||
        <th>Parameter
 | 
			
		||||
 | 
			
		||||
        <th>Description
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>BaseIterator</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The iterator type being wrapped. The <tt>value_type</tt>
 | 
			
		||||
        of the base iterator should itself be dereferenceable.  
 | 
			
		||||
        The return type of the <tt>operator*</tt> for the
 | 
			
		||||
        <tt>value_type</tt> should match the <tt>Reference</tt> type.
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Value</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>value_type</tt> of the resulting iterator, unless const. If
 | 
			
		||||
        Value is <tt>const X</tt>, a conforming compiler makes the
 | 
			
		||||
        <tt>value_type</tt> <tt><i>non-</i>const X</tt><a href=
 | 
			
		||||
        "iterator_adaptors.htm#1">[1]</a>. Note that if the default
 | 
			
		||||
         is used for <tt>Value</tt>, then there must be a valid specialization
 | 
			
		||||
         of <tt>iterator_traits</tt> for the value type of the base iterator.
 | 
			
		||||
         <br>
 | 
			
		||||
         <b>Default:</b> <tt>std::iterator_traits<<br>
 | 
			
		||||
         <20> std::iterator_traits<BaseIterator>::value_type
 | 
			
		||||
        >::value_type</tt><a href="#2">[2]</a> 
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Reference</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>reference</tt> type of the resulting iterator, and in
 | 
			
		||||
        particular, the result type of <tt>operator*()</tt>.<br>
 | 
			
		||||
         <b>Default:</b> <tt>Value&</tt> 
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Pointer</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>pointer</tt> type of the resulting iterator, and in
 | 
			
		||||
        particular, the result type of <tt>operator->()</tt>.<br>
 | 
			
		||||
         <b>Default:</b> <tt>Value*</tt> 
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Category</tt> 
 | 
			
		||||
        <td>The <tt>iterator_category</tt> type for the resulting iterator.<br>
 | 
			
		||||
         <b>Default:</b>
 | 
			
		||||
        <tt>std::iterator_traits<BaseIterator>::iterator_category</tt> 
 | 
			
		||||
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3>Concept Model</h3>
 | 
			
		||||
    The indirect iterator will model whichever <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/Iterators.html">standard iterator
 | 
			
		||||
    concept category</a> is modeled by the base iterator. Thus, if the
 | 
			
		||||
    base iterator is a model of <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
    Access Iterator</a> then so is the resulting indirect iterator. If
 | 
			
		||||
    the base iterator models a more restrictive concept, the resulting
 | 
			
		||||
    indirect iterator will model the same concept <a href="#3">[3]</a>.
 | 
			
		||||
 | 
			
		||||
    <h3>Members</h3>
 | 
			
		||||
    The indirect iterator type implements the member functions and operators
 | 
			
		||||
    required of the <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random Access
 | 
			
		||||
    Iterator</a> concept. In addition it has the following constructor: 
 | 
			
		||||
<pre>
 | 
			
		||||
explicit indirect_iterator_generator::type(const BaseIterator& it)
 | 
			
		||||
</pre>
 | 
			
		||||
    <br>
 | 
			
		||||
     <br>
 | 
			
		||||
     
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="indirect_iterator_pair_generator">The Indirect Iterator Pair
 | 
			
		||||
    Generator</a></h2>
 | 
			
		||||
    Sometimes a pair of <tt>const</tt>/non-<tt>const</tt> pair of iterators is
 | 
			
		||||
    needed, such as when implementing a container. The
 | 
			
		||||
    <tt>indirect_iterator_pair_generator</tt> class makes it more convenient to
 | 
			
		||||
    create this pair of iterator types. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
  template <class BaseIterator,
 | 
			
		||||
            class Value, class Reference, class ConstReference, 
 | 
			
		||||
            class Category, class Pointer, class ConstPointer>
 | 
			
		||||
  struct indirect_iterator_pair_generator;
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  typedef <tt><a href=
 | 
			
		||||
"./iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...></tt> iterator;       // the mutable indirect iterator type 
 | 
			
		||||
  typedef <tt><a href=
 | 
			
		||||
"./iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...></tt> const_iterator; // the immutable indirect iterator type 
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
  // continuing from the last example...
 | 
			
		||||
 | 
			
		||||
  typedef boost::indirect_iterator_pair_generator<char**,
 | 
			
		||||
    char, char*, char&, const char*, const char&> PairGen;
 | 
			
		||||
 | 
			
		||||
  char mutable_characters[N];
 | 
			
		||||
  char* pointers_to_mutable_chars[N];
 | 
			
		||||
  for (int i = 0; i < N; ++i)
 | 
			
		||||
    pointers_to_mutable_chars[i] = &mutable_characters[i];
 | 
			
		||||
 | 
			
		||||
  PairGen::iterator mutable_indirect_first(pointers_to_mutable_chars),
 | 
			
		||||
    mutable_indirect_last(pointers_to_mutable_chars + N);
 | 
			
		||||
  PairGen::const_iterator const_indirect_first(pointers_to_chars),
 | 
			
		||||
    const_indirect_last(pointers_to_chars + N);
 | 
			
		||||
 | 
			
		||||
  std::transform(const_indirect_first, const_indirect_last,
 | 
			
		||||
     mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
 | 
			
		||||
 | 
			
		||||
  std::copy(mutable_indirect_first, mutable_indirect_last,
 | 
			
		||||
      std::ostream_iterator<char>(std::cout, ","));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  // to be continued...
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <p>The output is:
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
b,c,d,e,f,g,h,
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
    <table border>
 | 
			
		||||
      <tr>
 | 
			
		||||
        <th>Parameter
 | 
			
		||||
 | 
			
		||||
        <th>Description
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>BaseIterator</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The iterator type being wrapped. The <tt>value_type</tt> of the
 | 
			
		||||
        base iterator should itself be dereferenceable.
 | 
			
		||||
        The return type of the <tt>operator*</tt> for the
 | 
			
		||||
        <tt>value_type</tt> should match the <tt>Reference</tt> type.
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Value</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>value_type</tt> of the resulting iterators.
 | 
			
		||||
         If Value is <tt>const X</tt>, a conforming compiler makes the
 | 
			
		||||
         <tt>value_type</tt> <tt><i>non-</i>const X</tt><a href=
 | 
			
		||||
         "iterator_adaptors.htm#1">[1]</a>. Note that if the default
 | 
			
		||||
         is used for <tt>Value</tt>, then there must be a valid
 | 
			
		||||
         specialization of <tt>iterator_traits</tt> for the value type
 | 
			
		||||
         of the base iterator.<br>
 | 
			
		||||
 | 
			
		||||
         <b>Default:</b> <tt>std::iterator_traits<<br>
 | 
			
		||||
         <20> std::iterator_traits<BaseIterator>::value_type
 | 
			
		||||
        >::value_type</tt><a href="#2">[2]</a> 
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Reference</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>reference</tt> type of the resulting <tt>iterator</tt>, and
 | 
			
		||||
        in particular, the result type of its <tt>operator*()</tt>.<br>
 | 
			
		||||
         <b>Default:</b> <tt>Value&</tt> 
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>ConstReference</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>reference</tt> type of the resulting
 | 
			
		||||
        <tt>const_iterator</tt>, and in particular, the result type of its
 | 
			
		||||
        <tt>operator*()</tt>.<br>
 | 
			
		||||
         <b>Default:</b> <tt>const Value&</tt> 
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Category</tt> 
 | 
			
		||||
        <td>The <tt>iterator_category</tt> type for the resulting iterator.<br>
 | 
			
		||||
         <b>Default:</b>
 | 
			
		||||
        <tt>std::iterator_traits<BaseIterator>::iterator_category</tt> 
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Pointer</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>pointer</tt> type of the resulting <tt>iterator</tt>, and
 | 
			
		||||
        in particular, the result type of its <tt>operator->()</tt>.<br>
 | 
			
		||||
         <b>Default:</b> <tt>Value*</tt> 
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>ConstPointer</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>pointer</tt> type of the resulting <tt>const_iterator</tt>,
 | 
			
		||||
        and in particular, the result type of its <tt>operator->()</tt>.<br>
 | 
			
		||||
         <b>Default:</b> <tt>const Value*</tt> 
 | 
			
		||||
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3>Concept Model</h3>
 | 
			
		||||
 | 
			
		||||
    The indirect iterators will model whichever <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/Iterators.html">standard iterator
 | 
			
		||||
    concept category</a> is modeled by the base iterator. Thus, if the
 | 
			
		||||
    base iterator is a model of <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
    Access Iterator</a> then so are the resulting indirect
 | 
			
		||||
    iterators. If the base iterator models a more restrictive concept,
 | 
			
		||||
    the resulting indirect iterators will model the same concept <a
 | 
			
		||||
    href="#3">[3]</a>.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3>Members</h3>
 | 
			
		||||
    The resulting <tt>iterator</tt> and <tt>const_iterator</tt> types implement
 | 
			
		||||
    the member functions and operators required of the <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random Access
 | 
			
		||||
    Iterator</a> concept. In addition they support the following constructors: 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
explicit indirect_iterator_pair_generator::iterator(const BaseIterator& it)
 | 
			
		||||
explicit indirect_iterator_pair_generator::const_iterator(const BaseIterator& it)
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <br>
 | 
			
		||||
     <br>
 | 
			
		||||
     
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="make_indirect_iterator">The Indirect Iterator Object
 | 
			
		||||
    Generator</a></h2>
 | 
			
		||||
    The <tt>make_indirect_iterator()</tt> function provides a more convenient
 | 
			
		||||
    way to create indirect iterator objects. The function saves the user the
 | 
			
		||||
    trouble of explicitly writing out the iterator types. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
template <class BaseIterator>
 | 
			
		||||
typename indirect_iterator_generator<BaseIterator>::type
 | 
			
		||||
make_indirect_iterator(BaseIterator base)  
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h3>Example</h3>
 | 
			
		||||
    Here we again print the <tt>char</tt>s from the array <tt>characters</tt>
 | 
			
		||||
    by accessing them through the array of pointers <tt>pointer_to_chars</tt>,
 | 
			
		||||
    but this time we use the <tt>make_indirect_iterator()</tt> function which
 | 
			
		||||
    saves us some typing. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
  // continuing from the last example...
 | 
			
		||||
 | 
			
		||||
  std::copy(boost::make_indirect_iterator(pointers_to_chars), 
 | 
			
		||||
      boost::make_indirect_iterator(pointers_to_chars + N),
 | 
			
		||||
      std::ostream_iterator<char>(std::cout, ","));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    The output is: 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
a,b,c,d,e,f,g,
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <h3>Notes</h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
 | 
			
		||||
    <p><a name="2">[2]</a> If your compiler does not support partial
 | 
			
		||||
    specialization and the base iterator or its <tt>value_type</tt> is a
 | 
			
		||||
    builtin pointer type, you will not be able to use the default for
 | 
			
		||||
    <tt>Value</tt> and will need to specify this type explicitly.
 | 
			
		||||
 | 
			
		||||
    <p><a name="3">[3]</a>There is a caveat to which concept the
 | 
			
		||||
    indirect iterator can model.  If the return type of the
 | 
			
		||||
    <tt>operator*</tt> for the base iterator's value type is not a
 | 
			
		||||
    true reference, then strickly speaking, the indirect iterator can
 | 
			
		||||
    not be a model of <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/ForwardIterator.html">Forward
 | 
			
		||||
    Iterator</a> or any of the concepts that refine it. In this case
 | 
			
		||||
    the <tt>Category</tt> for the indirect iterator should be
 | 
			
		||||
    specified as <tt>std::input_iterator_tag</tt>. However, even in
 | 
			
		||||
    this case, if the base iterator is a random access iterator, the
 | 
			
		||||
    resulting indirect iterator will still satisfy most of the
 | 
			
		||||
    requirements for <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
    Access Iterator</a>.
 | 
			
		||||
    
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <p>Revised 
 | 
			
		||||
    <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan -->18 Sep 2001<!--webbot bot="Timestamp" endspan i-checksum="14941" -->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <p>© Copyright Jeremy Siek and David Abrahams 2001. Permission to
 | 
			
		||||
    copy, use, modify, sell and distribute this document is granted provided
 | 
			
		||||
    this copyright notice appears in all copies. This document is provided "as
 | 
			
		||||
    is" without express or implied warranty, and with no claim as to its
 | 
			
		||||
    suitability for any purpose. 
 | 
			
		||||
    <!--  LocalWords:  html charset alt gif hpp BaseIterator const namespace struct
 | 
			
		||||
             -->
 | 
			
		||||
     
 | 
			
		||||
    <!--  LocalWords:  ConstPointer ConstReference typename iostream int abcdefg
 | 
			
		||||
             -->
 | 
			
		||||
     <!--  LocalWords:  sizeof  PairGen pre Jeremy Siek David Abrahams
 | 
			
		||||
             -->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,59 +0,0 @@
 | 
			
		||||
// (C) Copyright Jeremy Siek 2000. 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.
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <boost/iterator/indirect_iterator.hpp>
 | 
			
		||||
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  char characters[] = "abcdefg";
 | 
			
		||||
  const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char
 | 
			
		||||
  char* pointers_to_chars[N];                        // at the end.
 | 
			
		||||
  for (int i = 0; i < N; ++i)
 | 
			
		||||
    pointers_to_chars[i] = &characters[i];
 | 
			
		||||
 | 
			
		||||
  // Example of using indirect_iterator_generator
 | 
			
		||||
  
 | 
			
		||||
  boost::indirect_iterator<char**, char>
 | 
			
		||||
    indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N);
 | 
			
		||||
 | 
			
		||||
  std::copy(indirect_first, indirect_last, std::ostream_iterator<char>(std::cout, ","));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  // Example of using indirect_iterator_pair_generator
 | 
			
		||||
 | 
			
		||||
  char mutable_characters[N];
 | 
			
		||||
  char* pointers_to_mutable_chars[N];
 | 
			
		||||
  for (int j = 0; j < N; ++j)
 | 
			
		||||
    pointers_to_mutable_chars[j] = &mutable_characters[j];
 | 
			
		||||
 | 
			
		||||
  boost::indirect_iterator<char* const*> mutable_indirect_first(pointers_to_mutable_chars),
 | 
			
		||||
    mutable_indirect_last(pointers_to_mutable_chars + N);
 | 
			
		||||
  boost::indirect_iterator<char* const*, char const> const_indirect_first(pointers_to_chars),
 | 
			
		||||
    const_indirect_last(pointers_to_chars + N);
 | 
			
		||||
 | 
			
		||||
  std::transform(const_indirect_first, const_indirect_last,
 | 
			
		||||
                 mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
 | 
			
		||||
 | 
			
		||||
  std::copy(mutable_indirect_first, mutable_indirect_last,
 | 
			
		||||
            std::ostream_iterator<char>(std::cout, ","));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  // Example of using make_indirect_iterator()
 | 
			
		||||
 | 
			
		||||
  std::copy(boost::make_indirect_iterator(pointers_to_chars), 
 | 
			
		||||
            boost::make_indirect_iterator(pointers_to_chars + N),
 | 
			
		||||
            std::ostream_iterator<char>(std::cout, ","));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										116
									
								
								initialized_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								initialized_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
// Copyright 2010, Niels Dekker.
 | 
			
		||||
//
 | 
			
		||||
// 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)
 | 
			
		||||
//
 | 
			
		||||
// Test program for boost::initialized<T>.
 | 
			
		||||
//
 | 
			
		||||
// 2 May 2010 (Created) Niels Dekker
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/value_init.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_test.hpp>
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
  // Typical use case for boost::initialized<T>: A generic class that 
 | 
			
		||||
  // holds a value of type T, which must be initialized by either 
 | 
			
		||||
  // value-initialization or direct-initialization.
 | 
			
		||||
  template <class T> class key_value_pair
 | 
			
		||||
  {
 | 
			
		||||
    std::string m_key;
 | 
			
		||||
    boost::initialized<T> m_value;
 | 
			
		||||
  public:
 | 
			
		||||
 
 | 
			
		||||
    // Value-initializes the object held by m_value.
 | 
			
		||||
    key_value_pair() { }
 | 
			
		||||
 | 
			
		||||
    // Value-initializes the object held by m_value.
 | 
			
		||||
    explicit key_value_pair(const std::string& key)
 | 
			
		||||
    :
 | 
			
		||||
    m_key(key)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Direct-initializes the object held by m_value.
 | 
			
		||||
    key_value_pair(const std::string& key, const T& value)
 | 
			
		||||
    :
 | 
			
		||||
    m_key(key), m_value(value)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const T& get_value() const
 | 
			
		||||
    {
 | 
			
		||||
      return m_value;
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Tells whether the argument is value-initialized.
 | 
			
		||||
  bool is_value_initialized(const int& arg)
 | 
			
		||||
  {
 | 
			
		||||
    return arg == 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Tells whether the argument is value-initialized.
 | 
			
		||||
  bool is_value_initialized(const std::string& arg)
 | 
			
		||||
  {
 | 
			
		||||
    return arg.empty();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  struct foo
 | 
			
		||||
  {
 | 
			
		||||
    int data;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  bool operator==(const foo& lhs, const foo& rhs)
 | 
			
		||||
  {
 | 
			
		||||
    return lhs.data == rhs.data;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Tells whether the argument is value-initialized.
 | 
			
		||||
  bool is_value_initialized(const foo& arg)
 | 
			
		||||
  {
 | 
			
		||||
    return arg.data == 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  template <class T>
 | 
			
		||||
  void test_key_value_pair(const T& magic_value)
 | 
			
		||||
  {
 | 
			
		||||
    // The value component of a default key_value_pair must be value-initialized.
 | 
			
		||||
    key_value_pair<T> default_key_value_pair;
 | 
			
		||||
    BOOST_TEST( is_value_initialized(default_key_value_pair.get_value() ) );
 | 
			
		||||
 | 
			
		||||
    // The value component of a key_value_pair that only has its key explicitly specified
 | 
			
		||||
    // must also be value-initialized.
 | 
			
		||||
    BOOST_TEST( is_value_initialized(key_value_pair<T>("key").get_value()) );
 | 
			
		||||
 | 
			
		||||
    // However, the value component of the following key_value_pair must be 
 | 
			
		||||
    // "magic_value", as it must be direct-initialized.
 | 
			
		||||
    BOOST_TEST( key_value_pair<T>("key", magic_value).get_value() == magic_value );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Tests boost::initialize for a fundamental type, a type with a
 | 
			
		||||
// user-defined constructor, and a user-defined type without 
 | 
			
		||||
// a user-defined constructor.
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  const int magic_number = 42;
 | 
			
		||||
  test_key_value_pair(magic_number);
 | 
			
		||||
 | 
			
		||||
  const std::string magic_string = "magic value";
 | 
			
		||||
  test_key_value_pair(magic_string);
 | 
			
		||||
 | 
			
		||||
  const foo magic_foo = { 42 };
 | 
			
		||||
  test_key_value_pair(magic_foo);
 | 
			
		||||
 | 
			
		||||
  return boost::report_errors();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										33
									
								
								initialized_test_fail1.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								initialized_test_fail1.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
// Copyright 2010, Niels Dekker.
 | 
			
		||||
//
 | 
			
		||||
// 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)
 | 
			
		||||
//
 | 
			
		||||
// Test program for boost::initialized<T>. Must fail to compile.
 | 
			
		||||
//
 | 
			
		||||
// Initial: 2 May 2010
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/value_init.hpp>
 | 
			
		||||
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
  void direct_initialize_from_int()
 | 
			
		||||
  {
 | 
			
		||||
    // Okay: initialized<T> supports direct-initialization from T.
 | 
			
		||||
    boost::initialized<int> direct_initialized_int(1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void copy_initialize_from_int()
 | 
			
		||||
  {
 | 
			
		||||
    // The following line should not compile, because initialized<T> 
 | 
			
		||||
    // was not intended to supports copy-initialization from T.
 | 
			
		||||
    boost::initialized<int> copy_initialized_int = 1;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  // This should fail to compile, so there is no need to call any function.
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										37
									
								
								initialized_test_fail2.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								initialized_test_fail2.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
// Copyright 2010, Niels Dekker.
 | 
			
		||||
//
 | 
			
		||||
// 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)
 | 
			
		||||
//
 | 
			
		||||
// Test program for boost::initialized<T>. Must fail to compile.
 | 
			
		||||
//
 | 
			
		||||
// Initial: 2 May 2010
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/value_init.hpp>
 | 
			
		||||
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
  void from_value_initialized_to_initialized()
 | 
			
		||||
  {
 | 
			
		||||
    boost::value_initialized<int> value_initialized_int;
 | 
			
		||||
 | 
			
		||||
    // Okay: initialized<T> can be initialized by value_initialized<T>.
 | 
			
		||||
    boost::initialized<int> initialized_int(value_initialized_int);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void from_initialized_to_value_initialized()
 | 
			
		||||
  {
 | 
			
		||||
    boost::initialized<int> initialized_int(13);
 | 
			
		||||
 | 
			
		||||
    // The following line should not compile, because initialized<T>
 | 
			
		||||
    // should not be convertible to value_initialized<T>.
 | 
			
		||||
    boost::value_initialized<int> value_initialized_int(initialized_int);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  // This should fail to compile, so there is no need to call any function.
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,46 +0,0 @@
 | 
			
		||||
// (C) Copyright Jeremy Siek 2000. 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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <boost/iterator/transform_iterator.hpp>
 | 
			
		||||
#include <boost/pending/integer_range.hpp>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  // This is a simple example of using the transform_iterators class to
 | 
			
		||||
  // generate iterators that multiply the value returned by dereferencing
 | 
			
		||||
  // the iterator. In this case we are multiplying by 2.
 | 
			
		||||
  // Would be cooler to use lambda library in this example.
 | 
			
		||||
 | 
			
		||||
  int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
 | 
			
		||||
 | 
			
		||||
  typedef std::binder1st< std::multiplies<int> > Function;
 | 
			
		||||
  
 | 
			
		||||
  typedef boost::transform_iterator<Function, int*> doubling_iterator;
 | 
			
		||||
 | 
			
		||||
  doubling_iterator i(x, std::bind1st(std::multiplies<int>(), 2)),
 | 
			
		||||
    i_end(x + sizeof(x)/sizeof(int), std::bind1st(std::multiplies<int>(), 2));
 | 
			
		||||
 | 
			
		||||
  std::cout << "multiplying the array by 2:" << std::endl;
 | 
			
		||||
  while (i != i_end)
 | 
			
		||||
    std::cout << *i++ << " ";
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // Here is an example of counting from 0 to 5 using the integer_range class.
 | 
			
		||||
 | 
			
		||||
  boost::integer_range<int> r(0,5);
 | 
			
		||||
 | 
			
		||||
  std::cout << "counting to from 0 to 4:" << std::endl;
 | 
			
		||||
  std::copy(r.begin(), r.end(), std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -1,215 +0,0 @@
 | 
			
		||||
//  (C) Copyright David Abrahams 2002. 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.
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org for most recent version including documentation.
 | 
			
		||||
 | 
			
		||||
//  Revision History
 | 
			
		||||
//  04 Mar 2001 Patches for Intel C++ (Dave Abrahams)
 | 
			
		||||
//  19 Feb 2001 Take advantage of improved iterator_traits to do more tests
 | 
			
		||||
//              on MSVC. Reordered some #ifdefs for coherency.
 | 
			
		||||
//              (David Abrahams)
 | 
			
		||||
//  13 Feb 2001 Test new VC6 workarounds (David Abrahams)
 | 
			
		||||
//  11 Feb 2001 Final fixes for Borland (David Abrahams)
 | 
			
		||||
//  11 Feb 2001 Some fixes for Borland get it closer on that compiler
 | 
			
		||||
//              (David Abrahams)
 | 
			
		||||
//  07 Feb 2001 More comprehensive testing; factored out static tests for
 | 
			
		||||
//              better reuse (David Abrahams)
 | 
			
		||||
//  21 Jan 2001 Quick fix to my_iterator, which wasn't returning a
 | 
			
		||||
//              reference type from operator* (David Abrahams)
 | 
			
		||||
//  19 Jan 2001 Initial version with iterator operators (David Abrahams)
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/iterator.hpp>
 | 
			
		||||
#include <boost/type_traits/is_same.hpp>
 | 
			
		||||
#include <boost/operators.hpp>
 | 
			
		||||
#include <boost/static_assert.hpp>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <list>
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
// A UDT for which we can specialize std::iterator_traits<element*> on
 | 
			
		||||
// compilers which don't support partial specialization. There's no
 | 
			
		||||
// other reasonable way to test pointers on those compilers.
 | 
			
		||||
struct element {};
 | 
			
		||||
 | 
			
		||||
// An iterator for which we can get traits.
 | 
			
		||||
struct my_iterator1
 | 
			
		||||
    : boost::forward_iterator_helper<my_iterator1, char, long, const char*, const char&>
 | 
			
		||||
{
 | 
			
		||||
    my_iterator1(const char* p) : m_p(p) {}
 | 
			
		||||
    
 | 
			
		||||
    bool operator==(const my_iterator1& rhs) const
 | 
			
		||||
        { return this->m_p == rhs.m_p; }
 | 
			
		||||
 | 
			
		||||
    my_iterator1& operator++() { ++this->m_p; return *this; }
 | 
			
		||||
    const char& operator*() { return *m_p; }
 | 
			
		||||
 private:
 | 
			
		||||
    const char* m_p;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Used to prove that we don't require std::iterator<> in the hierarchy under
 | 
			
		||||
// MSVC6, and that we can compute all the traits for a standard-conforming UDT
 | 
			
		||||
// iterator.
 | 
			
		||||
struct my_iterator2
 | 
			
		||||
    : boost::equality_comparable<my_iterator2
 | 
			
		||||
    , boost::incrementable<my_iterator2
 | 
			
		||||
    , boost::dereferenceable<my_iterator2,const char*> > >
 | 
			
		||||
{
 | 
			
		||||
    typedef char value_type;
 | 
			
		||||
    typedef long difference_type;
 | 
			
		||||
    typedef const char* pointer;
 | 
			
		||||
    typedef const char& reference;
 | 
			
		||||
    typedef std::forward_iterator_tag iterator_category;
 | 
			
		||||
    
 | 
			
		||||
    my_iterator2(const char* p) : m_p(p) {}
 | 
			
		||||
    
 | 
			
		||||
    bool operator==(const my_iterator2& rhs) const
 | 
			
		||||
        { return this->m_p == rhs.m_p; }
 | 
			
		||||
 | 
			
		||||
    my_iterator2& operator++() { ++this->m_p; return *this; }
 | 
			
		||||
    const char& operator*() { return *m_p; }
 | 
			
		||||
 private:
 | 
			
		||||
    const char* m_p;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Used to prove that we're not overly confused by the existence of
 | 
			
		||||
// std::iterator<> in the hierarchy under MSVC6 - we should find that
 | 
			
		||||
// boost::detail::iterator_traits<my_iterator3>::difference_type is int.
 | 
			
		||||
struct my_iterator3 : my_iterator1
 | 
			
		||||
{
 | 
			
		||||
    typedef int difference_type;
 | 
			
		||||
    my_iterator3(const char* p)
 | 
			
		||||
        : my_iterator1(p) {}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Assertion tools.  Used instead of BOOST_STATIC_ASSERT because that
 | 
			
		||||
// doesn't give us a nice stack backtrace
 | 
			
		||||
//
 | 
			
		||||
template <bool = false> struct assertion;
 | 
			
		||||
 | 
			
		||||
template <> struct assertion<true>
 | 
			
		||||
{
 | 
			
		||||
    typedef char type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U>
 | 
			
		||||
struct assert_same
 | 
			
		||||
    : assertion<(::boost::is_same<T,U>::value)>
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Iterator tests
 | 
			
		||||
template <class Iterator,
 | 
			
		||||
    class value_type, class difference_type, class pointer, class reference, class category>
 | 
			
		||||
struct non_portable_tests
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::pointer test_pt;
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::reference test_rt;
 | 
			
		||||
    typedef typename assert_same<test_pt, pointer>::type a1;
 | 
			
		||||
    typedef typename assert_same<test_rt, reference>::type a2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class Iterator,
 | 
			
		||||
    class value_type, class difference_type, class pointer, class reference, class category>
 | 
			
		||||
struct portable_tests
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::difference_type test_dt;
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::iterator_category test_cat;
 | 
			
		||||
    typedef typename assert_same<test_dt, difference_type>::type a1;
 | 
			
		||||
    typedef typename assert_same<test_cat, category>::type a2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Test iterator_traits
 | 
			
		||||
template <class Iterator,
 | 
			
		||||
    class value_type, class difference_type, class pointer, class reference, class category>
 | 
			
		||||
struct input_iterator_test
 | 
			
		||||
    : portable_tests<Iterator,value_type,difference_type,pointer,reference,category>
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::value_type test_vt;
 | 
			
		||||
    typedef typename assert_same<test_vt, value_type>::type a1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class Iterator,
 | 
			
		||||
    class value_type, class difference_type, class pointer, class reference, class category>
 | 
			
		||||
struct non_pointer_test
 | 
			
		||||
    : input_iterator_test<Iterator,value_type,difference_type,pointer,reference,category>
 | 
			
		||||
      , non_portable_tests<Iterator,value_type,difference_type,pointer,reference,category>
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class Iterator,
 | 
			
		||||
    class value_type, class difference_type, class pointer, class reference, class category>
 | 
			
		||||
struct maybe_pointer_test
 | 
			
		||||
    : portable_tests<Iterator,value_type,difference_type,pointer,reference,category>
 | 
			
		||||
      , non_portable_tests<Iterator,value_type,difference_type,pointer,reference,category>
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
input_iterator_test<std::istream_iterator<int>, int, std::ptrdiff_t, int*, int&, std::input_iterator_tag>
 | 
			
		||||
        istream_iterator_test;
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && !defined(__SGI_STL_PORT)
 | 
			
		||||
typedef ::std::char_traits<char>::off_type distance;
 | 
			
		||||
non_pointer_test<std::ostream_iterator<int>,int,
 | 
			
		||||
    distance,int*,int&,std::output_iterator_tag> ostream_iterator_test;
 | 
			
		||||
#elif defined(BOOST_MSVC_STD_ITERATOR)
 | 
			
		||||
non_pointer_test<std::ostream_iterator<int>,
 | 
			
		||||
    int, void, int*, int&, std::output_iterator_tag>
 | 
			
		||||
        ostream_iterator_test;
 | 
			
		||||
#else
 | 
			
		||||
non_pointer_test<std::ostream_iterator<int>,
 | 
			
		||||
    void, void, void, void, std::output_iterator_tag>
 | 
			
		||||
        ostream_iterator_test;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __KCC
 | 
			
		||||
  typedef long std_list_diff_type;
 | 
			
		||||
#else
 | 
			
		||||
  typedef std::ptrdiff_t std_list_diff_type;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
non_pointer_test<std::list<int>::iterator, int, std_list_diff_type, int*, int&, std::bidirectional_iterator_tag>
 | 
			
		||||
        list_iterator_test;
 | 
			
		||||
 | 
			
		||||
maybe_pointer_test<std::vector<int>::iterator, int, std::ptrdiff_t, int*, int&, std::random_access_iterator_tag>
 | 
			
		||||
        vector_iterator_test;
 | 
			
		||||
 | 
			
		||||
maybe_pointer_test<int*, int, std::ptrdiff_t, int*, int&, std::random_access_iterator_tag>
 | 
			
		||||
        int_pointer_test;
 | 
			
		||||
 | 
			
		||||
non_pointer_test<my_iterator1, char, long, const char*, const char&, std::forward_iterator_tag>
 | 
			
		||||
       my_iterator1_test;
 | 
			
		||||
                    
 | 
			
		||||
non_pointer_test<my_iterator2, char, long, const char*, const char&, std::forward_iterator_tag>
 | 
			
		||||
       my_iterator2_test;
 | 
			
		||||
 | 
			
		||||
non_pointer_test<my_iterator3, char, int, const char*, const char&, std::forward_iterator_tag>
 | 
			
		||||
       my_iterator3_test;
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    char chars[100];
 | 
			
		||||
    int ints[100];
 | 
			
		||||
 | 
			
		||||
    for (int length = 3; length < 100; length += length / 3)
 | 
			
		||||
    {
 | 
			
		||||
        std::list<int> l(length);
 | 
			
		||||
        assert(boost::detail::distance(l.begin(), l.end()) == length);
 | 
			
		||||
        
 | 
			
		||||
        std::vector<int> v(length);
 | 
			
		||||
        assert(boost::detail::distance(v.begin(), v.end()) == length);
 | 
			
		||||
 | 
			
		||||
        assert(boost::detail::distance(&ints[0], ints + length) == length);
 | 
			
		||||
        assert(boost::detail::distance(my_iterator1(chars), my_iterator1(chars + length)) == length);
 | 
			
		||||
        assert(boost::detail::distance(my_iterator2(chars), my_iterator2(chars + length)) == length);
 | 
			
		||||
        assert(boost::detail::distance(my_iterator3(chars), my_iterator3(chars + length)) == length);
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +1,9 @@
 | 
			
		||||
//  Demonstrate and test boost/operators.hpp on std::iterators  --------------//
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Jeremy Siek 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.
 | 
			
		||||
//  (C) Copyright Jeremy Siek 1999.
 | 
			
		||||
// 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 for most recent version including documentation.
 | 
			
		||||
 | 
			
		||||
@@ -24,7 +23,7 @@
 | 
			
		||||
#include <cstring>    // for std::strcmp
 | 
			
		||||
#include <iostream>   // for std::cout (std::endl, ends, and flush indirectly)
 | 
			
		||||
#include <string>     // for std::string
 | 
			
		||||
#include <strstream>  // for std::ostrstream
 | 
			
		||||
#include <sstream>    // for std::stringstream
 | 
			
		||||
 | 
			
		||||
# ifdef BOOST_NO_STDC_NAMESPACE
 | 
			
		||||
    namespace std { using ::strcmp; }
 | 
			
		||||
@@ -65,20 +64,16 @@ class test_opr_base
 | 
			
		||||
protected:
 | 
			
		||||
    // Test data and types
 | 
			
		||||
    BOOST_STATIC_CONSTANT( std::size_t, fruit_length = 6u );
 | 
			
		||||
    BOOST_STATIC_CONSTANT( std::size_t, scratch_length = 40u );
 | 
			
		||||
 | 
			
		||||
    typedef std::string  fruit_array_type[ fruit_length ];
 | 
			
		||||
    typedef char         scratch_array_type[ scratch_length ];
 | 
			
		||||
 | 
			
		||||
    static  fruit_array_type    fruit;
 | 
			
		||||
    static  scratch_array_type  scratch;
 | 
			
		||||
 | 
			
		||||
};  // test_opr_base
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
 | 
			
		||||
//  A definition is required even for integral static constants
 | 
			
		||||
const std::size_t test_opr_base::fruit_length;
 | 
			
		||||
const std::size_t test_opr_base::scratch_length;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template <typename T, typename R = T&, typename P = T*>
 | 
			
		||||
@@ -120,9 +115,6 @@ private:
 | 
			
		||||
test_opr_base::fruit_array_type
 | 
			
		||||
 test_opr_base::fruit = { "apple", "orange", "pear", "peach", "grape", "plum" };
 | 
			
		||||
 | 
			
		||||
test_opr_base::scratch_array_type
 | 
			
		||||
 test_opr_base::scratch = "";
 | 
			
		||||
 | 
			
		||||
template <typename T, typename R, typename P>
 | 
			
		||||
  typename test_opr<T, R, P>::iter_type const
 | 
			
		||||
 test_opr<T, R, P>::fruit_begin = test_iter<T,R,P>( fruit );
 | 
			
		||||
@@ -176,15 +168,13 @@ test_opr<T, R, P>::post_increment_test
 | 
			
		||||
{
 | 
			
		||||
    std::cout << "\tDoing post-increment test." << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::ostrstream  oss( scratch, scratch_length );
 | 
			
		||||
    std::stringstream oss;
 | 
			
		||||
    for ( iter_type i = fruit_begin ; i != fruit_end ; )
 | 
			
		||||
    {
 | 
			
		||||
        oss << *i++ << ' ';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    oss << std::ends;
 | 
			
		||||
    BOOST_TEST( std::strcmp(oss.str(), "apple orange pear peach grape plum ")
 | 
			
		||||
     == 0 );
 | 
			
		||||
    BOOST_CHECK( oss.str() == "apple orange pear peach grape plum ");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test post-decrement
 | 
			
		||||
@@ -196,16 +186,14 @@ test_opr<T, R, P>::post_decrement_test
 | 
			
		||||
{
 | 
			
		||||
    std::cout << "\tDoing post-decrement test." << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::ostrstream  oss( scratch, scratch_length );
 | 
			
		||||
    std::stringstream oss;
 | 
			
		||||
    for ( iter_type i = fruit_end ; i != fruit_begin ; )
 | 
			
		||||
    {
 | 
			
		||||
        i--;
 | 
			
		||||
        oss << *i << ' ';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    oss << std::ends;
 | 
			
		||||
    BOOST_TEST( std::strcmp(oss.str(), "plum grape peach pear orange apple ")
 | 
			
		||||
     == 0 );
 | 
			
		||||
    BOOST_CHECK( oss.str() == "plum grape peach pear orange apple ");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test indirect structure referral
 | 
			
		||||
@@ -217,14 +205,13 @@ test_opr<T, R, P>::indirect_referral_test
 | 
			
		||||
{
 | 
			
		||||
    std::cout << "\tDoing indirect reference test." << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::ostrstream  oss( scratch, scratch_length );
 | 
			
		||||
    std::stringstream oss;
 | 
			
		||||
    for ( iter_type i = fruit_begin ; i != fruit_end ; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        oss << i->size() << ' ';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    oss << std::ends;
 | 
			
		||||
    BOOST_TEST( std::strcmp(oss.str(), "5 6 4 5 5 4 ") == 0 );
 | 
			
		||||
    BOOST_CHECK( oss.str() == "5 6 4 5 5 4 ");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test offset addition
 | 
			
		||||
@@ -237,14 +224,13 @@ test_opr<T, R, P>::offset_addition_test
 | 
			
		||||
    std::cout << "\tDoing offset addition test." << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::ptrdiff_t const  two = 2;
 | 
			
		||||
    std::ostrstream       oss( scratch, scratch_length );
 | 
			
		||||
    std::stringstream oss;
 | 
			
		||||
    for ( iter_type i = fruit_begin ; i != fruit_end ; i = i + two )
 | 
			
		||||
    {
 | 
			
		||||
        oss << *i << ' ';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    oss << std::ends;
 | 
			
		||||
    BOOST_TEST( std::strcmp(oss.str(), "apple pear grape ") == 0 );
 | 
			
		||||
    BOOST_CHECK( oss.str() == "apple pear grape ");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test offset addition, in reverse order
 | 
			
		||||
@@ -257,14 +243,13 @@ test_opr<T, R, P>::reverse_offset_addition_test
 | 
			
		||||
    std::cout << "\tDoing reverse offset addition test." << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::ptrdiff_t const  two = 2;
 | 
			
		||||
    std::ostrstream       oss( scratch, scratch_length );
 | 
			
		||||
    std::stringstream oss;
 | 
			
		||||
    for ( iter_type i = fruit_begin ; i != fruit_end ; i = two + i )
 | 
			
		||||
    {
 | 
			
		||||
        oss << *i << ' ';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    oss << std::ends;
 | 
			
		||||
    BOOST_TEST( std::strcmp(oss.str(), "apple pear grape ") == 0 );
 | 
			
		||||
    BOOST_CHECK( oss.str() == "apple pear grape ");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test offset subtraction
 | 
			
		||||
@@ -277,7 +262,7 @@ test_opr<T, R, P>::offset_subtraction_test
 | 
			
		||||
    std::cout << "\tDoing offset subtraction test." << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::ptrdiff_t const  two = 2;
 | 
			
		||||
    std::ostrstream       oss( scratch, scratch_length );
 | 
			
		||||
    std::stringstream oss;
 | 
			
		||||
    for ( iter_type i = fruit_end ; fruit_begin < i ; )
 | 
			
		||||
    {
 | 
			
		||||
        i = i - two;
 | 
			
		||||
@@ -287,8 +272,7 @@ test_opr<T, R, P>::offset_subtraction_test
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    oss << std::ends;
 | 
			
		||||
    BOOST_TEST( std::strcmp(oss.str(), "grape pear apple ") == 0 );
 | 
			
		||||
    BOOST_CHECK( oss.str() == "grape pear apple ");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test comparisons
 | 
			
		||||
@@ -312,10 +296,10 @@ test_opr<T, R, P>::comparison_test
 | 
			
		||||
        {
 | 
			
		||||
            ptrdiff_t const  j_offset = j - fruit_begin;
 | 
			
		||||
 | 
			
		||||
            BOOST_TEST( (i != j) == (i_offset != j_offset) );
 | 
			
		||||
            BOOST_TEST( (i > j) == (i_offset > j_offset) );
 | 
			
		||||
            BOOST_TEST( (i <= j) == (i_offset <= j_offset) );
 | 
			
		||||
            BOOST_TEST( (i >= j) == (i_offset >= j_offset) );
 | 
			
		||||
            BOOST_CHECK( (i != j) == (i_offset != j_offset) );
 | 
			
		||||
            BOOST_CHECK( (i > j) == (i_offset > j_offset) );
 | 
			
		||||
            BOOST_CHECK( (i <= j) == (i_offset <= j_offset) );
 | 
			
		||||
            BOOST_CHECK( (i >= j) == (i_offset >= j_offset) );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    cout << std::endl;
 | 
			
		||||
@@ -330,13 +314,11 @@ test_opr<T, R, P>::indexing_test
 | 
			
		||||
{
 | 
			
		||||
    std::cout << "\tDoing indexing test." << std::endl;
 | 
			
		||||
 | 
			
		||||
    std::ostrstream  oss( scratch, scratch_length );
 | 
			
		||||
    std::stringstream oss;
 | 
			
		||||
    for ( std::size_t k = 0u ; k < fruit_length ; ++k )
 | 
			
		||||
    {
 | 
			
		||||
        oss << fruit_begin[ k ] << ' ';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    oss << std::ends;
 | 
			
		||||
    BOOST_TEST( std::strcmp(oss.str(), "apple orange pear peach grape plum ")
 | 
			
		||||
     == 0 );
 | 
			
		||||
    BOOST_CHECK( oss.str() == "apple orange pear peach grape plum ");
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,8 @@
 | 
			
		||||
//  boost class noncopyable test program  ------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright boost.org 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.
 | 
			
		||||
//  (C) Copyright Beman Dawes 1999. 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 for most recent version including documentation.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,7 @@
 | 
			
		||||
//  (C) Copyright David Abrahams 2001. 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.
 | 
			
		||||
//  (C) Copyright David Abrahams 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 for most recent version including documentation.
 | 
			
		||||
 | 
			
		||||
@@ -58,14 +57,22 @@ struct complement
 | 
			
		||||
    struct traits
 | 
			
		||||
    {
 | 
			
		||||
     private:
 | 
			
		||||
        // indirection through complement_traits_aux neccessary to keep MSVC happy
 | 
			
		||||
        // indirection through complement_traits_aux necessary to keep MSVC happy
 | 
			
		||||
        typedef complement_traits_aux<Number, size - 1> prev;
 | 
			
		||||
     public:
 | 
			
		||||
#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 2
 | 
			
		||||
      // GCC 4.0.2 ICEs on these C-style casts
 | 
			
		||||
        BOOST_STATIC_CONSTANT(Number, max =
 | 
			
		||||
                            Number((prev::max) << CHAR_BIT)
 | 
			
		||||
                            + Number(UCHAR_MAX));
 | 
			
		||||
        BOOST_STATIC_CONSTANT(Number, min = Number((prev::min) << CHAR_BIT));
 | 
			
		||||
#else
 | 
			
		||||
        BOOST_STATIC_CONSTANT(Number, max =
 | 
			
		||||
                            Number(Number(prev::max) << CHAR_BIT)
 | 
			
		||||
                            + Number(UCHAR_MAX));
 | 
			
		||||
        
 | 
			
		||||
        BOOST_STATIC_CONSTANT(Number, min = Number(Number(prev::min) << CHAR_BIT));
 | 
			
		||||
#endif
 | 
			
		||||
   
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -222,10 +229,16 @@ void test_aux(unsigned_tag, Number*)
 | 
			
		||||
        (sizeof(Number) < sizeof(boost::intmax_t))
 | 
			
		||||
        | (boost::is_same<difference_type, boost::intmax_t>::value));
 | 
			
		||||
 | 
			
		||||
#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 2
 | 
			
		||||
    // GCC 4.0.2 ICEs on this C-style cases
 | 
			
		||||
    BOOST_STATIC_ASSERT((complement_traits<Number>::max) > Number(0));
 | 
			
		||||
    BOOST_STATIC_ASSERT((complement_traits<Number>::min) == Number(0));
 | 
			
		||||
#else
 | 
			
		||||
    // Force casting to Number here to work around the fact that it's an enum on MSVC
 | 
			
		||||
    BOOST_STATIC_ASSERT(Number(complement_traits<Number>::max) > Number(0));
 | 
			
		||||
    BOOST_STATIC_ASSERT(Number(complement_traits<Number>::min) == Number(0));
 | 
			
		||||
    
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    const Number max = complement_traits<Number>::max;
 | 
			
		||||
    const Number min = complement_traits<Number>::min;
 | 
			
		||||
    
 | 
			
		||||
@@ -309,10 +322,15 @@ void test_aux(signed_tag, Number*)
 | 
			
		||||
        (sizeof(Number) < sizeof(boost::intmax_t))
 | 
			
		||||
        | (boost::is_same<difference_type, Number>::value));
 | 
			
		||||
 | 
			
		||||
#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 2
 | 
			
		||||
    // GCC 4.0.2 ICEs on this cast
 | 
			
		||||
    BOOST_STATIC_ASSERT((complement_traits<Number>::max) > Number(0));
 | 
			
		||||
    BOOST_STATIC_ASSERT((complement_traits<Number>::min) < Number(0));
 | 
			
		||||
#else
 | 
			
		||||
    // Force casting to Number here to work around the fact that it's an enum on MSVC
 | 
			
		||||
    BOOST_STATIC_ASSERT(Number(complement_traits<Number>::max) > Number(0));
 | 
			
		||||
    BOOST_STATIC_ASSERT(Number(complement_traits<Number>::min) < Number(0));
 | 
			
		||||
    
 | 
			
		||||
#endif    
 | 
			
		||||
    const Number max = complement_traits<Number>::max;
 | 
			
		||||
    const Number min = complement_traits<Number>::min;
 | 
			
		||||
    
 | 
			
		||||
@@ -375,8 +393,8 @@ int main()
 | 
			
		||||
    test<long>();
 | 
			
		||||
    test<unsigned long>();
 | 
			
		||||
#if defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_INTEGRAL_INT64_T)
 | 
			
		||||
    test<long long>();
 | 
			
		||||
    test<unsigned long long>();
 | 
			
		||||
    test< ::boost::long_long_type>();
 | 
			
		||||
    test< ::boost::ulong_long_type>();
 | 
			
		||||
#elif defined(BOOST_MSVC)
 | 
			
		||||
    // The problem of not having compile-time static class constants other than
 | 
			
		||||
    // enums prevents this from working, since values get truncated.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										107
									
								
								operators.htm
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								operators.htm
									
									
									
									
									
								
							@@ -10,7 +10,7 @@
 | 
			
		||||
  </head>
 | 
			
		||||
 | 
			
		||||
  <body text="black" bgcolor="white" link="blue" vlink="purple" alink="red">
 | 
			
		||||
    <h1><img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align=
 | 
			
		||||
    <h1><img src="../../boost.png" alt="boost.png (6897 bytes)" align=
 | 
			
		||||
    "middle" width="277" height="86">Header <cite><<a href=
 | 
			
		||||
    "../../boost/operators.hpp">boost/operators.hpp</a>></cite></h1>
 | 
			
		||||
 | 
			
		||||
@@ -132,18 +132,18 @@
 | 
			
		||||
class MyInt
 | 
			
		||||
    : boost::operators<MyInt>
 | 
			
		||||
{
 | 
			
		||||
    bool operator<(const MyInt& x) const; 
 | 
			
		||||
    bool operator<(const MyInt& x) const;
 | 
			
		||||
    bool operator==(const MyInt& x) const;
 | 
			
		||||
    MyInt& operator+=(const MyInt& x);    
 | 
			
		||||
    MyInt& operator-=(const MyInt& x);    
 | 
			
		||||
    MyInt& operator*=(const MyInt& x);    
 | 
			
		||||
    MyInt& operator/=(const MyInt& x);    
 | 
			
		||||
    MyInt& operator%=(const MyInt& x);    
 | 
			
		||||
    MyInt& operator|=(const MyInt& x);    
 | 
			
		||||
    MyInt& operator&=(const MyInt& x);    
 | 
			
		||||
    MyInt& operator^=(const MyInt& x);    
 | 
			
		||||
    MyInt& operator++();    
 | 
			
		||||
    MyInt& operator--();    
 | 
			
		||||
    MyInt& operator+=(const MyInt& x);
 | 
			
		||||
    MyInt& operator-=(const MyInt& x);
 | 
			
		||||
    MyInt& operator*=(const MyInt& x);
 | 
			
		||||
    MyInt& operator/=(const MyInt& x);
 | 
			
		||||
    MyInt& operator%=(const MyInt& x);
 | 
			
		||||
    MyInt& operator|=(const MyInt& x);
 | 
			
		||||
    MyInt& operator&=(const MyInt& x);
 | 
			
		||||
    MyInt& operator^=(const MyInt& x);
 | 
			
		||||
    MyInt& operator++();
 | 
			
		||||
    MyInt& operator--();
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
@@ -345,7 +345,7 @@ class MyInt
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <p>As Daniel Krügler pointed out, this technique violates 14.6.5/2
 | 
			
		||||
    and is thus non-portable. The reasoning is, that the operators injected 
 | 
			
		||||
    and is thus non-portable. The reasoning is, that the operators injected
 | 
			
		||||
    by the instantiation of e.g.
 | 
			
		||||
    <code>less_than_comparable<myclass></code> can not be found
 | 
			
		||||
    by ADL according to the rules given by 3.4.2/2, since myclass is
 | 
			
		||||
@@ -445,6 +445,9 @@ const point<float> pi_over_4_normalized = pi_over_4 / length(pi_over_4);
 | 
			
		||||
    optional template parameter <code>B</code>, which is not shown, for the
 | 
			
		||||
    <a href="#chaining">base class chaining</a> technique.</p>
 | 
			
		||||
 | 
			
		||||
    <p>The primary operand type <code>T</code> needs to be of class type,
 | 
			
		||||
    built-in types are not supported.</p>
 | 
			
		||||
 | 
			
		||||
    <table cellpadding="5" border="1" align="center">
 | 
			
		||||
      <caption>
 | 
			
		||||
        Simple Arithmetic Operator Template Classes
 | 
			
		||||
@@ -917,7 +920,7 @@ T operator+( const T& lhs, const T& rhs )
 | 
			
		||||
    created, <code>operator+=</code> is called on it and it is copied to the
 | 
			
		||||
    function return value (which is another unnamed object of type
 | 
			
		||||
    <code>T</code>). The standard doesn't generally allow the intermediate
 | 
			
		||||
    object to be optimized away: 
 | 
			
		||||
    object to be optimized away:
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      3.7.2/2: Automatic storage duration<br>
 | 
			
		||||
@@ -928,7 +931,7 @@ T operator+( const T& lhs, const T& rhs )
 | 
			
		||||
      unused, except that a class object or its copy may be eliminated as
 | 
			
		||||
      specified in 12.8.
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    The reference to 12.8 is important for us: 
 | 
			
		||||
    The reference to 12.8 is important for us:
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
      12.8/15: Copying class objects<br>
 | 
			
		||||
@@ -942,7 +945,7 @@ T operator+( const T& lhs, const T& rhs )
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    This optimization is known as the named return value optimization (NRVO),
 | 
			
		||||
    which leads us to the following implementation for
 | 
			
		||||
    <code>operator+</code>: 
 | 
			
		||||
    <code>operator+</code>:
 | 
			
		||||
<pre>
 | 
			
		||||
T operator+( const T& lhs, const T& rhs )
 | 
			
		||||
{
 | 
			
		||||
@@ -956,7 +959,7 @@ T operator+( const T& lhs, const T& rhs )
 | 
			
		||||
    even implement it in an incorrect way which makes it useless here.
 | 
			
		||||
    Without the NRVO, the NRVO-friendly code is no worse than the original
 | 
			
		||||
    code showed above, but there is another possible implementation, which
 | 
			
		||||
    has some very special properties: 
 | 
			
		||||
    has some very special properties:
 | 
			
		||||
<pre>
 | 
			
		||||
T operator+( T lhs, const T& rhs )
 | 
			
		||||
{
 | 
			
		||||
@@ -982,7 +985,7 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
    will force the NRVO-friendly implementation to be used even for compilers
 | 
			
		||||
    that don't implement the NRVO. <br>
 | 
			
		||||
     <br>
 | 
			
		||||
     
 | 
			
		||||
 | 
			
		||||
    <h3><a name="grpd_oprs">Grouped Arithmetic Operators</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>The following templates provide common groups of related operations.
 | 
			
		||||
@@ -1420,9 +1423,9 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><code><a name=
 | 
			
		||||
        "euclidian_ring_operators1">euclidian_ring_operators<T></a></code><br>
 | 
			
		||||
        "euclidean_ring_operators1">euclidean_ring_operators<T></a></code><br>
 | 
			
		||||
 | 
			
		||||
         <code>euclidian_ring_operators1<T></code></td>
 | 
			
		||||
         <code>euclidean_ring_operators1<T></code></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          <ul>
 | 
			
		||||
@@ -1439,9 +1442,9 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><code><a name=
 | 
			
		||||
        "euclidian_ring_operators2">euclidian_ring_operators<T,
 | 
			
		||||
        "euclidean_ring_operators2">euclidean_ring_operators<T,
 | 
			
		||||
        U></a></code><br>
 | 
			
		||||
         <code>euclidian_ring_operators2<T, U></code></td>
 | 
			
		||||
         <code>euclidean_ring_operators2<T, U></code></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          <ul>
 | 
			
		||||
@@ -1464,14 +1467,14 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><code><a name=
 | 
			
		||||
        "ordered_euclidian_ring_operators1">ordered_euclidian_ring_operators<T></a></code><br>
 | 
			
		||||
        "ordered_euclidean_ring_operators1">ordered_euclidean_ring_operators<T></a></code><br>
 | 
			
		||||
 | 
			
		||||
         <code>ordered_euclidian_ring_operators1<T></code></td>
 | 
			
		||||
         <code>ordered_euclidean_ring_operators1<T></code></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          <ul>
 | 
			
		||||
            <li><code><a href=
 | 
			
		||||
            "#euclidian_ring_operators1">euclidian_ring_operators<T></a></code></li>
 | 
			
		||||
            "#euclidean_ring_operators1">euclidean_ring_operators<T></a></code></li>
 | 
			
		||||
 | 
			
		||||
            <li><code><a href=
 | 
			
		||||
            "#totally_ordered1">totally_ordered<T></a></code></li>
 | 
			
		||||
@@ -1481,14 +1484,14 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><code><a name=
 | 
			
		||||
        "ordered_euclidian_ring_operators2">ordered_euclidian_ring_operators<T,
 | 
			
		||||
        "ordered_euclidean_ring_operators2">ordered_euclidean_ring_operators<T,
 | 
			
		||||
        U></a></code><br>
 | 
			
		||||
         <code>ordered_euclidian_ring_operators2<T, U></code></td>
 | 
			
		||||
         <code>ordered_euclidean_ring_operators2<T, U></code></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          <ul>
 | 
			
		||||
            <li><code><a href=
 | 
			
		||||
            "#euclidian_ring_operators2">euclidian_ring_operators<T,
 | 
			
		||||
            "#euclidean_ring_operators2">euclidean_ring_operators<T,
 | 
			
		||||
            U></a></code></li>
 | 
			
		||||
 | 
			
		||||
            <li><code><a href="#totally_ordered2">totally_ordered<T,
 | 
			
		||||
@@ -1498,6 +1501,15 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
      </tr>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h4>Spelling: euclidean vs. euclidian</h4>
 | 
			
		||||
 | 
			
		||||
    <p>Older versions of the Boost.Operators library used
 | 
			
		||||
    "<code>euclidian</code>", but it was pointed out that
 | 
			
		||||
    "<code>euclidean</code>" is the more common spelling.
 | 
			
		||||
    To be compatible with older version, the library now supports
 | 
			
		||||
    both spellings.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a name="ex_oprs">Example</a> Templates</h3>
 | 
			
		||||
 | 
			
		||||
    <p>The arithmetic operator class templates <code><a href=
 | 
			
		||||
@@ -1576,9 +1588,8 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
 | 
			
		||||
    <p>The <cite><a href="operators_test.cpp">operators_test.cpp</a></cite>
 | 
			
		||||
    program demonstrates the use of the arithmetic operator templates, and
 | 
			
		||||
    can also be used to verify correct operation. Check the <a href=
 | 
			
		||||
    "../../status/compiler_status.html">compiler status report</a> for the
 | 
			
		||||
    test results with selected platforms.</p>
 | 
			
		||||
    can also be used to verify correct operation. Check the compiler status
 | 
			
		||||
    report for the test results with selected platforms.</p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="deref">Dereference</a> Operators and Iterator Helpers</h2>
 | 
			
		||||
 | 
			
		||||
@@ -1856,7 +1867,7 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
        V, D, P, R></a></code></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          Supports the operations and has the requirements of 
 | 
			
		||||
          Supports the operations and has the requirements of
 | 
			
		||||
 | 
			
		||||
          <ul>
 | 
			
		||||
            <li><code><a href="#input_iteratable">input_iteratable<T,
 | 
			
		||||
@@ -1870,7 +1881,7 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
        "output_iterator_helper">output_iterator_helper<T></a></code></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          Supports the operations and has the requirements of 
 | 
			
		||||
          Supports the operations and has the requirements of
 | 
			
		||||
 | 
			
		||||
          <ul>
 | 
			
		||||
            <li><code><a href=
 | 
			
		||||
@@ -1886,7 +1897,7 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
        R></a></code></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          Supports the operations and has the requirements of 
 | 
			
		||||
          Supports the operations and has the requirements of
 | 
			
		||||
 | 
			
		||||
          <ul>
 | 
			
		||||
            <li><code><a href="#forward_iteratable">forward_iteratable<T,
 | 
			
		||||
@@ -1901,7 +1912,7 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
        V, D, P, R></a></code></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          Supports the operations and has the requirements of 
 | 
			
		||||
          Supports the operations and has the requirements of
 | 
			
		||||
 | 
			
		||||
          <ul>
 | 
			
		||||
            <li><code><a href=
 | 
			
		||||
@@ -1917,7 +1928,7 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
        V, D, P, R></a></code></td>
 | 
			
		||||
 | 
			
		||||
        <td>
 | 
			
		||||
          Supports the operations and has the requirements of 
 | 
			
		||||
          Supports the operations and has the requirements of
 | 
			
		||||
 | 
			
		||||
          <ul>
 | 
			
		||||
            <li><code><a href=
 | 
			
		||||
@@ -1955,7 +1966,7 @@ T operator+( T lhs, const T& rhs )
 | 
			
		||||
    output iterator to writing just two member functions - an appropriate
 | 
			
		||||
    constructor and a copy-assignment operator. For example, here is a
 | 
			
		||||
    possible implementation of <code><a href=
 | 
			
		||||
    "function_output_iterator.htm">boost::function_output_iterator</a></code>
 | 
			
		||||
    "../iterator/doc/function_output_iterator.html">boost::function_output_iterator</a></code>
 | 
			
		||||
    adaptor:</p>
 | 
			
		||||
<pre>
 | 
			
		||||
template<class UnaryFunction>
 | 
			
		||||
@@ -1968,8 +1979,8 @@ struct function_output_iterator
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    function_output_iterator& operator=(T const& value)
 | 
			
		||||
    {
 | 
			
		||||
        this->func(value); 
 | 
			
		||||
        return *this; 
 | 
			
		||||
        this->func(value);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
@@ -2022,20 +2033,20 @@ public:
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <p>Check the <a href="../../status/compiler_status.html">compiler status
 | 
			
		||||
    <p>Check the <a href="http://www.boost.org/development/testing.html">compiler status
 | 
			
		||||
    report</a> for the test results with selected platforms.</p>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="contributors">Contributors</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="../../people/dave_abrahams.htm">Dave Abrahams</a></dt>
 | 
			
		||||
      <dt><a href="http://www.boost.org/people/dave_abrahams.htm">Dave Abrahams</a></dt>
 | 
			
		||||
 | 
			
		||||
      <dd>Started the library and contributed the arithmetic operators in
 | 
			
		||||
      <cite><a href=
 | 
			
		||||
      "../../boost/operators.hpp">boost/operators.hpp</a></cite>.</dd>
 | 
			
		||||
 | 
			
		||||
      <dt><a href="../../people/jeremy_siek.htm">Jeremy Siek</a></dt>
 | 
			
		||||
      <dt><a href="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</a></dt>
 | 
			
		||||
 | 
			
		||||
      <dd>Contributed the <a href="#deref">dereference operators and iterator
 | 
			
		||||
      helpers</a> in <cite><a href=
 | 
			
		||||
@@ -2043,19 +2054,19 @@ public:
 | 
			
		||||
      contributed <cite><a href=
 | 
			
		||||
      "iterators_test.cpp">iterators_test.cpp</a></cite>.</dd>
 | 
			
		||||
 | 
			
		||||
      <dt><a href="../../people/aleksey_gurtovoy.htm">Aleksey
 | 
			
		||||
      <dt><a href="http://www.boost.org/people/aleksey_gurtovoy.htm">Aleksey
 | 
			
		||||
      Gurtovoy</a></dt>
 | 
			
		||||
 | 
			
		||||
      <dd>Contributed the code to support <a href="#chaining">base class
 | 
			
		||||
      chaining</a> while remaining backward-compatible with old versions of
 | 
			
		||||
      the library.</dd>
 | 
			
		||||
 | 
			
		||||
      <dt><a href="../../people/beman_dawes.html">Beman Dawes</a></dt>
 | 
			
		||||
      <dt><a href="http://www.boost.org/people/beman_dawes.html">Beman Dawes</a></dt>
 | 
			
		||||
 | 
			
		||||
      <dd>Contributed <cite><a href=
 | 
			
		||||
      "operators_test.cpp">operators_test.cpp</a></cite>.</dd>
 | 
			
		||||
 | 
			
		||||
      <dt><a href="../../people/daryle_walker.html">Daryle Walker</a></dt>
 | 
			
		||||
      <dt><a href="http://www.boost.org/people/daryle_walker.html">Daryle Walker</a></dt>
 | 
			
		||||
 | 
			
		||||
      <dd>Contributed classes for the shift operators, equivalence, partial
 | 
			
		||||
      ordering, and arithmetic conversions. Added the grouped operator
 | 
			
		||||
@@ -2119,11 +2130,11 @@ public:
 | 
			
		||||
    backward-compatible.</p>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <p>Revised: 03 Dec 2003</p>
 | 
			
		||||
    <p>Revised: 7 Aug 2008</p>
 | 
			
		||||
 | 
			
		||||
    <p>Copyright © Beman Dawes, David Abrahams, 1999-2001.</p>
 | 
			
		||||
    <p>Copyright © Daniel Frey, 2002-2003.</p>
 | 
			
		||||
    <p>Use, modification, and distribution is subject to the Boost Software 
 | 
			
		||||
    <p>Copyright © Daniel Frey, 2002-2009.</p>
 | 
			
		||||
    <p>Use, modification, and distribution is subject to 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">
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,13 @@
 | 
			
		||||
//  Demonstrate and test boost/operators.hpp  -------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 1999.
 | 
			
		||||
//  See accompanying license for terms and conditions of use.
 | 
			
		||||
//  Copyright Beman Dawes 1999.  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/utility for documentation.
 | 
			
		||||
 | 
			
		||||
//  Revision History
 | 
			
		||||
//  03 Apr 08 Added convertible_to_bool (Daniel Frey)
 | 
			
		||||
//  01 Oct 01 Added tests for "left" operators
 | 
			
		||||
//            and new grouped operators. (Helmut Zeisel)
 | 
			
		||||
//  20 May 01 Output progress messages.  Added tests for new operator
 | 
			
		||||
@@ -42,6 +44,23 @@ namespace
 | 
			
		||||
    unsigned char true_value(unsigned char x) { return x; }
 | 
			
		||||
    unsigned short true_value(unsigned short x) { return x; }
 | 
			
		||||
 | 
			
		||||
    // verify the minimum requirements for some operators
 | 
			
		||||
    class convertible_to_bool
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
        bool _value;
 | 
			
		||||
 | 
			
		||||
        typedef bool convertible_to_bool::*unspecified_bool_type;
 | 
			
		||||
 | 
			
		||||
        void operator!() const;
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
        convertible_to_bool( const bool value ) : _value( value ) {}
 | 
			
		||||
 | 
			
		||||
        operator unspecified_bool_type() const
 | 
			
		||||
          { return _value ? &convertible_to_bool::_value : 0; }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // The use of operators<> here tended to obscure
 | 
			
		||||
    // interactions with certain compiler bugs
 | 
			
		||||
    template <class T>
 | 
			
		||||
@@ -53,8 +72,10 @@ namespace
 | 
			
		||||
        explicit Wrapped1( T v = T() ) : _value(v) {}
 | 
			
		||||
        T value() const { return _value; }
 | 
			
		||||
 | 
			
		||||
        bool operator<(const Wrapped1& x) const { return _value < x._value; }
 | 
			
		||||
        bool operator==(const Wrapped1& x) const { return _value == x._value; }
 | 
			
		||||
        convertible_to_bool operator<(const Wrapped1& x) const
 | 
			
		||||
          { return _value < x._value; }
 | 
			
		||||
        convertible_to_bool operator==(const Wrapped1& x) const
 | 
			
		||||
          { return _value == x._value; }
 | 
			
		||||
        
 | 
			
		||||
        Wrapped1& operator+=(const Wrapped1& x)
 | 
			
		||||
          { _value += x._value; return *this; }
 | 
			
		||||
@@ -96,8 +117,10 @@ namespace
 | 
			
		||||
        explicit Wrapped2( T v = T() ) : _value(v) {}
 | 
			
		||||
        T value() const { return _value; }
 | 
			
		||||
 | 
			
		||||
        bool operator<(const Wrapped2& x) const { return _value < x._value; }
 | 
			
		||||
        bool operator==(const Wrapped2& x) const { return _value == x._value; }
 | 
			
		||||
        convertible_to_bool operator<(const Wrapped2& x) const
 | 
			
		||||
          { return _value < x._value; }
 | 
			
		||||
        convertible_to_bool operator==(const Wrapped2& x) const
 | 
			
		||||
          { return _value == x._value; }
 | 
			
		||||
        
 | 
			
		||||
        Wrapped2& operator+=(const Wrapped2& x)
 | 
			
		||||
          { _value += x._value; return *this; }
 | 
			
		||||
@@ -122,9 +145,13 @@ namespace
 | 
			
		||||
        Wrapped2& operator++()                { ++_value; return *this; }
 | 
			
		||||
        Wrapped2& operator--()                { --_value; return *this; }
 | 
			
		||||
         
 | 
			
		||||
        bool operator<(U u) const { return _value < u; }
 | 
			
		||||
        bool operator>(U u) const { return _value > u; }
 | 
			
		||||
        bool operator==(U u) const { return _value == u; }
 | 
			
		||||
        convertible_to_bool operator<(U u) const
 | 
			
		||||
          { return _value < u; }
 | 
			
		||||
        convertible_to_bool operator>(U u) const
 | 
			
		||||
          { return _value > u; }
 | 
			
		||||
        convertible_to_bool operator==(U u) const
 | 
			
		||||
          { return _value == u; }
 | 
			
		||||
 | 
			
		||||
        Wrapped2& operator+=(U u) { _value += u; return *this; }
 | 
			
		||||
        Wrapped2& operator-=(U u) { _value -= u; return *this; }
 | 
			
		||||
        Wrapped2& operator*=(U u) { _value *= u; return *this; }
 | 
			
		||||
@@ -152,7 +179,8 @@ namespace
 | 
			
		||||
        explicit Wrapped3( T v = T() ) : _value(v) {}
 | 
			
		||||
        T value() const { return _value; }
 | 
			
		||||
 | 
			
		||||
        bool operator<(const Wrapped3& x) const { return _value < x._value; }
 | 
			
		||||
        convertible_to_bool operator<(const Wrapped3& x) const
 | 
			
		||||
          { return _value < x._value; }
 | 
			
		||||
        
 | 
			
		||||
    private:
 | 
			
		||||
        T _value;
 | 
			
		||||
@@ -173,10 +201,13 @@ namespace
 | 
			
		||||
        explicit Wrapped4( T v = T() ) : _value(v) {}
 | 
			
		||||
        T value() const { return _value; }
 | 
			
		||||
 | 
			
		||||
        bool operator<(const Wrapped4& x) const { return _value < x._value; }
 | 
			
		||||
        convertible_to_bool operator<(const Wrapped4& x) const
 | 
			
		||||
          { return _value < x._value; }
 | 
			
		||||
         
 | 
			
		||||
        bool operator<(U u) const { return _value < u; }
 | 
			
		||||
        bool operator>(U u) const { return _value > u; }
 | 
			
		||||
        convertible_to_bool operator<(U u) const
 | 
			
		||||
          { return _value < u; }
 | 
			
		||||
        convertible_to_bool operator>(U u) const
 | 
			
		||||
          { return _value > u; }
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
        T _value;
 | 
			
		||||
@@ -197,11 +228,18 @@ namespace
 | 
			
		||||
        Wrapped5(U u) : _value(u) {}
 | 
			
		||||
 | 
			
		||||
        T value() const { return _value; }
 | 
			
		||||
        bool operator<(const Wrapped5& x) const { return _value < x._value; }
 | 
			
		||||
        bool operator<(U u) const { return _value < u; }
 | 
			
		||||
        bool operator>(U u) const { return _value > u; }
 | 
			
		||||
        bool operator==(const Wrapped5& u) const { return _value == u._value; }
 | 
			
		||||
        bool operator==(U u) const { return _value == u; }
 | 
			
		||||
 | 
			
		||||
        convertible_to_bool operator<(const Wrapped5& x) const
 | 
			
		||||
          { return _value < x._value; }
 | 
			
		||||
        convertible_to_bool operator<(U u) const
 | 
			
		||||
          { return _value < u; }
 | 
			
		||||
        convertible_to_bool operator>(U u) const
 | 
			
		||||
          { return _value > u; }
 | 
			
		||||
        convertible_to_bool operator==(const Wrapped5& u) const
 | 
			
		||||
          { return _value == u._value; }
 | 
			
		||||
        convertible_to_bool operator==(U u) const
 | 
			
		||||
          { return _value == u; }
 | 
			
		||||
 | 
			
		||||
        Wrapped5& operator/=(const Wrapped5& u) { _value /= u._value; return *this;}
 | 
			
		||||
        Wrapped5& operator/=(U u) { _value /= u; return *this;}
 | 
			
		||||
        Wrapped5& operator*=(const Wrapped5& u) { _value *= u._value; return *this;}
 | 
			
		||||
@@ -220,8 +258,8 @@ namespace
 | 
			
		||||
    // U must be convertible to T
 | 
			
		||||
    template <class T, class U>
 | 
			
		||||
    class Wrapped6
 | 
			
		||||
        : boost::ordered_euclidian_ring_operators2<Wrapped6<T, U>, U>
 | 
			
		||||
        , boost::ordered_euclidian_ring_operators1<Wrapped6<T, U> >
 | 
			
		||||
        : boost::ordered_euclidean_ring_operators2<Wrapped6<T, U>, U>
 | 
			
		||||
        , boost::ordered_euclidean_ring_operators1<Wrapped6<T, U> >
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        explicit Wrapped6( T v = T() ) : _value(v) {}
 | 
			
		||||
@@ -230,11 +268,18 @@ namespace
 | 
			
		||||
        Wrapped6(U u) : _value(u) {}
 | 
			
		||||
 | 
			
		||||
        T value() const { return _value; }
 | 
			
		||||
        bool operator<(const Wrapped6& x) const { return _value < x._value; }
 | 
			
		||||
        bool operator<(U u) const { return _value < u; }
 | 
			
		||||
        bool operator>(U u) const { return _value > u; }
 | 
			
		||||
        bool operator==(const Wrapped6& u) const { return _value == u._value; }
 | 
			
		||||
        bool operator==(U u) const { return _value == u; }
 | 
			
		||||
 | 
			
		||||
        convertible_to_bool operator<(const Wrapped6& x) const
 | 
			
		||||
          { return _value < x._value; }
 | 
			
		||||
        convertible_to_bool operator<(U u) const
 | 
			
		||||
          { return _value < u; }
 | 
			
		||||
        convertible_to_bool operator>(U u) const
 | 
			
		||||
          { return _value > u; }
 | 
			
		||||
        convertible_to_bool operator==(const Wrapped6& u) const
 | 
			
		||||
          { return _value == u._value; }
 | 
			
		||||
        convertible_to_bool operator==(U u) const
 | 
			
		||||
          { return _value == u; }
 | 
			
		||||
 | 
			
		||||
        Wrapped6& operator%=(const Wrapped6& u) { _value %= u._value; return *this;}
 | 
			
		||||
        Wrapped6& operator%=(U u) { _value %= u; return *this;}
 | 
			
		||||
        Wrapped6& operator/=(const Wrapped6& u) { _value /= u._value; return *this;}
 | 
			
		||||
@@ -268,17 +313,17 @@ namespace
 | 
			
		||||
    template <class X1, class Y1, class X2, class Y2>
 | 
			
		||||
    void sanity_check(X1 x1, Y1 y1, X2 x2, Y2 y2)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_TEST( true_value(y1) == true_value(y2) );
 | 
			
		||||
        BOOST_TEST( true_value(x1) == true_value(x2) );
 | 
			
		||||
        BOOST_CHECK( true_value(y1) == true_value(y2) );
 | 
			
		||||
        BOOST_CHECK( true_value(x1) == true_value(x2) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <class X1, class Y1, class X2, class Y2>
 | 
			
		||||
    void test_less_than_comparable_aux(X1 x1, Y1 y1, X2 x2, Y2 y2)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_TEST( (x1 < y1) == (x2 < y2) );
 | 
			
		||||
        BOOST_TEST( (x1 <= y1) == (x2 <= y2) );
 | 
			
		||||
        BOOST_TEST( (x1 >= y1) == (x2 >= y2) );
 | 
			
		||||
        BOOST_TEST( (x1 > y1) == (x2 > y2) );
 | 
			
		||||
        BOOST_CHECK( static_cast<bool>(x1 < y1) == static_cast<bool>(x2 < y2) );
 | 
			
		||||
        BOOST_CHECK( static_cast<bool>(x1 <= y1) == static_cast<bool>(x2 <= y2) );
 | 
			
		||||
        BOOST_CHECK( static_cast<bool>(x1 >= y1) == static_cast<bool>(x2 >= y2) );
 | 
			
		||||
        BOOST_CHECK( static_cast<bool>(x1 > y1) == static_cast<bool>(x2 > y2) );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    template <class X1, class Y1, class X2, class Y2>
 | 
			
		||||
@@ -292,8 +337,8 @@ namespace
 | 
			
		||||
    template <class X1, class Y1, class X2, class Y2>
 | 
			
		||||
    void test_equality_comparable_aux(X1 x1, Y1 y1, X2 x2, Y2 y2)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_TEST( (x1 == y1) == (x2 == y2) );
 | 
			
		||||
        BOOST_TEST( (x1 != y1) == (x2 != y2) );
 | 
			
		||||
        BOOST_CHECK( static_cast<bool>(x1 == y1) == static_cast<bool>(x2 == y2) );
 | 
			
		||||
        BOOST_CHECK( static_cast<bool>(x1 != y1) == static_cast<bool>(x2 != y2) );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    template <class X1, class Y1, class X2, class Y2>
 | 
			
		||||
@@ -307,7 +352,7 @@ namespace
 | 
			
		||||
    template <class X1, class Y1, class X2, class Y2>
 | 
			
		||||
    void test_multipliable_aux(X1 x1, Y1 y1, X2 x2, Y2 y2)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_TEST( (x1 * y1).value() == (x2 * y2) );
 | 
			
		||||
        BOOST_CHECK( (x1 * y1).value() == (x2 * y2) );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    template <class X1, class Y1, class X2, class Y2>
 | 
			
		||||
@@ -321,7 +366,7 @@ namespace
 | 
			
		||||
  template <class A, class B>
 | 
			
		||||
  void test_value_equality(A a, B b)
 | 
			
		||||
  {
 | 
			
		||||
      BOOST_TEST(a.value() == b);
 | 
			
		||||
      BOOST_CHECK(a.value() == b);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
#define TEST_OP_R(op) test_value_equality(x1 op y1, x2 op y2)
 | 
			
		||||
@@ -447,16 +492,16 @@ namespace
 | 
			
		||||
    void test_incrementable(X1 x1, X2 x2)
 | 
			
		||||
    {
 | 
			
		||||
        sanity_check( x1, x1, x2, x2 );
 | 
			
		||||
        BOOST_TEST( (x1++).value() == x2++ );
 | 
			
		||||
        BOOST_TEST( x1.value() == x2 );
 | 
			
		||||
        BOOST_CHECK( (x1++).value() == x2++ );
 | 
			
		||||
        BOOST_CHECK( x1.value() == x2 );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    template <class X1, class X2>
 | 
			
		||||
    void test_decrementable(X1 x1, X2 x2)
 | 
			
		||||
    {
 | 
			
		||||
        sanity_check( x1, x1, x2, x2 );
 | 
			
		||||
        BOOST_TEST( (x1--).value() == x2-- );
 | 
			
		||||
        BOOST_TEST( x1.value() == x2 );
 | 
			
		||||
        BOOST_CHECK( (x1--).value() == x2-- );
 | 
			
		||||
        BOOST_CHECK( x1.value() == x2 );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    template <class X1, class Y1, class X2, class Y2>
 | 
			
		||||
@@ -535,7 +580,7 @@ namespace
 | 
			
		||||
// inherited operator templates at the moment it must, so the following
 | 
			
		||||
// explicit instantiations force it to do that.
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && (_MSC_VER <= 1200)
 | 
			
		||||
#if defined(BOOST_MSVC) && (_MSC_VER < 1300)
 | 
			
		||||
template Wrapped1<int>;
 | 
			
		||||
template Wrapped1<long>;
 | 
			
		||||
template Wrapped1<unsigned int>;
 | 
			
		||||
@@ -560,7 +605,7 @@ template Wrapped6<unsigned long, unsigned char>;
 | 
			
		||||
template Wrapped6<unsigned int, unsigned char>;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define PRIVATE_EXPR_TEST(e, t)  BOOST_TEST( ((e), (t)) )
 | 
			
		||||
#define PRIVATE_EXPR_TEST(e, t)  BOOST_CHECK( ((e), (t)) )
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
test_main( int , char * [] )
 | 
			
		||||
@@ -605,22 +650,22 @@ test_main( int , char * [] )
 | 
			
		||||
    MyInt i2(2);
 | 
			
		||||
    MyInt i;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( i1.value() == 1 );
 | 
			
		||||
    BOOST_TEST( i2.value() == 2 );
 | 
			
		||||
    BOOST_TEST( i.value() == 0 );
 | 
			
		||||
    BOOST_CHECK( i1.value() == 1 );
 | 
			
		||||
    BOOST_CHECK( i2.value() == 2 );
 | 
			
		||||
    BOOST_CHECK( i.value() == 0 );
 | 
			
		||||
 | 
			
		||||
    cout << "Created MyInt objects.\n";
 | 
			
		||||
 | 
			
		||||
    PRIVATE_EXPR_TEST( (i = i2), (i.value() == 2) );
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( i2 == i );
 | 
			
		||||
    BOOST_TEST( i1 != i2 );
 | 
			
		||||
    BOOST_TEST( i1 <  i2 );
 | 
			
		||||
    BOOST_TEST( i1 <= i2 );
 | 
			
		||||
    BOOST_TEST( i <= i2 );
 | 
			
		||||
    BOOST_TEST( i2 >  i1 );
 | 
			
		||||
    BOOST_TEST( i2 >= i1 );
 | 
			
		||||
    BOOST_TEST( i2 >= i );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(i2 == i) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(i1 != i2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(i1 <  i2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(i1 <= i2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(i <= i2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(i2 >  i1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(i2 >= i1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(i2 >= i) );
 | 
			
		||||
 | 
			
		||||
    PRIVATE_EXPR_TEST( (i = i1 + i2), (i.value() == 3) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (i = i + i2), (i.value() == 5) );
 | 
			
		||||
@@ -644,86 +689,86 @@ test_main( int , char * [] )
 | 
			
		||||
    MyLong j2(2);
 | 
			
		||||
    MyLong j;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( j1.value() == 1 );
 | 
			
		||||
    BOOST_TEST( j2.value() == 2 );
 | 
			
		||||
    BOOST_TEST( j.value() == 0 );
 | 
			
		||||
    BOOST_CHECK( j1.value() == 1 );
 | 
			
		||||
    BOOST_CHECK( j2.value() == 2 );
 | 
			
		||||
    BOOST_CHECK( j.value() == 0 );
 | 
			
		||||
 | 
			
		||||
    cout << "Created MyLong objects.\n";
 | 
			
		||||
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j2), (j.value() == 2) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( j2 == j );
 | 
			
		||||
    BOOST_TEST( 2 == j );
 | 
			
		||||
    BOOST_TEST( j2 == 2 );    
 | 
			
		||||
    BOOST_TEST( j == j2 );
 | 
			
		||||
    BOOST_TEST( j1 != j2 );
 | 
			
		||||
    BOOST_TEST( j1 != 2 );
 | 
			
		||||
    BOOST_TEST( 1 != j2 );
 | 
			
		||||
    BOOST_TEST( j1 <  j2 );
 | 
			
		||||
    BOOST_TEST( 1 <  j2 );
 | 
			
		||||
    BOOST_TEST( j1 <  2 );
 | 
			
		||||
    BOOST_TEST( j1 <= j2 );
 | 
			
		||||
    BOOST_TEST( 1 <= j2 );
 | 
			
		||||
    BOOST_TEST( j1 <= j );
 | 
			
		||||
    BOOST_TEST( j <= j2 );
 | 
			
		||||
    BOOST_TEST( 2 <= j2 );
 | 
			
		||||
    BOOST_TEST( j <= 2 );
 | 
			
		||||
    BOOST_TEST( j2 >  j1 );
 | 
			
		||||
    BOOST_TEST( 2 >  j1 );
 | 
			
		||||
    BOOST_TEST( j2 >  1 );
 | 
			
		||||
    BOOST_TEST( j2 >= j1 );
 | 
			
		||||
    BOOST_TEST( 2 >= j1 );
 | 
			
		||||
    BOOST_TEST( j2 >= 1 );
 | 
			
		||||
    BOOST_TEST( j2 >= j );
 | 
			
		||||
    BOOST_TEST( 2 >= j );
 | 
			
		||||
    BOOST_TEST( j2 >= 2 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j2 == j) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 == j) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j2 == 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j == j2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j1 != j2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j1 != 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 != j2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j1 <  j2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 <  j2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j1 <  2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j1 <= j2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 <= j2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j1 <= j) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j <= j2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 <= j2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j <= 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j2 >  j1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 >  j1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j2 >  1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j2 >= j1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 >= j1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j2 >= 1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j2 >= j) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 >= j) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(j2 >= 2) );
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( (j1 + 2) == 3 );
 | 
			
		||||
    BOOST_TEST( (1 + j2) == 3 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j1 + 2) == 3) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((1 + j2) == 3) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j1 + j2), (j.value() == 3) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( (j + 2) == 5 );
 | 
			
		||||
    BOOST_TEST( (3 + j2) == 5 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j + 2) == 5) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((3 + j2) == 5) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j + j2), (j.value() == 5) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( (j - 1) == 4 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j - 1) == 4) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j - j1), (j.value() == 4) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( (j * 2) == 8 );
 | 
			
		||||
    BOOST_TEST( (4 * j2) == 8 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j * 2) == 8) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((4 * j2) == 8) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j * j2), (j.value() == 8) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( (j / 2) == 4 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j / 2) == 4) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j / j2), (j.value() == 4) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( (j % 3) == 1 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j % 3) == 1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j % ( j - j1 )), (j.value() == 1) );
 | 
			
		||||
    
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j2 + j2), (j.value() == 4) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( (1 | j2 | j) == 7 );
 | 
			
		||||
    BOOST_TEST( (j1 | 2 | j) == 7 );
 | 
			
		||||
    BOOST_TEST( (j1 | j2 | 4) == 7 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((1 | j2 | j) == 7) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j1 | 2 | j) == 7) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j1 | j2 | 4) == 7) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j1 | j2 | j), (j.value() == 7) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( (7 & j2) == 2 );
 | 
			
		||||
    BOOST_TEST( (j & 2) == 2 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((7 & j2) == 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j & 2) == 2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j & j2), (j.value() == 2) );
 | 
			
		||||
    
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j | j1), (j.value() == 3) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( (3 ^ j1) == 2 );
 | 
			
		||||
    BOOST_TEST( (j ^ 1) == 2 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((3 ^ j1) == 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j ^ 1) == 2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j ^ j1), (j.value() == 2) );
 | 
			
		||||
    
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = ( j + j1 ) * ( j2 | j1 )), (j.value() == 9) );
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( (j1 << 2) == 4 );
 | 
			
		||||
    BOOST_TEST( (j2 << 1) == 4 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j1 << 2) == 4) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j2 << 1) == 4) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j1 << j2), (j.value() == 4) );
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( (j >> 2) == 1 );
 | 
			
		||||
    BOOST_TEST( (j2 >> 1) == 1 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j >> 2) == 1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>((j2 >> 1) == 1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (j = j2 >> j1), (j.value() == 1) );
 | 
			
		||||
    
 | 
			
		||||
    cout << "Performed tests on MyLong objects.\n";
 | 
			
		||||
@@ -732,22 +777,22 @@ test_main( int , char * [] )
 | 
			
		||||
    MyChar k2(2);
 | 
			
		||||
    MyChar k;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( k1.value() == 1 );
 | 
			
		||||
    BOOST_TEST( k2.value() == 2 );
 | 
			
		||||
    BOOST_TEST( k.value() == 0 );
 | 
			
		||||
    BOOST_CHECK( k1.value() == 1 );
 | 
			
		||||
    BOOST_CHECK( k2.value() == 2 );
 | 
			
		||||
    BOOST_CHECK( k.value() == 0 );
 | 
			
		||||
 | 
			
		||||
    cout << "Created MyChar objects.\n";
 | 
			
		||||
 | 
			
		||||
    PRIVATE_EXPR_TEST( (k = k2), (k.value() == 2) );
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( k2 == k );
 | 
			
		||||
    BOOST_TEST( k1 != k2 );
 | 
			
		||||
    BOOST_TEST( k1 <  k2 );
 | 
			
		||||
    BOOST_TEST( k1 <= k2 );
 | 
			
		||||
    BOOST_TEST( k <= k2 );
 | 
			
		||||
    BOOST_TEST( k2 >  k1 );
 | 
			
		||||
    BOOST_TEST( k2 >= k1 );
 | 
			
		||||
    BOOST_TEST( k2 >= k );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(k2 == k) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(k1 != k2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(k1 <  k2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(k1 <= k2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(k <= k2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(k2 >  k1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(k2 >= k1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(k2 >= k) );
 | 
			
		||||
    
 | 
			
		||||
    cout << "Performed tests on MyChar objects.\n";
 | 
			
		||||
 | 
			
		||||
@@ -755,39 +800,39 @@ test_main( int , char * [] )
 | 
			
		||||
    MyShort l2(2);
 | 
			
		||||
    MyShort l;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( l1.value() == 1 );
 | 
			
		||||
    BOOST_TEST( l2.value() == 2 );
 | 
			
		||||
    BOOST_TEST( l.value() == 0 );
 | 
			
		||||
    BOOST_CHECK( l1.value() == 1 );
 | 
			
		||||
    BOOST_CHECK( l2.value() == 2 );
 | 
			
		||||
    BOOST_CHECK( l.value() == 0 );
 | 
			
		||||
 | 
			
		||||
    cout << "Created MyShort objects.\n";
 | 
			
		||||
 | 
			
		||||
    PRIVATE_EXPR_TEST( (l = l2), (l.value() == 2) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( l2 == l );
 | 
			
		||||
    BOOST_TEST( 2 == l );
 | 
			
		||||
    BOOST_TEST( l2 == 2 );    
 | 
			
		||||
    BOOST_TEST( l == l2 );
 | 
			
		||||
    BOOST_TEST( l1 != l2 );
 | 
			
		||||
    BOOST_TEST( l1 != 2 );
 | 
			
		||||
    BOOST_TEST( 1 != l2 );
 | 
			
		||||
    BOOST_TEST( l1 <  l2 );
 | 
			
		||||
    BOOST_TEST( 1 <  l2 );
 | 
			
		||||
    BOOST_TEST( l1 <  2 );
 | 
			
		||||
    BOOST_TEST( l1 <= l2 );
 | 
			
		||||
    BOOST_TEST( 1 <= l2 );
 | 
			
		||||
    BOOST_TEST( l1 <= l );
 | 
			
		||||
    BOOST_TEST( l <= l2 );
 | 
			
		||||
    BOOST_TEST( 2 <= l2 );
 | 
			
		||||
    BOOST_TEST( l <= 2 );
 | 
			
		||||
    BOOST_TEST( l2 >  l1 );
 | 
			
		||||
    BOOST_TEST( 2 >  l1 );
 | 
			
		||||
    BOOST_TEST( l2 >  1 );
 | 
			
		||||
    BOOST_TEST( l2 >= l1 );
 | 
			
		||||
    BOOST_TEST( 2 >= l1 );
 | 
			
		||||
    BOOST_TEST( l2 >= 1 );
 | 
			
		||||
    BOOST_TEST( l2 >= l );
 | 
			
		||||
    BOOST_TEST( 2 >= l );
 | 
			
		||||
    BOOST_TEST( l2 >= 2 );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l2 == l) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 == l) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l2 == 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l == l2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l1 != l2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l1 != 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 != l2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l1 <  l2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 <  l2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l1 <  2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l1 <= l2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 <= l2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l1 <= l) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l <= l2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 <= l2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l <= 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l2 >  l1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 >  l1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l2 >  1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l2 >= l1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 >= l1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l2 >= 1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l2 >= l) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 >= l) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(l2 >= 2) );
 | 
			
		||||
    
 | 
			
		||||
    cout << "Performed tests on MyShort objects.\n";
 | 
			
		||||
    
 | 
			
		||||
@@ -797,46 +842,46 @@ test_main( int , char * [] )
 | 
			
		||||
    MyDoubleInt di;
 | 
			
		||||
    MyDoubleInt tmp;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( di1.value() == 1 );
 | 
			
		||||
    BOOST_TEST( di2.value() == 2 );
 | 
			
		||||
    BOOST_TEST( di2.value() == 2 );
 | 
			
		||||
    BOOST_TEST( di.value() == 0 );
 | 
			
		||||
    BOOST_CHECK( di1.value() == 1 );
 | 
			
		||||
    BOOST_CHECK( di2.value() == 2 );
 | 
			
		||||
    BOOST_CHECK( di2.value() == 2 );
 | 
			
		||||
    BOOST_CHECK( di.value() == 0 );
 | 
			
		||||
 | 
			
		||||
    cout << "Created MyDoubleInt objects.\n";
 | 
			
		||||
 | 
			
		||||
    PRIVATE_EXPR_TEST( (di = di2), (di.value() == 2) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( di2 == di );
 | 
			
		||||
    BOOST_TEST( 2 == di );
 | 
			
		||||
    BOOST_TEST( di == 2 );
 | 
			
		||||
    BOOST_TEST( di1 < di2 );
 | 
			
		||||
    BOOST_TEST( 1 < di2 );
 | 
			
		||||
    BOOST_TEST( di1 <= di2 );
 | 
			
		||||
    BOOST_TEST( 1 <= di2 );
 | 
			
		||||
    BOOST_TEST( di2 > di1 );
 | 
			
		||||
    BOOST_TEST( di2 > 1 );
 | 
			
		||||
    BOOST_TEST( di2 >= di1 );
 | 
			
		||||
    BOOST_TEST( di2 >= 1 );
 | 
			
		||||
    BOOST_TEST( di1 / di2 == half );
 | 
			
		||||
    BOOST_TEST( di1 / 2 == half );
 | 
			
		||||
    BOOST_TEST( 1 / di2 == half );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), ((tmp/=2) == half) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), ((tmp/=di2) == half) );
 | 
			
		||||
    BOOST_TEST( di1 * di2 == di2 );
 | 
			
		||||
    BOOST_TEST( di1 * 2 == di2 );
 | 
			
		||||
    BOOST_TEST( 1 * di2 == di2 );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), ((tmp*=2) == di2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), ((tmp*=di2) == di2) );
 | 
			
		||||
    BOOST_TEST( di2 - di1 == di1 );
 | 
			
		||||
    BOOST_TEST( di2 - 1 == di1 );
 | 
			
		||||
    BOOST_TEST( 2 - di1 == di1 );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di2), ((tmp-=1) == di1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di2), ((tmp-=di1) == di1) );
 | 
			
		||||
    BOOST_TEST( di1 + di1 == di2 );
 | 
			
		||||
    BOOST_TEST( di1 + 1 == di2 );
 | 
			
		||||
    BOOST_TEST( 1 + di1 == di2 );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), ((tmp+=1) == di2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), ((tmp+=di1) == di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di2 == di) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 == di) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di == 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di1 < di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 < di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di1 <= di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 <= di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di2 > di1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di2 > 1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di2 >= di1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di2 >= 1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di1 / di2 == half) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di1 / 2 == half) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 / di2 == half) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), static_cast<bool>((tmp/=2) == half) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), static_cast<bool>((tmp/=di2) == half) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di1 * di2 == di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di1 * 2 == di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 * di2 == di2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), static_cast<bool>((tmp*=2) == di2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), static_cast<bool>((tmp*=di2) == di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di2 - di1 == di1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di2 - 1 == di1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 - di1 == di1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di2), static_cast<bool>((tmp-=1) == di1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di2), static_cast<bool>((tmp-=di1) == di1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di1 + di1 == di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(di1 + 1 == di2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 + di1 == di2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), static_cast<bool>((tmp+=1) == di2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp=di1), static_cast<bool>((tmp+=di1) == di2) );
 | 
			
		||||
 | 
			
		||||
    cout << "Performed tests on MyDoubleInt objects.\n";
 | 
			
		||||
 | 
			
		||||
@@ -845,50 +890,50 @@ test_main( int , char * [] )
 | 
			
		||||
    MyLongInt li;
 | 
			
		||||
    MyLongInt tmp2;
 | 
			
		||||
 | 
			
		||||
    BOOST_TEST( li1.value() == 1 );
 | 
			
		||||
    BOOST_TEST( li2.value() == 2 );
 | 
			
		||||
    BOOST_TEST( li.value() == 0 );
 | 
			
		||||
    BOOST_CHECK( li1.value() == 1 );
 | 
			
		||||
    BOOST_CHECK( li2.value() == 2 );
 | 
			
		||||
    BOOST_CHECK( li.value() == 0 );
 | 
			
		||||
 | 
			
		||||
    cout << "Created MyLongInt objects.\n";
 | 
			
		||||
 | 
			
		||||
    PRIVATE_EXPR_TEST( (li = li2), (li.value() == 2) );
 | 
			
		||||
    
 | 
			
		||||
    BOOST_TEST( li2 == li );
 | 
			
		||||
    BOOST_TEST( 2 == li );
 | 
			
		||||
    BOOST_TEST( li == 2 );
 | 
			
		||||
    BOOST_TEST( li1 < li2 );
 | 
			
		||||
    BOOST_TEST( 1 < li2 );
 | 
			
		||||
    BOOST_TEST( li1 <= li2 );
 | 
			
		||||
    BOOST_TEST( 1 <= li2 );
 | 
			
		||||
    BOOST_TEST( li2 > li1 );
 | 
			
		||||
    BOOST_TEST( li2 > 1 );
 | 
			
		||||
    BOOST_TEST( li2 >= li1 );
 | 
			
		||||
    BOOST_TEST( li2 >= 1 );
 | 
			
		||||
    BOOST_TEST( li1 % li2 == li1 );
 | 
			
		||||
    BOOST_TEST( li1 % 2 == li1 );
 | 
			
		||||
    BOOST_TEST( 1 % li2 == li1 );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), ((tmp2%=2) == li1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), ((tmp2%=li2) == li1) );
 | 
			
		||||
    BOOST_TEST( li1 / li2 == 0 );
 | 
			
		||||
    BOOST_TEST( li1 / 2 == 0 );
 | 
			
		||||
    BOOST_TEST( 1 / li2 == 0 );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), ((tmp2/=2) == 0) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), ((tmp2/=li2) == 0) );
 | 
			
		||||
    BOOST_TEST( li1 * li2 == li2 );
 | 
			
		||||
    BOOST_TEST( li1 * 2 == li2 );
 | 
			
		||||
    BOOST_TEST( 1 * li2 == li2 );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), ((tmp2*=2) == li2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), ((tmp2*=li2) == li2) );
 | 
			
		||||
    BOOST_TEST( li2 - li1 == li1 );
 | 
			
		||||
    BOOST_TEST( li2 - 1 == li1 );
 | 
			
		||||
    BOOST_TEST( 2 - li1 == li1 );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li2), ((tmp2-=1) == li1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li2), ((tmp2-=li1) == li1) );
 | 
			
		||||
    BOOST_TEST( li1 + li1 == li2 );
 | 
			
		||||
    BOOST_TEST( li1 + 1 == li2 );
 | 
			
		||||
    BOOST_TEST( 1 + li1 == li2 );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), ((tmp2+=1) == li2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), ((tmp2+=li1) == li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li2 == li) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 == li) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li == 2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 < li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 < li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 <= li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 <= li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li2 > li1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li2 > 1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li2 >= li1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li2 >= 1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 % li2 == li1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 % 2 == li1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 % li2 == li1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), static_cast<bool>((tmp2%=2) == li1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), static_cast<bool>((tmp2%=li2) == li1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 / li2 == 0) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 / 2 == 0) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 / li2 == 0) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), static_cast<bool>((tmp2/=2) == 0) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), static_cast<bool>((tmp2/=li2) == 0) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 * li2 == li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 * 2 == li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 * li2 == li2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), static_cast<bool>((tmp2*=2) == li2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), static_cast<bool>((tmp2*=li2) == li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li2 - li1 == li1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li2 - 1 == li1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(2 - li1 == li1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li2), static_cast<bool>((tmp2-=1) == li1) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li2), static_cast<bool>((tmp2-=li1) == li1) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 + li1 == li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(li1 + 1 == li2) );
 | 
			
		||||
    BOOST_CHECK( static_cast<bool>(1 + li1 == li2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), static_cast<bool>((tmp2+=1) == li2) );
 | 
			
		||||
    PRIVATE_EXPR_TEST( (tmp2=li1), static_cast<bool>((tmp2+=li1) == li2) );
 | 
			
		||||
 | 
			
		||||
    cout << "Performed tests on MyLongInt objects.\n";
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,177 +0,0 @@
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
 | 
			
		||||
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
<title>Permutation Iterator Adaptor Documentation</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
        
 | 
			
		||||
<h1>Permutation Iterator Adaptor</h1>
 | 
			
		||||
<p>Defined in header <a href="../../boost/permutation_iterator.hpp">boost/permutation_iterator.hpp</a></p>
 | 
			
		||||
<p>The permutation iterator adaptor provides an iterator to a permutation of a given range.
 | 
			
		||||
(<a href="http://www.cut-the-knot.com/do_you_know/permutation.html">see definition of permutation</a>).
 | 
			
		||||
The adaptor takes two arguments
 | 
			
		||||
<ul>
 | 
			
		||||
<li>an iterator to the range V on which the <a href="http://www.cut-the-knot.com/do_you_know/permutation.html">permutation</a> will be applied</li>
 | 
			
		||||
<li>the reindexing scheme that defines how the elements of V will be permuted.</li>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
<p>Note that the permutation iterator is not limited to strict permutations of the given range V. 
 | 
			
		||||
The distance between begin and end of the reindexing iterators is allowed to be smaller compared to the 
 | 
			
		||||
size of the range V, in which case the permutation iterator only provides a permutation of a subrange of V. 
 | 
			
		||||
The indexes neither need to be unique. In this same context, it must be noted that the past the end permutation iterator is 
 | 
			
		||||
completely defined by means of the past-the-end iterator to the indices</p> 
 | 
			
		||||
 | 
			
		||||
<h2>Synopsis</h2>
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
namespace boost {
 | 
			
		||||
  template <class IndexIterator>
 | 
			
		||||
  class permutation_iterator_policies;
 | 
			
		||||
 | 
			
		||||
  template <class ElementIterator, class IndexIterator>
 | 
			
		||||
  class permutation_iterator_generator;
 | 
			
		||||
 | 
			
		||||
  template <class ElementIterator, class IndexIterator>
 | 
			
		||||
  typename permutation_iterator_generator<ElementIterator, IndexIterator>::type
 | 
			
		||||
  make_permutation_iterator(ElementIterator& base, IndexIterator& indexing);
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h2>The Permutation Iterator Generator Class Template</h2>
 | 
			
		||||
 | 
			
		||||
<p>The <code>permutation_iterator_generator</code> is a helper class whose purpose
 | 
			
		||||
is to construct a permutation iterator <strong>type</strong>. This class has
 | 
			
		||||
two template arguments, the first being the iterator type over the range V, the
 | 
			
		||||
second being the type of the iterator over the indices.
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
template <class ElementIterator, class IndexIterator>
 | 
			
		||||
class permutation_iterator_generator
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  typedef <a href="iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...> type; // the resulting permutation iterator type 
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
<table border>
 | 
			
		||||
<tr>
 | 
			
		||||
<th>Parameter</th>
 | 
			
		||||
<th>Description</th>
 | 
			
		||||
</tr>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td><tt>ElementIterator</tt></td>
 | 
			
		||||
<td>The iterator over the elements to be permuted. This type must be a model
 | 
			
		||||
of <a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">RandomAccessIterator</a></td>
 | 
			
		||||
</td>
 | 
			
		||||
 | 
			
		||||
<tr>
 | 
			
		||||
<td><tt>IndexIterator</tt></td>
 | 
			
		||||
<td>The iterator over the new indexing scheme. This type must at least be a model
 | 
			
		||||
of <a href="http://www.sgi.com/tech/stl/ForwardIterator.html">ForwardIterator</a>.
 | 
			
		||||
The <code>IndexIterator::value_type</code> must be convertible to the 
 | 
			
		||||
<code>ElementIterator::difference_type</code>.</td>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
<h3>Concept Model</h3>
 | 
			
		||||
The permutation iterator is always a model of the same concept as the IndexIterator.
 | 
			
		||||
 | 
			
		||||
<h3>Members</h3>
 | 
			
		||||
The permutation iterator implements the member functions
 | 
			
		||||
and operators required for the 
 | 
			
		||||
<a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random Access Iterator</a>
 | 
			
		||||
concept. However, the permutation iterator can only meet the complexity guarantees 
 | 
			
		||||
of the same concept as the IndexIterator. Thus for instance, although the permutation
 | 
			
		||||
iterator provides <code>operator+=(distance)</code>, this operation will take linear time
 | 
			
		||||
in case the IndexIterator is a model of ForwardIterator instead of amortized constant time.
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
 | 
			
		||||
<h2><a name="make_generator_iterator">The Permutation Iterator Object Generator</a></h2>
 | 
			
		||||
 | 
			
		||||
The <code>make_permutation_iterator()</code> function provides a
 | 
			
		||||
convenient way to create permutation iterator objects. The function
 | 
			
		||||
saves the user the trouble of explicitly writing out the iterator
 | 
			
		||||
types.
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
template <class ElementIterator, class IndexIterator >
 | 
			
		||||
typename permutation_iterator_generator<ElementIterator, IndexIterator>::type
 | 
			
		||||
make_permutation_iterator(ElementIterator& base, IndexIterator& indices);
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
<h2>Example</h2>
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
  using namespace boost;
 | 
			
		||||
  int i = 0;
 | 
			
		||||
 | 
			
		||||
  typedef std::vector< int > element_range_type;
 | 
			
		||||
  typedef std::list< int > index_type;
 | 
			
		||||
 | 
			
		||||
  static const int element_range_size = 10;
 | 
			
		||||
  static const int index_size = 4;
 | 
			
		||||
 | 
			
		||||
  element_range_type elements( element_range_size );
 | 
			
		||||
  for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it) *el_it = std::distance(elements.begin(), el_it);
 | 
			
		||||
 | 
			
		||||
  index_type indices( index_size );
 | 
			
		||||
  for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it ) *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it);
 | 
			
		||||
  std::reverse( indices.begin(), indices.end() );
 | 
			
		||||
 | 
			
		||||
  typedef permutation_iterator_generator< element_range_type::iterator, index_type::iterator >::type permutation_type;
 | 
			
		||||
  permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() );
 | 
			
		||||
  permutation_type it = begin;
 | 
			
		||||
  permutation_type end = make_permutation_iterator( elements.begin(), indices.end() );
 | 
			
		||||
 | 
			
		||||
  std::cout << "The original range is : ";
 | 
			
		||||
  std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) );
 | 
			
		||||
  std::cout << "\n";
 | 
			
		||||
 | 
			
		||||
  std::cout << "The reindexing scheme is : ";
 | 
			
		||||
  std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) );
 | 
			
		||||
  std::cout << "\n";
 | 
			
		||||
 | 
			
		||||
  std::cout << "The permutated range is : ";
 | 
			
		||||
  std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) );
 | 
			
		||||
  std::cout << "\n";
 | 
			
		||||
 | 
			
		||||
  std::cout << "Elements at even indices in the permutation : ";
 | 
			
		||||
  it = begin;
 | 
			
		||||
  for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " ";
 | 
			
		||||
  std::cout << "\n";
 | 
			
		||||
 | 
			
		||||
  std::cout << "Permutation backwards : ";
 | 
			
		||||
  it = begin + (index_size);
 | 
			
		||||
  assert( it != begin );
 | 
			
		||||
  for( ; it-- != begin ; ) std::cout << *it << " ";
 | 
			
		||||
  std::cout << "\n";
 | 
			
		||||
 | 
			
		||||
  std::cout << "Iterate backward with stride 2 : ";
 | 
			
		||||
  it = begin + (index_size - 1);
 | 
			
		||||
  for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " ";
 | 
			
		||||
  std::cout << "\n";
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
<br><br><br><hr>
 | 
			
		||||
Thanks: The permutation iterator is only a small addition to the superb iterator adaptors
 | 
			
		||||
library of David Abrahams and Jeremy Siek.
 | 
			
		||||
<br><br>
 | 
			
		||||
 | 
			
		||||
Copyright 2001 Toon Knapen.
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,391 +0,0 @@
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 | 
			
		||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
 | 
			
		||||
<meta name="ProgId" content="FrontPage.Editor.Document">
 | 
			
		||||
<title>Projection Iterator Adaptor Documentation</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
 | 
			
		||||
<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)"
 | 
			
		||||
align="center" width="277" height="86">
 | 
			
		||||
 | 
			
		||||
<h1>Projection Iterator Adaptor</h1>
 | 
			
		||||
 | 
			
		||||
Defined in header
 | 
			
		||||
<a href="../../boost/iterator_adaptors.hpp">boost/iterator_adaptors.hpp</a>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The projection iterator adaptor is similar to the <a
 | 
			
		||||
href="./transform_iterator.htm">transform iterator adaptor</a> in that
 | 
			
		||||
its <tt>operator*()</tt> applies some function to the result of
 | 
			
		||||
dereferencing the base iterator and then returns the result. The
 | 
			
		||||
difference is that the function must return a reference to some
 | 
			
		||||
existing object (for example, a data member within the
 | 
			
		||||
<tt>value_type</tt> of the base iterator). The following
 | 
			
		||||
<b>pseudo-code</b> gives the basic idea. The data member <tt>p</tt> is
 | 
			
		||||
the function object.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
  reference projection_iterator::operator*() const {
 | 
			
		||||
    return this->p(*this->base_iterator);
 | 
			
		||||
  }
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h2>Synopsis</h2>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
namespace boost {
 | 
			
		||||
  template <class <a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html">AdaptableUnaryFunction</a>, class BaseIterator>
 | 
			
		||||
  struct projection_iterator_generator;
 | 
			
		||||
  
 | 
			
		||||
  template <class <a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html">AdaptableUnaryFunction</a>, 
 | 
			
		||||
            class BaseIterator, class ConstBaseIterator>
 | 
			
		||||
  struct projection_iterator_pair_generator;
 | 
			
		||||
 | 
			
		||||
  template <class <a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html">AdaptableUnaryFunction</a>, class BaseIterator>
 | 
			
		||||
  typename projection_iterator_generator<AdaptableUnaryFunction, BaseIterator>::type
 | 
			
		||||
  make_projection_iterator(BaseIterator base,
 | 
			
		||||
			   const AdaptableUnaryFunction& p = AdaptableUnaryFunction())
 | 
			
		||||
 | 
			
		||||
  template <class <a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html">AdaptableUnaryFunction</a>, class ConstBaseIterator>
 | 
			
		||||
  typename projection_iterator_generator<AdaptableUnaryFunction, ConstBaseIterator>::type
 | 
			
		||||
  make_const_projection_iterator(ConstBaseIterator base,
 | 
			
		||||
                                 const AdaptableUnaryFunction& p = AdaptableUnaryFunction())  
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
<h2><a name="projection_iterator_generator">The Projection Iterator Type
 | 
			
		||||
Generator</a></h2>
 | 
			
		||||
 | 
			
		||||
The class <tt>projection_iterator_generator</tt> is a helper class
 | 
			
		||||
whose purpose is to construct an projection iterator type.  The main
 | 
			
		||||
template parameter for this class is the <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html"><tt>AdaptableUnaryFunction</tt></a>
 | 
			
		||||
function object type and the <tt>BaseIterator</tt> type that is being
 | 
			
		||||
wrapped.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
template <class <a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html">AdaptableUnaryFunction</a>, class BaseIterator>
 | 
			
		||||
class projection_iterator_generator
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  typedef <tt><a href="./iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...></tt> type; // the resulting projection iterator type 
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
In the following example we have a list of personnel records. Each
 | 
			
		||||
record has an employee's name and ID number. We want to be able to
 | 
			
		||||
traverse through the list accessing either the name or the ID numbers
 | 
			
		||||
of the employees using the projection iterator so we create the
 | 
			
		||||
function object classes <tt>select_name</tt> and
 | 
			
		||||
<tt>select_ID</tt>. We then use the
 | 
			
		||||
<tt>projection_iterator_generator</tt> class to create a projection
 | 
			
		||||
iterator and use it to print out the names of the employees.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <list>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <boost/iterator_adaptors.hpp>
 | 
			
		||||
 | 
			
		||||
struct personnel_record {
 | 
			
		||||
  personnel_record(std::string n, int id) : m_name(n), m_ID(id) { }
 | 
			
		||||
  std::string m_name;
 | 
			
		||||
  int m_ID;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct select_name {
 | 
			
		||||
  typedef personnel_record argument_type;
 | 
			
		||||
  typedef std::string result_type;
 | 
			
		||||
  const std::string& operator()(const personnel_record& r) const {
 | 
			
		||||
    return r.m_name;
 | 
			
		||||
  }
 | 
			
		||||
  std::string& operator()(personnel_record& r) const {
 | 
			
		||||
    return r.m_name;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct select_ID {
 | 
			
		||||
  typedef personnel_record argument_type;
 | 
			
		||||
  typedef int result_type;
 | 
			
		||||
  const int& operator()(const personnel_record& r) const {
 | 
			
		||||
    return r.m_ID;
 | 
			
		||||
  }
 | 
			
		||||
  int& operator()(personnel_record& r) const {
 | 
			
		||||
    return r.m_ID;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  std::list<personnel_record> personnel_list;
 | 
			
		||||
 | 
			
		||||
  personnel_list.push_back(personnel_record("Barney", 13423));
 | 
			
		||||
  personnel_list.push_back(personnel_record("Fred", 12343));
 | 
			
		||||
  personnel_list.push_back(personnel_record("Wilma", 62454));
 | 
			
		||||
  personnel_list.push_back(personnel_record("Betty", 20490));
 | 
			
		||||
 | 
			
		||||
  // Example of using projection_iterator_generator
 | 
			
		||||
  // to print out the names in the personnel list.
 | 
			
		||||
 | 
			
		||||
  boost::projection_iterator_generator<select_name,
 | 
			
		||||
    std::list<personnel_record>::iterator>::type
 | 
			
		||||
    personnel_first(personnel_list.begin()),
 | 
			
		||||
    personnel_last(personnel_list.end());
 | 
			
		||||
 | 
			
		||||
  std::copy(personnel_first, personnel_last,
 | 
			
		||||
            std::ostream_iterator<std::string>(std::cout, "\n"));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // to be continued...
 | 
			
		||||
</pre>
 | 
			
		||||
The output for this part is:
 | 
			
		||||
<pre>
 | 
			
		||||
Barney
 | 
			
		||||
Fred
 | 
			
		||||
Wilma
 | 
			
		||||
Betty
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
<Table border>
 | 
			
		||||
<TR>
 | 
			
		||||
<TH>Parameter</TH><TH>Description</TH>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html"><tt>AdaptableUnaryFunction</tt></a></TD>
 | 
			
		||||
<TD>The type of the function object. The <tt>argument_type</tt> of the
 | 
			
		||||
function must match the value type of the base iterator. The function
 | 
			
		||||
should return a reference to the function's <tt>result_type</tt>.
 | 
			
		||||
The <tt>result_type</tt> will be the resulting iterator's <tt>value_type</tt>.
 | 
			
		||||
</TD>
 | 
			
		||||
</TD>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>BaseIterator</tt></TD>
 | 
			
		||||
<TD>The iterator type being wrapped.</TD>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
</Table>
 | 
			
		||||
 | 
			
		||||
<h3>Model of</h3>
 | 
			
		||||
 | 
			
		||||
If the base iterator is a model of <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
Access Iterator</a> then so is the resulting projection iterator.  If
 | 
			
		||||
the base iterator supports less functionality than this the resulting
 | 
			
		||||
projection iterator will also support less functionality.
 | 
			
		||||
 | 
			
		||||
<h3>Members</h3>
 | 
			
		||||
 | 
			
		||||
The projection iterator type implements the member functions and
 | 
			
		||||
operators required of the <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
Access Iterator</a> concept.
 | 
			
		||||
In addition it has the following constructor:
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
projection_iterator_generator::type(const BaseIterator& it,
 | 
			
		||||
                                    const AdaptableUnaryFunction& p = AdaptableUnaryFunction())
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
<hr>
 | 
			
		||||
<p>
 | 
			
		||||
 | 
			
		||||
<h2><a name="projection_iterator_pair_generator">The Projection Iterator Pair
 | 
			
		||||
Generator</a></h2>
 | 
			
		||||
 | 
			
		||||
Sometimes a mutable/const pair of iterator types is needed, such as
 | 
			
		||||
when implementing a container type. The
 | 
			
		||||
<tt>projection_iterator_pair_generator</tt> class makes it more
 | 
			
		||||
convenient to create this pair of iterator types.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
template <class <a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html">AdaptableUnaryFunction</a>, class BaseIterator, class ConstBaseIterator>
 | 
			
		||||
class projection_iterator_pair_generator
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  typedef <tt><a href="./iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...></tt> iterator;       // the mutable projection iterator type 
 | 
			
		||||
  typedef <tt><a href="./iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...></tt> const_iterator; // the immutable projection iterator type 
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
In this part of the example we use the
 | 
			
		||||
<tt>projection_iterator_pair_generator</tt> to create a mutable/const
 | 
			
		||||
pair of projection iterators that access the ID numbers of the
 | 
			
		||||
personnel. We use the mutable iterator to re-index the ID numbers from
 | 
			
		||||
zero. We then use the constant iterator to print the ID numbers out.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
  // continuing from the last example...
 | 
			
		||||
 | 
			
		||||
  typedef boost::projection_iterator_pair_generator<select_ID,
 | 
			
		||||
    std::list<personnel_record>::iterator,
 | 
			
		||||
    std::list<personnel_record>::const_iterator> PairGen;
 | 
			
		||||
 | 
			
		||||
  PairGen::iterator ID_first(personnel_list.begin()),
 | 
			
		||||
    ID_last(personnel_list.end());
 | 
			
		||||
 | 
			
		||||
  int new_id = 0;
 | 
			
		||||
  while (ID_first != ID_last) {
 | 
			
		||||
    *ID_first = new_id++;
 | 
			
		||||
    ++ID_first;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  PairGen::const_iterator const_ID_first(personnel_list.begin()),
 | 
			
		||||
    const_ID_last(personnel_list.end());
 | 
			
		||||
 | 
			
		||||
  std::copy(const_ID_first, const_ID_last,
 | 
			
		||||
            std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  
 | 
			
		||||
  // to be continued...
 | 
			
		||||
</pre>
 | 
			
		||||
The output is:
 | 
			
		||||
<pre>
 | 
			
		||||
0 1 2 3 
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
<Table border>
 | 
			
		||||
<TR>
 | 
			
		||||
<TH>Parameter</TH><TH>Description</TH>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html"><tt>AdaptableUnaryFunction</tt></a></TD>
 | 
			
		||||
<TD>The type of the function object. The <tt>argument_type</tt> of the
 | 
			
		||||
function must match the value type of the base iterator. The function
 | 
			
		||||
should return a true reference to the function's <tt>result_type</tt>.
 | 
			
		||||
The <tt>result_type</tt> will be the resulting iterator's <tt>value_type</tt>.
 | 
			
		||||
</TD>
 | 
			
		||||
</TD>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>BaseIterator</tt></TD>
 | 
			
		||||
<TD>The mutable iterator type being wrapped.</TD>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD><tt>ConstBaseIterator</tt></TD>
 | 
			
		||||
<TD>The constant iterator type being wrapped.</TD>
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
</Table>
 | 
			
		||||
 | 
			
		||||
<h3>Model of</h3>
 | 
			
		||||
 | 
			
		||||
If the base iterator types model the <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
Access Iterator</a> then so do the resulting projection iterator
 | 
			
		||||
types.  If the base iterators support less functionality the
 | 
			
		||||
resulting projection iterator types will also support less
 | 
			
		||||
functionality.  The resulting <tt>iterator</tt> type is mutable, and
 | 
			
		||||
the resulting <tt>const_iterator</tt> type is constant.
 | 
			
		||||
 | 
			
		||||
<h3>Members</h3>
 | 
			
		||||
 | 
			
		||||
The resulting <tt>iterator</tt> and <tt>const_iterator</tt> types
 | 
			
		||||
implements the member functions and operators required of the <a
 | 
			
		||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random
 | 
			
		||||
Access Iterator</a> concept.  In addition they support the following
 | 
			
		||||
constructors:
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
projection_iterator_pair_generator::iterator(const BaseIterator& it,
 | 
			
		||||
                                             const AdaptableUnaryFunction& p = AdaptableUnaryFunction())</pre>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
projection_iterator_pair_generator::const_iterator(const BaseIterator& it,
 | 
			
		||||
                                                   const AdaptableUnaryFunction& p = AdaptableUnaryFunction())
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
<hr>
 | 
			
		||||
<p>
 | 
			
		||||
 | 
			
		||||
<h2><a name="make_projection_iterator">The Projection Iterator Object Generators</a></h2>
 | 
			
		||||
 | 
			
		||||
The <tt>make_projection_iterator()</tt> and
 | 
			
		||||
<tt>make_const_projection_iterator()</tt> functions provide a more
 | 
			
		||||
convenient way to create projection iterator objects. The functions
 | 
			
		||||
save the user the trouble of explicitly writing out the iterator
 | 
			
		||||
types.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
template <class <a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html">AdaptableUnaryFunction</a>, class BaseIterator>
 | 
			
		||||
typename projection_iterator_generator<AdaptableUnaryFunction, BaseIterator>::type
 | 
			
		||||
make_projection_iterator(BaseIterator base,
 | 
			
		||||
			 const AdaptableUnaryFunction& p = AdaptableUnaryFunction())  
 | 
			
		||||
 | 
			
		||||
template <class <a href="http://www.sgi.com/tech/stl/AdaptableUnaryFunction.html">AdaptableUnaryFunction</a>, class ConstBaseIterator>
 | 
			
		||||
typename projection_iterator_generator<AdaptableUnaryFunction, ConstBaseIterator>::type
 | 
			
		||||
make_const_projection_iterator(ConstBaseIterator base,
 | 
			
		||||
			       const AdaptableUnaryFunction& p = AdaptableUnaryFunction())  
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
 | 
			
		||||
In this part of the example, we again print out the names of the
 | 
			
		||||
personnel, but this time we use the
 | 
			
		||||
<tt>make_const_projection_iterator()</tt> function to save some typing.
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
  // continuing from the last example...
 | 
			
		||||
 | 
			
		||||
  std::copy
 | 
			
		||||
    (boost::make_const_projection_iterator<select_name>(personnel_list.begin()),
 | 
			
		||||
     boost::make_const_projection_iterator<select_name>(personnel_list.end()),
 | 
			
		||||
     std::ostream_iterator<std::string>(std::cout, "\n"));
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
The output is:
 | 
			
		||||
<pre>
 | 
			
		||||
Barney
 | 
			
		||||
Fred
 | 
			
		||||
Wilma
 | 
			
		||||
Betty
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
<p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan -->19 Aug 2001<!--webbot bot="Timestamp" endspan i-checksum="14767" --></p>
 | 
			
		||||
<p><EFBFBD> Copyright Jeremy Siek 2000. Permission to copy, use,
 | 
			
		||||
modify, sell and distribute this document is granted provided this copyright
 | 
			
		||||
notice appears in all copies. This document is provided "as is"
 | 
			
		||||
without express or implied warranty, and with no claim as to its suitability for
 | 
			
		||||
any purpose.</p>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
<!--  LocalWords:  html charset alt gif hpp BaseIterator const namespace struct
 | 
			
		||||
 -->
 | 
			
		||||
<!--  LocalWords:  ConstPointer ConstReference typename iostream int abcdefg
 | 
			
		||||
 -->
 | 
			
		||||
<!--  LocalWords:  sizeof  PairGen pre Siek htm AdaptableUnaryFunction
 | 
			
		||||
 -->
 | 
			
		||||
<!--  LocalWords:  ConstBaseIterator
 | 
			
		||||
 -->
 | 
			
		||||
@@ -1,103 +0,0 @@
 | 
			
		||||
// (C) Copyright Jeremy Siek 2000. 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.
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <list>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <boost/iterator/transform_iterator.hpp>
 | 
			
		||||
 | 
			
		||||
struct personnel_record {
 | 
			
		||||
  personnel_record(std::string n, int id) : m_name(n), m_ID(id) { }
 | 
			
		||||
  std::string m_name;
 | 
			
		||||
  int m_ID;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct select_name {
 | 
			
		||||
  typedef personnel_record argument_type;
 | 
			
		||||
  typedef std::string const& result_type;
 | 
			
		||||
  const std::string& operator()(const personnel_record& r) const {
 | 
			
		||||
    return r.m_name;
 | 
			
		||||
  }
 | 
			
		||||
  std::string& operator()(personnel_record& r) const {
 | 
			
		||||
    return r.m_name;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct select_ID {
 | 
			
		||||
  typedef personnel_record argument_type;
 | 
			
		||||
  typedef int& result_type;
 | 
			
		||||
  const int& operator()(const personnel_record& r) const {
 | 
			
		||||
    return r.m_ID;
 | 
			
		||||
  }
 | 
			
		||||
  int& operator()(personnel_record& r) const {
 | 
			
		||||
    return r.m_ID;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  std::list<personnel_record> personnel_list;
 | 
			
		||||
 | 
			
		||||
  personnel_list.push_back(personnel_record("Barney", 13423));
 | 
			
		||||
  personnel_list.push_back(personnel_record("Fred", 12343));
 | 
			
		||||
  personnel_list.push_back(personnel_record("Wilma", 62454));
 | 
			
		||||
  personnel_list.push_back(personnel_record("Betty", 20490));
 | 
			
		||||
 | 
			
		||||
  // Example of using transform_iterator to print out the names in the
 | 
			
		||||
  // personnel list using a projection.
 | 
			
		||||
 | 
			
		||||
  boost::transform_iterator<
 | 
			
		||||
      select_name
 | 
			
		||||
    , std::list<personnel_record>::iterator
 | 
			
		||||
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
    , std::string
 | 
			
		||||
#endif 
 | 
			
		||||
  >
 | 
			
		||||
    personnel_first(personnel_list.begin()),
 | 
			
		||||
    personnel_last(personnel_list.end());
 | 
			
		||||
 | 
			
		||||
  std::copy(personnel_first, personnel_last,
 | 
			
		||||
            std::ostream_iterator<std::string>(std::cout, "\n"));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  
 | 
			
		||||
  // Example of using transform_iterator with const_iterators to
 | 
			
		||||
  // assign new ID numbers to the personnel.
 | 
			
		||||
  
 | 
			
		||||
  boost::transform_iterator<
 | 
			
		||||
      select_ID, std::list<personnel_record>::iterator
 | 
			
		||||
 > ID_first(personnel_list.begin()),
 | 
			
		||||
    ID_last(personnel_list.end());
 | 
			
		||||
 | 
			
		||||
  int new_id = 0;
 | 
			
		||||
  while (ID_first != ID_last) {
 | 
			
		||||
    *ID_first = new_id++;
 | 
			
		||||
    ++ID_first;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    boost::transform_iterator<
 | 
			
		||||
      select_ID, std::list<personnel_record>::const_iterator, int const&
 | 
			
		||||
    >
 | 
			
		||||
    const_ID_first(personnel_list.begin()),
 | 
			
		||||
    const_ID_last(personnel_list.end());
 | 
			
		||||
 | 
			
		||||
  std::copy(const_ID_first, const_ID_last,
 | 
			
		||||
            std::ostream_iterator<int>(std::cout, " "));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
  // Example of using make_const_projection_iterator()
 | 
			
		||||
  // to print out the names in the personnel list again.
 | 
			
		||||
  std::copy(
 | 
			
		||||
      boost::make_transform_iterator<select_name>(personnel_list.begin())
 | 
			
		||||
    , boost::make_transform_iterator<select_name>(personnel_list.end())
 | 
			
		||||
    , std::ostream_iterator<std::string>(std::cout, "\n"));
 | 
			
		||||
#endif
 | 
			
		||||
  
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,9 +1,18 @@
 | 
			
		||||
// Copyright David Abrahams and Aleksey Gurtovoy
 | 
			
		||||
// 2002-2004. 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)
 | 
			
		||||
 | 
			
		||||
// compile-time test for "boost/ref.hpp" header content
 | 
			
		||||
// see 'ref_test.cpp' for run-time part
 | 
			
		||||
 | 
			
		||||
#include <boost/ref.hpp>
 | 
			
		||||
#include <boost/type_traits/same_traits.hpp>
 | 
			
		||||
#include <boost/type_traits/is_same.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_const.hpp>
 | 
			
		||||
#include <boost/static_assert.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/mpl/assert.hpp>
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
@@ -30,13 +39,23 @@ void is_reference_wrapper_test(T)
 | 
			
		||||
template< typename R, typename Ref >
 | 
			
		||||
void cxx_reference_test(Ref)
 | 
			
		||||
{
 | 
			
		||||
#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
 | 
			
		||||
    typedef typename boost::remove_const<Ref>::type ref;
 | 
			
		||||
    BOOST_STATIC_ASSERT((boost::is_same<R,ref>::value));
 | 
			
		||||
#else
 | 
			
		||||
    BOOST_STATIC_ASSERT((boost::is_same<R,Ref>::value));
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< typename R, typename Ref >
 | 
			
		||||
void unwrap_reference_test(Ref)
 | 
			
		||||
{
 | 
			
		||||
#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
 | 
			
		||||
    typedef typename boost::remove_const<Ref>::type ref;
 | 
			
		||||
    typedef typename boost::unwrap_reference<ref>::type type;
 | 
			
		||||
#else
 | 
			
		||||
    typedef typename boost::unwrap_reference<Ref>::type type;
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_STATIC_ASSERT((boost::is_same<R,type>::value));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										55
									
								
								ref_test.cpp
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								ref_test.cpp
									
									
									
									
									
								
							@@ -1,3 +1,7 @@
 | 
			
		||||
// Copyright David Abrahams and Aleksey Gurtovoy
 | 
			
		||||
// 2002-2004. 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)
 | 
			
		||||
 | 
			
		||||
// run-time test for "boost/ref.hpp" header content
 | 
			
		||||
// see 'ref_ct_test.cpp' for compile-time part
 | 
			
		||||
@@ -56,19 +60,62 @@ struct ref_wrapper
 | 
			
		||||
 | 
			
		||||
    static void test(T x)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_TEST(passthru(ref(x)) == &x);
 | 
			
		||||
        BOOST_TEST(&ref(x).get() == &x);
 | 
			
		||||
        BOOST_CHECK(passthru(ref(x)) == &x);
 | 
			
		||||
        BOOST_CHECK(&ref(x).get() == &x);
 | 
			
		||||
 | 
			
		||||
        BOOST_TEST(cref_passthru(cref(x)) == &x);
 | 
			
		||||
        BOOST_TEST(&cref(x).get() == &x);
 | 
			
		||||
        BOOST_CHECK(cref_passthru(cref(x)) == &x);
 | 
			
		||||
        BOOST_CHECK(&cref(x).get() == &x);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct copy_counter {
 | 
			
		||||
  static int count_;
 | 
			
		||||
  copy_counter(copy_counter const& /*other*/) {
 | 
			
		||||
    ++count_;
 | 
			
		||||
  }
 | 
			
		||||
  copy_counter() {}
 | 
			
		||||
  static void reset() { count_ = 0; }
 | 
			
		||||
  static int count() { return copy_counter::count_;  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int copy_counter::count_ = 0;
 | 
			
		||||
 | 
			
		||||
} // namespace unnamed
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
void do_unwrap(T t) {
 | 
			
		||||
 | 
			
		||||
  /* typename unwrap_reference<T>::type& lt = */
 | 
			
		||||
  unwrap_ref(t);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void unwrap_test() {
 | 
			
		||||
 | 
			
		||||
  int i = 3;
 | 
			
		||||
  const int ci = 2;
 | 
			
		||||
 | 
			
		||||
  do_unwrap(i);
 | 
			
		||||
  do_unwrap(ci);
 | 
			
		||||
  do_unwrap(ref(i));
 | 
			
		||||
  do_unwrap(cref(ci));
 | 
			
		||||
  do_unwrap(ref(ci));
 | 
			
		||||
 | 
			
		||||
  copy_counter cc;
 | 
			
		||||
  BOOST_CHECK(cc.count() == 0);
 | 
			
		||||
 | 
			
		||||
  do_unwrap(cc);
 | 
			
		||||
  do_unwrap(ref(cc));
 | 
			
		||||
  do_unwrap(cref(cc));
 | 
			
		||||
 | 
			
		||||
  BOOST_CHECK(cc.count() == 1);
 | 
			
		||||
  BOOST_CHECK(unwrap_ref(ref(cc)).count() == 1); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int test_main(int, char * [])
 | 
			
		||||
{
 | 
			
		||||
    ref_wrapper<int>::test(1);
 | 
			
		||||
    ref_wrapper<int const>::test(1);
 | 
			
		||||
    unwrap_test();
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,331 +0,0 @@
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
 | 
			
		||||
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
    <meta name="generator" content="HTML Tidy, see www.w3.org">
 | 
			
		||||
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 | 
			
		||||
    <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
 | 
			
		||||
    <meta name="ProgId" content="FrontPage.Editor.Document">
 | 
			
		||||
 | 
			
		||||
    <title>Reverse Iterator Adaptor Documentation</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
    <img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align=
 | 
			
		||||
    "center" width="277" height="86"> 
 | 
			
		||||
 | 
			
		||||
    <h1>Reverse Iterator Adaptor</h1>
 | 
			
		||||
    Defined in header <a href=
 | 
			
		||||
    "../../boost/iterator_adaptors.hpp">boost/iterator_adaptors.hpp</a> 
 | 
			
		||||
 | 
			
		||||
    <p>The reverse iterator adaptor flips the direction of a base iterator's
 | 
			
		||||
    motion. Invoking <tt>operator++()</tt> moves the base iterator backward and
 | 
			
		||||
    invoking <tt>operator--()</tt> moves the base iterator forward. The Boost
 | 
			
		||||
    reverse iterator adaptor is better to use than the
 | 
			
		||||
    <tt>std::reverse_iterator</tt> class in situations where pairs of
 | 
			
		||||
    mutable/constant iterators are needed (e.g., in containers) because
 | 
			
		||||
    comparisons and conversions between the mutable and const versions are
 | 
			
		||||
    implemented correctly.
 | 
			
		||||
 | 
			
		||||
    <h2>Synopsis</h2>
 | 
			
		||||
<pre>
 | 
			
		||||
namespace boost {
 | 
			
		||||
  template <class <a href=
 | 
			
		||||
"http://www.sgi.com/tech/stl/BidirectionalIterator.html">BidirectionalIterator</a>,
 | 
			
		||||
            class Value, class Reference, class Pointer, class Category, class Distance>
 | 
			
		||||
  struct reverse_iterator_generator;
 | 
			
		||||
  
 | 
			
		||||
  template <class <a href=
 | 
			
		||||
"http://www.sgi.com/tech/stl/BidirectionalIterator.html">BidirectionalIterator</a>>
 | 
			
		||||
  typename reverse_iterator_generator<BidirectionalIterator>::type
 | 
			
		||||
  make_reverse_iterator(BidirectionalIterator base)  
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="reverse_iterator_generator">The Reverse Iterator Type
 | 
			
		||||
    Generator</a></h2>
 | 
			
		||||
    The <tt>reverse_iterator_generator</tt> template is a <a href=
 | 
			
		||||
    "../../more/generic_programming.html#type_generator">generator</a> of
 | 
			
		||||
    reverse iterator types. The main template parameter for this class is the
 | 
			
		||||
    base <tt>BidirectionalIterator</tt> type that is being adapted. In most
 | 
			
		||||
    cases the associated types of the base iterator can be deduced using
 | 
			
		||||
    <tt>std::iterator_traits</tt>, but in some situations the user may want to
 | 
			
		||||
    override these types, so there are also template parameters for the base
 | 
			
		||||
    iterator's associated types. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
template <class <a href=
 | 
			
		||||
"http://www.sgi.com/tech/stl/BidirectionalIterator.html">BidirectionalIterator</a>,
 | 
			
		||||
          class Value, class Reference, class Pointer, class Category, class Distance>
 | 
			
		||||
class reverse_iterator_generator
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  typedef <tt><a href=
 | 
			
		||||
"./iterator_adaptors.htm#iterator_adaptor">iterator_adaptor</a><...></tt> type; // the resulting reverse iterator type 
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h3>Example</h3>
 | 
			
		||||
    In this example we sort a sequence of letters and then output the sequence
 | 
			
		||||
    in descending order using reverse iterators. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <boost/iterator_adaptors.hpp>
 | 
			
		||||
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  char letters[] = "hello world!";
 | 
			
		||||
  const int N = sizeof(letters)/sizeof(char) - 1;
 | 
			
		||||
  std::cout << "original sequence of letters:\t"
 | 
			
		||||
      << letters << std::endl;
 | 
			
		||||
 | 
			
		||||
  std::sort(letters, letters + N);
 | 
			
		||||
 | 
			
		||||
  // Use reverse_iterator_generator to print a sequence
 | 
			
		||||
  // of letters in reverse order.
 | 
			
		||||
  
 | 
			
		||||
  boost::reverse_iterator_generator<char*>::type
 | 
			
		||||
    reverse_letters_first(letters + N),
 | 
			
		||||
    reverse_letters_last(letters);
 | 
			
		||||
 | 
			
		||||
  std::cout << "letters in descending order:\t";
 | 
			
		||||
  std::copy(reverse_letters_first, reverse_letters_last,
 | 
			
		||||
      std::ostream_iterator<char>(std::cout));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // to be continued...
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    The output is: 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
original sequence of letters: hello world!
 | 
			
		||||
letters in descending order:  wroolllhed! 
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h3>Template Parameters</h3>
 | 
			
		||||
 | 
			
		||||
    <table border>
 | 
			
		||||
      <tr>
 | 
			
		||||
        <th>Parameter
 | 
			
		||||
 | 
			
		||||
        <th>Description
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt><a href=
 | 
			
		||||
        "http://www.sgi.com/tech/stl/BidirectionalIterator.html">BidirectionalIterator</a></tt>
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        <td>The iterator type being wrapped.
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Value</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The value-type of the base iterator and the resulting reverse
 | 
			
		||||
        iterator.<br>
 | 
			
		||||
         <b>Default:</b><tt>std::iterator_traits<BidirectionalIterator>::value_type</tt>
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Reference</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>reference</tt> type of the resulting iterator, and in
 | 
			
		||||
        particular, the result type of <tt>operator*()</tt>.<br>
 | 
			
		||||
         <b>Default:</b> If <tt>Value</tt> is supplied, <tt>Value&</tt> is
 | 
			
		||||
        used. Otherwise
 | 
			
		||||
        <tt>std::iterator_traits<BidirectionalIterator>::reference</tt>
 | 
			
		||||
        is used.
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Pointer</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>pointer</tt> type of the resulting iterator, and in
 | 
			
		||||
        particular, the result type of <tt>operator->()</tt>.<br>
 | 
			
		||||
         <b>Default:</b> If <tt>Value</tt> was supplied, then <tt>Value*</tt>,
 | 
			
		||||
        otherwise
 | 
			
		||||
        <tt>std::iterator_traits<BidirectionalIterator>::pointer</tt>.
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Category</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>iterator_category</tt> type for the resulting iterator.<br>
 | 
			
		||||
         <b>Default:</b>
 | 
			
		||||
        <tt>std::iterator_traits<BidirectionalIterator>::iterator_category</tt>
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
      <tr>
 | 
			
		||||
        <td><tt>Distance</tt> 
 | 
			
		||||
 | 
			
		||||
        <td>The <tt>difference_type</tt> for the resulting iterator.<br>
 | 
			
		||||
         <b>Default:</b>
 | 
			
		||||
        <tt>std::iterator_traits<BidirectionalIterator&gt::difference_type</tt>
 | 
			
		||||
        
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3>Concept Model</h3>
 | 
			
		||||
    The indirect iterator will model whichever <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/Iterators.html">standard iterator concept
 | 
			
		||||
    category</a> is modeled by the base iterator. Thus, if the base iterator is
 | 
			
		||||
    a model of <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random Access
 | 
			
		||||
    Iterator</a> then so is the resulting indirect iterator. If the base
 | 
			
		||||
    iterator models a more restrictive concept, the resulting indirect iterator
 | 
			
		||||
    will model the same concept. The base iterator must be at least a <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/BidirectionalIterator.html">Bidirectional
 | 
			
		||||
    Iterator</a> 
 | 
			
		||||
 | 
			
		||||
    <h3>Members</h3>
 | 
			
		||||
    The reverse iterator type implements the member functions and operators
 | 
			
		||||
    required of the <a href=
 | 
			
		||||
    "http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random Access
 | 
			
		||||
    Iterator</a> concept. In addition it has the following constructor: 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
reverse_iterator_generator::type(const BidirectionalIterator& it)
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <br>
 | 
			
		||||
     <br>
 | 
			
		||||
     
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="make_reverse_iterator">The Reverse Iterator Object
 | 
			
		||||
    Generator</a></h2>
 | 
			
		||||
    The <tt>make_reverse_iterator()</tt> function provides a more convenient
 | 
			
		||||
    way to create reverse iterator objects. The function saves the user the
 | 
			
		||||
    trouble of explicitly writing out the iterator types. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
template <class BidirectionalIterator>
 | 
			
		||||
typename reverse_iterator_generator<BidirectionalIterator>::type
 | 
			
		||||
make_reverse_iterator(BidirectionalIterator base);
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
 | 
			
		||||
    <h3>Example</h3>
 | 
			
		||||
    In this part of the example we use <tt>make_reverse_iterator()</tt> to
 | 
			
		||||
    print the sequence of letters in reverse-reverse order, which is the
 | 
			
		||||
    original order. 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
  // continuing from the previous example...
 | 
			
		||||
 | 
			
		||||
  std::cout << "letters in ascending order:\t";
 | 
			
		||||
  std::copy(boost::make_reverse_iterator(reverse_letters_last),
 | 
			
		||||
      boost::make_reverse_iterator(reverse_letters_first),
 | 
			
		||||
      std::ostream_iterator<char>(std::cout));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    The output is: 
 | 
			
		||||
 | 
			
		||||
    <blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
letters in ascending order:  !dehllloorw
 | 
			
		||||
</pre>
 | 
			
		||||
    </blockquote>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="interactions">Constant/Mutable Iterator Interactions</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>One failing of the standard <tt><a
 | 
			
		||||
    href="http://www.sgi.com/tech/stl/ReverseIterator.html">reverse_iterator</a></tt>
 | 
			
		||||
    adaptor is that it doesn't properly support interactions between adapted
 | 
			
		||||
    <tt>const</tt> and non-<tt>const</tt> iterators. For example:
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
template <class T> void convert(T x) {}
 | 
			
		||||
 | 
			
		||||
// Test interactions of a matched pair of random access iterators
 | 
			
		||||
template <class Iterator, class ConstIterator>
 | 
			
		||||
void test_interactions(Iterator i, ConstIterator ci)
 | 
			
		||||
{
 | 
			
		||||
  bool eq = i == ci;               // comparisons
 | 
			
		||||
  bool ne = i != ci;            
 | 
			
		||||
  bool lt = i < ci;
 | 
			
		||||
  bool le = i <= ci;
 | 
			
		||||
  bool gt = i > ci;
 | 
			
		||||
  bool ge = i >= ci;
 | 
			
		||||
  std::size_t distance = i - ci;   // difference
 | 
			
		||||
  ci = i;                          // assignment
 | 
			
		||||
  ConstIterator ci2(i);            // construction
 | 
			
		||||
  convert<ConstIterator>(i);       // implicit conversion
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void f()
 | 
			
		||||
{
 | 
			
		||||
  typedef std::vector<int> vec;
 | 
			
		||||
  vec v;
 | 
			
		||||
  const vec& cv;
 | 
			
		||||
 | 
			
		||||
  test_interactions(v.begin(), cv.begin());   // <font color="#007F00">OK</font>
 | 
			
		||||
  test_interactions(v.rbegin(), cv.rbegin()); // <font color="#FF0000">ERRORS ON EVERY TEST!!</font>
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
Reverse iterators created with <tt>boost::reverse_iterator_generator</tt> don't have this problem, though:
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
  typedef boost::reverse_iterator_generator<vec::iterator>::type ri;
 | 
			
		||||
  typedef boost::reverse_iterator_generator<vec::const_iterator>::type cri;
 | 
			
		||||
  test_interactions(ri(v.begin()), cri(cv.begin()));   // <font color="#007F00">OK!!</font>
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
Or, more simply,
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
  test_interactions(
 | 
			
		||||
    boost::make_reverse_iterator(v.begin()), 
 | 
			
		||||
    boost::make_reverse_iterator(cv.begin()));   // <font color="#007F00">OK!!</font>
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
<p>If you are wondering why there is no
 | 
			
		||||
<tt>reverse_iterator_pair_generator</tt> in the manner of <tt><a
 | 
			
		||||
href="projection_iterator.htm#projection_iterator_pair_generator">projection_iterator_pair_generator</a></tt>,
 | 
			
		||||
the answer is simple: we tried it, but found that in practice it took
 | 
			
		||||
<i>more</i> typing to use <tt>reverse_iterator_pair_generator</tt> than to
 | 
			
		||||
simply use <tt>reverse_iterator_generator</tt> twice!<br><br>
 | 
			
		||||
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    <p>Revised 
 | 
			
		||||
    <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan -->19 Aug 2001<!--webbot bot="Timestamp" endspan i-checksum="14767" -->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <p>© Copyright Jeremy Siek 2000. Permission to copy, use, modify, sell
 | 
			
		||||
    and distribute this document is granted provided this copyright notice
 | 
			
		||||
    appears in all copies. This document is provided "as is" without express or
 | 
			
		||||
    implied warranty, and with no claim as to its suitability for any purpose. 
 | 
			
		||||
    <!--  LocalWords:  html charset alt gif hpp BidirectionalIterator const namespace struct
 | 
			
		||||
         -->
 | 
			
		||||
     
 | 
			
		||||
    <!--  LocalWords:  ConstPointer ConstReference typename iostream int abcdefg
 | 
			
		||||
         -->
 | 
			
		||||
     <!--  LocalWords:  sizeof  PairGen pre Siek wroolllhed dehllloorw
 | 
			
		||||
         -->
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
@@ -1,47 +0,0 @@
 | 
			
		||||
// (C) Copyright Jeremy Siek 2000. 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.
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <boost/iterator/reverse_iterator.hpp>
 | 
			
		||||
#include <boost/detail/iterator.hpp>
 | 
			
		||||
 | 
			
		||||
//boost::detail::iterator_traits
 | 
			
		||||
int main(int, char*[])
 | 
			
		||||
{
 | 
			
		||||
  char letters_[] = "hello world!";
 | 
			
		||||
  const int N = sizeof(letters_)/sizeof(char) - 1;
 | 
			
		||||
  typedef char* base_iterator;
 | 
			
		||||
  base_iterator letters(letters_);
 | 
			
		||||
  
 | 
			
		||||
  std::cout << "original sequence of letters:\t"
 | 
			
		||||
            << letters_ << std::endl;
 | 
			
		||||
 | 
			
		||||
  std::sort(letters, letters + N);
 | 
			
		||||
 | 
			
		||||
  // Use reverse_iterator_generator to print a sequence
 | 
			
		||||
  // of letters in reverse order.
 | 
			
		||||
  
 | 
			
		||||
  boost::reverse_iterator<base_iterator>
 | 
			
		||||
    reverse_letters_first(letters + N),
 | 
			
		||||
    reverse_letters_last(letters);
 | 
			
		||||
 | 
			
		||||
  std::cout << "letters in descending order:\t";
 | 
			
		||||
  std::copy(reverse_letters_first, reverse_letters_last,
 | 
			
		||||
            std::ostream_iterator<char>(std::cout));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  // Use make_reverse_iterator() to print the sequence
 | 
			
		||||
  // of letters in reverse-reverse order.
 | 
			
		||||
 | 
			
		||||
  std::cout << "letters in ascending order:\t";
 | 
			
		||||
  std::copy(boost::make_reverse_iterator(reverse_letters_last),
 | 
			
		||||
            boost::make_reverse_iterator(reverse_letters_first),
 | 
			
		||||
            std::ostream_iterator<char>(std::cout));
 | 
			
		||||
  std::cout << std::endl;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
 | 
			
		||||
<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)"
 | 
			
		||||
<img src="../../boost.png" alt="boost.png (6897 bytes)"
 | 
			
		||||
align="center" width="277" height="86">
 | 
			
		||||
 | 
			
		||||
<h1>Shared Container Iterator</h1>
 | 
			
		||||
@@ -312,11 +312,10 @@ the previous two.
 | 
			
		||||
<!-- hhmts start -->
 | 
			
		||||
Last modified: Mon Aug 11 11:27:03 EST 2003
 | 
			
		||||
<!-- hhmts end -->
 | 
			
		||||
<p><EFBFBD> Copyright Ronald Garcia 2002. Permission to copy, use,
 | 
			
		||||
modify, sell and distribute this document is granted provided this copyright
 | 
			
		||||
notice appears in all copies. This document is provided "as is"
 | 
			
		||||
without express or implied warranty, and with no claim as to its suitability for
 | 
			
		||||
any purpose.</p>
 | 
			
		||||
<p><EFBFBD> Copyright 2003 The Trustees of Indiana University.
 | 
			
		||||
 Use, modification and distribution is subject to 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)</p>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
// (C) Copyright Ronald Garcia 2002. 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.
 | 
			
		||||
// Copyright 2003 The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification and distribution is subject to 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/shared_container_iterator.hpp"
 | 
			
		||||
#include "boost/shared_ptr.hpp"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
// (C) Copyright Ronald Garcia 2002. 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.
 | 
			
		||||
// Copyright 2003 The Trustees of Indiana University.
 | 
			
		||||
 | 
			
		||||
// Use, modification and distribution is subject to 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/shared_container_iterator.hpp"
 | 
			
		||||
#include "boost/shared_ptr.hpp"
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user