#ifndef LLVM_ADT_ILIST_ITERATOR_H
#define LLVM_ADT_ILIST_ITERATOR_H
#include "llvm/ADT/ilist_node.h"
#include <cassert>
#include <cstddef>
#include <iterator>
#include <type_traits>
namespace llvm {
namespace ilist_detail {
template <class OptionsT, bool IsConst> struct IteratorTraits;
IteratorTraits<OptionsT, false>;
IteratorTraits<OptionsT, true>;
template <bool IsReverse> struct IteratorHelper;
template <> struct IteratorHelper<false> : ilist_detail::NodeAccess { … };
template <> struct IteratorHelper<true> : ilist_detail::NodeAccess { … };
template <class IteratorTy, class ParentTy, bool IsConst>
class iterator_parent_access;
iterator_parent_access<IteratorTy, ParentTy, true>;
iterator_parent_access<IteratorTy, ParentTy, false>;
iterator_parent_access<IteratorTy, void, true>;
iterator_parent_access<IteratorTy, void, false>;
}
template <class OptionsT, bool IsReverse, bool IsConst>
class ilist_iterator : ilist_detail::SpecificNodeAccess<OptionsT>,
public ilist_detail::iterator_parent_access<
ilist_iterator<OptionsT, IsReverse, IsConst>,
typename OptionsT::parent_ty, IsConst> { … };
template <class OptionsT, bool IsReverse, bool IsConst>
class ilist_iterator_w_bits
: ilist_detail::SpecificNodeAccess<OptionsT>,
public ilist_detail::iterator_parent_access<
ilist_iterator_w_bits<OptionsT, IsReverse, IsConst>,
typename OptionsT::parent_ty, IsConst> { … };
template <typename From> struct simplify_type;
simplify_type<ilist_iterator<OptionsT, false, IsConst>>;
simplify_type<const ilist_iterator<OptionsT, false, IsConst>>;
simplify_type<ilist_iterator_w_bits<OptionsT, false, IsConst>>;
simplify_type<const ilist_iterator_w_bits<OptionsT, false, IsConst>>;
}
#endif