Forráskód Böngészése

refactor: match dir structure of ranges-v3

Sam Jaffe 2 éve
szülő
commit
9d99bfb7e5

include/stream/count.h → include/stream/algorithm/count.h


include/stream/fold.h → include/stream/algorithm/fold.h


include/stream/for_each.h → include/stream/algorithm/for_each.h


include/stream/minmax.h → include/stream/algorithm/minmax.h


include/stream/size.h → include/stream/algorithm/size.h


+ 13 - 0
include/stream/detail/macro.h

@@ -0,0 +1,13 @@
+//
+//  macro.h
+//  stream
+//
+//  Created by Sam Jaffe on 4/2/23.
+//
+
+#ifndef _STREAMS_MACRO_H
+#define _STREAMS_MACRO_H
+
+#include <iterator/detail/macro.h>
+
+#endif

+ 13 - 0
include/stream/detail/undef.h

@@ -0,0 +1,13 @@
+//
+//  undef.h
+//  stream
+//
+//  Created by Sam Jaffe on 4/2/23.
+//
+
+#ifdef _STREAMS_MACRO_H
+#undef _STREAMS_MACRO_H
+
+#include <iterator/detail/undef.h>
+
+#endif

+ 32 - 0
include/stream/iterator/common_iterator.h

@@ -0,0 +1,32 @@
+//
+//  common_iterator.h
+//  stream
+//
+//  Created by Sam Jaffe on 4/2/23.
+//
+
+#pragma once
+
+#include <iterator/proxy.h>
+#include <stream/forward.h>
+
+namespace stream::ranges {
+template <typename It, typename S>
+class common_iterator : public proxy<It, common_iterator<It, S>> {
+public:
+  static_assert(!std::is_same_v<It, S>, "cannot operator on common types");
+  using super_t = proxy<It, common_iterator<It, S>>;
+  using sentinel_type = common_iterator;
+
+public:
+  using super_t::super_t;
+  common_iterator(S) : super_t() {}
+
+  bool equal_to(common_iterator const & other) const {
+    return (at_end() && other.at_end()) || super_t::impl() == other.impl();
+  }
+  bool at_end() const { return super_t::impl() == S(); }
+};
+}
+
+MAKE_ITERATOR_FACADE_TYPEDEFS_T(stream::ranges::common_iterator);

+ 35 - 0
include/stream/iterator/transform_iterator.h

@@ -0,0 +1,35 @@
+//
+//  transform_iterator.h
+//  stream
+//
+//  Created by Sam Jaffe on 4/2/23.
+//
+
+#pragma once
+
+#include <iterator/proxy.h>
+#include <stream/forward.h>
+
+namespace stream::ranges {
+template <typename It, typename Proj>
+class transform_iterator : public proxy<It, transform_iterator<It, Proj>> {
+private:
+  using super_t = proxy<It, transform_iterator<It, Proj>>;
+
+private:
+  Proj projection_;
+
+public:
+  transform_iterator() = default;
+  transform_iterator(It iter, Proj projection)
+      : super_t(std::move(iter)), projection_(projection) {}
+
+  decltype(auto) dereference() const {
+    return projection_(super_t::dereference());
+  }
+
+  bool at_end() const { return super_t::impl().at_end(); }
+};
+}
+
+MAKE_ITERATOR_FACADE_TYPEDEFS_T(stream::ranges::transform_iterator);

+ 0 - 45
include/stream/ref_view.h

@@ -1,45 +0,0 @@
-#pragma once
-
-#include <iterator>
-
-#include <iterator/detail/facade_traits.h>
-#include <stream/forward.h>
-#include <stream/owning_view.h>
-
-#include <iterator/detail/macro.h>
-
-namespace stream::ranges {
-template <typename It> class ref_view {
-private:
-  It begin_;
-  It end_;
-
-public:
-  ref_view(It begin, It end) : begin_(begin), end_(end) {}
-  template <typename C>
-  ref_view(C & container)
-      : begin_(std::begin(container)), end_(std::end(container)) {}
-
-  auto begin() const { return begin_; }
-  auto end() const { return end_; }
-  bool empty() const { return begin_ == end_; }
-  SFINAE(detail::has_distance_to_v<It>, size_t) size() const {
-    return end_ - begin_;
-  }
-};
-
-template <typename It> ref_view(It, It) -> ref_view<It>;
-template <typename C> ref_view(C &) -> ref_view<detail::iter<C>>;
-}
-
-namespace stream::ranges::views {
-template <typename C> auto all(C & container) { return ref_view(container); }
-template <typename C> auto all(C const & container) {
-  return ref_view(container);
-}
-template <typename C> auto all(C && container) {
-  return owning_view(std::move(container));
-}
-}
-
-#include <iterator/detail/undef.h>

