279 class _Pointer_adapter :
public _Storage_policy
282 typedef typename _Storage_policy::element_type element_type;
286 typedef typename _Unqualified_type<element_type>::type value_type;
287 typedef std::ptrdiff_t difference_type;
288 typedef _Pointer_adapter pointer;
289 typedef typename _Reference_type<element_type>::reference reference;
296 _Pointer_adapter(element_type* __arg = 0)
297 { _Storage_policy::set(__arg); }
300 _Pointer_adapter(
const _Pointer_adapter& __arg)
301 { _Storage_policy::set(__arg.get()); }
304 template<
typename _Up>
305 _Pointer_adapter(_Up* __arg)
306 { _Storage_policy::set(__arg); }
310 template<
typename _Up>
311 _Pointer_adapter(
const _Pointer_adapter<_Up>& __arg)
312 { _Storage_policy::set(__arg.get()); }
315 ~_Pointer_adapter() { }
319 operator=(
const _Pointer_adapter& __arg)
321 _Storage_policy::set(__arg.get());
325 template<
typename _Up>
327 operator=(
const _Pointer_adapter<_Up>& __arg)
329 _Storage_policy::set(__arg.get());
333 template<
typename _Up>
335 operator=(_Up* __arg)
337 _Storage_policy::set(__arg);
344 {
return *(_Storage_policy::get()); }
349 {
return _Storage_policy::get(); }
353 operator[](std::ptrdiff_t __index)
const
354 {
return _Storage_policy::get()[__index]; }
357#if __cplusplus >= 201103L
358 explicit operator bool()
const {
return _Storage_policy::get() != 0; }
361 typedef element_type*(_Pointer_adapter::*__unspecified_bool_type)()
const;
364 operator __unspecified_bool_type()
const
366 return _Storage_policy::get() == 0 ? 0 :
367 &_Pointer_adapter::operator->;
373 {
return (_Storage_policy::get() == 0); }
377 inline friend std::ptrdiff_t
378 operator-(
const _Pointer_adapter& __lhs, element_type* __rhs)
379 {
return (__lhs.get() - __rhs); }
381 inline friend std::ptrdiff_t
382 operator-(element_type* __lhs,
const _Pointer_adapter& __rhs)
383 {
return (__lhs - __rhs.get()); }
385 template<
typename _Up>
386 inline friend std::ptrdiff_t
387 operator-(
const _Pointer_adapter& __lhs, _Up* __rhs)
388 {
return (__lhs.get() - __rhs); }
390 template<
typename _Up>
391 inline friend std::ptrdiff_t
392 operator-(_Up* __lhs,
const _Pointer_adapter& __rhs)
393 {
return (__lhs - __rhs.get()); }
395 template<
typename _Up>
396 inline std::ptrdiff_t
397 operator-(
const _Pointer_adapter<_Up>& __rhs)
const
398 {
return (_Storage_policy::get() - __rhs.get()); }
407#define _CXX_POINTER_ARITH_OPERATOR_SET(INT_TYPE) \
408 inline friend _Pointer_adapter \
409 operator+(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
410 { return _Pointer_adapter(__lhs.get() + __offset); } \
412 inline friend _Pointer_adapter \
413 operator+(INT_TYPE __offset, const _Pointer_adapter& __rhs) \
414 { return _Pointer_adapter(__rhs.get() + __offset); } \
416 inline friend _Pointer_adapter \
417 operator-(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
418 { return _Pointer_adapter(__lhs.get() - __offset); } \
420 inline _Pointer_adapter& \
421 operator+=(INT_TYPE __offset) \
423 _Storage_policy::set(_Storage_policy::get() + __offset); \
427 inline _Pointer_adapter& \
428 operator-=(INT_TYPE __offset) \
430 _Storage_policy::set(_Storage_policy::get() - __offset); \
436 _CXX_POINTER_ARITH_OPERATOR_SET(
short);
437 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned short);
438 _CXX_POINTER_ARITH_OPERATOR_SET(
int);
439 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned int);
440 _CXX_POINTER_ARITH_OPERATOR_SET(
long);
441 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long);
442#ifdef _GLIBCXX_USE_LONG_LONG
443#pragma GCC diagnostic push
444#pragma GCC diagnostic ignored "-Wlong-long"
445 _CXX_POINTER_ARITH_OPERATOR_SET(
long long);
446 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long long);
447#pragma GCC diagnostic pop
451 inline _Pointer_adapter&
454 _Storage_policy::set(_Storage_policy::get() + 1);
458 inline _Pointer_adapter
461 _Pointer_adapter __tmp(*
this);
462 _Storage_policy::set(_Storage_policy::get() + 1);
466 inline _Pointer_adapter&
469 _Storage_policy::set(_Storage_policy::get() - 1);
473 inline _Pointer_adapter
476 _Pointer_adapter __tmp(*
this);
477 _Storage_policy::set(_Storage_policy::get() - 1);
481#if __cpp_lib_three_way_comparison
482 friend std::strong_ordering
483 operator<=>(
const _Pointer_adapter& __lhs,
const _Pointer_adapter& __rhs)
485 {
return __lhs.get() <=> __rhs.get(); }