@@ -1109,13 +1109,45 @@ struct ModifiedResult
11091109 co_await params.launch ;
11101110
11111111 auto awaitedResult = co_await std::move (result);
1112+ using vector_type = std::decay_t <decltype (awaitedResult)>;
1113+
1114+ // Shortcut for std::vector of non-awaitable scalars. No need to go async. Results are ready.
1115+ if constexpr (std::is_floating_point_v<typename vector_type::value_type>
1116+ || std::is_integral_v<typename vector_type::value_type >// also for bool
1117+ || std::is_same<std::string, typename vector_type::value_type>::value
1118+ || std::is_same<response::IdType, typename vector_type::value_type>::value)
1119+ {
1120+ ResolverResult document;
1121+ document.data .push_back (response::ValueToken::StartArray {});
1122+ document.data .push_back (response::ValueToken::Reserve { awaitedResult.size () });
1123+ if constexpr (std::is_same<bool , typename vector_type::value_type>::value)
1124+ {
1125+ for (auto r : awaitedResult)
1126+ document.data .append (response::ValueToken::BoolValue { std::move (r) });
1127+ }
1128+ else
1129+ {
1130+ for (auto & r : awaitedResult)
1131+ {
1132+ if constexpr (std::is_integral_v<typename vector_type::value_type>)
1133+ document.data .append (response::ValueToken::IntValue { std::move (r) });
1134+ else if constexpr (std::is_floating_point_v<typename vector_type::value_type>)
1135+ document.data .append (response::ValueToken::FloatValue { std::move (r) });
1136+ else if constexpr (std::is_same<response::IdType,
1137+ typename vector_type::value_type>::value)
1138+ document.data .append (response::ValueToken::IdValue { std::move (r) });
1139+ else document.data .append (response::ValueToken::StringValue { std::move (r) });
1140+ }
1141+ }
1142+ document.data .push_back (response::ValueToken::EndArray {});
1143+ co_return document;
1144+ }
11121145
11131146 children.reserve (awaitedResult.size ());
11141147 params.errorPath = std::make_optional (
11151148 field_path { parentPath ? std::make_optional (std::cref (*parentPath)) : std::nullopt ,
11161149 path_segment { std::size_t { 0 } } });
11171150
1118- using vector_type = std::decay_t <decltype (awaitedResult)>;
11191151
11201152 if constexpr (!std::is_same_v<std::decay_t <typename vector_type::reference>,
11211153 typename vector_type::value_type>)
0 commit comments