+ 20 - 19
include/stream/streams.hpp

@@ -2,25 +2,26 @@
 
 #include <stream/forward.h>
 
-#include <stream/empty_view.h>
-#include <stream/owning_view.h>
-#include <stream/ref_view.h>
-#include <stream/single_view.h>
+#include <stream/algorithm/count.h>
+#include <stream/algorithm/fold.h>
+#include <stream/algorithm/for_each.h>
+#include <stream/algorithm/minmax.h>
+#include <stream/algorithm/size.h>
 
-#include <stream/iota_view.h>
+#include <stream/iterator/common_iterator.h>
+#include <stream/iterator/transform_iterator.h>
 
-#include <stream/common_view.h>
-#include <stream/filter_view.h>
-#include <stream/join_view.h>
-#include <stream/reference_view.h>
-#include <stream/transform_view.h>
-#include <stream/tuple_view.h>
+#include <stream/view/all.h>
+#include <stream/view/any.h>
+#include <stream/view/common.h>
+#include <stream/view/empty.h>
+#include <stream/view/filter.h>
+#include <stream/view/iota.h>
+#include <stream/view/join.h>
+#include <stream/view/map.h>
+#include <stream/view/ref.h>
+#include <stream/view/single.h>
+#include <stream/view/subrange.h>
+#include <stream/view/transform.h>
 
-#include <stream/any_view.h>
-
-#include <stream/count.h>
-#include <stream/fold.h>
-#include <stream/for_each.h>
-#include <stream/minmax.h>
-#include <stream/size.h>
-#include <stream/to.h>
+#include <stream/to_container.h>

+ 3 - 3
include/stream/to.h

@@ -11,10 +11,10 @@
 #include <set>
 #include <vector>
 
-#include <stream/common_view.h>
 #include <stream/forward.h>
+#include <stream/view/common.h>
 
