mirror of
https://github.com/boostorg/utility.git
synced 2025-10-06 14:00:55 +02:00
Compare commits
10 Commits
svn-branch
...
boost-1.38
Author | SHA1 | Date | |
---|---|---|---|
|
570b84cdc7 | ||
|
b2e6a82adb | ||
|
390372294a | ||
|
ffbbf38e12 | ||
|
9e73b2c6ae | ||
|
633832e872 | ||
|
862cb2a4e0 | ||
|
b012f16ee5 | ||
|
3d96ab26d4 | ||
|
8652bf51ec |
31
CMakeLists.txt
Normal file
31
CMakeLists.txt
Normal file
@@ -0,0 +1,31 @@
|
||||
#----------------------------------------------------------------------------
|
||||
# This file was automatically generated from the original CMakeLists.txt file
|
||||
# Add a variable to hold the headers for the library
|
||||
set (lib_headers
|
||||
assert.hpp
|
||||
call_traits.hpp
|
||||
checked_delete.hpp
|
||||
compressed_pair.hpp
|
||||
current_function.hpp
|
||||
operators.hpp
|
||||
throw_exception.hpp
|
||||
utility.hpp
|
||||
utility
|
||||
)
|
||||
|
||||
# Add a library target to the build system
|
||||
boost_library_project(
|
||||
utility
|
||||
# SRCDIRS
|
||||
TESTDIRS test
|
||||
HEADERS ${lib_headers}
|
||||
# DOCDIRS
|
||||
DESCRIPTION "Various small utilities for C++ programming."
|
||||
MODULARIZED
|
||||
AUTHORS "David Abrahams <dave -at- boostpro.com>"
|
||||
"Brad King"
|
||||
"Douglas Gregor <doug.gregor -at- gmail.com>"
|
||||
# MAINTAINERS
|
||||
)
|
||||
|
||||
|
@@ -99,7 +99,7 @@ directly to the container:</p>
|
||||
<H2><A NAME="framework"></A>Framework</H2>
|
||||
<p>
|
||||
This library proposes a framework to allow some containers to directly contruct contained objects in-place without requiring
|
||||
the entire set of constructor overloads ftom the contained type. It also allows the container to remove the CopyConstuctible
|
||||
the entire set of constructor overloads from the contained type. It also allows the container to remove the CopyConstuctible
|
||||
requirement from the contained type since objects can be directly constructed in-place without need of a copy.<br>
|
||||
The only requirement on the container is that it must provide proper storage (that is, correctly aligned and sized).
|
||||
Naturally, the container will typically support uninitialized storage to avoid the in-place construction to override
|
||||
@@ -293,4 +293,4 @@ the latest version of this file can be found at <A
|
||||
HREF="http://www.boost.org">www.boost.org</A>, and the boost
|
||||
<A HREF="http://www.boost.org/more/mailing_lists.htm#main">discussion lists</A></P>
|
||||
</BODY>
|
||||
</HTML>
|
||||
</HTML>
|
||||
|
12
include/boost/swap.hpp
Normal file
12
include/boost/swap.hpp
Normal file
@@ -0,0 +1,12 @@
|
||||
// Copyright (C) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See
|
||||
// accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef BOOST_SWAP_HPP
|
||||
#define BOOST_SWAP_HPP
|
||||
|
||||
#include "boost/utility/swap.hpp"
|
||||
|
||||
#endif
|
55
include/boost/utility/swap.hpp
Normal file
55
include/boost/utility/swap.hpp
Normal file
@@ -0,0 +1,55 @@
|
||||
// Copyright (C) 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See
|
||||
// accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
// For more information, see http://www.boost.org
|
||||
|
||||
|
||||
#ifndef BOOST_UTILITY_SWAP_HPP
|
||||
#define BOOST_UTILITY_SWAP_HPP
|
||||
|
||||
// Note: the implementation of this utility contains various workarounds:
|
||||
// - swap_impl is put outside the boost namespace, to avoid infinite
|
||||
// recursion (causing stack overflow) when swapping objects of a primitive
|
||||
// type.
|
||||
// - swap_impl has a using-directive, rather than a using-declaration,
|
||||
// because some compilers (including MSVC 7.1, Borland 5.9.3, and
|
||||
// Intel 8.1) don't do argument-dependent lookup when it has a
|
||||
// using-declaration instead.
|
||||
// - boost::swap has two template arguments, instead of one, to
|
||||
// avoid ambiguity when swapping objects of a Boost type that does
|
||||
// not have its own boost::swap overload.
|
||||
|
||||
#include <algorithm> //for std::swap
|
||||
#include <cstddef> //for std::size_t
|
||||
|
||||
namespace boost_swap_impl
|
||||
{
|
||||
template<class T>
|
||||
void swap_impl(T& left, T& right)
|
||||
{
|
||||
using namespace std;//use std::swap if argument dependent lookup fails
|
||||
swap(left,right);
|
||||
}
|
||||
|
||||
template<class T, std::size_t N>
|
||||
void swap_impl(T (& left)[N], T (& right)[N])
|
||||
{
|
||||
for (std::size_t i = 0; i < N; ++i)
|
||||
{
|
||||
::boost_swap_impl::swap_impl(left[i], right[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace boost
|
||||
{
|
||||
template<class T1, class T2>
|
||||
void swap(T1& left, T2& right)
|
||||
{
|
||||
::boost_swap_impl::swap_impl(left, right);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
@@ -7,6 +7,7 @@
|
||||
// 21 Ago 2002 (Created) Fernando Cacciola
|
||||
// 24 Dec 2007 (Refactored and worked around various compiler bugs) Fernando Cacciola, Niels Dekker
|
||||
// 23 May 2008 (Fixed operator= const issue, added initialized_value) Niels Dekker, Fernando Cacciola
|
||||
// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola
|
||||
//
|
||||
#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
||||
#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
|
||||
@@ -22,6 +23,7 @@
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/type_traits/cv_traits.hpp>
|
||||
#include <boost/type_traits/alignment_of.hpp>
|
||||
#include <boost/swap.hpp>
|
||||
#include <cstring>
|
||||
#include <new>
|
||||
|
||||
@@ -93,6 +95,11 @@ class value_initialized
|
||||
return wrapper_address()->data;
|
||||
}
|
||||
|
||||
void swap(value_initialized & arg)
|
||||
{
|
||||
::boost::swap( this->data(), arg.data() );
|
||||
}
|
||||
|
||||
operator T&() const { return this->data(); }
|
||||
|
||||
} ;
|
||||
@@ -110,6 +117,12 @@ T& get ( value_initialized<T>& x )
|
||||
return x.data() ;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void swap ( value_initialized<T> & lhs, value_initialized<T> & rhs )
|
||||
{
|
||||
lhs.swap(rhs) ;
|
||||
}
|
||||
|
||||
|
||||
class initialized_value_t
|
||||
{
|
||||
|
1
module.cmake
Normal file
1
module.cmake
Normal file
@@ -0,0 +1 @@
|
||||
boost_module(utility DEPENDS iterator exception detail )
|
94
swap.html
Normal file
94
swap.html
Normal file
@@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Boost: Swap Documentation</title>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Page header -->
|
||||
<img src="../../boost.png" alt="C++ Boost" align="middle" width="277" height="86"/>
|
||||
<h1>Swap</h1>
|
||||
|
||||
<p>
|
||||
<tt>template<class T> void swap(T& <em>left</em>, T& <em>right</em>);</tt>
|
||||
</p>
|
||||
|
||||
<!-- Introduction -->
|
||||
<p>
|
||||
The template function <tt>boost::swap</tt> allows the values of two variables to be swapped, using argument dependent lookup to select a specialized swap function if available. If no specialized swap function is available, <tt>std::swap</tt> is used.
|
||||
</p>
|
||||
|
||||
<!-- Rationale -->
|
||||
<h2>Rationale</h2>
|
||||
<p>
|
||||
The generic <tt>std::swap</tt> function requires that the elements to be swapped are assignable and copy constructible. It is usually implemented using one copy construction and two assignments - this is often both unnecessarily restrictive and unnecessarily slow. In addition, where the generic swap implementation provides only the basic guarantee, specialized swap functions are often able to provide the no-throw exception guarantee (and it is considered best practice to do so where possible<sup><a href="#ref1">1</a></sup>).</p>
|
||||
<p>
|
||||
The alternative to using argument dependent lookup in this situation is to provide a template specialization of <tt>std::swap</tt> for every type that requires a specialized swap. Although this is legal C++, no Boost libraries use this method, whereas many Boost libraries provide specialized swap functions in their own namespaces.
|
||||
</p>
|
||||
<p>
|
||||
<tt>boost::swap</tt> also supports swapping built-in arrays. Note that <tt>std::swap</tt> originally did not do so, but a request to add an overload of <tt>std::swap</tt> for built-in arrays has been accepted by the C++ Standards Committee<sup><a href="#ref2">2</a></sup>.
|
||||
</p>
|
||||
|
||||
<!-- Exception Safety -->
|
||||
<h2>Exception Safety</h2>
|
||||
<p>
|
||||
<tt>boost::swap</tt> provides the same exception guarantee as the underlying swap function used, with one exception; for an array of type <tt>T[n]</tt>, where <tt>n > 1</tt> and the underlying swap function for <tt>T</tt> provides the strong exception guarantee, <tt>boost::swap</tt> provides only the basic exception guarantee.
|
||||
</p>
|
||||
|
||||
<!-- Requirements -->
|
||||
<h2>Requirements</h2>
|
||||
<p>Either:</p>
|
||||
<ul>
|
||||
<li>T must be assignable</li>
|
||||
<li>T must be copy constructible</li>
|
||||
</ul>
|
||||
<p>Or:</p>
|
||||
<ul>
|
||||
<li>A function with the signature <tt>swap(T&,T&)</tt> is available via argument dependent lookup</li>
|
||||
</ul>
|
||||
<p>Or:</p>
|
||||
<ul>
|
||||
<li>A template specialization of <tt>std::swap</tt> exists for T</li>
|
||||
</ul>
|
||||
<p>Or:</p>
|
||||
<ul>
|
||||
<li>T is a built-in array of swappable elements</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<!-- Portability -->
|
||||
<h2>Portability</h2>
|
||||
<p>
|
||||
Several older compilers do not support argument dependent lookup ‒ on these compilers <tt>boost::swap</tt> will call <tt>std::swap</tt>, ignoring any specialized swap functions that could be found as a result of argument dependent lookup.
|
||||
</p>
|
||||
|
||||
<!-- Credits -->
|
||||
<h2>Credits</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<em>Niels Dekker</em> - for implementing and documenting support for built-in arrays
|
||||
</li>
|
||||
<li>
|
||||
<em><a href="mailto:Joseph.Gauterin@googlemail.com">Joseph Gauterin</a></em> - for the initial idea, implementation, tests, and documentation
|
||||
</li>
|
||||
<li>
|
||||
<em>Steven Watanabe</em> - for the idea to make <tt>boost::swap</tt> less specialized than <tt>std::swap</tt>, thereby allowing the function to have the name 'swap' without introducing ambiguity
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- References -->
|
||||
<hr/>
|
||||
<p><sup><a id="ref1"/>[1]</sup>Scott Meyers, Effective C++ Third Edition, Item 25: "Consider support for a non-throwing swap"</p>
|
||||
<p><sup><a id="ref2"/>[2]</sup><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#809">LWG Defect Report 809 (std::swap should be overloaded for array types)</a></p>
|
||||
|
||||
<!-- Copyright info -->
|
||||
<hr/>
|
||||
<p>Revised: 15 November 2008</p>
|
||||
<p>
|
||||
Copyright 2007, 2008 Joseph Gauterin. Use, modification, and distribution are subject to the Boost Software License, Version 1.0.
|
||||
(See accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or a copy at <<a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>>.)
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
37
swap/test/Jamfile.v2
Normal file
37
swap/test/Jamfile.v2
Normal file
@@ -0,0 +1,37 @@
|
||||
# Copyright (c) 2007, 2008 Joseph Gauterin
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
# bring in rules for testing
|
||||
import testing ;
|
||||
|
||||
test-suite utility/swap
|
||||
:
|
||||
[ compile root_header_1.cpp ]
|
||||
[ compile root_header_2.cpp ]
|
||||
[ compile lib_header_1.cpp ]
|
||||
[ compile lib_header_2.cpp ]
|
||||
[ compile mixed_headers_1.cpp ]
|
||||
[ compile mixed_headers_2.cpp ]
|
||||
[ run primitive.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run specialized_in_boost.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run specialized_in_global.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run specialized_in_other.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run specialized_in_std.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run specialized_in_boost_and_other.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run std_bitset.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run std_dateorder.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run std_string.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run std_typeinfo_ptr.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run std_vector_of_boost.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run std_vector_of_global.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run std_vector_of_other.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run no_ambiguity_in_boost.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run array_of_array_of_class.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run array_of_array_of_int.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run array_of_class.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run array_of_int.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
[ run array_of_template.cpp ../../../test/build//boost_test_exec_monitor/<link>static ]
|
||||
;
|
69
swap/test/array_of_array_of_class.cpp
Normal file
69
swap/test/array_of_array_of_class.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping an array of arrays of swap_test_class objects by means of boost::swap.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
//Put test class in the global namespace
|
||||
#include "./swap_test_class.hpp"
|
||||
|
||||
#include <algorithm> //for std::copy and std::equal
|
||||
#include <cstddef> //for std::size_t
|
||||
|
||||
//Provide swap function in both the namespace of swap_test_class
|
||||
//(which is the global namespace), and the std namespace.
|
||||
//It's common to provide a swap function for a class in both
|
||||
//namespaces. Scott Meyers recommends doing so: Effective C++,
|
||||
//Third Edition, item 25, "Consider support for a non-throwing swap".
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <>
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const std::size_t first_dimension = 3;
|
||||
const std::size_t second_dimension = 4;
|
||||
const std::size_t number_of_elements = first_dimension * second_dimension;
|
||||
|
||||
swap_test_class array1[first_dimension][second_dimension];
|
||||
swap_test_class array2[first_dimension][second_dimension];
|
||||
|
||||
swap_test_class* const ptr1 = array1[0];
|
||||
swap_test_class* const ptr2 = array2[0];
|
||||
|
||||
for (std::size_t i = 0; i < number_of_elements; ++i)
|
||||
{
|
||||
ptr1[i].set_data( static_cast<int>(i) );
|
||||
ptr2[i].set_data( static_cast<int>(i + number_of_elements) );
|
||||
}
|
||||
|
||||
boost::swap(array1, array2);
|
||||
|
||||
for (std::size_t i = 0; i < number_of_elements; ++i)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(ptr1[i].get_data(), static_cast<int>(i + number_of_elements) );
|
||||
BOOST_CHECK_EQUAL(ptr2[i].get_data(), static_cast<int>(i) );
|
||||
}
|
||||
|
||||
BOOST_CHECK_EQUAL(swap_test_class::swap_count(), number_of_elements);
|
||||
BOOST_CHECK_EQUAL(swap_test_class::copy_count(), 0);
|
||||
|
||||
return 0;
|
||||
}
|
42
swap/test/array_of_array_of_int.cpp
Normal file
42
swap/test/array_of_array_of_int.cpp
Normal file
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping an array of arrays of integers by means of boost::swap.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#include <algorithm> //for std::copy and std::equal
|
||||
#include <cstddef> //for std::size_t
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const std::size_t first_dimension = 3;
|
||||
const std::size_t second_dimension = 4;
|
||||
const std::size_t number_of_elements = first_dimension * second_dimension;
|
||||
|
||||
int array1[first_dimension][second_dimension];
|
||||
int array2[first_dimension][second_dimension];
|
||||
|
||||
int* const ptr1 = array1[0];
|
||||
int* const ptr2 = array2[0];
|
||||
|
||||
for (std::size_t i = 0; i < number_of_elements; ++i)
|
||||
{
|
||||
ptr1[i] = static_cast<int>(i);
|
||||
ptr2[i] = static_cast<int>(i + number_of_elements);
|
||||
}
|
||||
|
||||
boost::swap(array1, array2);
|
||||
|
||||
for (std::size_t i = 0; i < number_of_elements; ++i)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(ptr1[i], static_cast<int>(i + number_of_elements) );
|
||||
BOOST_CHECK_EQUAL(ptr2[i], static_cast<int>(i) );
|
||||
}
|
||||
return 0;
|
||||
}
|
61
swap/test/array_of_class.cpp
Normal file
61
swap/test/array_of_class.cpp
Normal file
@@ -0,0 +1,61 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping an array of arrays of swap_test_class objects by means of boost::swap.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
//Put test class in the global namespace
|
||||
#include "./swap_test_class.hpp"
|
||||
|
||||
#include <algorithm> //for std::copy and std::equal
|
||||
#include <cstddef> //for std::size_t
|
||||
|
||||
//Provide swap function in both the namespace of swap_test_class
|
||||
//(which is the global namespace), and the std namespace.
|
||||
//It's common to provide a swap function for a class in both
|
||||
//namespaces. Scott Meyers recommends doing so: Effective C++,
|
||||
//Third Edition, item 25, "Consider support for a non-throwing swap".
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <>
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const std::size_t array_size = 2;
|
||||
const swap_test_class initial_array1[array_size] = { swap_test_class(1), swap_test_class(2) };
|
||||
const swap_test_class initial_array2[array_size] = { swap_test_class(3), swap_test_class(4) };
|
||||
|
||||
swap_test_class array1[array_size];
|
||||
swap_test_class array2[array_size];
|
||||
|
||||
std::copy(initial_array1, initial_array1 + array_size, array1);
|
||||
std::copy(initial_array2, initial_array2 + array_size, array2);
|
||||
|
||||
swap_test_class::reset();
|
||||
boost::swap(array1, array2);
|
||||
|
||||
BOOST_CHECK(std::equal(array1, array1 + array_size, initial_array2));
|
||||
BOOST_CHECK(std::equal(array2, array2 + array_size, initial_array1));
|
||||
|
||||
BOOST_CHECK_EQUAL(swap_test_class::swap_count(), array_size);
|
||||
BOOST_CHECK_EQUAL(swap_test_class::copy_count(), 0);
|
||||
|
||||
return 0;
|
||||
}
|
35
swap/test/array_of_int.cpp
Normal file
35
swap/test/array_of_int.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping an array of integers by means of boost::swap.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#include <algorithm> //for std::copy and std::equal
|
||||
#include <cstddef> //for std::size_t
|
||||
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const std::size_t array_size = 3;
|
||||
const int initial_array1[array_size] = { 1, 2, 3 };
|
||||
const int initial_array2[array_size] = { 4, 5, 6 };
|
||||
|
||||
int array1[array_size];
|
||||
int array2[array_size];
|
||||
|
||||
std::copy(initial_array1, initial_array1 + array_size, array1);
|
||||
std::copy(initial_array2, initial_array2 + array_size, array2);
|
||||
|
||||
boost::swap(array1, array2);
|
||||
|
||||
BOOST_CHECK(std::equal(array1, array1 + array_size, initial_array2));
|
||||
BOOST_CHECK(std::equal(array2, array2 + array_size, initial_array1));
|
||||
|
||||
return 0;
|
||||
}
|
71
swap/test/array_of_template.cpp
Normal file
71
swap/test/array_of_template.cpp
Normal file
@@ -0,0 +1,71 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping an array of swap_test_template<int> objects by means of boost::swap.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
//Put test class in the global namespace
|
||||
#include "./swap_test_class.hpp"
|
||||
|
||||
#include <algorithm> //for std::copy and std::equal
|
||||
#include <cstddef> //for std::size_t
|
||||
|
||||
template <class T>
|
||||
class swap_test_template
|
||||
{
|
||||
public:
|
||||
typedef T template_argument;
|
||||
swap_test_class swap_test_object;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
inline bool operator==(const swap_test_template<T> & lhs, const swap_test_template<T> & rhs)
|
||||
{
|
||||
return lhs.swap_test_object == rhs.swap_test_object;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline bool operator!=(const swap_test_template<T> & lhs, const swap_test_template<T> & rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
//Provide swap function in the namespace of swap_test_template
|
||||
//(which is the global namespace). Note that it isn't allowed to put
|
||||
//an overload of this function within the std namespace.
|
||||
template <class T>
|
||||
void swap(swap_test_template<T>& left, swap_test_template<T>& right)
|
||||
{
|
||||
left.swap_test_object.swap(right.swap_test_object);
|
||||
}
|
||||
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const std::size_t array_size = 2;
|
||||
const swap_test_template<int> initial_array1[array_size] = { swap_test_class(1), swap_test_class(2) };
|
||||
const swap_test_template<int> initial_array2[array_size] = { swap_test_class(3), swap_test_class(4) };
|
||||
|
||||
swap_test_template<int> array1[array_size];
|
||||
swap_test_template<int> array2[array_size];
|
||||
|
||||
std::copy(initial_array1, initial_array1 + array_size, array1);
|
||||
std::copy(initial_array2, initial_array2 + array_size, array2);
|
||||
|
||||
swap_test_class::reset();
|
||||
boost::swap(array1, array2);
|
||||
|
||||
BOOST_CHECK(std::equal(array1, array1 + array_size, initial_array2));
|
||||
BOOST_CHECK(std::equal(array2, array2 + array_size, initial_array1));
|
||||
|
||||
BOOST_CHECK_EQUAL(swap_test_class::swap_count(), array_size);
|
||||
BOOST_CHECK_EQUAL(swap_test_class::copy_count(), 0);
|
||||
|
||||
return 0;
|
||||
}
|
10
swap/test/lib_header_1.cpp
Normal file
10
swap/test/lib_header_1.cpp
Normal file
@@ -0,0 +1,10 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests that the swap header compiles as a standalone translation unit
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
|
11
swap/test/lib_header_2.cpp
Normal file
11
swap/test/lib_header_2.cpp
Normal file
@@ -0,0 +1,11 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests that the swap header include guards work correctly
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#include <boost/utility/swap.hpp>
|
||||
|
11
swap/test/mixed_headers_1.cpp
Normal file
11
swap/test/mixed_headers_1.cpp
Normal file
@@ -0,0 +1,11 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests that the swap headers work when both are included
|
||||
|
||||
#include <boost/swap.hpp>
|
||||
#include <boost/utility/swap.hpp>
|
||||
|
12
swap/test/mixed_headers_2.cpp
Normal file
12
swap/test/mixed_headers_2.cpp
Normal file
@@ -0,0 +1,12 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests that the swap headers work when both are included
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#include <boost/swap.hpp>
|
||||
|
||||
|
44
swap/test/no_ambiguity_in_boost.cpp
Normal file
44
swap/test/no_ambiguity_in_boost.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// boost::swap internally does an unqualified function call to swap.
|
||||
// This could have led to ambiguity or infinite recursion, when the
|
||||
// objects to be swapped would themselves be from the boost namespace.
|
||||
// If so, boost::swap itself might be found by argument dependent lookup.
|
||||
// The implementation of boost::swap resolves this issue by giving
|
||||
// boost::swap two template argumetns, thereby making it less specialized
|
||||
// than std::swap.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
//Put test class in namespace boost
|
||||
namespace boost
|
||||
{
|
||||
#include "./swap_test_class.hpp"
|
||||
}
|
||||
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const boost::swap_test_class initial_value1(1);
|
||||
const boost::swap_test_class initial_value2(2);
|
||||
|
||||
boost::swap_test_class object1 = initial_value1;
|
||||
boost::swap_test_class object2 = initial_value2;
|
||||
|
||||
boost::swap_test_class::reset();
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK(object1 == initial_value2);
|
||||
BOOST_CHECK(object2 == initial_value1);
|
||||
BOOST_CHECK_EQUAL(boost::swap_test_class::swap_count(),0);
|
||||
BOOST_CHECK_EQUAL(boost::swap_test_class::copy_count(),3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
23
swap/test/primitive.cpp
Normal file
23
swap/test/primitive.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
int object1 = 1;
|
||||
int object2 = 2;
|
||||
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK_EQUAL(object1,2);
|
||||
BOOST_CHECK_EQUAL(object2,1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
10
swap/test/root_header_1.cpp
Normal file
10
swap/test/root_header_1.cpp
Normal file
@@ -0,0 +1,10 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests that the swap header compiles as a standalone translation unit
|
||||
|
||||
#include <boost/swap.hpp>
|
||||
|
11
swap/test/root_header_2.cpp
Normal file
11
swap/test/root_header_2.cpp
Normal file
@@ -0,0 +1,11 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests that the swap header include guards work correctly
|
||||
|
||||
#include <boost/swap.hpp>
|
||||
#include <boost/swap.hpp>
|
||||
|
45
swap/test/specialized_in_boost.cpp
Normal file
45
swap/test/specialized_in_boost.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
//Put test class in namespace boost
|
||||
namespace boost
|
||||
{
|
||||
#include "./swap_test_class.hpp"
|
||||
}
|
||||
|
||||
//Provide swap function in namespace boost
|
||||
namespace boost
|
||||
{
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const boost::swap_test_class initial_value1(1);
|
||||
const boost::swap_test_class initial_value2(2);
|
||||
|
||||
boost::swap_test_class object1 = initial_value1;
|
||||
boost::swap_test_class object2 = initial_value2;
|
||||
|
||||
boost::swap_test_class::reset();
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK(object1 == initial_value2);
|
||||
BOOST_CHECK(object2 == initial_value1);
|
||||
|
||||
BOOST_CHECK_EQUAL(boost::swap_test_class::swap_count(),1);
|
||||
BOOST_CHECK_EQUAL(boost::swap_test_class::copy_count(),0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
64
swap/test/specialized_in_boost_and_other.cpp
Normal file
64
swap/test/specialized_in_boost_and_other.cpp
Normal file
@@ -0,0 +1,64 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests whether instances of a class from a namespace other than boost are
|
||||
// properly swapped, when both boost and the other namespace have a custom
|
||||
// swap function for that class. Note that it shouldn't be necessary for a class
|
||||
// in an other namespace to have a custom swap function in boost, because the
|
||||
// boost::swap utility should find the swap function in the other namespace, by
|
||||
// argument dependent lookup (ADL). Unfortunately ADL isn't fully implemented
|
||||
// by some specific compiler versions, including Intel C++ 8.1, MSVC 7.1, and
|
||||
// Borland 5.9.3. Users of those compilers might consider adding a swap overload
|
||||
// to the boost namespace.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
//Put test class in namespace other
|
||||
namespace other
|
||||
{
|
||||
#include "./swap_test_class.hpp"
|
||||
}
|
||||
|
||||
//Provide swap function in namespace boost
|
||||
namespace boost
|
||||
{
|
||||
void swap(::other::swap_test_class& left, ::other::swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
}
|
||||
|
||||
//Provide swap function in namespace other
|
||||
namespace other
|
||||
{
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const other::swap_test_class initial_value1(1);
|
||||
const other::swap_test_class initial_value2(2);
|
||||
|
||||
other::swap_test_class object1 = initial_value1;
|
||||
other::swap_test_class object2 = initial_value2;
|
||||
|
||||
other::swap_test_class::reset();
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK(object1 == initial_value2);
|
||||
BOOST_CHECK(object2 == initial_value1);
|
||||
|
||||
BOOST_CHECK_EQUAL(other::swap_test_class::swap_count(),1);
|
||||
BOOST_CHECK_EQUAL(other::swap_test_class::copy_count(),0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
39
swap/test/specialized_in_global.cpp
Normal file
39
swap/test/specialized_in_global.cpp
Normal file
@@ -0,0 +1,39 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
//Put test class in the global namespace
|
||||
#include "./swap_test_class.hpp"
|
||||
|
||||
//Provide swap function in gloabl namespace
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const swap_test_class initial_value1(1);
|
||||
const swap_test_class initial_value2(2);
|
||||
|
||||
swap_test_class object1 = initial_value1;
|
||||
swap_test_class object2 = initial_value2;
|
||||
|
||||
swap_test_class::reset();
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK(object1 == initial_value2);
|
||||
BOOST_CHECK(object2 == initial_value1);
|
||||
|
||||
BOOST_CHECK_EQUAL(swap_test_class::swap_count(),1);
|
||||
BOOST_CHECK_EQUAL(swap_test_class::copy_count(),0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
45
swap/test/specialized_in_other.cpp
Normal file
45
swap/test/specialized_in_other.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
//Put test class in namespace other
|
||||
namespace other
|
||||
{
|
||||
#include "./swap_test_class.hpp"
|
||||
}
|
||||
|
||||
//Provide swap function in namespace other
|
||||
namespace other
|
||||
{
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const other::swap_test_class initial_value1(1);
|
||||
const other::swap_test_class initial_value2(2);
|
||||
|
||||
other::swap_test_class object1 = initial_value1;
|
||||
other::swap_test_class object2 = initial_value2;
|
||||
|
||||
other::swap_test_class::reset();
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK(object1 == initial_value2);
|
||||
BOOST_CHECK(object2 == initial_value1);
|
||||
|
||||
BOOST_CHECK_EQUAL(other::swap_test_class::swap_count(),1);
|
||||
BOOST_CHECK_EQUAL(other::swap_test_class::copy_count(),0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
44
swap/test/specialized_in_std.cpp
Normal file
44
swap/test/specialized_in_std.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
// Copyright (c) 2007 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
//Put test class in the global namespace
|
||||
#include "./swap_test_class.hpp"
|
||||
|
||||
|
||||
//Provide swap function in namespace std
|
||||
namespace std
|
||||
{
|
||||
template <>
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const swap_test_class initial_value1(1);
|
||||
const swap_test_class initial_value2(2);
|
||||
|
||||
swap_test_class object1 = initial_value1;
|
||||
swap_test_class object2 = initial_value2;
|
||||
|
||||
swap_test_class::reset();
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK(object1 == initial_value2);
|
||||
BOOST_CHECK(object2 == initial_value1);
|
||||
|
||||
BOOST_CHECK_EQUAL(swap_test_class::swap_count(),1);
|
||||
BOOST_CHECK_EQUAL(swap_test_class::copy_count(),0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
33
swap/test/std_bitset.cpp
Normal file
33
swap/test/std_bitset.cpp
Normal file
@@ -0,0 +1,33 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping std::bitset<T> objects by means of boost::swap.
|
||||
// Unlike most other Standard C++ Library template classes,
|
||||
// std::bitset<T> does not have its own std::swap overload.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#include <bitset>
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
typedef std::bitset<8> bitset_type;
|
||||
const bitset_type initial_value1 = 1ul;
|
||||
const bitset_type initial_value2 = 2ul;
|
||||
|
||||
bitset_type object1 = initial_value1;
|
||||
bitset_type object2 = initial_value2;
|
||||
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK_EQUAL(object1,initial_value2);
|
||||
BOOST_CHECK_EQUAL(object2,initial_value1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
32
swap/test/std_dateorder.cpp
Normal file
32
swap/test/std_dateorder.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping std::time_base::dateorder objects by means of boost::swap.
|
||||
// std::time_base::dateorder is an enumerated type. It does not have an
|
||||
// std::swap overload or template specialization.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#include <locale>
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const std::time_base::dateorder initial_value1 = std::time_base::dmy;
|
||||
const std::time_base::dateorder initial_value2 = std::time_base::mdy;
|
||||
|
||||
std::time_base::dateorder object1 = initial_value1;
|
||||
std::time_base::dateorder object2 = initial_value2;
|
||||
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK_EQUAL(object1,initial_value2);
|
||||
BOOST_CHECK_EQUAL(object2,initial_value1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
31
swap/test/std_string.cpp
Normal file
31
swap/test/std_string.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping std::string objects by means of boost::swap.
|
||||
// std::string has its own std::swap overload.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const std::string initial_value1 = "one";
|
||||
const std::string initial_value2 = "two";
|
||||
|
||||
std::string object1 = initial_value1;
|
||||
std::string object2 = initial_value2;
|
||||
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK_EQUAL(object1,initial_value2);
|
||||
BOOST_CHECK_EQUAL(object2,initial_value1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
32
swap/test/std_typeinfo_ptr.cpp
Normal file
32
swap/test/std_typeinfo_ptr.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping std::type_info pointers by means of boost::swap.
|
||||
// There is no std::swap overload or template specialization
|
||||
// for std::type_info pointers.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#include <typeinfo>
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
const std::type_info * const initial_value1 = 0;
|
||||
const std::type_info * const initial_value2 = &typeid(double);
|
||||
|
||||
const std::type_info * ptr1 = initial_value1;
|
||||
const std::type_info * ptr2 = initial_value2;
|
||||
|
||||
boost::swap(ptr1,ptr2);
|
||||
|
||||
BOOST_CHECK_EQUAL(ptr1,initial_value2);
|
||||
BOOST_CHECK_EQUAL(ptr2,initial_value1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
60
swap/test/std_vector_of_boost.cpp
Normal file
60
swap/test/std_vector_of_boost.cpp
Normal file
@@ -0,0 +1,60 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping std::vector objects by means of boost::swap,
|
||||
// having boost::swap_test_class as vector element type.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#include <vector>
|
||||
|
||||
//Put test class in namespace boost
|
||||
namespace boost
|
||||
{
|
||||
#include "./swap_test_class.hpp"
|
||||
}
|
||||
|
||||
//Provide swap function in namespace boost
|
||||
namespace boost
|
||||
{
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
typedef boost::swap_test_class swap_test_class_type;
|
||||
typedef std::vector<swap_test_class_type> vector_type;
|
||||
|
||||
const vector_type::size_type initial_size1 = 1;
|
||||
const vector_type::size_type initial_size2 = 2;
|
||||
|
||||
const vector_type initial_value1(initial_size1, swap_test_class_type(1));
|
||||
const vector_type initial_value2(initial_size2, swap_test_class_type(2));
|
||||
|
||||
vector_type object1 = initial_value1;
|
||||
vector_type object2 = initial_value2;
|
||||
|
||||
swap_test_class_type::reset();
|
||||
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK_EQUAL(object1.size(),initial_size2);
|
||||
BOOST_CHECK_EQUAL(object2.size(),initial_size1);
|
||||
|
||||
BOOST_CHECK(object1 == initial_value2);
|
||||
BOOST_CHECK(object2 == initial_value1);
|
||||
|
||||
BOOST_CHECK_EQUAL(swap_test_class_type::swap_count(),0);
|
||||
BOOST_CHECK_EQUAL(swap_test_class_type::copy_count(),0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
53
swap/test/std_vector_of_global.cpp
Normal file
53
swap/test/std_vector_of_global.cpp
Normal file
@@ -0,0 +1,53 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping std::vector objects by means of boost::swap,
|
||||
// having ::swap_test_class as vector element type.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#include <vector>
|
||||
|
||||
//Put test class in the global namespace
|
||||
#include "./swap_test_class.hpp"
|
||||
|
||||
//Provide swap function in the global namespace
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
typedef std::vector<swap_test_class> vector_type;
|
||||
|
||||
const vector_type::size_type initial_size1 = 1;
|
||||
const vector_type::size_type initial_size2 = 2;
|
||||
|
||||
const vector_type initial_value1(initial_size1, swap_test_class(1));
|
||||
const vector_type initial_value2(initial_size2, swap_test_class(2));
|
||||
|
||||
vector_type object1 = initial_value1;
|
||||
vector_type object2 = initial_value2;
|
||||
|
||||
swap_test_class::reset();
|
||||
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK_EQUAL(object1.size(),initial_size2);
|
||||
BOOST_CHECK_EQUAL(object2.size(),initial_size1);
|
||||
|
||||
BOOST_CHECK(object1 == initial_value2);
|
||||
BOOST_CHECK(object2 == initial_value1);
|
||||
|
||||
BOOST_CHECK_EQUAL(swap_test_class::swap_count(),0);
|
||||
BOOST_CHECK_EQUAL(swap_test_class::copy_count(),0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
60
swap/test/std_vector_of_other.cpp
Normal file
60
swap/test/std_vector_of_other.cpp
Normal file
@@ -0,0 +1,60 @@
|
||||
// Copyright (c) 2008 Joseph Gauterin, Niels Dekker
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests swapping std::vector objects by means of boost::swap,
|
||||
// having other::swap_test_class as vector element type.
|
||||
|
||||
#include <boost/utility/swap.hpp>
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
|
||||
#include <vector>
|
||||
|
||||
//Put test class in namespace other
|
||||
namespace other
|
||||
{
|
||||
#include "./swap_test_class.hpp"
|
||||
}
|
||||
|
||||
//Provide swap function in namespace other
|
||||
namespace other
|
||||
{
|
||||
void swap(swap_test_class& left, swap_test_class& right)
|
||||
{
|
||||
left.swap(right);
|
||||
}
|
||||
}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
typedef other::swap_test_class swap_test_class_type;
|
||||
typedef std::vector<swap_test_class_type> vector_type;
|
||||
|
||||
const vector_type::size_type initial_size1 = 1;
|
||||
const vector_type::size_type initial_size2 = 2;
|
||||
|
||||
const vector_type initial_value1(initial_size1, swap_test_class_type(1));
|
||||
const vector_type initial_value2(initial_size2, swap_test_class_type(2));
|
||||
|
||||
vector_type object1 = initial_value1;
|
||||
vector_type object2 = initial_value2;
|
||||
|
||||
swap_test_class_type::reset();
|
||||
|
||||
boost::swap(object1,object2);
|
||||
|
||||
BOOST_CHECK_EQUAL(object1.size(),initial_size2);
|
||||
BOOST_CHECK_EQUAL(object2.size(),initial_size1);
|
||||
|
||||
BOOST_CHECK(object1 == initial_value2);
|
||||
BOOST_CHECK(object2 == initial_value1);
|
||||
|
||||
BOOST_CHECK_EQUAL(swap_test_class_type::swap_count(),0);
|
||||
BOOST_CHECK_EQUAL(swap_test_class_type::copy_count(),0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
114
swap/test/swap_test_class.hpp
Normal file
114
swap/test/swap_test_class.hpp
Normal file
@@ -0,0 +1,114 @@
|
||||
// Copyright (c) 2007-2008 Joseph Gauterin
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// Tests class used by the Boost.Swap tests
|
||||
|
||||
#ifndef BOOST_UTILITY_SWAP_TEST_CLASS_HPP
|
||||
#define BOOST_UTILITY_SWAP_TEST_CLASS_HPP
|
||||
|
||||
|
||||
class swap_test_class
|
||||
{
|
||||
int m_data;
|
||||
public:
|
||||
explicit swap_test_class(int arg = 0)
|
||||
:
|
||||
m_data(arg)
|
||||
{
|
||||
++constructCount();
|
||||
}
|
||||
|
||||
~swap_test_class()
|
||||
{
|
||||
++destructCount();
|
||||
}
|
||||
|
||||
swap_test_class(const swap_test_class& arg)
|
||||
:
|
||||
m_data(arg.m_data)
|
||||
{
|
||||
++copyCount();
|
||||
++destructCount();
|
||||
}
|
||||
|
||||
swap_test_class& operator=(const swap_test_class& arg)
|
||||
{
|
||||
m_data = arg.m_data;
|
||||
++copyCount();
|
||||
return *this;
|
||||
}
|
||||
|
||||
void swap(swap_test_class& other)
|
||||
{
|
||||
const int temp = m_data;
|
||||
m_data = other.m_data;
|
||||
other.m_data = temp;
|
||||
|
||||
++swapCount();
|
||||
}
|
||||
|
||||
int get_data() const
|
||||
{
|
||||
return m_data;
|
||||
}
|
||||
|
||||
void set_data(int arg)
|
||||
{
|
||||
m_data = arg;
|
||||
}
|
||||
|
||||
static unsigned int swap_count(){ return swapCount(); }
|
||||
static unsigned int copy_count(){ return copyCount(); }
|
||||
static unsigned int construct_count(){ return constructCount(); }
|
||||
static unsigned int destruct_count(){ return destructCount(); }
|
||||
|
||||
static void reset()
|
||||
{
|
||||
swapCount() = 0;
|
||||
copyCount() = 0;
|
||||
constructCount() = 0;
|
||||
destructCount() = 0;
|
||||
}
|
||||
|
||||
private:
|
||||
static unsigned int& swapCount()
|
||||
{
|
||||
static unsigned int value = 0;
|
||||
return value;
|
||||
}
|
||||
|
||||
static unsigned int& copyCount()
|
||||
{
|
||||
static unsigned int value = 0;
|
||||
return value;
|
||||
}
|
||||
|
||||
static unsigned int& constructCount()
|
||||
{
|
||||
static unsigned int value = 0;
|
||||
return value;
|
||||
}
|
||||
|
||||
static unsigned int& destructCount()
|
||||
{
|
||||
static unsigned int value = 0;
|
||||
return value;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
inline bool operator==(const swap_test_class & lhs, const swap_test_class & rhs)
|
||||
{
|
||||
return lhs.get_data() == rhs.get_data();
|
||||
}
|
||||
|
||||
inline bool operator!=(const swap_test_class & lhs, const swap_test_class & rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
#endif
|
38
test/CMakeLists.txt
Normal file
38
test/CMakeLists.txt
Normal file
@@ -0,0 +1,38 @@
|
||||
boost_additional_test_dependencies(utility BOOST_DEPENDS test)
|
||||
|
||||
boost_test_run(addressof_test ../addressof_test.cpp)
|
||||
boost_test_run(assert_test ../assert_test.cpp)
|
||||
boost_test_run(base_from_member_test ../base_from_member_test.cpp)
|
||||
boost_test_run(binary_search_test ../binary_search_test.cpp)
|
||||
boost_test_run(call_traits_test ../call_traits_test.cpp ARGS -u)
|
||||
boost_test_compile_fail(checked_delete_test ../checked_delete_test.cpp)
|
||||
boost_test_run(compressed_pair_test
|
||||
../compressed_pair_test
|
||||
DEPENDS boost_test_exec_monitor)
|
||||
boost_test_run(current_function_test ../current_function_test.cpp)
|
||||
boost_test_run(iterators_test
|
||||
../iterators_test.cpp
|
||||
DEPENDS boost_test_exec_monitor)
|
||||
boost_test_run(next_prior_test DEPENDS boost_test_exec_monitor)
|
||||
boost_test_compile_fail(noncopyable_test ../noncopyable_test.cpp)
|
||||
boost_test_run(numeric_traits_test ../numeric_traits_test.cpp)
|
||||
if (${CMAKE_SYSTEM} MATCHES "FreeBSD-.*")
|
||||
boost_test_compile_fail("operators_test_compilerbug")
|
||||
elseif(${CMAKE_SYSTEM} MATCHES "FreeBSD-.*")
|
||||
boost_test_run(operators_test
|
||||
../operators_test.cpp
|
||||
DEPENDS boost_test_exec_monitor)
|
||||
endif(${CMAKE_SYSTEM} MATCHES "FreeBSD-.*")
|
||||
boost_test_compile(ref_ct_test ../ref_ct_test.cpp)
|
||||
boost_test_run(ref_test
|
||||
../ref_test.cpp
|
||||
DEPENDS boost_test_exec_monitor)
|
||||
boost_test_compile(result_of_test)
|
||||
boost_test_run(shared_iterator_test ../shared_iterator_test.cpp)
|
||||
boost_test_run(value_init_test ../value_init_test.cpp)
|
||||
boost_test_compile_fail(value_init_test_fail1
|
||||
../value_init_test_fail1.cpp)
|
||||
boost_test_compile_fail(value_init_test_fail2
|
||||
../value_init_test_fail2.cpp)
|
||||
boost_test_compile_fail(value_init_test_fail3
|
||||
../value_init_test_fail3.cpp)
|
0
test/next_prior_test.cpp
Executable file → Normal file
0
test/next_prior_test.cpp
Executable file → Normal file
@@ -1,58 +1,15 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<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"><A href="../../index.htm"> <img src="../../boost.png" alt="boost.png (6897 bytes)" width="277" height="86" border="0"></A>
|
||||
</td>
|
||||
<td align="center">
|
||||
<h1>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. Distributed under the Boost Software License, Version
|
||||
1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A> or
|
||||
copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
|
||||
</body>
|
||||
<head>
|
||||
<meta http-equiv=refresh content="0; URL=../exception/doc/throw_exception.html">
|
||||
<title>Automatic redirection</title>
|
||||
</head>
|
||||
<body>
|
||||
Automatic redirection failed, please go to
|
||||
<a href="../exception/doc/throw_exception.html">throw_exception.html</a>. <hr>
|
||||
<p><EFBFBD> Copyright Beman Dawes, 2001</p>
|
||||
<p>Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy
|
||||
at <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>)</p>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -253,7 +253,7 @@ its internal data, prior to constructing the object that it contains.
|
||||
|
||||
<h2><a name="val_init"><code>template class value_initialized<T></code></a></h2>
|
||||
|
||||
<pre>namespace boost {<br><br>template<class T><br>class value_initialized<br>{<br> public :<br> value_initialized() : x() {}<br> operator T&() const { return x ; }<br> T& data() const { return x ; }<br><br> private :<br> <i>unspecified</i> x ;<br>} ;<br><br>template<class T><br>T const& get ( value_initialized<T> const& x )<br>{<br> return x.data() ;<br>}<br><br>template<class T><br>T& get ( value_initialized<T>& x )<br>{<br> return x.data() ;<br>}<br><br>} // namespace boost<br></pre>
|
||||
<pre>namespace boost {<br><br>template<class T><br>class value_initialized<br>{<br> public :<br> value_initialized() : x() {}<br> operator T&() const { return x ; }<br> T& data() const { return x ; }<br> void swap( value_initialized<T>& );<br><br> private :<br> <i>unspecified</i> x ;<br>} ;<br><br>template<class T><br>T const& get ( value_initialized<T> const& x )<br>{<br> return x.data() ;<br>}<br><br>template<class T><br>T& get ( value_initialized<T>& x )<br>{<br> return x.data() ;<br>}<br><br>} // namespace boost<br></pre>
|
||||
|
||||
<p>An object of this template class is a <code>T</code>-wrapper convertible
|
||||
to <code>'T&'</code> whose wrapped object (data member of type <code>T</code>)
|
||||
@@ -276,6 +276,10 @@ non-member function <code>get()</code>: </p>
|
||||
<p>Both <code>const</code> and non-<code>const</code> objects can be wrapped.
|
||||
Mutable objects can be modified directly from within the wrapper but constant
|
||||
objects cannot:</p>
|
||||
|
||||
<p>When <code>T</code> is a <em>Swappable</em> type, <code>value_initialized<T></code>
|
||||
is swappable as well, by calling its <code>swap</code> member function
|
||||
as well as by calling <code>boost::swap</code>.</p>
|
||||
|
||||
<pre>value_initialized<int> x ; <br>static_cast<int&>(x) = 1 ; // OK<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> y ; <br>static_cast<int&>(y) = 1 ; // ERROR: cannot cast to int&<br>static_cast<int const&>(y) = 1 ; // ERROR: cannot modify a const value<br>get(y) = 1 ; // ERROR: cannot modify a const value</pre>
|
||||
|
||||
@@ -311,7 +315,7 @@ wrapped object from within a constant wrapper can be avoided if access to
|
||||
the wrapped object is always performed with the <code>get()</code> idiom:</p>
|
||||
|
||||
<pre>value_initialized<int> x ;<br>get(x) = 1 ; // OK<br><br>value_initialized<int const> cx ;<br>get(x) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int> const x_c ;<br>get(x_c) = 1 ; // ERROR: Cannot modify a const object<br><br>value_initialized<int const> const cx_c ;<br>get(cx_c) = 1 ; // ERROR: Cannot modify a const object<br></pre>
|
||||
|
||||
|
||||
<h2><a name="initialized_value"><code>initialized_value</code></a></h2>
|
||||
|
||||
<pre>
|
||||
@@ -379,7 +383,7 @@ for Boost release version 1.35 (2008), offering a workaround to various compiler
|
||||
</p>
|
||||
|
||||
<hr>
|
||||
<p>Revised 23 May 2008</p>
|
||||
<p>Revised 28 August 2008</p>
|
||||
|
||||
<p>© Copyright Fernando Cacciola, 2002, 2008.</p>
|
||||
|
||||
@@ -390,4 +394,4 @@ for Boost release version 1.35 (2008), offering a workaround to various compiler
|
||||
<br>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
@@ -9,6 +9,7 @@
|
||||
// 21 Ago 2002 (Created) Fernando Cacciola
|
||||
// 15 Jan 2008 (Added tests regarding compiler issues) Fernando Cacciola, Niels Dekker
|
||||
// 23 May 2008 (Added tests regarding initialized_value) Niels Dekker
|
||||
// 21 Ago 2008 (Added swap test) Niels Dekker
|
||||
|
||||
#include <cstring> // For memcmp.
|
||||
#include <iostream>
|
||||
@@ -181,6 +182,35 @@ struct CopyFunctionCallTester
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// A struct that allows testing whether its customized swap function is called.
|
||||
//
|
||||
struct SwapFunctionCallTester
|
||||
{
|
||||
bool is_custom_swap_called;
|
||||
int data;
|
||||
|
||||
SwapFunctionCallTester()
|
||||
: is_custom_swap_called(false), data(0) {}
|
||||
|
||||
SwapFunctionCallTester(const SwapFunctionCallTester & arg)
|
||||
: is_custom_swap_called(false), data(arg.data) {}
|
||||
|
||||
void swap(SwapFunctionCallTester & arg)
|
||||
{
|
||||
std::swap(data, arg.data);
|
||||
is_custom_swap_called = true;
|
||||
arg.is_custom_swap_called = true;
|
||||
}
|
||||
};
|
||||
|
||||
void swap(SwapFunctionCallTester & lhs, SwapFunctionCallTester & rhs)
|
||||
{
|
||||
lhs.swap(rhs);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<class T>
|
||||
void check_initialized_value ( T const& y )
|
||||
{
|
||||
@@ -196,7 +226,7 @@ void check_initialized_value( NonPOD const& )
|
||||
// and this type (NonPOD), because the following statement
|
||||
// won't compile on this particular compiler version:
|
||||
// NonPOD initializedValue = boost::initialized_value() ;
|
||||
//
|
||||
//
|
||||
// This is caused by a compiler bug, that is fixed with a newer version
|
||||
// of the Borland compiler. The Release Notes for Delphi(R) 2007 for
|
||||
// Win32(R) and C++Builder(R) 2007 (http://dn.codegear.com/article/36575)
|
||||
@@ -323,9 +353,20 @@ int test_main(int, char **)
|
||||
BOOST_CHECK ( ! get(copyFunctionCallTester3).is_copy_constructed);
|
||||
BOOST_CHECK ( get(copyFunctionCallTester3).is_assignment_called);
|
||||
|
||||
boost::value_initialized<SwapFunctionCallTester> swapFunctionCallTester1;
|
||||
boost::value_initialized<SwapFunctionCallTester> swapFunctionCallTester2;
|
||||
get(swapFunctionCallTester1).data = 1;
|
||||
get(swapFunctionCallTester2).data = 2;
|
||||
boost::swap(swapFunctionCallTester1, swapFunctionCallTester2);
|
||||
BOOST_CHECK( get(swapFunctionCallTester1).data == 2 );
|
||||
BOOST_CHECK( get(swapFunctionCallTester2).data == 1 );
|
||||
BOOST_CHECK( get(swapFunctionCallTester1).is_custom_swap_called );
|
||||
BOOST_CHECK( get(swapFunctionCallTester2).is_custom_swap_called );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
unsigned int expected_failures = 0;
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user