|
|
@@ -101,40 +101,25 @@ namespace stream {
|
|
|
class stream_base_pointer_impl {};
|
|
|
|
|
|
template <typename T>
|
|
|
- class stream_base_pointer_impl<T, typename std::enable_if<detail::is_dereferencable<typename std::remove_reference<T>::type>::value>::type> {
|
|
|
+ class stream_base_pointer_impl<T, typename std::enable_if<traits::is_dereferencable<T>::value>::type> {
|
|
|
private:
|
|
|
- using self = stream_base<T>;
|
|
|
- using noref = typename std::remove_reference<T>::type;
|
|
|
- using element_type = typename std::pointer_traits<noref>::element_type;
|
|
|
+ using self_t = stream_base<T>;
|
|
|
+ using pointer = typename std::remove_reference<T>::type;
|
|
|
+ using element_type = typename std::pointer_traits<pointer>::element_type;
|
|
|
public:
|
|
|
auto deref() const & -> stream_base<element_type &> {
|
|
|
- return static_cast<stream_base<T> const *>(this)->map([](T const & p) -> element_type & { return *p; });
|
|
|
+ return static_cast<self_t const *>(this)->map([](T const & p) -> element_type & { return *p; });
|
|
|
}
|
|
|
|
|
|
auto deref() && -> stream_base<element_type &> {
|
|
|
- return static_cast<stream_base<T> &&>(*this).map([](T const & p) -> element_type & { return *p; });
|
|
|
+ return static_cast<self_t &&>(*this).map([](T const & p) -> element_type & { return *p; });
|
|
|
}
|
|
|
};
|
|
|
|
|
|
template <typename T>
|
|
|
class stream_base : public stream_base_pointer_impl<T> {
|
|
|
private:
|
|
|
- template <typename F>
|
|
|
- using map_f = decltype(std::declval<F>()(std::declval<T>()));
|
|
|
- template <typename F>
|
|
|
- using flatmap_f = typename decltype(std::declval<F>()(std::declval<T>()))::value_type;
|
|
|
- template <typename F>
|
|
|
- using memvar_f = typename map_member_object<F>::type;
|
|
|
- template <typename F>
|
|
|
- using memfun_f = typename map_member_function<F>::type;
|
|
|
- template <typename F>
|
|
|
- using is_memvar = std::is_member_object_pointer<F>;
|
|
|
- template <typename F>
|
|
|
- using is_memfun = std::is_member_function_pointer<F>;
|
|
|
-
|
|
|
- using self = stream_base<T>;
|
|
|
- using noref = typename std::remove_reference<T>::type;
|
|
|
- using clean = typename std::decay<T>::type;
|
|
|
+ using value_type = typename std::decay<T>::type;
|
|
|
public:
|
|
|
template <typename Stream>
|
|
|
stream_base(std::shared_ptr<Stream> && impl) {
|
|
|
@@ -148,24 +133,24 @@ namespace stream {
|
|
|
|
|
|
bool empty() const { return begin() == end(); }
|
|
|
|
|
|
- std::vector<clean> collect() const {
|
|
|
- std::vector<clean> coll;
|
|
|
+ std::vector<value_type> collect() const {
|
|
|
+ std::vector<value_type> coll;
|
|
|
collect(coll);
|
|
|
return coll;
|
|
|
}
|
|
|
|
|
|
template <typename C, typename = typename std::enable_if<!std::is_void<typename C::value_type>::value, void>::type>
|
|
|
- C& collect(C & coll) const {
|
|
|
+ C & collect(C & coll) const {
|
|
|
std::copy(begin(), end(), std::inserter(coll, coll.end()));
|
|
|
return coll;
|
|
|
}
|
|
|
|
|
|
template <typename F>
|
|
|
- clean accumulate(F&& fold, clean const& accum) const {
|
|
|
+ value_type accumulate(F&& fold, value_type const& accum) const {
|
|
|
return std::accumulate(begin(), end(), accum, fold);
|
|
|
}
|
|
|
|
|
|
- clean accumulate(clean const& accum) const {
|
|
|
+ value_type accumulate(value_type const& accum) const {
|
|
|
return std::accumulate(begin(), end(), accum);
|
|
|
}
|
|
|
|
|
|
@@ -175,46 +160,46 @@ namespace stream {
|
|
|
}
|
|
|
|
|
|
template <typename F>
|
|
|
- stream_base<map_f<F>> map(F&& func) const &;
|
|
|
+ stream_base<traits::mapped_t<T, F>> map(F&& func) const &;
|
|
|
template <typename F>
|
|
|
stream_base<T> filter(F&& func) const &;
|
|
|
template <typename F>
|
|
|
- stream_base<flatmap_f<F>> flatmap(F&& func) const &;
|
|
|
+ stream_base<traits::fmapped_t<T, F>> flatmap(F&& func) const &;
|
|
|
|
|
|
template <typename F>
|
|
|
- stream_base<map_f<F>> map(F&& func) &&;
|
|
|
+ stream_base<traits::mapped_t<T, F>> map(F&& func) &&;
|
|
|
template <typename F>
|
|
|
stream_base<T> filter(F&& func) &&;
|
|
|
template <typename F>
|
|
|
- stream_base<flatmap_f<F>> flatmap(F&& func) &&;
|
|
|
+ stream_base<traits::fmapped_t<T, F>> flatmap(F&& func) &&;
|
|
|
|
|
|
template <typename Cast>
|
|
|
- auto cast() const & -> stream_base<Cast const &> {
|
|
|
+ stream_base<Cast const &> cast() const & {
|
|
|
return map([](T const & p) -> Cast const & { return p; });
|
|
|
}
|
|
|
|
|
|
template <typename Cast>
|
|
|
- auto cast() && -> stream_base<Cast const &> {
|
|
|
+ stream_base<Cast const &> cast() && {
|
|
|
return std::move(*this).map([](T const & p) -> Cast const & { return p; });
|
|
|
}
|
|
|
|
|
|
- template <typename F, typename = typename std::enable_if<is_memvar<F>::value>::type>
|
|
|
- auto map(F && memvar) const & -> stream_base<memvar_f<F>> {
|
|
|
+ template <typename F, typename = traits::is_memvar_t<F>>
|
|
|
+ stream_base<traits::memvar_f<F>> map(F && memvar) const & {
|
|
|
return map(map_member_object<F>{memvar});
|
|
|
}
|
|
|
|
|
|
- template <typename F, typename = typename std::enable_if<is_memfun<F>::value>::type>
|
|
|
- auto map(F && memvar) const & -> stream_base<memfun_f<F>> {
|
|
|
+ template <typename F, typename = traits::is_memfun_t<F>>
|
|
|
+ stream_base<traits::memfun_f<F>> map(F && memvar) const & {
|
|
|
return map(map_member_function<F>{memvar});
|
|
|
}
|
|
|
|
|
|
- template <typename F, typename = typename std::enable_if<is_memvar<F>::value>::type>
|
|
|
- auto map(F && memvar) && -> stream_base<memvar_f<F>> {
|
|
|
+ template <typename F, typename = traits::is_memvar_t<F>>
|
|
|
+ stream_base<traits::memvar_f<F>> map(F && memvar) && {
|
|
|
return std::move(*this).map(map_member_object<F>{memvar});
|
|
|
}
|
|
|
|
|
|
- template <typename F, typename = typename std::enable_if<is_memfun<F>::value>::type>
|
|
|
- auto map(F && memvar) && -> stream_base<memfun_f<F>> {
|
|
|
+ template <typename F, typename = traits::is_memfun_t<F>>
|
|
|
+ stream_base<traits::memfun_f<F>> map(F && memvar) && {
|
|
|
return std::move(*this).map(map_member_function<F>{memvar});
|
|
|
}
|
|
|
private:
|