2 //=======================================================================
3 // Author: Jeremiah Willcock
5 // Copyright 2012, Trustees of Indiana University
7 // Distributed under the Boost Software License, Version 1.0. (See
8 // accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 //=======================================================================
13 #include <boost/property_map/function_property_map.hpp>
14 #include <boost/property_map/transform_value_property_map.hpp>
15 #include <boost/concept_check.hpp>
16 #include <boost/property_map/property_map.hpp>
17 #include <boost/test/minimal.hpp>
18 #include <boost/static_assert.hpp>
20 // Ensure this is not default constructible
21 struct times2
{typedef int result_type
; times2(int) {}; int operator()(int x
) const {return 2 * x
;}};
24 struct add1
{typedef T result_type
; T
operator()(const T
& x
) const {return x
+ 1;}};
27 struct add1_val
{typedef T result_type
; T
operator()(T x
) const {return x
+ 1;}};
30 struct return_fixed_ref
{
32 return_fixed_ref(int* ptr
): ptr(ptr
) {}
33 typedef int& result_type
;
34 int& operator()(const T
&) const {return *ptr
;}
37 int test_main(int, char**) {
38 using namespace boost
;
39 typedef function_property_map
<times2
, int> PM
;
40 PM
orig_pm(times2(0));
41 function_requires
<ReadablePropertyMapConcept
<transform_value_property_map
<add1
<int>, PM
>, int> >();
42 function_requires
<ReadablePropertyMapConcept
<transform_value_property_map
<add1
<int>, PM
, double>, int> >();
43 function_requires
<ReadablePropertyMapConcept
<transform_value_property_map
<add1_val
<int>, PM
>, int> >();
44 function_requires
<ReadablePropertyMapConcept
<transform_value_property_map
<add1_val
<int>, PM
, double>, int> >();
45 function_requires
<ReadablePropertyMapConcept
<transform_value_property_map
<return_fixed_ref
<int>, PM
>, int> >();
46 function_requires
<WritablePropertyMapConcept
<transform_value_property_map
<return_fixed_ref
<int>, PM
>, int> >();
47 function_requires
<ReadWritePropertyMapConcept
<transform_value_property_map
<return_fixed_ref
<int>, PM
>, int> >();
48 function_requires
<LvaluePropertyMapConcept
<transform_value_property_map
<return_fixed_ref
<int>, PM
>, int> >();
50 BOOST_STATIC_ASSERT((boost::is_same
<boost::property_traits
<transform_value_property_map
<add1
<int>, PM
> >::category
, boost::readable_property_map_tag
>::value
));
51 BOOST_STATIC_ASSERT((boost::is_same
<boost::property_traits
<transform_value_property_map
<add1_val
<int>, PM
> >::category
, boost::readable_property_map_tag
>::value
));
52 BOOST_STATIC_ASSERT((boost::is_same
<boost::property_traits
<transform_value_property_map
<return_fixed_ref
<int>, PM
> >::category
, boost::lvalue_property_map_tag
>::value
));
54 BOOST_CHECK(get(transform_value_property_map
<add1
<int>, PM
>(add1
<int>(), orig_pm
), 3) == 7);
55 BOOST_CHECK(get(transform_value_property_map
<add1
<int>, PM
>(add1
<int>(), orig_pm
), 4) == 9);
56 BOOST_CHECK(get(make_transform_value_property_map(add1
<int>(), orig_pm
), 5) == 11);
57 BOOST_CHECK(get(transform_value_property_map
<add1_val
<int>, PM
>(add1_val
<int>(), orig_pm
), 3) == 7);
58 BOOST_CHECK(get(transform_value_property_map
<add1_val
<int>, PM
>(add1_val
<int>(), orig_pm
), 4) == 9);
59 BOOST_CHECK(get(make_transform_value_property_map
<int>(add1_val
<int>(), orig_pm
), 5) == 11);
61 const transform_value_property_map
<return_fixed_ref
<int>, PM
> pm(return_fixed_ref
<int>((&val
)), orig_pm
);
63 BOOST_CHECK(get(pm
, 2) == 6);
64 BOOST_CHECK((get(pm
, 3) = 7) == 7);
65 BOOST_CHECK(get(pm
, 4) == 7);
66 const transform_value_property_map
<return_fixed_ref
<int>, PM
> pm2
= pm
; // Check shallow copying
67 BOOST_CHECK(get(pm2
, 5) == 7);
69 BOOST_CHECK(get(pm
, 1) == 1);