180afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko/*
280afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko * Copyright (C) 2015 The Android Open Source Project
380afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko *
480afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko * Licensed under the Apache License, Version 2.0 (the "License");
580afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko * you may not use this file except in compliance with the License.
680afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko * You may obtain a copy of the License at
780afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko *
880afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko *      http://www.apache.org/licenses/LICENSE-2.0
980afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko *
1080afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko * Unless required by applicable law or agreed to in writing, software
1180afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko * distributed under the License is distributed on an "AS IS" BASIS,
1280afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1380afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko * See the License for the specific language governing permissions and
1480afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko * limitations under the License.
1580afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko */
1680afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko
1780afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko#ifndef ART_RUNTIME_BASE_ITERATION_RANGE_H_
1880afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko#define ART_RUNTIME_BASE_ITERATION_RANGE_H_
1980afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko
20e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include <iterator>
21e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
2280afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Markonamespace art {
2380afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko
2480afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko// Helper class that acts as a container for range-based loops, given an iteration
2580afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko// range [first, last) defined by two iterators.
2680afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Markotemplate <typename Iter>
2780afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Markoclass IterationRange {
2880afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko public:
2980afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  typedef Iter iterator;
3080afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  typedef typename std::iterator_traits<Iter>::difference_type difference_type;
3180afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  typedef typename std::iterator_traits<Iter>::value_type value_type;
3280afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  typedef typename std::iterator_traits<Iter>::pointer pointer;
3380afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  typedef typename std::iterator_traits<Iter>::reference reference;
3480afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko
3580afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  IterationRange(iterator first, iterator last) : first_(first), last_(last) { }
3680afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko
3780afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  iterator begin() const { return first_; }
3880afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  iterator end() const { return last_; }
3980afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  iterator cbegin() const { return first_; }
4080afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko  iterator cend() const { return last_; }
4180afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko
4280afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko private:
43e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  const iterator first_;
44e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  const iterator last_;
4580afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko};
4680afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko
47e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartiertemplate <typename Iter>
48e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstatic inline IterationRange<Iter> MakeIterationRange(const Iter& begin_it, const Iter& end_it) {
49e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  return IterationRange<Iter>(begin_it, end_it);
50e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier}
51e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
5254d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartiertemplate <typename Iter>
5354d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartierstatic inline IterationRange<Iter> MakeEmptyIterationRange(const Iter& it) {
5454d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier  return IterationRange<Iter>(it, it);
5554d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier}
5654d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier
5780afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko}  // namespace art
5880afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko
5980afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko#endif  // ART_RUNTIME_BASE_ITERATION_RANGE_H_
60