272 class _Pointer_adapter :
public _Storage_policy
275 typedef typename _Storage_policy::element_type element_type;
279 typedef typename _Unqualified_type<element_type>::type value_type;
280 typedef std::ptrdiff_t difference_type;
281 typedef _Pointer_adapter pointer;
282 typedef typename _Reference_type<element_type>::reference reference;
289 _Pointer_adapter(element_type* __arg = 0)
290 { _Storage_policy::set(__arg); }
293 _Pointer_adapter(
const _Pointer_adapter& __arg)
294 { _Storage_policy::set(__arg.get()); }
297 template<
typename _Up>
298 _Pointer_adapter(_Up* __arg)
299 { _Storage_policy::set(__arg); }
303 template<
typename _Up>
304 _Pointer_adapter(
const _Pointer_adapter<_Up>& __arg)
305 { _Storage_policy::set(__arg.get()); }
308 ~_Pointer_adapter() { }
312 operator=(
const _Pointer_adapter& __arg)
314 _Storage_policy::set(__arg.get());
318 template<
typename _Up>
320 operator=(
const _Pointer_adapter<_Up>& __arg)
322 _Storage_policy::set(__arg.get());
326 template<
typename _Up>
328 operator=(_Up* __arg)
330 _Storage_policy::set(__arg);
337 {
return *(_Storage_policy::get()); }
342 {
return _Storage_policy::get(); }
346 operator[](std::ptrdiff_t __index)
const
347 {
return _Storage_policy::get()[__index]; }
350#if __cplusplus >= 201103L
351 explicit operator bool()
const {
return _Storage_policy::get() != 0; }
354 typedef element_type*(_Pointer_adapter::*__unspecified_bool_type)()
const;
357 operator __unspecified_bool_type()
const
359 return _Storage_policy::get() == 0 ? 0 :
360 &_Pointer_adapter::operator->;
366 {
return (_Storage_policy::get() == 0); }
370 inline friend std::ptrdiff_t
371 operator-(
const _Pointer_adapter& __lhs, element_type* __rhs)
372 {
return (__lhs.get() - __rhs); }
374 inline friend std::ptrdiff_t
375 operator-(element_type* __lhs,
const _Pointer_adapter& __rhs)
376 {
return (__lhs - __rhs.get()); }
378 template<
typename _Up>
379 inline friend std::ptrdiff_t
380 operator-(
const _Pointer_adapter& __lhs, _Up* __rhs)
381 {
return (__lhs.get() - __rhs); }
383 template<
typename _Up>
384 inline friend std::ptrdiff_t
385 operator-(_Up* __lhs,
const _Pointer_adapter& __rhs)
386 {
return (__lhs - __rhs.get()); }
388 template<
typename _Up>
389 inline std::ptrdiff_t
390 operator-(
const _Pointer_adapter<_Up>& __rhs)
const
391 {
return (_Storage_policy::get() - __rhs.get()); }
400#define _CXX_POINTER_ARITH_OPERATOR_SET(INT_TYPE) \
401 inline friend _Pointer_adapter \
402 operator+(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
403 { return _Pointer_adapter(__lhs.get() + __offset); } \
405 inline friend _Pointer_adapter \
406 operator+(INT_TYPE __offset, const _Pointer_adapter& __rhs) \
407 { return _Pointer_adapter(__rhs.get() + __offset); } \
409 inline friend _Pointer_adapter \
410 operator-(const _Pointer_adapter& __lhs, INT_TYPE __offset) \
411 { return _Pointer_adapter(__lhs.get() - __offset); } \
413 inline _Pointer_adapter& \
414 operator+=(INT_TYPE __offset) \
416 _Storage_policy::set(_Storage_policy::get() + __offset); \
420 inline _Pointer_adapter& \
421 operator-=(INT_TYPE __offset) \
423 _Storage_policy::set(_Storage_policy::get() - __offset); \
429 _CXX_POINTER_ARITH_OPERATOR_SET(
short);
430 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned short);
431 _CXX_POINTER_ARITH_OPERATOR_SET(
int);
432 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned int);
433 _CXX_POINTER_ARITH_OPERATOR_SET(
long);
434 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long);
435#ifdef _GLIBCXX_USE_LONG_LONG
436 _CXX_POINTER_ARITH_OPERATOR_SET(
long long);
437 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long long);
441 inline _Pointer_adapter&
444 _Storage_policy::set(_Storage_policy::get() + 1);
448 inline _Pointer_adapter
451 _Pointer_adapter __tmp(*
this);
452 _Storage_policy::set(_Storage_policy::get() + 1);
456 inline _Pointer_adapter&
459 _Storage_policy::set(_Storage_policy::get() - 1);
463 inline _Pointer_adapter
466 _Pointer_adapter __tmp(*
this);
467 _Storage_policy::set(_Storage_policy::get() - 1);
471#if __cpp_lib_three_way_comparison
472 friend std::strong_ordering
473 operator<=>(
const _Pointer_adapter& __lhs,
const _Pointer_adapter& __rhs)
475 {
return __lhs.get() <=> __rhs.get(); }