From 146996c4ef38c2b47abe3c0044ecded37bb2268a Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Fri, 5 Feb 2021 12:03:18 +1000 Subject: [PATCH] iterator: add tuple_picker adapter --- CMakeLists.txt | 1 + iterator/tuple_picker.hpp | 67 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 iterator/tuple_picker.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 55428293..d5801fb5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -426,6 +426,7 @@ list ( iterator/placement_output.hpp iterator/referencing.hpp iterator/transform.hpp + iterator/tuple_picker.hpp iterator/unequal.hpp iterator/unordered_insert.hpp iterator/zip.hpp diff --git a/iterator/tuple_picker.hpp b/iterator/tuple_picker.hpp new file mode 100644 index 00000000..f727b536 --- /dev/null +++ b/iterator/tuple_picker.hpp @@ -0,0 +1,67 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2021, Danny Robson + */ + +#pragma once + +#include +#include +#include +#include + + +/////////////////////////////////////////////////////////////////////////////// +namespace cruft::iterator { + /// An iterator adapter that returns the tuple_element at IndexV for the + /// underlying iterator when dereferenced. + template + class tuple_picker { + public: + using iterator_category = typename std::iterator_traits::iterator_category; + using value_type = std::tuple_element_t< + IndexV, + // Ideally we'd use iterator_traits::value_type but that removes + // constness from value_type for pointers to const, and we need to + // retain const semantics to support some existing cases (like + // map::keys queries). + std::remove_reference_t ())> + >; + + using difference_type = typename std::iterator_traits::difference_type; + using pointer = value_type*; + using reference = value_type&; + + tuple_picker (IteratorT _cursor) + : m_cursor (_cursor) + { ; } + + reference operator* () { return std::get (*m_cursor); } + tuple_picker& operator++ () { ++m_cursor; return *this; } + + auto operator<=> (tuple_picker const &rhs) const = default; + + private: + IteratorT m_cursor; + }; + + + /// A convenience constructor for tuple_picker. + /// + /// Provided in-lieu of a user deduction guide so that partial template + /// parameters can be provided. ie, make_tuple_picker<1> (iter). + template + auto + make_tuple_picker (IteratorT &&iterator) + { + return tuple_picker< + IndexV, + std::remove_reference_t + > ( + std::forward (iterator) + ); + } +} \ No newline at end of file