
// Copyright Aleksey Gurtovoy 2003-2007
// Copyright David Abrahams 2003-2004
//
// 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)
//
// See http://www.boost.org/libs/mpl for documentation.

// $Id: set.cpp 49268 2008-10-11 06:26:17Z agurtovoy $
// $Date: 2008-10-11 02:26:17 -0400 (Sat, 11 Oct 2008) $
// $Revision: 49268 $

#include <boost/mpl/set.hpp>
#include <boost/mpl/contains.hpp>
#include <boost/mpl/find.hpp>
#include <boost/mpl/deref.hpp>
#include <boost/mpl/next.hpp>
#include <boost/mpl/insert.hpp>
#include <boost/mpl/erase.hpp>
#include <boost/mpl/erase_key.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/clear.hpp>
#include <boost/mpl/has_key.hpp>
#include <boost/mpl/order.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/distance.hpp>
#include <boost/mpl/empty.hpp>
#include <boost/mpl/begin_end.hpp>

#include <boost/mpl/aux_/test.hpp>


// Use templates for testing so that GCC will show us the actual types involved

template< typename s >
void empty_set_test()
{
    MPL_ASSERT_RELATION( size<s>::value, ==, 0 );
    MPL_ASSERT(( empty<s> ));
    
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME clear<s>::type, set0<> > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,int>::type, void_ > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,char>::type, void_ > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,long>::type, void_ > ));

    MPL_ASSERT_NOT(( has_key<s,int> ));
    MPL_ASSERT_NOT(( has_key<s,char> ));
    MPL_ASSERT_NOT(( has_key<s,long> ));

    typedef BOOST_DEDUCED_TYPENAME order<s,int>::type o1;
    typedef BOOST_DEDUCED_TYPENAME order<s,char>::type o2;
    typedef BOOST_DEDUCED_TYPENAME order<s,long>::type o3;
    MPL_ASSERT(( is_same< o1, void_ > ));
    MPL_ASSERT(( is_same< o2, void_ > ));
    MPL_ASSERT(( is_same< o3, void_ > ));
    
    typedef BOOST_DEDUCED_TYPENAME begin<s>::type first;
    typedef BOOST_DEDUCED_TYPENAME end<s>::type last;

    MPL_ASSERT(( is_same<first, last> ));
    MPL_ASSERT_RELATION( (distance<first, last>::value), ==, 0 );
}


template< typename s >
void int_set_test()
{
    MPL_ASSERT_RELATION( size<s>::value, ==, 1 );
    MPL_ASSERT_NOT(( empty<s> ));
    
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME clear<s>::type, set0<> > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,int>::type, int > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,char>::type, void_ > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,long>::type, void_ > ));

    MPL_ASSERT(( has_key<s,int> ));
    MPL_ASSERT_NOT(( has_key<s,char> ));
    MPL_ASSERT_NOT(( has_key<s,long> ));

    typedef BOOST_DEDUCED_TYPENAME order<s,int>::type o1;
    typedef BOOST_DEDUCED_TYPENAME order<s,char>::type o2;
    typedef BOOST_DEDUCED_TYPENAME order<s,long>::type o3;
    MPL_ASSERT_NOT(( is_same< o1, void_ > ));
    MPL_ASSERT(( is_same< o2, void_ > ));
    MPL_ASSERT(( is_same< o3, void_ > ));
    
    typedef BOOST_DEDUCED_TYPENAME begin<s>::type first;
    typedef BOOST_DEDUCED_TYPENAME end<s>::type last;

    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME deref<first>::type, int > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME next<first>::type, last > ));

    MPL_ASSERT_RELATION( (distance<first, last>::value), ==, 1 );
    MPL_ASSERT(( contains< s, int > ));
}


template< typename s >
void int_char_set_test()
{
    MPL_ASSERT_RELATION( size<s>::value, ==, 2 );
    MPL_ASSERT_NOT(( empty<s> ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME clear<s>::type, set0<> > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,int>::type, int > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,char>::type, char > ));

    MPL_ASSERT(( has_key<s,char> ));
    MPL_ASSERT_NOT(( has_key<s,long> ));

    typedef BOOST_DEDUCED_TYPENAME order<s,int>::type o1;
    typedef BOOST_DEDUCED_TYPENAME order<s,char>::type o2;
    typedef BOOST_DEDUCED_TYPENAME order<s,long>::type o3;
    MPL_ASSERT_NOT(( is_same< o1, void_ > ));
    MPL_ASSERT_NOT(( is_same< o2, void_ > ));
    MPL_ASSERT(( is_same< o3, void_ > ));
    MPL_ASSERT_NOT(( is_same< o1, o2 > ));

    typedef BOOST_DEDUCED_TYPENAME begin<s>::type first;
    typedef BOOST_DEDUCED_TYPENAME end<s>::type last;

    MPL_ASSERT_RELATION( (distance<first, last>::value), ==, 2 );

    MPL_ASSERT(( contains< s, int > ));
    MPL_ASSERT(( contains< s, char > ));
}

