275 class _Pointer_adapter :
public _Storage_policy
278 typedef typename _Storage_policy::element_type element_type;
282 typedef typename _Unqualified_type<element_type>::type value_type;
283 typedef std::ptrdiff_t difference_type;
284 typedef _Pointer_adapter pointer;
285 typedef typename _Reference_type<element_type>::reference reference;
292 _Pointer_adapter(element_type* __arg = 0)
293 { _Storage_policy::set(__arg); }
296 _Pointer_adapter(
const _Pointer_adapter& __arg)
297 { _Storage_policy::set(__arg.get()); }
300 template<
typename _Up>
301 _Pointer_adapter(_Up* __arg)
302 { _Storage_policy::set(__arg); }
306 template<
typename _Up>
307 _Pointer_adapter(
const _Pointer_adapter<_Up>& __arg)
308 { _Storage_policy::set(__arg.get()); }
311 ~_Pointer_adapter() { }
315 operator=(
const _Pointer_adapter& __arg)
317 _Storage_policy::set(__arg.get());
321 template<
typename _Up>
323 operator=(
const _Pointer_adapter<_Up>& __arg)
325 _Storage_policy::set(__arg.get());
329 template<
typename _Up>
331 operator=(_Up* __arg)
333 _Storage_policy::set(__arg);
340 {
return *(_Storage_policy::get()); }
345 {
return _Storage_policy::get(); }
349 operator[](std::ptrdiff_t __index)
const
350 {
return _Storage_policy::get()[__index]; }
353#if __cplusplus >= 201103L
354 explicit operator bool()
const {
return _Storage_policy::get() != 0; }
357 typedef element_type*(_Pointer_adapter::*__unspecified_bool_type)()
const;
360 operator __unspecified_bool_type()
const
362 return _Storage_policy::get() == 0 ? 0 :
363 &_Pointer_adapter::operator->;
369 {
return (_Storage_policy::get() == 0); }
373 inline friend std::ptrdiff_t
374 operator-(
const _Pointer_adapter& __lhs, element_type* __rhs)
375 {
return (__lhs.get() - __rhs); }
377 inline friend std::ptrdiff_t
378 operator-(element_type* __lhs,
const _Pointer_adapter& __rhs)
379 {
return (__lhs - __rhs.get()); }
381 template<
typename _Up>
382 inline friend std::ptrdiff_t
383 operator-(
const _Pointer_adapter& __lhs, _Up* __rhs)
384 {
return (__lhs.get() - __rhs); }
386 template<
typename _Up>
387 inline friend std::ptrdiff_t
388 operator-(_Up* __lhs,
const _Pointer_adapter& __rhs)
389 {
return (__lhs - __rhs.get()); }
391 template<
typename _Up>
392 inline std::ptrdiff_t
393 operator-(
const _Pointer_adapter<_Up>& __rhs)
const
394 {
return (_Storage_policy::get() - __rhs.get()); }
403#define _CXX_POINTER_ARITH_OPERATOR_SET(INT_TYPE) \
404 inline friend _Pointer_adapter \
405 operator+(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
406 { return _Pointer_adapter(__lhs.get() + __offset); } \
408 inline friend _Pointer_adapter \
409 operator+(INT_TYPE __offset, const _Pointer_adapter& __rhs) \
410 { return _Pointer_adapter(__rhs.get() + __offset); } \
412 inline friend _Pointer_adapter \
413 operator-(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
414 { return _Pointer_adapter(__lhs.get() - __offset); } \
416 inline _Pointer_adapter& \
417 operator+=(INT_TYPE __offset) \
419 _Storage_policy::set(_Storage_policy::get() + __offset); \
423 inline _Pointer_adapter& \
424 operator-=(INT_TYPE __offset) \
426 _Storage_policy::set(_Storage_policy::get() - __offset); \
432 _CXX_POINTER_ARITH_OPERATOR_SET(
short);
433 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned short);
434 _CXX_POINTER_ARITH_OPERATOR_SET(
int);
435 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned int);
436 _CXX_POINTER_ARITH_OPERATOR_SET(
long);
437 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long);
438#ifdef _GLIBCXX_USE_LONG_LONG
439#pragma GCC diagnostic push
440#pragma GCC diagnostic ignored "-Wlong-long"
441 _CXX_POINTER_ARITH_OPERATOR_SET(
long long);
442 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long long);
443#pragma GCC diagnostic pop
447 inline _Pointer_adapter&
450 _Storage_policy::set(_Storage_policy::get() + 1);
454 inline _Pointer_adapter
457 _Pointer_adapter __tmp(*
this);
458 _Storage_policy::set(_Storage_policy::get() + 1);
462 inline _Pointer_adapter&
465 _Storage_policy::set(_Storage_policy::get() - 1);
469 inline _Pointer_adapter
472 _Pointer_adapter __tmp(*
this);
473 _Storage_policy::set(_Storage_policy::get() - 1);
477#if __cpp_lib_three_way_comparison
478 friend std::strong_ordering
479 operator<=>(
const _Pointer_adapter& __lhs,
const _Pointer_adapter& __rhs)
481 {
return __lhs.get() <=> __rhs.get(); }