Skip to content

Commit

Permalink
Specialize std::back_insert_iterator
Browse files Browse the repository at this point in the history
  • Loading branch information
morzhovets committed Dec 31, 2024
1 parent f8c9bff commit 7593ac1
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 17 deletions.
9 changes: 5 additions & 4 deletions include/momo/Array.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
20 changes: 11 additions & 9 deletions include/momo/ArrayUtility.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down
9 changes: 5 additions & 4 deletions include/momo/SegmentedArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 7593ac1

Please sign in to comment.