LLVM: include/llvm/ADT/ilist_iterator.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9#ifndef LLVM_ADT_ILIST_ITERATOR_H

10#define LLVM_ADT_ILIST_ITERATOR_H

11

13#include

14#include

15#include

16#include <type_traits>

17

18namespace llvm {

19

21

22

32 using value_type = const typename OptionsT::value_type;

33 using pointer = typename OptionsT::const_pointer;

34 using reference = typename OptionsT::const_reference;

37};

38

52

53

54

55

56template <class IteratorTy, class ParentTy, bool IsConst>

58template <class IteratorTy, class ParentTy>

60public:

62 return static_cast<IteratorTy *>(this)->NodePtr->getParent();

63 }

64};

65template <class IteratorTy, class ParentTy>

67public:

69 return static_cast<IteratorTy *>(this)->NodePtr->getParent();

70 }

71};

72template

74template

76

77}

78

79

80template <class OptionsT, bool IsReverse, bool IsConst>

83 ilist_iterator<OptionsT, IsReverse, IsConst>,

84 typename OptionsT::parent_ty, IsConst> {

90 typename OptionsT::parent_ty, IsConst>;

91

94

95public:

96 using value_type = typename Traits::value_type;

97 using pointer = typename Traits::pointer;

98 using reference = typename Traits::reference;

103

104private:

105 using node_pointer = typename Traits::node_pointer;

106 using node_reference = typename Traits::node_reference;

107

108 node_pointer NodePtr = nullptr;

109

110public:

111

113

117

118

119

120 template

122 std::enable_if_t<IsConst || !RHSIsConst, void *> = nullptr)

123 : NodePtr(RHS.NodePtr) {}

124

125

126

127 template

128 std::enable_if_t<IsConst || !RHSIsConst, ilist_iterator &>

130 NodePtr = RHS.NodePtr;

131 return *this;

132 }

133

134

135

136

137

138

139

140

141

145

146

147

148

149

150

156

157

159 if (NodePtr)

161 const_cast<typename ilist_iterator<OptionsT, IsReverse,

162 false>::node_reference>(*NodePtr));

164 }

165

166

168 assert(!NodePtr->isKnownSentinel());

170 }

172

173

175 return LHS.NodePtr == RHS.NodePtr;

176 }

178 return LHS.NodePtr != RHS.NodePtr;

179 }

180

181

183 NodePtr = IsReverse ? NodePtr->getNext() : NodePtr->getPrev();

184 return *this;

185 }

187 NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();

188 return *this;

189 }

192 --*this;

193 return tmp;

194 }

197 ++*this;

198 return tmp;

199 }

200

201 bool isValid() const { return NodePtr; }

202

203

204 node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }

205

206

207 bool isEnd() const { return NodePtr ? NodePtr->isSentinel() : false; }

208};

209

210

211

212

213template <class OptionsT, bool IsReverse, bool IsConst>

217 ilist_iterator_w_bits<OptionsT, IsReverse, IsConst>,

218 typename OptionsT::parent_ty, IsConst> {

224 typename OptionsT::parent_ty, IsConst>;

225

228

229public:

231 using pointer = typename Traits::pointer;

232 using reference = typename Traits::reference;

237

238private:

239 using node_pointer = typename Traits::node_pointer;

240 using node_reference = typename Traits::node_reference;

241

242 node_pointer NodePtr = nullptr;

243

244

245

246 mutable bool HeadInclusiveBit = false;

247

248

249 mutable bool TailInclusiveBit = false;

250

251public:

252

254

260

261

262

263 template

266 std::enable_if_t<IsConst || !RHSIsConst, void *> = nullptr)

267 : NodePtr(RHS.NodePtr) {

268 HeadInclusiveBit = RHS.HeadInclusiveBit;

269 TailInclusiveBit = RHS.TailInclusiveBit;

270 }

271

272

273

274 template

275 std::enable_if_t<IsConst || !RHSIsConst, ilist_iterator_w_bits &>

277 NodePtr = RHS.NodePtr;

278 HeadInclusiveBit = RHS.HeadInclusiveBit;

279 TailInclusiveBit = RHS.TailInclusiveBit;

280 return *this;

281 }

282

283

284

285

286

287

288

289

290

294

295

296

297

298

299

305

306

308 if (NodePtr) {

311 false>::node_reference>(

312 *NodePtr));

313 New.HeadInclusiveBit = HeadInclusiveBit;

314 New.TailInclusiveBit = TailInclusiveBit;

315 return New;

316 }

318 }

319

320

322 assert(!NodePtr->isKnownSentinel());

324 }

326

327

330 return LHS.NodePtr == RHS.NodePtr;

331 }

334 return LHS.NodePtr != RHS.NodePtr;

335 }

336

337

339 NodePtr = IsReverse ? NodePtr->getNext() : NodePtr->getPrev();

340 HeadInclusiveBit = false;

