mirror of
				https://github.com/boostorg/utility.git
				synced 2025-11-04 02:11:45 +01:00 
			
		
		
		
	Compare commits
	
		
			35 Commits
		
	
	
		
			boost-1.29
			...
			svn-branch
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					985d2ff669 | ||
| 
						 | 
					dc294f7225 | ||
| 
						 | 
					3dffb91af6 | ||
| 
						 | 
					56acf9c325 | ||
| 
						 | 
					c6e3957efc | ||
| 
						 | 
					25e8284950 | ||
| 
						 | 
					37a6537a5b | ||
| 
						 | 
					80df1d8f12 | ||
| 
						 | 
					75afed7f17 | ||
| 
						 | 
					1d7066aee1 | ||
| 
						 | 
					12272a38d4 | ||
| 
						 | 
					04f901e52e | ||
| 
						 | 
					fabfb31bf6 | ||
| 
						 | 
					683701cd07 | ||
| 
						 | 
					119c64be0b | ||
| 
						 | 
					d429c9a7d8 | ||
| 
						 | 
					1e8216431b | ||
| 
						 | 
					e45b2e2136 | ||
| 
						 | 
					9e6951009b | ||
| 
						 | 
					a009a209f1 | ||
| 
						 | 
					97605056ed | ||
| 
						 | 
					8fcfa33d33 | ||
| 
						 | 
					aa65e3da3b | ||
| 
						 | 
					b4cfadb4d5 | ||
| 
						 | 
					45a6249668 | ||
| 
						 | 
					1d601aef4d | ||
| 
						 | 
					32fb45eba9 | ||
| 
						 | 
					2b7d10aceb | ||
| 
						 | 
					5dc62711e1 | ||
| 
						 | 
					252c02aca0 | ||
| 
						 | 
					9655beb7ba | ||
| 
						 | 
					f0ea53e77e | ||
| 
						 | 
					4755b42909 | ||
| 
						 | 
					ef9af03c6c | ||
| 
						 | 
					7439073cbf | 
@@ -472,7 +472,7 @@ Semantics
 | 
			
		||||
 | 
			
		||||
<TR>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Font
 | 
			
		||||
Front
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
<tt>a.front()</tt>
 | 
			
		||||
@@ -482,7 +482,7 @@ Font
 | 
			
		||||
otherwise.
 | 
			
		||||
</TD>
 | 
			
		||||
<TD VAlign=top>
 | 
			
		||||
Equivalent to <tt>*(a.first())</tt>.
 | 
			
		||||
Equivalent to <tt>*(a.begin())</tt>.
 | 
			
		||||
</TD>
 | 
			
		||||
</TR>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										130
									
								
								OptionalPointee.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								OptionalPointee.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,130 @@
 | 
			
		||||
<HTML>
 | 
			
		||||
<Head>
 | 
			
		||||
<Title>OptionalPointee Concept</Title>
 | 
			
		||||
</HEAD>
 | 
			
		||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" 
 | 
			
		||||
        ALINK="#ff0000"> 
 | 
			
		||||
<IMG SRC="../../c++boost.gif" 
 | 
			
		||||
     ALT="C++ Boost" width="277" height="86"> 
 | 
			
		||||
<!--end header-->
 | 
			
		||||
<BR Clear>
 | 
			
		||||
<H1>Concept: OptionalPointee</H1>
 | 
			
		||||
 | 
			
		||||
<h3>Description</h3>
 | 
			
		||||
A type is a model of <i>OptionalPointee</i> if it points to (or refers to) a value 
 | 
			
		||||
that may not exist. That is, if it has a <b>pointee</b> which might be <b>valid</b>
 | 
			
		||||
(existent) or <b>invalid</b> (inexistent); and it is possible to test whether the 
 | 
			
		||||
pointee is valid or not.
 | 
			
		||||
This model does <u>not</u> imply pointer semantics: i.e., it does not imply shallow copy nor
 | 
			
		||||
aliasing.
 | 
			
		||||
<h3>Notation</h3>
 | 
			
		||||
<Table>
 | 
			
		||||
  <TR>
 | 
			
		||||
    <TD VAlign=top> <tt>T</tt> </TD>
 | 
			
		||||
    <TD VAlign=top> is a type that is a model of OptionalPointee</TD>
 | 
			
		||||
  </TR>
 | 
			
		||||
  <TR>
 | 
			
		||||
    <TD VAlign=top> <tt>t</tt> </TD>
 | 
			
		||||
    <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>
 | 
			
		||||
  <TR>
 | 
			
		||||
    <TH> Name </TH>
 | 
			
		||||
    <TH> Expression </TH>
 | 
			
		||||
    <TH> Return type </TH>
 | 
			
		||||
    <TH> Semantics </TH>
 | 
			
		||||
  </TR>
 | 
			
		||||
  <TR>
 | 
			
		||||
    <TD VAlign=top>Value Access</TD>
 | 
			
		||||
    <TD VAlign=top> <tt>*t</tt></TD>
 | 
			
		||||
    <TD VAlign=top> <tt>T&</tt></TD>
 | 
			
		||||
    <TD VAlign=top>If the pointee is valid returns a reference to
 | 
			
		||||
      the pointee.<br>
 | 
			
		||||
      If the pointee is invalid the result is <i>undefined</i>.</TD>
 | 
			
		||||
    <TD VAlign=top> </TD>
 | 
			
		||||
  </TR>
 | 
			
		||||
  <TR>
 | 
			
		||||
    <TD VAlign=top>Value Access</TD>
 | 
			
		||||
    <TD VAlign=top> <tt>t-><i>xyz</i></tt></TD>
 | 
			
		||||
    <TD VAlign=top> <tt>T*</tt></TD>
 | 
			
		||||
    <TD VAlign=top>If the pointee is valid returns a builtin pointer to the pointee.<br>
 | 
			
		||||
      If the pointee is invalid the result is <i>undefined</i> (It might not even return NULL).<br>
 | 
			
		||||
    </TD>
 | 
			
		||||
    <TD VAlign=top> </TD>
 | 
			
		||||
  </TR>
 | 
			
		||||
  <TR>
 | 
			
		||||
    <TD VAlign=top>Validity Test</TD>
 | 
			
		||||
    <TD VAlign=top> <tt>t</tt><br>
 | 
			
		||||
      <tt>t != 0</tt><br>
 | 
			
		||||
      <tt>!!t</tt>
 | 
			
		||||
     </TD>
 | 
			
		||||
    <TD VAlign=top> bool </TD>
 | 
			
		||||
    <TD VAlign=top>If the pointee is valid returns true.<br>
 | 
			
		||||
      If the pointee is invalid returns false.</TD>
 | 
			
		||||
    <TD VAlign=top></TD>
 | 
			
		||||
  </TR>
 | 
			
		||||
  <TR>
 | 
			
		||||
    <TD VAlign=top>Invalidity Test</TD>
 | 
			
		||||
    <TD VAlign=top> <tt>t == 0</tt><br>
 | 
			
		||||
                    <tt>!t</tt>
 | 
			
		||||
    </TD>
 | 
			
		||||
    <TD VAlign=top> bool </TD>
 | 
			
		||||
    <TD VAlign=top>If the pointee is valid returns false.<br>
 | 
			
		||||
      If the pointee is invalid returns true.</TD>
 | 
			
		||||
    <TD VAlign=top></TD>
 | 
			
		||||
  </TR>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Models</h3>
 | 
			
		||||
 | 
			
		||||
<UL>
 | 
			
		||||
  <LI><tt>pointers, both builtin and smart.</tt>
 | 
			
		||||
  <LI><tt>boost::optional<></tt>
 | 
			
		||||
</UL>
 | 
			
		||||
 | 
			
		||||
<HR>
 | 
			
		||||
<h3>OptionalPointee and relational operations</h3>
 | 
			
		||||
<p>This concept does not define any particular semantic for relational operations, therefore,
 | 
			
		||||
a type which models this concept might have either shallow or deep relational semantics.<br>
 | 
			
		||||
For instance, pointers, which are models of OptionalPointee, have shallow relational operators:
 | 
			
		||||
comparisons of pointers do not involve comparisons of pointees.
 | 
			
		||||
This makes sense for pointers because they have shallow copy semantics.<br>
 | 
			
		||||
But boost::optional<T>, on the other hand, which is also a model of OptionalPointee, has
 | 
			
		||||
deep-copy and deep-relational semantics.<br>
 | 
			
		||||
If generic code is written for this concept, it is important not to use relational
 | 
			
		||||
operators directly because the semantics might be different depending on the actual type.<br>
 | 
			
		||||
Still, the concept itsef can be used to define a <i>deep</i> equality-test that can
 | 
			
		||||
be used in generic code with any type which models OptionalPointee:</p>
 | 
			
		||||
<a name="equal"></a>
 | 
			
		||||
<pre>
 | 
			
		||||
template<class OptionalPointee>
 | 
			
		||||
inline
 | 
			
		||||
