[[no_unique_address]] __detail::__box<_Tp> _M_value;
};
+ template<typename _Tp>
+ single_view(_Tp) -> single_view<_Tp>;
+
namespace __detail
{
template<typename _Wp>
template<typename _Tp>
constexpr auto
operator()(_Tp&& __e) const
- { return single_view{std::forward<_Tp>(__e)}; }
+ { return single_view<decay_t<_Tp>>(std::forward<_Tp>(__e)); }
};
inline constexpr _Single single{};
template<typename _Tp>
constexpr auto
operator()(_Tp&& __e) const
- { return iota_view{std::forward<_Tp>(__e)}; }
+ { return iota_view(std::forward<_Tp>(__e)); }
template<typename _Tp, typename _Up>
constexpr auto
operator()(_Tp&& __e, _Up&& __f) const
- { return iota_view{std::forward<_Tp>(__e), std::forward<_Up>(__f)}; }
+ { return iota_view(std::forward<_Tp>(__e), std::forward<_Up>(__f)); }
};
inline constexpr _Iota iota{};
{
template<typename _Range, typename _Pred>
concept __can_filter_view
- = requires { filter_view{std::declval<_Range>(), std::declval<_Pred>()}; };
+ = requires { filter_view(std::declval<_Range>(), std::declval<_Pred>()); };
} // namespace __detail
struct _Filter : __adaptor::_RangeAdaptor<_Filter>
constexpr auto
operator()(_Range&& __r, _Pred&& __p) const
{
- return filter_view{std::forward<_Range>(__r), std::forward<_Pred>(__p)};
+ return filter_view(std::forward<_Range>(__r), std::forward<_Pred>(__p));
}
using _RangeAdaptor<_Filter>::operator();
{
template<typename _Range, typename _Fp>
concept __can_transform_view
- = requires { transform_view{std::declval<_Range>(), std::declval<_Fp>()}; };
+ = requires { transform_view(std::declval<_Range>(), std::declval<_Fp>()); };
} // namespace __detail
struct _Transform : __adaptor::_RangeAdaptor<_Transform>
constexpr auto
operator()(_Range&& __r, _Fp&& __f) const
{
- return transform_view{std::forward<_Range>(__r), std::forward<_Fp>(__f)};
+ return transform_view(std::forward<_Range>(__r), std::forward<_Fp>(__f));
}
using _RangeAdaptor<_Transform>::operator();
else
{
auto __sz = size();
- return counted_iterator{ranges::begin(_M_base), __sz};
+ return counted_iterator(ranges::begin(_M_base), __sz);
}
}
else
- return counted_iterator{ranges::begin(_M_base), _M_count};
+ return counted_iterator(ranges::begin(_M_base), _M_count);
}
constexpr auto
else
{
auto __sz = size();
- return counted_iterator{ranges::begin(_M_base), __sz};
+ return counted_iterator(ranges::begin(_M_base), __sz);
}
}
else
- return counted_iterator{ranges::begin(_M_base), _M_count};
+ return counted_iterator(ranges::begin(_M_base), _M_count);
}
constexpr auto
{
template<typename _Range, typename _Tp>
concept __can_take_view
- = requires { take_view{std::declval<_Range>(), std::declval<_Tp>()}; };
+ = requires { take_view(std::declval<_Range>(), std::declval<_Tp>()); };
} // namespace __detail
struct _Take : __adaptor::_RangeAdaptor<_Take>
constexpr auto
operator()(_Range&& __r, _Tp&& __n) const
{
- return take_view{std::forward<_Range>(__r), std::forward<_Tp>(__n)};
+ return take_view(std::forward<_Range>(__r), std::forward<_Tp>(__n));
}
using _RangeAdaptor<_Take>::operator();
{
template<typename _Range, typename _Pred>
concept __can_take_while_view
- = requires { take_while_view{std::declval<_Range>(), std::declval<_Pred>()}; };
+ = requires { take_while_view(std::declval<_Range>(), std::declval<_Pred>()); };
} // namespace __detail
struct _TakeWhile : __adaptor::_RangeAdaptor<_TakeWhile>
constexpr auto
operator()(_Range&& __r, _Pred&& __p) const
{
- return take_while_view{std::forward<_Range>(__r), std::forward<_Pred>(__p)};
+ return take_while_view(std::forward<_Range>(__r), std::forward<_Pred>(__p));
}
using _RangeAdaptor<_TakeWhile>::operator();
{
template<typename _Range, typename _Tp>
concept __can_drop_view
- = requires { drop_view{std::declval<_Range>(), std::declval<_Tp>()}; };
+ = requires { drop_view(std::declval<_Range>(), std::declval<_Tp>()); };
} // namespace __detail
struct _Drop : __adaptor::_RangeAdaptor<_Drop>
constexpr auto
operator()(_Range&& __r, _Tp&& __n) const
{
- return drop_view{std::forward<_Range>(__r), std::forward<_Tp>(__n)};
+ return drop_view(std::forward<_Range>(__r), std::forward<_Tp>(__n));
}
using _RangeAdaptor<_Drop>::operator();
{
template<typename _Range, typename _Pred>
concept __can_drop_while_view
- = requires { drop_while_view{std::declval<_Range>(), std::declval<_Pred>()}; };
+ = requires { drop_while_view(std::declval<_Range>(), std::declval<_Pred>()); };
} // namespace __detail
struct _DropWhile : __adaptor::_RangeAdaptor<_DropWhile>
constexpr auto
operator()(_Range&& __r, _Pred&& __p) const
{
- return drop_while_view{std::forward<_Range>(__r),
- std::forward<_Pred>(__p)};
+ return drop_while_view(std::forward<_Range>(__r),
+ std::forward<_Pred>(__p));
}
using _RangeAdaptor<_DropWhile>::operator();
&& constructible_from<_Pattern, single_view<range_value_t<_Range>>>
constexpr
split_view(_Range&& __r, range_value_t<_Range> __e)
- : _M_pattern(std::move(__e)),
+ : _M_pattern(views::single(std::move(__e))),
_M_base(views::all(std::forward<_Range>(__r)))
{ }
{
template<typename _Range, typename _Pattern>
concept __can_split_view
- = requires { split_view{std::declval<_Range>(), std::declval<_Pattern>()}; };
+ = requires { split_view(std::declval<_Range>(), std::declval<_Pattern>()); };
} // namespace __detail
struct _Split : __adaptor::_RangeAdaptor<_Split>
constexpr auto
operator()(_Range&& __r, _Pattern&& __f) const
{
- return split_view{std::forward<_Range>(__r), std::forward<_Pattern>(__f)};
+ return split_view(std::forward<_Range>(__r), std::forward<_Pattern>(__f));
}
using _RangeAdaptor<_Split>::operator();
operator()(_Iter __i, iter_difference_t<_Iter> __n) const
{
if constexpr (random_access_iterator<_Iter>)
- return subrange{__i, __i + __n};
+ return subrange(__i, __i + __n);
else
- return subrange{counted_iterator{std::move(__i), __n},
- default_sentinel};
+ return subrange(counted_iterator(std::move(__i), __n),
+ default_sentinel);
}
};
--- /dev/null
+// Copyright (C) 2021 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+// Verify P2367 changes.
+
+#include <ranges>
+
+namespace ranges = std::ranges;
+namespace views = std::views;
+
+void
+test01()
+{
+ extern int (&x)[5];
+
+ // Verify changes to views::single.
+ using ranges::single_view;
+ using std::same_as;
+ same_as<single_view<int*>> auto v1 = views::single(x);
+ same_as<single_view<int>> auto v2 = views::single((const int)5);
+ same_as<single_view<single_view<int>>> auto v3 = views::single(v2);
+
+ // Verify changes to views::take.
+ auto v4 = views::take(x, 0ull);
+
+ // Verify changes to views::drop.
+ auto v5 = views::drop(x, 0ull);
+
+ // Verify changes to views::split.
+ auto v6 = views::split(x, 5u);
+}