Skip to content

Commit

Permalink
Conversions from ranges to containers (C++23)
Browse files Browse the repository at this point in the history
  • Loading branch information
morzhovets committed Oct 30, 2024
1 parent cd8b3e7 commit 189c2a7
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 41 deletions.
23 changes: 11 additions & 12 deletions include/momo/Array.h
Original file line number Diff line number Diff line change
Expand Up @@ -492,9 +492,9 @@ class Array
AddBackNogrow(item);
}

template<internal::conceptIterator17<std::input_iterator_tag> ArgIterator>
explicit Array(ArgIterator begin, ArgIterator end, MemManager memManager = MemManager())
: Array(begin, end, std::move(memManager), nullptr)
template<std::input_iterator ArgIterator, internal::conceptSentinel<ArgIterator> ArgSentinel>
explicit Array(ArgIterator begin, ArgSentinel end, MemManager memManager = MemManager())
: Array(std::move(begin), std::move(end), std::move(memManager), nullptr)
{
}

Expand Down Expand Up @@ -848,8 +848,8 @@ class Array
}
}

template<internal::conceptIterator17<std::input_iterator_tag> ArgIterator>
void Insert(size_t index, ArgIterator begin, ArgIterator end)
template<std::input_iterator ArgIterator, internal::conceptSentinel<ArgIterator> ArgSentinel>
void Insert(size_t index, ArgIterator begin, ArgSentinel end)
{
MOMO_ASSERT(begin == end || !pvIsInside(*begin)); //?
if constexpr (std::forward_iterator<ArgIterator>)
Expand All @@ -862,7 +862,7 @@ class Array
}
else
{
ArrayShifter::Insert(*this, index, begin, end);
ArrayShifter::Insert(*this, index, std::move(begin), std::move(end));
}
}

Expand Down Expand Up @@ -911,8 +911,8 @@ class Array
{
}

template<std::forward_iterator ArgIterator>
explicit Array(ArgIterator begin, ArgIterator end, MemManager&& memManager, std::nullptr_t)
template<std::forward_iterator ArgIterator, internal::conceptSentinel<ArgIterator> ArgSentinel>
explicit Array(ArgIterator begin, ArgSentinel end, MemManager&& memManager, std::nullptr_t)
: mData(SMath::Dist(begin, end), std::move(memManager))
{
typedef typename ItemTraits::template Creator<std::iter_reference_t<ArgIterator>> IterCreator;
Expand All @@ -921,14 +921,13 @@ class Array
pvAddBackNogrow(FastMovableFunctor(IterCreator(thisMemManager, *iter)));
}

template<internal::conceptIterator17<std::input_iterator_tag> ArgIterator>
requires (!std::forward_iterator<ArgIterator>)
explicit Array(ArgIterator begin, ArgIterator end, MemManager&& memManager, std::nullptr_t)
template<std::input_iterator ArgIterator, internal::conceptSentinel<ArgIterator> ArgSentinel>
explicit Array(ArgIterator begin, ArgSentinel end, MemManager&& memManager, std::nullptr_t)
: mData(std::move(memManager))
{
typedef typename ItemTraits::template Creator<std::iter_reference_t<ArgIterator>> IterCreator;
MemManager& thisMemManager = GetMemManager();
for (ArgIterator iter = begin; iter != end; ++iter)
for (ArgIterator iter = std::move(begin); iter != end; ++iter)
pvAddBack(FastMovableFunctor(IterCreator(thisMemManager, *iter)));
}

Expand Down
8 changes: 4 additions & 4 deletions include/momo/ArrayUtility.h
Original file line number Diff line number Diff line change
Expand Up @@ -195,18 +195,18 @@ namespace internal
}
}

template<conceptIterator17<std::input_iterator_tag> ArgIterator>
static void Insert(Array& array, size_t index, ArgIterator begin, ArgIterator end)
template<std::input_iterator ArgIterator, internal::conceptSentinel<ArgIterator> ArgSentinel>
static void Insert(Array& array, size_t index, ArgIterator begin, ArgSentinel end)
{
typedef typename ItemTraits::template Creator<
std::iter_reference_t<ArgIterator>> IterCreator;
MemManager& memManager = array.GetMemManager();
size_t count = 0;
for (ArgIterator iter = begin; iter != end; (void)++iter, ++count)
for (ArgIterator iter = std::move(begin); iter != end; (void)++iter, ++count)
array.InsertCrt(index + count, IterCreator(memManager, *iter));
}

template<conceptIterator17<std::input_iterator_tag> ArgIterator>
template<std::input_iterator ArgIterator>
requires (std::forward_iterator<ArgIterator> ||
std::is_same_v<ArgIterator, std::move_iterator<Item*>>) // vs2019, gcc10
static void InsertNogrow(Array& array, size_t index, ArgIterator begin, size_t count)
Expand Down
12 changes: 6 additions & 6 deletions include/momo/MergeArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,8 @@ class MergeArray
}
}

