forked from boostorg/utility
Tests for enable_if
[SVN r1401]
This commit is contained in:
53
test/enable_if_LICENSE
Normal file
53
test/enable_if_LICENSE
Normal file
@@ -0,0 +1,53 @@
|
||||
Software License
|
||||
|
||||
Copyright 2003 <20> The Trustees of Indiana University. All rights
|
||||
reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
1. All redistributions of source code must retain the above copyright
|
||||
notice, the list of authors in the original source code, this list
|
||||
of conditions and the disclaimer listed in this license;
|
||||
2. All redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the disclaimer
|
||||
listed in this license in the documentation and/or other materials
|
||||
provided with the distribution;
|
||||
3. Any documentation included with all redistributions must include
|
||||
the following acknowledgement:
|
||||
|
||||
|
||||
This product includes software developed by the Open Systems Laboratory
|
||||
at Indiana University. For further information contact Andrew Lumsdaine
|
||||
at lums@osl.iu.edu.
|
||||
|
||||
Alternatively, this acknowledgement may appear in the software itself,
|
||||
and wherever such third-party acknowledgments normally appear.
|
||||
|
||||
4. The name Indiana University shall not be used to endorse or promote
|
||||
products derived from this software without prior written permission
|
||||
from Indiana University. For written permission, please contact the
|
||||
Advanced Research and Technology Institute (ARTI) at 1100 Waterway
|
||||
Blvd., Indianapolis, Indiana 46202.
|
||||
5. Products derived from this software may not be called enable_if, nor
|
||||
may Indiana University appear in their name, without prior written
|
||||
permission of ARTI.
|
||||
|
||||
|
||||
|
||||
Indiana University provides no reassurances that the source code
|
||||
provided does not infringe the patent or any other intellectual
|
||||
property rights of any other entity. Indiana University disclaims any
|
||||
liability to any recipient for claims brought by any other entity
|
||||
based on infringement of intellectual property rights or otherwise.
|
||||
|
||||
LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH
|
||||
NO WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA
|
||||
UNIVERSITY GIVES NO WARRANTIES AND MAKES NO REPRESENTATION THAT
|
||||
SOFTWARE IS FREE OF INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR
|
||||
OTHER PROPRIETARY RIGHTS. INDIANA UNIVERSITY MAKES NO WARRANTIES THAT
|
||||
SOFTWARE IS FREE FROM "BUGS", "VIRUSES", "TROJAN HORSES", "TRAP
|
||||
DOORS", "WORMS", OR OTHER HARMFUL CODE. LICENSEE ASSUMES THE ENTIRE
|
||||
RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR ASSOCIATED MATERIALS,
|
||||
AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION GENERATED USING
|
||||
SOFTWARE.
|
44
test/enable_if_constructors.cpp
Normal file
44
test/enable_if_constructors.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
//
|
||||
// Copyright 2003 <20> The Trustees of Indiana University. All rights
|
||||
// reserved.
|
||||
//
|
||||
// See the file enable_if_LICENSE for licensing conditions.
|
||||
//
|
||||
// Authors: Jaakko J<>rvi (jajarvi@osl.iu.edu)
|
||||
// Jeremiah Willcock (jewillco@osl.iu.edu)
|
||||
// Andrew Lumsdaine (lums@osl.iu.edu)
|
||||
//
|
||||
|
||||
#include <boost/test/minimal.hpp>
|
||||
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
|
||||
using boost::enable_if;
|
||||
using boost::disable_if;
|
||||
using boost::is_arithmetic;
|
||||
|
||||
struct container {
|
||||
bool my_value;
|
||||
|
||||
template <class T>
|
||||
container(const T&, const typename enable_if<is_arithmetic<T>::value, T>::type * = 0):
|
||||
my_value(true) {}
|
||||
|
||||
template <class T>
|
||||
container(const T&, const typename disable_if<is_arithmetic<T>::value, T>::type * = 0):
|
||||
my_value(false) {}
|
||||
};
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
|
||||
BOOST_TEST(container(1).my_value);
|
||||
BOOST_TEST(container(1.0).my_value);
|
||||
|
||||
BOOST_TEST(!container("1").my_value);
|
||||
BOOST_TEST(!container(static_cast<void*>(0)).my_value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
44
test/enable_if_dummy_arg_disambiguation.cpp
Normal file
44
test/enable_if_dummy_arg_disambiguation.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
//
|
||||
// Copyright 2003 <20> The Trustees of Indiana University. All rights
|
||||
// reserved.
|
||||
//
|
||||
// See the file enable_if_LICENSE for licensing conditions.
|
||||
//
|
||||
// Authors: Jaakko J<>rvi (jajarvi@osl.iu.edu)
|
||||
// Jeremiah Willcock (jewillco@osl.iu.edu)
|
||||
// Andrew Lumsdaine (lums@osl.iu.edu)
|
||||
//
|
||||
|
||||
#include <boost/test/minimal.hpp>
|
||||
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/type_traits/is_arithmetic.hpp>
|
||||
|
||||
using boost::enable_if;
|
||||
using boost::is_arithmetic;
|
||||
|
||||
template <int N> struct dummy {
|
||||
dummy(int) {};
|
||||
};
|
||||
|
||||
template<class T>
|
||||
typename enable_if<is_arithmetic<T>::value, bool>::type
|
||||
arithmetic_object(T t, dummy<0> = 0) { return true; }
|
||||
|
||||
template<class T>
|
||||
typename enable_if<!is_arithmetic<T>::value, bool>::type
|
||||
arithmetic_object(T t, dummy<1> = 0) { return false; }
|
||||
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
|
||||
BOOST_TEST(arithmetic_object(1));
|
||||
BOOST_TEST(arithmetic_object(1.0));
|
||||
|
||||
BOOST_TEST(!arithmetic_object("1"));
|
||||
BOOST_TEST(!arithmetic_object(static_cast<void*>(0)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
74
test/enable_if_lazy.cpp
Normal file
74
test/enable_if_lazy.cpp
Normal file
@@ -0,0 +1,74 @@
|
||||
//
|
||||
// Copyright 2003 <20> The Trustees of Indiana University. All rights
|
||||
// reserved.
|
||||
//
|
||||
// See the file enable_if_LICENSE for licensing conditions.
|
||||
//
|
||||
// Authors: Jaakko J<>rvi (jajarvi@osl.iu.edu)
|
||||
// Jeremiah Willcock (jewillco@osl.iu.edu)
|
||||
// Andrew Lumsdaine (lums@osl.iu.edu)
|
||||
//
|
||||
|
||||
#include <boost/test/minimal.hpp>
|
||||
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/type_traits/is_arithmetic.hpp>
|
||||
|
||||
using boost::enable_if;
|
||||
using boost::enable_if_lazy;
|
||||
using boost::is_arithmetic;
|
||||
|
||||
// This class provides a reduced example of a traits class for computing
|
||||
// the result of multiplying two types. The exists constant is true when a
|
||||
// multiplication operator exists between two types, and the type member is
|
||||
// defined to the return type of this operator. The return type member is
|
||||
// not defined when a multiplication operator does not exist.
|
||||
|
||||
template <class T, class U>
|
||||
struct mult_traits {
|
||||
BOOST_STATIC_CONSTANT(bool, exists = false);
|
||||
};
|
||||
|
||||
template <>
|
||||
struct mult_traits<int, int> {
|
||||
BOOST_STATIC_CONSTANT(bool, exists = true);
|
||||
typedef int type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct mult_traits<double, double> {
|
||||
BOOST_STATIC_CONSTANT(bool, exists = true);
|
||||
typedef double type;
|
||||
};
|
||||
|
||||
// Next, a forwarding function mult() is defined. It is enabled only when
|
||||
// mult_traits<T, U>::exists is true. The first version, using normal
|
||||
// enable_if, works with only some compilers (it does not work in g++):
|
||||
|
||||
#if 0
|
||||
template <class T, class U>
|
||||
typename enable_if<
|
||||
mult_traits<T, U>::exists,
|
||||
typename mult_traits<T, U>::type>::type
|
||||
mult(const T& x, const U& y) {return x * y;}
|
||||
#endif
|
||||
|
||||
// An improved version that works with more compilers uses enable_if_lazy.
|
||||
// This template removes compiler errors from invalid code used as an
|
||||
// argument to enable_if.
|
||||
|
||||
template <class T, class U>
|
||||
typename enable_if_lazy<
|
||||
mult_traits<T, U>::exists,
|
||||
mult_traits<T, U> >::type
|
||||
mult(const T& x, const U& y) {return x * y;}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
|
||||
BOOST_TEST(mult(1, 2) == 2);
|
||||
BOOST_TEST(mult(1.0, 3.0) == 3.0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
42
test/enable_if_member_templates.cpp
Normal file
42
test/enable_if_member_templates.cpp
Normal file
@@ -0,0 +1,42 @@
|
||||
//
|
||||
// Copyright 2003 <20> The Trustees of Indiana University. All rights
|
||||
// reserved.
|
||||
//
|
||||
// See the file enable_if_LICENSE for licensing conditions.
|
||||
//
|
||||
// Authors: Jaakko J<>rvi (jajarvi@osl.iu.edu)
|
||||
// Jeremiah Willcock (jewillco@osl.iu.edu)
|
||||
// Andrew Lumsdaine (lums@osl.iu.edu)
|
||||
//
|
||||
|
||||
#include <boost/test/minimal.hpp>
|
||||
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/type_traits/is_arithmetic.hpp>
|
||||
|
||||
using boost::enable_if;
|
||||
using boost::disable_if;
|
||||
using boost::is_arithmetic;
|
||||
|
||||
struct container {
|
||||
template <class T>
|
||||
typename enable_if<is_arithmetic<T>::value, bool>::type
|
||||
arithmetic_object(const T&, const int* /* disambiguate */ = 0) {return true;}
|
||||
|
||||
template <class T>
|
||||
typename disable_if<is_arithmetic<T>::value, bool>::type
|
||||
arithmetic_object(const T&) {return false;}
|
||||
};
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
|
||||
BOOST_TEST(container().arithmetic_object(1));
|
||||
BOOST_TEST(container().arithmetic_object(1.0));
|
||||
|
||||
BOOST_TEST(!container().arithmetic_object("1"));
|
||||
BOOST_TEST(!container().arithmetic_object(static_cast<void*>(0)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
44
test/enable_if_namespace_disambiguation.cpp
Normal file
44
test/enable_if_namespace_disambiguation.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
//
|
||||
// Copyright 2003 <20> The Trustees of Indiana University. All rights
|
||||
// reserved.
|
||||
//
|
||||
// See the file enable_if_LICENSE for licensing conditions.
|
||||
//
|
||||
// Authors: Jaakko J<>rvi (jajarvi@osl.iu.edu)
|
||||
// Jeremiah Willcock (jewillco@osl.iu.edu)
|
||||
// Andrew Lumsdaine (lums@osl.iu.edu)
|
||||
//
|
||||
|
||||
#include <boost/test/minimal.hpp>
|
||||
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/type_traits/is_arithmetic.hpp>
|
||||
|
||||
using boost::enable_if;
|
||||
using boost::is_arithmetic;
|
||||
|
||||
namespace A {
|
||||
template<class T>
|
||||
typename enable_if<is_arithmetic<T>::value, bool>::type
|
||||
arithmetic_object(T t) { return true; }
|
||||
}
|
||||
|
||||
namespace B {
|
||||
template<class T>
|
||||
typename enable_if<!is_arithmetic<T>::value, bool>::type
|
||||
arithmetic_object(T t) { return false; }
|
||||
}
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
using namespace A;
|
||||
using namespace B;
|
||||
BOOST_TEST(arithmetic_object(1));
|
||||
BOOST_TEST(arithmetic_object(1.0));
|
||||
|
||||
BOOST_TEST(!arithmetic_object("1"));
|
||||
BOOST_TEST(!arithmetic_object(static_cast<void*>(0)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
40
test/enable_if_no_disambiguation.cpp
Normal file
40
test/enable_if_no_disambiguation.cpp
Normal file
@@ -0,0 +1,40 @@
|
||||
//
|
||||
// Copyright 2003 <20> The Trustees of Indiana University. All rights
|
||||
// reserved.
|
||||
//
|
||||
// See the file enable_if_LICENSE for licensing conditions.
|
||||
//
|
||||
// Authors: Jaakko J<>rvi (jajarvi@osl.iu.edu)
|
||||
// Jeremiah Willcock (jewillco@osl.iu.edu)
|
||||
// Andrew Lumsdaine (lums@osl.iu.edu)
|
||||
//
|
||||
|
||||
#include <boost/test/minimal.hpp>
|
||||
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/type_traits/is_arithmetic.hpp>
|
||||
|
||||
using boost::enable_if;
|
||||
using boost::is_arithmetic;
|
||||
|
||||
template<class T>
|
||||
typename enable_if<is_arithmetic<T>::value, bool>::type
|
||||
arithmetic_object(T t) { return true; }
|
||||
|
||||
template<class T>
|
||||
typename enable_if<!is_arithmetic<T>::value, bool>::type
|
||||
arithmetic_object(T t) { return false; }
|
||||
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
|
||||
BOOST_TEST(arithmetic_object(1));
|
||||
BOOST_TEST(arithmetic_object(1.0));
|
||||
|
||||
BOOST_TEST(!arithmetic_object("1"));
|
||||
BOOST_TEST(!arithmetic_object(static_cast<void*>(0)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
45
test/enable_if_partial_specializations.cpp
Normal file
45
test/enable_if_partial_specializations.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// Copyright 2003 <20> The Trustees of Indiana University. All rights
|
||||
// reserved.
|
||||
//
|
||||
// See the file enable_if_LICENSE for licensing conditions.
|
||||
//
|
||||
// Authors: Jaakko J<>rvi (jajarvi@osl.iu.edu)
|
||||
// Jeremiah Willcock (jewillco@osl.iu.edu)
|
||||
// Andrew Lumsdaine (lums@osl.iu.edu)
|
||||
//
|
||||
|
||||
#include <boost/test/minimal.hpp>
|
||||
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/type_traits/is_arithmetic.hpp>
|
||||
|
||||
using boost::enable_if;
|
||||
using boost::disable_if;
|
||||
using boost::is_arithmetic;
|
||||
|
||||
template <class T, class Enable = void>
|
||||
struct tester;
|
||||
|
||||
template <class T>
|
||||
struct tester<T, typename enable_if<is_arithmetic<T>::value>::type> {
|
||||
BOOST_STATIC_CONSTANT(bool, value = true);
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct tester<T, typename disable_if<is_arithmetic<T>::value>::type> {
|
||||
BOOST_STATIC_CONSTANT(bool, value = false);
|
||||
};
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
|
||||
BOOST_TEST(tester<int>::value);
|
||||
BOOST_TEST(tester<double>::value);
|
||||
|
||||
BOOST_TEST(!tester<char*>::value);
|
||||
BOOST_TEST(!tester<void*>::value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user