// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. #pragma once /*! \file rx-repeat.hpp \brief Repeat this observable for the given number of times or infinitely. \tparam Count the type of the counter (optional). \param t The number of times the source observable items are repeated (optional). If not specified, infinitely repeats the source observable. Specifying 0 returns an empty sequence immediately \return An observable that repeats the sequence of items emitted by the source observable for t times. \sample \snippet repeat.cpp repeat count sample \snippet output.txt repeat count sample If the source observable calls on_error, repeat stops: \snippet repeat.cpp repeat error sample \snippet output.txt repeat error sample */ #if !defined(RXCPP_OPERATORS_RX_REPEAT_HPP) #define RXCPP_OPERATORS_RX_REPEAT_HPP #include "../rx-includes.hpp" #include "rx-retry-repeat-common.hpp" namespace rxcpp { namespace operators { namespace detail { template struct repeat_invalid_arguments {}; template struct repeat_invalid : public rxo::operator_base> { using type = observable, repeat_invalid>; }; template using repeat_invalid_t = typename repeat_invalid::type; // Contain repeat variations in a namespace namespace repeat { struct event_handlers { template static inline void on_error(State& state, rxu::error_ptr& e) { state->out.on_error(e); } template static inline void on_completed(State& state) { // Functions update() and completed_predicate() vary between finite and infinte versions state->update(); if (state->completed_predicate()) { state->out.on_completed(); } else { state->do_subscribe(); } } }; // Finite repeat case (explicitely limited with the number of times) template using finite = ::rxcpp::operators::detail::retry_repeat_common::finite ; // Infinite repeat case template using infinite = ::rxcpp::operators::detail::retry_repeat_common::infinite ; } } // detail /*! @copydoc rx-repeat.hpp */ template auto repeat(AN&&... an) -> operator_factory { return operator_factory(std::make_tuple(std::forward(an)...)); } } template<> struct member_overload { template>, class SourceValue = rxu::value_type_t, class Repeat = rxo::detail::repeat::infinite>, class Value = rxu::value_type_t, class Result = observable> static Result member(Observable&& o) { return Result(Repeat(std::forward(o))); } template>, class SourceValue = rxu::value_type_t, class Repeat = rxo::detail::repeat::finite, rxu::decay_t>, class Value = rxu::value_type_t, class Result = observable> static Result member(Observable&& o, Count&& c) { return Result(Repeat(std::forward(o), std::forward(c))); } template static operators::detail::repeat_invalid_t member(AN...) { std::terminate(); return {}; static_assert(sizeof...(AN) == 10000, "repeat takes (optional Count)"); } }; } #endif