diff --git a/headers/promise.hpp/promise.hpp b/headers/promise.hpp/promise.hpp index abd6502..cfa51d8 100644 --- a/headers/promise.hpp/promise.hpp +++ b/headers/promise.hpp/promise.hpp @@ -1111,7 +1111,7 @@ namespace promise_hpp } template < typename Iter - , typename SubPromise = typename Iter::value_type + , typename SubPromise = typename std::iterator_traits::value_type , typename SubPromiseResult = typename SubPromise::value_type , typename ResultPromiseValueType = std::vector > promise @@ -1149,9 +1149,10 @@ namespace promise_hpp // template < typename Iter - , typename SubPromise = typename Iter::value_type + , typename SubPromise = typename std::iterator_traits::value_type , typename SubPromiseResult = typename SubPromise::value_type > - auto make_race_promise(Iter begin, Iter end) { + promise + make_race_promise(Iter begin, Iter end) { if ( begin == end ) { throw std::logic_error("at least one input promise must be provided for make_race_promise"); } diff --git a/untests/promise_tests.cpp b/untests/promise_tests.cpp index 8511d6a..0b38f0c 100644 --- a/untests/promise_tests.cpp +++ b/untests/promise_tests.cpp @@ -7,6 +7,7 @@ #define CATCH_CONFIG_FAST_COMPILE #include +#include #include #include #include @@ -693,6 +694,22 @@ TEST_CASE("promise") { REQUIRE(call_then_only_once == 1); } + { + auto p1 = pr::promise(); + auto p2 = pr::promise(); + + int call_then_only_once = 0; + pr::make_all_promise(std::array, 2>{p1, p2}) + .then([&call_then_only_once](const std::vector& c){ + (void)c; + ++call_then_only_once; + }); + + p1.resolve(1); + p2.resolve(2); + + REQUIRE(call_then_only_once == 1); + } { class o_t { public: @@ -749,6 +766,26 @@ TEST_CASE("promise") { REQUIRE(check_42_int == 42); REQUIRE(call_then_only_once == 1); } + { + auto p1 = pr::promise(); + auto p2 = pr::promise(); + + int check_42_int = 0; + int call_then_only_once = 0; + pr::make_race_promise(std::array,2>{p1, p2}) + .then([&check_42_int, &call_then_only_once](const int& v){ + check_42_int = v; + ++call_then_only_once; + }); + + p2.resolve(42); + REQUIRE(check_42_int == 42); + REQUIRE(call_then_only_once == 1); + + p1.resolve(84); + REQUIRE(check_42_int == 42); + REQUIRE(call_then_only_once == 1); + } { class o_t { public: