9 #include <llvm/ADT/ArrayRef.h>
10 #include <llvm/ADT/iterator.h>
11 #include <llvm/ADT/iterator_range.h>
15 template<
typename T>
class Ref;
25 using forward_it = std::iterator<std::forward_iterator_tag, T>;
30 template <
typename UseT>
39 assert(u_ &&
"Cannot increment end iterator!");
50 UseT &operator*()
const {
51 assert(u_ &&
"Cannot dereference end iterator!");
55 UseT *operator->()
const {
return &operator*(); }
72 template <
typename UserTy>
84 return !(*
this == that);
98 user_iterator_impl operator++(
int)
106 UserTy *operator*()
const {
110 UserTy *operator->()
const {
return operator*(); }
112 operator user_iterator_impl<const UserTy>()
const {
113 return user_iterator_impl<const UserTy>(*UI);
116 Use &getUse()
const {
return *UI; }
119 explicit user_iterator_impl(
Use *U) : UI(U) {}
122 use_iterator_impl<Use> UI;
126 using use_iterator = use_iterator_impl<Use>;
127 using const_use_iterator = use_iterator_impl<const Use>;
128 using user_iterator = user_iterator_impl<User>;
129 using const_user_iterator = user_iterator_impl<const User>;
163 size_t use_size()
const {
return std::distance(use_begin(), use_end()); }
164 bool use_empty()
const {
return users_ ==
nullptr; }
165 use_iterator use_begin() {
return use_iterator(users_); }
166 const_use_iterator use_begin()
const {
return const_use_iterator(users_); }
167 use_iterator use_end() {
return use_iterator(); }
168 const_use_iterator use_end()
const {
return const_use_iterator(); }
169 llvm::iterator_range<use_iterator> uses();
170 llvm::iterator_range<const_use_iterator> uses()
const;
173 bool user_empty()
const {
return users_ ==
nullptr; }
174 user_iterator user_begin() {
return user_iterator(users_); }
175 const_user_iterator user_begin()
const {
return const_user_iterator(users_); }
176 user_iterator user_end() {
return user_iterator(); }
177 const_user_iterator user_end()
const {
return const_user_iterator(); }
178 llvm::iterator_range<user_iterator> users();
179 llvm::iterator_range<const_user_iterator> users()
const;