Skip to content

Commit a4e3e0b

Browse files
gitmodimoRafał Hibner
authored andcommitted
Conversion shortcut for std::vector of non-awaitable scalars
1 parent ee64c8d commit a4e3e0b

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

include/graphqlservice/GraphQLService.h

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1116,13 +1116,45 @@ struct ModifiedResult
11161116
co_await params.launch;
11171117

11181118
auto awaitedResult = co_await std::move(result);
1119+
using vector_type = std::decay_t<decltype(awaitedResult)>;
1120+
1121+
// Shortcut for std::vector of non-awaitable scalars. No need to go async. Results are ready.
1122+
if constexpr (std::is_floating_point_v<typename vector_type::value_type>
1123+
|| std::is_integral_v<typename vector_type::value_type >//also for bool
1124+
|| std::is_same<std::string, typename vector_type::value_type>::value
1125+
|| std::is_same<response::IdType, typename vector_type::value_type>::value)
1126+
{
1127+
ResolverResult document;
1128+
document.data.push_back(response::ValueToken::StartArray {});
1129+
document.data.push_back(response::ValueToken::Reserve { awaitedResult.size() });
1130+
if constexpr (std::is_same<bool, typename vector_type::value_type>::value)
1131+
{
1132+
for (auto r : awaitedResult)
1133+
document.data.append(response::ValueToken::BoolValue { std::move(r) });
1134+
}
1135+
else
1136+
{
1137+
for (auto& r : awaitedResult)
1138+
{
1139+
if constexpr (std::is_integral_v<typename vector_type::value_type>)
1140+
document.data.append(response::ValueToken::IntValue { std::move(r) });
1141+
else if constexpr (std::is_floating_point_v<typename vector_type::value_type>)
1142+
document.data.append(response::ValueToken::FloatValue { std::move(r) });
1143+
else if constexpr (std::is_same<response::IdType,
1144+
typename vector_type::value_type>::value)
1145+
document.data.append(response::ValueToken::IdValue { std::move(r) });
1146+
else document.data.append(response::ValueToken::StringValue { std::move(r) });
1147+
}
1148+
}
1149+
document.data.push_back(response::ValueToken::EndArray {});
1150+
co_return document;
1151+
}
11191152

11201153
children.reserve(awaitedResult.size());
11211154
params.errorPath = std::make_optional(
11221155
field_path { parentPath ? std::make_optional(std::cref(*parentPath)) : std::nullopt,
11231156
path_segment { std::size_t { 0 } } });
11241157

1125-
using vector_type = std::decay_t<decltype(awaitedResult)>;
11261158

11271159
if constexpr (!std::is_same_v<std::decay_t<typename vector_type::reference>,
11281160
typename vector_type::value_type>)

0 commit comments

Comments
 (0)