-#define FWD(x) std::forward<decltype(x)>(x)
+#include <iterator/detail/macro.h>
 
 namespace stream::ranges {
 template <typename C> class store {
@@ -47,4 +47,4 @@ inline auto to_map() { return to<std::map>(); }
 inline auto to_set() { return to<std::set>(); }
 }
 
-#undef FWD
+#include <iterator/detail/undef.h>

+ 14 - 2
include/stream/owning_view.h

@@ -7,13 +7,15 @@
 
 #pragma once
 
+#include <iterator/detail/macro.h>
+
 namespace stream::ranges {
-template <typename C> class owning_view {
+template <typename C> class all_view {
 private:
   C container_;
 
 public:
-  owning_view(C && container) : container_(std::move(container)) {}
+  all_view(C && container) : container_(FWD(container)) {}
 
   auto begin() const { return container_.begin(); }
   auto end() const { return container_.end(); }
@@ -21,4 +23,14 @@ public:
   size_t size() const { return container_.size(); }
 };
 
+template <typename C> all_view(C &&) -> all_view<C>;
+
+}
+
+namespace stream::ranges::views {
+template <typename C> auto all(C && container) {
+  return all_view(FWD(container));
+}
 }
+
+#include <iterator/detail/undef.h>

+ 3 - 2
include/stream/any_view.h

@@ -1,5 +1,5 @@
 //
-//  view.h
+//  any.h
 //  stream
 //
 //  Created by Sam Jaffe on 3/29/23.
@@ -9,9 +9,10 @@
 
 #include <memory>
 
-#include <stream/common_view.h>
 #include <stream/detail/traits.h>
 #include <stream/forward.h>
+#include <stream/view/any.h>
+#include <stream/view/common.h>
 
 namespace stream::ranges {
 

+ 3 - 25
include/stream/common_view.h

@@ -7,33 +7,14 @@
 
 #pragma once
 
-#include <iterator/proxy.h>
 #include <stream/detail/traits.h>
 #include <stream/forward.h>
+#include <stream/iterator/common_iterator.h>
 
-#include <iterator/detail/macro.h>
-
-#define FWD(x) std::forward<decltype(x)>(x)
+#include <stream/detail/macro.h>
 
 namespace stream::ranges {
 
-template <typename It, typename S>
-class common_iterator : public proxy<It, common_iterator<It, S>> {
-public:
-  static_assert(!std::is_same_v<It, S>, "cannot operator on common types");
-  using super_t = proxy<It, common_iterator<It, S>>;
-  using sentinel_type = common_iterator;
-
-public:
-  using super_t::super_t;
-  common_iterator(S) : super_t() {}
-
-  bool equal_to(common_iterator const & other) const {
-    return (at_end() && other.at_end()) || super_t::impl() == other.impl();
-  }
-  bool at_end() const { return super_t::impl() == S(); }
-};
-
 template <typename S> class common_view {
 private:
   using iterator = common_iterator<detail::begin_t<S>, detail::end_t<S>>;
@@ -67,7 +48,4 @@ struct common {
 };
 }
 
-MAKE_ITERATOR_FACADE_TYPEDEFS_T(stream::ranges::common_iterator);
-
-#undef FWD
-#include <iterator/detail/undef.h>
+#include <stream/detail/undef.h>

include/stream/empty_view.h → include/stream/view/empty.h


include/stream/filter_view.h → include/stream/view/filter.h


+ 1 - 1
include/stream/iota_view.h

@@ -1,5 +1,5 @@
 //
-//  iota_view.h
+//  iota.h
 //  stream
 //
 //  Created by Sam Jaffe on 3/29/23.

include/stream/join_view.h → include/stream/view/join.h


+ 1 - 1
include/stream/tuple_view.h

@@ -7,7 +7,7 @@
 
 #pragma once
 
-#include <stream/transform_view.h>
+#include <stream/view/transform.h>
 
 namespace stream::ranges::views {
 template <size_t I> auto elements() {

+ 1 - 1
include/stream/reference_view.h

@@ -7,7 +7,7 @@
 
 #pragma once
 
-#include <stream/transform_view.h>
+#include <stream/view/transform.h>
 
 namespace stream::ranges::views {
 inline auto deref() {

include/stream/single_view.h → include/stream/view/single.h


+ 39 - 0
include/stream/view/subrange.h

@@ -0,0 +1,39 @@
+#pragma once
+
+#include <iterator>
+
+#include <iterator/detail/facade_traits.h>
+#include <stream/forward.h>
+
+#include <iterator/detail/macro.h>
+
+namespace stream::ranges {
+template <typename It, typename S = It> class subrange {
+private:
+  It begin_;
+  S end_;
+
+public:
+  subrange(It begin, S end) : begin_(begin), end_(end) {}
+  template <typename C, REQUIRES(detail::is_container_v<C>)>
+  subrange(C && container)
+      : subrange(std::begin(container), std::end(container)) {
+    // TODO: permissible dangling
+    static_assert(std::is_reference_v<C>,
+                  "Cannot access iterator of a temporary");
+  }
+
+  auto begin() const { return begin_; }
+  auto end() const { return end_; }
+  bool empty() const { return begin_ == end_; }
+  SFINAE(detail::has_distance_to_v<It>, size_t) size() const {
+    return end_ - begin_;
+  }
+};
+
+template <typename It, typename S> subrange(It, S) -> subrange<It, S>;
+template <typename C>
+subrange(C &&) -> subrange<detail::begin_t<C>, detail::end_t<C>>;
+}
+
+#include <iterator/detail/undef.h>

+ 3 - 28
include/stream/transform_view.h

@@ -2,35 +2,13 @@
 
 #include <functional>
 
-#include <iterator/proxy.h>
 #include <stream/detail/traits.h>
 #include <stream/forward.h>
+#include <stream/iterator/transform_iterator.h>
 
-#include <iterator/detail/macro.h>
-
-#define FWD(x) std::forward<decltype(x)>(x)
+#include <stream/detail/macro.h>
 
 namespace stream::ranges {
-template <typename It, typename Proj>
-class transform_iterator : public proxy<It, transform_iterator<It, Proj>> {
-private:
-  using super_t = proxy<It, transform_iterator<It, Proj>>;
-
-private:
-  Proj projection_;
-
-public:
-  transform_iterator() = default;
-  transform_iterator(It iter, Proj projection)
-      : super_t(std::move(iter)), projection_(projection) {}
-
-  decltype(auto) dereference() const {
-    return projection_(super_t::dereference());
-  }
-
-  bool at_end() const { return super_t::impl().at_end(); }
-};
-
 template <typename S, typename Proj> class transform_view {
 private:
 private:
@@ -67,8 +45,6 @@ template <typename S, typename Proj>
 transform_view(S &&, Proj) -> transform_view<S, Proj>;
 }
 
-MAKE_ITERATOR_FACADE_TYPEDEFS_T(stream::ranges::transform_iterator);
-
 namespace stream::ranges::views {
 template <typename Proj> class transform {
 public:
@@ -85,5 +61,4 @@ private:
 };
 }
 
-#undef FWD
-#include <iterator/detail/undef.h>
+#include <stream/detail/undef.h>

+ 80 - 32
stream.xcodeproj/project.pbxproj

@@ -65,33 +65,37 @@
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
-		CD5281EB29D3B173001A84DE /* join_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = join_view.h; sourceTree = "<group>"; };
+		CD5281EB29D3B173001A84DE /* join.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = join.h; sourceTree = "<group>"; };
 		CD5281EC29D3B173001A84DE /* traits.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = traits.h; sourceTree = "<group>"; };
-		CD5281ED29D3B173001A84DE /* transform_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = transform_view.h; sourceTree = "<group>"; };
+		CD5281ED29D3B173001A84DE /* transform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = transform.h; sourceTree = "<group>"; };
 		CD5281F029D3B173001A84DE /* forward.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = forward.h; sourceTree = "<group>"; };
-		CD5281F529D3B173001A84DE /* filter_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = filter_view.h; sourceTree = "<group>"; };
-		CD5281F629D3B173001A84DE /* ref_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ref_view.h; sourceTree = "<group>"; };
+		CD5281F529D3B173001A84DE /* filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = filter.h; sourceTree = "<group>"; };
+		CD5281F629D3B173001A84DE /* subrange.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = subrange.h; sourceTree = "<group>"; };
 		CD5281F729D3B173001A84DE /* streams.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = streams.hpp; sourceTree = "<group>"; };
 		CD52820029D3B193001A84DE /* libstream.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libstream.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		CD52820B29D3B705001A84DE /* iterator.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = iterator.xcodeproj; path = external/iterator/iterator.xcodeproj; sourceTree = "<group>"; };
-		CD52827729D4EED6001A84DE /* empty_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = empty_view.h; sourceTree = "<group>"; };
-		CD52827829D4EF0E001A84DE /* single_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = single_view.h; sourceTree = "<group>"; };
-		CD52827929D4EF43001A84DE /* owning_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = owning_view.h; sourceTree = "<group>"; };
-		CD52827A29D4EFBE001A84DE /* iota_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iota_view.h; sourceTree = "<group>"; };
-		CD52827B29D4F764001A84DE /* any_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = any_view.h; sourceTree = "<group>"; };
-		CD52827C29D4FB11001A84DE /* to.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = to.h; sourceTree = "<group>"; };
+		CD52827729D4EED6001A84DE /* empty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = empty.h; sourceTree = "<group>"; };
+		CD52827829D4EF0E001A84DE /* single.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = single.h; sourceTree = "<group>"; };
+		CD52827929D4EF43001A84DE /* all.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = all.h; sourceTree = "<group>"; };
+		CD52827A29D4EFBE001A84DE /* iota.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iota.h; sourceTree = "<group>"; };
+		CD52827B29D4F764001A84DE /* any.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = any.h; sourceTree = "<group>"; };
+		CD52827C29D4FB11001A84DE /* to_container.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = to_container.h; sourceTree = "<group>"; };
 		CD52827D29D50081001A84DE /* for_each.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = for_each.h; sourceTree = "<group>"; };
-		CD52827E29D50BFA001A84DE /* reference_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = reference_view.h; sourceTree = "<group>"; };
+		CD52827E29D50BFA001A84DE /* ref.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ref.h; sourceTree = "<group>"; };
 		CD52827F29D50E24001A84DE /* fold.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fold.h; sourceTree = "<group>"; };
 		CD52828029D51166001A84DE /* identity.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = identity.h; sourceTree = "<group>"; };
-		CD52828129D5133C001A84DE /* tuple_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tuple_view.h; sourceTree = "<group>"; };
+		CD52828129D5133C001A84DE /* map.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = map.h; sourceTree = "<group>"; };
 		CD5A8D3529D63C05008C2A4F /* count.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = count.h; sourceTree = "<group>"; };
 		CD5A8D3B29D63DF5008C2A4F /* named_pair.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = named_pair.h; sourceTree = "<group>"; };
 		CD64CCB926232D6900770A30 /* xcode_gtest_helper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = xcode_gtest_helper.h; sourceTree = "<group>"; };
-		CD6EBE1C29D5C61700F387C1 /* common_view.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common_view.h; sourceTree = "<group>"; };
+		CD6EBE1C29D5C61700F387C1 /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = "<group>"; };
 		CD6EBE2329D5CAD900F387C1 /* size.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = size.h; sourceTree = "<group>"; };
 		CD6EBE2629D63B9E00F387C1 /* minmax.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = minmax.h; sourceTree = "<group>"; };
 		CD9337281E3CD78B00699FF5 /* stream_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = stream_test.cxx; sourceTree = "<group>"; };
+		CDA37D3929D9BDED000A1F97 /* macro.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = macro.h; sourceTree = "<group>"; };
+		CDA37D3A29D9BDF2000A1F97 /* undef.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = undef.h; sourceTree = "<group>"; };
+		CDA37D3B29D9C30B000A1F97 /* common_iterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common_iterator.h; sourceTree = "<group>"; };
+		CDA37D3C29D9C311000A1F97 /* transform_iterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = transform_iterator.h; sourceTree = "<group>"; };
 		CDAA170121A3A738007BBA11 /* stream */ = {isa = PBXFileReference; lastKnownFileType = folder; name = stream; path = include/stream; sourceTree = "<group>"; };
 		CDE8545E24DEBEBF006FE7C7 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
 		CDEC1D5B23514BB50091D9F2 /* GoogleMock.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GoogleMock.xcodeproj; path = "../../../../gmock-xcode-master/GoogleMock.xcodeproj"; sourceTree = "<group>"; };
@@ -144,26 +148,14 @@
 		CD5281E929D3B173001A84DE /* stream */ = {
 			isa = PBXGroup;
 			children = (
-				CD5281F229D3B173001A84DE /* detail */,
-				CD52827729D4EED6001A84DE /* empty_view.h */,
-				CD52827829D4EF0E001A84DE /* single_view.h */,
-				CD52827929D4EF43001A84DE /* owning_view.h */,
-				CD5281F629D3B173001A84DE /* ref_view.h */,
-				CD52827A29D4EFBE001A84DE /* iota_view.h */,
-				CD6EBE1C29D5C61700F387C1 /* common_view.h */,
-				CD5281ED29D3B173001A84DE /* transform_view.h */,
-				CD52828129D5133C001A84DE /* tuple_view.h */,
-				CD5281F529D3B173001A84DE /* filter_view.h */,
-				CD5281EB29D3B173001A84DE /* join_view.h */,
-				CD52827E29D50BFA001A84DE /* reference_view.h */,
-				CD6EBE2329D5CAD900F387C1 /* size.h */,
-				CD52827D29D50081001A84DE /* for_each.h */,
-				CD52827C29D4FB11001A84DE /* to.h */,
-				CD52827F29D50E24001A84DE /* fold.h */,
-				CD5A8D3529D63C05008C2A4F /* count.h */,
-				CD6EBE2629D63B9E00F387C1 /* minmax.h */,
-				CD52827B29D4F764001A84DE /* any_view.h */,
 				CD5281F029D3B173001A84DE /* forward.h */,
+				CDA37D3529D9BB1A000A1F97 /* action */,
+				CDA37D2F29D9BB13000A1F97 /* algorithm */,
+				CD5281F229D3B173001A84DE /* detail */,
+				CDA37D3629D9BB24000A1F97 /* iterator */,
+				CDA37D3729D9BB9C000A1F97 /* numeric */,
+				CD52827C29D4FB11001A84DE /* to_container.h */,
+				CDA37D3829D9BBA5000A1F97 /* view */,
 				CD5281F729D3B173001A84DE /* streams.hpp */,
 			);
 			path = stream;
@@ -173,8 +165,10 @@
 			isa = PBXGroup;
 			children = (
 				CD52828029D51166001A84DE /* identity.h */,
+				CDA37D3929D9BDED000A1F97 /* macro.h */,
 				CD5A8D3B29D63DF5008C2A4F /* named_pair.h */,
 				CD5281EC29D3B173001A84DE /* traits.h */,
+				CDA37D3A29D9BDF2000A1F97 /* undef.h */,
 			);
 			path = detail;
 			sourceTree = "<group>";
@@ -206,6 +200,60 @@
 			path = test;
 			sourceTree = "<group>";
 		};
+		CDA37D2F29D9BB13000A1F97 /* algorithm */ = {
+			isa = PBXGroup;
+			children = (
+				CD5A8D3529D63C05008C2A4F /* count.h */,
+				CD52827F29D50E24001A84DE /* fold.h */,
+				CD52827D29D50081001A84DE /* for_each.h */,
+				CD6EBE2629D63B9E00F387C1 /* minmax.h */,
+				CD6EBE2329D5CAD900F387C1 /* size.h */,
+			);
+			path = algorithm;
+			sourceTree = "<group>";
+		};
+		CDA37D3529D9BB1A000A1F97 /* action */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = action;
+			sourceTree = "<group>";
+		};
+		CDA37D3629D9BB24000A1F97 /* iterator */ = {
+			isa = PBXGroup;
+			children = (
+				CDA37D3B29D9C30B000A1F97 /* common_iterator.h */,
+				CDA37D3C29D9C311000A1F97 /* transform_iterator.h */,
+			);
+			path = iterator;
+			sourceTree = "<group>";
+		};
+		CDA37D3729D9BB9C000A1F97 /* numeric */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			path = numeric;
+			sourceTree = "<group>";
+		};
+		CDA37D3829D9BBA5000A1F97 /* view */ = {
+			isa = PBXGroup;
+			children = (
+				CD52827929D4EF43001A84DE /* all.h */,
+				CD52827B29D4F764001A84DE /* any.h */,
+				CD6EBE1C29D5C61700F387C1 /* common.h */,
+				CD52827729D4EED6001A84DE /* empty.h */,
+				CD5281F529D3B173001A84DE /* filter.h */,
+				CD52827A29D4EFBE001A84DE /* iota.h */,
+				CD5281EB29D3B173001A84DE /* join.h */,
+				CD52828129D5133C001A84DE /* map.h */,
+				CD52827E29D50BFA001A84DE /* ref.h */,
+				CD52827829D4EF0E001A84DE /* single.h */,
+				CD5281F629D3B173001A84DE /* subrange.h */,
+				CD5281ED29D3B173001A84DE /* transform.h */,
+			);
+			path = view;
+			sourceTree = "<group>";
+		};
 		CDEC1D5C23514BB50091D9F2 /* Products */ = {
 			isa = PBXGroup;
 			children = (

+ 1 - 1
test/stream_test.cxx

@@ -109,7 +109,7 @@ TEST(StreamTest, CanBuildFromIterators) {
   std::vector<int> input{1, 2, 3, 4, 5};
   std::vector<int> expected{5, 7};
   auto fmap = [](int i) { return 2 * i + 1; };
-  auto out = ranges::ref_view(input.begin() + 1, input.begin() + 3) |
+  auto out = ranges::subrange(input.begin() + 1, input.begin() + 3) |
              views::transform(fmap) | ranges::to_vector();
 
   EXPECT_THAT(out, Eq(expected));