@@ -1117,13 +1117,45 @@ struct ModifiedResult
11171117 co_await params.launch ;
11181118
11191119 auto awaitedResult = co_await std::move (result);
1120+ using vector_type = std::decay_t <decltype (awaitedResult)>;
1121+
1122+ // Shortcut for std::vector of non-awaitable scalars. No need to go async. Results are ready.
1123+ if constexpr (std::is_floating_point_v<typename vector_type::value_type>
1124+ || std::is_integral_v<typename vector_type::value_type >// also for bool
1125+ || std::is_same<std::string, typename vector_type::value_type>::value
1126+ || std::is_same<response::IdType, typename vector_type::value_type>::value)
1127+ {
1128+ ResolverResult document;
1129+ document.data .push_back (response::ValueToken::StartArray {});
1130+ document.data .push_back (response::ValueToken::Reserve { awaitedResult.size () });
1131+ if constexpr (std::is_same<bool , typename vector_type::value_type>::value)
1132+ {
1133+ for (auto r : awaitedResult)
1134+ document.data .append (response::ValueToken::BoolValue { std::move (r) });
1135+ }
1136+ else
1137+ {
1138+ for (auto & r : awaitedResult)
1139+ {
1140+ if constexpr (std::is_integral_v<typename vector_type::value_type>)
1141+ document.data .append (response::ValueToken::IntValue { std::move (r) });
1142+ else if constexpr (std::is_floating_point_v<typename vector_type::value_type>)
1143+ document.data .append (response::ValueToken::FloatValue { std::move (r) });
1144+ else if constexpr (std::is_same<response::IdType,
1145+ typename vector_type::value_type>::value)
1146+ document.data .append (response::ValueToken::IdValue { std::move (r) });
1147+ else document.data .append (response::ValueToken::StringValue { std::move (r) });
1148+ }
1149+ }
1150+ document.data .push_back (response::ValueToken::EndArray {});
1151+ co_return document;
1152+ }
11201153
11211154 children.reserve (awaitedResult.size ());
11221155 params.errorPath = std::make_optional (
11231156 field_path { parentPath ? std::make_optional (std::cref (*parentPath)) : std::nullopt ,
11241157 path_segment { std::size_t { 0 } } });
11251158
1126- using vector_type = std::decay_t <decltype (awaitedResult)>;
11271159
11281160 if constexpr (!std::is_same_v<std::decay_t <typename vector_type::reference>,
11291161 typename vector_type::value_type>)
0 commit comments