Skip to content

Commit 5808034

Browse files
author
rafalh
committed
Conversion shortcut for std::vector of non-awaitable scalars
1 parent 6376bc1 commit 5808034

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

include/graphqlservice/GraphQLService.h

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1109,13 +1109,40 @@ 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+
1124+
for (auto& r : awaitedResult)
1125+
{
1126+
if constexpr (std::is_same<bool, typename vector_type::value_type>::value)
1127+
document.data.append(response::ValueToken::BoolValue { r });
1128+
else if constexpr (std::is_integral_v<typename vector_type::value_type>)
1129+
document.data.append(response::ValueToken::IntValue { std::move(r) });
1130+
else if constexpr (std::is_floating_point_v<typename vector_type::value_type>)
1131+
document.data.append(response::ValueToken::FloatValue { std::move(r) });
1132+
else if constexpr (std::is_same<response::IdType,typename vector_type::value_type>::value)
1133+
document.data.append(response::ValueToken::IdValue { std::move(r) });
1134+
else
1135+
document.data.append(response::ValueToken::StringValue { std::move(r) });
1136+
}
1137+
document.data.push_back(response::ValueToken::EndArray {});
1138+
co_return document;
1139+
}
11121140

11131141
children.reserve(awaitedResult.size());
11141142
params.errorPath = std::make_optional(
11151143
field_path { parentPath ? std::make_optional(std::cref(*parentPath)) : std::nullopt,
11161144
path_segment { std::size_t { 0 } } });
11171145

1118-
using vector_type = std::decay_t<decltype(awaitedResult)>;
11191146

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

0 commit comments

Comments
 (0)