deba@701: // -*- mode:C++ -*-
deba@701: 
alpar@921: #ifndef LEMON_INVALID_H
alpar@921: #define LEMON_INVALID_H
deba@701: 
deba@701: ///\file
deba@701: ///\brief Definition of INVALID.
deba@701: 
alpar@921: namespace lemon {
deba@701: 
deba@701:   /// Dummy type to make it easier to make invalid iterators.
deba@701:   
deba@701:   /// See \ref INVALID, how to use it.
deba@701:   
deba@701:   struct Invalid {
deba@701:   public:
deba@701:     bool operator==(Invalid) { return true;  }
deba@701:     bool operator!=(Invalid) { return false; }
deba@701:     bool operator< (Invalid) { return false; }
deba@701:   };
deba@701:   
deba@701:   /// Invalid iterators.
deba@701:   
deba@701:   /// \ref Invalid is a global type that converts to each iterator
deba@701:   /// in such a way that the value of the target iterator will be invalid.
deba@701: 
deba@701:   // It is also used to convert the \c INVALID constant to the
deba@701:   // node iterator that makes is possible to write 
deba@701: 
deba@701:   //extern Invalid INVALID;
deba@701: 
deba@701:   //const Invalid &INVALID = *(Invalid *)0;
deba@701:   const Invalid INVALID = Invalid();
deba@701: 
alpar@921: } //namespace lemon
deba@701: 
deba@701: #endif
deba@701: