File indexing completed on 2026-05-03 08:13:56
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LIBCPP___MEMORY_COMPRESSED_PAIR_H
0011 #define _LIBCPP___MEMORY_COMPRESSED_PAIR_H
0012
0013 #include <__config>
0014 #include <__cstddef/size_t.h>
0015 #include <__type_traits/datasizeof.h>
0016 #include <__type_traits/is_empty.h>
0017 #include <__type_traits/is_final.h>
0018 #include <__type_traits/is_reference.h>
0019
0020 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0021 # pragma GCC system_header
0022 #endif
0023
0024 _LIBCPP_BEGIN_NAMESPACE_STD
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058 #ifndef _LIBCPP_ABI_NO_COMPRESSED_PAIR_PADDING
0059
0060 template <class _Tp>
0061 inline const size_t __compressed_pair_alignment = _LIBCPP_ALIGNOF(_Tp);
0062
0063 template <class _Tp>
0064 inline const size_t __compressed_pair_alignment<_Tp&> = _LIBCPP_ALIGNOF(void*);
0065
0066 template <class _ToPad,
0067 bool _Empty = ((is_empty<_ToPad>::value && !__libcpp_is_final<_ToPad>::value) ||
0068 is_reference<_ToPad>::value || sizeof(_ToPad) == __datasizeof_v<_ToPad>)>
0069 class __compressed_pair_padding {
0070 char __padding_[sizeof(_ToPad) - __datasizeof_v<_ToPad>] = {};
0071 };
0072
0073 template <class _ToPad>
0074 class __compressed_pair_padding<_ToPad, true> {};
0075
0076 # define _LIBCPP_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2) \
0077 _LIBCPP_NO_UNIQUE_ADDRESS __attribute__((__aligned__(::std::__compressed_pair_alignment<T2>))) T1 Initializer1; \
0078 _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding<T1> _LIBCPP_CONCAT3(__padding1_, __LINE__, _); \
0079 _LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \
0080 _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding<T2> _LIBCPP_CONCAT3(__padding2_, __LINE__, _)
0081
0082 # define _LIBCPP_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3, Initializer3) \
0083 _LIBCPP_NO_UNIQUE_ADDRESS \
0084 __attribute__((__aligned__(::std::__compressed_pair_alignment<T2>), \
0085 __aligned__(::std::__compressed_pair_alignment<T3>))) T1 Initializer1; \
0086 _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding<T1> _LIBCPP_CONCAT3(__padding1_, __LINE__, _); \
0087 _LIBCPP_NO_UNIQUE_ADDRESS T2 Initializer2; \
0088 _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding<T2> _LIBCPP_CONCAT3(__padding2_, __LINE__, _); \
0089 _LIBCPP_NO_UNIQUE_ADDRESS T3 Initializer3; \
0090 _LIBCPP_NO_UNIQUE_ADDRESS ::std::__compressed_pair_padding<T3> _LIBCPP_CONCAT3(__padding3_, __LINE__, _)
0091
0092 #else
0093 # define _LIBCPP_COMPRESSED_PAIR(T1, Name1, T2, Name2) \
0094 _LIBCPP_NO_UNIQUE_ADDRESS T1 Name1; \
0095 _LIBCPP_NO_UNIQUE_ADDRESS T2 Name2
0096
0097 # define _LIBCPP_COMPRESSED_TRIPLE(T1, Name1, T2, Name2, T3, Name3) \
0098 _LIBCPP_NO_UNIQUE_ADDRESS T1 Name1; \
0099 _LIBCPP_NO_UNIQUE_ADDRESS T2 Name2; \
0100 _LIBCPP_NO_UNIQUE_ADDRESS T3 Name3
0101 #endif
0102
0103 _LIBCPP_END_NAMESPACE_STD
0104
0105 #endif