forked from boostorg/utility
added is_convertible and alignment_of
[SVN r7664]
This commit is contained in:
@ -1,3 +1,10 @@
|
|||||||
|
// boost::compressed_pair test program
|
||||||
|
|
||||||
|
// (C) Copyright John Maddock 2000. Permission to copy, use, modify, sell and
|
||||||
|
// distribute this software is granted provided this copyright notice appears
|
||||||
|
// in all copies. This software is provided "as is" without express or implied
|
||||||
|
// warranty, and with no claim as to its suitability for any purpose.
|
||||||
|
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -6,12 +13,7 @@
|
|||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
#include <boost/call_traits.hpp>
|
#include <boost/call_traits.hpp>
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
#include "type_traits_test.hpp"
|
||||||
// turn off some warnings, the way we do the tests will generate a *lot* of these
|
|
||||||
// this is a result of the tests not call_traits itself....
|
|
||||||
#pragma option -w-8004 -w-ccc -w-rch -w-eff -w-aus
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// struct contained models a type that contains a type (for example std::pair)
|
// struct contained models a type that contains a type (for example std::pair)
|
||||||
// arrays are contained by value, and have to be treated as a special case:
|
// arrays are contained by value, and have to be treated as a special case:
|
||||||
@ -178,30 +180,6 @@ struct UDT
|
|||||||
bool operator == (const UDT& v){ return v.i_ == i_; }
|
bool operator == (const UDT& v){ return v.i_ == i_; }
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
|
||||||
// define tests here
|
|
||||||
unsigned failures = 0;
|
|
||||||
unsigned test_count = 0;
|
|
||||||
|
|
||||||
#define value_test(v, x) ++test_count;\
|
|
||||||
if(v != x){++failures; std::cout << "checking value of " << #x << "...failed" << std::endl;}
|
|
||||||
|
|
||||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
|
||||||
#define type_test(v, x) ++test_count;\
|
|
||||||
if(boost::is_same<v, x>::value == false){\
|
|
||||||
++failures; \
|
|
||||||
std::cout << "checking type of " << #x << "...failed" << std::endl; \
|
|
||||||
std::cout << " expected type was " << #v << std::endl; \
|
|
||||||
std::cout << " " << typeid(boost::is_same<v, x>).name() << "::value is false" << std::endl; }
|
|
||||||
#else
|
|
||||||
#define type_test(v, x) ++test_count;\
|
|
||||||
if(typeid(v) != typeid(x)){\
|
|
||||||
++failures; \
|
|
||||||
std::cout << "checking type of " << #x << "...failed" << std::endl; \
|
|
||||||
std::cout << " expected type was " << #v << std::endl; \
|
|
||||||
std::cout << " " << "typeid(" #v ") != typeid(" #x ")" << std::endl; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
checker<UDT> c1;
|
checker<UDT> c1;
|
||||||
|
@ -10,38 +10,10 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
#include <boost/compressed_pair.hpp>
|
#include <boost/compressed_pair.hpp>
|
||||||
|
#include "type_traits_test.hpp"
|
||||||
|
|
||||||
using namespace boost;
|
using namespace boost;
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
#pragma option -w-ccc -w-rch -w-eff -w-aus
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// define tests here
|
|
||||||
unsigned failures = 0;
|
|
||||||
unsigned test_count = 0;
|
|
||||||
|
|
||||||
#define value_test(v, x) ++test_count;\
|
|
||||||
if(v != x){++failures; std::cout << "checking value of " << #x << "...failed" << std::endl;}
|
|
||||||
#define value_fail(v, x) ++test_count; ++failures; std::cout << "checking value of " << #x << "...failed" << std::endl;
|
|
||||||
|
|
||||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
|
||||||
#define type_test(v, x) ++test_count;\
|
|
||||||
if(boost::is_same<v, x>::value == false){\
|
|
||||||
++failures; \
|
|
||||||
std::cout << "checking type of " << #x << "...failed" << std::endl; \
|
|
||||||
std::cout << " expected type was " << #v << std::endl; \
|
|
||||||
std::cout << " " << typeid(boost::is_same<v, x>).name() << "::value is false" << std::endl; }
|
|
||||||
#else
|
|
||||||
#define type_test(v, x) ++test_count;\
|
|
||||||
if(typeid(v) != typeid(x)){\
|
|
||||||
++failures; \
|
|
||||||
std::cout << "checking type of " << #x << "...failed" << std::endl; \
|
|
||||||
std::cout << " expected type was " << #v << std::endl; \
|
|
||||||
std::cout << " " << "typeid(" #v ") != typeid(" #x ")" << std::endl; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct empty_POD_UDT{};
|
struct empty_POD_UDT{};
|
||||||
struct empty_UDT
|
struct empty_UDT
|
||||||
{
|
{
|
||||||
|
@ -16,37 +16,10 @@
|
|||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
|
||||||
#include <boost/type_traits.hpp>
|
#include <boost/type_traits.hpp>
|
||||||
|
#include "type_traits_test.hpp"
|
||||||
|
|
||||||
using namespace boost;
|
using namespace boost;
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
#pragma option -w-ccc -w-rch -w-eff -w-aus
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// define tests here
|
|
||||||
unsigned failures = 0;
|
|
||||||
unsigned test_count = 0;
|
|
||||||
|
|
||||||
#define value_test(v, x) ++test_count;\
|
|
||||||
if(v != x){++failures; std::cout << "checking value of " << #x << "...failed" << std::endl;}
|
|
||||||
#define value_fail(v, x) ++test_count; ++failures; std::cout << "checking value of " << #x << "...failed" << std::endl;
|
|
||||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
|
||||||
#define type_test(v, x) ++test_count;\
|
|
||||||
if(is_same<v, x>::value == false){\
|
|
||||||
++failures; \
|
|
||||||
std::cout << "checking type of " << #x << "...failed" << std::endl; \
|
|
||||||
std::cout << " expected type was " << #v << std::endl; \
|
|
||||||
std::cout << " " << typeid(is_same<v, x>).name() << "::value is false" << std::endl; }
|
|
||||||
#else
|
|
||||||
#define type_test(v, x) ++test_count;\
|
|
||||||
if(typeid(v) != typeid(x)){\
|
|
||||||
++failures; \
|
|
||||||
std::cout << "checking type of " << #x << "...failed" << std::endl; \
|
|
||||||
std::cout << " expected type was " << #v << std::endl; \
|
|
||||||
std::cout << " " << "typeid(" #v ") != typeid(" #x ")" << std::endl; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Since there is no compiler support, we should specialize:
|
// Since there is no compiler support, we should specialize:
|
||||||
// is_enum for all enumerations (is_enum implies is_POD)
|
// is_enum for all enumerations (is_enum implies is_POD)
|
||||||
// is_union for all unions
|
// is_union for all unions
|
||||||
@ -160,6 +133,33 @@ template <> struct is_POD<empty_POD_union_UDT>
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
class Base { };
|
||||||
|
|
||||||
|
class Deriverd : public Base { };
|
||||||
|
|
||||||
|
class NonDerived { };
|
||||||
|
|
||||||
|
enum enum1
|
||||||
|
{
|
||||||
|
one_,two_
|
||||||
|
};
|
||||||
|
|
||||||
|
enum enum2
|
||||||
|
{
|
||||||
|
three_,four_
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VB
|
||||||
|
{
|
||||||
|
virtual ~VB(){};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VD : VB
|
||||||
|
{
|
||||||
|
~VD(){};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Steve: All comments that I (Steve Cleary) have added below are prefixed with
|
// Steve: All comments that I (Steve Cleary) have added below are prefixed with
|
||||||
// "Steve:" The failures that BCB4 has on the tests are due to Borland's
|
// "Steve:" The failures that BCB4 has on the tests are due to Borland's
|
||||||
// not considering cv-qual's as a part of the type -- they are considered
|
// not considering cv-qual's as a part of the type -- they are considered
|
||||||
@ -530,6 +530,52 @@ int main()
|
|||||||
value_test(false, is_POD<empty_UDT>::value)
|
value_test(false, is_POD<empty_UDT>::value)
|
||||||
value_test(true, is_POD<enum_UDT>::value)
|
value_test(true, is_POD<enum_UDT>::value)
|
||||||
|
|
||||||
|
value_test(true, (boost::is_convertible<Deriverd,Base>::value));
|
||||||
|
value_test(true, (boost::is_convertible<Deriverd,Deriverd>::value));
|
||||||
|
value_test(true, (boost::is_convertible<Base,Base>::value));
|
||||||
|
value_test(false, (boost::is_convertible<Base,Deriverd>::value));
|
||||||
|
value_test(true, (boost::is_convertible<Deriverd,Deriverd>::value));
|
||||||
|
value_test(false, (boost::is_convertible<NonDerived,Base>::value));
|
||||||
|
//value_test(false, (boost::is_convertible<boost::noncopyable, boost::noncopyable>::value));
|
||||||
|
value_test(true, (boost::is_convertible<float,int>::value));
|
||||||
|
#if defined(BOOST_MSVC6_MEMBER_TEMPLATES) || !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
||||||
|
value_test(false, (boost::is_convertible<float,void>::value));
|
||||||
|
value_test(false, (boost::is_convertible<void,float>::value));
|
||||||
|
value_test(true, (boost::is_convertible<void,void>::value));
|
||||||
|
#endif
|
||||||
|
value_test(true, (boost::is_convertible<enum1, int>::value));
|
||||||
|
value_test(true, (boost::is_convertible<Deriverd*, Base*>::value));
|
||||||
|
value_test(false, (boost::is_convertible<Base*, Deriverd*>::value));
|
||||||
|
value_test(true, (boost::is_convertible<Deriverd&, Base&>::value));
|
||||||
|
value_test(false, (boost::is_convertible<Base&, Deriverd&>::value));
|
||||||
|
value_test(true, (boost::is_convertible<const Deriverd*, const Base*>::value));
|
||||||
|
value_test(false, (boost::is_convertible<const Base*, const Deriverd*>::value));
|
||||||
|
value_test(true, (boost::is_convertible<const Deriverd&, const Base&>::value));
|
||||||
|
value_test(false, (boost::is_convertible<const Base&, const Deriverd&>::value));
|
||||||
|
|
||||||
|
value_test(false, (boost::is_convertible<const int *, int*>::value));
|
||||||
|
value_test(false, (boost::is_convertible<const int&, int&>::value));
|
||||||
|
value_test(false, (boost::is_convertible<int*, int[2]>::value));
|
||||||
|
value_test(false, (boost::is_convertible<const int*, int[3]>::value));
|
||||||
|
value_test(true, (boost::is_convertible<const int&, int>::value));
|
||||||
|
value_test(true, (boost::is_convertible<int(&)[4], const int*>::value));
|
||||||
|
value_test(true, (boost::is_convertible<int(&)(int), int(*)(int)>::value));
|
||||||
|
value_test(true, (boost::is_convertible<int *, const int*>::value));
|
||||||
|
value_test(true, (boost::is_convertible<int&, const int&>::value));
|
||||||
|
value_test(true, (boost::is_convertible<int[2], int*>::value));
|
||||||
|
value_test(true, (boost::is_convertible<int[2], const int*>::value));
|
||||||
|
value_test(false, (boost::is_convertible<const int[2], int*>::value));
|
||||||
|
|
||||||
|
align_test(int);
|
||||||
|
align_test(char);
|
||||||
|
align_test(double);
|
||||||
|
align_test(int[4]);
|
||||||
|
//align_test(int&);
|
||||||
|
align_test(int*);
|
||||||
|
//align_test(const int);
|
||||||
|
align_test(VB);
|
||||||
|
align_test(VD);
|
||||||
|
|
||||||
std::cout << std::endl << test_count << " tests completed (" << failures << " failures)... press any key to exit";
|
std::cout << std::endl << test_count << " tests completed (" << failures << " failures)... press any key to exit";
|
||||||
std::cin.get();
|
std::cin.get();
|
||||||
return failures;
|
return failures;
|
||||||
|
Reference in New Issue
Block a user