cobalt / third_party / gn / ad0a7ada45cd7a3781a00175286a05519b4bdefc / . / src / gn / deps_iterator.cc

// Copyright 2014 The Chromium Authors. All rights reserved. | |

// Use of this source code is governed by a BSD-style license that can be | |

// found in the LICENSE file. | |

#include "gn/deps_iterator.h" | |

#include "gn/target.h" | |

DepsIterator::DepsIterator() : current_index_(0) { | |

vect_stack_[0] = nullptr; | |

vect_stack_[1] = nullptr; | |

vect_stack_[2] = nullptr; | |

} | |

DepsIterator::DepsIterator(const LabelTargetVector* a, | |

const LabelTargetVector* b, | |

const LabelTargetVector* c) | |

: current_index_(0) { | |

vect_stack_[0] = a; | |

vect_stack_[1] = b; | |

vect_stack_[2] = c; | |

if (vect_stack_[0] && vect_stack_[0]->empty()) | |

operator++(); | |

} | |

// Advance to the next position. This assumes there are more vectors. | |

// | |

// For internal use, this function tolerates an initial index equal to the | |

// length of the current vector. In this case, it will advance to the next | |

// one. | |

DepsIterator& DepsIterator::operator++() { | |

DCHECK(vect_stack_[0]); | |

current_index_++; | |

if (current_index_ >= vect_stack_[0]->size()) { | |

// Advance to next vect. Shift the elements left by one. | |

vect_stack_[0] = vect_stack_[1]; | |

vect_stack_[1] = vect_stack_[2]; | |

vect_stack_[2] = nullptr; | |

current_index_ = 0; | |

if (vect_stack_[0] && vect_stack_[0]->empty()) | |

operator++(); | |

} | |

return *this; | |

} | |

DepsIteratorRange::DepsIteratorRange(const DepsIterator& b) | |

: begin_(b), end_() {} | |

DepsIteratorRange::~DepsIteratorRange() = default; |