// (C) Copyright Andrew Sutton 2007
//
// 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_NULL_PROPERTY_HPP
#define BOOST_GRAPH_NULL_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 null property is somewhat like the inverse of the constant
    // property map except that instead of returning a single value,
    // this eats any writes and cannot be read from.

    template <typename Key, typename Value>
    struct null_property_map
    {
        typedef Key key_type;
        typedef Value value_type;
        typedef void reference;
        typedef boost::writable_property_map_tag category;
    };

    // The null_property_map<K,V> only has a put() function.
    template <typename K, typename V>
    void put(null_property_map<K,V>& pm, const K& key, const V& value)
    { }

    // A helper function for intantiating null property maps.
    template <typename Key, typename Value>
    inline null_property_map<Key, Value> make_null_property()
    { return null_property_map<Key, Value>(); }
}

#endif
