39 #pragma GCC system_header
45 #ifdef __GXX_EXPERIMENTAL_CXX0X__
49 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
51 _GLIBCXX_BEGIN_NAMESPACE_VERSION
64 template<
typename _Tp>
69 typedef _Tp element_type;
78 set(element_type* __arg)
84 {
return (_M_value < __rarg._M_value); }
88 {
return (_M_value == __rarg._M_value); }
91 element_type* _M_value;
107 template<
typename _Tp>
111 typedef _Tp element_type;
119 return reinterpret_cast<_Tp*
>(
reinterpret_cast<_UIntPtrType
>(
this)
129 _M_diff =
reinterpret_cast<_UIntPtrType
>(__arg)
130 - reinterpret_cast<_UIntPtrType>(
this);
136 {
return (reinterpret_cast<_UIntPtrType>(this->
get())
137 < reinterpret_cast<_UIntPtrType>(__rarg.get())); }
141 {
return (reinterpret_cast<_UIntPtrType>(this->
get())
142 == reinterpret_cast<_UIntPtrType>(__rarg.get())); }
145 #ifdef _GLIBCXX_USE_LONG_LONG
146 typedef __gnu_cxx::__conditional_type<
147 (
sizeof(
unsigned long) >=
sizeof(
void*)),
148 unsigned long,
unsigned long long>::__type _UIntPtrType;
150 typedef unsigned long _UIntPtrType;
152 _UIntPtrType _M_diff;
159 template<
typename _Tp>
163 typedef const _Tp element_type;
171 return reinterpret_cast<const _Tp*
>
172 (
reinterpret_cast<_UIntPtrType
>(
this) + _M_diff);
176 set(
const _Tp* __arg)
181 _M_diff =
reinterpret_cast<_UIntPtrType
>(__arg)
182 - reinterpret_cast<_UIntPtrType>(
this);
188 {
return (reinterpret_cast<_UIntPtrType>(this->
get())
189 < reinterpret_cast<_UIntPtrType>(__rarg.get())); }
193 {
return (reinterpret_cast<_UIntPtrType>(this->
get())
194 == reinterpret_cast<_UIntPtrType>(__rarg.get())); }
197 #ifdef _GLIBCXX_USE_LONG_LONG
198 typedef __gnu_cxx::__conditional_type<
199 (
sizeof(
unsigned long) >=
sizeof(
void*)),
200 unsigned long,
unsigned long long>::__type _UIntPtrType;
202 typedef unsigned long _UIntPtrType;
204 _UIntPtrType _M_diff;
214 template<
typename _Tp>
215 struct _Reference_type
216 {
typedef _Tp& reference; };
219 struct _Reference_type<void>
220 {
typedef _Invalid_type& reference; };
223 struct _Reference_type<const void>
224 {
typedef const _Invalid_type& reference; };
227 struct _Reference_type<volatile void>
228 {
typedef volatile _Invalid_type& reference; };
231 struct _Reference_type<volatile const void>
232 {
typedef const volatile _Invalid_type& reference; };
239 template<
typename _Tp>
241 {
typedef _Tp type; };
243 template<
typename _Tp>
245 {
typedef _Tp type; };
279 template<
typename _Storage_policy>
283 typedef typename _Storage_policy::element_type element_type;
287 typedef typename _Unqualified_type<element_type>::type value_type;
288 typedef std::ptrdiff_t difference_type;
290 typedef typename _Reference_type<element_type>::reference reference;
305 template<
typename _Up>
311 template<
typename _Up>
326 template<
typename _Up>
334 template<
typename _Up>
336 operator=(_Up* __arg)
345 {
return *(_Storage_policy::get()); }
350 {
return _Storage_policy::get(); }
354 operator[](std::ptrdiff_t __index)
const
355 {
return _Storage_policy::get()[__index]; }
362 operator __unspecified_bool_type()
const
364 return _Storage_policy::get() == 0 ? 0 :
365 &_Pointer_adapter::operator->;
371 {
return (_Storage_policy::get() == 0); }
374 inline friend std::ptrdiff_t
376 {
return (__lhs.get() - __rhs); }
378 inline friend std::ptrdiff_t
380 {
return (__lhs - __rhs.get()); }
382 template<
typename _Up>
383 inline friend std::ptrdiff_t
385 {
return (__lhs.get() - __rhs); }
387 template<
typename _Up>
388 inline friend std::ptrdiff_t
390 {
return (__lhs - __rhs.get()); }
392 template<
typename _Up>
393 inline std::ptrdiff_t
395 {
return (_Storage_policy::get() - __rhs.get()); }
404 #define _CXX_POINTER_ARITH_OPERATOR_SET(INT_TYPE) \
405 inline friend _Pointer_adapter \
406 operator+(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
407 { return _Pointer_adapter(__lhs.get() + __offset); } \
409 inline friend _Pointer_adapter \
410 operator+(INT_TYPE __offset, const _Pointer_adapter& __rhs) \
411 { return _Pointer_adapter(__rhs.get() + __offset); } \
413 inline friend _Pointer_adapter \
414 operator-(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
415 { return _Pointer_adapter(__lhs.get() - __offset); } \
417 inline _Pointer_adapter& \
418 operator+=(INT_TYPE __offset) \
420 _Storage_policy::set(_Storage_policy::get() + __offset); \
424 inline _Pointer_adapter& \
425 operator-=(INT_TYPE __offset) \
427 _Storage_policy::set(_Storage_policy::get() - __offset); \
430 // END of _CXX_POINTER_ARITH_OPERATOR_SET macro
433 _CXX_POINTER_ARITH_OPERATOR_SET(
short);
434 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned short);
435 _CXX_POINTER_ARITH_OPERATOR_SET(
int);
436 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned int);
437 _CXX_POINTER_ARITH_OPERATOR_SET(
long);
438 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long);
474 #define _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(OPERATOR) \
475 template<typename _Tp1, typename _Tp2> \
477 operator OPERATOR(const _Pointer_adapter<_Tp1>& __lhs, _Tp2 __rhs) \
478 { return __lhs.get() OPERATOR __rhs; } \
480 template<typename _Tp1, typename _Tp2> \
482 operator OPERATOR(_Tp1 __lhs, const _Pointer_adapter<_Tp2>& __rhs) \
483 { return __lhs OPERATOR __rhs.get(); } \
485 template<typename _Tp1, typename _Tp2> \
487 operator OPERATOR(const _Pointer_adapter<_Tp1>& __lhs, \
488 const _Pointer_adapter<_Tp2>& __rhs) \
489 { return __lhs.get() OPERATOR __rhs.get(); } \
491 // End GCC_CXX_POINTER_COMPARISON_OPERATION_SET Macro
494 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(==)
495 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(!=)
496 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(<)
497 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(<=)
498 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(>)
499 _GCC_CXX_POINTER_COMPARISON_OPERATION_SET(>=)
502 template<typename _Tp>
505 {
return __lhs.get() ==
reinterpret_cast<void*
>(__rhs); }
507 template<
typename _Tp>
509 operator==(
int __lhs,
const _Pointer_adapter<_Tp>& __rhs)
510 {
return __rhs.get() ==
reinterpret_cast<void*
>(__lhs); }
512 template<
typename _Tp>
514 operator!=(
const _Pointer_adapter<_Tp>& __lhs,
int __rhs)
515 {
return __lhs.get() !=
reinterpret_cast<void*
>(__rhs); }
517 template<
typename _Tp>
519 operator!=(
int __lhs,
const _Pointer_adapter<_Tp>& __rhs)
520 {
return __rhs.get() !=
reinterpret_cast<void*
>(__lhs); }
526 template<
typename _Tp>
530 {
return __lhs._Tp::operator==(__rhs); }
532 template<
typename _Tp>
534 operator<=(const _Pointer_adapter<_Tp>& __lhs,
535 const _Pointer_adapter<_Tp>& __rhs)
536 {
return __lhs._Tp::operator<(__rhs) || __lhs._Tp::operator==(__rhs); }
538 template<
typename _Tp>
540 operator!=(
const _Pointer_adapter<_Tp>& __lhs,
541 const _Pointer_adapter<_Tp>& __rhs)
542 {
return !(__lhs._Tp::operator==(__rhs)); }
544 template<
typename _Tp>
546 operator>(
const _Pointer_adapter<_Tp>& __lhs,
547 const _Pointer_adapter<_Tp>& __rhs)
548 {
return !(__lhs._Tp::operator<(__rhs) || __lhs._Tp::operator==(__rhs)); }
550 template<
typename _Tp>
552 operator>=(
const _Pointer_adapter<_Tp>& __lhs,
553 const _Pointer_adapter<_Tp>& __rhs)
554 {
return !(__lhs._Tp::operator<(__rhs)); }
556 template<
typename _CharT,
typename _Traits,
typename _StoreT>
558 operator<<(std::basic_ostream<_CharT, _Traits>& __os,
559 const _Pointer_adapter<_StoreT>& __p)
560 {
return (__os << __p.get()); }
562 _GLIBCXX_END_NAMESPACE_VERSION
565 #ifdef __GXX_EXPERIMENTAL_CXX0X__
566 namespace std _GLIBCXX_VISIBILITY(default)
568 _GLIBCXX_BEGIN_NAMESPACE_VERSION
570 template<
typename _Storage_policy>
571 struct pointer_traits<__gnu_cxx::_Pointer_adapter<_Storage_policy>>
580 template<
typename _Up>
582 typename pointer_traits<_Storage_policy>::rebind<_Up>>;
584 static pointer pointer_to(
typename pointer::reference __r) noexcept
588 _GLIBCXX_END_NAMESPACE_VERSION