#include <boost/config.hpp>

//
//  bind_fwd_test.cpp - forwarding test
//
//  Copyright (c) 2015 Peter Dimov
//
//  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/bind/bind.hpp>
#include <boost/core/lightweight_test.hpp>

using namespace boost::placeholders;

//

void fv1( int & a )
{
    a = 1;
}

void fv2( int & a, int & b )
{
    a = 1;
    b = 2;
}

void fv3( int & a, int & b, int & c )
{
    a = 1;
    b = 2;
    c = 3;
}

void fv4( int & a, int & b, int & c, int & d )
{
    a = 1;
    b = 2;
    c = 3;
    d = 4;
}

void fv5( int & a, int & b, int & c, int & d, int & e )
{
    a = 1;
    b = 2;
    c = 3;
    d = 4;
    e = 5;
}

void fv6( int & a, int & b, int & c, int & d, int & e, int & f )
{
    a = 1;
    b = 2;
    c = 3;
    d = 4;
    e = 5;
    f = 6;
}

void fv7( int & a, int & b, int & c, int & d, int & e, int & f, int & g )
{
    a = 1;
    b = 2;
    c = 3;
    d = 4;
    e = 5;
    f = 6;
    g = 7;
}

void fv8( int & a, int & b, int & c, int & d, int & e, int & f, int & g, int & h )
{
    a = 1;
    b = 2;
    c = 3;
    d = 4;
    e = 5;
    f = 6;
    g = 7;
    h = 8;
}

void fv9( int & a, int & b, int & c, int & d, int & e, int & f, int & g, int & h, int & i )
{
    a = 1;
    b = 2;
    c = 3;
    d = 4;
    e = 5;
    f = 6;
    g = 7;
    h = 8;
    i = 9;
}

void test()
{
    {
        int a = 0;

        boost::bind( fv1, _1 )( a );

        BOOST_TEST( a == 1 );
    }

    {
        int a = 0;
        int b = 0;

        boost::bind( fv2, _1, _2 )( a, b );

        BOOST_TEST( a == 1 );
        BOOST_TEST( b == 2 );
    }

    {
        int a = 0;
        int b = 0;
        int c = 0;

        boost::bind( fv3, _1, _2, _3 )( a, b, c );

        BOOST_TEST( a == 1 );
        BOOST_TEST( b == 2 );
        BOOST_TEST( c == 3 );
    }

    {
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;

        boost::bind( fv4, _1, _2, _3, _4 )( a, b, c, d );

        BOOST_TEST( a == 1 );
        BOOST_TEST( b == 2 );
        BOOST_TEST( c == 3 );
        BOOST_TEST( d == 4 );
    }

    {
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        int e = 0;

        boost::bind( fv5, _1, _2, _3, _4, _5 )( a, b, c, d, e );

        BOOST_TEST( a == 1 );
        BOOST_TEST( b == 2 );
        BOOST_TEST( c == 3 );
        BOOST_TEST( d == 4 );
        BOOST_TEST( e == 5 );
    }

    {
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        int e = 0;
        int f = 0;

        boost::bind( fv6, _1, _2, _3, _4, _5, _6 )( a, b, c, d, e, f );

        BOOST_TEST( a == 1 );
        BOOST_TEST( b == 2 );
        BOOST_TEST( c == 3 );
        BOOST_TEST( d == 4 );
        BOOST_TEST( e == 5 );
        BOOST_TEST( f == 6 );
    }

    {
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        int e = 0;
        int f = 0;
        int g = 0;

        boost::bind( fv7, _1, _2, _3, _4, _5, _6, _7 )( a, b, c, d, e, f, g );

        BOOST_TEST( a == 1 );
        BOOST_TEST( b == 2 );
        BOOST_TEST( c == 3 );
        BOOST_TEST( d == 4 );
        BOOST_TEST( e == 5 );
        BOOST_TEST( f == 6 );
        BOOST_TEST( g == 7 );
    }

    {
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        int e = 0;
        int f = 0;
        int g = 0;
        int h = 0;

        boost::bind( fv8, _1, _2, _3, _4, _5, _6, _7, _8 )( a, b, c, d, e, f, g, h );

        BOOST_TEST( a == 1 );
        BOOST_TEST( b == 2 );
        BOOST_TEST( c == 3 );
        BOOST_TEST( d == 4 );
        BOOST_TEST( e == 5 );
        BOOST_TEST( f == 6 );
        BOOST_TEST( g == 7 );
        BOOST_TEST( h == 8 );
    }

    {
        int a = 0;
        int b = 0;
        int c = 0;
        int d = 0;
        int e = 0;
        int f = 0;
        int g = 0;
        int h = 0;
        int i = 0;

        boost::bind( fv9, _1, _2, _3, _4, _5, _6, _7, _8, _9 )( a, b, c, d, e, f, g, h, i );

        BOOST_TEST( a == 1 );
        BOOST_TEST( b == 2 );
        BOOST_TEST( c == 3 );
        BOOST_TEST( d == 4 );
        BOOST_TEST( e == 5 );
        BOOST_TEST( f == 6 );
        BOOST_TEST( g == 7 );
        BOOST_TEST( h == 8 );
        BOOST_TEST( i == 9 );
    }
}

int main()
{
    test();
    return boost::report_errors();
}
