File: native_tpl.cpp

package info (click to toggle)
boost1.42 1.42.0-4
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 277,864 kB
  • ctags: 401,076
  • sloc: cpp: 1,235,659; xml: 74,142; ansic: 41,313; python: 26,756; sh: 11,840; cs: 2,118; makefile: 655; perl: 494; yacc: 456; asm: 353; csh: 6
file content (87 lines) | stat: -rw-r--r-- 1,990 bytes parent folder | download | duplicates (2)
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;
}