aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/protobuf/patches/future-piece-c33967fcbc838e1a36e8ad7665d1b73177716e9d.patch
diff options
context:
space:
mode:
authormaxim-yurchuk <maxim-yurchuk@yandex-team.com>2024-10-09 12:29:46 +0300
committermaxim-yurchuk <maxim-yurchuk@yandex-team.com>2024-10-09 13:14:22 +0300
commit9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80 (patch)
treea8fb3181d5947c0d78cf402aa56e686130179049 /contrib/libs/protobuf/patches/future-piece-c33967fcbc838e1a36e8ad7665d1b73177716e9d.patch
parenta44b779cd359f06c3ebbef4ec98c6b38609d9d85 (diff)
downloadydb-9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80.tar.gz
publishFullContrib: true for ydb
<HIDDEN_URL> commit_hash:c82a80ac4594723cebf2c7387dec9c60217f603e
Diffstat (limited to 'contrib/libs/protobuf/patches/future-piece-c33967fcbc838e1a36e8ad7665d1b73177716e9d.patch')
-rw-r--r--contrib/libs/protobuf/patches/future-piece-c33967fcbc838e1a36e8ad7665d1b73177716e9d.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/contrib/libs/protobuf/patches/future-piece-c33967fcbc838e1a36e8ad7665d1b73177716e9d.patch b/contrib/libs/protobuf/patches/future-piece-c33967fcbc838e1a36e8ad7665d1b73177716e9d.patch
new file mode 100644
index 0000000000..29f4d9e075
--- /dev/null
+++ b/contrib/libs/protobuf/patches/future-piece-c33967fcbc838e1a36e8ad7665d1b73177716e9d.patch
@@ -0,0 +1,110 @@
+From c33967fcbc838e1a36e8ad7665d1b73177716e9d Mon Sep 17 00:00:00 2001
+From: Protobuf Team Bot <protobuf-github-bot@google.com>
+Date: Mon, 20 Nov 2023 04:18:49 -0800
+Subject: [PATCH] Add iterator_concept support.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This allows for better code generation in C++20 for algorithms that take advantage of random access vs contiguous data.
+
+```
+name old INSTRUCTIONS/op new INSTRUCTIONS/op delta
+BM_RepeatedField_Sort 5.74k ± 0% 5.74k ± 0% -0.13% (p=0.000 n=179+183)
+BM_RepeatedField_ToVector 693 ± 0% 693 ± 0% ~ (p=0.153 n=93+91)
+BM_RepeatedPtrField_SortIndirect 562 ± 0% 559 ± 0% -0.53% (p=0.000 n=92+92)
+```
+
+PiperOrigin-RevId: 583983215
+---
+ src/google/protobuf/BUILD.bazel | 1 +
+ src/google/protobuf/repeated_field.h | 18 +++--
+ .../protobuf/repeated_field_unittest.cc | 69 +++++++++++++++++++
+ src/google/protobuf/repeated_ptr_field.h | 26 +++++--
+ 4 files changed, 103 insertions(+), 11 deletions(-)
+
+diff --git a/src/google/protobuf/repeated_field.h b/src/google/protobuf/repeated_field.h
+index a3f77153289b..5351846558e6 100644
+--- a/src/google/protobuf/repeated_field.h
++++ b/src/google/protobuf/repeated_field.h
+@@ -1035,14 +1035,18 @@ namespace internal {
+ // the compiler isn't allowed to inline them.
+ template <typename Element>
+ class RepeatedIterator {
++ private:
++ using traits =
++ std::iterator_traits<typename std::remove_const<Element>::type*>;
++
+ public:
+- using iterator_category = std::random_access_iterator_tag;
+- // Note: remove_const is necessary for std::partial_sum, which uses value_type
+- // to determine the summation variable type.
+- using value_type = typename std::remove_const<Element>::type;
+- using difference_type = std::ptrdiff_t;
++ // Note: value_type is never cv-qualified.
++ using value_type = typename traits::value_type;
++ using difference_type = typename traits::difference_type;
+ using pointer = Element*;
+ using reference = Element&;
++ using iterator_category = typename traits::iterator_category;
++ using iterator_concept = typename IteratorConceptSupport<traits>::tag;
+
+ constexpr RepeatedIterator() noexcept : it_(nullptr) {}
+
+@@ -1142,10 +1146,10 @@ class RepeatedIterator {
+
+ // Allow construction from RepeatedField.
+ friend class RepeatedField<value_type>;
+- explicit RepeatedIterator(Element* it) noexcept : it_(it) {}
++ explicit RepeatedIterator(pointer it) noexcept : it_(it) {}
+
+ // The internal iterator.
+- Element* it_;
++ pointer it_;
+ };
+
+ // A back inserter for RepeatedField objects.
+diff --git a/src/google/protobuf/repeated_ptr_field.h b/src/google/protobuf/repeated_ptr_field.h
+index 64cdd1890e3c..7a57dfee134c 100644
+@@ -1852,6 +1853,17 @@ class RepeatedPtrIterator {
+ void* const* it_;
+ };
+
++template <typename Traits, typename = void>
++struct IteratorConceptSupport {
++ using tag = typename Traits::iterator_category;
++};
++
++template <typename Traits>
++struct IteratorConceptSupport<Traits,
++ std::void_t<typename Traits::iterator_concept>> {
++ using tag = typename Traits::iterator_concept;
++};
++
+ // Provides an iterator that operates on pointers to the underlying objects
+ // rather than the objects themselves as RepeatedPtrIterator does.
+ // Consider using this when working with stl algorithms that change
+@@ -1861,13 +1873,19 @@ class RepeatedPtrIterator {
+ // iterator, or "const void* const" for a constant iterator.
+ template <typename Element, typename VoidPtr>
+ class RepeatedPtrOverPtrsIterator {
++ private:
++ using traits =
++ std::iterator_traits<typename std::remove_const<Element>::type*>;
++
+ public:
+- using iterator = RepeatedPtrOverPtrsIterator<Element, VoidPtr>;
+- using iterator_category = std::random_access_iterator_tag;
+- using value_type = typename std::remove_const<Element>::type;
+- using difference_type = std::ptrdiff_t;
++ using value_type = typename traits::value_type;
++ using difference_type = typename traits::difference_type;
+ using pointer = Element*;
+ using reference = Element&;
++ using iterator_category = typename traits::iterator_category;
++ using iterator_concept = typename IteratorConceptSupport<traits>::tag;
++
++ using iterator = RepeatedPtrOverPtrsIterator<Element, VoidPtr>;
+
+ RepeatedPtrOverPtrsIterator() : it_(nullptr) {}
+ explicit RepeatedPtrOverPtrsIterator(VoidPtr* it) : it_(it) {} \ No newline at end of file