Skip to content

Commit

Permalink
Merge module transform_traits into transform
Browse files Browse the repository at this point in the history
  • Loading branch information
davidstone committed Nov 28, 2023
1 parent 5df01ab commit f2f3291
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 56 deletions.
1 change: 0 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,6 @@ target_sources(containers PUBLIC
source/containers/algorithms/splice.cpp
source/containers/algorithms/split.cpp
source/containers/algorithms/transform.cpp
source/containers/algorithms/transform_traits.cpp
source/containers/algorithms/uninitialized.cpp
source/containers/algorithms/unique.cpp
source/containers/algorithms/zip.cpp
Expand Down
50 changes: 41 additions & 9 deletions source/containers/algorithms/transform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,38 +10,70 @@ module;
export module containers.algorithms.transform;

import containers.algorithms.compare;
import containers.algorithms.transform_traits;
import containers.array;
import containers.adapt;
import containers.default_adapt_traits;
import containers.default_begin_end_size;
import containers.is_iterator;
import containers.iter_reference_t;
import containers.range;

import std_module;

namespace containers {

template<typename UnaryFunction>
struct range_transform_traits : transform_traits<UnaryFunction>, default_begin_end_size {
using transform_traits<UnaryFunction>::transform_traits;
struct transform_traits :
default_add,
default_subtract,
default_compare,
default_begin_end_size
{
constexpr explicit transform_traits(UnaryFunction dereference_):
m_dereference(std::move(dereference_))
{
}

template<iterator It> requires std::invocable<UnaryFunction const &, iter_reference_t<It>>
constexpr auto dereference(It const & it) const -> decltype(auto) {
return std::invoke(m_dereference, *it);
}
private:
[[no_unique_address]] UnaryFunction m_dereference;
};

template<typename UnaryFunction>
range_transform_traits(UnaryFunction) -> range_transform_traits<UnaryFunction>;
transform_traits(UnaryFunction) -> transform_traits<UnaryFunction>;

template<typename UnaryFunction>
struct range_transform_traits_dereference : transform_traits_dereference<UnaryFunction>, default_begin_end_size {
using transform_traits_dereference<UnaryFunction>::transform_traits_dereference;
struct transform_traits_dereference :
default_add,
default_subtract,
default_compare,
default_begin_end_size
{
constexpr explicit transform_traits_dereference(UnaryFunction dereference_):
m_dereference(std::move(dereference_))
{
}

template<iterator It> requires std::invocable<UnaryFunction const &, It>
constexpr auto dereference(It const & it) const -> decltype(auto) {
return std::invoke(m_dereference, it);
}
private:
[[no_unique_address]] UnaryFunction m_dereference;
};

template<typename UnaryFunction>
range_transform_traits_dereference(UnaryFunction) -> range_transform_traits_dereference<UnaryFunction>;
transform_traits_dereference(UnaryFunction) -> transform_traits_dereference<UnaryFunction>;

export constexpr auto transform(range auto && source, auto dereference) -> range auto {
return adapt(OPERATORS_FORWARD(source), range_transform_traits(std::move(dereference)));
return adapt(OPERATORS_FORWARD(source), transform_traits(std::move(dereference)));
}

export constexpr auto transform_dereference(range auto && source, auto dereference) -> range auto {
return adapt(OPERATORS_FORWARD(source), range_transform_traits_dereference(std::move(dereference)));
return adapt(OPERATORS_FORWARD(source), transform_traits_dereference(std::move(dereference)));
}

} // namespace containers
Expand Down
46 changes: 0 additions & 46 deletions source/containers/algorithms/transform_traits.cpp

This file was deleted.

0 comments on commit f2f3291

Please sign in to comment.