mirror of
				https://github.com/boostorg/utility.git
				synced 2025-10-20 20:15:30 +02:00 
			
		
		
		
	Compare commits
	
		
			30 Commits
		
	
	
		
			svn-branch
			...
			boost-1.36
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | c84e4d70d3 | ||
|  | 7a036f6f3a | ||
|  | e632b0fb1f | ||
|  | 17bee9d43f | ||
|  | 492a8ad213 | ||
|  | 8827b8ed8b | ||
|  | 8849fbc52d | ||
|  | 50bc75a802 | ||
|  | 9b52e49fda | ||
|  | ab479794f3 | ||
|  | 97b8966337 | ||
|  | 88099a882f | ||
|  | d5554eb6d7 | ||
|  | 13bdfb8bbd | ||
|  | 74462349c2 | ||
|  | 6aa648d315 | ||
|  | 9ff18c2c96 | ||
|  | d5ea07c737 | ||
|  | aa0096bf42 | ||
|  | 005c2f3cc8 | ||
|  | 09f7aab52d | ||
|  | 30a40f9f76 | ||
|  | d9f8bae673 | ||
|  | 3c7b409460 | ||
|  | ee3551e8dc | ||
|  | 95da2e90de | ||
|  | 6dd93ab916 | ||
|  | 505d419a1b | ||
|  | d968b5f5b9 | ||
|  | d809d4e832 | 
							
								
								
									
										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="../../boost.png"  | ||||
|      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= | ||||
|   "http://www.w3.org/Icons/valid-html401" 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="../../boost.png"  | ||||
|      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= | ||||
|   "http://www.w3.org/Icons/valid-html401" 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="../../boost.png"  | ||||
|      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= | ||||
|   "http://www.w3.org/Icons/valid-html401" 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="../../boost.png"  | ||||
|      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.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>. | ||||
| <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= | ||||
|   "http://www.w3.org/Icons/valid-html401" 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> | ||||
|   | ||||
| @@ -145,14 +145,20 @@ objects are is implemented in <a href="../../boost/utility/compare_pointees.hpp" | ||||
| 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> | ||||
							
								
								
									
										13
									
								
								assert.html
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								assert.html
									
									
									
									
									
								
							| @@ -47,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> | ||||