341 TailInclusiveBit = false;

342 return *this;

343 }

345 NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();

346 HeadInclusiveBit = false;

347 TailInclusiveBit = false;

348 return *this;

349 }

352 --*this;

353 return tmp;

354 }

357 ++*this;

358 return tmp;

359 }

360

361 bool isValid() const { return NodePtr; }

362

363

364 node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }

365

366

367 bool isEnd() const { return NodePtr ? NodePtr->isSentinel() : false; }

368

369 bool getHeadBit() const { return HeadInclusiveBit; }

370 bool getTailBit() const { return TailInclusiveBit; }

371 void setHeadBit(bool SetBit) const { HeadInclusiveBit = SetBit; }

372 void setTailBit(bool SetBit) const { TailInclusiveBit = SetBit; }

373};

374

375template struct simplify_type;

376

377

378

379

380

381template <class OptionsT, bool IsConst>

388template <class OptionsT, bool IsConst>

390 : simplify_type<ilist_iterator<OptionsT, false, IsConst>> {};

391

392

393template <class OptionsT, bool IsConst>

400template <class OptionsT, bool IsConst>

402 : simplify_type<ilist_iterator_w_bits<OptionsT, false, IsConst>> {};

403

404}

405

406#endif

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

ParentTy * getNodeParent()

Definition ilist_iterator.h:68

const ParentTy * getNodeParent() const

Definition ilist_iterator.h:61

Mixin class used to add a getNodeParent() function to iterators iff the list uses ilist_parent,...

Definition ilist_iterator.h:57

Iterator for intrusive lists based on ilist_node.

Definition ilist_iterator.h:218

ilist_iterator_w_bits()=default

ilist_iterator_w_bits< OptionsT, !IsReverse, IsConst > getReverse() const

Definition ilist_iterator.h:300

ilist_iterator_w_bits(reference NR)

Definition ilist_iterator.h:257

ilist_iterator_w_bits & operator--()

Definition ilist_iterator.h:338

typename OptionsT::const_pointer const_pointer

Definition ilist_iterator.h:235

ilist_iterator_w_bits(const ilist_iterator_w_bits< OptionsT, IsReverse, RHSIsConst > &RHS, std::enable_if_t< IsConst||!RHSIsConst, void * >=nullptr)

Definition ilist_iterator.h:264

pointer operator->() const

Definition ilist_iterator.h:325

ilist_iterator_w_bits operator--(int)

Definition ilist_iterator.h:350

ilist_iterator_w_bits(pointer NP)

Definition ilist_iterator.h:255

typename OptionsT::const_reference const_reference

Definition ilist_iterator.h:236

ptrdiff_t difference_type

Definition ilist_iterator.h:233

bool isValid() const

Definition ilist_iterator.h:361

ilist_iterator_w_bits(node_reference N)

Create from an ilist_node.

Definition ilist_iterator.h:253

std::bidirectional_iterator_tag iterator_category

Definition ilist_iterator.h:234

ilist_iterator_w_bits< OptionsT, IsReverse, false > getNonConst() const

Const-cast.

Definition ilist_iterator.h:307

node_pointer getNodePtr() const

Definition ilist_iterator.h:364

ilist_iterator_w_bits(const ilist_iterator_w_bits< OptionsT, !IsReverse, IsConst > &RHS)

Explicit conversion between forward/reverse iterators.

Definition ilist_iterator.h:291

reference operator*() const

Definition ilist_iterator.h:321

typename Traits::pointer pointer

Definition ilist_iterator.h:231

ilist_iterator_w_bits & operator++()

Definition ilist_iterator.h:344

friend bool operator==(const ilist_iterator_w_bits &LHS, const ilist_iterator_w_bits &RHS)

Definition ilist_iterator.h:328

bool isEnd() const

Check for end. Only valid if ilist_sentinel_tracking.

Definition ilist_iterator.h:367

typename Traits::value_type value_type

Definition ilist_iterator.h:230

ilist_iterator_w_bits operator++(int)

Definition ilist_iterator.h:355

bool getHeadBit() const

Definition ilist_iterator.h:369

std::enable_if_t< IsConst||!RHSIsConst, ilist_iterator_w_bits & > operator=(const ilist_iterator_w_bits< OptionsT, IsReverse, RHSIsConst > &RHS)

Definition ilist_iterator.h:276

bool getTailBit() const

Definition ilist_iterator.h:370

void setTailBit(bool SetBit) const

Definition ilist_iterator.h:372

void setHeadBit(bool SetBit) const

Definition ilist_iterator.h:371

friend bool operator!=(const ilist_iterator_w_bits &LHS, const ilist_iterator_w_bits &RHS)

Definition ilist_iterator.h:332

typename Traits::reference reference

Definition ilist_iterator.h:232

Iterator for intrusive lists based on ilist_node.

Definition ilist_iterator.h:84

typename Traits::reference reference

Definition ilist_iterator.h:98

