diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2016-03-24 22:14:18 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2016-03-24 22:14:18 +0000 |
| commit | 50a64a0544ce951c1ddab510bbd6cdea2fd2a05c (patch) | |
| tree | ea31ff03f7077c2ef1af25b6b4bfba9a03d901f2 /src | |
| parent | ccb53eca42da9cdd7147d8a3b197bc455d62fad9 (diff) | |
Correctly handle temporaries in container views
Move temporaries into the view itself and keep a reference on
non temporaries
Diffstat (limited to 'src')
| -rw-r--r-- | src/containers.hh | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/src/containers.hh b/src/containers.hh index 9597a25b..b0fc58e3 100644 --- a/src/containers.hh +++ b/src/containers.hh @@ -22,19 +22,26 @@ template<typename Container> struct ReverseView { using iterator = decltype(std::declval<Container>().rbegin()); - ReverseView(Container& container) : m_container(container) {} iterator begin() { return m_container.rbegin(); } iterator end() { return m_container.rend(); } -private: - Container& m_container; + Container m_container; }; +template<typename C> +using RemoveReference = typename std::remove_reference<C>::type; + struct ReverseFactory { template<typename Container> - ReverseView<Container> operator()(Container&& container) const + ReverseView<RemoveReference<Container>> operator()(Container&& container) const + { + return {std::move(container)}; + } + + template<typename Container> + ReverseView<Container&> operator()(Container& container) const { return {container}; } @@ -84,14 +91,10 @@ struct FilterView const FilterView& m_view; }; - FilterView(Container& container, Filter filter) - : m_container(container), m_filter(std::move(filter)) {} - Iterator begin() const { return {*this, m_container.begin(), m_container.end()}; } Iterator end() const { return {*this, m_container.end(), m_container.end()}; } -private: - Container& m_container; + Container m_container; Filter m_filter; }; @@ -99,7 +102,10 @@ template<typename Filter> struct FilterFactory { template<typename Container> - FilterView<Container, Filter> operator()(Container&& container) const { return {container, std::move(m_filter)}; } + FilterView<Container&, Filter> operator()(Container& container) const { return {container, std::move(m_filter)}; } + + template<typename Container> + FilterView<RemoveReference<Container>, Filter> operator()(Container&& container) const { return {std::move(container), std::move(m_filter)}; } Filter m_filter; }; @@ -142,14 +148,10 @@ struct TransformView const TransformView& m_view; }; - TransformView(Container& container, Transform transform) - : m_container(container), m_transform(std::move(transform)) {} - Iterator begin() const { return {*this, m_container.begin()}; } Iterator end() const { return {*this, m_container.end()}; } -private: - Container& m_container; + Container m_container; Transform m_transform; }; @@ -157,7 +159,10 @@ template<typename Transform> struct TransformFactory { template<typename Container> - TransformView<Container, Transform> operator()(Container&& container) const { return {container, std::move(m_transform)}; } + TransformView<Container&, Transform> operator()(Container& container) const { return {container, std::move(m_transform)}; } + + template<typename Container> + TransformView<RemoveReference<Container>, Transform> operator()(Container&& container) const { return {std::move(container), std::move(m_transform)}; } Transform m_transform; }; @@ -166,7 +171,6 @@ template<typename Transform> inline ContainerView<TransformFactory<Transform>> transform(Transform t) { return {{std::move(t)}}; } - template<typename Container1, typename Container2> struct ConcatView { |