|   | ||||
| @@ -334,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 | ||||
| @@ -343,7 +343,7 @@ 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>. | ||||
| @@ -353,7 +353,7 @@ with the exact pointer type used in <code>switcher</code>'s constructor.</p> | ||||
| 		can be controlled and automated with macros.  The implementation uses | ||||
| 		the <a href="../preprocessor/index.html">Preprocessor library</a>. | ||||
|  | ||||
| 	<dt><a href="../../people/daryle_walker.html">Daryle Walker</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> | ||||
|   | ||||
| @@ -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> | ||||
|  | ||||
|   | ||||
| @@ -115,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> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|       <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 Express 2.0"> | ||||
|       <meta name="GENERATOR" content="Microsoft FrontPage 5.0"> | ||||
|       <boostcompressed_pair.hpp> | ||||
|    </head> | ||||
|    <body bgcolor="#ffffff" text="#000000" link="#0000ff" vlink="#800080"> | ||||
| @@ -59,17 +59,18 @@ public: | ||||
|          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> | ||||
|       <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> | ||||
|       <p> </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> | ||||
|  | ||||
|    </body> | ||||
| </html> | ||||
| </html> | ||||
| @@ -29,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> | ||||
|   | ||||
| @@ -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--> | ||||
|   | ||||
| @@ -1,33 +0,0 @@ | ||||
| # 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/ | ||||
|  | ||||
| subproject libs/utility/enable_if/test ; | ||||
|  | ||||
| # bring in rules for testing | ||||
| import testing ; | ||||
|  | ||||
| # Make tests run by default. | ||||
| DEPENDS all : test ; | ||||
|  | ||||
| { | ||||
|     local test_monitor = <lib>@boost/libs/test/build/boost_test_exec_monitor ; | ||||
|  | ||||
|     # look in BOOST_ROOT for sources first, just in this Jamfile | ||||
|     local SEARCH_SOURCE = $(BOOST_ROOT) $(SEARCH_SOURCE) ; | ||||
|  | ||||
|     test-suite utility/enable_if | ||||
|         : | ||||
|         [ run libs/utility/enable_if/test/constructors.cpp $(test_monitor) ] | ||||
|         [ run libs/utility/enable_if/test/dummy_arg_disambiguation.cpp $(test_monitor) ] | ||||
|         [ run libs/utility/enable_if/test/lazy.cpp $(test_monitor) ] | ||||
|         [ run libs/utility/enable_if/test/lazy_test.cpp $(test_monitor) ] | ||||
|         [ run libs/utility/enable_if/test/member_templates.cpp $(test_monitor) ] | ||||
|         [ run libs/utility/enable_if/test/namespace_disambiguation.cpp $(test_monitor) ] | ||||
|         [ run libs/utility/enable_if/test/no_disambiguation.cpp $(test_monitor) ] | ||||
|         [ run libs/utility/enable_if/test/partial_specializations.cpp $(test_monitor) ] | ||||
|     ; | ||||
| } | ||||
| @@ -6,7 +6,7 @@ | ||||
| // 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) | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| // 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) | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| // 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) | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| // 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) | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| // 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) | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| // 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) | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| // 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) | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| // 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) | ||||
|  | ||||
|   | ||||
| @@ -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="../../boost.png" alt="boost.png (6897 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,21 +44,19 @@ 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: | ||||
| @@ -62,65 +64,65 @@ public: | ||||
| } | ||||
| </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= | ||||
|   "http://www.w3.org/Icons/valid-html401" 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> | ||||
|   | ||||
| @@ -3,9 +3,8 @@ | ||||
| <HTML> | ||||
|  | ||||
| <HEAD> | ||||
| <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> | ||||
| <LINK REL="stylesheet" TYPE="text/css" HREF="../../boost.css"> | ||||
| <TITLE>Header </TITLE> | ||||
| <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"> | ||||
| @@ -77,7 +76,7 @@ object is likely to be temporary and serve no purpose besides being the source</ | ||||
| </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 shceme, the user supplies the arguments for the X constructor | ||||
| In this scheme, the user supplies the arguments for the X constructor | ||||
| directly to the container:</p> | ||||
| <pre>struct C | ||||
| { | ||||
| @@ -138,7 +137,7 @@ The following simplified example shows the basic idea. A complete example follow | ||||
|  | ||||
| void foo() | ||||
| { | ||||
|   C c( in_place(123,"hello" ) ; | ||||
|   C c( in_place(123,"hello") ) ; | ||||
| } | ||||
| </pre> | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| //  boost/assert.hpp - BOOST_ASSERT(expr) | ||||
| // | ||||
| //  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. | ||||
| //  Copyright (c) 2007 Peter Dimov | ||||
| // | ||||
| // Distributed under the Boost Software License, Version 1.0. (See | ||||
| // accompanying file LICENSE_1_0.txt or copy at | ||||
| @@ -35,3 +36,15 @@ void assertion_failed(char const * expr, char const * function, char const * fil | ||||
| # 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 | ||||
|   | ||||
| @@ -32,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__ | ||||
|   | ||||
							
								
								
									
										19
									
								
								include/boost/exception.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								include/boost/exception.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| //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 | ||||
|  | ||||
| #include <boost/exception/diagnostic_information.hpp> | ||||
| #include <boost/exception/enable_current_exception.hpp> | ||||
| #include <boost/exception/enable_error_info.hpp> | ||||
| #include <boost/exception/error_info.hpp> | ||||
| #include <boost/exception/exception.hpp> | ||||
| #include <boost/exception/info.hpp> | ||||
| #include <boost/exception/info_tuple.hpp> | ||||
| #include <boost/exception_ptr.hpp> | ||||
| #include <boost/throw_exception.hpp> | ||||
|  | ||||
| #endif | ||||
| @@ -8,6 +8,8 @@ | ||||
| //  See http://www.boost.org/libs/utility/operators.htm for documentation. | ||||
|  | ||||
| //  Revision History | ||||
| //  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) | ||||
| @@ -90,15 +92,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 | ||||
|  | ||||
| @@ -119,7 +121,7 @@ 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); } | ||||
| @@ -130,7 +132,7 @@ struct less_than_comparable2 : B | ||||
|      friend bool operator>=(const U& x, const T& y) { return !(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; } | ||||
| @@ -138,7 +140,7 @@ struct less_than_comparable1 : B | ||||
|      friend bool operator>=(const T& x, const T& y) { return !(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; } | ||||
| @@ -146,7 +148,7 @@ struct equality_comparable2 : B | ||||
|      friend bool operator!=(const T& y, const U& x) { return !(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); } | ||||
| @@ -165,7 +167,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 )                          \ | ||||
| @@ -174,33 +176,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) | ||||
| @@ -210,35 +212,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; } \ | ||||
| @@ -261,7 +263,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) | ||||
| @@ -274,7 +276,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) | ||||
| @@ -289,7 +291,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 | ||||
| @@ -298,7 +300,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 | ||||
| @@ -313,14 +315,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 )                          \ | ||||
| @@ -330,13 +332,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; }       \ | ||||
| @@ -349,7 +351,7 @@ 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) | ||||
| @@ -358,7 +360,7 @@ struct equivalent2 : B | ||||
|   } | ||||
| }; | ||||
|  | ||||
| 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) | ||||
| @@ -367,7 +369,7 @@ struct equivalent1 : 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 partially_ordered2 : B | ||||
| { | ||||
|   friend bool operator<=(const T& x, const U& y) | ||||
| @@ -384,7 +386,7 @@ struct partially_ordered2 : B | ||||
|     { return (y < x) || (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) | ||||
| @@ -397,161 +399,161 @@ struct partially_ordered1 : B | ||||
|  | ||||
| //  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 | ||||
| @@ -560,43 +562,43 @@ 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 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 | ||||
| @@ -606,7 +608,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 | ||||
| @@ -650,20 +652,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 | ||||
| @@ -752,7 +754,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> {};               \ | ||||
| @@ -788,7 +790,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 | ||||
|   | ||||
| @@ -15,7 +15,7 @@ | ||||
| // | ||||
| //  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 | ||||
| // | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| // Copyright (C) 2002 Brad King (brad.king@kitware.com)  | ||||
| //                    Douglas Gregor (gregod@cs.rpi.edu) | ||||
| //                    Peter Dimov | ||||
| // | ||||
| // Copyright (C) 2002, 2008 Peter Dimov | ||||
| // | ||||
| // Distributed under the Boost Software License, Version 1.0. (See | ||||
| // accompanying file LICENSE_1_0.txt or copy at | ||||
| @@ -14,27 +15,31 @@ | ||||
| # include <boost/config.hpp> | ||||
| # include <boost/detail/workaround.hpp> | ||||
|  | ||||
| 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<class T> struct _addp | ||||
| namespace boost | ||||
| { | ||||
|     typedef T * type; | ||||
|  | ||||
| namespace detail | ||||
| { | ||||
|  | ||||
| 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; | ||||
|     } | ||||
| }; | ||||
|      | ||||
| template <typename T> typename _addp<T>::type | ||||
|  | ||||
| # else | ||||
| template <typename T> T* | ||||
| # endif | ||||
| addressof(T& v) | ||||
| } // namespace detail | ||||
|  | ||||
| template<class T> T * addressof( T & v ) | ||||
| { | ||||
|   return reinterpret_cast<T*>( | ||||
|        &const_cast<char&>(reinterpret_cast<const volatile char &>(v))); | ||||
|     return boost::detail::addressof_impl<T>::f( v, 0 ); | ||||
| } | ||||
|  | ||||
| // Borland doesn't like casting an array reference to a char reference | ||||
| @@ -53,6 +58,6 @@ const T (*addressof(const T (&t)[N]))[N] | ||||
| } | ||||
| # endif | ||||
|  | ||||
| } | ||||
| } // namespace boost | ||||
|  | ||||
| #endif // BOOST_UTILITY_ADDRESSOF_HPP | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| // 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 | ||||
| @@ -9,25 +10,27 @@ | ||||
| // You are welcome to contact the author at: | ||||
| //  fernando_cacciola@hotmail.com | ||||
| // | ||||
| #ifndef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_25AGO2003_HPP | ||||
| #define BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_25AGO2003_HPP | ||||
| #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/cat.hpp> | ||||
| #include <boost/preprocessor/arithmetic/inc.hpp> | ||||
| #include <boost/preprocessor/punctuation/paren.hpp> | ||||
| #include <boost/preprocessor/facilities/empty.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_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_ARG(z,n,_)  BOOST_PP_CAT(m_a,n) | ||||
|  | ||||
| #define BOOST_MAX_INPLACE_FACTORY_ARITY 10 | ||||
|  | ||||
| #undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_25AGO2003_HPP | ||||
| #undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_04APR2007_HPP | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| // 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 | ||||
| @@ -9,15 +10,14 @@ | ||||
| // You are welcome to contact the author at: | ||||
| //  fernando_cacciola@hotmail.com | ||||
| // | ||||
| #ifndef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_25AGO2003_HPP | ||||
| #define BOOST_UTILITY_DETAIL_INPLACE_FACTORY_SUFFIX_25AGO2003_HPP | ||||
| #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_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_ARG | ||||
| #undef BOOST_MAX_INPLACE_FACTORY_ARITY | ||||
|  | ||||
| #undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_25AGO2003_HPP | ||||
| #undef BOOST_UTILITY_DETAIL_INPLACE_FACTORY_PREFIX_04APR2007_HPP | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -21,66 +21,69 @@ | ||||
| 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)> | ||||
|     : detail::result_of<F, F(BOOST_RESULT_OF_ARGS)> {}; | ||||
|     : boost::detail::result_of_impl<F, F(BOOST_RESULT_OF_ARGS), (boost::detail::has_result_type<F>::value)> {}; | ||||
| #endif | ||||
|  | ||||
| #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 result_of<R (*)(BOOST_RESULT_OF_ARGS), FArgs> | ||||
| struct 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 result_of<R (&)(BOOST_RESULT_OF_ARGS), FArgs> | ||||
| struct result_of_impl<R (&)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false> | ||||
| { | ||||
|   typedef R type; | ||||
| }; | ||||
|  | ||||
| #undef BOOST_RESULT_OF_ARGS | ||||
|  | ||||
| #if BOOST_PP_ITERATION() > 1 && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) | ||||
| #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 result_of<R (T0::*) | ||||
| struct result_of_impl<R (T0::*) | ||||
|                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)), | ||||
|                  FArgs> | ||||
|                  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 result_of<R (T0::*) | ||||
| struct result_of_impl<R (T0::*) | ||||
|                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)) | ||||
|                      const, | ||||
|                  FArgs> | ||||
|                  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 result_of<R (T0::*) | ||||
| struct result_of_impl<R (T0::*) | ||||
|                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)) | ||||
|                      volatile, | ||||
|                  FArgs> | ||||
|                  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 result_of<R (T0::*) | ||||
| struct result_of_impl<R (T0::*) | ||||
|                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)) | ||||
|                      const volatile, | ||||
|                  FArgs> | ||||
|                  FArgs, false> | ||||
| { | ||||
|   typedef R type; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| } | ||||
| #endif | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
| // 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) | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| // 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 | ||||
| @@ -9,50 +10,79 @@ | ||||
| // You are welcome to contact the author at: | ||||
| //  fernando_cacciola@hotmail.com | ||||
| // | ||||
| #ifndef BOOST_UTILITY_INPLACE_FACTORY_25AGO2003_HPP | ||||
| #define BOOST_UTILITY_INPLACE_FACTORY_25AGO2003_HPP | ||||
| #ifndef BOOST_UTILITY_INPLACE_FACTORY_04APR2007_HPP | ||||
| #ifndef BOOST_PP_IS_ITERATING | ||||
|  | ||||
| #include <boost/utility/detail/in_place_factory_prefix.hpp> | ||||
|  | ||||
| #include <boost/type.hpp> | ||||
|  | ||||
| namespace boost { | ||||
|  | ||||
| class in_place_factory_base {} ; | ||||
|  | ||||
| #define BOOST_DEFINE_INPLACE_FACTORY_CLASS(z,n,_) \ | ||||
| template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \ | ||||
| class BOOST_PP_CAT(in_place_factory, BOOST_PP_INC(n) ) : public in_place_factory_base \ | ||||
| { \ | ||||
| public: \ | ||||
| \ | ||||
|   BOOST_PP_CAT(in_place_factory, BOOST_PP_INC(n) ) ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A,const& a) ) \ | ||||
|     : \ | ||||
|     BOOST_PP_ENUM( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _ ) \ | ||||
|   {} \ | ||||
| \ | ||||
|   template<class T> \ | ||||
|   void apply ( void* address BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(T) ) const \ | ||||
|   { \ | ||||
|     new ( address ) T ( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), m_a ) ) ; \ | ||||
|   } \ | ||||
| \ | ||||
|   BOOST_PP_REPEAT( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _) \ | ||||
| } ; \ | ||||
| \ | ||||
| template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \ | ||||
| BOOST_PP_CAT(in_place_factory, BOOST_PP_INC(n) ) < BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \ | ||||
| in_place ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A, const& a) ) \ | ||||
| { \ | ||||
|   return BOOST_PP_CAT(in_place_factory, BOOST_PP_INC(n) ) < BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \ | ||||
|            ( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), a ) ) ; \ | ||||
| } ; \ | ||||
|  | ||||
| BOOST_PP_REPEAT( BOOST_MAX_INPLACE_FACTORY_ARITY, BOOST_DEFINE_INPLACE_FACTORY_CLASS, BOOST_PP_EMPTY() ) | ||||
| #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 | ||||
|  | ||||
|   | ||||
| @@ -15,6 +15,8 @@ | ||||
| #include <boost/preprocessor.hpp> | ||||
| #include <boost/detail/workaround.hpp> | ||||
| #include <boost/mpl/has_xxx.hpp> | ||||
| #include <boost/mpl/if.hpp> | ||||
| #include <boost/mpl/bool.hpp> | ||||
|  | ||||
| #ifndef BOOST_RESULT_OF_NUM_ARGS | ||||
| #  define BOOST_RESULT_OF_NUM_ARGS 10 | ||||
| @@ -29,28 +31,48 @@ namespace detail { | ||||
|  | ||||
| BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type) | ||||
|  | ||||
| template<typename F, typename FArgs, bool HasResultType> struct get_result_of; | ||||
|  | ||||
| template<typename F, typename FArgs> | ||||
| struct get_result_of<F, FArgs, true> | ||||
| { | ||||
|   typedef typename F::result_type type; | ||||
| }; | ||||
|  | ||||
| template<typename F, typename FArgs> | ||||
| struct get_result_of<F, FArgs, false> | ||||
| { | ||||
|   typedef typename F::template result<FArgs>::type type; | ||||
| }; | ||||
| template<typename F, typename FArgs, bool HasResultType> struct result_of_impl; | ||||
|  | ||||
| template<typename F> | ||||
| struct get_result_of<F, F(void), false> | ||||
| 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; | ||||
| }; | ||||
|  | ||||
| template<typename F, typename FArgs> | ||||
| struct result_of : get_result_of<F, FArgs, (has_result_type<F>::value)> {}; | ||||
| struct 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 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 | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| // 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 | ||||
| @@ -9,8 +10,8 @@ | ||||
| // You are welcome to contact the author at: | ||||
| //  fernando_cacciola@hotmail.com | ||||
| // | ||||
| #ifndef BOOST_UTILITY_TYPED_INPLACE_FACTORY_25AGO2003_HPP | ||||
| #define BOOST_UTILITY_TYPED_INPLACE_FACTORY_25AGO2003_HPP | ||||
| #ifndef BOOST_UTILITY_TYPED_INPLACE_FACTORY_04APR2007_HPP | ||||
| #ifndef BOOST_PP_IS_ITERATING | ||||
|  | ||||
| #include <boost/utility/detail/in_place_factory_prefix.hpp> | ||||
|  | ||||
| @@ -18,40 +19,59 @@ namespace boost { | ||||
|  | ||||
| class typed_in_place_factory_base {} ; | ||||
|  | ||||
| #define BOOST_DEFINE_TYPED_INPLACE_FACTORY_CLASS(z,n,_) \ | ||||
| template< class T, BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \ | ||||
| class BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) : public typed_in_place_factory_base \ | ||||
| { \ | ||||
| public: \ | ||||
| \ | ||||
|   typedef T value_type ; \ | ||||
| \ | ||||
|   BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A,const& a) ) \ | ||||
|     : \ | ||||
|     BOOST_PP_ENUM( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_INIT, _ ) \ | ||||
|   {} \ | ||||
| \ | ||||
|   void apply ( void* address ) const \ | ||||
|   { \ | ||||
|     new ( address ) T ( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), m_a ) ) ; \ | ||||
|   } \ | ||||
| \ | ||||
|   BOOST_PP_REPEAT( BOOST_PP_INC(n), BOOST_DEFINE_INPLACE_FACTORY_CLASS_MEMBER_DECL, _) \ | ||||
| } ; \ | ||||
| \ | ||||
| template< class T, BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n),class A) > \ | ||||
| BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) < T , BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \ | ||||
| in_place ( BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_INC(n),A, const& a) ) \ | ||||
| { \ | ||||
|   return BOOST_PP_CAT(typed_in_place_factory, BOOST_PP_INC(n) ) < T, BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), A ) > \ | ||||
|            ( BOOST_PP_ENUM_PARAMS( BOOST_PP_INC(n), a ) ) ; \ | ||||
| } ; \ | ||||
|  | ||||
| BOOST_PP_REPEAT( BOOST_MAX_INPLACE_FACTORY_ARITY, BOOST_DEFINE_TYPED_INPLACE_FACTORY_CLASS, BOOST_PP_EMPTY() ) | ||||
| #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,64 +1,104 @@ | ||||
| // (C) 2002, Fernando Luis Cacciola Carballal. | ||||
| // (C) Copyright 2002-2008, Fernando Luis Cacciola Carballal. | ||||
| // | ||||
| // 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 | ||||
| // | ||||
| #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/detail/workaround.hpp> | ||||
| #include <boost/static_assert.hpp> | ||||
| #include <boost/type_traits/cv_traits.hpp> | ||||
| #include <boost/type_traits/alignment_of.hpp> | ||||
| #include <cstring> | ||||
| #include <new> | ||||
|  | ||||
| namespace boost { | ||||
|  | ||||
| namespace vinit_detail { | ||||
|  | ||||
| template<class T> | ||||
| class const_T_base | ||||
| class value_initialized | ||||
| { | ||||
|   protected : | ||||
|   private : | ||||
|     struct wrapper | ||||
|     { | ||||
| #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) | ||||
|       typename | ||||
| #endif  | ||||
|       remove_const<T>::type data; | ||||
|     }; | ||||
|  | ||||
|    const_T_base() : x() {} | ||||
|     mutable | ||||
| #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) | ||||
|       typename | ||||
| #endif  | ||||
|       aligned_storage<sizeof(wrapper), alignment_of<wrapper>::value>::type x; | ||||
|  | ||||
|    T x ; | ||||
| } ; | ||||
|     wrapper * wrapper_address() const | ||||
|     { | ||||
|       return static_cast<wrapper *>( static_cast<void*>(&x)); | ||||
|     } | ||||
|  | ||||
| template<class T> | ||||
| struct non_const_T_base | ||||
| { | ||||
|   protected : | ||||
|  | ||||
|    non_const_T_base() : 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() {} | ||||
|     value_initialized() | ||||
|     { | ||||
|       std::memset(&x, 0, sizeof(x)); | ||||
| #ifdef BOOST_MSVC | ||||
| #pragma warning(push) | ||||
| #if _MSC_VER >= 1310 | ||||
| // When using MSVC 7.1 or higher, the following placement new expression may trigger warning C4345: | ||||
| // "behavior change: an object of POD type constructed with an initializer of the form () | ||||
| // will be default-initialized".  It is safe to ignore this warning when using value_initialized. | ||||
| #pragma warning(disable: 4345) | ||||
| #endif | ||||
| #endif | ||||
|       new (wrapper_address()) wrapper(); | ||||
| #ifdef BOOST_MSVC | ||||
| #pragma warning(pop) | ||||
| #endif | ||||
|     } | ||||
|  | ||||
|     operator T&() const { return this->x ; } | ||||
|     value_initialized(value_initialized const & arg) | ||||
|     { | ||||
|       new (wrapper_address()) wrapper( static_cast<wrapper const &>(*(arg.wrapper_address()))); | ||||
|     } | ||||
|  | ||||
|     T& data() const { return this->x ; } | ||||
|     value_initialized & operator=(value_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; | ||||
|     } | ||||
|  | ||||
|     ~value_initialized() | ||||
|     { | ||||
|       wrapper_address()->wrapper::~wrapper(); | ||||
|     } | ||||
|  | ||||
|     T& data() const | ||||
|     { | ||||
|       return wrapper_address()->data; | ||||
|     } | ||||
|  | ||||
|     operator T&() const { return this->data(); } | ||||
|  | ||||
| } ; | ||||
|  | ||||
|  | ||||
|  | ||||
| template<class T> | ||||
| T const& get ( value_initialized<T> const& x ) | ||||
| { | ||||
| @@ -70,8 +110,21 @@ T& get ( value_initialized<T>& x ) | ||||
|   return x.data() ; | ||||
| } | ||||
|  | ||||
|  | ||||
| class initialized_value_t | ||||
| { | ||||
|   public : | ||||
|      | ||||
|     template <class T> operator T() const | ||||
|     { | ||||
|       return get( value_initialized<T>() ); | ||||
|     } | ||||
| }; | ||||
|  | ||||
| initialized_value_t const initialized_value = {} ; | ||||
|  | ||||
|  | ||||
| } // namespace boost | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   | ||||
							
								
								
									
										15
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								index.html
									
									
									
									
									
								
							| @@ -19,16 +19,23 @@ | ||||
| 				<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="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="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> | ||||
|   | ||||
| @@ -2029,13 +2029,13 @@ public: | ||||
|     <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 +2043,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 | ||||
|   | ||||
| @@ -315,7 +315,7 @@ Last modified: Mon Aug 11 11:27:03 EST 2003 | ||||
| <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> | ||||
|  http://www.boost.org/LICENSE_1_0.txt)</p> | ||||
|  | ||||
| </body> | ||||
|  | ||||
|   | ||||
							
								
								
									
										43
									
								
								test/Jamfile
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								test/Jamfile
									
									
									
									
									
								
							| @@ -1,43 +0,0 @@ | ||||
| # Copyright David Abrahams 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. | ||||
|  | ||||
| # For more information, see http://www.boost.org/ | ||||
|  | ||||
| subproject libs/utility/test ; | ||||
|  | ||||
| # bring in rules for testing | ||||
| import testing ; | ||||
|  | ||||
| # Make tests run by default. | ||||
| DEPENDS all : test ; | ||||
|  | ||||
| local test_monitor = <lib>@boost/libs/test/build/boost_test_exec_monitor ; | ||||
|  | ||||
| # Please keep the tests ordered by filename | ||||
| test-suite utility | ||||
|     : | ||||
|         [ run ../addressof_test.cpp ] | ||||
|         [ run ../assert_test.cpp ] | ||||
|         [ run ../base_from_member_test.cpp ] | ||||
|         [ run ../binary_search_test.cpp ] | ||||
|         [ run ../call_traits_test.cpp : -u ] | ||||
|         [ compile-fail ../checked_delete_test.cpp ] | ||||
|         [ run ../compressed_pair_test.cpp $(test_monitor) : -u ] | ||||
|         [ run ../current_function_test.cpp : : : <test-info>always_show_run_output ] | ||||
|         [ run ../iterators_test.cpp $(test_monitor) ] | ||||
|         [ run next_prior_test.cpp $(test_monitor) ] | ||||
|         [ compile-fail ../noncopyable_test.cpp ] | ||||
|         [ run ../numeric_traits_test.cpp ] | ||||
|         [ run ../operators_test.cpp $(test_monitor) ] | ||||
|         [ compile ../ref_ct_test.cpp  ] | ||||
|         [ run ../ref_test.cpp $(test_monitor) ] | ||||
|         [ compile result_of_test.cpp ] | ||||
|         [ run ../shared_iterator_test.cpp ] | ||||
|         [ run ../value_init_test.cpp ] | ||||
|         [ compile-fail ../value_init_test_fail1.cpp ] | ||||
|         [ compile-fail ../value_init_test_fail2.cpp ] | ||||
|         [ compile-fail ../value_init_test_fail3.cpp ] | ||||
|     ; | ||||
| @@ -1,8 +1,7 @@ | ||||
| # Copyright David Abrahams 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. | ||||
| # Copyright David Abrahams 2003. | ||||
|  | ||||
| # Distributed under the Boost Software License, Version 1.0. | ||||
| # See http://www.boost.org/LICENSE_1_0.txt | ||||
|  | ||||
| # For more information, see http://www.boost.org/ | ||||
|  | ||||
| @@ -18,19 +17,21 @@ test-suite utility | ||||
|         [ run ../binary_search_test.cpp ] | ||||
|         [ run ../call_traits_test.cpp : -u ] | ||||
|         [ compile-fail ../checked_delete_test.cpp ] | ||||
|         [ run ../compressed_pair_test.cpp ../../test/build//boost_test_exec_monitor : -u ] | ||||
|         [ run ../compressed_pair_test.cpp ../../test/build//boost_test_exec_monitor/<link>static : -u ] | ||||
|         [ run ../current_function_test.cpp : : : <test-info>always_show_run_output ] | ||||
|         [ run ../iterators_test.cpp ../../test/build//boost_test_exec_monitor ] | ||||
|         [ run next_prior_test.cpp ../../test/build//boost_test_exec_monitor ] | ||||
|         [ run ../iterators_test.cpp ../../test/build//boost_test_exec_monitor/<link>static ] | ||||
|         [ run next_prior_test.cpp ../../test/build//boost_test_exec_monitor/<link>static ] | ||||
|         [ compile-fail ../noncopyable_test.cpp ] | ||||
|         [ run ../numeric_traits_test.cpp ] | ||||
|         [ run ../operators_test.cpp ../../test/build//boost_test_exec_monitor ] | ||||
|         [ run ../operators_test.cpp ../../test/build//boost_test_exec_monitor/<link>static ] | ||||
|         [ compile ../ref_ct_test.cpp  ] | ||||
|         [ run ../ref_test.cpp ../../test/build//boost_test_exec_monitor ] | ||||
|         [ run ../ref_test.cpp ../../test/build//boost_test_exec_monitor/<link>static ] | ||||
|         [ compile result_of_test.cpp ] | ||||
|         [ run ../shared_iterator_test.cpp ] | ||||
|         [ run ../value_init_test.cpp ] | ||||
|         [ compile-fail ../value_init_test_fail1.cpp ] | ||||
|         [ compile-fail ../value_init_test_fail2.cpp ] | ||||
|         [ compile-fail ../value_init_test_fail3.cpp ] | ||||
|         [ run ../verify_test.cpp ] | ||||
|     ; | ||||
|  | ||||
|   | ||||
							
								
								
									
										0
									
								
								test/next_prior_test.cpp
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								test/next_prior_test.cpp
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -24,6 +24,24 @@ struct int_result_type_and_float_result_of | ||||
|   template<typename F> struct result { typedef float type; }; | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| struct int_result_type_template { typedef int result_type; }; | ||||
|  | ||||
| template<typename T> | ||||
| struct int_result_of_template | ||||
| { | ||||
|   template<typename F> struct result; | ||||
|   template<typename This, typename That> struct result<This(That)> { typedef int type; }; | ||||
| }; | ||||
|  | ||||
| template<typename T> | ||||
| struct int_result_type_and_float_result_of_template | ||||
| { | ||||
|   typedef int result_type; | ||||
|   template<typename F> struct result; | ||||
|   template<typename This, typename That> struct result<This(That)> { typedef float type; }; | ||||
| }; | ||||
|  | ||||
| struct X {}; | ||||
|  | ||||
| int main() | ||||
| @@ -32,10 +50,13 @@ int main() | ||||
|  | ||||
|   typedef int (*func_ptr)(float, double); | ||||
|   typedef int (&func_ref)(float, double); | ||||
|   typedef int (*func_ptr_0)(); | ||||
|   typedef int (&func_ref_0)(); | ||||
|   typedef int (X::*mem_func_ptr)(float); | ||||
|   typedef int (X::*mem_func_ptr_c)(float) const; | ||||
|   typedef int (X::*mem_func_ptr_v)(float) volatile; | ||||
|   typedef int (X::*mem_func_ptr_cv)(float) const volatile; | ||||
|   typedef int (X::*mem_func_ptr_0)(); | ||||
|  | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type(float)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of(double)>::type, int>::value)); | ||||
| @@ -43,11 +64,22 @@ int main() | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const int_result_of(double)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of(void)>::type, void>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of(char)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_template<void>(float)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of_template<void>(double)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_of_template<void>(void)>::type, void>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<const int_result_of_template<void>(double)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<volatile int_result_of_template<void>(void)>::type, void>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<int_result_type_and_float_result_of_template<void>(char)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr(char, float)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<func_ref(char, float)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr_0()>::type, int>::value));  | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<func_ref_0()>::type, int>::value));  | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr(X,char)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr_c(X,char)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr_v(X,char)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr_cv(X,char)>::type, int>::value)); | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<mem_func_ptr_0(X)>::type, int>::value));  | ||||
|   BOOST_STATIC_ASSERT((is_same<result_of<func_ptr(void)>::type, int>::value)); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|   | ||||
| @@ -51,9 +51,8 @@ template<class E> void throw_exception(E const & e) | ||||
| } | ||||
| </pre> | ||||
| 		<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> | ||||
|   | ||||
							
								
								
									
										23
									
								
								utility.htm
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								utility.htm
									
									
									
									
									
								
							| @@ -23,6 +23,7 @@ | ||||