bool equal_pointees ( OptionalPointee const& x, OptionalPointee const& y )
 | 
			
		||||
{
 | 
			
		||||
  return (!x) != (!y) ? false : ( !x ? true : (*x) == (*y) ) ;
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
<p>The preceding generic function has the following semantics:<br>
 | 
			
		||||
If both x and y have valid pointees, it compares pointee's values via (*x == *y).<br>
 | 
			
		||||
If only one has a valid pointee, returns false.<br>
 | 
			
		||||
If both have invalid pointees, returns true.</p>
 | 
			
		||||
<p><code>equal_pointees()</code> is implemented in <a href="../../boost/optional.hpp">optional.hpp</a></p>
 | 
			
		||||
<p>Notice that OptionalPointee does not imply aliasing (and optional<> for instance does not alias);
 | 
			
		||||
so direct usage of relational operators with the implied aliasing of shallow semantics
 | 
			
		||||
-as with pointers- should not be used with generic code written for this concept.</p>
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
<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.
 | 
			
		||||
</TD></TR></TABLE>
 | 
			
		||||
 | 
			
		||||
</BODY>
 | 
			
		||||
</HTML>
 | 
			
		||||
							
								
								
									
										57
									
								
								assert.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								assert.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>Boost: assert.hpp documentation</title>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
	</head>
 | 
			
		||||
	<body bgcolor="white" style="MARGIN-LEFT: 5%; MARGIN-RIGHT: 5%">
 | 
			
		||||
		<table border="0" width="100%">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td width="277">
 | 
			
		||||
					<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86">
 | 
			
		||||
				</td>
 | 
			
		||||
				<td align="middle">
 | 
			
		||||
					<h1>assert.hpp</h1>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td colspan="2" height="64"> </td>
 | 
			
		||||
			</tr>
 | 
			
		||||
		</table>
 | 
			
		||||
		<p>
 | 
			
		||||
			The header <STRONG><boost/assert.hpp></STRONG> defines the macro <b>BOOST_ASSERT</b>, 
 | 
			
		||||
			which is similar to the standard <STRONG>assert</STRONG> macro defined in <STRONG><cassert></STRONG>. 
 | 
			
		||||
			The macro is intended to be used in Boost libraries.
 | 
			
		||||
		</p>
 | 
			
		||||
		<P>By default, <tt>BOOST_ASSERT(expr)</tt> is equivalent to <tt>assert(expr)</tt>.</P>
 | 
			
		||||
		<P>When the macro <STRONG>BOOST_DISABLE_ASSERTS</STRONG> is defined when <STRONG><boost/assert.hpp></STRONG>
 | 
			
		||||
			is included, <tt>BOOST_ASSERT(expr)</tt> is defined as <tt>((void)0)</tt>. This 
 | 
			
		||||
			allows users to selectively disable <STRONG>BOOST_ASSERT</STRONG> without 
 | 
			
		||||
			affecting the definition of the standard <STRONG>assert</STRONG>.</P>
 | 
			
		||||
		<P>When the macro <STRONG>BOOST_ENABLE_ASSERT_HANDLER</STRONG> is defined when <STRONG><boost/assert.hpp></STRONG>
 | 
			
		||||
			is included, <tt>BOOST_ASSERT(expr)</tt> evaluates <b>expr</b> and, if the 
 | 
			
		||||
			result is false, evaluates the expression</P>
 | 
			
		||||
		<P><tt>::boost::assertion_failed(#expr, <a href="current_function.html">BOOST_CURRENT_FUNCTION</a>, 
 | 
			
		||||
				__FILE__, __LINE__)</tt></P>
 | 
			
		||||
		<P><STRONG>assertion_failed</STRONG> is declared in <STRONG><boost/assert.hpp></STRONG>
 | 
			
		||||
			as</P>
 | 
			
		||||
		<pre>
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
void assertion_failed(char const * expr, char const * function, char const * file, long line);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
		<p>but it is never defined. The user is expected to supply an appropriate 
 | 
			
		||||
			definition.</p>
 | 
			
		||||
		<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><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>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,10 +1,3 @@
 | 
			
		||||
#if defined(_MSC_VER) && !defined(__ICL)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  assert_test.cpp - a test for boost/assert.hpp
 | 
			
		||||
//
 | 
			
		||||
@@ -16,18 +9,97 @@
 | 
			
		||||
//  warranty, and with no claim as to its suitability for any purpose.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#define BOOST_DEBUG 1
 | 
			
		||||
#include <boost/detail/lightweight_test.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
 | 
			
		||||
void test_default()
 | 
			
		||||
{
 | 
			
		||||
    int x = 1;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(1);
 | 
			
		||||
    BOOST_ASSERT(x);
 | 
			
		||||
    BOOST_ASSERT(x == 1);
 | 
			
		||||
    BOOST_ASSERT(&x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define BOOST_DISABLE_ASSERTS
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
 | 
			
		||||
void test_disabled()
 | 
			
		||||
{
 | 
			
		||||
    int x = 1;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(1);
 | 
			
		||||
    BOOST_ASSERT(x);
 | 
			
		||||
    BOOST_ASSERT(x == 1);
 | 
			
		||||
    BOOST_ASSERT(&x);
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(0);
 | 
			
		||||
    BOOST_ASSERT(!x);
 | 
			
		||||
    BOOST_ASSERT(x == 0);
 | 
			
		||||
 | 
			
		||||
    void * p = 0;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(p);
 | 
			
		||||
 | 
			
		||||
    // supress warnings
 | 
			
		||||
    p = &x;
 | 
			
		||||
    p = &p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef BOOST_DISABLE_ASSERTS
 | 
			
		||||
 | 
			
		||||
#define BOOST_ENABLE_ASSERT_HANDLER
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
 | 
			
		||||
bool boost_error(char const * expr, char const * func, char const * file, long line)
 | 
			
		||||
int handler_invoked = 0;
 | 
			
		||||
 | 
			
		||||
void boost::assertion_failed(char const * expr, char const * function, char const * file, long line)
 | 
			
		||||
{
 | 
			
		||||
    std::printf("%s(%ld): Assertion '%s' failed in function '%s'\n", file, line, expr, func);
 | 
			
		||||
    return true; // fail w/ standard assert()
 | 
			
		||||
    std::printf("Expression: %s\nFunction: %s\nFile: %s\nLine: %ld\n\n", expr, function, file, line);
 | 
			
		||||
    ++handler_invoked;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct X
 | 
			
		||||
{
 | 
			
		||||
    static void f()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT(0);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void test_handler()
 | 
			
		||||
{
 | 
			
		||||
    int x = 1;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(1);
 | 
			
		||||
    BOOST_ASSERT(x);
 | 
			
		||||
    BOOST_ASSERT(x == 1);
 | 
			
		||||
    BOOST_ASSERT(&x);
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(0);
 | 
			
		||||
    BOOST_ASSERT(!x);
 | 
			
		||||
    BOOST_ASSERT(x == 0);
 | 
			
		||||
 | 
			
		||||
    void * p = 0;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(p);
 | 
			
		||||
 | 
			
		||||
    X::f();
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(handler_invoked == 5);
 | 
			
		||||
    BOOST_TEST(handler_invoked == 5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef BOOST_ENABLE_ASSERT_HANDLER
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    BOOST_ASSERT(0 == 1);
 | 
			
		||||
    test_default();
 | 
			
		||||
    test_disabled();
 | 
			
		||||
    test_handler();
 | 
			
		||||
 | 
			
		||||
    return boost::report_errors();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>   // for BOOST_NO_MEMBER_TEMPLATES
 | 
			
		||||
#include <boost/cstdlib.hpp>  // for boost::exit_success
 | 
			
		||||
#include <boost/utility.hpp>  // for boost::noncopyable
 | 
			
		||||
#include <boost/noncopyable.hpp>  // for boost::noncopyable
 | 
			
		||||
 | 
			
		||||
#include <boost/utility/base_from_member.hpp>  // for boost::base_from_member
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -120,7 +120,7 @@ void random_sorted_sequence(std::list<std::string>& result)
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
template <>
 | 
			
		||||
inline void sort_by_value(std::list<std::string>& l)
 | 
			
		||||
void sort_by_value(std::list<std::string>& l)
 | 
			
		||||
{
 | 
			
		||||
    l.sort(cmp());
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										124
									
								
								checked_delete.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								checked_delete.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,124 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>Boost: checked_delete.hpp documentation</title>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
	</head>
 | 
			
		||||
	<body bgcolor="white" style="MARGIN-LEFT: 5%; MARGIN-RIGHT: 5%">
 | 
			
		||||
		<table border="0" width="100%">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td width="277">
 | 
			
		||||
					<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86">
 | 
			
		||||
				</td>
 | 
			
		||||
				<td align="middle">
 | 
			
		||||
					<h1>checked_delete.hpp</h1>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td colspan="2" height="64"> </td>
 | 
			
		||||
			</tr>
 | 
			
		||||
		</table>
 | 
			
		||||
		<p>
 | 
			
		||||
			The header <STRONG><boost/checked_delete.hpp></STRONG> defines two 
 | 
			
		||||
			function templates, <STRONG>checked_delete</STRONG> and <STRONG>checked_array_delete</STRONG>, 
 | 
			
		||||
			and two class templates, <STRONG>checked_deleter</STRONG> and <STRONG>checked_array_deleter</STRONG>.
 | 
			
		||||
		</p>
 | 
			
		||||
		<P>The C++ Standard allows, in 5.3.5/5, pointers to incomplete class types to be 
 | 
			
		||||
			deleted with a <EM>delete-expression</EM>. When the class has a non-trivial 
 | 
			
		||||
			destructor, or a class-specific operator delete, the behavior is undefined. 
 | 
			
		||||
			Some compilers issue a warning when an incomplete type is deleted, but 
 | 
			
		||||
			unfortunately, not all do, and programmers sometimes ignore or disable 
 | 
			
		||||
			warnings.</P>
 | 
			
		||||
		<P>A particularly troublesome case is when a smart pointer's destructor, such as <STRONG>
 | 
			
		||||
				boost::scoped_ptr<T>::~scoped_ptr</STRONG>, is instantiated with an 
 | 
			
		||||
			incomplete type. This can often lead to silent, hard to track failures.</P>
 | 
			
		||||
		<P>The supplied function and class templates can be used to prevent these problems, 
 | 
			
		||||
			as they require a complete type, and cause a compilation error otherwise.</P>
 | 
			
		||||
		<h3><a name="Synopsis">Synopsis</a></h3>
 | 
			
		||||
		<pre>
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> void checked_delete(T * p);
 | 
			
		||||
template<class T> void checked_array_delete(T * p);
 | 
			
		||||
template<class T> struct checked_deleter;
 | 
			
		||||
template<class T> struct checked_array_deleter;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
		<h3>checked_delete</h3>
 | 
			
		||||
		<h4><a name="checked_delete">template<class T> void checked_delete(T * p);</a></h4>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Requires:</b> <b>T</b> must be a complete type. The expression <tt>delete p</tt>
 | 
			
		||||
				must be well-formed.
 | 
			
		||||
			</p>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Effects:</b> <tt>delete p;</tt>
 | 
			
		||||
			</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3>checked_array_delete</h3>
 | 
			
		||||
		<h4><a name="checked_array_delete">template<class T> void checked_array_delete(T 
 | 
			
		||||
				* p);</a></h4>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Requires:</b> <b>T</b> must be a complete type. The expression <tt>delete [] p</tt>
 | 
			
		||||
				must be well-formed.
 | 
			
		||||
			</p>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Effects:</b> <tt>delete [] p;</tt>
 | 
			
		||||
			</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3>checked_deleter</h3>
 | 
			
		||||
		<pre>
 | 
			
		||||
template<class T> struct checked_deleter
 | 
			
		||||
{
 | 
			
		||||
    typedef void result_type;
 | 
			
		||||
    typedef T * argument_type;
 | 
			
		||||
    void operator()(T * p) const;
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
		<h4>void checked_deleter<T>::operator()(T * p) const;</h4>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Requires:</b> <b>T</b> must be a complete type. The expression <tt>delete p</tt>
 | 
			
		||||
				must be well-formed.
 | 
			
		||||
			</p>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Effects:</b> <tt>delete p;</tt>
 | 
			
		||||
			</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3>checked_array_deleter</h3>
 | 
			
		||||
		<pre>
 | 
			
		||||
template<class T> struct checked_array_deleter
 | 
			
		||||
{
 | 
			
		||||
    typedef void result_type;
 | 
			
		||||
    typedef T * argument_type;
 | 
			
		||||
    void operator()(T * p) const;
 | 
			
		||||
};
 | 
			
		||||
</pre>
 | 
			
		||||
		<h4>void checked_array_deleter<T>::operator()(T * p) const;</h4>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Requires:</b> <b>T</b> must be a complete type. The expression <tt>delete [] p</tt>
 | 
			
		||||
				must be well-formed.
 | 
			
		||||
			</p>
 | 
			
		||||
			<p>
 | 
			
		||||
				<b>Effects:</b> <tt>delete [] p;</tt>
 | 
			
		||||
			</p>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3><a name="Acknowledgements">Acknowledgements</a></h3>
 | 
			
		||||
		<p>
 | 
			
		||||
			The function templates <STRONG>checked_delete</STRONG> and <STRONG>checked_array_delete</STRONG>
 | 
			
		||||
			were originally part of <STRONG><boost/utility.hpp></STRONG>, and the 
 | 
			
		||||
			documentation acknowledged Beman Dawes, Dave Abrahams, Vladimir Prus, Rainer 
 | 
			
		||||
			Deyke, John Maddock, and others as contributors.
 | 
			
		||||
		</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>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
//  Revision History
 | 
			
		||||
//  21 May 01  Initial version (Beman Dawes)
 | 
			
		||||
 | 
			
		||||
#include <boost/utility.hpp>  // for checked_delete
 | 
			
		||||
#include <boost/checked_delete.hpp>  // for checked_delete
 | 
			
		||||
 | 
			
		||||
//  This program demonstrates compiler errors when trying to delete an
 | 
			
		||||
//  incomplete type.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								current_function.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								current_function.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>Boost: current_function.hpp documentation</title>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
	</head>
 | 
			
		||||
	<body bgcolor="white" style="MARGIN-LEFT: 5%; MARGIN-RIGHT: 5%">
 | 
			
		||||
		<table border="0" width="100%">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td width="277">
 | 
			
		||||
					<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86">
 | 
			
		||||
				</td>
 | 
			
		||||
				<td align="middle">
 | 
			
		||||
					<h1>current_function.hpp</h1>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td colspan="2" height="64"> </td>
 | 
			
		||||
			</tr>
 | 
			
		||||
		</table>
 | 
			
		||||
		<p>
 | 
			
		||||
			The header <STRONG><boost/current_function.hpp></STRONG> defines a single 
 | 
			
		||||
			macro, <STRONG>BOOST_CURRENT_FUNCTION</STRONG>,<STRONG> </STRONG>similar to the 
 | 
			
		||||
			C99 predefined identifier <STRONG>__func__</STRONG>.
 | 
			
		||||
		</p>
 | 
			
		||||
		<P><STRONG>BOOST_CURRENT_FUNCTION</STRONG> expands to a string literal containing 
 | 
			
		||||
			the (fully qualified, if possible) name of the enclosing function. If there is 
 | 
			
		||||
			no enclosing function, the behavior is undefined.</P>
 | 
			
		||||
		<p>Some compilers do not provide a way to obtain the name of the current enclosing 
 | 
			
		||||
			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>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -105,7 +105,7 @@ types.
 | 
			
		||||
<pre>
 | 
			
		||||
template <class Generator>
 | 
			
		||||
typename generator_iterator_generator<Generator>::type
 | 
			
		||||
make_function_output_iterator(Generator & gen);
 | 
			
		||||
make_generator_iterator(Generator & gen);
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,5 @@
 | 
			
		||||
#ifndef BOOST_ASSERT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_ASSERT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
#if _MSC_VER >= 1020
 | 
			
		||||
#pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/assert.hpp
 | 
			
		||||
//  boost/assert.hpp - BOOST_ASSERT(expr)
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
@@ -15,38 +8,31 @@
 | 
			
		||||
//  This software is provided "as is" without express or implied
 | 
			
		||||
//  warranty, and with no claim as to its suitability for any purpose.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
//  Note: There are no include guards. This is intentional.
 | 
			
		||||
//
 | 
			
		||||
//  When BOOST_DEBUG is not defined, it defaults to 0 (off)
 | 
			
		||||
//  for compatibility with programs that do not expect asserts
 | 
			
		||||
//  in the smart pointer class templates.
 | 
			
		||||
//
 | 
			
		||||
//  This default may be changed after an initial transition period.
 | 
			
		||||
//  See http://www.boost.org/libs/utility/assert.html for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_DEBUG
 | 
			
		||||
#define BOOST_DEBUG 0
 | 
			
		||||
#endif
 | 
			
		||||
#undef BOOST_ASSERT
 | 
			
		||||
 | 
			
		||||
#if BOOST_DEBUG
 | 
			
		||||
#if defined(BOOST_DISABLE_ASSERTS)
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
# define BOOST_ASSERT(expr) ((void)0)
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_ASSERT
 | 
			
		||||
#elif defined(BOOST_ENABLE_ASSERT_HANDLER)
 | 
			
		||||
 | 
			
		||||
#include <boost/current_function.hpp>
 | 
			
		||||
 | 
			
		||||
bool boost_error(char const * expr, char const * func, char const * file, long line);
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
# define BOOST_ASSERT(expr) ((expr) || !boost_error(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__) || (assert(expr), true))
 | 
			
		||||
void assertion_failed(char const * expr, char const * function, char const * file, long line); // user defined
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_ASSERT
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#else // #if BOOST_DEBUG
 | 
			
		||||
#define BOOST_ASSERT(expr) ((expr)? ((void)0): ::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__))
 | 
			
		||||
 | 
			
		||||
#undef BOOST_ASSERT
 | 
			
		||||
#define BOOST_ASSERT(expr) ((void)0)
 | 
			
		||||
 | 
			
		||||
#endif // #if BOOST_DEBUG
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_ASSERT_HPP_INCLUDED
 | 
			
		||||
#else
 | 
			
		||||
# include <assert.h>
 | 
			
		||||
# define BOOST_ASSERT(expr) assert(expr)
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
//  in all copies. This software is provided "as is" without express or implied
 | 
			
		||||
//  warranty, and with no claim as to its suitability for any purpose.
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org for most recent version including documentation.
 | 
			
		||||
//  See http://www.boost.org/libs/utility/call_traits.htm for Documentation.
 | 
			
		||||
//  See boost/detail/call_traits.hpp and boost/detail/ob_call_traits.hpp
 | 
			
		||||
//  for full copyright notices.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,35 +1,43 @@
 | 
			
		||||
#ifndef BOOST_CHECKED_DELETE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_CHECKED_DELETE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
#if _MSC_VER >= 1020
 | 
			
		||||
#pragma once
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/checked_delete.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 1999, 2000, 2001, 2002 boost.org
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov
 | 
			
		||||
//  Copyright (c) 2003 Daniel Frey
 | 
			
		||||
//  Copyright (c) 2003 Howard Hinnant
 | 
			
		||||
//
 | 
			
		||||
//  Permission to copy, use, modify, sell and distribute this software
 | 
			
		||||
//  is granted provided this copyright notice appears in all copies.
 | 
			
		||||
//  This software is provided "as is" without express or implied
 | 
			
		||||
//  warranty, and with no claim as to its suitability for any purpose.
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/utility/checked_delete.html for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// verify that types are complete for increased safety
 | 
			
		||||
 | 
			
		||||
template< typename T > inline void checked_delete(T * x)
 | 
			
		||||
template<class T> inline void checked_delete(T * x)
 | 
			
		||||
{
 | 
			
		||||
    typedef char type_must_be_complete[sizeof(T)];
 | 
			
		||||
    // intentionally complex - simplification causes regressions
 | 
			
		||||
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
 | 
			
		||||
    (void) sizeof(type_must_be_complete);
 | 
			
		||||
    delete x;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< typename T > inline void checked_array_delete(T * x)
 | 
			
		||||
template<class T> inline void checked_array_delete(T * x)
 | 
			
		||||
{
 | 
			
		||||
    typedef char type_must_be_complete[sizeof(T)];
 | 
			
		||||
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
 | 
			
		||||
    (void) sizeof(type_must_be_complete);
 | 
			
		||||
    delete [] x;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -38,9 +46,10 @@ template<class T> struct checked_deleter
 | 
			
		||||
    typedef void result_type;
 | 
			
		||||
    typedef T * argument_type;
 | 
			
		||||
 | 
			
		||||
    void operator()(T * x)
 | 
			
		||||
    void operator()(T * x) const
 | 
			
		||||
    {
 | 
			
		||||
        checked_delete(x);
 | 
			
		||||
        // boost:: disables ADL
 | 
			
		||||
        boost::checked_delete(x);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -49,9 +58,9 @@ template<class T> struct checked_array_deleter
 | 
			
		||||
    typedef void result_type;
 | 
			
		||||
    typedef T * argument_type;
 | 
			
		||||
 | 
			
		||||
    void operator()(T * x)
 | 
			
		||||
    void operator()(T * x) const
 | 
			
		||||
    {
 | 
			
		||||
        checked_array_delete(x);
 | 
			
		||||
        boost::checked_array_delete(x);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,8 @@
 | 
			
		||||
//  This software is provided "as is" without express or implied
 | 
			
		||||
//  warranty, and with no claim as to its suitability for any purpose.
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/utility/current_function.html
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
@@ -25,7 +27,7 @@ namespace detail
 | 
			
		||||
inline void current_function_helper()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined(__GNUC__)
 | 
			
		||||
#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000))
 | 
			
		||||
 | 
			
		||||
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
 | 
			
		||||
 | 
			
		||||
@@ -33,7 +35,7 @@ inline void current_function_helper()
 | 
			
		||||
 | 
			
		||||
# define BOOST_CURRENT_FUNCTION __FUNCSIG__
 | 
			
		||||
 | 
			
		||||
#elif defined(__BORLANDC__)
 | 
			
		||||
#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x550)
 | 
			
		||||
 | 
			
		||||
# define BOOST_CURRENT_FUNCTION __FUNC__
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,8 @@
 | 
			
		||||
// 15 Nov 2001   Jens Maurer
 | 
			
		||||
//      created.
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/utility/iterator_adaptors.htm for documentation.
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
 | 
			
		||||
#define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								include/boost/next_prior.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								include/boost/next_prior.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
//  Boost next_prior.hpp header file  ---------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Boost.org 1999-2003. Permission to copy, use, modify, sell
 | 
			
		||||
//  and distribute this software is granted provided this copyright
 | 
			
		||||
//  notice appears in all copies. This software is provided "as is" without
 | 
			
		||||
//  express or implied warranty, and with no claim as to its suitability for
 | 
			
		||||
//  any purpose.
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/utility for documentation.
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NEXT_PRIOR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_NEXT_PRIOR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
//  Helper functions for classes like bidirectional iterators not supporting
 | 
			
		||||
//  operator+ and operator-
 | 
			
		||||
//
 | 
			
		||||
//  Usage:
 | 
			
		||||
//    const std::list<T>::iterator p = get_some_iterator();
 | 
			
		||||
//    const std::list<T>::iterator prev = boost::prior(p);
 | 
			
		||||
 | 
			
		||||
//  Contributed by Dave Abrahams
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
inline T next(T x) { return ++x; }
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
inline T prior(T x) { return --x; }
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // BOOST_NEXT_PRIOR_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										33
									
								
								include/boost/noncopyable.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								include/boost/noncopyable.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
//  Boost noncopyable.hpp header file  --------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Boost.org 1999-2003. Permission to copy, use, modify, sell
 | 
			
		||||
//  and distribute this software is granted provided this copyright
 | 
			
		||||
//  notice appears in all copies. This software is provided "as is" without
 | 
			
		||||
//  express or implied warranty, and with no claim as to its suitability for
 | 
			
		||||
//  any purpose.
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org/libs/utility for documentation.
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NONCOPYABLE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_NONCOPYABLE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
//  Private copy constructor and copy assignment ensure classes derived from
 | 
			
		||||
//  class noncopyable cannot be copied.
 | 
			
		||||
 | 
			
		||||
//  Contributed by Dave Abrahams
 | 
			
		||||
 | 
			
		||||
class noncopyable
 | 
			
		||||
{
 | 
			
		||||
 protected:
 | 
			
		||||
    noncopyable() {}
 | 
			
		||||
    ~noncopyable() {}
 | 
			
		||||
 private:  // emphasize the following members are private
 | 
			
		||||
    noncopyable( const noncopyable& );
 | 
			
		||||
    const noncopyable& operator=( const noncopyable& );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // BOOST_NONCOPYABLE_HPP_INCLUDED
 | 
			
		||||
@@ -6,9 +6,12 @@
 | 
			
		||||
//  software is provided "as is" without express or implied warranty, and
 | 
			
		||||
//  with no claim as to its suitability for any purpose.
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org for most recent version including documentation.
 | 
			
		||||
//  See http://www.boost.org/libs/utility/operators.htm for documentation.
 | 
			
		||||
 | 
			
		||||
//  Revision History
 | 
			
		||||
//  21 Oct 02 Modified implementation of operators to allow compilers with a
 | 
			
		||||
//            correct named return value optimization (NRVO) to produce optimal
 | 
			
		||||
//            code.  (Daniel Frey)
 | 
			
		||||
//  02 Dec 01 Bug fixed in random_access_iteratable.  (Helmut Zeisel)
 | 
			
		||||
//  28 Sep 01 Factored out iterator operator groups.  (Daryle Walker)
 | 
			
		||||
//  27 Aug 01 'left' form for non commutative operators added;
 | 
			
		||||
@@ -149,127 +152,107 @@ struct equality_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>
 | 
			
		||||
struct multipliable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator*(T x, const U& y) { return x *= y; }
 | 
			
		||||
     friend T operator*(const U& y, T x) { return x *= y; }
 | 
			
		||||
//  NRVO-friendly implementation (contributed by Daniel Frey) ---------------//
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS)
 | 
			
		||||
 | 
			
		||||
// This is the optimal implementation for ISO/ANSI C++,
 | 
			
		||||
// but it requires the compiler to implement the NRVO.
 | 
			
		||||
// If the compiler has no NRVO, this is the best symmetric
 | 
			
		||||
// implementation available.
 | 
			
		||||
 | 
			
		||||
#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( const T& lhs, const U& rhs )                          \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                              \
 | 
			
		||||
  friend T operator OP( const U& lhs, const T& rhs )                          \
 | 
			
		||||
    { T nrv( rhs ); nrv OP##= lhs; 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; }                              \
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct multipliable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator*(T x, const T& y) { return x *= y; }
 | 
			
		||||
#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 NAME##2_left : 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; }                              \
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct addable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator+(T x, const U& y) { return x += y; }
 | 
			
		||||
     friend T operator+(const U& y, T x) { return x += y; }
 | 
			
		||||
#else // defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS)
 | 
			
		||||
 | 
			
		||||
// For compilers without NRVO the following code is optimal, but not symmetric!
 | 
			
		||||
// Note that the implementation of NAME##2_left 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; }       \
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct addable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator+(T x, const T& y) { return x += y; }
 | 
			
		||||
#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( T lhs, const U& rhs ) { return lhs OP##= rhs; }       \
 | 
			
		||||
};                                                                            \
 | 
			
		||||
                                                                              \
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>            \
 | 
			
		||||
struct NAME##2_left : 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>                     \
 | 
			
		||||
struct NAME##1 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( T lhs, const T& rhs ) { return lhs OP##= rhs; }       \
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct subtractable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator-(T x, const U& y) { return x -= y; }
 | 
			
		||||
};
 | 
			
		||||
#endif // defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS)
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct subtractable2_left : B
 | 
			
		||||
{
 | 
			
		||||
  friend T operator-(const U& x, const T& y)
 | 
			
		||||
    { T result(x); return result -= y; }
 | 
			
		||||
};
 | 
			
		||||
BOOST_BINARY_OPERATOR_COMMUTATIVE( multipliable, * )
 | 
			
		||||
BOOST_BINARY_OPERATOR_COMMUTATIVE( addable, + )
 | 
			
		||||
BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( subtractable, - )
 | 
			
		||||
BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( dividable, / )
 | 
			
		||||
BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( modable, % )
 | 
			
		||||
BOOST_BINARY_OPERATOR_COMMUTATIVE( xorable, ^ )
 | 
			
		||||
BOOST_BINARY_OPERATOR_COMMUTATIVE( andable, & )
 | 
			
		||||
BOOST_BINARY_OPERATOR_COMMUTATIVE( orable, | )
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct subtractable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator-(T x, const T& y) { return x -= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct dividable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator/(T x, const U& y) { return x /= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct dividable2_left : B
 | 
			
		||||
{
 | 
			
		||||
  friend T operator/(const U& x, const T& y)
 | 
			
		||||
    { T result(x); return result /= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct dividable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator/(T x, const T& y) { return x /= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct modable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator%(T x, const U& y) { return x %= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct modable2_left : B
 | 
			
		||||
{
 | 
			
		||||
  friend T operator%(const U& x, const T& y)
 | 
			
		||||
    { T result(x); return result %= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct modable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator%(T x, const T& y) { return x %= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct xorable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator^(T x, const U& y) { return x ^= y; }
 | 
			
		||||
     friend T operator^(const U& y, T x) { return x ^= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct xorable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator^(T x, const T& y) { return x ^= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct andable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator&(T x, const U& y) { return x &= y; }
 | 
			
		||||
     friend T operator&(const U& y, T x) { return x &= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct andable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator&(T x, const T& y) { return x &= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct orable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator|(T x, const U& y) { return x |= y; }
 | 
			
		||||
     friend T operator|(const U& y, T x) { return x |= y; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct orable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator|(T x, const T& y) { return x |= y; }
 | 
			
		||||
};
 | 
			
		||||
#undef BOOST_BINARY_OPERATOR_COMMUTATIVE
 | 
			
		||||
#undef BOOST_BINARY_OPERATOR_NON_COMMUTATIVE
 | 
			
		||||
 | 
			
		||||
//  incrementable and decrementable contributed by Jeremy Siek
 | 
			
		||||
 | 
			
		||||
@@ -278,9 +261,9 @@ struct incrementable : B
 | 
			
		||||
{
 | 
			
		||||
  friend T operator++(T& x, int)
 | 
			
		||||
  {
 | 
			
		||||
    incrementable_type tmp(x);
 | 
			
		||||
    incrementable_type nrv(x);
 | 
			
		||||
    ++x;
 | 
			
		||||
    return tmp;
 | 
			
		||||
    return nrv;
 | 
			
		||||
  }
 | 
			
		||||
private: // The use of this typedef works around a Borland bug
 | 
			
		||||
  typedef T incrementable_type;
 | 
			
		||||
@@ -291,9 +274,9 @@ struct decrementable : B
 | 
			
		||||
{
 | 
			
		||||
  friend T operator--(T& x, int)
 | 
			
		||||
  {
 | 
			
		||||
    decrementable_type tmp(x);
 | 
			
		||||
    decrementable_type nrv(x);
 | 
			
		||||
    --x;
 | 
			
		||||
    return tmp;
 | 
			
		||||
    return nrv;
 | 
			
		||||
  }
 | 
			
		||||
private: // The use of this typedef works around a Borland bug
 | 
			
		||||
  typedef T decrementable_type;
 | 
			
		||||
@@ -320,30 +303,46 @@ struct indexable : B
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//  More operator classes (contributed by Daryle Walker) --------------------//
 | 
			
		||||
//  (NRVO-friendly implementation contributed by Daniel Frey) ---------------//
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct left_shiftable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator<<(T x, const U& y) { return x <<= y; }
 | 
			
		||||
#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>            \
 | 
			
		||||
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>                     \
 | 
			
		||||
struct NAME##1 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( const T& lhs, const T& rhs )                          \
 | 
			
		||||
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                              \
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct left_shiftable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator<<(T x, const T& y) { return x <<= y; }
 | 
			
		||||
#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>            \
 | 
			
		||||
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>                     \
 | 
			
		||||
struct NAME##1 : B                                                            \
 | 
			
		||||
{                                                                             \
 | 
			
		||||
  friend T operator OP( T lhs, const T& rhs ) { return lhs OP##= rhs; }       \
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct right_shiftable2 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator>>(T x, const U& y) { return x >>= y; }
 | 
			
		||||
};
 | 
			
		||||
#endif // defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS)
 | 
			
		||||
 | 
			
		||||
template <class T, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct right_shiftable1 : B
 | 
			
		||||
{
 | 
			
		||||
     friend T operator>>(T x, const T& y) { return x >>= y; }
 | 
			
		||||
};
 | 
			
		||||
BOOST_BINARY_OPERATOR( left_shiftable, << )
 | 
			
		||||
BOOST_BINARY_OPERATOR( right_shiftable, >> )
 | 
			
		||||
 | 
			
		||||
#undef BOOST_BINARY_OPERATOR
 | 
			
		||||
 | 
			
		||||
template <class T, class U, class B = ::boost::detail::empty_base>
 | 
			
		||||
struct equivalent2 : B
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
 | 
			
		||||
# include <boost/config.hpp>
 | 
			
		||||
# include <boost/utility/addressof.hpp>
 | 
			
		||||
# include <boost/mpl/bool.hpp>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  ref.hpp - ref/cref, useful helper functions
 | 
			
		||||
@@ -73,16 +74,14 @@ template<class T> inline reference_wrapper<T const> BOOST_REF_CONST cref(T const
 | 
			
		||||
# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
template<typename T>
 | 
			
		||||
class is_reference_wrapper
 | 
			
		||||
    : public mpl::false_
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
    BOOST_STATIC_CONSTANT(bool, value = false); 
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
class is_reference_wrapper<reference_wrapper<T> >
 | 
			
		||||
    : public mpl::true_
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
    BOOST_STATIC_CONSTANT(bool, value = true);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
@@ -144,8 +143,10 @@ class is_reference_wrapper
 | 
			
		||||
 public:
 | 
			
		||||
    BOOST_STATIC_CONSTANT(
 | 
			
		||||
        bool, value = (
 | 
			
		||||
            sizeof(detail::is_reference_wrapper_test(type<T>()))
 | 
			
		||||
             sizeof(detail::is_reference_wrapper_test(type<T>()))
 | 
			
		||||
            == sizeof(detail::yes_reference_wrapper_t)));
 | 
			
		||||
    
 | 
			
		||||
    typedef ::boost::mpl::bool_<value> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,63 +1,21 @@
 | 
			
		||||
//  boost utility.hpp header file  -------------------------------------------//
 | 
			
		||||
//  Boost utility.hpp header file  -------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright boost.org 1999. Permission to copy, use, modify, sell
 | 
			
		||||
//  (C) Copyright Boost.org 1999-2003. Permission to copy, use, modify, sell
 | 
			
		||||
//  and distribute this software is granted provided this copyright
 | 
			
		||||
//  notice appears in all copies. This software is provided "as is" without
 | 
			
		||||
//  express or implied warranty, and with no claim as to its suitability for
 | 
			
		||||
//  any purpose.
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org for most recent version including documentation.
 | 
			
		||||
 | 
			
		||||
//  Classes appear in alphabetical order
 | 
			
		||||
//  See http://www.boost.org/libs/utility for documentation.
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_UTILITY_HPP
 | 
			
		||||
#define BOOST_UTILITY_HPP
 | 
			
		||||
 | 
			
		||||
// certain headers are part of the <utility.hpp> interface
 | 
			
		||||
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/utility/base_from_member.hpp>  
 | 
			
		||||
#include <boost/utility/addressof.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
//  next() and prior() template functions  -----------------------------------//
 | 
			
		||||
 | 
			
		||||
    //  Helper functions for classes like bidirectional iterators not supporting
 | 
			
		||||
    //  operator+ and operator-.
 | 
			
		||||
    //
 | 
			
		||||
    //  Usage:
 | 
			
		||||
    //    const std::list<T>::iterator p = get_some_iterator();
 | 
			
		||||
    //    const std::list<T>::iterator prev = boost::prior(p);
 | 
			
		||||
 | 
			
		||||
    //  Contributed by Dave Abrahams
 | 
			
		||||
 | 
			
		||||
    template <class T>
 | 
			
		||||
    inline T next(T x) { return ++x; }
 | 
			
		||||
 | 
			
		||||
    template <class T>
 | 
			
		||||
    inline T prior(T x) { return --x; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//  class noncopyable  -------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
    //  Private copy constructor and copy assignment ensure classes derived from
 | 
			
		||||
    //  class noncopyable cannot be copied.
 | 
			
		||||
 | 
			
		||||
    //  Contributed by Dave Abrahams
 | 
			
		||||
 | 
			
		||||
    class noncopyable
 | 
			
		||||
    {
 | 
			
		||||
    protected:
 | 
			
		||||
        noncopyable(){}
 | 
			
		||||
        ~noncopyable(){}
 | 
			
		||||
    private:  // emphasize the following members are private
 | 
			
		||||
        noncopyable( const noncopyable& );
 | 
			
		||||
        const noncopyable& operator=( const noncopyable& );
 | 
			
		||||
    }; // noncopyable
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
#include <boost/utility/base_from_member.hpp>  
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/next_prior.hpp>
 | 
			
		||||
#include <boost/noncopyable.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // BOOST_UTILITY_HPP
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,13 +14,25 @@
 | 
			
		||||
// For more information, see http://www.boost.org
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_UTILITY_ADDRESSOF_HPP
 | 
			
		||||
#define BOOST_UTILITY_ADDRESSOF_HPP
 | 
			
		||||
# define BOOST_UTILITY_ADDRESSOF_HPP
 | 
			
		||||
 | 
			
		||||
# include <boost/config.hpp>
 | 
			
		||||
# include <boost/detail/workaround.hpp>
 | 
			
		||||
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
 | 
			
		||||
#  include <boost/type_traits/add_pointer.hpp>
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
// Do not make addressof() inline. Breaks MSVC 7. (Peter Dimov)
 | 
			
		||||
 | 
			
		||||
template <typename T> T* addressof(T& v)
 | 
			
		||||
// VC7 strips const from nested classes unless we add indirection here
 | 
			
		||||
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
 | 
			
		||||
template <typename T> typename add_pointer<T>::type
 | 
			
		||||
# else
 | 
			
		||||
template <typename T> T*
 | 
			
		||||
# endif
 | 
			
		||||
addressof(T& v)
 | 
			
		||||
{
 | 
			
		||||
  return reinterpret_cast<T*>(
 | 
			
		||||
       &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
//  express or implied warranty, and with no claim as to its suitability for
 | 
			
		||||
//  any purpose.
 | 
			
		||||
 | 
			
		||||
//  See http://www.boost.org for most recent version including documentation.
 | 
			
		||||
//  See http://www.boost.org/libs/utility for documentation.
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_UTILITY_FWD_HPP
 | 
			
		||||
#define BOOST_UTILITY_FWD_HPP
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										66
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								index.html
									
									
									
									
									
								
							@@ -1,34 +1,34 @@
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Language" content="en-us">
 | 
			
		||||
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
 | 
			
		||||
<meta name="ProgId" content="FrontPage.Editor.Document">
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 | 
			
		||||
<title>Boost Utility Library</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF">
 | 
			
		||||
 | 
			
		||||
<h1><IMG SRC="../../c++boost.gif" WIDTH="276" HEIGHT="86" align="center">Boost 
 | 
			
		||||
Utility Library</h1>
 | 
			
		||||
<p>The Boost Utility Library isn't really a single library at all.  It is 
 | 
			
		||||
just a collection for components too small to be called libraries in their own 
 | 
			
		||||
right.</p>
 | 
			
		||||
<p>But that doesn't mean there isn't useful stuff here.  Take a look:</p>
 | 
			
		||||
<blockquote>
 | 
			
		||||
  <p><a href="base_from_member.html">base_from_member</a><br>
 | 
			
		||||
  <a href="call_traits.htm">call_traits.htm</a><br>
 | 
			
		||||
  <a href="compressed_pair.htm">compressed_pair.htm</a><br>
 | 
			
		||||
  <a href="operators.htm">operators.htm</a><br>
 | 
			
		||||
  <a href="tie.html">tie</a><br>
 | 
			
		||||
  <a href="utility.htm">utility.htm</a></p>
 | 
			
		||||
</blockquote>
 | 
			
		||||
<hr>
 | 
			
		||||
<p>Revised
 | 
			
		||||
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->07 May, 2002<!--webbot bot="Timestamp" endspan i-checksum="13976" --></p>
 | 
			
		||||
<p> </p>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
	<head>
 | 
			
		||||
		<meta http-equiv="Content-Language" content="en-us">
 | 
			
		||||
		<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
 | 
			
		||||
		<meta name="ProgId" content="FrontPage.Editor.Document">
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 | 
			
		||||
		<title>Boost Utility Library</title>
 | 
			
		||||
	</head>
 | 
			
		||||
	<body bgcolor="#FFFFFF">
 | 
			
		||||
		<h1><IMG SRC="../../c++boost.gif" WIDTH="276" HEIGHT="86" align="center">Boost 
 | 
			
		||||
			Utility Library</h1>
 | 
			
		||||
		<p>The Boost Utility Library isn't really a single library at all. It is just a 
 | 
			
		||||
			collection for components too small to be called libraries in their own right.</p>
 | 
			
		||||
		<p>But that doesn't mean there isn't useful stuff here. Take a look:</p>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<p>
 | 
			
		||||
				<a href="assert.html">assert</a><br>
 | 
			
		||||
				<a href="base_from_member.html">base_from_member</a><br>
 | 
			
		||||
				<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="iterator_adaptors.htm">iterator_adaptors</a><br>
 | 
			
		||||
				<a href="operators.htm">operators</a><br>
 | 
			
		||||
				<a href="tie.html">tie</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>Revised 
 | 
			
		||||
			<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->09 January, 2003<!--webbot bot="Timestamp" endspan i-checksum="38582" --></p>
 | 
			
		||||
		<p> </p>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -156,7 +156,8 @@ main()
 | 
			
		||||
      boost::default_iterator_policies,
 | 
			
		||||
      boost::value_type_is<const int> > Iter1;
 | 
			
		||||
    BOOST_STATIC_ASSERT((boost::is_same<Iter1::value_type, int>::value));
 | 
			
		||||
#if defined(__BORLANDC__) || defined(BOOST_MSVC) && BOOST_MSVC <= 1300
 | 
			
		||||
    
 | 
			
		||||
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) || BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
 | 
			
		||||
    // We currently don't know how to workaround this bug.
 | 
			
		||||
    BOOST_STATIC_ASSERT((boost::is_same<Iter1::reference, int&>::value));
 | 
			
		||||
    BOOST_STATIC_ASSERT((boost::is_same<Iter1::pointer, int*>::value));
 | 
			
		||||
@@ -282,7 +283,11 @@ main()
 | 
			
		||||
    
 | 
			
		||||
    // Many compilers' builtin deque iterators don't interoperate well, though
 | 
			
		||||
    // STLport fixes that problem.
 | 
			
		||||
#if defined(__SGI_STL_PORT) || !defined(__GNUC__) && !defined(__BORLANDC__) && (!defined(BOOST_MSVC) || BOOST_MSVC > 1200)
 | 
			
		||||
#if defined(__SGI_STL_PORT)                                            \
 | 
			
		||||
 || (!BOOST_WORKAROUND(__GNUC__, < 3)                                   \
 | 
			
		||||
     && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))         \
 | 
			
		||||
     && !BOOST_WORKAROUND(BOOST_MSVC, <= 1200))
 | 
			
		||||
    
 | 
			
		||||
    boost::const_nonconst_iterator_test(i, ++j);
 | 
			
		||||
#endif
 | 
			
		||||
  }
 | 
			
		||||
@@ -305,7 +310,7 @@ main()
 | 
			
		||||
#endif
 | 
			
		||||
        >::type filter_iter;
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__)
 | 
			
		||||
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
 | 
			
		||||
    // Borland is choking on accessing the policies_type explicitly
 | 
			
		||||
    // from the filter_iter. 
 | 
			
		||||
    boost::forward_iterator_test(make_filter_iterator(array, array+N, 
 | 
			
		||||
@@ -316,8 +321,7 @@ main()
 | 
			
		||||
    boost::forward_iterator_test(i, dummyT(1), dummyT(4));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(__BORLANDC__)
 | 
			
		||||
    // 
 | 
			
		||||
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
 | 
			
		||||
    enum { is_forward = boost::is_same<
 | 
			
		||||
           filter_iter::iterator_category,
 | 
			
		||||
           std::forward_iterator_tag>::value };
 | 
			
		||||
@@ -327,7 +331,7 @@ main()
 | 
			
		||||
    // On compilers not supporting partial specialization, we can do more type
 | 
			
		||||
    // deduction with deque iterators than with pointers... unless the library
 | 
			
		||||
    // is broken ;-(
 | 
			
		||||
#if !defined(BOOST_MSVC) || BOOST_MSVC > 1200 || defined(__SGI_STL_PORT)
 | 
			
		||||
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1200 && !__SGI_STL_PORT)
 | 
			
		||||
    std::deque<dummyT> array2;
 | 
			
		||||
    std::copy(array+0, array+N, std::back_inserter(array2));
 | 
			
		||||
    boost::forward_iterator_test(
 | 
			
		||||
@@ -339,7 +343,7 @@ main()
 | 
			
		||||
        dummyT(1), dummyT(4));
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_MSVC) || BOOST_MSVC > 1200 // This just freaks MSVC out completely
 | 
			
		||||
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1200) // This just freaks MSVC6 out completely
 | 
			
		||||
    boost::forward_iterator_test(
 | 
			
		||||
        boost::make_filter_iterator<one_or_four>(
 | 
			
		||||
            boost::make_reverse_iterator(array2.end()),
 | 
			
		||||
@@ -363,7 +367,8 @@ main()
 | 
			
		||||
  // check operator-> with a forward iterator
 | 
			
		||||
  {
 | 
			
		||||
    boost::forward_iterator_archetype<dummyT> forward_iter;
 | 
			
		||||
#if defined(__BORLANDC__)
 | 
			
		||||
    
 | 
			
		||||
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
 | 
			
		||||
    typedef boost::iterator_adaptor<boost::forward_iterator_archetype<dummyT>,
 | 
			
		||||
      boost::default_iterator_policies,
 | 
			
		||||
      dummyT, const dummyT&, const dummyT*, 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
//  (C) Copyright David Abrahams 2001. Permission to copy, use, modify,
 | 
			
		||||
//  (C) Copyright David Abrahams 2002. Permission to copy, use, modify,
 | 
			
		||||
//  sell and distribute this software is granted provided this
 | 
			
		||||
//  copyright notice appears in all copies. This software is provided
 | 
			
		||||
//  "as is" without express or implied warranty, and with no claim as
 | 
			
		||||
@@ -22,7 +22,7 @@
 | 
			
		||||
//  19 Jan 2001 Initial version with iterator operators (David Abrahams)
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/iterator.hpp>
 | 
			
		||||
#include <boost/type_traits.hpp>
 | 
			
		||||
#include <boost/type_traits/is_same.hpp>
 | 
			
		||||
#include <boost/operators.hpp>
 | 
			
		||||
#include <boost/static_assert.hpp>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
@@ -31,6 +31,11 @@
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
// A UDT for which we can specialize std::iterator_traits<element*> on
 | 
			
		||||
// compilers which don't support partial specialization. There's no
 | 
			
		||||
// other reasonable way to test pointers on those compilers.
 | 
			
		||||
struct element {};
 | 
			
		||||
 | 
			
		||||
// An iterator for which we can get traits.
 | 
			
		||||
struct my_iterator1
 | 
			
		||||
    : boost::forward_iterator_helper<my_iterator1, char, long, const char*, const char&>
 | 
			
		||||
@@ -77,27 +82,37 @@ struct my_iterator2
 | 
			
		||||
struct my_iterator3 : my_iterator1
 | 
			
		||||
{
 | 
			
		||||
    typedef int difference_type;
 | 
			
		||||
    my_iterator3(const char* p) : my_iterator1(p) {}
 | 
			
		||||
    my_iterator3(const char* p)
 | 
			
		||||
        : my_iterator1(p) {}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Assertion tools.  Used instead of BOOST_STATIC_ASSERT because that
 | 
			
		||||
// doesn't give us a nice stack backtrace
 | 
			
		||||
//
 | 
			
		||||
template <bool = false> struct assertion;
 | 
			
		||||
 | 
			
		||||
template <> struct assertion<true>
 | 
			
		||||
{
 | 
			
		||||
    typedef char type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T, class U>
 | 
			
		||||
struct assert_same
 | 
			
		||||
    : assertion<(::boost::is_same<T,U>::value)>
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Iterator tests
 | 
			
		||||
template <class Iterator,
 | 
			
		||||
    class value_type, class difference_type, class pointer, class reference, class category>
 | 
			
		||||
struct non_portable_tests
 | 
			
		||||
{
 | 
			
		||||
    // Unfortunately, the VC6 standard library doesn't supply these :(
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::pointer test_pt;
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::reference test_rt;
 | 
			
		||||
    BOOST_STATIC_ASSERT((
 | 
			
		||||
        ::boost::is_same<
 | 
			
		||||
        test_pt,
 | 
			
		||||
        pointer
 | 
			
		||||
        >::value));
 | 
			
		||||
 | 
			
		||||
    BOOST_STATIC_ASSERT((
 | 
			
		||||
        ::boost::is_same<
 | 
			
		||||
        test_rt,
 | 
			
		||||
        reference
 | 
			
		||||
        >::value));
 | 
			
		||||
    typedef typename assert_same<test_pt, pointer>::type a1;
 | 
			
		||||
    typedef typename assert_same<test_rt, reference>::type a2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class Iterator,
 | 
			
		||||
@@ -106,17 +121,8 @@ struct portable_tests
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::difference_type test_dt;
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::iterator_category test_cat;
 | 
			
		||||
    BOOST_STATIC_ASSERT((
 | 
			
		||||
        ::boost::is_same<
 | 
			
		||||
        test_dt,
 | 
			
		||||
        difference_type
 | 
			
		||||
        >::value));
 | 
			
		||||
 | 
			
		||||
    BOOST_STATIC_ASSERT((
 | 
			
		||||
        ::boost::is_same<
 | 
			
		||||
        test_cat,
 | 
			
		||||
        category
 | 
			
		||||
        >::value));
 | 
			
		||||
    typedef typename assert_same<test_dt, difference_type>::type a1;
 | 
			
		||||
    typedef typename assert_same<test_cat, category>::type a2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Test iterator_traits
 | 
			
		||||
@@ -126,11 +132,7 @@ struct input_iterator_test
 | 
			
		||||
    : portable_tests<Iterator,value_type,difference_type,pointer,reference,category>
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::detail::iterator_traits<Iterator>::value_type test_vt;
 | 
			
		||||
    BOOST_STATIC_ASSERT((
 | 
			
		||||
        ::boost::is_same<
 | 
			
		||||
        test_vt,
 | 
			
		||||
        value_type
 | 
			
		||||
        >::value));
 | 
			
		||||
    typedef typename assert_same<test_vt, value_type>::type a1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class Iterator,
 | 
			
		||||
@@ -154,14 +156,13 @@ struct maybe_pointer_test
 | 
			
		||||
input_iterator_test<std::istream_iterator<int>, int, std::ptrdiff_t, int*, int&, std::input_iterator_tag>
 | 
			
		||||
        istream_iterator_test;
 | 
			
		||||
 | 
			
		||||
// 
 | 
			
		||||
#if defined(__BORLANDC__) && !defined(__SGI_STL_PORT)
 | 
			
		||||
typedef ::std::char_traits<char>::off_type distance;
 | 
			
		||||
non_pointer_test<std::ostream_iterator<int>,int,
 | 
			
		||||
    distance,int*,int&,std::output_iterator_tag> ostream_iterator_test;
 | 
			
		||||
#elif defined(BOOST_MSVC_STD_ITERATOR)
 | 
			
		||||
non_pointer_test<std::ostream_iterator<int>,
 | 
			
		||||
    int, void, void, void, std::output_iterator_tag>
 | 
			
		||||
    int, void, int*, int&, std::output_iterator_tag>
 | 
			
		||||
        ostream_iterator_test;
 | 
			
		||||
#else
 | 
			
		||||
non_pointer_test<std::ostream_iterator<int>,
 | 
			
		||||
@@ -175,6 +176,7 @@ non_pointer_test<std::ostream_iterator<int>,
 | 
			
		||||
#else
 | 
			
		||||
  typedef std::ptrdiff_t std_list_diff_type;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
non_pointer_test<std::list<int>::iterator, int, std_list_diff_type, int*, int&, std::bidirectional_iterator_tag>
 | 
			
		||||
        list_iterator_test;
 | 
			
		||||
 | 
			
		||||
@@ -189,16 +191,16 @@ non_pointer_test<my_iterator1, char, long, const char*, const char&, std::forwar
 | 
			
		||||
                    
 | 
			
		||||
non_pointer_test<my_iterator2, char, long, const char*, const char&, std::forward_iterator_tag>
 | 
			
		||||
       my_iterator2_test;
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
non_pointer_test<my_iterator3, char, int, const char*, const char&, std::forward_iterator_tag>
 | 
			
		||||
       my_iterator3_test;
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    char chars[100];
 | 
			
		||||
    int ints[100];
 | 
			
		||||
    
 | 
			
		||||
    for (std::ptrdiff_t length = 3; length < 100; length += length / 3)
 | 
			
		||||
 | 
			
		||||
    for (int length = 3; length < 100; length += length / 3)
 | 
			
		||||
    {
 | 
			
		||||
        std::list<int> l(length);
 | 
			
		||||
        assert(boost::detail::distance(l.begin(), l.end()) == length);
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
//   9 Jun 99  Add unnamed namespace
 | 
			
		||||
//   2 Jun 99  Initial Version
 | 
			
		||||
 | 
			
		||||
#include <boost/utility.hpp>
 | 
			
		||||
#include <boost/noncopyable.hpp>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
//  This program demonstrates compiler errors resulting from trying to copy
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3121
									
								
								operators.htm
									
									
									
									
									
								
							
							
						
						
									
										3121
									
								
								operators.htm
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										60
									
								
								throw_exception.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								throw_exception.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
			
		||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>Boost: throw_exception.hpp documentation</title>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
	</head>
 | 
			
		||||
	<body bgcolor="white" style="MARGIN-LEFT: 5%; MARGIN-RIGHT: 5%">
 | 
			
		||||
		<table border="0" width="100%">
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td width="277">
 | 
			
		||||
					<img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86">
 | 
			
		||||
				</td>
 | 
			
		||||
				<td align="middle">
 | 
			
		||||
					<h1>throw_exception.hpp</h1>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
			<tr>
 | 
			
		||||
				<td colspan="2" height="64"> </td>
 | 
			
		||||
			</tr>
 | 
			
		||||
		</table>
 | 
			
		||||
		<p>
 | 
			
		||||
			The header <STRONG><boost/throw_exception.hpp></STRONG> defines the 
 | 
			
		||||
			helper function <STRONG>boost::throw_exception</STRONG>. It is intended to be 
 | 
			
		||||
			used in Boost libraries that need to throw exceptions, but support 
 | 
			
		||||
			configurations and platforms where exceptions aren't available, as indicated by 
 | 
			
		||||
			the presence of the <STRONG>BOOST_NO_EXCEPTIONS</STRONG> <A href="../config/config.htm#macro_ref">
 | 
			
		||||
				configuration macro</A>.
 | 
			
		||||
		</p>
 | 
			
		||||
		<P>When <STRONG>BOOST_NO_EXCEPTIONS</STRONG> is not defined, <tt>boost::throw_exception(e)</tt>
 | 
			
		||||
			is equivalent to <tt>throw e</tt>. Otherwise, the function is left undefined, 
 | 
			
		||||
			and the user is expected to supply an appropriate definition. Callers of <tt>throw_exception</tt>
 | 
			
		||||
			are allowed to assume that the function never returns; therefore, if the 
 | 
			
		||||
			user-defined <tt>throw_exception</tt> returns, the behavior is undefined.</P>
 | 
			
		||||
		<h3><a name="Synopsis">Synopsis</a></h3>
 | 
			
		||||
		<pre>
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
void throw_exception(std::exception const & e); // user defined
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
template<class E> void throw_exception(E const & e)
 | 
			
		||||
{
 | 
			
		||||
    throw e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
</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>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										278
									
								
								utility.htm
									
									
									
									
									
								
							
							
						
						
									
										278
									
								
								utility.htm
									
									
									
									
									
								
							@@ -1,168 +1,113 @@
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
<title>Header boost/utility.hpp Documentation</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
 | 
			
		||||
<h1><img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align="center" WIDTH="277" HEIGHT="86">Header
 | 
			
		||||
<a href="../../boost/utility.hpp">boost/utility.hpp</a></h1>
 | 
			
		||||
 | 
			
		||||
<p>The entire contents of the header <code><a href="../../boost/utility.hpp"><boost/utility.hpp></a></code>
 | 
			
		||||
 are in <code>namespace boost</code>.</p>
 | 
			
		||||
 | 
			
		||||
<h2>Contents</h2>
 | 
			
		||||
 | 
			
		||||
<ul>
 | 
			
		||||
  <li>Class templates supporting the <a href="base_from_member.html">base-from-member
 | 
			
		||||
    idiom</a></li>
 | 
			
		||||
  <li>Function templates <a href="#checked_delete">checked_delete() and
 | 
			
		||||
    checked_array_delete()</a></li>
 | 
			
		||||
  <li>Function templates <a href="#functions next">next() and prior()</a></li>
 | 
			
		||||
  <li>Class <a href="#Class noncopyable">noncopyable</a></li>
 | 
			
		||||
  <li>Function template <a href="#addressof">addressof()</a></li>
 | 
			
		||||
  <li>Function template <a href="tie.html">tie()</a> and supporting class tied.</li>
 | 
			
		||||
</ul>
 | 
			
		||||
<h2> Function templates <a name="checked_delete">checked_delete</a>() and
 | 
			
		||||
checked_array_delete()</h2>
 | 
			
		||||
 | 
			
		||||
<p>Deletion of a pointer to an incomplete type is an unsafe programming practice
 | 
			
		||||
because there is no way for the compiler to verify that the destructor is indeed
 | 
			
		||||
trivial.  The checked_delete() and checked_array_delete() function
 | 
			
		||||
templates simply <b>delete</b> or <b>delete[]</b> their argument, but also
 | 
			
		||||
require that their argument be a complete type.  They issue an appropriate
 | 
			
		||||
compiler error diagnostic if that requirement is not met.  A typical
 | 
			
		||||
implementation is shown; other implementations may vary:</p>
 | 
			
		||||
 | 
			
		||||
<pre>    template< typename T >
 | 
			
		||||
    inline void checked_delete(T const volatile * x)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_STATIC_ASSERT( sizeof(T) ); // assert type complete at point
 | 
			
		||||
                                          // of instantiation
 | 
			
		||||
        delete x;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template< typename T >
 | 
			
		||||
    inline void checked_array_delete(T const volatile * x)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_STATIC_ASSERT( sizeof(T) ); // assert type complete at point
 | 
			
		||||
                                          // of instantiation
 | 
			
		||||
        delete [] x;
 | 
			
		||||
    }</pre>
 | 
			
		||||
 | 
			
		||||
<p>Contributed by Beman Dawes, based on a suggestion from Dave Abrahams,
 | 
			
		||||
generalizing an idea from Vladimir Prus, with comments from Rainer Deyke, John
 | 
			
		||||
Maddock, and others.</p>
 | 
			
		||||
 | 
			
		||||
<h3>Background</h3>
 | 
			
		||||
 | 
			
		||||
<p>The C++ Standard specifies that delete on a pointer to an incomplete types is
 | 
			
		||||
undefined behavior if the type has a non-trivial destructor in  [expr.delete]
 | 
			
		||||
5.3.5 paragraph.  No diagnostic is required.  Some but not all
 | 
			
		||||
compilers issue warnings if the type is incomplete at point of deletion.</p>
 | 
			
		||||
 | 
			
		||||
<h2> <a name="functions next">Function</a> templates next() and prior()</h2>
 | 
			
		||||
 | 
			
		||||
<p>Certain data types, such as the C++ Standard Library's forward and
 | 
			
		||||
bidirectional iterators, do not provide addition and subtraction via operator+()
 | 
			
		||||
or operator-().  This means that non-modifying computation of the next or
 | 
			
		||||
prior value requires a temporary, even though operator++() or operator--() is
 | 
			
		||||
provided.  It also means that writing code like <code>itr+1</code> inside a
 | 
			
		||||
template restricts the iterator category to random access iterators.</p>
 | 
			
		||||
 | 
			
		||||
<p>The next() and prior() functions provide a simple way around these problems:</p>
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
 | 
			
		||||
<pre>template <class T>
 | 
			
		||||
	<head>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
		<title>Header boost/utility.hpp Documentation</title>
 | 
			
		||||
	</head>
 | 
			
		||||
	<body bgcolor="#FFFFFF" text="#000000">
 | 
			
		||||
		<h1><img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align="center" WIDTH="277" HEIGHT="86">Header
 | 
			
		||||
			<a href="../../boost/utility.hpp">boost/utility.hpp</a></h1>
 | 
			
		||||
		<p>The entire contents of the header <code><a href="../../boost/utility.hpp"><boost/utility.hpp></a></code>
 | 
			
		||||
			are in <code>namespace boost</code>.</p>
 | 
			
		||||
		<h2>Contents</h2>
 | 
			
		||||
		<ul>
 | 
			
		||||
			<li>
 | 
			
		||||
				Class templates supporting the <a href="base_from_member.html">base-from-member 
 | 
			
		||||
					idiom</a></li>
 | 
			
		||||
			<li>
 | 
			
		||||
				Function templates <a href="#checked_delete">checked_delete() and 
 | 
			
		||||
					checked_array_delete()</a></li>
 | 
			
		||||
			<li>
 | 
			
		||||
				Function templates <a href="#functions_next_prior">next() and prior()</a></li>
 | 
			
		||||
			<li>
 | 
			
		||||
				Class <a href="#Class_noncopyable">noncopyable</a></li>
 | 
			
		||||
			<li>
 | 
			
		||||
				Function template <a href="#addressof">addressof()</a></li>
 | 
			
		||||
			<li>
 | 
			
		||||
				Function template <a href="tie.html">tie()</a> and supporting class tied.</li>
 | 
			
		||||
		</ul>
 | 
			
		||||
		<h2>
 | 
			
		||||
			Function templates <a name="checked_delete">checked_delete</a>() and 
 | 
			
		||||
			checked_array_delete()</h2>
 | 
			
		||||
		<p>See <a href="checked_delete.html">separate documentation</a>.</p>
 | 
			
		||||
		<h2>
 | 
			
		||||
			<a name="functions_next_prior">Function</a> templates next() and prior()</h2>
 | 
			
		||||
		<p>Certain data types, such as the C++ Standard Library's forward and bidirectional 
 | 
			
		||||
			iterators, do not provide addition and subtraction via operator+() or 
 | 
			
		||||
			operator-().  This means that non-modifying computation of the next or 
 | 
			
		||||
			prior value requires a temporary, even though operator++() or operator--() is 
 | 
			
		||||
			provided.  It also means that writing code like <code>itr+1</code> inside 
 | 
			
		||||
			a template restricts the iterator category to random access iterators.</p>
 | 
			
		||||
		<p>The next() and prior() functions provide a simple way around these problems:</p>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<pre>template <class T>
 | 
			
		||||
T next(T x) { return ++x; }
 | 
			
		||||
 | 
			
		||||
template <class X>
 | 
			
		||||
T prior(T x) { return --x; }</pre>
 | 
			
		||||
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
<p>Usage is simple:</p>
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
 | 
			
		||||
<pre>const std::list<T>::iterator p = get_some_iterator();
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<p>Usage is simple:</p>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<pre>const std::list<T>::iterator p = get_some_iterator();
 | 
			
		||||
const std::list<T>::iterator prev = boost::prior(p);</pre>
 | 
			
		||||
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
<p>Contributed by <a href="../../people/dave_abrahams.htm">Dave Abrahams</a>.</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 and copy assignment.</p>
 | 
			
		||||
 | 
			
		||||
<p>Some objects, particularly those which hold complex resources like files or
 | 
			
		||||
network connections, have no sensible copy semantics.  Sometimes there are
 | 
			
		||||
possible copy semantics, but these would be of very limited usefulness and be
 | 
			
		||||
very difficult to implement correctly.  Sometimes you're implementing a class that doesn't need to be copied
 | 
			
		||||
just yet and you don't want to take the time to write the appropriate functions. 
 | 
			
		||||
Deriving from <b> noncopyable</b> will prevent the otherwise implicitly-generated
 | 
			
		||||
functions (which don't have the proper semantics) from becoming a trap for other programmers.</p>
 | 
			
		||||
 | 
			
		||||
<p>The traditional way to deal with these is to declare a private copy constructor and copy assignment, and then
 | 
			
		||||
document why this is done.  But deriving from <b>noncopyable</b> is simpler
 | 
			
		||||
and clearer, and doesn't require additional documentation.</p>
 | 
			
		||||
 | 
			
		||||
<p>The program <a href="noncopyable_test.cpp">noncopyable_test.cpp</a> can be
 | 
			
		||||
used 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>
 | 
			
		||||
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
<blockquote>
 | 
			
		||||
  <pre>// inside one of your own headers ...
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<p>Contributed by <a href="../../people/dave_abrahams.htm">Dave Abrahams</a>.</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 
 | 
			
		||||
			and copy assignment.</p>
 | 
			
		||||
		<p>Some objects, particularly those which hold complex resources like files or 
 | 
			
		||||
			network connections, have no sensible copy semantics.  Sometimes there are 
 | 
			
		||||
			possible copy semantics, but these would be of very limited usefulness and be 
 | 
			
		||||
			very difficult to implement correctly.  Sometimes you're implementing a 
 | 
			
		||||
			class that doesn't need to be copied just yet and you don't want to take the 
 | 
			
		||||
			time to write the appropriate functions.  Deriving from <b>noncopyable</b> 
 | 
			
		||||
			will prevent the otherwise implicitly-generated functions (which don't have the 
 | 
			
		||||
			proper semantics) from becoming a trap for other programmers.</p>
 | 
			
		||||
		<p>The traditional way to deal with these is to declare a private copy constructor 
 | 
			
		||||
			and copy assignment, and then document why this is done.  But deriving 
 | 
			
		||||
			from <b>noncopyable</b> is simpler and clearer, and doesn't require additional 
 | 
			
		||||
			documentation.</p>
 | 
			
		||||
		<p>The program <a href="noncopyable_test.cpp">noncopyable_test.cpp</a> can be used 
 | 
			
		||||
			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>
 | 
			
		||||
		<h3>Example</h3>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<pre>// inside one of your own headers ...
 | 
			
		||||
#include <boost/utility.hpp>
 | 
			
		||||
 | 
			
		||||
class ResourceLadenFileSystem : boost::noncopyable {
 | 
			
		||||
...</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
<h3>Rationale</h3>
 | 
			
		||||
<p>Class noncopyable has protected constructor and destructor members to
 | 
			
		||||
emphasize that it is to be used only as a base class.  Dave Abrahams notes
 | 
			
		||||
concern about the effect on compiler optimization of adding (even trivial inline)
 | 
			
		||||
destructor declarations. He says "Probably this concern is misplaced, because
 | 
			
		||||
noncopyable will be used mostly for classes which own resources and thus have non-trivial destruction semantics."</p>
 | 
			
		||||
<h2><a name="addressof">Function template addressof()</a></h2>
 | 
			
		||||
<p>Function <strong>addressof()</strong> returns the address of an object.</p>
 | 
			
		||||
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>
 | 
			
		||||
template <typename T> inline T*                addressof(T& v);
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h3>Rationale</h3>
 | 
			
		||||
		<p>Class noncopyable has protected constructor and destructor members to emphasize 
 | 
			
		||||
			that it is to be used only as a base class.  Dave Abrahams notes concern 
 | 
			
		||||
			about the effect on compiler optimization of adding (even trivial inline) 
 | 
			
		||||
			destructor declarations. He says "Probably this concern is misplaced, 
 | 
			
		||||
			because noncopyable will be used mostly for classes which own resources and 
 | 
			
		||||
			thus have non-trivial destruction semantics."</p>
 | 
			
		||||
		<h2><a name="addressof">Function template addressof()</a></h2>
 | 
			
		||||
		<p>Function <strong>addressof()</strong> returns the address of an object.</p>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<pre>template <typename T> inline T*                addressof(T& v);
 | 
			
		||||
template <typename T> inline const T*          addressof(const T& v);
 | 
			
		||||
template <typename T> inline volatile T*       addressof(volatile T& v);
 | 
			
		||||
template <typename T> inline const volatile T* addressof(const volatile T& v);
 | 
			
		||||
</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>C++ allows programmers to replace the unary
 | 
			
		||||
<strong>operator&()</strong> class member used to get the address of
 | 
			
		||||
an object.  Getting the real address of an object requires ugly
 | 
			
		||||
casting tricks to avoid invoking the overloaded
 | 
			
		||||
<strong>operator&()</strong>.  Function <strong>addressof()</strong>
 | 
			
		||||
provides a wrapper around the necessary code to make it easy to get an
 | 
			
		||||
object's real address.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p>The program <a href="addressof_test.cpp">addressof_test.cpp</a> can be
 | 
			
		||||
used to verify that <b>addressof()</b> works as expected.</p>
 | 
			
		||||
 | 
			
		||||
<p>Contributed by Brad King based on ideas from discussion with Doug Gregor.</p>
 | 
			
		||||
<h3>Example</h3>
 | 
			
		||||
<blockquote>
 | 
			
		||||
<pre>#include <boost/utility.hpp>
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<p>C++ allows programmers to replace the unary <strong>operator&()</strong> class 
 | 
			
		||||
			member used to get the address of an object. Getting the real address of an 
 | 
			
		||||
			object requires ugly casting tricks to avoid invoking the overloaded <strong>operator&()</strong>. 
 | 
			
		||||
			Function <strong>addressof()</strong> provides a wrapper around the necessary 
 | 
			
		||||
			code to make it easy to get an object's real address.
 | 
			
		||||
		</p>
 | 
			
		||||
		<p>The program <a href="addressof_test.cpp">addressof_test.cpp</a> can be used to 
 | 
			
		||||
			verify that <b>addressof()</b> works as expected.</p>
 | 
			
		||||
		<p>Contributed by Brad King based on ideas from discussion with Doug Gregor.</p>
 | 
			
		||||
		<h3>Example</h3>
 | 
			
		||||
		<blockquote>
 | 
			
		||||
			<pre>#include <boost/utility.hpp>
 | 
			
		||||
 | 
			
		||||
struct useless_type {};
 | 
			
		||||
class nonaddressable {
 | 
			
		||||
@@ -174,20 +119,19 @@ void f() {
 | 
			
		||||
  nonaddressable* xp = boost::addressof(x);
 | 
			
		||||
  // nonaddressable* xpe = &x; /* error */
 | 
			
		||||
}</pre>
 | 
			
		||||
</blockquote>
 | 
			
		||||
 | 
			
		||||
<h2>Class templates for the Base-from-Member Idiom</h2>
 | 
			
		||||
<p>See <a href="base_from_member.html">separate documentation</a>.</p>
 | 
			
		||||
<h2>Function template tie()</h2>
 | 
			
		||||
<p>See <a href="tie.html">separate documentation</a>.</p>
 | 
			
		||||
<hr>
 | 
			
		||||
<p>Revised  <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan
 | 
			
		||||
-->10 September, 2001<!--webbot bot="Timestamp" endspan i-checksum="39328"
 | 
			
		||||
		</blockquote>
 | 
			
		||||
		<h2>Class templates for the Base-from-Member Idiom</h2>
 | 
			
		||||
		<p>See <a href="base_from_member.html">separate documentation</a>.</p>
 | 
			
		||||
		<h2>Function template tie()</h2>
 | 
			
		||||
		<p>See <a href="tie.html">separate documentation</a>.</p>
 | 
			
		||||
		<hr>
 | 
			
		||||
		<p>Revised  <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan
 | 
			
		||||
-->09 January, 2003<!--webbot bot="Timestamp" endspan i-checksum="38582"
 | 
			
		||||
-->
 | 
			
		||||
</p>
 | 
			
		||||
<p><EFBFBD> Copyright boost.org 1999. Permission to copy, use, modify, sell and
 | 
			
		||||
distribute this document is granted provided this copyright notice appears in
 | 
			
		||||
all copies. This document is provided "as is" without express or
 | 
			
		||||
implied warranty, and with no claim as to its suitability for any purpose.</p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
		</p>
 | 
			
		||||
		<p><EFBFBD> Copyright boost.org 1999-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>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
		Reference in New Issue
	
	Block a user