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/concept_check.hpp>
15 #include <boost/property_map/property_map.hpp>
16 #include <boost/test/minimal.hpp>
17 #include <boost/static_assert.hpp>
20 struct add1
{typedef T result_type
; T
operator()(const T
& x
) const {return x
+ 1;}};
23 struct add1_val
{typedef T result_type
; T
operator()(T x
) const {return x
+ 1;}};
26 struct return_fixed_ref
{
28 return_fixed_ref(int* ptr
): ptr(ptr
) {}
29 typedef int& result_type
;
30 int& operator()(const T
&) const {return *ptr
;}
33 int test_main(int, char**) {
34 using namespace boost
;
35 function_requires
<ReadablePropertyMapConcept
<function_property_map
<add1
<int>, int>, int> >();
36 function_requires
<ReadablePropertyMapConcept
<function_property_map
<add1
<int>, int, double>, int> >();
37 function_requires
<ReadablePropertyMapConcept
<function_property_map
<add1_val
<int>, int>, int> >();
38 function_requires
<ReadablePropertyMapConcept
<function_property_map
<add1_val
<int>, int, double>, int> >();
39 function_requires
<ReadablePropertyMapConcept
<function_property_map
<return_fixed_ref
<int>, int>, int> >();
40 function_requires
<WritablePropertyMapConcept
<function_property_map
<return_fixed_ref
<int>, int>, int> >();
41 function_requires
<ReadWritePropertyMapConcept
<function_property_map
<return_fixed_ref
<int>, int>, int> >();
42 function_requires
<LvaluePropertyMapConcept
<function_property_map
<return_fixed_ref
<int>, int>, int> >();
44 BOOST_STATIC_ASSERT((boost::is_same
<boost::property_traits
<function_property_map
<add1
<int>, int> >::category
, boost::readable_property_map_tag
>::value
));
45 BOOST_STATIC_ASSERT((boost::is_same
<boost::property_traits
<function_property_map
<add1_val
<int>, int> >::category
, boost::readable_property_map_tag
>::value
));
46 BOOST_STATIC_ASSERT((boost::is_same
<boost::property_traits
<function_property_map
<return_fixed_ref
<int>, int> >::category
, boost::lvalue_property_map_tag
>::value
));
48 BOOST_CHECK(get(function_property_map
<add1
<int>, int>(), 3) == 4);
49 BOOST_CHECK(get(function_property_map
<add1
<int>, int>(add1
<int>()), 4) == 5);
50 BOOST_CHECK(get(make_function_property_map
<int>(add1
<int>()), 5) == 6);
51 BOOST_CHECK(get(function_property_map
<add1_val
<int>, int>(), 3) == 4);
52 BOOST_CHECK(get(function_property_map
<add1_val
<int>, int>(add1_val
<int>()), 4) == 5);
53 BOOST_CHECK(get(make_function_property_map
<int>(add1_val
<int>()), 5) == 6);
55 const function_property_map
<return_fixed_ref
<int>, int> pm
= return_fixed_ref
<int>((&val
));
57 BOOST_CHECK(get(pm
, 2) == 6);
58 BOOST_CHECK((get(pm
, 3) = 7) == 7);
59 BOOST_CHECK(get(pm
, 4) == 7);
60 const function_property_map
<return_fixed_ref
<int>, int> pm2
= pm
; // Check shallow copying
61 BOOST_CHECK(get(pm2
, 5) == 7);
63 BOOST_CHECK(get(pm
, 1) == 1);