@@ -426,6 +426,14 @@ struct is_vector : std::false_type {};
426
426
427
427
template <typename T>
428
428
struct is_vector <std::vector<T>> : std::true_type {};
429
+
430
+ template <typename T>
431
+ struct is_optional : std::false_type {};
432
+
433
+ template <typename T>
434
+ struct is_optional <std::optional<T> > : std::true_type {};
435
+
436
+
429
437
// Field accessors may return either a result of T, an awaitable of T, or a std::future<T>, so at
430
438
// runtime the implementer may choose to return by value or defer/parallelize expensive operations
431
439
// by returning an async future or an awaitable coroutine.
@@ -434,18 +442,37 @@ class [[nodiscard]] AwaitableObject
434
442
{
435
443
public:
436
444
445
+
437
446
template <typename U>
438
447
AwaitableObject (U&& value, std::enable_if_t <std::is_assignable_v<T,U>>* = nullptr )
439
448
: _value { std::forward<U>(value) }
440
449
{
441
450
}
442
451
443
452
template <typename U>
444
- AwaitableObject (U&& value,std::enable_if_t <!std::is_assignable_v<T,U> && !is_vector<U>::value >* = nullptr )
453
+ AwaitableObject (U&& value,std::enable_if_t <!std::is_assignable_v<T,U> && !is_vector<U>::value && !is_optional<U>::value >* = nullptr )
445
454
: _value ( value?std::make_shared<typename T::element_type>(value): std::shared_ptr<typename T::element_type>())
446
455
{
447
456
}
448
457
458
+
459
+ template <typename U>
460
+ AwaitableObject (U&& value,std::enable_if_t <!std::is_assignable_v<T,U> && is_optional<U>::value && is_vector<typename U::value_type>::value >* = nullptr )
461
+ {
462
+ if (!value)
463
+ return ;
464
+ typename T::value_type vec;
465
+ for (auto v:*value){
466
+ if (v)
467
+ vec.push_back (std::make_shared<typename T::value_type::value_type::element_type>(v));
468
+ else
469
+ vec.push_back (std::shared_ptr<typename T::value_type::value_type::element_type>());
470
+ }
471
+ _value=std::move (vec);
472
+ }
473
+
474
+
475
+
449
476
template <typename U>
450
477
AwaitableObject (U&& value,std::enable_if_t <!std::is_assignable_v<T,U> && is_vector<U>::value >* = nullptr )
451
478
{
@@ -459,6 +486,7 @@ class [[nodiscard]] AwaitableObject
459
486
_value=std::move (vec);
460
487
}
461
488
489
+
462
490
struct promise_type
463
491
{
464
492
[[nodiscard]] AwaitableObject<T> get_return_object () noexcept
0 commit comments