std::bidirectional_iterator_tag iterator_category

Definition ilist_iterator.h:100

ilist_iterator(reference NR)

Definition ilist_iterator.h:115

bool isEnd() const

Check for end. Only valid if ilist_sentinel_tracking.

Definition ilist_iterator.h:207

node_pointer getNodePtr() const

Definition ilist_iterator.h:204

friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS)

Definition ilist_iterator.h:177

ilist_iterator operator--(int)

Definition ilist_iterator.h:190

typename OptionsT::const_pointer const_pointer

Definition ilist_iterator.h:101

ilist_iterator< OptionsT, !IsReverse, IsConst > getReverse() const

Definition ilist_iterator.h:151

reference operator*() const

Definition ilist_iterator.h:167

ilist_iterator< OptionsT, IsReverse, false > getNonConst() const

Const-cast.

Definition ilist_iterator.h:158

ilist_iterator & operator++()

Definition ilist_iterator.h:186

typename Traits::value_type value_type

Definition ilist_iterator.h:96

ilist_iterator(const ilist_iterator< OptionsT, !IsReverse, IsConst > &RHS)

Explicit conversion between forward/reverse iterators.

Definition ilist_iterator.h:142

ilist_iterator(const ilist_iterator< OptionsT, IsReverse, RHSIsConst > &RHS, std::enable_if_t< IsConst||!RHSIsConst, void * >=nullptr)

Definition ilist_iterator.h:121

bool isValid() const

Definition ilist_iterator.h:201

friend bool operator==(const ilist_iterator &LHS, const ilist_iterator &RHS)

Definition ilist_iterator.h:174

pointer operator->() const

Definition ilist_iterator.h:171

ilist_iterator operator++(int)

Definition ilist_iterator.h:195

ptrdiff_t difference_type

Definition ilist_iterator.h:99

ilist_iterator(node_reference N)

Create from an ilist_node.

Definition ilist_iterator.h:112

ilist_iterator(pointer NP)

Definition ilist_iterator.h:114

std::enable_if_t< IsConst||!RHSIsConst, ilist_iterator & > operator=(const ilist_iterator< OptionsT, IsReverse, RHSIsConst > &RHS)

Definition ilist_iterator.h:129

typename OptionsT::const_reference const_reference

Definition ilist_iterator.h:102

ilist_iterator & operator--()

Definition ilist_iterator.h:182

typename Traits::pointer pointer

Definition ilist_iterator.h:97

Implementation for an ilist node.

This file defines the ilist_node class template, which is a convenient base class for creating classe...

Definition ilist_iterator.h:20

This is an optimization pass for GlobalISel generic memory operations.

static void decrement(T *&I)

Definition ilist_iterator.h:44

ilist_detail::NodeAccess Access

Definition ilist_iterator.h:41

static void increment(T *&I)

Definition ilist_iterator.h:43

static void increment(T *&I)

Definition ilist_iterator.h:49

ilist_detail::NodeAccess Access

Definition ilist_iterator.h:47

static void decrement(T *&I)

Definition ilist_iterator.h:50

Definition ilist_iterator.h:39

typename OptionsT::value_type value_type

Definition ilist_iterator.h:25

typename OptionsT::pointer pointer

Definition ilist_iterator.h:26

ilist_node_impl< OptionsT > & node_reference

Definition ilist_iterator.h:29

ilist_node_impl< OptionsT > * node_pointer

Definition ilist_iterator.h:28

typename OptionsT::reference reference

Definition ilist_iterator.h:27

typename OptionsT::const_pointer pointer

Definition ilist_iterator.h:33

const ilist_node_impl< OptionsT > * node_pointer

Definition ilist_iterator.h:35

const typename OptionsT::value_type value_type

Definition ilist_iterator.h:32

const ilist_node_impl< OptionsT > & node_reference

Definition ilist_iterator.h:36

typename OptionsT::const_reference reference

Definition ilist_iterator.h:34

Find const-correct node types.

Definition ilist_iterator.h:23

An access class for ilist_node private API.

static ilist_node_impl< OptionsT > * getPrev(ilist_node_impl< OptionsT > &N)

static ilist_node_impl< OptionsT > * getNext(ilist_node_impl< OptionsT > &N)

static pointer getValuePtr(node_type *N)

typename iterator::pointer SimpleType

Definition ilist_iterator.h:384

ilist_iterator< OptionsT, false, IsConst > iterator

Definition ilist_iterator.h:383

static SimpleType getSimplifiedValue(const iterator &Node)

Definition ilist_iterator.h:386

static SimpleType getSimplifiedValue(const iterator &Node)

Definition ilist_iterator.h:398

ilist_iterator_w_bits< OptionsT, false, IsConst > iterator

Definition ilist_iterator.h:395

typename iterator::pointer SimpleType

Definition ilist_iterator.h:396

Define a template that can be specialized by smart pointers to reflect the fact that they are automat...