mirror of
https://github.com/boostorg/fusion.git
synced 2025-07-16 05:42:20 +02:00
Fusion: ADAPT_xxxADTxxx; documentation&new testcase
[SVN r65816]
This commit is contained in:
188
test/sequence/adt_attribute_proxy.cpp
Normal file
188
test/sequence/adt_attribute_proxy.cpp
Normal file
@ -0,0 +1,188 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2010 Christopher Schmidt
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
==============================================================================*/
|
||||
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <boost/fusion/adapted/adt/adapt_assoc_adt.hpp>
|
||||
#include <boost/fusion/sequence.hpp>
|
||||
#include <boost/mpl/assert.hpp>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
namespace fusion=boost::fusion;
|
||||
|
||||
template<typename Name, typename Age>
|
||||
struct employee
|
||||
{
|
||||
private:
|
||||
Name name;
|
||||
Age age;
|
||||
|
||||
public:
|
||||
template<typename OtherName>
|
||||
void
|
||||
set_name(OtherName const& n)
|
||||
{
|
||||
name=n;
|
||||
}
|
||||
|
||||
template<typename OtherAge>
|
||||
void
|
||||
set_age(OtherAge const& a)
|
||||
{
|
||||
age=a;
|
||||
}
|
||||
|
||||
Name& get_name()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
Name const& get_name()const
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
Age& get_age()
|
||||
{
|
||||
return age;
|
||||
}
|
||||
|
||||
Age const& get_age()const
|
||||
{
|
||||
return age;
|
||||
}
|
||||
};
|
||||
|
||||
namespace keys
|
||||
{
|
||||
struct name;
|
||||
struct age;
|
||||
}
|
||||
|
||||
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
|
||||
(Name)(Age),
|
||||
(employee) (Name)(Age),
|
||||
(Name&, Name const&, obj.get_name(), obj.template set_name<Val>(val), keys::name)
|
||||
(Age&, Age const&, obj.get_age(), obj.template set_age<Val>(val), keys::age))
|
||||
|
||||
int main()
|
||||
{
|
||||
typedef employee<std::string, int> et;
|
||||
typedef et const etc;
|
||||
et e;
|
||||
etc& ec=e;
|
||||
|
||||
fusion::at_key<keys::name>(e)="marshall mathers";
|
||||
fusion::at_key<keys::age>(e)=37;
|
||||
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::value_at_key<et, keys::name>::type,
|
||||
std::string
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::value_at_key<et, keys::name>::type,
|
||||
fusion::result_of::value_at_c<et, 0>::type
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::value_at_key<et, keys::age>::type,
|
||||
int
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::value_at_key<et, keys::age>::type,
|
||||
fusion::result_of::value_at_c<et, 1>::type
|
||||
>));
|
||||
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::at_key<et, keys::name>::type,
|
||||
fusion::extension::adt_attribute_proxy<et, 0, false>
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::at_key<et, keys::age>::type,
|
||||
fusion::extension::adt_attribute_proxy<et, 1, false>
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::at_key<et, keys::name>::type,
|
||||
fusion::result_of::front<et>::type
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::at_key<et, keys::age>::type,
|
||||
fusion::result_of::back<et>::type
|
||||
>));
|
||||
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::at_key<etc, keys::name>::type,
|
||||
fusion::extension::adt_attribute_proxy<et, 0, true>
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::at_key<etc, keys::age>::type,
|
||||
fusion::extension::adt_attribute_proxy<et, 1, true>
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::at_key<etc, keys::name>::type,
|
||||
fusion::result_of::front<etc>::type
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::result_of::at_key<etc, keys::age>::type,
|
||||
fusion::result_of::back<etc>::type
|
||||
>));
|
||||
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::extension::adt_attribute_proxy<et, 0, false>::type,
|
||||
std::string&
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::extension::adt_attribute_proxy<et, 0, true>::type,
|
||||
std::string const&
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::extension::adt_attribute_proxy<et, 1, false>::type,
|
||||
int&
|
||||
>));
|
||||
BOOST_MPL_ASSERT((
|
||||
boost::is_same<
|
||||
fusion::extension::adt_attribute_proxy<et, 1, true>::type,
|
||||
int const&
|
||||
>));
|
||||
|
||||
{
|
||||
std::string& name=fusion::at_key<keys::name>(e);
|
||||
int& age=fusion::at_key<keys::age>(e);
|
||||
BOOST_TEST(name=="marshall mathers");
|
||||
BOOST_TEST(age==37);
|
||||
BOOST_TEST(fusion::at_key<keys::name>(e).get()=="marshall mathers");
|
||||
BOOST_TEST(fusion::at_key<keys::age>(e).get()==37);
|
||||
BOOST_TEST(fusion::front(e).get()=="marshall mathers");
|
||||
BOOST_TEST(fusion::back(e).get()==37);
|
||||
}
|
||||
|
||||
{
|
||||
std::string const& name=fusion::at_key<keys::name>(ec);
|
||||
int const& age=fusion::at_key<keys::age>(ec);
|
||||
BOOST_TEST(name=="marshall mathers");
|
||||
BOOST_TEST(age==37);
|
||||
BOOST_TEST(fusion::at_key<keys::name>(ec).get()=="marshall mathers");
|
||||
BOOST_TEST(fusion::at_key<keys::age>(ec).get()==37);
|
||||
BOOST_TEST(fusion::front(ec).get()=="marshall mathers");
|
||||
BOOST_TEST(fusion::back(ec).get()==37);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user