|  | //===-- llvm/ADT/iterator - Portable wrapper around <iterator> --*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file was developed by the LLVM research group and is distributed under | 
|  | // the University of Illinois Open Source License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file provides a wrapper around the mysterious <iterator> header file. | 
|  | // In GCC 2.95.3, the file defines a bidirectional_iterator class (and other | 
|  | // friends), instead of the standard iterator class.  In GCC 3.1, the | 
|  | // bidirectional_iterator class got moved out and the new, standards compliant, | 
|  | // iterator<> class was added.  Because there is nothing that we can do to get | 
|  | // correct behavior on both compilers, we have this header with #ifdef's.  Gross | 
|  | // huh? | 
|  | // | 
|  | // By #includ'ing this file, you get the contents of <iterator> plus the | 
|  | // following classes in the global namespace: | 
|  | // | 
|  | //   1. bidirectional_iterator | 
|  | //   2. forward_iterator | 
|  | // | 
|  | // The #if directives' expressions are filled in by Autoconf. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_ADT_ITERATOR | 
|  | #define LLVM_ADT_ITERATOR | 
|  |  | 
|  | #include <iterator> | 
|  |  | 
|  | #undef HAVE_BI_ITERATOR | 
|  | #undef HAVE_STD_ITERATOR | 
|  | #undef HAVE_FWD_ITERATOR | 
|  |  | 
|  | #ifdef _MSC_VER | 
|  | #  define HAVE_BI_ITERATOR 0 | 
|  | #  define HAVE_STD_ITERATOR 1 | 
|  | #  define HAVE_FWD_ITERATOR 0 | 
|  | #endif | 
|  |  | 
|  | #if !HAVE_BI_ITERATOR | 
|  | # if HAVE_STD_ITERATOR | 
|  | /// If the bidirectional iterator is not defined, we attempt to define it in | 
|  | /// terms of the C++ standard iterator. Otherwise, we import it with a "using" | 
|  | /// statement. | 
|  | /// | 
|  | template<class Ty, class PtrDiffTy> | 
|  | struct bidirectional_iterator | 
|  | : public std::iterator<std::bidirectional_iterator_tag, Ty, PtrDiffTy> { | 
|  | }; | 
|  | # else | 
|  | #  error "Need to have standard iterator to define bidirectional iterator!" | 
|  | # endif | 
|  | #else | 
|  | using std::bidirectional_iterator; | 
|  | #endif | 
|  |  | 
|  | #if !HAVE_FWD_ITERATOR | 
|  | # if HAVE_STD_ITERATOR | 
|  | /// If the forward iterator is not defined, attempt to define it in terms of | 
|  | /// the C++ standard iterator. Otherwise, we import it with a "using" statement. | 
|  | /// | 
|  | template<class Ty, class PtrDiffTy> | 
|  | struct forward_iterator | 
|  | : public std::iterator<std::forward_iterator_tag, Ty, PtrDiffTy> { | 
|  | }; | 
|  | # else | 
|  | #  error "Need to have standard iterator to define forward iterator!" | 
|  | # endif | 
|  | #else | 
|  | using std::forward_iterator; | 
|  | #endif | 
|  |  | 
|  | #endif |