return Composed(std::move(left.self()), std::move(right.self()));
}
-template<class Value,
- class Source,
- class Yield = detail::Yield<Value, Source>>
-Yield operator+(const detail::GeneratorBuilder<Value>&,
- Source&& source) {
- return Yield(std::forward<Source>(source));
-}
-
/**
* GenImpl - Core abstraction of a generator, an object which produces values by
* passing them to a given handler lambda. All generator implementations must
!std::is_const<Value>::value, "Value mustn't be const or ref.");
Value bounds_[endless ? 1 : 2];
public:
- explicit Sequence(const Value& begin)
- : bounds_{begin} {
+ explicit Sequence(Value begin)
+ : bounds_{std::move(begin)} {
static_assert(endless, "Must supply 'end'");
}
- explicit Sequence(const Value& begin, const Value& end)
- : bounds_{begin, end} {}
+ Sequence(Value begin,
+ Value end)
+ : bounds_{std::move(begin), std::move(end)} {}
template<class Handler>
bool apply(Handler&& handler) const {
}
};
+/**
+ * GenratorBuilder - Helper for GENERTATOR macro.
+ **/
+template<class Value>
+struct GeneratorBuilder {
+ template<class Source,
+ class Yield = detail::Yield<Value, Source>>
+ Yield operator+(Source&& source) {
+ return Yield(std::forward<Source>(source));
+ }
+};
+
/**
* Yield - For producing values from a user-defined generator by way of a
* 'yield' function.
class Map : public Operator<Map<Predicate>> {
Predicate pred_;
public:
- explicit Map(const Predicate& pred = Predicate())
- : pred_(pred)
+ Map() {}
+
+ explicit Map(Predicate pred)
+ : pred_(std::move(pred))
{ }
template<class Value,
class Filter : public Operator<Filter<Predicate>> {
Predicate pred_;
public:
- explicit Filter(const Predicate& pred = Predicate())
- : pred_(pred)
+ Filter() {}
+ explicit Filter(Predicate pred)
+ : pred_(std::move(pred))
{ }
template<class Value,
class Until : public Operator<Until<Predicate>> {
Predicate pred_;
public:
- explicit Until(const Predicate& pred = Predicate())
- : pred_(pred)
- { }
+ Until() {}
+ explicit Until(Predicate pred)
+ : pred_(std::move(pred))
+ {}
template<class Value,
class Source,
Selector selector_;
Comparer comparer_;
public:
- explicit Order(const Selector& selector = Selector(),
- const Comparer& comparer = Comparer())
- : selector_(selector) , comparer_(comparer) {}
+ Order() {}
+
+ explicit Order(Selector selector)
+ : selector_(std::move(selector))
+ {}
+
+ Order(Selector selector,
+ Comparer comparer)
+ : selector_(std::move(selector))
+ , comparer_(std::move(comparer))
+ {}
template<class Value,
class Source,
Seed seed_;
Fold fold_;
public:
- FoldLeft(const Seed& seed, const Fold& fold)
- : seed_(seed)
- , fold_(fold)
+ FoldLeft() {}
+ FoldLeft(Seed seed,
+ Fold fold)
+ : seed_(std::move(seed))
+ , fold_(std::move(fold))
{}
template<class Source,
class All : public Operator<All<Predicate>> {
Predicate pred_;
public:
- explicit All(const Predicate& pred = Predicate())
- : pred_(pred)
+ All() {}
+ explicit All(Predicate pred)
+ : pred_(std::move(pred))
{ }
template<class Source,
class Reduce : public Operator<Reduce<Reducer>> {
Reducer reducer_;
public:
- explicit Reduce(const Reducer& reducer)
- : reducer_(reducer)
+ Reduce() {}
+ explicit Reduce(Reducer reducer)
+ : reducer_(std::move(reducer))
{}
template<class Source,
Selector selector_;
Comparer comparer_;
public:
- explicit Min(const Selector& selector = Selector(),
- const Comparer& comparer = Comparer())
- : selector_(selector)
- , comparer_(comparer)
+ Min() {}
+
+ explicit Min(Selector selector)
+ : selector_(std::move(selector))
+ {}
+
+ Min(Selector selector,
+ Comparer comparer)
+ : selector_(std::move(selector))
+ , comparer_(std::move(comparer))
{}
template<class Value,