summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2016-03-24 22:14:18 +0000
committerMaxime Coste <frrrwww@gmail.com>2016-03-24 22:14:18 +0000
commit50a64a0544ce951c1ddab510bbd6cdea2fd2a05c (patch)
treeea31ff03f7077c2ef1af25b6b4bfba9a03d901f2 /src
parentccb53eca42da9cdd7147d8a3b197bc455d62fad9 (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.hh38
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
{