]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/include/debug/stl_iterator.h
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / include / debug / stl_iterator.h
CommitLineData
d9ba0dd6 1// Debugging support implementation -*- C++ -*-
2
f1717362 3// Copyright (C) 2015-2016 Free Software Foundation, Inc.
d9ba0dd6 4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file debug/stl_iterator.h
26 * This file is a GNU debug extension to the Standard C++ Library.
27 */
28
29#ifndef _GLIBCXX_DEBUG_STL_ITERATOR_H
30#define _GLIBCXX_DEBUG_STL_ITERATOR_H 1
31
32#include <debug/helper_functions.h>
33
34namespace __gnu_debug
35{
36 // Help Debug mode to see through reverse_iterator.
37 template<typename _Iterator>
38 inline bool
39 __valid_range(const std::reverse_iterator<_Iterator>& __first,
40 const std::reverse_iterator<_Iterator>& __last,
41 typename _Distance_traits<_Iterator>::__type& __dist)
42 { return __valid_range(__last.base(), __first.base(), __dist); }
43
44 template<typename _Iterator>
45 inline typename _Distance_traits<_Iterator>::__type
46 __get_distance(const std::reverse_iterator<_Iterator>& __first,
47 const std::reverse_iterator<_Iterator>& __last)
48 { return __get_distance(__last.base(), __first.base()); }
49
50#if __cplusplus < 201103L
51 template<typename _Iterator>
52 struct __is_safe_random_iterator<std::reverse_iterator<_Iterator> >
53 : __is_safe_random_iterator<_Iterator>
54 { };
55
56 template<typename _Iterator>
57 struct _Unsafe_type<std::reverse_iterator<_Iterator> >
58 {
59 typedef typename _Unsafe_type<_Iterator>::_Type _UnsafeType;
60 typedef std::reverse_iterator<_UnsafeType> _Type;
61 };
62
63 template<typename _Iterator>
64 inline std::reverse_iterator<typename _Unsafe_type<_Iterator>::_Type>
65 __unsafe(const std::reverse_iterator<_Iterator>& __it)
66 {
67 typedef typename _Unsafe_type<_Iterator>::_Type _UnsafeType;
68 return std::reverse_iterator<_UnsafeType>(__unsafe(__it.base()));
69 }
70#else
71 template<typename _Iterator>
72 inline auto
73 __base(const std::reverse_iterator<_Iterator>& __it)
74 -> decltype(std::__make_reverse_iterator(__base(__it.base())))
75 { return std::__make_reverse_iterator(__base(__it.base())); }
76
77 template<typename _Iterator>
78 inline auto
79 __unsafe(const std::reverse_iterator<_Iterator>& __it)
80 -> decltype(std::__make_reverse_iterator(__unsafe(__it.base())))
81 { return std::__make_reverse_iterator(__unsafe(__it.base())); }
82#endif
83
84#if __cplusplus >= 201103L
85 // Help Debug mode to see through move_iterator.
86 template<typename _Iterator>
87 inline bool
88 __valid_range(const std::move_iterator<_Iterator>& __first,
89 const std::move_iterator<_Iterator>& __last,
90 typename _Distance_traits<_Iterator>::__type& __dist)
91 { return __valid_range(__first.base(), __last.base(), __dist); }
92
93 template<typename _Iterator>
94 inline typename _Distance_traits<_Iterator>::__type
95 __get_distance(const std::move_iterator<_Iterator>& __first,
96 const std::move_iterator<_Iterator>& __last)
97 { return __get_distance(__first.base(), __last.base()); }
98
99 template<typename _Iterator>
100 inline auto
101 __unsafe(const std::move_iterator<_Iterator>& __it)
102 -> decltype(std::make_move_iterator(__unsafe(__it.base())))
103 { return std::make_move_iterator(__unsafe(__it.base())); }
104
105 template<typename _Iterator>
106 inline auto
107 __base(const std::move_iterator<_Iterator>& __it)
108 -> decltype(std::make_move_iterator(__base(__it.base())))
109 { return std::make_move_iterator(__base(__it.base())); }
110#endif
111}
112
113#endif