qxLib
transform.inl
Go to the documentation of this file.
1 /**
2 
3  @file transform.inl
4  @author Khrapov
5  @date 1.10.2023
6  @copyright © Nick Khrapov, 2023. All right reserved.
7 
8 **/
9 
10 namespace qx
11 {
12 
13 namespace details
14 {
15 
16 template<class T>
17 concept has_reserve_func = requires(T t) {
18  { t.reserve(size_t()) };
19 };
20 
21 template<class T>
22 concept has_size_func = requires(T t) {
23  { t.size() } -> std::convertible_to<size_t>;
24 };
25 
26 } // namespace details
27 
28 template<
29  template<class...> class result_container_t,
30  class input_container_t,
31  class transform_callable_t,
32  class... result_container_rest_t>
33 auto transform_return(input_container_t&& input, const transform_callable_t& transformCallable)
34 {
35  using result_type = decltype(transformCallable(*input.begin()));
36  using result_container_full_t = result_container_t<result_type, result_container_rest_t...>;
37  result_container_full_t result;
38 
39  if constexpr (details::has_reserve_func<result_container_full_t> && details::has_size_func<input_container_t>)
40  result.reserve(input.size());
41 
42  for (auto&& inputElement : input)
43  result.insert(result.end(), transformCallable(std::forward<decltype(inputElement)>(inputElement)));
44 
45  return result;
46 }
47 
48 } // namespace qx
auto transform_return(input_container_t &&input, const transform_callable_t &transformCallable)
std::transform equivalent that makes the code a bit shorter
Definition: transform.inl:33