text: // (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_NUMERIC_VALUES_HPP
  #define BOOST_GRAPH_NUMERIC_VALUES_HPP
  
  #include <limits>
  
  namespace boost
  {
  
  #define BOOST_GRAPH_SPECIALIZE_NUMERIC_FLOAT(type)          \
      template <> struct numeric_values< type >               \
      {                                                       \
          typedef type value_type;                            \
          static type zero() { return 0.0; }                  \
          static type infinity()                              \
          {                                                   \
              return std::numeric_limits< type >::infinity(); \
          }                                                   \
      };
  
  /**
   * This generic type reports various numeric values for some type. In the
   * general case, numeric values simply treat their maximum value as infinity
   * and the default-constructed value as 0.
   *
   * Specializations of this template can redefine the notions of zero and
   * infinity for various types. For example, the class is specialized for
   * floating point types to use the built in notion of infinity.
   */
  template < typename T > struct numeric_values
  {
      typedef T value_type;
  
      static T zero() { return T(); }
  
      static T infinity() { return (std::numeric_limits< T >::max)(); }
  };
  
  // Specializations for floating point types refer to 0.0 and their infinity
  // value defined by numeric_limits.
  BOOST_GRAPH_SPECIALIZE_NUMERIC_FLOAT(float)
  BOOST_GRAPH_SPECIALIZE_NUMERIC_FLOAT(double)
  BOOST_GRAPH_SPECIALIZE_NUMERIC_FLOAT(long double)
  
  #undef BOOST_GRAPH_SPECIALIZE_NUMERIC_VALUE
  }
  
  #endif
  