| 			<li> | ||||
| 				Function template <a href="#addressof">addressof()</a></li> | ||||
|                         <li>Class template <a href="#result_of">result_of</a></li> | ||||
|                         <li><a href="index.html">Other utilities not part of <code>utility.hpp</code></a></li> | ||||
| 		</ul> | ||||
| 		<h2> | ||||
| 			Function templates <a name="checked_delete">checked_delete</a>() and  | ||||
| @@ -67,7 +68,7 @@ const std::list<T>::iterator next = boost::next(prev, 2);</pre> | ||||
|                 <p>The distance from the given iterator should be supplied as an absolute value. For | ||||
| 			example, the iterator four iterators prior to the given iterator <code>p</code> | ||||
| 			may be obtained by <code>prior(p, 4)</code>.</p> | ||||
| 		<p>Contributed by <a href="../../people/dave_abrahams.htm">Dave Abrahams</a>.  Two-argument versions by Daniel Walker.</p> | ||||
| 		<p>Contributed by <a href="http://www.boost.org/people/dave_abrahams.htm">Dave Abrahams</a>.  Two-argument versions by Daniel Walker.</p> | ||||
| 		<h2><a name="Class_noncopyable">Class noncopyable</a></h2> | ||||
| 		<p>Class <strong>noncopyable</strong> is a base class.  Derive your own class  | ||||
| 			from <strong>noncopyable</strong> when you want to prohibit copy construction  | ||||
| @@ -88,7 +89,7 @@ const std::list<T>::iterator next = boost::next(prev, 2);</pre> | ||||
| 			to verify class <b>noncopyable</b> works as expected. It has have been run  | ||||
| 			successfully under GCC 2.95, Metrowerks CodeWarrior 5.0, and Microsoft Visual  | ||||
| 			C++ 6.0 sp 3.</p> | ||||
| 		<p>Contributed by <a href="../../people/dave_abrahams.htm">Dave Abrahams</a>.</p> | ||||
| 		<p>Contributed by <a href="http://www.boost.org/people/dave_abrahams.htm">Dave Abrahams</a>.</p> | ||||
| 		<h3>Example</h3> | ||||
| 		<blockquote> | ||||
| 			<pre>// inside one of your own headers ... | ||||
| @@ -162,9 +163,9 @@ void f() { | ||||
|                 <code><em>N</em> > 0</code> or <code>void</code> | ||||
|                 when <code><em>N</em> = 0</code>. For additional | ||||
|                 information about <code>result_of</code>, see the | ||||
|                 current draft of the C++ Library TR, <a | ||||
|                 href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2004/n1647.pdf">N1647</a>, | ||||
|                 or the <code>result_of</code> <a | ||||
|                 C++ Library Technical Report, <a | ||||
|                 href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf">N1836</a>, | ||||
|                 or, for motivation and design rationale, the <code>result_of</code> <a | ||||
|                 href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1454.html">proposal</a>.</p> | ||||
|  | ||||
|                 <p>Class template <code>result_of</code> resides in | ||||
| @@ -182,12 +183,12 @@ void f() { | ||||
| 		<p>See <a href="base_from_member.html">separate documentation</a>.</p> | ||||
| 		<hr> | ||||
| 		<p>Revised  <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan | ||||
| -->02 May, 2004<!--webbot bot="Timestamp" endspan i-checksum="38582" | ||||
| -->07 November, 2007<!--webbot bot="Timestamp" endspan i-checksum="39369" | ||||
| --> | ||||
| 		</p> | ||||
| 		<p>© Copyright boost.org 1999-2003. 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>© Copyright Beman Dawes 1999-2003.</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> | ||||
|  | ||||
| 	</body> | ||||
| </html> | ||||
| </html> | ||||
							
								
								
									
										236
									
								
								value_init.htm
									
									
									
									
									
								
							
							
						
						
									
										236
									
								
								value_init.htm
									
									
									
									
									
								
							| @@ -17,20 +17,23 @@ | ||||
| <dl> | ||||
|   <dt><a href="#rationale">Rationale</a></dt> | ||||
|   <dt><a href="#intro">Introduction</a></dt> | ||||
|   <dt><a href="#details">Details</a></dt> | ||||
| </dl> | ||||
|                     | ||||
| <ul> | ||||
|           <li><a href="#valueinit">value-initialization</a></li> | ||||
|           <li><a href="#valueinitsyn">value-initialization syntax</a></li> | ||||
|           <li><a href="#compiler_issues">compiler issues</a></li> | ||||
|                     | ||||
| </ul> | ||||
|                     | ||||
| <dl class="page-index"> | ||||
|   <dt><a href="#types">Types</a></dt> | ||||
|   <dt><a href="#types">Types and objects</a></dt> | ||||
| </dl> | ||||
|                     | ||||
| <ul> | ||||
|           <li><a href="#val_init"><code>value_initialized<></code></a></li> | ||||
|           <li><a href="#val_init"><code>template class value_initialized<T></code></a></li> | ||||
|           <li><a href="#initialized_value"><code>initialized_value</code></a></li> | ||||
|                     | ||||
| </ul> | ||||
|               <a href="#acknowledgements">Acknowledgements</a><br> | ||||
| @@ -44,24 +47,104 @@ | ||||
| for    initialization. Depending on the type, the value of a newly constructed | ||||
|   object  can be zero-initialized (logically 0), default-constructed (using | ||||
|   the default constructor), or indeterminate. When writing generic code, | ||||
| this   problem must be addressed. <code>value_initialized</code> provides | ||||
| this  problem must be addressed. The template <code>value_initialized</code> provides | ||||
| a solution   with consistent syntax for value   initialization of scalar, | ||||
| union and class   types. <br> | ||||
| union and class   types. | ||||
| Moreover, <code>value_initialized</code> offers a workaround to various | ||||
| compiler issues regarding value-initialization. | ||||
|  | ||||
| Furthermore, a <code>const</code> object, <code>initialized_value</code> is provided, | ||||
| to avoid repeating the type name when retrieving the value from a | ||||
| <code>value_initialized<T></code> object. | ||||
| <br> | ||||
|   </p> | ||||
|          | ||||
| <h2><a name="intro"></a>Introduction</h2> | ||||
|       | ||||
| <p>The C++ standard [<a href="#references">1</a>] contains the definitions  | ||||
| <p> | ||||
| There are various ways to initialize a variable, in C++. The following | ||||
| declarations all <em>may</em> have a local variable initialized to its default | ||||
| value: | ||||
| <pre> | ||||
|   T1 var1; | ||||
|   T2 var2 = 0; | ||||
|   T3 var3 = {}; | ||||
|   T4 var4 = T4(); | ||||
| </pre>  | ||||
| Unfortunately, whether or not any of those declarations correctly | ||||
| initialize the variable very much depends on its type. The first | ||||
| declaration is valid for any <a href="http://www.sgi.com/tech/stl/DefaultConstructible.html"> | ||||
| DefaultConstructible</a> type (by definition). | ||||
| However, it does not always do an initialization! | ||||
| It correctly initializes the variable when it's an instance of a | ||||
| class, and the author of the class has provided a proper default | ||||
| constructor. On the other hand, the value of <code>var1</code> is <em>indeterminate</em> when | ||||
| its type is an arithmetic type, like <code>int</code>, <code>float</code>, or <code>char</code>. | ||||
| An arithmetic variable | ||||
| is of course initialized properly by the second declaration, <code>T2 | ||||
| var2 = 0</code>. But this initialization form usually won't work for a | ||||
| class type (unless the class was especially written to support being | ||||
| initialized that way). The third form,  <code>T3 var3 = {}</code> | ||||
| initializes an aggregate, typically a "C-style" <code>struct</code> or a "C-style" array. | ||||
| However, the syntax is not allowed for a class that has an explicitly declared | ||||
| constructor.  (But watch out for an upcoming C++ language change,  | ||||
| by Bjarne Stroustrup et al [<a href="#references">1</a>]!) | ||||
| The fourth form is the most generic form of them, as it | ||||
| can be used to initialize arithmetic types, class types, aggregates, pointers, and | ||||
| other types. The declaration,  <code>T4 var4 = T4()</code>, should be read | ||||
| as follows: First a temporary object is created, by <code>T4()</code>. | ||||
| This object is <a href="#valueinit">value-initialized</a>. Next the temporary | ||||
| object is copied to the named variable, <code>var4</code>. Afterwards, the temporary | ||||
| is destroyed. While the copying and the destruction are likely to | ||||
| be optimized away, C++ still requires the type <code>T4</code> to be | ||||
| <a href="CopyConstructible.html">CopyConstructible</a>. | ||||
| (So <code>T4</code> needs to be <em>both</em> DefaultConstructible <em>and</em> CopyConstructible.)  | ||||
| A class may not be CopyConstructible, for example because it may have a | ||||
| private and undefined copy constructor, | ||||
| or because it may be derived from <a href="utility.htm#Class_noncopyable">boost::noncopyable</a>. | ||||
| Scott Meyers [<a href="#references">2</a>] explains why a class would be defined like that. | ||||
| </p> | ||||
| <p> | ||||
| There is another, less obvious disadvantage to the fourth form, <code>T4 var4 = T4()</code>: | ||||
| It suffers from various  <a href="#compiler_issues">compiler issues</a>, causing | ||||
| a variable to be left uninitialized in some compiler specific cases. | ||||
| </p> | ||||
| <p> | ||||
| The template <a href="#val_init"><code>value_initialized</code></a> | ||||
| offers a generic way to initialize | ||||
| an object, like <code>T4 var4 = T4()</code>, but without requiring its type | ||||
| to be CopyConstructible. And it offers a workaround to those compiler issues | ||||
| regarding value-initialization as well! It allows getting an initialized | ||||
| variable of any type; it <em>only</em> requires the type to be DefaultConstructible. | ||||
| A properly <em>value-initialized</em> object of type <code>T</code> is | ||||
| constructed by the following declaration: | ||||
| <pre> | ||||
|   value_initialized<T> var; | ||||
| </pre> | ||||
| </p> | ||||
| <p> | ||||
| The <code>const</code> object <a href="#initialized_value"><code>initialized_value</code></a> | ||||
| allows value-initializing a variable as follows: | ||||
| <pre> | ||||
|   T var = initialized_value ; | ||||
| </pre> | ||||
| This form of initialization is semantically equivalent to <code>T4 var4 = T4()</code>, | ||||
| but robust against the aforementioned compiler issues. | ||||
|  | ||||
| </p> | ||||
|  | ||||
| <h2><a name="details"></a>Details</h2> | ||||
| <p>The C++ standard [<a href="#references">3</a>] contains the definitions  | ||||
|     of <code>zero-initialization</code> and <code>default-initialization</code>. | ||||
|      Informally, zero-initialization means that the object is given the initial | ||||
|      value 0 (converted to the type) and default-initialization means that | ||||
|  POD   [<a href="#references">2</a>] types are zero-initialized, while class | ||||
|  POD   [<a href="#references">4</a>] types are zero-initialized, while non-POD class | ||||
|  types   are initialized with their corresponding default constructors. A | ||||
| <i>declaration</i>   can contain an <i>initializer</i>, which specifies the | ||||
| object's initial value.  The initializer can be just '()', which states that | ||||
| the object shall be default-initialized  (but see below). However, if a <i>declaration</i>  | ||||
| the object shall be value-initialized  (but see below). However, if a <i>declaration</i>  | ||||
|   has no <i>initializer</i>  and it is of a non-<code>const</code>, non-<code>static</code>  | ||||
|    POD type, the initial value is indeterminate:<cite>(see §8.5 for the | ||||
|    POD type, the initial value is indeterminate: <cite>(see §8.5, [dcl.init], for the | ||||
|    accurate definitions).</cite></p> | ||||
|                     | ||||
| <pre>int x ; // no initializer. x value is indeterminate.<br>std::string s ; // no initializer, s is default-constructed.<br><br>int y = int() ; <br>// y is initialized using copy-initialization<br>// but the temporary uses an empty set of parentheses as the initializer,<br>// so it is default-constructed.<br>// A default constructed POD type is zero-initialized,<br>// therefore, y == 0.<br><br>void foo ( std::string ) ;<br>foo ( std::string() ) ; <br>// the temporary string is default constructed <br>// as indicated by the initializer ()  </pre> | ||||
| @@ -87,14 +170,11 @@ the object shall be default-initialized  (but see below). However, if a <i>decla | ||||
| <p>In order to specify value-initialization of an object we need to use the | ||||
|      empty-set initializer: (). </p> | ||||
|                     | ||||
| <p><i>(but recall that the current C++ Standard states that '()' invokes default-initialization, | ||||
| not value-initialization)</i></p> | ||||
|                     | ||||
| <p>As before, a declaration with no intializer specifies default-initialization,  | ||||
|     and a declaration with a non-empty initializer specifies copy (=xxx) or | ||||
|   direct  (xxx) initialization. </p> | ||||
|                     | ||||
| <pre>template<class T> void eat(T);<br>int x ; // indeterminate initial value.<br>std::string s; // default-initialized.<br>eat ( int() ) ; // value-initialized<br>eat ( std::string() ) ; // value-initialied</pre> | ||||
| <pre>template<class T> void eat(T);<br>int x ; // indeterminate initial value.<br>std::string s; // default-initialized.<br>eat ( int() ) ; // value-initialized<br>eat ( std::string() ) ; // value-initialized</pre> | ||||
|                      | ||||
| <h4><a name="valueinitsyn">value-initialization</a> syntax</h4> | ||||
|                     | ||||
| @@ -102,7 +182,7 @@ not value-initialization)</i></p> | ||||
| parentheses is not permitted by the syntax of initializers because it is | ||||
| parsed as the declaration of a function taking no arguments: </p> | ||||
|                     | ||||
| <pre>int x() ; // declares function int(*)()<br>int y ( int() ) ; // decalares function int(*)( int(*)() )</pre> | ||||
| <pre>int x() ; // declares function int(*)()</pre> | ||||
|                      | ||||
| <p>Thus, the empty () must be put in some other initialization context.</p> | ||||
|                     | ||||
| @@ -124,10 +204,52 @@ data member:</p> | ||||
|                     | ||||
| <pre>template<class T> <br>struct W <br>{<br>  // value-initialization of 'data' here.<br>  W() : data() {}<br>  T data ;<br>} ;<br>W<int> w ;<br>// w.data is value-initialized for any type. </pre> | ||||
|                      | ||||
| <p><code>This is the solution supplied by the value_initialized<> template | ||||
|      class.</code></p> | ||||
| <p>This is the solution as it was supplied by earlier versions of the | ||||
| <code>value_initialized<T></code> template | ||||
|      class. Unfortunately this approach suffered from various compiler issues.</p> | ||||
| 		  | ||||
| <h4><a name="compiler_issues">compiler issues</a> </h4> | ||||
|  | ||||
| Various compilers haven't yet fully implemented value-initialization. | ||||
| So when an object should be <em>value-initialized</em> (according to the C++ Standard), | ||||
| it <em>may</em> in practice still be left uninitialized, because of those | ||||
| compiler issues! It's hard to make a general statement on what those issues | ||||
| are like, because they depend on the compiler you are using, its version number, | ||||
| and the type of object you would like to have value-initialized. | ||||
| Compilers usually support value-initialization for built-in types properly. | ||||
| But objects of user-defined types that involve <em>aggregates</em> may <em>in some cases</em> | ||||
| be partially, or even entirely left uninitialized, when they should be value-initialized. | ||||
| </p> | ||||
| <p> | ||||
| We have encountered issues regarding value-initialization on compilers by | ||||
| Microsoft, Sun, Borland, and GNU. Here is a list of bug reports on those issues: | ||||
| <table summary="Compiler bug reports regarding value-initialization" border="0" cellpadding="7" cellspacing="1" > | ||||
| <tr><td> | ||||
| <a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100744"> | ||||
| Microsoft Feedback ID 100744 - Value-initialization in new-expression</a> | ||||
| <br>Reported by Pavel Kuznetsov (MetaCommunications Engineering), 2005-07-28 | ||||
| <br> | ||||
| <a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30111"> | ||||
| GCC Bug 30111 - Value-initialization of POD base class doesn't initialize members</a> | ||||
| <br>Reported by Jonathan Wakely, 2006-12-07  | ||||
| <br> | ||||
| <a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33916"> | ||||
| GCC Bug 33916 - Default constructor fails to initialize array members</a> | ||||
| <br>Reported by Michael Elizabeth Chastain, 2007-10-26 | ||||
| <br> | ||||
| <a href="http://qc.codegear.com/wc/qcmain.aspx?d=51854"> | ||||
| Borland Report 51854 - Value-initialization: POD struct should be zero-initialized</a> | ||||
| <br>Reported by Niels Dekker (LKEB, Leiden University Medical Center), 2007-09-11 | ||||
| <br> | ||||
| </td></tr></table> | ||||
| </p><p> | ||||
| New versions of <code>value_initialized</code> | ||||
| (Boost release version 1.35 or higher) | ||||
| offer a workaround to these issues: <code>value_initialized</code> will now clear | ||||
| its internal data, prior to constructing the object that it contains. | ||||
| </p> | ||||
|                     | ||||
| <h2><a name="types"></a>Types</h2> | ||||
| <h2><a name="types"></a>Types and objects</h2> | ||||
|                     | ||||
| <h2><a name="val_init"><code>template class value_initialized<T></code></a></h2> | ||||
|                     | ||||
| @@ -190,28 +312,80 @@ the wrapped object is always performed with the <code>get()</code> idiom:</p> | ||||
|                     | ||||
| <pre>value_initialized<int> x ;<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> cx ;<br>get(x) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int> const x_c ;<br>get(x_c) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int const> const cx_c ;<br>get(cx_c) = 1 ; // ERROR: Cannot modify a const object<br></pre> | ||||
|                      | ||||
| <h2><a name="initialized_value"><code>initialized_value</code></a></h2> | ||||
|  | ||||
| <pre> | ||||
| namespace boost { | ||||
| class initialized_value_t | ||||
| { | ||||
|   public : | ||||
|     template <class T> operator T() const ; | ||||
| }; | ||||
|  | ||||
| initialized_value_t const initialized_value = {} ; | ||||
|  | ||||
| } // namespace boost | ||||
| </pre> | ||||
|  | ||||
| <code>initialized_value</code> provides a convenient way to get | ||||
| an initialized value: its conversion operator provides an appropriate | ||||
| <em>value-initialized</em> object for any CopyConstructible type. | ||||
|  | ||||
| Suppose you need to have an initialized variable of type <code>T</code>. | ||||
| You could do it as follows: | ||||
| <pre> | ||||
|   T var = T(); | ||||
| </pre> | ||||
| But as mentioned before, this form suffers from various compiler issues. | ||||
| The template <code>value_initialized</code> offers a workaround: | ||||
| <pre> | ||||
|   T var = get( value_initialized<T>() ); | ||||
| </pre> | ||||
| Unfortunately both forms repeat the type name, which | ||||
| is rather short now (<code>T</code>), but could of course be  | ||||
| more like <code>Namespace::Template<Arg>::Type</code>. | ||||
| Instead, one could use <code>initialized_value</code> as follows: | ||||
| <pre> | ||||
|   T var = initialized_value ; | ||||
| </pre> | ||||
|                      | ||||
| <h3><a name="references">References</a></h3> | ||||
|           [1] The C++ Standard, ISO/IEC 14882:98 <br> | ||||
|           [2] Plain Old Data            | ||||
|           [1] Bjarne Stroustrup, Gabriel Dos Reis, and J. Stephen Adamczyk wrote | ||||
|           various papers, proposing to extend the support for brace-enclosed <em>initializer lists</em> | ||||
|           in the next version of C++. | ||||
|           This would allow a variable <code>var</code> of any DefaultConstructible type | ||||
|           <code>T</code> to be <em>value-initialized</em> by doing <code>T var = {}</code>. | ||||
|           The papers are listed at Bjarne's web page, | ||||
|           <a href="http://www.research.att.com/~bs/WG21.html">My C++ Standards committee papers</a>  <br>  | ||||
|           [2] Scott Meyers, Effective C++, Third Edition, item 6, | ||||
|           <em>Explicitly disallow the use of compiler-generated functions you do not want</em>,  | ||||
|           <a href="http://www.aristeia.com/books.html">Scott Meyers: Books and CDs</a>  <br> | ||||
|           [3] The C++ Standard, Second edition (2003), ISO/IEC 14882:2003 <br> | ||||
|           [4] POD stands for "Plain Old Data" | ||||
|  | ||||
| <h3><a name="acknowledgements"></a>Acknowledgements</h3> | ||||
|      value_initialized was developed by Fernando Cacciola, with help and | ||||
| suggestions from David Abrahams and Darin Adler.<br> | ||||
| Special thanks to Bj<EFBFBD>rn Karlsson who carefully edited and completed this documentation. | ||||
| <pre> </pre> | ||||
|                      | ||||
| <hr>           | ||||
| <p>Revised 19 September 2002</p> | ||||
|                     | ||||
| <p>© Copyright boost.org 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> | ||||
|                     | ||||
| Special thanks to Björn Karlsson who carefully edited and completed this documentation. | ||||
|                   | ||||
| <p>value_initialized was reimplemented by Fernando Cacciola and Niels Dekker | ||||
| for Boost release version 1.35 (2008), offering a workaround to various compiler issues. | ||||
|      </p> | ||||
| <p>initialized_value was written by Niels Dekker, and added to Boost release version 1.36 (2008). | ||||
|      </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 discussion list | ||||
| at <a href="http://www.yahoogroups.com/list/boost">www.yahoogroups.com/list/boost</a>. | ||||
|  href="http://www.boost.org">www.boost.org</a>. | ||||
|      </p> | ||||
|                      | ||||
| <hr>           | ||||
| <p>Revised 23 May 2008</p> | ||||
|                     | ||||
| <p>© Copyright Fernando Cacciola, 2002, 2008.</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> | ||||
|  | ||||
|  <br> | ||||
|  <br> | ||||
|      | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| // (C) 2002, Fernando Luis Cacciola Carballal. | ||||
| // Copyright 2002-2008, Fernando Luis Cacciola Carballal. | ||||
| // | ||||
| // Distributed under the Boost Software License, Version 1.0. (See | ||||
| // accompanying file LICENSE_1_0.txt or copy at | ||||
| @@ -6,12 +6,16 @@ | ||||
| // | ||||
| // Test program for "boost/utility/value_init.hpp" | ||||
| // | ||||
| // Initial: 21 Agu 2002 | ||||
| // 21 Ago 2002 (Created) Fernando Cacciola | ||||
| // 15 Jan 2008 (Added tests regarding compiler issues) Fernando Cacciola, Niels Dekker | ||||
| // 23 May 2008 (Added tests regarding initialized_value) Niels Dekker | ||||
|  | ||||
| #include <cstring>  // For memcmp. | ||||
| #include <iostream> | ||||
| #include <string> | ||||
|  | ||||
| #include "boost/utility/value_init.hpp" | ||||
| #include <boost/shared_ptr.hpp> | ||||
|  | ||||
| #ifdef __BORLANDC__ | ||||
| #pragma hdrstop | ||||
| @@ -49,7 +53,7 @@ struct NonPODBase | ||||
| struct NonPOD : NonPODBase | ||||
| { | ||||
|   NonPOD () : id() {} | ||||
|   NonPOD ( std::string const& id_) : id(id_) {} | ||||
|   explicit NonPOD ( std::string const& id_) : id(id_) {} | ||||
|  | ||||
|   friend std::ostream& operator << ( std::ostream& os, NonPOD const& npod ) | ||||
|     { return os << '(' << npod.id << ')' ; } | ||||
| @@ -60,12 +64,165 @@ struct NonPOD : NonPODBase | ||||
|   std::string id ; | ||||
| } ; | ||||
|  | ||||
| template<class T> | ||||
| void test ( T const& y, T const& z ) | ||||
| // | ||||
| // Sample aggregate POD struct type | ||||
| // Some compilers do not correctly value-initialize such a struct, for example: | ||||
| // Borland C++ Report #51854, "Value-initialization: POD struct should be zero-initialized " | ||||
| // http://qc.codegear.com/wc/qcmain.aspx?d=51854 | ||||
| // | ||||
| struct AggregatePODStruct | ||||
| { | ||||
|   float f; | ||||
|   char  c; | ||||
|   int   i; | ||||
| }; | ||||
|  | ||||
| bool operator == ( AggregatePODStruct const& lhs, AggregatePODStruct const& rhs ) | ||||
| { return lhs.f == rhs.f && lhs.c == rhs.c && lhs.i == rhs.i ; } | ||||
|  | ||||
| // | ||||
| // An aggregate struct that contains an std::string and an int. | ||||
| // Pavel Kuznetsov (MetaCommunications Engineering) used a struct like | ||||
| // this to reproduce the Microsoft Visual C++ compiler bug, reported as | ||||
| // Feedback ID 100744, "Value-initialization in new-expression" | ||||
| // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100744 | ||||
| // | ||||
| struct StringAndInt | ||||
| { | ||||
|   std::string s; | ||||
|   int i; | ||||
| }; | ||||
|  | ||||
| bool operator == ( StringAndInt const& lhs, StringAndInt const& rhs ) | ||||
| { return lhs.s == rhs.s && lhs.i == rhs.i ; } | ||||
|  | ||||
|  | ||||
| // | ||||
| // A struct that has an explicit (user defined) destructor. | ||||
| // Some compilers do not correctly value-initialize such a struct, for example: | ||||
| // Microsoft Visual C++, Feedback ID 100744, "Value-initialization in new-expression" | ||||
| // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100744 | ||||
| // | ||||
| struct StructWithDestructor | ||||
| { | ||||
|   int i; | ||||
|   ~StructWithDestructor() {} | ||||
| }; | ||||
|  | ||||
| bool operator == ( StructWithDestructor const& lhs, StructWithDestructor const& rhs ) | ||||
| { return lhs.i == rhs.i ; } | ||||
|  | ||||
|  | ||||
| // | ||||
| // A struct that has a virtual function. | ||||
| // Some compilers do not correctly value-initialize such a struct either, for example: | ||||
| // Microsoft Visual C++, Feedback ID 100744, "Value-initialization in new-expression" | ||||
| // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100744 | ||||
| // | ||||
| struct StructWithVirtualFunction | ||||
| { | ||||
|   int i; | ||||
|   virtual void VirtualFunction();  | ||||
| }; | ||||
|  | ||||
| void StructWithVirtualFunction::VirtualFunction() | ||||
| { | ||||
| } | ||||
|  | ||||
| bool operator == ( StructWithVirtualFunction const& lhs, StructWithVirtualFunction const& rhs ) | ||||
| { return lhs.i == rhs.i ; } | ||||
|  | ||||
|  | ||||
| // | ||||
| // A struct that is derived from an aggregate POD struct. | ||||
| // Some compilers do not correctly value-initialize such a struct, for example: | ||||
| // GCC Bugzilla Bug 30111,  "Value-initialization of POD base class doesn't initialize members", | ||||
| // reported by Jonathan Wakely, http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30111 | ||||
| // | ||||
| struct DerivedFromAggregatePODStruct : AggregatePODStruct | ||||
| { | ||||
|   DerivedFromAggregatePODStruct() : AggregatePODStruct() {} | ||||
| }; | ||||
|  | ||||
| // | ||||
| // A struct that wraps an aggregate POD struct as data member. | ||||
| // | ||||
| struct AggregatePODStructWrapper | ||||
| { | ||||
|   AggregatePODStructWrapper() : dataMember() {} | ||||
|   AggregatePODStruct dataMember; | ||||
| }; | ||||
|  | ||||
| bool operator == ( AggregatePODStructWrapper const& lhs, AggregatePODStructWrapper const& rhs ) | ||||
| { return lhs.dataMember == rhs.dataMember ; } | ||||
|  | ||||
| typedef unsigned char ArrayOfBytes[256]; | ||||
|  | ||||
|  | ||||
| // | ||||
| // A struct that allows testing whether the appropriate copy functions are called. | ||||
| // | ||||
| struct CopyFunctionCallTester | ||||
| { | ||||
|   bool is_copy_constructed; | ||||
|   bool is_assignment_called; | ||||
|  | ||||
|   CopyFunctionCallTester() | ||||
|   : is_copy_constructed(false), is_assignment_called(false) {} | ||||
|  | ||||
|   CopyFunctionCallTester(const CopyFunctionCallTester & ) | ||||
|   : is_copy_constructed(true), is_assignment_called(false) {} | ||||
|  | ||||
|   CopyFunctionCallTester & operator=(const CopyFunctionCallTester & ) | ||||
|   { | ||||
|     is_assignment_called = true ; | ||||
|     return *this ; | ||||
|   } | ||||
| }; | ||||
|  | ||||
|  | ||||
| template<class T> | ||||
| void check_initialized_value ( T const& y ) | ||||
| { | ||||
|   T initializedValue = boost::initialized_value ; | ||||
|   BOOST_CHECK ( y == initializedValue ) ; | ||||
| } | ||||
|  | ||||
| #ifdef  __BORLANDC__ | ||||
| #if __BORLANDC__ == 0x582 | ||||
| void check_initialized_value( NonPOD const& ) | ||||
| { | ||||
|   // The initialized_value check is skipped for Borland 5.82 | ||||
|   // and this type (NonPOD), because the following statement | ||||
|   // won't compile on this particular compiler version: | ||||
|   //   NonPOD initializedValue = boost::initialized_value() ; | ||||
| // | ||||
|   // This is caused by a compiler bug, that is fixed with a newer version | ||||
|   // of the Borland compiler.  The Release Notes for Delphi(R) 2007 for | ||||
|   // Win32(R) and C++Builder(R) 2007 (http://dn.codegear.com/article/36575) | ||||
|   // say about similar statements: | ||||
|   //   both of these statements now compile but under 5.82 got the error: | ||||
|   //   Error E2015: Ambiguity between 'V::V(const A &)' and 'V::V(const V &)' | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| // | ||||
| // This test function tests boost::value_initialized<T> for a specific type T. | ||||
| // The first argument (y) is assumed have the value of a value-initialized object. | ||||
| // Returns true on success. | ||||
| // | ||||
| template<class T> | ||||
| bool test ( T const& y, T const& z ) | ||||
| { | ||||
|   const boost::unit_test::counter_t counter_before_test = boost::minimal_test::errors_counter(); | ||||
|  | ||||
|   check_initialized_value(y); | ||||
|  | ||||
|   boost::value_initialized<T> x ; | ||||
|   BOOST_CHECK ( y == x ) ; | ||||
|   BOOST_CHECK ( y == boost::get(x) ) ; | ||||
|  | ||||
|   static_cast<T&>(x) = z ; | ||||
|   boost::get(x) = z ; | ||||
|   BOOST_CHECK ( x == z ) ; | ||||
| @@ -77,6 +234,16 @@ void test ( T const& y, T const& z ) | ||||
|   x_c_ref = z ; | ||||
|   BOOST_CHECK ( x_c == z ) ; | ||||
|  | ||||
|   boost::value_initialized<T> const copy1 = x; | ||||
|   BOOST_CHECK ( boost::get(copy1) == boost::get(x) ) ; | ||||
|  | ||||
|   boost::value_initialized<T> copy2; | ||||
|   copy2 = x; | ||||
|   BOOST_CHECK ( boost::get(copy2) == boost::get(x) ) ; | ||||
|    | ||||
|   boost::shared_ptr<boost::value_initialized<T> > ptr( new boost::value_initialized<T> ); | ||||
|   BOOST_CHECK ( y == *ptr ) ; | ||||
|  | ||||
| #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) | ||||
|   boost::value_initialized<T const> cx ; | ||||
|   BOOST_CHECK ( y == cx ) ; | ||||
| @@ -86,14 +253,75 @@ void test ( T const& y, T const& z ) | ||||
|   BOOST_CHECK ( y == cx_c ) ; | ||||
|   BOOST_CHECK ( y == boost::get(cx_c) ) ; | ||||
| #endif | ||||
|  | ||||
|   return boost::minimal_test::errors_counter() == counter_before_test ; | ||||
| } | ||||
|  | ||||
| int test_main(int, char **) | ||||
| { | ||||
|   test( 0,1234 ) ; | ||||
|   test( 0.0,12.34 ) ; | ||||
|   test( POD(0,0,0.0), POD('a',1234,56.78) ) ; | ||||
|   test( NonPOD( std::string() ), NonPOD( std::string("something") ) ) ; | ||||
|   BOOST_CHECK ( test( 0,1234 ) ) ; | ||||
|   BOOST_CHECK ( test( 0.0,12.34 ) ) ; | ||||
|   BOOST_CHECK ( test( POD(0,0,0.0), POD('a',1234,56.78) ) ) ; | ||||
|   BOOST_CHECK ( test( NonPOD( std::string() ), NonPOD( std::string("something") ) ) ) ; | ||||
|  | ||||
|   NonPOD NonPOD_object( std::string("NonPOD_object") ); | ||||
|   BOOST_CHECK ( test<NonPOD *>( 0, &NonPOD_object ) ) ; | ||||
|  | ||||
|   AggregatePODStruct zeroInitializedAggregatePODStruct = { 0.0f, '\0', 0 }; | ||||
|   AggregatePODStruct nonZeroInitializedAggregatePODStruct = { 1.25f, 'a', -1 }; | ||||
|   BOOST_CHECK ( test(zeroInitializedAggregatePODStruct, nonZeroInitializedAggregatePODStruct) ); | ||||
|  | ||||
|   StringAndInt stringAndInt0; | ||||
|   StringAndInt stringAndInt1; | ||||
|   stringAndInt0.i = 0; | ||||
|   stringAndInt1.i = 1; | ||||
|   stringAndInt1.s = std::string("1"); | ||||
|   BOOST_CHECK ( test(stringAndInt0, stringAndInt1) ); | ||||
|  | ||||
|   StructWithDestructor structWithDestructor0; | ||||
|   StructWithDestructor structWithDestructor1; | ||||
|   structWithDestructor0.i = 0; | ||||
|   structWithDestructor1.i = 1; | ||||
|   BOOST_CHECK ( test(structWithDestructor0, structWithDestructor1) ); | ||||
|  | ||||
|   StructWithVirtualFunction structWithVirtualFunction0; | ||||
|   StructWithVirtualFunction structWithVirtualFunction1; | ||||
|   structWithVirtualFunction0.i = 0; | ||||
|   structWithVirtualFunction1.i = 1; | ||||
|   BOOST_CHECK ( test(structWithVirtualFunction0, structWithVirtualFunction1) ); | ||||
|  | ||||
|   DerivedFromAggregatePODStruct derivedFromAggregatePODStruct0; | ||||
|   DerivedFromAggregatePODStruct derivedFromAggregatePODStruct1; | ||||
|   static_cast<AggregatePODStruct &>(derivedFromAggregatePODStruct0) = zeroInitializedAggregatePODStruct; | ||||
|   static_cast<AggregatePODStruct &>(derivedFromAggregatePODStruct1) = nonZeroInitializedAggregatePODStruct; | ||||
|   BOOST_CHECK ( test(derivedFromAggregatePODStruct0, derivedFromAggregatePODStruct1) ); | ||||
|  | ||||
|   AggregatePODStructWrapper aggregatePODStructWrapper0; | ||||
|   AggregatePODStructWrapper aggregatePODStructWrapper1; | ||||
|   aggregatePODStructWrapper0.dataMember = zeroInitializedAggregatePODStruct; | ||||
|   aggregatePODStructWrapper1.dataMember = nonZeroInitializedAggregatePODStruct; | ||||
|   BOOST_CHECK ( test(aggregatePODStructWrapper0, aggregatePODStructWrapper1) ); | ||||
|  | ||||
|   ArrayOfBytes zeroInitializedArrayOfBytes = { 0 }; | ||||
|   boost::value_initialized<ArrayOfBytes> valueInitializedArrayOfBytes; | ||||
|   BOOST_CHECK (std::memcmp(get(valueInitializedArrayOfBytes), zeroInitializedArrayOfBytes, sizeof(ArrayOfBytes)) == 0); | ||||
|  | ||||
|   boost::value_initialized<ArrayOfBytes> valueInitializedArrayOfBytes2; | ||||
|   valueInitializedArrayOfBytes2 = valueInitializedArrayOfBytes; | ||||
|   BOOST_CHECK (std::memcmp(get(valueInitializedArrayOfBytes), get(valueInitializedArrayOfBytes2), sizeof(ArrayOfBytes)) == 0); | ||||
|  | ||||
|   boost::value_initialized<CopyFunctionCallTester> copyFunctionCallTester1; | ||||
|   BOOST_CHECK ( ! get(copyFunctionCallTester1).is_copy_constructed); | ||||
|   BOOST_CHECK ( ! get(copyFunctionCallTester1).is_assignment_called); | ||||
|  | ||||
|   boost::value_initialized<CopyFunctionCallTester> copyFunctionCallTester2 = boost::value_initialized<CopyFunctionCallTester>(copyFunctionCallTester1); | ||||
|   BOOST_CHECK ( get(copyFunctionCallTester2).is_copy_constructed); | ||||
|   BOOST_CHECK ( ! get(copyFunctionCallTester2).is_assignment_called); | ||||
|  | ||||
|   boost::value_initialized<CopyFunctionCallTester> copyFunctionCallTester3; | ||||
|   copyFunctionCallTester3 = boost::value_initialized<CopyFunctionCallTester>(copyFunctionCallTester1); | ||||
|   BOOST_CHECK ( ! get(copyFunctionCallTester3).is_copy_constructed); | ||||
|   BOOST_CHECK ( get(copyFunctionCallTester3).is_assignment_called); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
| @@ -101,7 +329,3 @@ int test_main(int, char **) | ||||
|  | ||||
| unsigned int expected_failures = 0; | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| // (C) 2002, Fernando Luis Cacciola Carballal. | ||||
| // Copyright 2002, Fernando Luis Cacciola Carballal. | ||||
| // | ||||
| // Distributed under the Boost Software License, Version 1.0. (See | ||||
| // accompanying file LICENSE_1_0.txt or copy at | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| // (C) 2002, Fernando Luis Cacciola Carballal. | ||||
| // Copyright 2002, Fernando Luis Cacciola Carballal. | ||||
| // | ||||
| // Distributed under the Boost Software License, Version 1.0. (See | ||||
| // accompanying file LICENSE_1_0.txt or copy at | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| // (C) 2002, Fernando Luis Cacciola Carballal. | ||||
| // Copyright 2002, Fernando Luis Cacciola Carballal. | ||||
| // | ||||
| // Distributed under the Boost Software License, Version 1.0. (See | ||||
| // accompanying file LICENSE_1_0.txt or copy at | ||||
|   | ||||
							
								
								
									
										126
									
								
								verify_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								verify_test.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| // | ||||
| //  verify_test.cpp - a test for BOOST_VERIFY | ||||
| // | ||||
| //  Copyright (c) 2002 Peter Dimov and Multi Media Ltd. | ||||
| //  Copyright (c) 2007 Peter Dimov | ||||
| // | ||||
| // Distributed under the Boost Software License, Version 1.0. (See | ||||
| // accompanying file LICENSE_1_0.txt or copy at | ||||
| // http://www.boost.org/LICENSE_1_0.txt) | ||||
| // | ||||
|  | ||||
| #include <boost/detail/lightweight_test.hpp> | ||||
|  | ||||
| #include <boost/assert.hpp> | ||||
|  | ||||
| int f( int & x ) | ||||
| { | ||||
|     return ++x; | ||||
| } | ||||
|  | ||||
| void test_default() | ||||
| { | ||||
|     int x = 1; | ||||
|  | ||||
|     BOOST_VERIFY( 1 ); | ||||
|     BOOST_VERIFY( x == 1 ); | ||||
|     BOOST_VERIFY( ++x ); | ||||
|     BOOST_VERIFY( f(x) ); | ||||
|     BOOST_VERIFY( &x ); | ||||
|  | ||||
|     BOOST_TEST( x == 3 ); | ||||
| } | ||||
|  | ||||
| #define BOOST_DISABLE_ASSERTS | ||||
| #include <boost/assert.hpp> | ||||
|  | ||||
| void test_disabled() | ||||
| { | ||||
|     int x = 1; | ||||
|  | ||||
|     BOOST_VERIFY( 1 ); | ||||
|     BOOST_VERIFY( x == 1 ); | ||||
|     BOOST_VERIFY( ++x ); | ||||
|     BOOST_VERIFY( f(x) ); | ||||
|     BOOST_VERIFY( &x ); | ||||
|  | ||||
|     BOOST_TEST( x == 3 ); | ||||
|  | ||||
|     BOOST_VERIFY( 0 ); | ||||
|     BOOST_VERIFY( !x ); | ||||
|     BOOST_VERIFY( x == 0 ); | ||||
|     BOOST_VERIFY( !++x ); | ||||
|     BOOST_VERIFY( !f(x) ); | ||||
|  | ||||
|     BOOST_TEST( x == 5 ); | ||||
|  | ||||
|     void * p = 0; | ||||
|     BOOST_VERIFY( p ); | ||||
| } | ||||
|  | ||||
| #undef BOOST_DISABLE_ASSERTS | ||||
|  | ||||
| #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) | ||||
| { | ||||
| #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; | ||||
| } | ||||
|  | ||||
| struct X | ||||
| { | ||||
|     static bool f() | ||||
|     { | ||||
|         BOOST_VERIFY( 0 ); | ||||
|         return false; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| void test_handler() | ||||
| { | ||||
|     int x = 1; | ||||
|  | ||||
|     BOOST_VERIFY( 1 ); | ||||
|     BOOST_VERIFY( x == 1 ); | ||||
|     BOOST_VERIFY( ++x ); | ||||
|     BOOST_VERIFY( f(x) ); | ||||
|     BOOST_VERIFY( &x ); | ||||
|  | ||||
|     BOOST_TEST( x == 3 ); | ||||
|  | ||||
|     BOOST_VERIFY( 0 ); | ||||
|     BOOST_VERIFY( !x ); | ||||
|     BOOST_VERIFY( x == 0 ); | ||||
|     BOOST_VERIFY( !++x ); | ||||
|     BOOST_VERIFY( !f(x) ); | ||||
|  | ||||
|     BOOST_TEST( x == 5 ); | ||||
|  | ||||
|     void * p = 0; | ||||
|     BOOST_VERIFY( p ); | ||||
|  | ||||
|     BOOST_VERIFY( X::f() ); | ||||
|  | ||||
|     BOOST_TEST( handler_invoked == 8 ); | ||||
| } | ||||
|  | ||||
| #undef BOOST_ENABLE_ASSERT_HANDLER | ||||
|  | ||||
| int main() | ||||
| { | ||||
|     test_default(); | ||||
|     test_disabled(); | ||||
|     test_handler(); | ||||
|  | ||||
|     return boost::report_errors(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user