
//  (C) Copyright John Maddock & Thorsten Ottosen 2005. 
//  Use, modification and distribution are subject to 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 "test.hpp"
#include "check_integral_constant.hpp"
#ifdef TEST_STD
#  include <type_traits>
#else
#  include <boost/type_traits/decay.hpp>
#  include <boost/type_traits/is_same.hpp>
#endif
#include <iostream>
#include <string>
#include <utility>

#ifdef BOOST_INTEL
//  remark #383: value copied to temporary, reference to temporary used
//     std::pair<std::string, int>        p2 = boost::make_pair( "foo", 1 );
//                                                                      ^
#pragma warning(disable:383)
#endif

namespace boost
{

    int proc1()
    {
       return 0;
    }
    int proc2(int c)
    {
       return c;
    }
    
    //
    // An almost optimal version of std::make_pair()
    //
    template< class F, class S >
    inline std::pair< BOOST_DEDUCED_TYPENAME tt::decay<const F>::type, 
                      BOOST_DEDUCED_TYPENAME tt::decay<const S>::type >
    make_pair( const F& f, const S& s )
    {
        return std::pair< BOOST_DEDUCED_TYPENAME tt::decay<const F>::type, 
                          BOOST_DEDUCED_TYPENAME tt::decay<const S>::type >( f, s ); 
    }

    /*
    This overload will mess up vc7.1

    template< class F, class S >
    inline std::pair< BOOST_DEDUCED_TYPENAME ::tt::decay<F>::type, 
                      BOOST_DEDUCED_TYPENAME ::tt::decay<S>::type >
    make_pair( F& f, S& s )
    {
        return std::pair< BOOST_DEDUCED_TYPENAME ::tt::decay<F>::type, 
                          BOOST_DEDUCED_TYPENAME ::tt::decay<S>::type >( f, s ); 
    }
    */
}

TT_TEST_BEGIN(is_class)

   BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 
          ::tt::decay<int>::type,int>::value),
                                  true );
   BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 
          ::tt::decay<char[2]>::type,char*>::value),
                                 true );
   BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 
          ::tt::decay<char[2][3]>::type,char(*)[3]>::value),
                                 true );
   BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 
          ::tt::decay<const char[2]>::type,const char*>::value),
                                  true );
   BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 
          ::tt::decay<wchar_t[2]>::type,wchar_t*>::value),
                                  true );
   BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 
          ::tt::decay<const wchar_t[2]>::type,const wchar_t*>::value),
                                  true );
   BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 
          ::tt::decay<const wchar_t[2]>::type,const wchar_t*>::value),
                                  true );

   typedef int f1_type(void);
   typedef int f2_type(int);

   BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 
          ::tt::decay<f1_type>::type,int (*)(void)>::value),
                                  true );
   BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 
          ::tt::decay<f2_type>::type,int (*)(int)>::value),
                                  true );

   std::pair<std::string,std::string> p  = boost::make_pair( "foo", "bar" );
   std::pair<std::string, int>        p2 = boost::make_pair( "foo", 1 );
#ifndef BOOST_NO_STD_WSTRING
   std::pair<std::wstring,std::string> p3  = boost::make_pair( L"foo", "bar" );
   std::pair<std::wstring, int>        p4  = boost::make_pair( L"foo", 1 );
#endif

   //
   // Todo: make these work sometime. The test id not directly
   //       related to decay<T>::type and can be avioded for now.
   // 
   /*
   int array[10];
   std::pair<int*,int*> p5 = boost::make_pair( array, array );
#ifndef __BORLANDC__
   std::pair<int(*)(void), int(*)(int)> p6 = boost::make_pair(boost::proc1, boost::proc2);
   p6.first();
   p6.second(1);
#endif
   */
   
TT_TEST_END








