278 class _Pointer_adapter :
public _Storage_policy
281 typedef typename _Storage_policy::element_type element_type;
285 typedef typename _Unqualified_type<element_type>::type value_type;
286 typedef std::ptrdiff_t difference_type;
287 typedef _Pointer_adapter pointer;
288 typedef typename _Reference_type<element_type>::reference reference;
295 _Pointer_adapter(element_type* __arg = 0)
296 { _Storage_policy::set(__arg); }
299 _Pointer_adapter(
const _Pointer_adapter& __arg)
300 { _Storage_policy::set(__arg.get()); }
303 template<
typename _Up>
304 _Pointer_adapter(_Up* __arg)
305 { _Storage_policy::set(__arg); }
309 template<
typename _Up>
310 _Pointer_adapter(
const _Pointer_adapter<_Up>& __arg)
311 { _Storage_policy::set(__arg.get()); }
314 ~_Pointer_adapter() { }
318 operator=(
const _Pointer_adapter& __arg)
320 _Storage_policy::set(__arg.get());
324 template<
typename _Up>
326 operator=(
const _Pointer_adapter<_Up>& __arg)
328 _Storage_policy::set(__arg.get());
332 template<
typename _Up>
334 operator=(_Up* __arg)
336 _Storage_policy::set(__arg);
343 {
return *(_Storage_policy::get()); }
348 {
return _Storage_policy::get(); }
352 operator[](std::ptrdiff_t __index)
const
353 {
return _Storage_policy::get()[__index]; }
356#if __cplusplus >= 201103L
357 explicit operator bool()
const {
return _Storage_policy::get() != 0; }
360 typedef element_type*(_Pointer_adapter::*__unspecified_bool_type)()
const;
363 operator __unspecified_bool_type()
const
365 return _Storage_policy::get() == 0 ? 0 :
366 &_Pointer_adapter::operator->;
372 {
return (_Storage_policy::get() == 0); }
376 inline friend std::ptrdiff_t
377 operator-(
const _Pointer_adapter& __lhs, element_type* __rhs)
378 {
return (__lhs.get() - __rhs); }
380 inline friend std::ptrdiff_t
381 operator-(element_type* __lhs,
const _Pointer_adapter& __rhs)
382 {
return (__lhs - __rhs.get()); }
384 template<
typename _Up>
385 inline friend std::ptrdiff_t
386 operator-(
const _Pointer_adapter& __lhs, _Up* __rhs)
387 {
return (__lhs.get() - __rhs); }
389 template<
typename _Up>
390 inline friend std::ptrdiff_t
391 operator-(_Up* __lhs,
const _Pointer_adapter& __rhs)
392 {
return (__lhs - __rhs.get()); }
394 template<
typename _Up>
395 inline std::ptrdiff_t
396 operator-(
const _Pointer_adapter<_Up>& __rhs)
const
397 {
return (_Storage_policy::get() - __rhs.get()); }
406#define _CXX_POINTER_ARITH_OPERATOR_SET(INT_TYPE) \
407 inline friend _Pointer_adapter \
408 operator+(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
409 { return _Pointer_adapter(__lhs.get() + __offset); } \
411 inline friend _Pointer_adapter \
412 operator+(INT_TYPE __offset, const _Pointer_adapter& __rhs) \
413 { return _Pointer_adapter(__rhs.get() + __offset); } \
415 inline friend _Pointer_adapter \
416 operator-(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
417 { return _Pointer_adapter(__lhs.get() - __offset); } \
419 inline _Pointer_adapter& \
420 operator+=(INT_TYPE __offset) \
422 _Storage_policy::set(_Storage_policy::get() + __offset); \
426 inline _Pointer_adapter& \
427 operator-=(INT_TYPE __offset) \
429 _Storage_policy::set(_Storage_policy::get() - __offset); \
435 _CXX_POINTER_ARITH_OPERATOR_SET(
short);
436 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned short);
437 _CXX_POINTER_ARITH_OPERATOR_SET(
int);
438 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned int);
439 _CXX_POINTER_ARITH_OPERATOR_SET(
long);
440 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long);
441#ifdef _GLIBCXX_USE_LONG_LONG
442#pragma GCC diagnostic push
443#pragma GCC diagnostic ignored "-Wlong-long"
444 _CXX_POINTER_ARITH_OPERATOR_SET(
long long);
445 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long long);
446#pragma GCC diagnostic pop
450 inline _Pointer_adapter&
453 _Storage_policy::set(_Storage_policy::get() + 1);
457 inline _Pointer_adapter
460 _Pointer_adapter __tmp(*
this);
461 _Storage_policy::set(_Storage_policy::get() + 1);
465 inline _Pointer_adapter&
468 _Storage_policy::set(_Storage_policy::get() - 1);
472 inline _Pointer_adapter
475 _Pointer_adapter __tmp(*
this);
476 _Storage_policy::set(_Storage_policy::get() - 1);
480#if __cpp_lib_three_way_comparison
481 friend std::strong_ordering
482 operator<=>(
const _Pointer_adapter& __lhs,
const _Pointer_adapter& __rhs)
484 {
return __lhs.get() <=> __rhs.get(); }