template< typename s >
void int_char_long_set_test()
{
    MPL_ASSERT_RELATION( size<s>::value, ==, 3 );
    MPL_ASSERT_NOT(( empty<s> ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME clear<s>::type, set0<> > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,int>::type, int > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,char>::type, char > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME at<s,long>::type, long > ));

    MPL_ASSERT(( has_key<s,long> ));
    MPL_ASSERT(( has_key<s,int> ));
    MPL_ASSERT(( has_key<s,char> ));

    typedef BOOST_DEDUCED_TYPENAME order<s,int>::type o1;
    typedef BOOST_DEDUCED_TYPENAME order<s,char>::type o2;
    typedef BOOST_DEDUCED_TYPENAME order<s,long>::type o3;
    MPL_ASSERT_NOT(( is_same< o1, void_ > ));
    MPL_ASSERT_NOT(( is_same< o2, void_ > ));
    MPL_ASSERT_NOT(( is_same< o3, void_ > ));
    MPL_ASSERT_NOT(( is_same< o1, o2 > ));
    MPL_ASSERT_NOT(( is_same< o1, o3 > ));
    MPL_ASSERT_NOT(( is_same< o2, o3 > ));

    typedef BOOST_DEDUCED_TYPENAME begin<s>::type first;
    typedef BOOST_DEDUCED_TYPENAME end<s>::type last;
    MPL_ASSERT_RELATION( (distance<first, last>::value), ==, 3 );

    MPL_ASSERT(( contains< s, int > ));
    MPL_ASSERT(( contains< s, char > ));
    MPL_ASSERT(( contains< s, long > ));
}

template< typename S0, typename S1, typename S2, typename S3 >
void basic_set_test()
{
    empty_set_test<S0>();
    empty_set_test< BOOST_DEDUCED_TYPENAME erase_key<S1,int>::type  >();
    empty_set_test< BOOST_DEDUCED_TYPENAME erase_key< 
          BOOST_DEDUCED_TYPENAME erase_key<S2,char>::type
        , int
        >::type >();

    empty_set_test< BOOST_DEDUCED_TYPENAME erase_key<
          BOOST_DEDUCED_TYPENAME erase_key<
               BOOST_DEDUCED_TYPENAME erase_key<S3,char>::type
              , long
              >::type
        , int
        >::type >();


    int_set_test<S1>();
    int_set_test< BOOST_DEDUCED_TYPENAME insert<S0,int>::type >();

    int_set_test< BOOST_DEDUCED_TYPENAME erase_key<S2,char>::type >();
    int_set_test< BOOST_DEDUCED_TYPENAME erase_key< 
          BOOST_DEDUCED_TYPENAME erase_key<S3,char>::type
        , long
        >::type >();    

    int_char_set_test<S2>();
    int_char_set_test< BOOST_DEDUCED_TYPENAME insert<
          BOOST_DEDUCED_TYPENAME insert<S0,char>::type  
        , int
        >::type >();

    int_char_set_test< BOOST_DEDUCED_TYPENAME insert<S1,char>::type  >();
    int_char_set_test< BOOST_DEDUCED_TYPENAME erase_key<S3,long>::type >();

    int_char_long_set_test<S3>();
    int_char_long_set_test< BOOST_DEDUCED_TYPENAME insert<
          BOOST_DEDUCED_TYPENAME insert<
               BOOST_DEDUCED_TYPENAME insert<S0,char>::type
              , long
              >::type
        , int
        >::type >();

    int_char_long_set_test< BOOST_DEDUCED_TYPENAME insert<          
          BOOST_DEDUCED_TYPENAME insert<S1,long>::type
        , char
        >::type >();

    int_char_long_set_test< BOOST_DEDUCED_TYPENAME insert<S2,long>::type  >();
}


template< typename S1, typename S2 >
void numbered_vs_variadic_set_test()
{
    MPL_ASSERT(( is_same< S1, BOOST_DEDUCED_TYPENAME S1::type > ));
    MPL_ASSERT(( is_same< BOOST_DEDUCED_TYPENAME S2::type, S1 > ));
}


