Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion include/beman/utf_view/to_utf_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,13 +229,20 @@ class to_utf_view : public std::ranges::view_interface<to_utf_view<V, E, ToType>
return std::ranges::empty(exposition_only_base_);
}

constexpr std::size_t size()
constexpr auto size()
requires std::ranges::sized_range<V> &&
std::same_as<char32_t, std::ranges::range_value_t<V>> &&
std::same_as<char32_t, ToType> {
return std::ranges::size(exposition_only_base_);
}

constexpr auto size() const
requires std::ranges::sized_range<const V> &&
std::same_as<char32_t, std::ranges::range_value_t<const V>> &&
std::same_as<char32_t, ToType> {
return std::ranges::size(exposition_only_base_);
}

/* !PAPER */
#if defined(__cpp_lib_ranges_reserve_hint)
/* PAPER: constexpr auto reserve_hint() requires approximately_sized_range<V>; */
Expand Down
8 changes: 7 additions & 1 deletion papers/P2728.md
Original file line number Diff line number Diff line change
Expand Up @@ -709,12 +709,18 @@ public:

constexpr bool empty() const { return empty(@*base_*@); }

constexpr size_t size()
constexpr auto size()
requires sized_range<V> && same_as<char32_t, range_value_t<V>> && same_as<char32_t, ToType>
{
return size(@*base_*@);
}

constexpr auto size() const
requires sized_range<const V> && same_as<char32_t, range_value_t<const V>> && same_as<char32_t, ToType>
{
return size(@*base_*@);
}

constexpr auto reserve_hint() requires approximately_sized_range<V>;
constexpr auto reserve_hint() const requires approximately_sized_range<const V>;
};
Expand Down
13 changes: 13 additions & 0 deletions tests/beman/utf_view/to_utf_view.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,19 @@ static_assert(
test_bidi_iterator<char8_t>, test_bidi_iterator<char8_t>>,
to_utf_view_kind::replacement, char8_t>>>);

// size() is only available when a UTF-32 -> UTF-32 view is transcoding a sized range.
static_assert(std::ranges::sized_range<
to_utf_view<std::u32string_view, to_utf_view_kind::replacement, char32_t>>);
static_assert(std::ranges::sized_range<
const to_utf_view<std::u32string_view, to_utf_view_kind::replacement, char32_t>>);
static_assert(!std::ranges::sized_range<
to_utf_view<std::u8string_view, to_utf_view_kind::replacement, char32_t>>);
static_assert(!std::ranges::sized_range<
to_utf_view<std::u32string_view, to_utf_view_kind::replacement, char8_t>>);
static_assert(!std::ranges::sized_range<
to_utf_view<std::ranges::subrange<test_forward_iterator<char32_t>, std::default_sentinel_t>,
to_utf_view_kind::replacement, char32_t>>);

template <exposition_only_code_unit CharT>
using test_case_code_unit_result = std::expected<CharT, utf_transcoding_error>;

Expand Down
Loading