forked from boostorg/typeof
integration
[SVN r2369]
This commit is contained in:
@ -4,40 +4,43 @@
|
||||
|
||||
#define n BOOST_PP_ITERATION()
|
||||
|
||||
// functions
|
||||
|
||||
template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)>
|
||||
struct encode_type_impl<V, R(*)(BOOST_PP_ENUM_PARAMS(n, P))>
|
||||
namespace
|
||||
{
|
||||
typedef R BOOST_PP_CAT(P, n);
|
||||
typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_ID + n) type;
|
||||
};
|
||||
// functions
|
||||
|
||||
template<class Iter>
|
||||
struct decode_type_impl<mpl::size_t<FUN_ID + n>, Iter>
|
||||
{
|
||||
typedef Iter iter0;
|
||||
BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n))
|
||||
typedef BOOST_PP_CAT(p, n)(*type)(BOOST_PP_ENUM_PARAMS(n, p));
|
||||
typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter;
|
||||
};
|
||||
template<class V, class R BOOST_PP_ENUM_TRAILING_PARAMS(n, class P)>
|
||||
struct encode_type_impl<V, R(*)(BOOST_PP_ENUM_PARAMS(n, P))>
|
||||
{
|
||||
typedef R BOOST_PP_CAT(P, n);
|
||||
typedef BOOST_TYPEOF_ENCODE_PARAMS(BOOST_PP_INC(n), FUN_ID + n) type;
|
||||
};
|
||||
|
||||
// member functions
|
||||
template<class Iter>
|
||||
struct decode_type_impl<mpl::size_t<FUN_ID + n>, Iter>
|
||||
{
|
||||
typedef Iter iter0;
|
||||
BOOST_TYPEOF_DECODE_PARAMS(BOOST_PP_INC(n))
|
||||
typedef BOOST_PP_CAT(p, n)(*type)(BOOST_PP_ENUM_PARAMS(n, p));
|
||||
typedef BOOST_PP_CAT(iter, BOOST_PP_INC(n)) iter;
|
||||
};
|
||||
|
||||
#define BOOST_TYPEOF_qualifier
|
||||
#define BOOST_TYPEOF_id MEM_FUN_ID
|
||||
#include <boost/typeof/compliant/register_mem_functions.hpp>
|
||||
// member functions
|
||||
|
||||
#define BOOST_TYPEOF_qualifier const
|
||||
#define BOOST_TYPEOF_id CONST_MEM_FUN_ID
|
||||
#include <boost/typeof/compliant/register_mem_functions.hpp>
|
||||
#define BOOST_TYPEOF_qualifier
|
||||
#define BOOST_TYPEOF_id MEM_FUN_ID
|
||||
#include <boost/typeof/compliant/register_mem_functions.hpp>
|
||||
|
||||
#define BOOST_TYPEOF_qualifier volatile
|
||||
#define BOOST_TYPEOF_id VOLATILE_MEM_FUN_ID
|
||||
#include <boost/typeof/compliant/register_mem_functions.hpp>
|
||||
#define BOOST_TYPEOF_qualifier const
|
||||
#define BOOST_TYPEOF_id CONST_MEM_FUN_ID
|
||||
#include <boost/typeof/compliant/register_mem_functions.hpp>
|
||||
|
||||
#define BOOST_TYPEOF_qualifier volatile const
|
||||
#define BOOST_TYPEOF_id VOLATILE_CONST_MEM_FUN_ID
|
||||
#include <boost/typeof/compliant/register_mem_functions.hpp>
|
||||
#define BOOST_TYPEOF_qualifier volatile
|
||||
#define BOOST_TYPEOF_id VOLATILE_MEM_FUN_ID
|
||||
#include <boost/typeof/compliant/register_mem_functions.hpp>
|
||||
|
||||
#define BOOST_TYPEOF_qualifier volatile const
|
||||
#define BOOST_TYPEOF_id VOLATILE_CONST_MEM_FUN_ID
|
||||
#include <boost/typeof/compliant/register_mem_functions.hpp>
|
||||
}
|
||||
|
||||
#undef n
|
||||
|
@ -36,12 +36,9 @@ namespace boost
|
||||
{
|
||||
namespace type_of
|
||||
{
|
||||
namespace
|
||||
{
|
||||
# define BOOST_PP_ITERATION_LIMITS (0, BOOST_TYPEOF_LIMIT_FUNCTION_ARITY)
|
||||
// BOOST_PP_FILENAME_1 is defined outside
|
||||
# include BOOST_PP_ITERATE()
|
||||
}
|
||||
# define BOOST_PP_ITERATION_LIMITS (0, BOOST_TYPEOF_LIMIT_FUNCTION_ARITY)
|
||||
// BOOST_PP_FILENAME_1 is defined outside
|
||||
# include BOOST_PP_ITERATE()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -27,8 +27,9 @@
|
||||
#endif
|
||||
|
||||
// auto
|
||||
#define BOOST_AUTO(Var, Expr) BOOST_TYPEOF(Expr) Var(Expr)
|
||||
#define BOOST_AUTO_TPL(Var, Expr) BOOST_TYPEOF_TPL(Expr) Var(Expr)
|
||||
#define BOOST_AUTO(Var, Expr) BOOST_TYPEOF(Expr) Var = Expr
|
||||
#define BOOST_AUTO_TPL(Var, Expr) BOOST_TYPEOF_TPL(Expr) Var = Expr
|
||||
|
||||
// lvalue typeof
|
||||
|
||||
#if defined(BOOST_TYPEOF_VINTAGE)
|
||||
|
@ -1,323 +0,0 @@
|
||||
// Copyright (C) 2004 Arkadiy Vertleyb
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#pragma message("including typeof.hpp...")
|
||||
#include <boost/typeof/typeof.hpp>
|
||||
#pragma message("done")
|
||||
|
||||
#include <boost/noncopyable.hpp>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
|
||||
#pragma message("registering")
|
||||
#include "stl/register.hpp"
|
||||
#include "mpl/register.hpp"
|
||||
#include "spirit/register.hpp"
|
||||
#include "lambda/register.hpp"
|
||||
#pragma message("done")
|
||||
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
#include <boost/lambda/lambda.hpp>
|
||||
#include <boost/spirit.hpp>
|
||||
#include <boost/mpl/vector.hpp>
|
||||
#include "typeid.hpp"
|
||||
|
||||
using namespace std;
|
||||
|
||||
#pragma message("started")
|
||||
|
||||
double f_0()
|
||||
{
|
||||
cout << "functions with no params" << endl;
|
||||
return 0;
|
||||
}
|
||||
double f_9(int, double, short, char*, bool, char, float, long, unsigned short)
|
||||
{
|
||||
cout << "functions with 9 params" << endl;
|
||||
return 0;
|
||||
}
|
||||
void vf_0()
|
||||
{
|
||||
cout << "void functions with 0 params" << endl;
|
||||
}
|
||||
void vf_9(int, double, short, char*, bool, char, float, long, unsigned short)
|
||||
{
|
||||
cout << "void functions with 9 params" << endl;
|
||||
}
|
||||
|
||||
struct x
|
||||
{
|
||||
int f_0() volatile
|
||||
{
|
||||
cout << "member functions with no params" << endl;
|
||||
return 0;
|
||||
}
|
||||
int f_9(int, double, char, int, double, char, int, double, char)
|
||||
{
|
||||
cout << "member functions with 9 params" << endl;
|
||||
return 0;
|
||||
}
|
||||
void vf_0()
|
||||
{
|
||||
cout << "void member functions with no params" << endl;
|
||||
}
|
||||
void vf_9(int, double, char, int, double, char, int, double, char)
|
||||
{
|
||||
cout << "void member functions with 9 params" << endl;
|
||||
}
|
||||
int cf_0() const volatile
|
||||
{
|
||||
cout << "const member functions with no params" << endl;
|
||||
return 0;
|
||||
}
|
||||
int cf_9(int, double, char, int, double, char, int, double, char) const
|
||||
{
|
||||
cout << "const member functions with 9 params" << endl;
|
||||
return 0;
|
||||
}
|
||||
void cvf_0() const
|
||||
{
|
||||
cout << "const void member functions with no params" << endl;
|
||||
}
|
||||
void cvf_9(int, double, char, int, double, char, int, double, char) const
|
||||
{
|
||||
cout << "const void member functions with 9 params" << endl;
|
||||
}
|
||||
static void sf_0()
|
||||
{
|
||||
cout << "static member function" << endl;
|
||||
}
|
||||
std::vector<int> m_v;
|
||||
};
|
||||
|
||||
struct noncop : boost::noncopyable
|
||||
{};
|
||||
const noncop& foo_nc()
|
||||
{
|
||||
static noncop nc;
|
||||
return nc;
|
||||
}
|
||||
|
||||
template<class T, char c, unsigned short us,
|
||||
int i, unsigned long ul, bool b1, bool b2, unsigned u> struct with_integrals
|
||||
{};
|
||||
|
||||
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
|
||||
|
||||
BOOST_TYPEOF_REGISTER_TYPE(x)
|
||||
BOOST_TYPEOF_REGISTER_TEMPLATE_X(with_integrals,
|
||||
(class)
|
||||
(char)
|
||||
(unsigned short)
|
||||
(int)
|
||||
(unsigned long)
|
||||
(bool)
|
||||
(bool)
|
||||
(unsigned)
|
||||
);
|
||||
|
||||
BOOST_TYPEOF_REGISTER_TYPE(noncop)
|
||||
|
||||
main()
|
||||
{
|
||||
#pragma message("integral...")
|
||||
{
|
||||
with_integrals<int, 5, 4, 3, 2, true, false, 5> expr;
|
||||
BOOST_AUTO(v, expr);
|
||||
v;
|
||||
with_integrals<int, 1, 1, 0, ULONG_MAX, false, true, 0> expr1;
|
||||
BOOST_AUTO(v1, expr1);
|
||||
v1;
|
||||
}
|
||||
#pragma message("Noncopyable...")
|
||||
{
|
||||
//BOOST_AUTO(v, foo_nc());
|
||||
BOOST_AUTO(const& v, foo_nc());
|
||||
}
|
||||
#pragma message("Lvalue preserving...")
|
||||
{
|
||||
int n;
|
||||
const int cn = 0;
|
||||
int& rn = n;
|
||||
const int& rcn = cn;
|
||||
int f();
|
||||
//const int cf();
|
||||
int& rf();
|
||||
const int& rcf();
|
||||
|
||||
cout << type_id<BOOST_LVALUE_TYPEOF(n)>::name() << endl;
|
||||
cout << type_id<BOOST_LVALUE_TYPEOF(cn)>::name() << endl;
|
||||
cout << type_id<BOOST_LVALUE_TYPEOF(rn)>::name() << endl;
|
||||
cout << type_id<BOOST_LVALUE_TYPEOF(rcn)>::name() << endl;
|
||||
cout << type_id<BOOST_LVALUE_TYPEOF(f())>::name() << endl;
|
||||
//cout << type_id<BOOST_LVALUE_TYPEOF(cf())>::name() << endl;
|
||||
cout << type_id<BOOST_LVALUE_TYPEOF(rf())>::name() << endl;
|
||||
cout << type_id<BOOST_LVALUE_TYPEOF(rcf())>::name() << endl;
|
||||
cout << type_id<BOOST_LVALUE_TYPEOF(21)>::name() << endl;
|
||||
cout << type_id<BOOST_LVALUE_TYPEOF(int(21))>::name() << endl;
|
||||
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(n), int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(cn), const int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(rn), int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(rcn), const int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(f()), int>::value));
|
||||
//BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(cf()), const int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(rf()), int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(rcf()), const int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(21), int>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(int(21)), int>::value));
|
||||
}
|
||||
#pragma message("compiling Lambda example...")
|
||||
{
|
||||
using namespace boost::lambda;
|
||||
|
||||
BOOST_AUTO(fun, _1 > 15 && _2 < 20);
|
||||
int n = 19;
|
||||
assert(fun(n, n));
|
||||
|
||||
std::cout << typeid(fun).name() << std::endl;
|
||||
}
|
||||
#pragma message("compiling Spirit example...")
|
||||
{
|
||||
// spirit example
|
||||
|
||||
using namespace boost::spirit;
|
||||
using namespace boost::lambda;
|
||||
using namespace std;
|
||||
|
||||
vector<double> v;
|
||||
|
||||
BOOST_AUTO(parser,
|
||||
(real_p[push_back_a(v)] >> *(',' >> real_p[push_back_a(v)]))
|
||||
);
|
||||
|
||||
parse("3.14159, 2.71828", parser, space_p);
|
||||
|
||||
for_each(v.begin(), v.end(), cout << _1 << ' ');
|
||||
cout << endl;
|
||||
}
|
||||
#pragma message("compiling another Spirit example...")
|
||||
{
|
||||
// more spirit...
|
||||
|
||||
using namespace boost::spirit;
|
||||
|
||||
BOOST_AUTO(
|
||||
skipper,
|
||||
( space_p
|
||||
| "//" >> *(anychar_p - '\n') >> '\n'
|
||||
| "/*" >> *(anychar_p - "*/") >> "*/"
|
||||
)
|
||||
);
|
||||
|
||||
bool success = parse(
|
||||
"/*this is a comment*/\n//this is a c++ comment\n\n",
|
||||
*skipper).full;
|
||||
|
||||
assert(success);
|
||||
}
|
||||
#pragma message("compiling Modifiers example...")
|
||||
{
|
||||
//modifiers
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
|
||||
// top-level pointers are preserved...
|
||||
|
||||
mpl::vector3<const int* const, const int[20], const int&>* foo();
|
||||
cout << typeid(BOOST_TYPEOF(foo())).name() << endl;
|
||||
|
||||
// ... but top-level refs are not :(
|
||||
|
||||
mpl::vector2<const int* const, const int&>& bar();
|
||||
cout << typeid(BOOST_TYPEOF(bar())).name() << endl;
|
||||
|
||||
mpl::vector1<int[5]> vi;
|
||||
cout << "int[5]" << endl;
|
||||
cout << typeid(BOOST_TYPEOF(vi)).name() << endl;
|
||||
|
||||
mpl::vector1<const int[5]> vci;
|
||||
cout << "const int[5]" << endl;
|
||||
cout << typeid(BOOST_TYPEOF(vci)).name() << endl;
|
||||
}
|
||||
#pragma message("compiling functions example...")
|
||||
{
|
||||
BOOST_AUTO(p0, &f_0);
|
||||
(*p0)();
|
||||
|
||||
BOOST_AUTO(p9, &f_9);
|
||||
(*p9)(0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
#pragma message("compiling void functions example...")
|
||||
{
|
||||
BOOST_AUTO(p0, &vf_0);
|
||||
(*p0)();
|
||||
|
||||
BOOST_AUTO(p9, &vf_9);
|
||||
(*p9)(0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
#pragma message("compiling member functions example...")
|
||||
{
|
||||
x xx;
|
||||
|
||||
BOOST_AUTO(p0, &x::f_0);
|
||||
(xx.*p0)();
|
||||
|
||||
BOOST_AUTO(p9, &x::f_9);
|
||||
(xx.*p9)(0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
#pragma message("compiling void member functions example...")
|
||||
{
|
||||
x xx;
|
||||
|
||||
BOOST_AUTO(p0, &x::vf_0);
|
||||
(xx.*p0)();
|
||||
|
||||
BOOST_AUTO(p9, &x::vf_9);
|
||||
(xx.*p9)(0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
#pragma message("compiling const member functions example...")
|
||||
{
|
||||
x xx;
|
||||
|
||||
BOOST_AUTO(p0, &x::cf_0);
|
||||
(xx.*p0)();
|
||||
|
||||
BOOST_AUTO(p9, &x::cf_9);
|
||||
(xx.*p9)(0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
#pragma message("compiling const void member functions example...")
|
||||
{
|
||||
x xx;
|
||||
|
||||
BOOST_AUTO(p0, &x::cvf_0);
|
||||
(xx.*p0)();
|
||||
|
||||
BOOST_AUTO(p9, &x::cvf_9);
|
||||
(xx.*p9)(0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
#pragma message("compiling static member functions example...")
|
||||
{
|
||||
BOOST_AUTO(p0, &x::sf_0);
|
||||
(*p0)();
|
||||
}
|
||||
#pragma message("pointers to data members...")
|
||||
{
|
||||
BOOST_AUTO(p, &x::m_v);
|
||||
x xx;
|
||||
(xx.*p).push_back(1);
|
||||
}
|
||||
#pragma message("ODR")
|
||||
|
||||
void odr_test1();
|
||||
void odr_test2();
|
||||
odr_test1();
|
||||
odr_test2();
|
||||
|
||||
#pragma message("done!")
|
||||
}
|
||||
|
60
test/compliant/test_compliant.cpp
Executable file
60
test/compliant/test_compliant.cpp
Executable file
@ -0,0 +1,60 @@
|
||||
#include <boost/typeof/typeof.hpp>
|
||||
|
||||
#include "spirit/register.hpp"
|
||||
#include "lambda/register.hpp"
|
||||
#include <libs/typeof/test/stl/register.hpp>
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
|
||||
#pragma message("compiling Lambda example...")
|
||||
void test_lambda()
|
||||
{
|
||||
using namespace boost::lambda;
|
||||
|
||||
BOOST_AUTO(fun, _1 > 15 && _2 < 20);
|
||||
int n = 19;
|
||||
//assert(fun(n, n));
|
||||
|
||||
std::cout << typeid(fun).name() << std::endl;
|
||||
}
|
||||
|
||||
#pragma message("compiling Spirit example...")
|
||||
void test_spirit1()
|
||||
{
|
||||
using namespace boost::spirit;
|
||||
using namespace boost::lambda;
|
||||
using namespace std;
|
||||
|
||||
vector<double> v;
|
||||
|
||||
BOOST_AUTO(parser,
|
||||
(real_p[push_back_a(v)] >> *(',' >> real_p[push_back_a(v)]))
|
||||
);
|
||||
|
||||
parse("3.14159, 2.71828", parser, space_p);
|
||||
|
||||
for_each(v.begin(), v.end(), cout << _1 << ' ');
|
||||
cout << endl;
|
||||
}
|
||||
|
||||
#pragma message("compiling another Spirit example...")
|
||||
void test_spirit2()
|
||||
{
|
||||
using namespace boost::spirit;
|
||||
|
||||
BOOST_AUTO(
|
||||
skipper,
|
||||
( space_p
|
||||
| "//" >> *(anychar_p - '\n') >> '\n'
|
||||
| "/*" >> *(anychar_p - "*/") >> "*/"
|
||||
)
|
||||
);
|
||||
|
||||
bool success = parse(
|
||||
"/*this is a comment*/\n//this is a c++ comment\n\n",
|
||||
*skipper).full;
|
||||
|
||||
//assert(success);
|
||||
}
|
||||
|
||||
|
@ -1,33 +0,0 @@
|
||||
// Copyright (C) 2004 Arkadiy Vertleyb
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#ifndef TYPEID_HPP_INCLUDED
|
||||
#define TYPEID_HPP_INCLUDED
|
||||
|
||||
#include <string>
|
||||
|
||||
template<class T> struct type_id
|
||||
{
|
||||
static std::string name()
|
||||
{
|
||||
return typeid(T).name();
|
||||
}
|
||||
};
|
||||
template<class T> struct type_id<T&>
|
||||
{
|
||||
static std::string name()
|
||||
{
|
||||
return type_id<T>::name() + "&";
|
||||
}
|
||||
};
|
||||
template<class T> struct type_id<const T>
|
||||
{
|
||||
static std::string name()
|
||||
{
|
||||
return std::string("const ") + type_id<T>::name();
|
||||
}
|
||||
};
|
||||
|
||||
#endif//TYPEID_HPP_INCLUDED
|
||||
|
@ -115,7 +115,7 @@
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath=".\main.cpp">
|
||||
RelativePath="..\main.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\odr1.cpp">
|
||||
@ -123,6 +123,9 @@
|
||||
<File
|
||||
RelativePath=".\odr2.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\test_compliant.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
@ -201,14 +204,14 @@
|
||||
Name="stl"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath=".\stl\register.hpp">
|
||||
RelativePath="..\stl\register.hpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="mpl"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath=".\mpl\register.hpp">
|
||||
RelativePath="..\mpl\register.hpp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
|
@ -1,2 +1,2 @@
|
||||
g++ -IC:\boost\boost_1_32_0 -I..\..\..\.. -D BOOST_TYPEOF_COMPLIANT -D BOOST_TYPEOF_LIMIT_SIZE=50 -D BOOST_MPL_LIMIT_VECTOR_SIZE=50 odr1.cpp odr2.cpp main.cpp
|
||||
g++ -IC:\boost\boost_1_32_0 -I..\..\..\.. odr1.cpp odr2.cpp main.cpp
|
||||
g++ -IC:\boost\boost_1_32_0 -I..\..\..\.. -D BOOST_TYPEOF_COMPLIANT -D BOOST_TYPEOF_LIMIT_SIZE=50 -D BOOST_MPL_LIMIT_VECTOR_SIZE=50 odr1.cpp odr2.cpp test_compliant.cpp ..\main.cpp
|
||||
g++ -IC:\boost\boost_1_32_0 -I..\..\..\.. odr1.cpp odr2.cpp test_compliant.cpp ..\main.cpp
|
||||
|
139
test/main.cpp
Executable file
139
test/main.cpp
Executable file
@ -0,0 +1,139 @@
|
||||
// Copyright (C) 2004 Arkadiy Vertleyb
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#pragma message("including typeof.hpp...")
|
||||
#include <boost/typeof/typeof.hpp>
|
||||
#pragma message("done")
|
||||
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <boost/type_traits/remove_reference.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/noncopyable.hpp>
|
||||
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
#include "stl/register.hpp"
|
||||
#include "mpl/register.hpp"
|
||||
|
||||
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
|
||||
|
||||
using namespace std;
|
||||
|
||||
template<class T>
|
||||
struct typeof_test
|
||||
{
|
||||
static T foo();
|
||||
enum {value = boost::is_same<
|
||||
BOOST_TYPEOF_TPL(typeof_test::foo()), //fully qualify foo() to avoid problems with g++
|
||||
typename boost::remove_reference<typename boost::remove_const<T>::type>::type
|
||||
>::value};
|
||||
};
|
||||
|
||||
#pragma message("started")
|
||||
|
||||
struct x
|
||||
{};
|
||||
|
||||
BOOST_TYPEOF_REGISTER_TYPE(x);
|
||||
|
||||
template<class T, char c, unsigned short us,
|
||||
int i, unsigned long ul, bool b1, bool b2, unsigned u> struct with_integrals
|
||||
{};
|
||||
|
||||
BOOST_TYPEOF_REGISTER_TEMPLATE_X(with_integrals,
|
||||
(class)
|
||||
(char)
|
||||
(unsigned short)
|
||||
(int)
|
||||
(unsigned long)
|
||||
(bool)
|
||||
(bool)
|
||||
(unsigned)
|
||||
);
|
||||
|
||||
#pragma message("integral...")
|
||||
BOOST_STATIC_ASSERT((typeof_test<with_integrals<int, 5, 4, 3, 2, true, false, 5> >::value));
|
||||
BOOST_STATIC_ASSERT((typeof_test<with_integrals<int, 1, 1, 0, ULONG_MAX, false, true, 0> >::value));
|
||||
|
||||
#pragma message("namespace-level functions...")
|
||||
BOOST_STATIC_ASSERT(typeof_test<double(*)()>::value);
|
||||
BOOST_STATIC_ASSERT(typeof_test<double(*)(int, double, short, char*, bool, char, float, long, unsigned short)>::value);
|
||||
BOOST_STATIC_ASSERT(typeof_test<void(*)()>::value);
|
||||
BOOST_STATIC_ASSERT(typeof_test<void(*)(int, double, short, char*, bool, char, float, long, unsigned short)>::value);
|
||||
|
||||
#pragma message("member functions...")
|
||||
BOOST_STATIC_ASSERT(typeof_test<double(x::*)()>::value);
|
||||
BOOST_STATIC_ASSERT(typeof_test<double(x::*)(int, double, short, char*, bool, char, float, long, unsigned short)>::value);
|
||||
BOOST_STATIC_ASSERT(typeof_test<void(x::*)()>::value);
|
||||
BOOST_STATIC_ASSERT(typeof_test<void(x::*)(int, double, short, char*, bool, char, float, long, unsigned short)>::value);
|
||||
BOOST_STATIC_ASSERT(typeof_test<double(x::*)()const>::value);
|
||||
BOOST_STATIC_ASSERT(typeof_test<double(x::*)()volatile>::value);
|
||||
BOOST_STATIC_ASSERT(typeof_test<double(x::*)()volatile const>::value);
|
||||
//BOOST_STATIC_ASSERT(typeof_test<static double(x::*)()volatile const>::value);
|
||||
|
||||
#pragma message("data members...")
|
||||
BOOST_STATIC_ASSERT(typeof_test<double x::*>::value);
|
||||
|
||||
#pragma message("modifiers...")
|
||||
BOOST_STATIC_ASSERT((typeof_test<boost::mpl::vector3<const int* const, const int[20], const int&>*>::value));
|
||||
BOOST_STATIC_ASSERT((typeof_test<boost::mpl::vector2<const int* const, const int&>&>::value));
|
||||
BOOST_STATIC_ASSERT((typeof_test<boost::mpl::vector1<int[5]> >::value));
|
||||
BOOST_STATIC_ASSERT((typeof_test<boost::mpl::vector1<const int[5]> >::value));
|
||||
|
||||
#pragma message("Lvalue test...")
|
||||
void lvalue_typeof_test()
|
||||
{
|
||||
int n;
|
||||
const int cn = 0;
|
||||
int& rn = n;
|
||||
const int& rcn = cn;
|
||||
int f();
|
||||
//const int cf();
|
||||
int& rf();
|
||||
const int& rcf();
|
||||
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(n), int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(cn), const int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(rn), int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(rcn), const int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(f()), int>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(rf()), int&>::value));
|
||||
BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(rcf()), const int&>::value));
|
||||
//BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(cf()), const int&>::value));
|
||||
//BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(21), int>::value));
|
||||
//BOOST_STATIC_ASSERT((boost::is_same<BOOST_LVALUE_TYPEOF(int(21)), int>::value));
|
||||
}
|
||||
|
||||
#pragma message("Noncopyable...")
|
||||
|
||||
BOOST_TYPEOF_REGISTER_TYPE(boost::noncopyable);
|
||||
|
||||
struct noncopiable_test
|
||||
{
|
||||
const boost::noncopyable& foo();
|
||||
void bar()
|
||||
{
|
||||
BOOST_AUTO(const& v, foo());
|
||||
}
|
||||
};
|
||||
|
||||
#pragma message("ODR...")
|
||||
void odr_test()
|
||||
{
|
||||
void odr_test1();
|
||||
void odr_test2();
|
||||
odr_test1();
|
||||
odr_test2();
|
||||
}
|
||||
|
||||
#pragma message("main()...")
|
||||
main()
|
||||
{
|
||||
odr_test();
|
||||
}
|
||||
|
||||
#pragma message("done!")
|
Reference in New Issue
Block a user