SeqAn3  3.2.0-rc.1
The Modern C++ library for sequence analysis.
range/to.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2022, Knut Reinert & MPI für molekulare Genetik
4 // This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5 // shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6 // -----------------------------------------------------------------------------------------------------
7 
13 #pragma once
14 
15 #include <algorithm>
16 #include <ranges>
17 
20 
21 namespace seqan3::detail
22 {
23 
25 template <typename container_t>
26  requires (!std::ranges::view<container_t>)
27 struct to_fn
28 {
29 private:
34  template <std::ranges::input_range rng_t>
35  requires std::convertible_to<std::ranges::range_reference_t<rng_t>, std::ranges::range_value_t<container_t>>
36  auto impl(rng_t && rng, container_t & container) const
37  {
38  std::ranges::copy(rng, std::back_inserter(container));
39  }
40 
42  template <std::ranges::input_range rng_t>
43  auto impl(rng_t && rng, container_t & container) const
44  requires std::ranges::input_range<std::ranges::range_value_t<rng_t>>
45  {
46  auto adaptor = to_fn<std::ranges::range_value_t<container_t>>{};
47  auto inner_rng = rng | std::views::transform(adaptor);
48  std::ranges::copy(inner_rng, std::back_inserter(container));
49  }
50 
51 public:
58  template <std::ranges::input_range rng_t, typename... args_t>
59  constexpr auto operator()(rng_t && rng, args_t &&... args) const
60  {
61  auto new_container = container_t(std::forward<args_t>(args)...);
62 
63  // reserve memory if functionality is available
64  if constexpr (std::ranges::sized_range<rng_t> && requires (container_t c) { c.reserve(size_t{}); })
65  new_container.reserve(std::ranges::size(rng));
66 
67  impl(std::forward<rng_t>(rng), new_container);
68  return new_container;
69  }
70 };
71 
75 template <template <typename> typename container_t>
76 struct to_template_template_fn
77 {
84  template <std::ranges::input_range rng_t, typename... args_t>
85  constexpr auto operator()(rng_t && rng, args_t &&... args) const
86  {
87  auto adaptor = to_fn<container_t<std::ranges::range_value_t<rng_t>>>{};
88  return adaptor(std::forward<rng_t>(rng), std::forward<args_t>(args)...);
89  }
90 };
91 
92 } // namespace seqan3::detail
93 
94 namespace seqan3::ranges
95 {
96 
113 template <typename container_t, typename... args_t>
114 constexpr auto to(args_t &&... args)
115 {
116  return detail::adaptor_from_functor{detail::to_fn<container_t>{}, std::forward<args_t>(args)...};
117 }
118 
123 template <template <typename...> typename container_t, typename... args_t>
124 constexpr auto to(args_t &&... args)
125 {
126  return detail::adaptor_from_functor{detail::to_template_template_fn<container_t>{}, std::forward<args_t>(args)...};
127 }
128 
133 template <typename container_t, std::ranges::input_range rng_t, typename... args_t>
134 constexpr auto to(rng_t && rng, args_t &&... args)
135 {
136  return detail::adaptor_from_functor{detail::to_fn<container_t>{},
137  std::forward<args_t>(args)...}(std::forward<rng_t>(rng));
138 }
139 
144 template <template <class...> typename container_t, std::ranges::input_range rng_t, typename... args_t>
145 constexpr auto to(rng_t && rng, args_t &&... args)
146 {
147  return detail::adaptor_from_functor{detail::to_template_template_fn<container_t>{},
148  std::forward<args_t>(args)...}(std::forward<rng_t>(rng));
149 }
150 
151 } // namespace seqan3::ranges
152 
153 namespace seqan3::views
154 {
155 
160 template <typename container_t, typename... args_t>
161 SEQAN3_DEPRECATED_330 constexpr auto to(args_t &&... args)
162 {
163  return ranges::to<container_t>(std::forward<args_t>(args)...);
164 }
165 
170 template <template <typename...> typename container_t, typename... args_t>
171 SEQAN3_DEPRECATED_330 constexpr auto to(args_t &&... args)
172 {
173  return ranges::to<container_t>(std::forward<args_t>(args)...);
174 }
175 
180 template <typename container_t, std::ranges::input_range rng_t, typename... args_t>
181 SEQAN3_DEPRECATED_330 constexpr auto to(rng_t && rng, args_t &&... args)
182 {
183  return ranges::to<container_t>(std::forward<rng_t>(rng), std::forward<args_t>(args)...);
184 }
185 
190 template <template <typename...> typename container_t, std::ranges::input_range rng_t, typename... args_t>
191 SEQAN3_DEPRECATED_330 constexpr auto to(rng_t && rng, args_t &&... args)
192 {
193  return ranges::to<container_t>(std::forward<rng_t>(rng), std::forward<args_t>(args)...);
194 }
195 
196 } // namespace seqan3::views
Provides seqan3::detail::adaptor_from_functor.
T back_inserter(T... args)
requires requires
The rank_type of the semi-alphabet; defined as the return type of seqan3::to_rank....
Definition: alphabet/concept.hpp:164
decltype(detail::transform< trait_t >(list_t{})) transform
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: type_list/traits.hpp:469
constexpr size_t size
The size of a type pack.
Definition: type_pack/traits.hpp:146
constexpr SEQAN3_DEPRECATED_330 auto to(args_t &&... args)
Converts a range to a container.
Definition: range/to.hpp:161
constexpr SEQAN3_DEPRECATED_330 auto to(rng_t &&rng, args_t &&... args)
Converts a range to a container.
Definition: range/to.hpp:181
The (most general) container concept as defined by the standard library.
The SeqAn namespace for views.
Definition: char_strictly_to.hpp:22
#define SEQAN3_DEPRECATED_330
Deprecation message for SeqAn 3.3.0 release.
Definition: platform.hpp:179
The <ranges> header from C++20's standard library.
Provides concepts that do not have equivalents in C++20.