From d86255475998c47cd49e37164272a702d5ff474a Mon Sep 17 00:00:00 2001 From: morzhovets Date: Sat, 16 Nov 2024 22:06:25 +0400 Subject: [PATCH] std::input_iterator --- include/momo/DataSelection.h | 23 +++++++++++--------- include/momo/DataTable.h | 42 ++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/include/momo/DataSelection.h b/include/momo/DataSelection.h index 191028c2..6e67022f 100644 --- a/include/momo/DataSelection.h +++ b/include/momo/DataSelection.h @@ -100,7 +100,7 @@ namespace internal }; template - concept conceptDataRowIterator = conceptIterator17 && + concept conceptDataRowIterator = std::input_iterator && requires (DataRowIterator iter) { { *iter } -> std::convertible_to; }; template @@ -599,11 +599,12 @@ namespace internal mColumnList->GetOffset(column)); } - template RowIterator> - void Assign(RowIterator begin, RowIterator end) + template RowIterator, + conceptSentinel RowSentinel> + void Assign(RowIterator begin, RowSentinel end) { size_t initCount = GetCount(); - Add(begin, end); //? + Add(std::move(begin), std::move(end)); //? mRaws.Remove(0, initCount); } @@ -614,13 +615,14 @@ namespace internal mRaws.AddBack(RowReferenceProxy::GetRaw(rowRef)); } - template RowIterator> - void Add(RowIterator begin, RowIterator end) + template RowIterator, + conceptSentinel RowSentinel> + void Add(RowIterator begin, RowSentinel end) { size_t initCount = GetCount(); try { - for (RowIterator iter = begin; iter != end; ++iter) + for (RowIterator iter = std::move(begin); iter != end; ++iter) { RowReference rowRef = *iter; MOMO_CHECK(&rowRef.GetColumnList() == mColumnList); @@ -642,12 +644,13 @@ namespace internal mRaws.Insert(index, RowReferenceProxy::GetRaw(rowRef)); } - template RowIterator> - void Insert(size_t index, RowIterator begin, RowIterator end) + template RowIterator, + conceptSentinel RowSentinel> + void Insert(size_t index, RowIterator begin, RowSentinel end) { size_t initCount = GetCount(); MOMO_CHECK(index <= initCount); - Add(begin, end); + Add(std::move(begin), std::move(end)); std::rotate(UIntMath<>::Next(mRaws.GetBegin(), index), UIntMath<>::Next(mRaws.GetBegin(), initCount), mRaws.GetEnd()); } diff --git a/include/momo/DataTable.h b/include/momo/DataTable.h index 7597f5ae..ad01cd03 100644 --- a/include/momo/DataTable.h +++ b/include/momo/DataTable.h @@ -662,16 +662,18 @@ class DataTable return pvTryUpdate(rowRef, column, newItem); } - template RowIterator> - void Assign(RowIterator begin, RowIterator end) + template RowIterator, + internal::conceptSentinel RowSentinel> + void Assign(RowIterator begin, RowSentinel end) { - pvAssign(begin, end); + pvAssign(std::move(begin), std::move(end)); } - template RowIterator> - void Remove(RowIterator begin, RowIterator end) + template RowIterator, + internal::conceptSentinel RowSentinel> + void Remove(RowIterator begin, RowSentinel end) { - pvRemove(begin, end); + pvRemove(std::move(begin), std::move(end)); } template RowFilter> @@ -1099,8 +1101,9 @@ class DataTable return { pvMakeRowReference(raw), UniqueHashIndex::empty }; } - template RowIterator> - void pvAssign(RowIterator begin, RowIterator end) + template RowIterator, + internal::conceptSentinel RowSentinel> + void pvAssign(RowIterator begin, RowSentinel end) requires (Settings::keepRowNumber) { const ColumnList& columnList = GetColumnList(); @@ -1109,7 +1112,7 @@ class DataTable size_t count = 0; try { - for (RowIterator iter = begin; iter != end; ++iter) + for (RowIterator iter = std::move(begin); iter != end; ++iter) { ConstRowReference rowRef = *iter; MOMO_CHECK(&rowRef.GetColumnList() == &columnList); @@ -1139,8 +1142,9 @@ class DataTable } } - template RowIterator> - void pvAssign(RowIterator begin, RowIterator end) + template RowIterator, + internal::conceptSentinel RowSentinel> + void pvAssign(RowIterator begin, RowSentinel end) requires (!Settings::keepRowNumber) { typedef HashMap, MemManagerPtr, @@ -1148,7 +1152,7 @@ class DataTable internal::NestedHashMapSettings> RawMap; RawMap rawMap((HashTraits()), MemManagerPtr(GetMemManager())); size_t count = 0; - for (RowIterator iter = begin; iter != end; ++iter) + for (RowIterator iter = std::move(begin); iter != end; ++iter) { ConstRowReference rowRef = *iter; MOMO_CHECK(&rowRef.GetColumnList() == &GetColumnList()); @@ -1172,14 +1176,15 @@ class DataTable } } - template RowIterator> - void pvRemove(RowIterator begin, RowIterator end) + template RowIterator, + internal::conceptSentinel RowSentinel> + void pvRemove(RowIterator begin, RowSentinel end) requires (Settings::keepRowNumber) { const ColumnList& columnList = GetColumnList(); try { - for (RowIterator iter = begin; iter != end; ++iter) + for (RowIterator iter = std::move(begin); iter != end; ++iter) { ConstRowReference rowRef = *iter; MOMO_CHECK(&rowRef.GetColumnList() == &columnList); @@ -1195,14 +1200,15 @@ class DataTable pvSetNumbers(); } - template RowIterator> - void pvRemove(RowIterator begin, RowIterator end) + template RowIterator, + internal::conceptSentinel RowSentinel> + void pvRemove(RowIterator begin, RowSentinel end) requires (!Settings::keepRowNumber) { typedef HashSet, MemManagerPtr, HashSetItemTraits, internal::NestedHashSetSettings> RawSet; RawSet rawSet((HashTraits()), MemManagerPtr(GetMemManager())); - for (RowIterator iter = begin; iter != end; ++iter) + for (RowIterator iter = std::move(begin); iter != end; ++iter) { ConstRowReference rowRef = *iter; MOMO_CHECK(&rowRef.GetColumnList() == &GetColumnList());