Skip to content

Commit 8f048c3

Browse files
gitmodimoRafał Hibner
authored andcommitted
Conversion shortcut for std::vector of non-awaitable scalars
1 parent 4ac5a43 commit 8f048c3

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

Comments
 (0)