先来分析,这个代码的整个执行的流程.

#include <iostream>
#include "./source/Stream.h"

int arr[] = {1,2,3,4,5,6};
using namespace stream;
using namespace stream::op;

int main (int argc, char *argv[]) {
    
    int arr_len  = sizeof(arr) / sizeof(arr[0]);

    MakeStream::from(arr,arr_len) | filter([](int n) { return n % 2 ==0 ;}) 
        | print_to(std::cout," -> ");

    // int number = stream | filter([](int n){ return n % 2 == 0;}) || count();
    return 0;
}

MakeStream::from(arr,arr_len)其实是调用了Stream.hMakeStream类里的一个函数.这个函数又调用了 Stream类的生成函数

    template<typename Iterator>
    Stream(Iterator begin, Iterator end)
        : source_(make_stream_provider<provider::Iterator, T, Iterator>(
            begin, end)) {}

可以发现source_就是 一个StreamProviderPtr<T>类型的对象.

StreamProviderPtr<T> source_;

StreamProviderPtr又是由make_stream_provider生成的.

其中:

  • provider::Iterator 是一个Iterator类型的对象.
  • T 是一个int类型的对象.
  • Iterator 是一个int*类型的对象.

provider::Iterator定义在source/providers/Iterator.h

namespace stream {
namespace provider {

template<typename T, typename Itr>
class Iterator : public StreamProvider<T> {

所以我们选要阅读source/providers里的代码,按下面的顺序阅读

根据map.html里的关系图,StreamProvider.h是一个很基础的类,很多其它的类都需要它

  1. source/providers/StreamProvider.h