• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2 
3 #pragma once
4 
5 #if !defined(RXCPP_SOURCES_RX_CREATE_HPP)
6 #define RXCPP_SOURCES_RX_CREATE_HPP
7 
8 #include "../rx-includes.hpp"
9 
10 /*! \file rx-create.hpp
11 
12     \brief Returns an observable that executes the specified function when a subscriber subscribes to it.
13 
14     \tparam T  the type of the items that this observable emits
15     \tparam OnSubscribe  the type of OnSubscribe handler function
16 
17     \param  os  OnSubscribe event handler
18 
19     \return  Observable that executes the specified function when a Subscriber subscribes to it.
20 
21     \sample
22     \snippet create.cpp Create sample
23     \snippet output.txt Create sample
24 
25     \warning
26     It is good practice to check the observer's is_subscribed state from within the function you pass to create
27     so that your observable can stop emitting items or doing expensive calculations when there is no longer an interested observer.
28 
29     \badcode
30     \snippet create.cpp Create bad code
31     \snippet output.txt Create bad code
32 
33     \goodcode
34     \snippet create.cpp Create good code
35     \snippet output.txt Create good code
36 
37     \warning
38     It is good practice to use operators like observable::take to control lifetime rather than use the subscription explicitly.
39 
40     \goodcode
41     \snippet create.cpp Create great code
42     \snippet output.txt Create great code
43 */
44 
45 namespace rxcpp {
46 
47 namespace sources {
48 
49 namespace detail {
50 
51 template<class T, class OnSubscribe>
52 struct create : public source_base<T>
53 {
54     typedef create<T, OnSubscribe> this_type;
55 
56     typedef rxu::decay_t<OnSubscribe> on_subscribe_type;
57 
58     on_subscribe_type on_subscribe_function;
59 
createrxcpp::sources::detail::create60     create(on_subscribe_type os)
61         : on_subscribe_function(std::move(os))
62     {
63     }
64 
65     template<class Subscriber>
on_subscriberxcpp::sources::detail::create66     void on_subscribe(Subscriber o) const {
67 
68         on_exception(
69             [&](){
70                 this->on_subscribe_function(o);
71                 return true;
72             },
73             o);
74     }
75 };
76 
77 }
78 
79 /*! @copydoc rx-create.hpp
80     */
81 template<class T, class OnSubscribe>
create(OnSubscribe os)82 auto create(OnSubscribe os)
83     ->      observable<T,   detail::create<T, OnSubscribe>> {
84     return  observable<T,   detail::create<T, OnSubscribe>>(
85                             detail::create<T, OnSubscribe>(std::move(os)));
86 }
87 
88 }
89 
90 }
91 
92 #endif
93