ORIGINAL
Loading...
Searching...
No Matches
transformStream.h
1#ifndef TRANSFORMSTREAM_H
2#define TRANSFORMSTREAM_H
3
4#include "transform.h"
5#include "chain.h"
6#include <memory>
7
8namespace original {
9
10 template<typename TYPE>
11 class transformStream {
13
14 void pushEnd(const transform<TYPE>& t);
15 protected:
16 explicit transformStream();
17
18 public:
19 void operator()(TYPE& t);
20 ~transformStream() = default;
21 transformStream& operator+(const transform<TYPE>& t);
22 transformStream& operator+(const transformStream& ts);
23
24 template<typename T>
25 friend transformStream<T> operator+(const transform<T>& t1, const transform<T>& t2);
26 template<typename T>
27 friend transformStream<T> operator+(const transform<T>& t, const transformStream<T>& ots);
28 };
29
30 template<typename T>
31 transformStream<T> operator+(const transform<T>& t1, const transform<T>& t2);
32 template<typename T>
33 transformStream<T> operator+(const transform<T>& t, const transformStream<T>& ots);
34}
35
36 template<typename TYPE>
37 original::transformStream<TYPE>::transformStream() : stream() {}
38
39 template<typename TYPE>
40 auto original::transformStream<TYPE>::pushEnd(const transform<TYPE>& t) -> void
41 {
42 this->stream.pushEnd(std::shared_ptr<transform<TYPE>>(t.clone()));
43 }
44
45 template<typename TYPE>
46 void original::transformStream<TYPE>::operator()(TYPE& t) {
47 for (const auto& transform : this->stream) {
48 (*transform)(t);
49 }
50 }
51
52 template <typename TYPE>
53 auto original::transformStream<TYPE>::operator+(const transform<TYPE>& t) -> transformStream&
54 {
55 this->pushEnd(t);
56 return *this;
57 }
58
59 template <typename TYPE>
60 auto original::transformStream<TYPE>::operator+(const transformStream& ts) -> transformStream&
61 {
62 for (const auto& transform: ts.stream)
63 {
64 this->pushEnd(*transform->clone());
65 }
66 return *this;
67 }
68
69 template<typename TYPE>
70 auto original::operator+(const transform<TYPE>& t1, const transform<TYPE>& t2) -> transformStream<TYPE> {
72 ts + t1;
73 ts + t2;
74 return ts;
75 }
76
77 template <typename TYPE>
78 auto original::operator+(const transform<TYPE>& t, const transformStream<TYPE>& ots) -> transformStream<TYPE>
79 {
81 ts + t;
82 ts + ots;
83 return ts;
84 }
85
86#endif // TRANSFORMSTREAM_H
Definition chain.h:13
Definition transformStream.h:11
Definition transform.h:11