42 _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
55 template<typename _Tp>
60 typedef _Tp element_type;
69 set(element_type* __arg)
74 operator<(
const _Std_pointer_impl& __rarg)
const
75 {
return (_M_value < __rarg._M_value); }
78 operator==(
const _Std_pointer_impl& __rarg)
const
79 {
return (_M_value == __rarg._M_value); }
82 element_type* _M_value;
98 template<
typename _Tp>
102 typedef _Tp element_type;
110 return reinterpret_cast<_Tp*
>(
reinterpret_cast<_UIntPtrType
>(
this)
120 _M_diff =
reinterpret_cast<_UIntPtrType
>(__arg)
121 - reinterpret_cast<_UIntPtrType>(
this);
127 {
return (reinterpret_cast<_UIntPtrType>(this->
get())
128 < reinterpret_cast<_UIntPtrType>(__rarg.get())); }
132 {
return (reinterpret_cast<_UIntPtrType>(this->
get())
133 == reinterpret_cast<_UIntPtrType>(__rarg.get())); }
136 typedef __gnu_cxx::__conditional_type<
137 (
sizeof(
unsigned long) >=
sizeof(
void*)),
138 unsigned long,
unsigned long long>::__type _UIntPtrType;
139 _UIntPtrType _M_diff;
146 template<
typename _Tp>
150 typedef const _Tp element_type;
158 return reinterpret_cast<const _Tp*
>
159 (
reinterpret_cast<_UIntPtrType
>(
this) + _M_diff);
163 set(
const _Tp* __arg)
168 _M_diff =
reinterpret_cast<_UIntPtrType
>(__arg)
169 - reinterpret_cast<_UIntPtrType>(
this);
175 {
return (reinterpret_cast<_UIntPtrType>(this->
get())
176 < reinterpret_cast<_UIntPtrType>(__rarg.get())); }
180 {
return (reinterpret_cast<_UIntPtrType>(this->
get())
181 == reinterpret_cast<_UIntPtrType>(__rarg.get())); }
184 typedef __gnu_cxx::__conditional_type
185 <(
sizeof(
unsigned long) >=
sizeof(
void*)),
186 unsigned long,
unsigned long long>::__type _UIntPtrType;
187 _UIntPtrType _M_diff;
197 template<
typename _Tp>
198 struct _Reference_type
199 {
typedef _Tp& reference; };
202 struct _Reference_type<void>
203 {
typedef _Invalid_type& reference; };
206 struct _Reference_type<const void>
207 {
typedef const _Invalid_type& reference; };
210 struct _Reference_type<volatile void>
211 {
typedef volatile _Invalid_type& reference; };
214 struct _Reference_type<volatile const void>
215 {
typedef const volatile _Invalid_type& reference; };
221 template<
typename _Tp>
223 {
typedef _Tp type; };
225 template<
typename _Tp>
227 {
typedef _Tp type; };
229 template<
typename _Tp>
230 struct _Unqualified_type<volatile _Tp>
231 {
typedef volatile _Tp type; };
233 template<
typename _Tp>
234 struct _Unqualified_type<volatile const _Tp>
235 {
typedef volatile _Tp type; };
266 template<
typename _Storage_policy>
270 typedef typename _Storage_policy::element_type element_type;
274 typedef typename _Unqualified_type<element_type>::type value_type;
275 typedef std::ptrdiff_t difference_type;
277 typedef typename _Reference_type<element_type>::reference reference;
285 { _Storage_policy::set(__arg); }
289 { _Storage_policy::set(__arg.get()); }
292 template<
typename _Up>
294 { _Storage_policy::set(__arg); }
298 template<
typename _Up>
300 { _Storage_policy::set(__arg.get()); }
309 _Storage_policy::set(__arg.get());
313 template<
typename _Up>
317 _Storage_policy::set(__arg.get());
321 template<
typename _Up>
323 operator=(_Up* __arg)
325 _Storage_policy::set(__arg);
332 {
return *(_Storage_policy::get()); }
337 {
return _Storage_policy::get(); }
341 operator[](std::ptrdiff_t __index)
const
342 {
return _Storage_policy::get()[__index]; }
349 operator __unspecified_bool_type()
const
351 return _Storage_policy::get() == 0 ? 0 :
352 &_Pointer_adapter::operator->;
358 {
return (_Storage_policy::get() == 0); }
361 inline friend std::ptrdiff_t
363 {
return (__lhs.get() - __rhs); }
365 inline friend std::ptrdiff_t
367 {
return (__lhs - __rhs.get()); }
369 template<
typename _Up>
370 inline friend std::ptrdiff_t
372 {
return (__lhs.get() - __rhs); }
374 template<
typename _Up>
375 inline friend std::ptrdiff_t
377 {
return (__lhs - __rhs.get()); }
379 template<
typename _Up>
380 inline std::ptrdiff_t
382 {
return (_Storage_policy::get() - __rhs.get()); }
391 #define _CXX_POINTER_ARITH_OPERATOR_SET(INT_TYPE) \
392 inline friend _Pointer_adapter \
393 operator+(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
394 { return _Pointer_adapter(__lhs.get() + __offset); } \
396 inline friend _Pointer_adapter \
397 operator+(INT_TYPE __offset, const _Pointer_adapter& __rhs) \
398 { return _Pointer_adapter(__rhs.get() + __offset); } \
400 inline friend _Pointer_adapter \
401 operator-(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
402 { return _Pointer_adapter(__lhs.get() - __offset); } \
404 inline _Pointer_adapter& \
405 operator+=(INT_TYPE __offset) \
407 _Storage_policy::set(_Storage_policy::get() + __offset); \
411 inline _Pointer_adapter& \
412 operator-=(INT_TYPE __offset) \
414 _Storage_policy::set(_Storage_policy::get() - __offset); \
417 // END of _CXX_POINTER_ARITH_OPERATOR_SET macro
420 _CXX_POINTER_ARITH_OPERATOR_SET(
short);
421 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned short);
422 _CXX_POINTER_ARITH_OPERATOR_SET(
int);
423 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned int);
424 _CXX_POINTER_ARITH_OPERATOR_SET(
long);
425 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long);
431 _Storage_policy::set(_Storage_policy::get() + 1);
436 operator++(
int __unused)
439 _Storage_policy::set(_Storage_policy::get() + 1);
446 _Storage_policy::set(_Storage_policy::get() - 1);
454 _Storage_policy::set(_Storage_policy::get() - 1);
461 #define _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(OPERATOR,BLANK) \
462 template<typename _Tp1, typename _Tp2> \
464 operator OPERATOR##BLANK (const _Pointer_adapter<_Tp1>& __lhs, _Tp2 __rhs) \
465 { return __lhs.get() OPERATOR##BLANK __rhs; } \
467 template<typename _Tp1, typename _Tp2> \
469 operator OPERATOR##BLANK (_Tp1 __lhs, const _Pointer_adapter<_Tp2>& __rhs) \
470 { return __lhs OPERATOR##BLANK __rhs.get(); } \
472 template<typename _Tp1, typename _Tp2> \
474 operator OPERATOR##BLANK (const _Pointer_adapter<_Tp1>& __lhs, \
475 const _Pointer_adapter<_Tp2>& __rhs) \
476 { return __lhs.get() OPERATOR##BLANK __rhs.get(); } \
478 // End GCC_CXX_POINTER_COMPARISON_OPERATION_SET Macro
481 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(==,);
482 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(!=,);
483 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(<,);
484 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(<=,);
485 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(>,);
486 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(>=,);
489 template<
typename _Tp>
492 {
return __lhs.get() ==
reinterpret_cast<void*
>(__rhs); }
494 template<
typename _Tp>
496 operator==(
int __lhs,
const _Pointer_adapter<_Tp>& __rhs)
497 {
return __rhs.get() ==
reinterpret_cast<void*
>(__lhs); }
499 template<
typename _Tp>
501 operator!=(
const _Pointer_adapter<_Tp>& __lhs,
int __rhs)
502 {
return __lhs.get() !=
reinterpret_cast<void*
>(__rhs); }
504 template<
typename _Tp>
506 operator!=(
int __lhs,
const _Pointer_adapter<_Tp>& __rhs)
507 {
return __rhs.get() !=
reinterpret_cast<void*
>(__lhs); }
513 template<
typename _Tp>
517 {
return __lhs._Tp::operator==(__rhs); }
519 template<
typename _Tp>
521 operator<=(const _Pointer_adapter<_Tp>& __lhs,
522 const _Pointer_adapter<_Tp>& __rhs)
523 {
return __lhs._Tp::operator<(__rhs) || __lhs._Tp::operator==(__rhs); }
525 template<
typename _Tp>
527 operator!=(
const _Pointer_adapter<_Tp>& __lhs,
528 const _Pointer_adapter<_Tp>& __rhs)
529 {
return !(__lhs._Tp::operator==(__rhs)); }
531 template<
typename _Tp>
533 operator>(
const _Pointer_adapter<_Tp>& __lhs,
534 const _Pointer_adapter<_Tp>& __rhs)
535 {
return !(__lhs._Tp::operator<(__rhs) || __lhs._Tp::operator==(__rhs)); }
537 template<
typename _Tp>
539 operator>=(
const _Pointer_adapter<_Tp>& __lhs,
540 const _Pointer_adapter<_Tp>& __rhs)
541 {
return !(__lhs._Tp::operator<(__rhs)); }
543 template<
typename _CharT,
typename _Traits,
typename _StoreT>
545 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
546 const _Pointer_adapter<_StoreT>& __p)
547 {
return (__os << __p.get()); }
549 _GLIBCXX_END_NAMESPACE