1// Debugging iterator implementation (out of line) -*- C++ -*- 2 3// Copyright (C) 2011 Free Software Foundation, Inc. 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/safe_local_iterator.tcc 26 * This file is a GNU debug extension to the Standard C++ Library. 27 */ 28 29#ifndef _GLIBCXX_DEBUG_SAFE_LOCAL_ITERATOR_TCC 30#define _GLIBCXX_DEBUG_SAFE_LOCAL_ITERATOR_TCC 1 31 32namespace __gnu_debug 33{ 34 template<typename _Iterator, typename _Sequence> 35 template<typename _Other> 36 bool 37 _Safe_local_iterator<_Iterator, _Sequence>:: 38 _M_valid_range(const _Safe_local_iterator<_Other, _Sequence>& __rhs) const 39 { 40 if (!_M_can_compare(__rhs)) 41 return false; 42 if (_M_bucket != __rhs._M_bucket) 43 return false; 44 45 /* Determine if we can order the iterators without the help of 46 the container */ 47 std::pair<difference_type, _Distance_precision> __dist = 48 __get_distance(base(), __rhs.base()); 49 switch (__dist.second) 50 { 51 case __dp_equality: 52 if (__dist.first == 0) 53 return true; 54 break; 55 56 case __dp_sign: 57 case __dp_exact: 58 return __dist.first >= 0; 59 } 60 61 /* We can only test for equality, but check if one of the 62 iterators is at an extreme. */ 63 /* Optim for classic [begin, it) or [it, end) ranges, limit checks 64 * when code is valid. */ 65 if (_M_is_begin() || __rhs._M_is_end()) 66 return true; 67 if (_M_is_end() || __rhs._M_is_begin()) 68 return false; 69 70 // Assume that this is a valid range; we can't check anything else 71 return true; 72 } 73} // namespace __gnu_debug 74 75#endif 76