aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2020-02-26 15:19:43 +0000
committerJonathan Wakely <jwakely@redhat.com>2020-02-26 15:19:43 +0000
commit8017d95c7f55b98bcee1caf0216fdfd7fd613849 (patch)
tree1809954a9a655bb8e75f52ca13ca84aaee3736c7 /libstdc++-v3/include
parent4a305fa2fd4c9d553b26efa00f868aa1e4416a9f (diff)
downloadgcc-8017d95c7f55b98bcee1caf0216fdfd7fd613849.zip
gcc-8017d95c7f55b98bcee1caf0216fdfd7fd613849.tar.gz
gcc-8017d95c7f55b98bcee1caf0216fdfd7fd613849.tar.bz2
libstdc++: Add __maybe_const_t and __maybe_empty_t aliases
This introduces a couple of convenience alias templates to be used for some repeated patterns using std::conditional_t. * include/std/ranges (__detail::__maybe_empty_t): Define new helper alias. (__detail::__maybe_const_t): Likewise. (__adaptor::_RangeAdaptor): Use __maybe_empty_t. (transform_view, take_view, take_while_view, elements_view): Use __maybe_const_t. (join_view, split_view): Use both.
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r--libstdc++-v3/include/std/ranges53
1 files changed, 29 insertions, 24 deletions
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index a7f4da9..d832663 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -1029,6 +1029,13 @@ namespace views
namespace __detail
{
struct _Empty { };
+
+ template<bool _NonEmpty, typename _Tp>
+ using __maybe_empty_t = conditional_t<_NonEmpty, _Tp, _Empty>;
+
+ template<bool _Const, typename _Tp>
+ using __maybe_const_t = conditional_t<_Const, const _Tp, _Tp>;
+
} // namespace __detail
namespace views
@@ -1058,8 +1065,8 @@ namespace views
{
protected:
[[no_unique_address]]
- conditional_t<!is_default_constructible_v<_Callable>,
- _Callable, __detail::_Empty> _M_callable;
+ __detail::__maybe_empty_t<!is_default_constructible_v<_Callable>,
+ _Callable> _M_callable;
public:
constexpr
@@ -1552,9 +1559,8 @@ namespace views
struct _Iterator
{
private:
- using _Parent
- = conditional_t<_Const, const transform_view, transform_view>;
- using _Base = conditional_t<_Const, const _Vp, _Vp>;
+ using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
+ using _Base = __detail::__maybe_const_t<_Const, _Vp>;
static constexpr auto
_S_iter_concept()
@@ -1760,9 +1766,8 @@ namespace views
struct _Sentinel
{
private:
- using _Parent
- = conditional_t<_Const, const transform_view, transform_view>;
- using _Base = conditional_t<_Const, const _Vp, _Vp>;
+ using _Parent = __detail::__maybe_const_t<_Const, transform_view>;
+ using _Base = __detail::__maybe_const_t<_Const, _Vp>;
constexpr range_difference_t<_Base>
__distance_from(const _Iterator<_Const>& __i) const
@@ -1886,7 +1891,7 @@ namespace views
struct _Sentinel
{
private:
- using _Base = conditional_t<_Const, const _Vp, _Vp>;
+ using _Base = __detail::__maybe_const_t<_Const, _Vp>;
using _CI = counted_iterator<iterator_t<_Base>>;
sentinel_t<_Base> _M_end = sentinel_t<_Base>();
@@ -2025,7 +2030,7 @@ namespace views
struct _Sentinel
{
private:
- using _Base = conditional_t<_Const, const _Vp, _Vp>;
+ using _Base = __detail::__maybe_const_t<_Const, _Vp>;
sentinel_t<_Base> _M_end = sentinel_t<_Base>();
const _Pred* _M_pred = nullptr;
@@ -2258,8 +2263,8 @@ namespace views
struct _Iterator
{
private:
- using _Parent = conditional_t<_Const, const join_view, join_view>;
- using _Base = conditional_t<_Const, const _Vp, _Vp>;
+ using _Parent = __detail::__maybe_const_t<_Const, join_view>;
+ using _Base = __detail::__maybe_const_t<_Const, _Vp>;
static constexpr bool _S_ref_is_glvalue
= is_reference_v<range_reference_t<_Base>>;
@@ -2450,8 +2455,8 @@ namespace views
struct _Sentinel
{
private:
- using _Parent = conditional_t<_Const, const join_view, join_view>;
- using _Base = conditional_t<_Const, const _Vp, _Vp>;
+ using _Parent = __detail::__maybe_const_t<_Const, join_view>;
+ using _Base = __detail::__maybe_const_t<_Const, _Vp>;
constexpr bool
__equal(const _Iterator<_Const>& __i) const
@@ -2482,8 +2487,8 @@ namespace views
// XXX: _M_inner is "present only when !is_reference_v<_InnerRange>"
[[no_unique_address]]
- conditional_t<!is_reference_v<_InnerRange>,
- views::all_t<_InnerRange>, __detail::_Empty> _M_inner;
+ __detail::__maybe_empty_t<!is_reference_v<_InnerRange>,
+ views::all_t<_InnerRange>> _M_inner;
public:
join_view() = default;
@@ -2585,8 +2590,8 @@ namespace views
struct _OuterIter
{
private:
- using _Parent = conditional_t<_Const, const split_view, split_view>;
- using _Base = conditional_t<_Const, const _Vp, _Vp>;
+ using _Parent = __detail::__maybe_const_t<_Const, split_view>;
+ using _Base = __detail::__maybe_const_t<_Const, _Vp>;
constexpr bool
__at_end() const
@@ -2618,8 +2623,8 @@ namespace views
// XXX: _M_current is present only if "V models forward_range"
[[no_unique_address]]
- conditional_t<forward_range<_Vp>,
- iterator_t<_Base>, __detail::_Empty> _M_current;
+ __detail::__maybe_empty_t<forward_range<_Vp>,
+ iterator_t<_Base>> _M_current;
public:
using iterator_concept = conditional_t<forward_range<_Base>,
@@ -2732,7 +2737,7 @@ namespace views
struct _InnerIter
{
private:
- using _Base = conditional_t<_Const, const _Vp, _Vp>;
+ using _Base = __detail::__maybe_const_t<_Const, _Vp>;
constexpr bool
__at_end() const
@@ -2858,8 +2863,8 @@ namespace views
// XXX: _M_current is "present only if !forward_range<V>"
[[no_unique_address]]
- conditional_t<!forward_range<_Vp>,
- iterator_t<_Vp>, __detail::_Empty> _M_current;
+ __detail::__maybe_empty_t<!forward_range<_Vp>, iterator_t<_Vp>>
+ _M_current;
public:
@@ -3223,7 +3228,7 @@ namespace views
template<bool _Const>
struct _Iterator
{
- using _Base = conditional_t<_Const, const _Vp, _Vp>;
+ using _Base = __detail::__maybe_const_t<_Const, _Vp>;
iterator_t<_Base> _M_current = iterator_t<_Base>();