Add new versions of decay, extent, function_traits.

This commit is contained in:
jzmaddock committed 2015-01-15 18:23:35 +00:00
1 parent 6bbee3cc59
commit c4c10e06c6
7 files changed
+617

No files matched your search

+127
View File
@@ -0,0 +1,127 @@
// (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 avoided 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
+49
View File
@@ -0,0 +1,49 @@
// (C) Copyright John Maddock 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/extent.hpp>
#endif
TT_TEST_BEGIN(extent)
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int>::value, 0);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int[]>::value, 0);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int[][10]>::value, 0);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int[5][10]>::value, 5);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int[5][10][40]>::value, 5);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int (&)[5][10]>::value, 0);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int (*)[5][10]>::value, 0);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int,1>::value), 0);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int[],1>::value), 0);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int[][10],1>::value), 10);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int[5][10],1>::value), 10);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int[5][10][40],1>::value), 10);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int (&)[5][10],1>::value), 0);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int (*)[5][10],1>::value), 0);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int[5][10],2>::value), 0);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int[5][10][40],2>::value), 40);
BOOST_CHECK_INTEGRAL_CONSTANT((::tt::extent<int[5][10][40],3>::value), 0);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int*>::value, 0);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int&>::value, 0);
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::extent<int&&>::value, 0);
#endif
TT_TEST_END
+68
View File
@@ -0,0 +1,68 @@
// (C) Copyright John Maddock 2000.
// 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_type.hpp"
#include "check_integral_constant.hpp"
#ifdef TEST_STD
# include <type_traits>
#else
# include <boost/type_traits/function_traits.hpp>
#endif
typedef void(pf_zero1)();
typedef int(pf_zero2)();
typedef const int& (pf_zero3)();
typedef void(pf_one1)(int);
typedef int(pf_one2)(int);
typedef const int&(pf_one3)(const int&);
typedef void(pf_two1)(int,int);
typedef int(pf_two2)(int,int);
typedef const int&(pf_two3)(const int&,const int&);
TT_TEST_BEGIN(function_traits)
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::function_traits<pf_zero1>::arity, 0);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::function_traits<pf_zero2>::arity, 0);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::function_traits<pf_zero3>::arity, 0);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::function_traits<pf_one1>::arity, 1);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::function_traits<pf_one2>::arity, 1);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::function_traits<pf_one3>::arity, 1);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::function_traits<pf_two1>::arity, 2);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::function_traits<pf_two2>::arity, 2);
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::function_traits<pf_two3>::arity, 2);
BOOST_CHECK_TYPE(void, ::tt::function_traits<pf_zero1>::result_type);
BOOST_CHECK_TYPE(::tt::function_traits<pf_zero2>::result_type, int);
BOOST_CHECK_TYPE(::tt::function_traits<pf_zero3>::result_type, const int&);
BOOST_CHECK_TYPE(::tt::function_traits<pf_one1>::result_type, void);
BOOST_CHECK_TYPE(::tt::function_traits<pf_one2>::result_type, int);
BOOST_CHECK_TYPE(::tt::function_traits<pf_one3>::result_type, const int&);
BOOST_CHECK_TYPE(::tt::function_traits<pf_two1>::result_type, void);
BOOST_CHECK_TYPE(::tt::function_traits<pf_two2>::result_type, int);
BOOST_CHECK_TYPE(::tt::function_traits<pf_two3>::result_type, const int&);
BOOST_CHECK_TYPE(::tt::function_traits<pf_one1>::arg1_type, int);
BOOST_CHECK_TYPE(::tt::function_traits<pf_one2>::arg1_type, int);
BOOST_CHECK_TYPE(::tt::function_traits<pf_one3>::arg1_type, const int&);
BOOST_CHECK_TYPE(::tt::function_traits<pf_two1>::arg1_type, int);
BOOST_CHECK_TYPE(::tt::function_traits<pf_two2>::arg1_type, int);
BOOST_CHECK_TYPE(::tt::function_traits<pf_two3>::arg1_type, const int&);
BOOST_CHECK_TYPE(::tt::function_traits<pf_two1>::arg2_type, int);
BOOST_CHECK_TYPE(::tt::function_traits<pf_two2>::arg2_type, int);
BOOST_CHECK_TYPE(::tt::function_traits<pf_two3>::arg2_type, const int&);
TT_TEST_END