瀏覽代碼

Begin development of zip_iterator.

Sam Jaffe 5 年之前
父節點
當前提交
39b3ac2bcd
共有 3 個文件被更改,包括 62 次插入0 次删除
  1. 35 0
      include/iterator/zip_iterator.hpp
  2. 4 0
      iterator.xcodeproj/project.pbxproj
  3. 23 0
      test/zip_iterator_test.cxx

+ 35 - 0
include/iterator/zip_iterator.hpp

@@ -0,0 +1,35 @@
+#pragma once
+
+#include <iterator>
+#include <tuple>
+
+#include "detail/arrow_proxy.h"
+
+namespace iterator {
+  template <typename... Iterators> class zip_iterator {
+  public:
+    using value_type = std::tuple<typename Iterators::value_type...>;
+    using reference = std::tuple<typename Iterators::reference...>;
+    using pointer = void; // tuple cannot be accessed by member
+    using difference_type =
+        std::common_type_t<typename Iterators::difference_type...>;
+    using iterator_category =
+        std::common_type_t<typename Iterators::iterator_category...>;
+
+  private:
+    std::tuple<Iterators...> iterators_;
+
+  public:
+    zip_iterator() = default;
+    zip_iterator(Iterators &&... iters) : iterators_(iters...) {}
+
+    reference operator*() const {
+      return reference(*std::get<Iterators>(iterators_)...);
+    }
+  };
+}
+
+template <typename... Iterators>
+iterator::zip_iterator<Iterators...> make_zip_iterator(Iterators &&... iters) {
+  return {std::forward<Iterators>(iters)...};
+}

+ 4 - 0
iterator.xcodeproj/project.pbxproj

@@ -18,6 +18,7 @@
 		CDCB3BDD24E1D5320029B771 /* indexed_iterator_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDCB3BD424E1D5320029B771 /* indexed_iterator_test.cxx */; };
 		CDCB3BDE24E1D5320029B771 /* recursive_iterator_map_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDCB3BD524E1D5320029B771 /* recursive_iterator_map_test.cxx */; };
 		CDCB3BFC24E327CF0029B771 /* recursive_iterator_single_level_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDCB3BFB24E327CF0029B771 /* recursive_iterator_single_level_test.cxx */; };
+		CDCB3C0324E33A1E0029B771 /* zip_iterator_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CDCB3C0224E33A1E0029B771 /* zip_iterator_test.cxx */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -85,6 +86,7 @@
 		CDCB3BD424E1D5320029B771 /* indexed_iterator_test.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = indexed_iterator_test.cxx; sourceTree = "<group>"; };
 		CDCB3BD524E1D5320029B771 /* recursive_iterator_map_test.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = recursive_iterator_map_test.cxx; sourceTree = "<group>"; };
 		CDCB3BFB24E327CF0029B771 /* recursive_iterator_single_level_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = recursive_iterator_single_level_test.cxx; sourceTree = "<group>"; };
+		CDCB3C0224E33A1E0029B771 /* zip_iterator_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = zip_iterator_test.cxx; sourceTree = "<group>"; };
 		CDEC1E01235167920091D9F2 /* GoogleMock.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GoogleMock.xcodeproj; path = "../../../gmock-xcode-master/GoogleMock.xcodeproj"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -140,6 +142,7 @@
 				CDCB3BD524E1D5320029B771 /* recursive_iterator_map_test.cxx */,
 				CDCB3BCF24E1D5320029B771 /* recursive_iterator_vector_test.cxx */,
 				CDCB3BFB24E327CF0029B771 /* recursive_iterator_single_level_test.cxx */,
+				CDCB3C0224E33A1E0029B771 /* zip_iterator_test.cxx */,
 				CDCB3BCE24E1D5320029B771 /* unkeyed_iterator_test.cxx */,
 			);
 			path = test;
@@ -340,6 +343,7 @@
 				CDCB3BD624E1D5320029B771 /* join_iterator_test.cxx in Sources */,
 				CDCB3BD724E1D5320029B771 /* unkeyed_iterator_test.cxx in Sources */,
 				CDCB3BDA24E1D5320029B771 /* recursive_iterator_mixed_container_test.cxx in Sources */,
+				CDCB3C0324E33A1E0029B771 /* zip_iterator_test.cxx in Sources */,
 				CDCB3BD924E1D5320029B771 /* recursive_iterator_accessors_test.cxx in Sources */,
 				CDCB3BFC24E327CF0029B771 /* recursive_iterator_single_level_test.cxx in Sources */,
 			);

+ 23 - 0
test/zip_iterator_test.cxx

@@ -0,0 +1,23 @@
+//
+//  zip_iterator_test.cxx
+//  iterator-test
+//
+//  Created by Sam Jaffe on 8/11/20.
+//  Copyright © 2020 Sam Jaffe. All rights reserved.
+//
+
+#include "iterator/zip_iterator.hpp"
+
+#include <forward_list>
+#include <list>
+#include <vector>
+
+#include <gmock/gmock.h>
+
+TEST(ZipIteratorTest, CanCombineParallelObjects) {
+  std::vector<int> is{1, 2, 3};
+  std::vector<std::string> ss{"A", "B", "C"};
+  auto zit = make_zip_iterator(is.begin(), ss.begin());
+  EXPECT_THAT(std::get<0>(*zit), 1);
+  EXPECT_THAT(std::get<1>(*zit), "A");
+}