// (C) Copyright 2007-2009 Andrew Sutton
//
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0 (See accompanying file
// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)

#ifndef BOOST_GRAPH_CONSTANT_PROPERTY_HPP
#define BOOST_GRAPH_CONSTANT_PROPERTY_HPP

#include <boost/property_map/property_map.hpp>


// TODO: This should really be part of the property maps library rather than
// the Boost.Graph library.

namespace boost {

/**
 * A constant property is one, that regardless of the edge or vertex given,
 * will always return a constant value.
 */
template <typename Key, typename Value>
struct constant_property_map
    : public boost::put_get_helper<
            const Value&,
            constant_property_map<Key, Value>
    >
{
    typedef Key key_type;
    typedef Value value_type;
    typedef const Value& reference;
    typedef boost::readable_property_map_tag category;

    constant_property_map()
        : m_value()
    { }

    constant_property_map(const value_type &value)
        : m_value(value)
    { }

    constant_property_map(const constant_property_map& copy)
        : m_value(copy.m_value)
    { }

    inline reference operator [](const key_type&) const
    { return m_value; }

    value_type m_value;
};

template <typename Key, typename Value>
inline constant_property_map<Key, Value>
make_constant_property(const Value& value)
{ return constant_property_map<Key, Value>(value); }

} /* namespace boost */

#endif
