198760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow//===----------------------------------------------------------------------===// 298760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow// 398760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow// The LLVM Compiler Infrastructure 498760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow// 598760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open 698760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow// Source Licenses. See LICENSE.TXT for details. 798760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow// 898760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow//===----------------------------------------------------------------------===// 998760c18f85bafd98dde7a309e1b0e677abd47d8Marshall Clow 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef INPUT_ITERATOR_H 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define INPUT_ITERATOR_H 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <iterator> 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class It> 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass input_iterator 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant It it_; 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic: 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename std::input_iterator_tag iterator_category; 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename std::iterator_traits<It>::value_type value_type; 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename std::iterator_traits<It>::difference_type difference_type; 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef It pointer; 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename std::iterator_traits<It>::reference reference; 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator() : it_() {} 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant explicit input_iterator(It it) : it_(it) {} 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant reference operator*() const {return *it_;} 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant pointer operator->() const {return it_;} 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator& operator++() {++it_; return *this;} 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator operator++(int) {input_iterator tmp(*this); ++(*this); return tmp;} 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant friend bool operator==(const input_iterator& x, const input_iterator& y) 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant {return x.it_ == y.it_;} 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant friend bool operator!=(const input_iterator& x, const input_iterator& y) 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant {return !(x == y);} 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 416e0a1f458e41c08112a130f50636ced03907e29eHoward Hinnant#endif // INPUT_ITERATOR_H 42