iteration_range.h revision 54d220eb9cc51215d75b9e0fe921b94bebbb3fd6
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