1//
2//=======================================================================
3// Author: Jeremiah Willcock
4//
5// Copyright 2012, Trustees of Indiana University
6//
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//=======================================================================
11//
12
13#include <boost/property_map/function_property_map.hpp>
14#include <boost/property_map/transform_value_property_map.hpp>
15#include <boost/concept/assert.hpp>
16#include <boost/property_map/property_map.hpp>
17#include <boost/core/lightweight_test.hpp>
18#include <boost/static_assert.hpp>
19
20// Ensure this is not default constructible
21struct times2 {typedef int result_type; times2(int) {}; int operator()(int x) const {return 2 * x;}};
22
23template <typename T>
24struct add1 {typedef T result_type; T operator()(const T& x) const {return x + 1;}};
25
26template <typename T>
27struct add1_val {typedef T result_type; T operator()(T x) const {return x + 1;}};
28
29template <typename T>
30struct return_fixed_ref {
31 int* ptr;
32 return_fixed_ref(int* ptr): ptr(ptr) {}
33 typedef int& result_type;
34 int& operator()(const T&) const {return *ptr;}
35};
36
37int main() {
38 using namespace boost;
39 typedef function_property_map<times2, int> PM;
40 PM orig_pm(times2(0));
41 BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<transform_value_property_map<add1<int>, PM>, int>));
42 BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<transform_value_property_map<add1<int>, PM, double>, int>));
43 BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<transform_value_property_map<add1_val<int>, PM>, int>));
44 BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<transform_value_property_map<add1_val<int>, PM, double>, int>));
45 BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<transform_value_property_map<return_fixed_ref<int>, PM>, int>));
46 BOOST_CONCEPT_ASSERT((WritablePropertyMapConcept<transform_value_property_map<return_fixed_ref<int>, PM>, int>));
47 BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<transform_value_property_map<return_fixed_ref<int>, PM>, int>));
48 BOOST_CONCEPT_ASSERT((LvaluePropertyMapConcept<transform_value_property_map<return_fixed_ref<int>, PM>, int>));
49
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));
53
54 BOOST_TEST(get(transform_value_property_map<add1<int>, PM>(add1<int>(), orig_pm), 3) == 7);
55 BOOST_TEST(get(transform_value_property_map<add1<int>, PM>(add1<int>(), orig_pm), 4) == 9);
56 BOOST_TEST(get(make_transform_value_property_map(add1<int>(), orig_pm), 5) == 11);
57 BOOST_TEST(get(transform_value_property_map<add1_val<int>, PM>(add1_val<int>(), orig_pm), 3) == 7);
58 BOOST_TEST(get(transform_value_property_map<add1_val<int>, PM>(add1_val<int>(), orig_pm), 4) == 9);
59 BOOST_TEST(get(make_transform_value_property_map<int>(add1_val<int>(), orig_pm), 5) == 11);
60 int val;
61 const transform_value_property_map<return_fixed_ref<int>, PM> pm(return_fixed_ref<int>((&val)), orig_pm);
62 put(pa: pm, k: 1, v: 6);
63 BOOST_TEST(get(pm, 2) == 6);
64 BOOST_TEST((get(pm, 3) = 7) == 7);
65 BOOST_TEST(get(pm, 4) == 7);
66 const transform_value_property_map<return_fixed_ref<int>, PM> pm2 = pm; // Check shallow copying
67 BOOST_TEST(get(pm2, 5) == 7);
68 put(pa: pm2, k: 3, v: 1);
69 BOOST_TEST(get(pm, 1) == 1);
70
71 return boost::report_errors();
72}
73

source code of boost/libs/property_map/test/transform_value_property_map_test.cpp