@@ -1117,13 +1117,45 @@ struct ModifiedResult
1117
1117
co_await params.launch ;
1118
1118
1119
1119
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
+ }
1120
1153
1121
1154
children.reserve (awaitedResult.size ());
1122
1155
params.errorPath = std::make_optional (
1123
1156
field_path { parentPath ? std::make_optional (std::cref (*parentPath)) : std::nullopt,
1124
1157
path_segment { std::size_t { 0 } } });
1125
1158
1126
- using vector_type = std::decay_t <decltype (awaitedResult)>;
1127
1159
1128
1160
if constexpr (!std::is_same_v<std::decay_t <typename vector_type::reference>,
1129
1161
typename vector_type::value_type>)
0 commit comments