From c0a0ba3c0afe1f782e5667466e049b61465d9d0d Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Tue, 29 Aug 2017 15:19:08 +0700 Subject: [PATCH] Rework containers.hh to get rid of the Factory structures Replace them with polymorphic lambdas --- src/containers.hh | 107 +++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 63 deletions(-) diff --git a/src/containers.hh b/src/containers.hh index b51e8092..fe986f1a 100644 --- a/src/containers.hh +++ b/src/containers.hh @@ -9,42 +9,43 @@ namespace Kakoune { -template -struct ContainerView { Factory factory; }; +template struct ViewFactory { Func func; }; -template -decltype(auto) operator| (Container&& container, ContainerView view) +template +ViewFactory> +make_view_factory(Func&& func) { return {std::forward(func)}; } + +template +decltype(auto) operator| (Container&& container, ViewFactory factory) { - return view.factory(std::forward(container)); + return factory.func(std::forward(container)); } +template +struct decay_container_impl { using type = std::decay_t; }; + +template +struct decay_container_impl { using type = Container&; }; + +template +using decay_container = typename decay_container_impl::type; + template struct ReverseView { - using iterator = decltype(std::declval().rbegin()); - - iterator begin() { return m_container.rbegin(); } - iterator end() { return m_container.rend(); } + decltype(auto) begin() { return m_container.rbegin(); } + decltype(auto) end() { return m_container.rend(); } Container m_container; }; -struct ReverseFactory +inline auto reverse() { - template - ReverseView> operator()(Container&& container) const - { - return {std::move(container)}; - } - - template - ReverseView operator()(Container& container) const - { - return {container}; - } -}; - -inline ContainerView reverse() { return {}; } + return make_view_factory([](auto&& container) { + using Container = decltype(container); + return ReverseView>{std::forward(container)}; + }); +} template using IteratorOf = decltype(std::begin(std::declval())); @@ -102,19 +103,13 @@ struct FilterView }; template -struct FilterFactory +inline auto filter(Filter f) { - template - FilterView operator()(Container& container) const { return {container, std::move(m_filter)}; } - - template - FilterView, Filter> operator()(Container&& container) const { return {std::move(container), std::move(m_filter)}; } - - Filter m_filter; -}; - -template -inline ContainerView> filter(Filter f) { return {{std::move(f)}}; } + return make_view_factory([f = std::move(f)](auto&& container) { + using Container = decltype(container); + return FilterView, Filter>{std::forward(container), std::move(f)}; + }); +} template struct TransformView @@ -156,19 +151,13 @@ struct TransformView }; template -struct TransformFactory +inline auto transform(Transform t) { - template - TransformView operator()(Container& container) const { return {container, std::move(m_transform)}; } - - template - TransformView, Transform> operator()(Container&& container) const { return {std::move(container), std::move(m_transform)}; } - - Transform m_transform; -}; - -template -inline ContainerView> transform(Transform t) { return {{std::move(t)}}; } + return make_view_factory([t = std::move(t)](auto&& container) { + using Container = decltype(container); + return TransformView, Transform>{std::forward(container), std::move(t)}; + }); +} template, typename ValueTypeParam = void> @@ -226,22 +215,14 @@ struct SplitView Separator m_separator; }; -template -struct SplitViewFactory -{ - template - SplitView, Separator, ValueType> - operator()(Container&& container) const { return {std::move(container), std::move(separator)}; } - - template - SplitView - operator()(Container& container) const { return {container, std::move(separator)}; } - - Separator separator; -}; - template -ContainerView> split(Separator separator) { return {{std::move(separator)}}; } +auto split(Separator separator) +{ + return make_view_factory([s = std::move(separator)](auto&& container) { + using Container = decltype(container); + return SplitView, Separator, ValueType>{std::forward(container), std::move(s)}; + }); +} template struct ConcatView