Skip to content

Commit 6a73d4d

Browse files
author
rafalh
committed
Conversion shortcut for std::vector of non-awaitable scalars
1 parent 3b4442b commit 6a73d4d

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
@@ -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

Comments
 (0)