mirror of
https://github.com/boostorg/fusion.git
synced 2025-07-24 01:27:37 +02:00
Merge remote-tracking branch 'origin/develop' into feature/sfinae-friendly-result_of
This commit is contained in:
@ -38,18 +38,21 @@ namespace ns
|
||||
{
|
||||
public:
|
||||
|
||||
point() : x(0), y(0) {}
|
||||
point(int in_x, int in_y) : x(in_x), y(in_y) {}
|
||||
point() : x(0), y(0), z(0) {}
|
||||
point(int in_x, int in_y, int in_z) : x(in_x), y(in_y), z(in_z) {}
|
||||
|
||||
int get_x() const { return x; }
|
||||
int get_y() const { return y; }
|
||||
int get_z() const { return z; }
|
||||
void set_x(int x_) { x = x_; }
|
||||
void set_y(int y_) { y = y_; }
|
||||
void set_z(int z_) { z = z_; }
|
||||
|
||||
private:
|
||||
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
|
||||
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
@ -58,17 +61,22 @@ namespace ns
|
||||
friend struct boost::fusion::extension::access;
|
||||
|
||||
public:
|
||||
point_with_private_members() : x(0), y(0) {}
|
||||
point_with_private_members(int x, int y) : x(x), y(y) {}
|
||||
|
||||
private:
|
||||
point_with_private_members() : x(0), y(0), z(0) {}
|
||||
point_with_private_members(int in_x, int in_y, int in_z)
|
||||
: x(in_x), y(in_y), z(in_z) {}
|
||||
|
||||
int get_x() const { return x; }
|
||||
int get_y() const { return y; }
|
||||
int get_z() const { return z; }
|
||||
void set_x(int x_) { x = x_; }
|
||||
void set_y(int y_) { y = y_; }
|
||||
|
||||
void set_z(int z_) { z = z_; }
|
||||
|
||||
private:
|
||||
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -91,26 +99,56 @@ namespace ns
|
||||
};
|
||||
}
|
||||
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
ns::point,
|
||||
(int, int, obj.get_x(), obj.set_x(val))
|
||||
(int, int, obj.get_y(), obj.set_y(val))
|
||||
)
|
||||
#if BOOST_PP_VARIADICS
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
ns::point,
|
||||
(int, int, obj.get_x(), obj.set_x(val))
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_y(), obj.set_y(val))
|
||||
(obj.get_z(), obj.set_z(val))
|
||||
)
|
||||
|
||||
# if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
ns::point_with_private_members,
|
||||
(obj.get_x(), obj.set_x(val))
|
||||
(obj.get_y(), obj.set_y(val))
|
||||
(obj.get_z(), obj.set_z(val))
|
||||
)
|
||||
# endif
|
||||
|
||||
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
ns::name,
|
||||
(obj.get_last(), obj.set_last(val))
|
||||
(obj.get_first(), obj.set_first(val))
|
||||
)
|
||||
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
ns::point,
|
||||
(int, int, obj.get_x(), obj.set_x(val))
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_y(), obj.set_y(val))
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val))
|
||||
)
|
||||
|
||||
# if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
ns::point_with_private_members,
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_x(), obj.set_x(val))
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_y(), obj.set_y(val))
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val))
|
||||
)
|
||||
# endif
|
||||
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
ns::name,
|
||||
(const std::string&, const std::string&, obj.get_last(), obj.set_last(val))
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_first(), obj.set_first(val))
|
||||
)
|
||||
|
||||
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
ns::point_with_private_members,
|
||||
(int, int, obj.get_x(), obj.set_x(val))
|
||||
(int, int, obj.get_y(), obj.set_y(val))
|
||||
)
|
||||
#endif
|
||||
|
||||
BOOST_FUSION_ADAPT_ADT(
|
||||
ns::name,
|
||||
(const std::string&, const std::string&, obj.get_last(), obj.set_last(val))
|
||||
(const std::string&, const std::string&, obj.get_first(), obj.set_first(val))
|
||||
)
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
@ -123,28 +161,30 @@ main()
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point>));
|
||||
ns::point p(123, 456);
|
||||
ns::point p(123, 456, 789);
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
fusion::vector<int, float> v1(4, 2);
|
||||
ns::point v2(5, 3);
|
||||
fusion::vector<long, double> v3(5, 4);
|
||||
fusion::vector<int, float, int> v1(4, 2, 2);
|
||||
ns::point v2(5, 3, 3);
|
||||
fusion::vector<long, double, int> v3(5, 4, 4);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -171,15 +211,15 @@ main()
|
||||
|
||||
{
|
||||
// conversion from ns::point to vector
|
||||
ns::point p(5, 3);
|
||||
fusion::vector<int, long> v(p);
|
||||
ns::point p(5, 3, 3);
|
||||
fusion::vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from ns::point to list
|
||||
ns::point p(5, 3);
|
||||
fusion::list<int, long> l(p);
|
||||
ns::point p(5, 3, 3);
|
||||
fusion::list<int, long, int> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
||||
@ -193,26 +233,29 @@ main()
|
||||
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
{
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point_with_private_members>));
|
||||
ns::point_with_private_members p(123, 456);
|
||||
ns::point_with_private_members p(123, 456, 789);
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point_with_private_members>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point_with_private_members>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point_with_private_members>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
// Check types provided in case it's provided
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
boost::fusion::result_of::front<ns::point>::type,
|
||||
@ -233,6 +276,28 @@ main()
|
||||
boost::fusion::result_of::front<ns::point const>::type::type,
|
||||
int
|
||||
>));
|
||||
|
||||
// Check types provided in case it's deduced
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
boost::fusion::result_of::back<ns::point>::type,
|
||||
boost::fusion::extension::adt_attribute_proxy<ns::point,2,false>
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
boost::fusion::result_of::back<ns::point>::type::type,
|
||||
int
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
boost::fusion::result_of::back<ns::point const>::type,
|
||||
boost::fusion::extension::adt_attribute_proxy<ns::point,2,true>
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
boost::fusion::result_of::back<ns::point const>::type::type,
|
||||
const int
|
||||
>));
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
|
@ -37,28 +37,46 @@ namespace ns
|
||||
{
|
||||
public:
|
||||
|
||||
point() : x(0), y(0) {}
|
||||
point(int in_x, int in_y) : x(in_x), y(in_y) {}
|
||||
point() : x(0), y(0), z(0) {}
|
||||
point(int in_x, int in_y, int in_z) : x(in_x), y(in_y), z(in_z) {}
|
||||
|
||||
int get_x() const { return x; }
|
||||
int get_y() const { return y; }
|
||||
int get_z() const { return z; }
|
||||
void set_x(int x_) { x = x_; }
|
||||
void set_y(int y_) { y = y_; }
|
||||
void set_z(int z_) { z = z_; }
|
||||
|
||||
private:
|
||||
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
}
|
||||
|
||||
#if BOOST_PP_VARIADICS
|
||||
|
||||
// this creates a fusion view: boost::fusion::adapted::point
|
||||
BOOST_FUSION_ADAPT_ADT_NAMED(
|
||||
ns::point, point,
|
||||
(int, int, obj.obj.get_x(), obj.obj.set_x(val))
|
||||
(int, int, obj.obj.get_y(), obj.obj.set_y(val))
|
||||
(int, int, obj.get_x(), obj.set_x(val))
|
||||
(int, int, obj.get_y(), obj.set_y(val))
|
||||
(obj.get_z(), obj.set_z(val))
|
||||
)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
// this creates a fusion view: boost::fusion::adapted::point
|
||||
BOOST_FUSION_ADAPT_ADT_NAMED(
|
||||
ns::point, point,
|
||||
(int, int, obj.get_x(), obj.set_x(val))
|
||||
(int, int, obj.get_y(), obj.set_y(val))
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val))
|
||||
)
|
||||
|
||||
#endif // BOOST_PP_VARIADICS
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
@ -71,31 +89,33 @@ main()
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT((traits::is_view<adapted::point>));
|
||||
ns::point basep(123, 456);
|
||||
ns::point basep(123, 456, 789);
|
||||
adapted::point p(basep);
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<adapted::point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<adapted::point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<adapted::point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
fusion::vector<int, float> v1(4, 2);
|
||||
ns::point basep(5, 3);
|
||||
fusion::vector<int, float, int> v1(4, 2, 2);
|
||||
ns::point basep(5, 3, 3);
|
||||
adapted::point v2(basep);
|
||||
|
||||
fusion::vector<long, double> v3(5, 4);
|
||||
fusion::vector<long, double, int> v3(5, 4, 4);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -108,19 +128,19 @@ main()
|
||||
|
||||
{
|
||||
// conversion from ns::point to vector
|
||||
ns::point basep(5, 3);
|
||||
ns::point basep(5, 3, 3);
|
||||
adapted::point p(basep);
|
||||
|
||||
fusion::vector<int, long> v(p);
|
||||
fusion::vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from ns::point to list
|
||||
ns::point basep(5, 3);
|
||||
ns::point basep(5, 3, 3);
|
||||
adapted::point p(basep);
|
||||
|
||||
fusion::list<int, long> l(p);
|
||||
fusion::list<int, long, float> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
||||
|
@ -26,31 +26,50 @@ namespace ns
|
||||
struct y_member;
|
||||
struct z_member;
|
||||
|
||||
struct non_member;
|
||||
|
||||
class point
|
||||
{
|
||||
public:
|
||||
|
||||
point() : x(0), y(0) {}
|
||||
point(int in_x, int in_y) : x(in_x), y(in_y) {}
|
||||
point() : x(0), y(0), z(0) {}
|
||||
point(int in_x, int in_y, int in_z) : x(in_x), y(in_y), z(in_z) {}
|
||||
|
||||
int get_x() const { return x; }
|
||||
int get_y() const { return y; }
|
||||
int get_z() const { return z; }
|
||||
void set_x(int x_) { x = x_; }
|
||||
void set_y(int y_) { y = y_; }
|
||||
void set_z(int z_) { z = z_; }
|
||||
|
||||
private:
|
||||
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
}
|
||||
|
||||
#if BOOST_PP_VARIADICS
|
||||
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT(
|
||||
ns::point,
|
||||
(int, int, obj.get_x(), obj.set_x(val), ns::x_member)
|
||||
(int, int, obj.get_y(), obj.set_y(val), ns::y_member)
|
||||
(obj.get_z(), obj.set_z(val), ns::z_member)
|
||||
)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT(
|
||||
ns::point,
|
||||
(int, int, obj.get_x(), obj.set_x(val), ns::x_member)
|
||||
(int, int, obj.get_y(), obj.set_y(val), ns::y_member)
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val), ns::z_member)
|
||||
)
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
@ -62,28 +81,30 @@ main()
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point>));
|
||||
ns::point p(123, 456);
|
||||
ns::point p(123, 456, 789);
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
boost::fusion::vector<int, float> v1(4, 2);
|
||||
ns::point v2(5, 3);
|
||||
boost::fusion::vector<long, double> v3(5, 4);
|
||||
boost::fusion::vector<int, float, int> v1(4, 2, 2);
|
||||
ns::point v2(5, 3, 3);
|
||||
boost::fusion::vector<long, double, int> v3(5, 4, 4);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -96,15 +117,15 @@ main()
|
||||
|
||||
{
|
||||
// conversion from ns::point to vector
|
||||
ns::point p(5, 3);
|
||||
boost::fusion::vector<int, long> v(p);
|
||||
ns::point p(5, 3, 3);
|
||||
boost::fusion::vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from ns::point to list
|
||||
ns::point p(5, 3);
|
||||
boost::fusion::list<int, long> l(p);
|
||||
ns::point p(5, 3, 3);
|
||||
boost::fusion::list<int, long, int> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
||||
@ -119,15 +140,19 @@ main()
|
||||
// assoc stuff
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::x_member>));
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::y_member>));
|
||||
BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<ns::point, ns::z_member> >));
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::z_member>));
|
||||
BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<ns::point, ns::non_member> >));
|
||||
|
||||
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::x_member>::type, int>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::y_member>::type, int>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::z_member>::type, int>));
|
||||
|
||||
ns::point p(5, 3);
|
||||
ns::point p(5, 3, 1);
|
||||
|
||||
BOOST_TEST(at_key<ns::x_member>(p) == 5);
|
||||
BOOST_TEST(at_key<ns::y_member>(p) == 3);
|
||||
BOOST_TEST(at_key<ns::z_member>(p) == 1);
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
|
@ -48,8 +48,8 @@ namespace ns
|
||||
BOOST_FUSION_ADAPT_ASSOC_ADT_NAMED(
|
||||
ns::point,
|
||||
point,
|
||||
(int, int, obj.obj.get_x(), obj.obj.set_x(val), ns::x_member)
|
||||
(int, int, obj.obj.get_y(), obj.obj.set_y(val), ns::y_member)
|
||||
(int, int, obj.get_x(), obj.set_x(val), ns::x_member)
|
||||
(int, int, obj.get_y(), obj.set_y(val), ns::y_member)
|
||||
)
|
||||
|
||||
int
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <boost/fusion/mpl.hpp>
|
||||
#include <boost/fusion/support/is_view.hpp>
|
||||
#include <boost/mpl/front.hpp>
|
||||
#include <boost/mpl/back.hpp>
|
||||
#include <boost/mpl/is_sequence.hpp>
|
||||
#include <boost/mpl/assert.hpp>
|
||||
#include <boost/mpl/not.hpp>
|
||||
@ -42,19 +43,33 @@ namespace ns
|
||||
struct x_member;
|
||||
struct y_member;
|
||||
struct z_member;
|
||||
struct non_member;
|
||||
|
||||
struct point
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
}
|
||||
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
|
||||
ns::point,
|
||||
(int, x, ns::x_member)
|
||||
(int, y, ns::y_member)
|
||||
)
|
||||
#if BOOST_PP_VARIADICS
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
|
||||
ns::point,
|
||||
(x, ns::x_member)
|
||||
(y, ns::y_member)
|
||||
(int, z, ns::z_member)
|
||||
)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
BOOST_FUSION_ADAPT_ASSOC_STRUCT(
|
||||
ns::point,
|
||||
(BOOST_FUSION_ADAPT_AUTO, x, ns::x_member)
|
||||
(BOOST_FUSION_ADAPT_AUTO, y, ns::y_member)
|
||||
(int, z, ns::z_member)
|
||||
)
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
main()
|
||||
@ -68,28 +83,30 @@ main()
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point>));
|
||||
ns::point p = {123, 456};
|
||||
ns::point p = {123, 456, 789};
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
fusion::vector<int, float> v1(4, 2);
|
||||
ns::point v2 = {5, 3};
|
||||
fusion::vector<long, double> v3(5, 4);
|
||||
fusion::vector<int, float, int> v1(4, 2, 2);
|
||||
ns::point v2 = {5, 3, 3};
|
||||
fusion::vector<long, double, int> v3(5, 4, 4);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -102,15 +119,15 @@ main()
|
||||
|
||||
{
|
||||
// conversion from ns::point to vector
|
||||
ns::point p = {5, 3};
|
||||
fusion::vector<int, long> v(p);
|
||||
ns::point p = {5, 3, 3};
|
||||
fusion::vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from ns::point to list
|
||||
ns::point p = {5, 3};
|
||||
fusion::list<int, long> l(p);
|
||||
ns::point p = {5, 3, 3};
|
||||
fusion::list<int, long, int> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
||||
@ -118,15 +135,18 @@ main()
|
||||
// assoc stuff
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::x_member>));
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::y_member>));
|
||||
BOOST_MPL_ASSERT((mpl::not_<boost::fusion::result_of::has_key<ns::point, ns::z_member> >));
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<ns::point, ns::z_member>));
|
||||
BOOST_MPL_ASSERT((mpl::not_<boost::fusion::result_of::has_key<ns::point, ns::non_member> >));
|
||||
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::x_member>::type, int>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::y_member>::type, int>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<ns::point, ns::z_member>::type, int>));
|
||||
|
||||
ns::point p = {5, 3};
|
||||
ns::point p = {5, 3, 9};
|
||||
|
||||
BOOST_TEST(at_key<ns::x_member>(p) == 5);
|
||||
BOOST_TEST(at_key<ns::y_member>(p) == 3);
|
||||
BOOST_TEST(at_key<ns::z_member>(p) == 9);
|
||||
}
|
||||
|
||||
{
|
||||
@ -134,6 +154,9 @@ main()
|
||||
BOOST_MPL_ASSERT((boost::is_same<
|
||||
boost::fusion::result_of::value_at_c<ns::point,0>::type
|
||||
, mpl::front<ns::point>::type>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<
|
||||
boost::fusion::result_of::value_at_c<ns::point,2>::type
|
||||
, mpl::back<ns::point>::type>));
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
|
@ -26,39 +26,57 @@ namespace ns
|
||||
struct y_member;
|
||||
struct z_member;
|
||||
|
||||
template<typename X, typename Y>
|
||||
struct non_member;
|
||||
|
||||
template<typename X, typename Y, typename Z>
|
||||
class point
|
||||
{
|
||||
public:
|
||||
|
||||
point() : x(0), y(0) {}
|
||||
point(X in_x, Y in_y) : x(in_x), y(in_y) {}
|
||||
point() : x(0), y(0), z(0) {}
|
||||
point(X in_x, Y in_y, Z in_z) : x(in_x), y(in_y), z(in_z) {}
|
||||
|
||||
X get_x() const { return x; }
|
||||
Y get_y() const { return y; }
|
||||
Z get_z() const { return z; }
|
||||
void set_x(X x_) { x = x_; }
|
||||
void set_y(Y y_) { y = y_; }
|
||||
void set_z(Z z_) { z = z_; }
|
||||
|
||||
private:
|
||||
|
||||
X x;
|
||||
Y y;
|
||||
Z z;
|
||||
};
|
||||
}
|
||||
|
||||
#if BOOST_PP_VARIADICS
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
|
||||
(X)(Y),
|
||||
(ns::point)(X)(Y),
|
||||
(X)(Y)(Z),
|
||||
(ns::point)(X)(Y)(Z),
|
||||
(X, X, obj.get_x(), obj.set_x(val), ns::x_member)
|
||||
(Y, Y, obj.get_y(), obj.set_y(val), ns::y_member)
|
||||
(obj.get_z(), obj.set_z(val), ns::z_member)
|
||||
)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
|
||||
(X)(Y)(Z),
|
||||
(ns::point)(X)(Y)(Z),
|
||||
(X, X, obj.get_x(), obj.set_x(val), ns::x_member)
|
||||
(Y, Y, obj.get_y(), obj.set_y(val), ns::y_member)
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val), ns::z_member)
|
||||
)
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
using namespace boost::fusion;
|
||||
|
||||
typedef ns::point<int,int> point;
|
||||
typedef ns::point<int,int,long> point;
|
||||
|
||||
std::cout << tuple_open('[');
|
||||
std::cout << tuple_close(']');
|
||||
@ -66,28 +84,30 @@ main()
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
|
||||
point p(123, 456);
|
||||
point p(123, 456, 789);
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
boost::fusion::vector<int, float> v1(4, 2);
|
||||
point v2(5, 3);
|
||||
boost::fusion::vector<long, double> v3(5, 4);
|
||||
boost::fusion::vector<int, float, long> v1(4, 2, 2);
|
||||
point v2(5, 3, 3);
|
||||
boost::fusion::vector<long, double, long> v3(5, 4, 4);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -100,15 +120,15 @@ main()
|
||||
|
||||
{
|
||||
// conversion from point to vector
|
||||
point p(5, 3);
|
||||
boost::fusion::vector<int, long> v(p);
|
||||
point p(5, 3, 3);
|
||||
boost::fusion::vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from point to list
|
||||
point p(5, 3);
|
||||
boost::fusion::list<int, long> l(p);
|
||||
point p(5, 3, 3);
|
||||
boost::fusion::list<int, long, int> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
||||
@ -123,15 +143,18 @@ main()
|
||||
// assoc stuff
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::x_member>));
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::y_member>));
|
||||
BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<point, ns::z_member> >));
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::z_member>));
|
||||
BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<point, ns::non_member> >));
|
||||
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::x_member>::type, int>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::y_member>::type, int>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::z_member>::type, long>));
|
||||
|
||||
point p(5, 3);
|
||||
point p(5, 3, 1);
|
||||
|
||||
BOOST_TEST(at_key<ns::x_member>(p) == 5);
|
||||
BOOST_TEST(at_key<ns::y_member>(p) == 3);
|
||||
BOOST_TEST(at_key<ns::z_member>(p) == 1);
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
|
@ -39,27 +39,42 @@ namespace ns
|
||||
struct y_member;
|
||||
struct z_member;
|
||||
|
||||
template<typename X, typename Y>
|
||||
struct non_member;
|
||||
|
||||
template<typename X, typename Y, typename Z>
|
||||
struct point
|
||||
{
|
||||
X x;
|
||||
Y y;
|
||||
Z z;
|
||||
};
|
||||
}
|
||||
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
|
||||
(X)(Y),
|
||||
(ns::point)(X)(Y),
|
||||
(int, x, ns::x_member)
|
||||
(int, y, ns::y_member)
|
||||
)
|
||||
#if BOOST_PP_VARIADICS
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
|
||||
(X)(Y)(Z),
|
||||
(ns::point)(X)(Y)(Z),
|
||||
(int, x, ns::x_member)
|
||||
(Y, y, ns::y_member)
|
||||
(z, ns::z_member)
|
||||
)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_STRUCT(
|
||||
(X)(Y)(Z),
|
||||
(ns::point)(X)(Y)(Z),
|
||||
(int, x, ns::x_member)
|
||||
(Y, y, ns::y_member)
|
||||
(BOOST_FUSION_ADAPT_AUTO, z, ns::z_member)
|
||||
)
|
||||
#endif
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
using namespace boost::fusion;
|
||||
|
||||
typedef ns::point<int,int> point;
|
||||
typedef ns::point<int,int,float> point;
|
||||
|
||||
std::cout << tuple_open('[');
|
||||
std::cout << tuple_close(']');
|
||||
@ -67,28 +82,30 @@ main()
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
|
||||
point p = {123, 456};
|
||||
point p = {123, 456, 789.43f};
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789.43f));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
vector<int, float> v1(4, 2);
|
||||
point v2 = {5, 3};
|
||||
vector<long, double> v3(5, 4);
|
||||
vector<int, float, int> v1(4, 2, 2);
|
||||
point v2 = {5, 3, 3};
|
||||
vector<long, double, float> v3(5, 4, 4.13f);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -101,15 +118,15 @@ main()
|
||||
|
||||
{
|
||||
// conversion from point to vector
|
||||
point p = {5, 3};
|
||||
vector<int, long> v(p);
|
||||
point p = {5, 3, 3};
|
||||
vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from point to list
|
||||
point p = {5, 3};
|
||||
list<int, long> l(p);
|
||||
point p = {5, 3, 3};
|
||||
list<int, long, int> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
||||
@ -117,15 +134,18 @@ main()
|
||||
// assoc stuff
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::x_member>));
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::y_member>));
|
||||
BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<point, ns::z_member> >));
|
||||
BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<point, ns::z_member>));
|
||||
BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<point, ns::non_member> >));
|
||||
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::x_member>::type, int>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::y_member>::type, int>));
|
||||
BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<point, ns::z_member>::type, float>));
|
||||
|
||||
point p = {5, 3};
|
||||
point p = {5, 3, 9};
|
||||
|
||||
BOOST_TEST(at_key<ns::x_member>(p) == 5);
|
||||
BOOST_TEST(at_key<ns::y_member>(p) == 3);
|
||||
BOOST_TEST(at_key<ns::z_member>(p) == 9);
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
|
@ -38,6 +38,7 @@ namespace ns
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
|
||||
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
@ -48,9 +49,10 @@ namespace ns
|
||||
private:
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
|
||||
public:
|
||||
point_with_private_attributes(int x, int y):x(x),y(y)
|
||||
point_with_private_attributes(int x, int y, int z):x(x),y(y),z(z)
|
||||
{}
|
||||
};
|
||||
#endif
|
||||
@ -67,63 +69,99 @@ namespace ns
|
||||
};
|
||||
}
|
||||
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
ns::point,
|
||||
(int, x)
|
||||
(int, y)
|
||||
)
|
||||
#if BOOST_PP_VARIADICS
|
||||
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
ns::point,
|
||||
x,
|
||||
y,
|
||||
z
|
||||
)
|
||||
|
||||
# if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
ns::point_with_private_attributes,
|
||||
x,
|
||||
y,
|
||||
z
|
||||
)
|
||||
# endif
|
||||
|
||||
struct s { int m; };
|
||||
BOOST_FUSION_ADAPT_STRUCT(s, m)
|
||||
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
ns::bar,
|
||||
foo_.x, // test that adapted members can actually be expressions
|
||||
y
|
||||
)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
ns::point,
|
||||
(int, x)
|
||||
(int, y)
|
||||
(BOOST_FUSION_ADAPT_AUTO, z)
|
||||
)
|
||||
|
||||
# if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
ns::point_with_private_attributes,
|
||||
(int, x)
|
||||
(int, y)
|
||||
(BOOST_FUSION_ADAPT_AUTO, z)
|
||||
)
|
||||
# endif
|
||||
|
||||
struct s { int m; };
|
||||
BOOST_FUSION_ADAPT_STRUCT(s, (BOOST_FUSION_ADAPT_AUTO, m))
|
||||
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
ns::bar,
|
||||
(BOOST_FUSION_ADAPT_AUTO, foo_.x) // test that adapted members can actually be expressions
|
||||
(BOOST_FUSION_ADAPT_AUTO, y)
|
||||
)
|
||||
|
||||
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
ns::point_with_private_attributes,
|
||||
(int, x)
|
||||
(int, y)
|
||||
)
|
||||
#endif
|
||||
|
||||
struct s { int m; };
|
||||
BOOST_FUSION_ADAPT_STRUCT(s, (int, m))
|
||||
|
||||
BOOST_FUSION_ADAPT_STRUCT(
|
||||
ns::bar,
|
||||
(int, foo_.x) // test that adapted members can actually be expressions
|
||||
(int, y)
|
||||
)
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
using namespace boost::fusion;
|
||||
using namespace boost;
|
||||
using ns::point;
|
||||
|
||||
std::cout << tuple_open('[');
|
||||
std::cout << tuple_close(']');
|
||||
std::cout << tuple_delimiter(", ");
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<ns::point>));
|
||||
ns::point p = {123, 456};
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
|
||||
point p = {123, 456, 789};
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<ns::point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<ns::point>::value);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
fusion::vector<int, float> v1(4, 2);
|
||||
ns::point v2 = {5, 3};
|
||||
fusion::vector<long, double> v3(5, 4);
|
||||
vector<int, float, int> v1(4, 2, 2);
|
||||
point v2 = {5, 3, 3};
|
||||
vector<long, double, int> v3(5, 4, 4);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -135,16 +173,16 @@ main()
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from ns::point to vector
|
||||
ns::point p = {5, 3};
|
||||
fusion::vector<int, long> v(p);
|
||||
// conversion from point to vector
|
||||
point p = {5, 3, 3};
|
||||
vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from ns::point to list
|
||||
ns::point p = {5, 3};
|
||||
fusion::list<int, long> l(p);
|
||||
// conversion from point to list
|
||||
point p = {5, 3, 3};
|
||||
list<int, long, int> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
||||
@ -167,12 +205,13 @@ main()
|
||||
|
||||
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||
{
|
||||
ns::point_with_private_attributes p(123, 456);
|
||||
ns::point_with_private_attributes p(123, 456, 789);
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -37,19 +37,39 @@ namespace ns
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
};
|
||||
}
|
||||
|
||||
// this creates a fusion view: boost::fusion::adapted::point
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED(
|
||||
ns::point, point,
|
||||
(int, x)
|
||||
(int, y)
|
||||
)
|
||||
#if BOOST_PP_VARIADICS
|
||||
|
||||
// this creates a fusion view: ns1::s1
|
||||
struct s { int m; };
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(s, (ns1), s1, (int, m))
|
||||
// this creates a fusion view: boost::fusion::adapted::point
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED(
|
||||
ns::point, point,
|
||||
x,
|
||||
y,
|
||||
z
|
||||
)
|
||||
|
||||
// this creates a fusion view: ns1::s1
|
||||
struct s { int m; };
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(s, (ns1), s1, m)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
// this creates a fusion view: boost::fusion::adapted::point
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED(
|
||||
ns::point, point,
|
||||
(int, x)
|
||||
(int, y)
|
||||
(BOOST_FUSION_ADAPT_AUTO, z)
|
||||
)
|
||||
|
||||
// this creates a fusion view: ns1::s1
|
||||
struct s { int m; };
|
||||
BOOST_FUSION_ADAPT_STRUCT_NAMED_NS(s, (ns1), s1, (BOOST_FUSION_ADAPT_AUTO, m))
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
main()
|
||||
@ -63,31 +83,33 @@ main()
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT((traits::is_view<adapted::point>));
|
||||
ns::point basep = {123, 456};
|
||||
ns::point basep = {123, 456, 789};
|
||||
adapted::point p(basep);
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<adapted::point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<adapted::point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<adapted::point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
fusion::vector<int, float> v1(4, 2);
|
||||
ns::point p = {5, 3};
|
||||
fusion::vector<int, float, int> v1(4, 2, 2);
|
||||
ns::point p = {5, 3, 3};
|
||||
adapted::point v2(p);
|
||||
|
||||
fusion::vector<long, double> v3(5, 4);
|
||||
fusion::vector<long, double, int> v3(5, 4, 4);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -100,17 +122,17 @@ main()
|
||||
|
||||
{
|
||||
// conversion from adapted::point to vector
|
||||
ns::point basep = {5, 3};
|
||||
ns::point basep = {5, 3, 3};
|
||||
adapted::point p(basep);
|
||||
fusion::vector<int, long> v(p);
|
||||
fusion::vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from adapted::point to list
|
||||
ns::point basep = {5, 3};
|
||||
ns::point basep = {5, 3, 3};
|
||||
adapted::point p(basep);
|
||||
fusion::list<int, long> l(p);
|
||||
fusion::list<int, long, int> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
||||
|
@ -39,27 +39,45 @@ namespace ns
|
||||
{
|
||||
public:
|
||||
|
||||
point() : x(0), y(0) {}
|
||||
point(X x_, Y y_) : x(x_), y(y_) {}
|
||||
point() : x(0), y(0), z(0) {}
|
||||
point(X x_, Y y_, int z_) : x(x_), y(y_), z(z_) {}
|
||||
|
||||
X get_x() const { return x; }
|
||||
Y get_y() const { return y; }
|
||||
int get_z() const { return z; }
|
||||
void set_x(X x_) { x = x_; }
|
||||
void set_y(Y y_) { y = y_; }
|
||||
void set_z(int z_) { z = z_; }
|
||||
|
||||
private:
|
||||
|
||||
X x;
|
||||
Y y;
|
||||
int z;
|
||||
};
|
||||
}
|
||||
|
||||
BOOST_FUSION_ADAPT_TPL_ADT(
|
||||
(X)(Y),
|
||||
(ns::point)(X)(Y),
|
||||
(X, X, obj.get_x(), obj.set_x(val))
|
||||
(Y, Y, obj.get_y(), obj.set_y(val))
|
||||
)
|
||||
|
||||
#if BOOST_PP_VARIADICS
|
||||
|
||||
BOOST_FUSION_ADAPT_TPL_ADT(
|
||||
(X)(Y),
|
||||
(ns::point)(X)(Y),
|
||||
(X, X, obj.get_x(), obj.set_x(val))
|
||||
(Y, Y, obj.get_y(), obj.set_y(val))
|
||||
(obj.get_z(), obj.set_z(val))
|
||||
)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
BOOST_FUSION_ADAPT_TPL_ADT(
|
||||
(X)(Y),
|
||||
(ns::point)(X)(Y),
|
||||
(X, X, obj.get_x(), obj.set_x(val))
|
||||
(Y, Y, obj.get_y(), obj.set_y(val))
|
||||
(BOOST_FUSION_ADAPT_AUTO, BOOST_FUSION_ADAPT_AUTO, obj.get_z(), obj.set_z(val))
|
||||
)
|
||||
#endif
|
||||
|
||||
int
|
||||
main()
|
||||
@ -75,28 +93,30 @@ main()
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
|
||||
point p(123, 456);
|
||||
point p(123, 456, 789);
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
boost::fusion::vector<int, float> v1(4, 2);
|
||||
point v2(5, 3);
|
||||
boost::fusion::vector<long, double> v3(5, 4);
|
||||
boost::fusion::vector<int, float, int> v1(4, 2, 2);
|
||||
point v2(5, 3, 3);
|
||||
boost::fusion::vector<long, double, int> v3(5, 4, 4);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -108,9 +128,9 @@ main()
|
||||
}
|
||||
|
||||
{
|
||||
boost::fusion::vector<std::string, std::string> v1("Lincoln", "Abraham");
|
||||
name v2("Roosevelt", "Franklin");
|
||||
name v3("Roosevelt", "Theodore");
|
||||
boost::fusion::vector<std::string, std::string, int> v1("Lincoln", "Abraham", 3);
|
||||
name v2("Roosevelt", "Franklin", 3);
|
||||
name v3("Roosevelt", "Theodore", 3);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -123,15 +143,15 @@ main()
|
||||
|
||||
{
|
||||
// conversion from point to vector
|
||||
point p(5, 3);
|
||||
boost::fusion::vector<int, long> v(p);
|
||||
point p(5, 3, 3);
|
||||
boost::fusion::vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from point to list
|
||||
point p(5, 3);
|
||||
boost::fusion::list<int, long> l(p);
|
||||
point p(5, 3, 3);
|
||||
boost::fusion::list<int, long, int> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
||||
|
@ -35,19 +35,40 @@ namespace ns
|
||||
{
|
||||
X x;
|
||||
Y y;
|
||||
int z;
|
||||
};
|
||||
}
|
||||
|
||||
BOOST_FUSION_ADAPT_TPL_STRUCT(
|
||||
(X)(Y),
|
||||
(ns::point)(X)(Y),
|
||||
(X, x)
|
||||
(Y, y)
|
||||
)
|
||||
#if BOOST_PP_VARIADICS
|
||||
|
||||
BOOST_FUSION_ADAPT_TPL_STRUCT(
|
||||
(X)(Y),
|
||||
(ns::point)(X)(Y),
|
||||
x,
|
||||
(BOOST_FUSION_ADAPT_AUTO, y)
|
||||
(int, z)
|
||||
)
|
||||
|
||||
template<typename M>
|
||||
struct s { M m; };
|
||||
BOOST_FUSION_ADAPT_TPL_STRUCT((M), (s)(M), m)
|
||||
|
||||
#else // BOOST_PP_VARIADICS
|
||||
|
||||
BOOST_FUSION_ADAPT_TPL_STRUCT(
|
||||
(X)(Y),
|
||||
(ns::point)(X)(Y),
|
||||
(X, x)
|
||||
(Y, y)
|
||||
(BOOST_FUSION_ADAPT_AUTO, z)
|
||||
)
|
||||
|
||||
template<typename M>
|
||||
struct s { M m; };
|
||||
BOOST_FUSION_ADAPT_TPL_STRUCT((M), (s)(M), (BOOST_FUSION_ADAPT_AUTO, m))
|
||||
|
||||
#endif
|
||||
|
||||
template<typename M>
|
||||
struct s { M m; };
|
||||
BOOST_FUSION_ADAPT_TPL_STRUCT((M), (s)(M), (M, m))
|
||||
|
||||
int
|
||||
main()
|
||||
@ -62,28 +83,30 @@ main()
|
||||
|
||||
{
|
||||
BOOST_MPL_ASSERT_NOT((traits::is_view<point>));
|
||||
point p = {123, 456};
|
||||
point p = {123, 456, 789};
|
||||
|
||||
std::cout << at_c<0>(p) << std::endl;
|
||||
std::cout << at_c<1>(p) << std::endl;
|
||||
std::cout << at_c<2>(p) << std::endl;
|
||||
std::cout << p << std::endl;
|
||||
BOOST_TEST(p == make_vector(123, 456));
|
||||
BOOST_TEST(p == make_vector(123, 456, 789));
|
||||
|
||||
at_c<0>(p) = 6;
|
||||
at_c<1>(p) = 9;
|
||||
BOOST_TEST(p == make_vector(6, 9));
|
||||
at_c<2>(p) = 12;
|
||||
BOOST_TEST(p == make_vector(6, 9, 12));
|
||||
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 2);
|
||||
BOOST_STATIC_ASSERT(boost::fusion::result_of::size<point>::value == 3);
|
||||
BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<point>::value);
|
||||
|
||||
BOOST_TEST(front(p) == 6);
|
||||
BOOST_TEST(back(p) == 9);
|
||||
BOOST_TEST(back(p) == 12);
|
||||
}
|
||||
|
||||
{
|
||||
vector<int, float> v1(4, 2);
|
||||
point v2 = {5, 3};
|
||||
vector<long, double> v3(5, 4);
|
||||
vector<int, float, int> v1(4, 2, 2);
|
||||
point v2 = {5, 3, 3};
|
||||
vector<long, double, int> v3(5, 4, 4);
|
||||
BOOST_TEST(v1 < v2);
|
||||
BOOST_TEST(v1 <= v2);
|
||||
BOOST_TEST(v2 > v1);
|
||||
@ -96,14 +119,14 @@ main()
|
||||
|
||||
{
|
||||
// conversion from point to vector
|
||||
point p = {5, 3};
|
||||
vector<int, long> v(p);
|
||||
point p = {5, 3, 3};
|
||||
vector<int, long, int> v(p);
|
||||
v = p;
|
||||
}
|
||||
|
||||
{
|
||||
// conversion from point to list
|
||||
point p = {5, 3};
|
||||
point p = {5, 3, 3};
|
||||
list<int, long> l(p);
|
||||
l = p;
|
||||
}
|
||||
|
@ -19,7 +19,8 @@
|
||||
#include <boost/fusion/adapted/boost_array.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/fusion/adapted/boost_tuple.hpp>
|
||||
#if !defined(BOOST_NO_CXX11_HDR_TUPLE)
|
||||
#if !defined(BOOST_NO_CXX11_HDR_TUPLE) && \
|
||||
!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
#include <tuple>
|
||||
#include <boost/fusion/adapted/std_tuple.hpp>
|
||||
#endif
|
||||
@ -89,7 +90,8 @@ void test()
|
||||
check<boost::tuples::tuple<int, int, int> >();
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_TUPLE)
|
||||
#if !defined(BOOST_NO_CXX11_HDR_TUPLE) && \
|
||||
!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
{
|
||||
check<std::tuple<> >();
|
||||
check<std::tuple<int> >();
|
||||
|
@ -8,7 +8,8 @@
|
||||
|
||||
// The std_tuple_iterator adaptor only supports implementations
|
||||
// using variadic templates
|
||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
#if !defined(BOOST_NO_CXX11_HDR_TUPLE) && \
|
||||
!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
|
||||
#include <boost/fusion/adapted/std_tuple.hpp>
|
||||
|
||||
|
Reference in New Issue
Block a user