MPL_TEST_CASE()
{
    typedef mpl::set0<> s01;
    typedef mpl::set<>  s02;
    typedef mpl::set1<int> s11;
    typedef mpl::set<int>  s12;
    typedef mpl::set2<int,char> s21;
    typedef mpl::set<int,char>  s22;
    typedef mpl::set<char,int>  s23;
    typedef mpl::set3<int,char,long> s31;
    typedef mpl::set<int,char,long>  s32;
    typedef mpl::set<int,long,char>  s33;
    typedef mpl::set<long,char,int>  s34;

    numbered_vs_variadic_set_test<s01,s02>();
    numbered_vs_variadic_set_test<s11,s12>();
    numbered_vs_variadic_set_test<s21,s22>();
    numbered_vs_variadic_set_test<s31,s32>();

    basic_set_test<s01,s11,s21,s31>();
    basic_set_test<s02,s12,s22,s32>();
    basic_set_test<s01,s11,s23,s31>();
    basic_set_test<s01,s11,s23,s33>();
    basic_set_test<s01,s11,s23,s34>();
}


template< typename s >
void empty_set_types_variety_test()
{
    MPL_ASSERT_NOT(( has_key<s,char> ));
    MPL_ASSERT_NOT(( has_key<s,int> ));
    MPL_ASSERT_NOT(( has_key<s,UDT> ));
    MPL_ASSERT_NOT(( has_key<s,incomplete> ));

    MPL_ASSERT_NOT(( has_key<s,char const> ));
    MPL_ASSERT_NOT(( has_key<s,int const> ));
    MPL_ASSERT_NOT(( has_key<s,UDT const> ));
    MPL_ASSERT_NOT(( has_key<s,incomplete const> ));

    MPL_ASSERT_NOT(( has_key<s,int*> ));
    MPL_ASSERT_NOT(( has_key<s,UDT*> ));
    MPL_ASSERT_NOT(( has_key<s,incomplete*> ));

    MPL_ASSERT_NOT(( has_key<s,int&> ));
    MPL_ASSERT_NOT(( has_key<s,UDT&> ));
    MPL_ASSERT_NOT(( has_key<s,incomplete&> ));
}

template< typename s >
void set_types_variety_test()
{
    MPL_ASSERT_RELATION( size<s>::value, ==, 8 );

    MPL_ASSERT(( has_key<s,char> ));
    MPL_ASSERT(( has_key<s,int const> ));
    MPL_ASSERT(( has_key<s,long*> ));
    MPL_ASSERT(( has_key<s,UDT* const> ));
    MPL_ASSERT(( has_key<s,incomplete> ));
    MPL_ASSERT(( has_key<s,abstract> ));
    MPL_ASSERT(( has_key<s,incomplete volatile&> ));
    MPL_ASSERT(( has_key<s,abstract const&> ));

    MPL_ASSERT_NOT(( has_key<s,char const> ));
    MPL_ASSERT_NOT(( has_key<s,int> ));
    MPL_ASSERT_NOT(( has_key<s,long* const> ));
    MPL_ASSERT_NOT(( has_key<s,UDT*> ));
    MPL_ASSERT_NOT(( has_key<s,incomplete const> ));
    MPL_ASSERT_NOT(( has_key<s,abstract volatile> ));
    MPL_ASSERT_NOT(( has_key<s,incomplete&> ));
    MPL_ASSERT_NOT(( has_key<s,abstract&> ));
}


MPL_TEST_CASE()
{
    empty_set_types_variety_test< set<> >();
    empty_set_types_variety_test< set<>::type >();

    typedef set<
          char,int const,long*,UDT* const,incomplete,abstract
        , incomplete volatile&,abstract const&
        > s;

    set_types_variety_test<s>();
    set_types_variety_test<s::type>();
}


template <class S>
void find_test()
{
    MPL_ASSERT_RELATION( size<S>::value, ==, 3 );

    typedef typename end<S>::type not_found;
    BOOST_MPL_ASSERT_NOT(( is_same<BOOST_DEDUCED_TYPENAME find<S,int>::type,not_found> ));
    BOOST_MPL_ASSERT_NOT(( is_same<BOOST_DEDUCED_TYPENAME find<S,long>::type,not_found> ));
    BOOST_MPL_ASSERT_NOT(( is_same<BOOST_DEDUCED_TYPENAME find<S,char>::type,not_found> ));
    BOOST_MPL_ASSERT(( is_same<BOOST_DEDUCED_TYPENAME find<S,char*>::type,not_found> ));
}

MPL_TEST_CASE()
{
    typedef mpl::set<int,long,char> s;
    find_test<s>();
    find_test<s::type>();
}
