276 class _Pointer_adapter :
public _Storage_policy
279 typedef typename _Storage_policy::element_type element_type;
283 typedef typename _Unqualified_type<element_type>::type value_type;
284 typedef std::ptrdiff_t difference_type;
285 typedef _Pointer_adapter pointer;
286 typedef typename _Reference_type<element_type>::reference reference;
293 _Pointer_adapter(element_type* __arg = 0)
294 { _Storage_policy::set(__arg); }
297 _Pointer_adapter(
const _Pointer_adapter& __arg)
298 { _Storage_policy::set(__arg.get()); }
301 template<
typename _Up>
302 _Pointer_adapter(_Up* __arg)
303 { _Storage_policy::set(__arg); }
307 template<
typename _Up>
308 _Pointer_adapter(
const _Pointer_adapter<_Up>& __arg)
309 { _Storage_policy::set(__arg.get()); }
312 ~_Pointer_adapter() { }
316 operator=(
const _Pointer_adapter& __arg)
318 _Storage_policy::set(__arg.get());
322 template<
typename _Up>
324 operator=(
const _Pointer_adapter<_Up>& __arg)
326 _Storage_policy::set(__arg.get());
330 template<
typename _Up>
332 operator=(_Up* __arg)
334 _Storage_policy::set(__arg);
341 {
return *(_Storage_policy::get()); }
346 {
return _Storage_policy::get(); }
350 operator[](std::ptrdiff_t __index)
const
351 {
return _Storage_policy::get()[__index]; }
354#if __cplusplus >= 201103L
355 explicit operator bool()
const {
return _Storage_policy::get() != 0; }
358 typedef element_type*(_Pointer_adapter::*__unspecified_bool_type)()
const;
361 operator __unspecified_bool_type()
const
363 return _Storage_policy::get() == 0 ? 0 :
364 &_Pointer_adapter::operator->;
370 {
return (_Storage_policy::get() == 0); }
374 inline friend std::ptrdiff_t
375 operator-(
const _Pointer_adapter& __lhs, element_type* __rhs)
376 {
return (__lhs.get() - __rhs); }
378 inline friend std::ptrdiff_t
379 operator-(element_type* __lhs,
const _Pointer_adapter& __rhs)
380 {
return (__lhs - __rhs.get()); }
382 template<
typename _Up>
383 inline friend std::ptrdiff_t
384 operator-(
const _Pointer_adapter& __lhs, _Up* __rhs)
385 {
return (__lhs.get() - __rhs); }
387 template<
typename _Up>
388 inline friend std::ptrdiff_t
389 operator-(_Up* __lhs,
const _Pointer_adapter& __rhs)
390 {
return (__lhs - __rhs.get()); }
392 template<
typename _Up>
393 inline std::ptrdiff_t
394 operator-(
const _Pointer_adapter<_Up>& __rhs)
const
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); \
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);
439#ifdef _GLIBCXX_USE_LONG_LONG
440#pragma GCC diagnostic push
441#pragma GCC diagnostic ignored "-Wlong-long"
442 _CXX_POINTER_ARITH_OPERATOR_SET(
long long);
443 _CXX_POINTER_ARITH_OPERATOR_SET(
unsigned long long);
444#pragma GCC diagnostic pop
448 inline _Pointer_adapter&
451 _Storage_policy::set(_Storage_policy::get() + 1);
455 inline _Pointer_adapter
458 _Pointer_adapter __tmp(*
this);
459 _Storage_policy::set(_Storage_policy::get() + 1);
463 inline _Pointer_adapter&
466 _Storage_policy::set(_Storage_policy::get() - 1);
470 inline _Pointer_adapter
473 _Pointer_adapter __tmp(*
this);
474 _Storage_policy::set(_Storage_policy::get() - 1);
478#if __cpp_lib_three_way_comparison
479 friend std::strong_ordering
480 operator<=>(
const _Pointer_adapter& __lhs,
const _Pointer_adapter& __rhs)
482 {
return __lhs.get() <=> __rhs.get(); }