Makefile: remove spurious tab
[xcsoar.git] / src / Util / CastIterator.hpp
blob697c62e9d244ae5fd4e5d650dda7d3bc7e8bec20
1 /*
2 * Copyright (C) 2010-2011 Max Kellermann <max@duempel.org>
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the
14 * distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20 * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 * OF THE POSSIBILITY OF SUCH DAMAGE.
30 #ifndef XCSOAR_CAST_ITERATOR_HPP
31 #define XCSOAR_CAST_ITERATOR_HPP
33 #include <iterator>
35 template<typename VT, typename IT>
36 class CastIterator {
37 IT iterator;
39 public:
40 typedef typename IT::iterator_category iterator_category;
41 typedef typename IT::difference_type difference_type;
42 typedef VT value_type;
43 typedef VT *pointer;
44 typedef VT &reference;
46 CastIterator() = default;
48 constexpr
49 CastIterator(const IT _iterator):iterator(_iterator) {}
51 reference operator*() const {
52 return static_cast<reference>(*iterator);
55 pointer operator->() const {
56 return static_cast<pointer>(iterator.IT::operator->());
59 CastIterator<VT,IT> &operator++() {
60 iterator = ++iterator;
61 return *this;
64 CastIterator<VT,IT> operator++(int) {
65 CastIterator<VT,IT> old = *this;
66 iterator++;
67 return old;
70 CastIterator<VT,IT> &operator--() {
71 iterator = --iterator;
72 return *this;
75 CastIterator<VT,IT> operator--(int) {
76 CastIterator<VT,IT> old = *this;
77 iterator--;
78 return old;
81 bool operator==(const CastIterator<VT,IT> &other) const {
82 return iterator == other.iterator;
85 bool operator!=(const CastIterator<VT,IT> &other) const {
86 return iterator != other.iterator;
90 #endif