summaryrefslogtreecommitdiff
path: root/libs/scope_exit/test/native_tpl.cpp
blob: 58f41f3645d6bd8c668a5935293400b53a8af7f9 (plain)
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;
}