55
66#include < beman/any_view/concepts.hpp>
77#include < beman/any_view/config.hpp>
8+ #include < beman/any_view/detail/intrusive_small_ptr.hpp>
89#include < beman/any_view/detail/iterator.hpp>
10+ #include < beman/any_view/detail/view_adaptor.hpp>
11+ #include < beman/any_view/detail/view_interface.hpp>
912
1013#if BEMAN_ANY_VIEW_USE_FLAGS()
1114
@@ -54,9 +57,23 @@ class any_view : public std::ranges::view_interface<any_view<ElementT, OptionsV,
5457 ((OptionsV & any_view_options::BEMAN_ANY_VIEW_OPTION ()) == any_view_options::BEMAN_ANY_VIEW_OPTION());
5558 static constexpr bool simple = (OptionsV & any_view_options::simple) == any_view_options::simple;
5659
60+ using interface_type = detail::view_interface<iterator_concept, ElementT, RefT, RValueRefT, DiffT>;
61+ // inplace storage sufficient for a vtable pointer and a std::vector<T>
62+ detail::intrusive_small_ptr<interface_type, 4 * sizeof (void *)> view_ptr;
63+
64+ template <class RangeT >
65+ using adaptor_type =
66+ detail::view_adaptor<iterator_concept, ElementT, RefT, RValueRefT, DiffT, std::views::all_t <RangeT>>;
67+
68+ template <class RangeT >
69+ static consteval auto get_in_place_adaptor_type () {
70+ return std::in_place_type<adaptor_type<RangeT>>;
71+ }
72+
5773 public:
5874 template <detail::viewable_range_compatible_with<any_view> RangeT>
59- constexpr any_view (RangeT&&);
75+ constexpr any_view (RangeT&& range)
76+ : view_ptr(get_in_place_adaptor_type<RangeT>(), std::views::all(std::forward<RangeT>(range))) {}
6077
6178 constexpr any_view (const any_view&)
6279 requires copyable
@@ -71,15 +88,24 @@ class any_view : public std::ranges::view_interface<any_view<ElementT, OptionsV,
7188 constexpr auto operator =(any_view&&) noexcept -> any_view& = default ;
7289
7390 [[nodiscard]] constexpr auto begin () -> iterator
74- requires(not simple);
91+ requires(not simple)
92+ {
93+ return view_ptr->begin ();
94+ }
7595
7696 [[nodiscard]] constexpr auto begin () const -> iterator
77- requires simple;
97+ requires simple
98+ {
99+ return view_ptr->begin ();
100+ }
78101
79102 [[nodiscard]] constexpr auto end () const { return std::default_sentinel; }
80103
81104 [[nodiscard]] constexpr auto size () const -> size_type
82- requires sized;
105+ requires sized
106+ {
107+ return view_ptr->size ();
108+ }
83109};
84110
85111#elif BEMAN_ANY_VIEW_USE_TRAITS()
@@ -103,9 +129,28 @@ class any_view : public std::ranges::view_interface<any_view<ElementT, RangeTrai
103129 detail::BEMAN_ANY_VIEW_OPTION_ (or_v)<false , RangeTraitsT>;
104130 static constexpr bool simple = detail::simple_or_v<false , RangeTraitsT>;
105131
132+ using interface_type =
133+ detail::view_interface<iterator_concept, ElementT, reference_type, rvalue_reference_type, difference_type>;
134+ // inplace storage sufficient for a vtable pointer and a std::vector<T>
135+ detail::intrusive_small_ptr<interface_type, 4 * sizeof (void *)> view_ptr;
136+
137+ template <class RangeT >
138+ using adaptor_type = detail::view_adaptor<iterator_concept,
139+ ElementT,
140+ reference_type,
141+ rvalue_reference_type,
142+ difference_type,
143+ std::views::all_t <RangeT>>;
144+
145+ template <class RangeT >
146+ static consteval auto get_in_place_adaptor_type () {
147+ return std::in_place_type<adaptor_type<RangeT>>;
148+ }
149+
106150 public:
107151 template <detail::viewable_range_compatible_with<any_view> RangeT>
108- constexpr any_view (RangeT&&);
152+ constexpr any_view (RangeT&& range)
153+ : view_ptr(get_in_place_adaptor_type<RangeT>(), std::views::all(std::forward<RangeT>(range))) {}
109154
110155 constexpr any_view (const any_view&)
111156 requires copyable
@@ -120,15 +165,24 @@ class any_view : public std::ranges::view_interface<any_view<ElementT, RangeTrai
120165 constexpr auto operator =(any_view&&) noexcept -> any_view& = default ;
121166
122167 [[nodiscard]] constexpr auto begin () -> iterator
123- requires(not simple);
168+ requires(not simple)
169+ {
170+ return view_ptr->begin ();
171+ }
124172
125173 [[nodiscard]] constexpr auto begin () const -> iterator
126- requires simple;
174+ requires simple
175+ {
176+ return view_ptr->begin ();
177+ }
127178
128179 [[nodiscard]] constexpr auto end () const { return std::default_sentinel; }
129180
130181 [[nodiscard]] constexpr auto size () const -> size_type
131- requires sized;
182+ requires sized
183+ {
184+ return view_ptr->size ();
185+ }
132186};
133187
134188#elif BEMAN_ANY_VIEW_USE_NAMED()
@@ -151,9 +205,28 @@ class any_view : public std::ranges::view_interface<any_view<ElementT, OptionsV>
151205 OptionsV.BEMAN_ANY_VIEW_OPTION();
152206 static constexpr bool simple = OptionsV.simple;
153207
208+ using interface_type =
209+ detail::view_interface<iterator_concept, ElementT, reference_type, rvalue_reference_type, difference_type>;
210+ // inplace storage sufficient for a vtable pointer and a std::vector<T>
211+ detail::intrusive_small_ptr<interface_type, 4 * sizeof (void *)> view_ptr;
212+
213+ template <class RangeT >
214+ using adaptor_type = detail::view_adaptor<iterator_concept,
215+ ElementT,
216+ reference_type,
217+ rvalue_reference_type,
218+ difference_type,
219+ std::views::all_t <RangeT>>;
220+
221+ template <class RangeT >
222+ static consteval auto get_in_place_adaptor_type () {
223+ return std::in_place_type<adaptor_type<RangeT>>;
224+ }
225+
154226 public:
155227 template <detail::viewable_range_compatible_with<any_view> RangeT>
156- constexpr any_view (RangeT&&);
228+ constexpr any_view (RangeT&& range)
229+ : view_ptr(get_in_place_adaptor_type<RangeT>(), std::views::all(std::forward<RangeT>(range))) {}
157230
158231 constexpr any_view (const any_view&)
159232 requires copyable
@@ -168,15 +241,24 @@ class any_view : public std::ranges::view_interface<any_view<ElementT, OptionsV>
168241 constexpr auto operator =(any_view&&) noexcept -> any_view& = default ;
169242
170243 [[nodiscard]] constexpr auto begin () -> iterator
171- requires(not simple);
244+ requires(not simple)
245+ {
246+ return view_ptr->begin ();
247+ }
172248
173249 [[nodiscard]] constexpr auto begin () const -> iterator
174- requires simple;
250+ requires simple
251+ {
252+ return view_ptr->begin ();
253+ }
175254
176255 [[nodiscard]] constexpr auto end () const { return std::default_sentinel; }
177256
178257 [[nodiscard]] constexpr auto size () const -> size_type
179- requires sized;
258+ requires sized
259+ {
260+ return view_ptr->size ();
261+ }
180262};
181263
182264#endif
0 commit comments