diff --git a/include/momo/Array.h b/include/momo/Array.h index 6af787cd..5fd143d1 100644 --- a/include/momo/Array.h +++ b/include/momo/Array.h @@ -1163,14 +1163,15 @@ namespace std { template<typename... Params> class back_insert_iterator<momo::Array<Params...>> - : public momo::internal::BackInsertIteratorStd<momo::Array<Params...>> + : public momo::internal::BackInsertIteratorStdBase<momo::Array<Params...>> { private: - typedef momo::internal::BackInsertIteratorStd<momo::Array<Params...>> BackInsertIteratorStd; + typedef momo::internal::BackInsertIteratorStdBase<momo::Array<Params...>> + BackInsertIteratorStdBase; public: - using BackInsertIteratorStd::BackInsertIteratorStd; - using BackInsertIteratorStd::operator=; + using BackInsertIteratorStdBase::BackInsertIteratorStdBase; + using BackInsertIteratorStdBase::operator=; }; } // namespace std diff --git a/include/momo/ArrayUtility.h b/include/momo/ArrayUtility.h index 9cdf9a56..f46bdeb6 100644 --- a/include/momo/ArrayUtility.h +++ b/include/momo/ArrayUtility.h @@ -302,13 +302,13 @@ namespace internal }; template<typename TContainer> - class BackInsertIteratorStd + class BackInsertIteratorStdBase { private: typedef TContainer Container; typedef typename Container::Item Item; - typedef std::back_insert_iterator<Container> Iterator; + typedef std::back_insert_iterator<Container> BackInsertIteratorStd; public: typedef Container container_type; @@ -319,34 +319,36 @@ namespace internal typedef void value_type; public: - explicit BackInsertIteratorStd(Container& cont) noexcept + explicit BackInsertIteratorStdBase(Container& cont) noexcept : container(&cont) { } - Iterator& operator=(Item&& item) + BackInsertIteratorStd& operator=(Item&& item) { container->AddBack(std::move(item)); return **this; } - Iterator& operator=(const Item& item) + BackInsertIteratorStd& operator=(const Item& item) { container->AddBack(item); return **this; } - Iterator& operator*() noexcept + BackInsertIteratorStd& operator*() noexcept { - return *static_cast<Iterator*>(this); + MOMO_STATIC_ASSERT(std::is_base_of<BackInsertIteratorStdBase, + BackInsertIteratorStd>::value); + return *static_cast<BackInsertIteratorStd*>(this); } - Iterator& operator++() noexcept + BackInsertIteratorStd& operator++() noexcept { return **this; } - Iterator operator++(int) noexcept + BackInsertIteratorStd operator++(int) noexcept { return **this; } diff --git a/include/momo/SegmentedArray.h b/include/momo/SegmentedArray.h index 42184ce7..515ee71f 100644 --- a/include/momo/SegmentedArray.h +++ b/include/momo/SegmentedArray.h @@ -752,14 +752,15 @@ namespace std { template<typename... Params> class back_insert_iterator<momo::SegmentedArray<Params...>> - : public momo::internal::BackInsertIteratorStd<momo::SegmentedArray<Params...>> + : public momo::internal::BackInsertIteratorStdBase<momo::SegmentedArray<Params...>> { private: - typedef momo::internal::BackInsertIteratorStd<momo::SegmentedArray<Params...>> BackInsertIteratorStd; + typedef momo::internal::BackInsertIteratorStdBase<momo::SegmentedArray<Params...>> + BackInsertIteratorStdBase; public: - using BackInsertIteratorStd::BackInsertIteratorStd; - using BackInsertIteratorStd::operator=; + using BackInsertIteratorStdBase::BackInsertIteratorStdBase; + using BackInsertIteratorStdBase::operator=; }; } // namespace std