template<internal::conceptIterator17<std::input_iterator_tag> ArgIterator>
explicit MergeArray(ArgIterator begin, ArgIterator end, MemManager memManager = MemManager())
template<std::input_iterator ArgIterator, internal::conceptSentinel<ArgIterator> ArgSentinel>
explicit MergeArray(ArgIterator begin, ArgSentinel end, MemManager memManager = MemManager())
: MergeArray(std::move(memManager))
{
typedef typename ItemTraits::template Creator<std::iter_reference_t<ArgIterator>> IterCreator;
Expand All @@ -184,7 +184,7 @@ class MergeArray
pvInitCapacity(internal::UIntMath<>::Dist(begin, end));
try
{
for (ArgIterator iter = begin; iter != end; ++iter)
for (ArgIterator iter = std::move(begin); iter != end; ++iter)
{
if constexpr (std::forward_iterator<ArgIterator>)
pvAddBackNogrow(FastMovableFunctor(IterCreator(thisMemManager, *iter)));
Expand Down Expand Up @@ -546,8 +546,8 @@ class MergeArray
ArrayShifter::InsertNogrow(*this, index, count, *&itemHandler);
}

template<internal::conceptIterator17<std::input_iterator_tag> ArgIterator>
void Insert(size_t index, ArgIterator begin, ArgIterator end)
template<std::input_iterator ArgIterator, internal::conceptSentinel<ArgIterator> ArgSentinel>
void Insert(size_t index, ArgIterator begin, ArgSentinel end)
{
if constexpr (std::forward_iterator<ArgIterator>)
{
Expand All @@ -557,7 +557,7 @@ class MergeArray
}
else
{
ArrayShifter::Insert(*this, index, begin, end);
ArrayShifter::Insert(*this, index, std::move(begin), std::move(end));
}
}

Expand Down
12 changes: 6 additions & 6 deletions include/momo/SegmentedArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -215,16 +215,16 @@ class SegmentedArray
SetCount(count, item);
}

template<internal::conceptIterator17<std::input_iterator_tag> ArgIterator>
explicit SegmentedArray(ArgIterator begin, ArgIterator end, MemManager memManager = MemManager())
template<std::input_iterator ArgIterator, internal::conceptSentinel<ArgIterator> ArgSentinel>
explicit SegmentedArray(ArgIterator begin, ArgSentinel end, MemManager memManager = MemManager())
: SegmentedArray(std::move(memManager))
{
try
{
typedef typename ItemTraits::template Creator<
std::iter_reference_t<ArgIterator>> IterCreator;
MemManager& thisMemManager = GetMemManager();
for (ArgIterator iter = begin; iter != end; ++iter)
for (ArgIterator iter = std::move(begin); iter != end; ++iter)
pvAddBack(FastMovableFunctor(IterCreator(thisMemManager, *iter)));
}
catch (...)
Expand Down Expand Up @@ -531,8 +531,8 @@ class SegmentedArray
ArrayShifter::InsertNogrow(*this, index, count, *&itemHandler);
}

template<internal::conceptIterator17<std::input_iterator_tag> ArgIterator>
void Insert(size_t index, ArgIterator begin, ArgIterator end)
template<std::input_iterator ArgIterator, internal::conceptSentinel<ArgIterator> ArgSentinel>
void Insert(size_t index, ArgIterator begin, ArgSentinel end)
{
if constexpr (std::forward_iterator<ArgIterator>)
{
Expand All @@ -542,7 +542,7 @@ class SegmentedArray
}
else
{
ArrayShifter::Insert(*this, index, begin, end);
ArrayShifter::Insert(*this, index, std::move(begin), std::move(end));
}
}

Expand Down
6 changes: 3 additions & 3 deletions include/momo/Utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -246,10 +246,10 @@ namespace internal
return ((value + mod - 1) / mod) * mod;
}

template<std::forward_iterator Iterator>
static UInt Dist(Iterator begin, Iterator end)
template<std::forward_iterator Iterator, conceptSentinel<Iterator> Sentinel>
static UInt Dist(Iterator begin, Sentinel end)
{
return static_cast<UInt>(std::distance(begin, end));
return static_cast<UInt>(std::ranges::distance(begin, end));
}

template<std::forward_iterator Iterator>
Expand Down
16 changes: 6 additions & 10 deletions include/momo/stdish/vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,8 @@ class vector
template<std::ranges::input_range Range>
requires std::convertible_to<std::ranges::range_reference_t<Range>, value_type>
vector(std::from_range_t, Range&& values, const allocator_type& alloc = allocator_type())
: vector(alloc)
: mArray(std::ranges::begin(values), std::ranges::end(values), MemManager(alloc))
{
append_range(values);
}
#endif

Expand Down Expand Up @@ -417,19 +416,16 @@ class vector
requires std::convertible_to<std::ranges::range_reference_t<Range>, value_type>
void append_range(Range&& values)
{
for (auto&& value : values)
mArray.AddBackVar(std::forward<decltype(value)>(value));
insert_range(cend(), std::forward<Range>(values));
}

template<std::ranges::input_range Range>
requires std::convertible_to<std::ranges::range_reference_t<Range>, value_type>
iterator insert_range(const_iterator where, Range&& values)
{
size_t initIndex = SMath::Dist(cbegin(), where);
size_t index = initIndex;
for (auto&& value : values)
mArray.InsertVar(index++, std::forward<decltype(value)>(value));
return SMath::Next(begin(), initIndex);
size_t index = SMath::Dist(cbegin(), where);
mArray.Insert(index, std::ranges::begin(values), std::ranges::end(values));
return SMath::Next(begin(), index);
}

void pop_back()
Expand Down Expand Up @@ -483,7 +479,7 @@ class vector
requires std::convertible_to<std::ranges::range_reference_t<Range>, value_type>
void assign_range(Range&& values)
{
clear();
clear(); //?
append_range(std::forward<Range>(values));
}

Expand Down

0 comments on commit 189c2a7

Please sign in to comment.