• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // (C) Copyright 2007-2009 Andrew Sutton
2 //
3 // Use, modification and distribution are subject to the
4 // Boost Software License, Version 1.0 (See accompanying file
5 // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
6 
7 #ifndef BOOST_GRAPH_CONSTANT_PROPERTY_HPP
8 #define BOOST_GRAPH_CONSTANT_PROPERTY_HPP
9 
10 #include <boost/property_map/property_map.hpp>
11 
12 // TODO: This should really be part of the property maps library rather than
13 // the Boost.Graph library.
14 
15 namespace boost
16 {
17 
18 /**
19  * A constant property is one, that regardless of the edge or vertex given,
20  * will always return a constant value.
21  */
22 template < typename Key, typename Value >
23 struct constant_property_map : public boost::put_get_helper< const Value&,
24                                    constant_property_map< Key, Value > >
25 {
26     typedef Key key_type;
27     typedef Value value_type;
28     typedef const Value& reference;
29     typedef boost::readable_property_map_tag category;
30 
constant_property_mapboost::constant_property_map31     constant_property_map() : m_value() {}
32 
constant_property_mapboost::constant_property_map33     constant_property_map(const value_type& value) : m_value(value) {}
34 
constant_property_mapboost::constant_property_map35     constant_property_map(const constant_property_map& copy)
36     : m_value(copy.m_value)
37     {
38     }
39 
operator []boost::constant_property_map40     inline reference operator[](const key_type&) const { return m_value; }
41 
42     value_type m_value;
43 };
44 
45 template < typename Key, typename Value >
make_constant_property(const Value & value)46 inline constant_property_map< Key, Value > make_constant_property(
47     const Value& value)
48 {
49     return constant_property_map< Key, Value >(value);
50 }
51 
52 /**
53  * Same as above, but pretends to be writable as well.
54  */
55 template < typename Key, typename Value > struct constant_writable_property_map
56 {
57     typedef Key key_type;
58     typedef Value value_type;
59     typedef Value& reference;
60     typedef boost::read_write_property_map_tag category;
61 
constant_writable_property_mapboost::constant_writable_property_map62     constant_writable_property_map() : m_value() {}
63 
constant_writable_property_mapboost::constant_writable_property_map64     constant_writable_property_map(const value_type& value) : m_value(value) {}
65 
constant_writable_property_mapboost::constant_writable_property_map66     constant_writable_property_map(const constant_writable_property_map& copy)
67     : m_value(copy.m_value)
68     {
69     }
70 
get(const constant_writable_property_map & me,Key)71     friend Value get(const constant_writable_property_map& me, Key)
72     {
73         return me.m_value;
74     }
put(const constant_writable_property_map &,Key,Value)75     friend void put(const constant_writable_property_map&, Key, Value) {}
76 
77     value_type m_value;
78 };
79 
80 template < typename Key, typename Value >
81 inline constant_writable_property_map< Key, Value >
make_constant_writable_property(const Value & value)82 make_constant_writable_property(const Value& value)
83 {
84     return constant_writable_property_map< Key, Value >(value);
85 }
86 
87 } /* namespace boost */
88 
89 #endif
90