From 57dbad0282c078a18cdf166c303cd05c6dc56702 Mon Sep 17 00:00:00 2001 From: q66 Date: Mon, 29 Jun 2015 23:18:29 +0100 Subject: [PATCH] remove the need for range default constructors for RangeIterator support --- octa/range.hh | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/octa/range.hh b/octa/range.hh index ee7a5a6..1c77535 100644 --- a/octa/range.hh +++ b/octa/range.hh @@ -8,6 +8,7 @@ #include +#include "octa/new.hh" #include "octa/types.hh" #include "octa/utility.hh" #include "octa/type_traits.hh" @@ -188,17 +189,24 @@ namespace detail { template struct RangeIterator { RangeIterator(): p_range() {} - explicit RangeIterator(const T &range): p_range(range) {} + explicit RangeIterator(const T &range) { + ::new(&get_ref()) T(range); + } + explicit RangeIterator(T &&range) { + ::new(&get_ref()) T(octa::move(range)); + } RangeIterator &operator++() { - p_range.pop_front(); + get_ref().pop_front(); return *this; } RangeReference operator*() const { - return p_range.front(); + return get_ref().front(); } - bool operator!=(RangeIterator) const { return !p_range.empty(); } + bool operator!=(RangeIterator) const { return !get_ref().empty(); } private: - T p_range; + T &get_ref() { return *((T *)&p_range); } + const T &get_ref() const { return *((T *)&p_range); } + octa::AlignedStorage p_range; }; }