libstdc++: Add __maybe_const_t and __maybe_empty_t aliases
authorJonathan Wakely <jwakely@redhat.com>
Wed, 26 Feb 2020 15:19:43 +0000 (15:19 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 26 Feb 2020 15:19:43 +0000 (15:19 +0000)
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.

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/ranges

index 071ba3a2a0460aeab9f259e8d9b05e23efeeba0d..c13d6fc48f4316ba9200e380edafe124c2aa1289 100644 (file)
@@ -1,3 +1,13 @@
+2020-02-26  Jonathan Wakely  <jwakely@redhat.com>
+
+       * 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.
+
 2020-02-25  Patrick Palka  <ppalka@redhat.com>
 
        LWG 3397 basic_istream_view::iterator should not provide
index a7f4da957ef1d720710149ee6d6bf98d401684b4..d83266321661b5e98d2a3274df75a8a9784fd0d8 100644 (file)
@@ -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>();