1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
// Copyright Alexander Nasonov 2007-2008
//
// 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 <iostream>
#include <ostream>
#include <vector>
#include <boost/scope_exit.hpp>
#include <boost/rational.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/typeof/std/vector.hpp>
#include <boost/test/unit_test.hpp>
using namespace boost::unit_test;
template<class type>
void tpl_long( type tval
, type& t
, type const& tc
, type volatile& tv
, type const volatile& tcv
)
{
int i = 0; // non-dependent name
type const remember(tval);
{
BOOST_SCOPE_EXIT_TPL( (&tval)(&t)(&tc)(&tv)(&tcv)(&i) )
{
tval = 1;
++t;
++tv;
}
BOOST_SCOPE_EXIT_END
BOOST_CHECK(t == remember);
BOOST_CHECK(tval == remember);
}
BOOST_CHECK(tval == 1);
BOOST_CHECK(t == remember + 2);
}
template<class Vector, int Value>
void tpl_vector( Vector vval
, Vector& v
, Vector const& vc
)
{
Vector const remember(vval);
{
BOOST_SCOPE_EXIT_TPL( (&vval)(&v)(&vc) )
{
v.push_back(-Value);
vval.push_back(Value);
}
BOOST_SCOPE_EXIT_END
BOOST_CHECK(v.size() == remember.size());
BOOST_CHECK(vval.size() == remember.size());
}
BOOST_CHECK(v.size() == 1 + remember.size());
BOOST_CHECK(vval.size() == 1 + remember.size());
}
void test_tpl()
{
long l = 137;
tpl_long(l, l, l, l, l);
std::vector<int> v(10, 137);
tpl_vector<std::vector<int>, 13>(v, v, v);
}
test_suite* init_unit_test_suite( int, char* [] )
{
framework::master_test_suite().p_name.value = "Unit test for ScopeExit TPL";
framework::master_test_suite().add( BOOST_TEST_CASE( &test_tpl ));
return 0;
}
|