9 #include <llvm/ADT/ArrayRef.h>
10 #include <llvm/ADT/iterator.h>
11 #include <llvm/ADT/iterator_range.h>
13 #include "core/value.h"
24 using op_range = llvm::iterator_range<op_iterator>;
25 using const_op_range = llvm::iterator_range<const_op_iterator>;
30 , std::random_access_iterator_tag
37 : iterator_adaptor_base(U)
46 < const_value_op_iterator
48 , std::random_access_iterator_tag
55 : iterator_adaptor_base(U)
63 using value_op_range = llvm::iterator_range<value_op_iterator>;
64 using const_value_op_range = llvm::iterator_range<const_value_op_iterator>;
70 , std::random_access_iterator_tag
78 : llvm::iterator_adaptor_base
81 , std::random_access_iterator_tag
96 < const_conv_op_iterator<T>
97 , const_value_op_iterator
98 , std::random_access_iterator_tag
106 : llvm::iterator_adaptor_base
109 , std::random_access_iterator_tag
123 using conv_op_range = llvm::iterator_range<conv_op_iterator<T>>;
125 using const_conv_op_range = llvm::iterator_range<const_conv_op_iterator<T>>;
127 template <
typename T>
131 , std::random_access_iterator_tag
139 : llvm::iterator_adaptor_base
142 , std::random_access_iterator_tag
151 T *operator*()
const {
return static_cast<T *
>((*this->I).
Get()); }
152 T *operator->()
const {
return static_cast<T *
>((*this->I).
Get()); }
155 template <
typename T>
157 < const_unref_iterator<T>
158 , const_value_op_iterator
159 , std::random_access_iterator_tag
167 : llvm::iterator_adaptor_base
170 , std::random_access_iterator_tag
179 const T *operator*()
const {
return static_cast<const T *
>((*this->I).
Get()); }
180 const T *operator->()
const {
return static_cast<const T *
>((*this->I).
Get()); }
184 using unref_range = llvm::iterator_range<unref_iterator<T>>;
186 using const_unref_range = llvm::iterator_range<const_unref_iterator<T>>;
196 size_t size()
const {
return numOps_; }
199 op_iterator op_begin() {
return uses_; }
202 const_op_iterator op_begin()
const {
return uses_; }
203 const_op_iterator op_end()
const {
return uses_ +
numOps_; }
204 const_op_range operands()
const;
207 value_op_iterator value_op_begin();
208 value_op_iterator value_op_end();
209 value_op_range operand_values();
210 const_value_op_iterator value_op_begin()
const;
211 const_value_op_iterator value_op_end()
const;
212 const_value_op_range operand_values()
const;
219 (I < 0 ? op_end() : op_begin())[I] = val;
225 (i < 0 ? op_end() : op_begin())[i] = val;
232 return static_cast<Ref<Value>>((I < 0 ? op_end() : op_begin())[I]);
238 return static_cast<Ref<Value>>((i < 0 ? op_end() : op_begin())[i]);
245 return static_cast<ConstRef<Value>>((I < 0 ? op_end() : op_begin())[I]);
251 return static_cast<ConstRef<Value>>((i < 0 ? op_end() : op_begin())[i]);