Skip to content

Commit 62d1cae

Browse files
committed
Specialize std::back_insert_iterator
1 parent 51a4496 commit 62d1cae

File tree

5 files changed

+110
-8
lines changed

5 files changed

+110
-8
lines changed

include/momo/Array.h

+15
Original file line numberDiff line numberDiff line change
@@ -1112,3 +1112,18 @@ namespace internal
11121112
}
11131113

11141114
} // namespace momo
1115+
1116+
namespace std
1117+
{
1118+
template<typename... Params>
1119+
class back_insert_iterator<momo::Array<Params...>>
1120+
: public momo::internal::BackAddIterator<momo::Array<Params...>>
1121+
{
1122+
public:
1123+
typedef momo::Array<Params...> container_type;
1124+
1125+
public:
1126+
using momo::internal::BackAddIterator<container_type>::BackAddIterator;
1127+
using momo::internal::BackAddIterator<container_type>::operator=;
1128+
};
1129+
} // namespace std

include/momo/ArrayUtility.h

+59
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,55 @@ namespace internal
275275
return remCount;
276276
}
277277
};
278+
279+
template<typename TContainer>
280+
class BackAddIterator
281+
{
282+
public:
283+
typedef TContainer Container;
284+
typedef typename Container::Item Item;
285+
286+
public:
287+
explicit BackAddIterator(Container& cont) noexcept
288+
: container(&cont)
289+
{
290+
}
291+
292+
template<typename Iterator>
293+
Iterator& operator=(this Iterator& iter, Item&& item)
294+
{
295+
iter.container->AddBack(std::move(item));
296+
return iter;
297+
}
298+
299+
template<typename Iterator>
300+
Iterator& operator=(this Iterator& iter, const Item& item)
301+
{
302+
iter.container->AddBack(item);
303+
return iter;
304+
}
305+
306+
template<typename Iterator>
307+
Iterator& operator*(this Iterator& iter) noexcept
308+
{
309+
return iter;
310+
}
311+
312+
template<typename Iterator>
313+
Iterator& operator++(this Iterator& iter) noexcept
314+
{
315+
return iter;
316+
}
317+
318+
template<typename Iterator>
319+
Iterator operator++(this Iterator& iter, int) noexcept
320+
{
321+
return iter;
322+
}
323+
324+
protected:
325+
Container* container;
326+
};
278327
}
279328

280329
} // namespace momo
@@ -295,4 +344,14 @@ namespace std
295344
random_access_iterator_tag, contiguous_iterator_tag>
296345
{
297346
};
347+
348+
template<typename C>
349+
struct iterator_traits<momo::internal::BackAddIterator<C>>
350+
{
351+
typedef std::output_iterator_tag iterator_category;
352+
typedef ptrdiff_t difference_type;
353+
typedef void pointer;
354+
typedef void reference;
355+
typedef void value_type;
356+
};
298357
} // namespace std

include/momo/MergeArray.h

+15
Original file line numberDiff line numberDiff line change
@@ -833,3 +833,18 @@ class MergeArray
833833
};
834834

835835
} // namespace momo
836+
837+
namespace std
838+
{
839+
template<typename... Params>
840+
class back_insert_iterator<momo::MergeArray<Params...>>
841+
: public momo::internal::BackAddIterator<momo::MergeArray<Params...>>
842+
{
843+
public:
844+
typedef momo::MergeArray<Params...> container_type;
845+
846+
public:
847+
using momo::internal::BackAddIterator<container_type>::BackAddIterator;
848+
using momo::internal::BackAddIterator<container_type>::operator=;
849+
};
850+
} // namespace std

include/momo/SegmentedArray.h

+15
Original file line numberDiff line numberDiff line change
@@ -788,3 +788,18 @@ using SegmentedArraySqrt = SegmentedArray<TItem, TMemManager, TItemTraits,
788788
SegmentedArraySettings<SegmentedArrayItemCountFunc::sqrt>>;
789789

790790
} // namespace momo
791+
792+
namespace std
793+
{
794+
template<typename... Params>
795+
class back_insert_iterator<momo::SegmentedArray<Params...>>
796+
: public momo::internal::BackAddIterator<momo::SegmentedArray<Params...>>
797+
{
798+
public:
799+
typedef momo::SegmentedArray<Params...> container_type;
800+
801+
public:
802+
using momo::internal::BackAddIterator<container_type>::BackAddIterator;
803+
using momo::internal::BackAddIterator<container_type>::operator=;
804+
};
805+
} // namespace std

test/sources/SimpleArrayTester.cpp

+6-8
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,11 @@ class SimpleArrayTester
4646

4747
~TemplItem() noexcept = default;
4848

49-
TemplItem& operator=(TemplItem&& item) noexcept = default;
49+
TemplItem& operator=(TemplItem&&) noexcept = default;
5050

51-
TemplItem& operator=(const TemplItem& item) noexcept = default;
51+
TemplItem& operator=(const TemplItem&) noexcept = default;
5252

53-
bool operator==(const TemplItem& item) const noexcept
54-
{
55-
return mValue == item.mValue;
56-
}
53+
bool operator==(const TemplItem&) const noexcept = default;
5754

5855
private:
5956
size_t mValue;
@@ -218,8 +215,9 @@ class SimpleArrayTester
218215
Array ar;
219216
static const size_t count = 20000;
220217

221-
for (size_t i = 0; i < count; ++i)
222-
ar.AddBack(Item(i));
218+
std::fill_n(std::back_inserter(ar), 1, Item(0));
219+
std::generate_n(std::back_inserter(ar), count - 1,
220+
[&ar] () { return Item(ar.GetCount()); });
223221

224222
ar.Reserve(count * 3);
225223
ar.Shrink();

0 commit comments

Comments
 (0)