123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // Example program showing signals with custom combiners.
- //
- // Copyright Douglas Gregor 2001-2004.
- // Copyright Frank Mori Hess 2009.
- //
- // Use, modification and
- // distribution is subject to the Boost Software License, Version
- // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- // For more information, see http://www.boost.org
- #include <iostream>
- #include <boost/signals2/signal.hpp>
- #include <vector>
- float product(float x, float y) { return x * y; }
- float quotient(float x, float y) { return x / y; }
- float sum(float x, float y) { return x + y; }
- float difference(float x, float y) { return x - y; }
- //[ custom_combiners_maximum_def_code_snippet
- // combiner which returns the maximum value returned by all slots
- template<typename T>
- struct maximum
- {
- typedef T result_type;
- template<typename InputIterator>
- T operator()(InputIterator first, InputIterator last) const
- {
- // If there are no slots to call, just return the
- // default-constructed value
- if(first == last ) return T();
- T max_value = *first++;
- while (first != last) {
- if (max_value < *first)
- max_value = *first;
- ++first;
- }
- return max_value;
- }
- };
- //]
- void maximum_combiner_example()
- {
- // signal which uses our custom "maximum" combiner
- boost::signals2::signal<float (float x, float y), maximum<float> > sig;
- //[ custom_combiners_maximum_usage_code_snippet
- sig.connect(&product);
- sig.connect("ient);
- sig.connect(&sum);
- sig.connect(&difference);
- // Outputs the maximum value returned by the connected slots, in this case
- // 15 from the product function.
- std::cout << "maximum: " << sig(5, 3) << std::endl;
- //]
- }
- //[ custom_combiners_aggregate_values_def_code_snippet
- // aggregate_values is a combiner which places all the values returned
- // from slots into a container
- template<typename Container>
- struct aggregate_values
- {
- typedef Container result_type;
- template<typename InputIterator>
- Container operator()(InputIterator first, InputIterator last) const
- {
- Container values;
- while(first != last) {
- values.push_back(*first);
- ++first;
- }
- return values;
- }
- };
- //]
- void aggregate_values_example()
- {
- // signal which uses aggregate_values as its combiner
- boost::signals2::signal<float (float, float),
- aggregate_values<std::vector<float> > > sig;
- //[ custom_combiners_aggregate_values_usage_code_snippet
- sig.connect("ient);
- sig.connect(&product);
- sig.connect(&sum);
- sig.connect(&difference);
- std::vector<float> results = sig(5, 3);
- std::cout << "aggregate values: ";
- std::copy(results.begin(), results.end(),
- std::ostream_iterator<float>(std::cout, " "));
- std::cout << "\n";
- //]
- }
- int main()
- {
- maximum_combiner_example();
- aggregate_values_example();
- }
|