Skip to content

Commit 6a29286

Browse files
committed
Pass ResolverParams by r-value reference instead of value
1 parent 4b81b96 commit 6a29286

File tree

10 files changed

+80
-59
lines changed

10 files changed

+80
-59
lines changed

include/graphqlservice/GraphQLService.h

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,7 @@ struct Result
897897
AwaitableObject<std::shared_ptr<const Object>>, AwaitableScalar<Type>>;
898898

899899
// Convert a single value of the specified type to JSON.
900-
[[nodiscard]] static AwaitableResolver convert(future_type result, ResolverParams params);
900+
[[nodiscard]] static AwaitableResolver convert(future_type result, ResolverParams&& params);
901901

902902
// Validate a single scalar value is the expected type.
903903
static void validateScalar(const response::Value& value);
@@ -907,25 +907,25 @@ struct Result
907907
// Export all of the built-in converters
908908
template <>
909909
GRAPHQLSERVICE_EXPORT AwaitableResolver Result<int>::convert(
910-
AwaitableScalar<int> result, ResolverParams params);
910+
AwaitableScalar<int> result, ResolverParams&& params);
911911
template <>
912912
GRAPHQLSERVICE_EXPORT AwaitableResolver Result<double>::convert(
913-
AwaitableScalar<double> result, ResolverParams params);
913+
AwaitableScalar<double> result, ResolverParams&& params);
914914
template <>
915915
GRAPHQLSERVICE_EXPORT AwaitableResolver Result<std::string>::convert(
916-
AwaitableScalar<std::string> result, ResolverParams params);
916+
AwaitableScalar<std::string> result, ResolverParams&& params);
917917
template <>
918918
GRAPHQLSERVICE_EXPORT AwaitableResolver Result<bool>::convert(
919-
AwaitableScalar<bool> result, ResolverParams params);
919+
AwaitableScalar<bool> result, ResolverParams&& params);
920920
template <>
921921
GRAPHQLSERVICE_EXPORT AwaitableResolver Result<response::IdType>::convert(
922-
AwaitableScalar<response::IdType> result, ResolverParams params);
922+
AwaitableScalar<response::IdType> result, ResolverParams&& params);
923923
template <>
924924
GRAPHQLSERVICE_EXPORT AwaitableResolver Result<response::Value>::convert(
925-
AwaitableScalar<response::Value> result, ResolverParams params);
925+
AwaitableScalar<response::Value> result, ResolverParams&& params);
926926
template <>
927927
GRAPHQLSERVICE_EXPORT AwaitableResolver Result<Object>::convert(
928-
AwaitableObject<std::shared_ptr<const Object>> result, ResolverParams params);
928+
AwaitableObject<std::shared_ptr<const Object>> result, ResolverParams&& params);
929929

930930
// Export all of the scalar value validation methods
931931
template <>
@@ -1010,7 +1010,7 @@ struct ModifiedResult
10101010
// Peel off the none modifier. If it's included, it should always be last in the list.
10111011
template <TypeModifier Modifier = TypeModifier::None, TypeModifier... Other>
10121012
[[nodiscard]] static AwaitableResolver convert(
1013-
AwaitableObject<typename ResultTraits<Type>::type> result, ResolverParams params)
1013+
AwaitableObject<typename ResultTraits<Type>::type> result, ResolverParams&& paramsArg)
10141014
requires NoneObjectDerivedType<Type, Modifier>
10151015
{
10161016
// Call through to the Object specialization with a static_pointer_cast for subclasses of
@@ -1019,6 +1019,9 @@ struct ModifiedResult
10191019
static_assert(std::is_same_v<std::shared_ptr<Type>, typename ResultTraits<Type>::type>,
10201020
"this is the derived object type");
10211021

1022+
// Move the paramsArg into a local variable before the first suspension point.
1023+
auto params = std::move(paramsArg);
1024+
10221025
co_await params.launch;
10231026

10241027
auto awaitedResult = co_await Result<Object>::convert(
@@ -1031,7 +1034,7 @@ struct ModifiedResult
10311034
// Peel off the none modifier. If it's included, it should always be last in the list.
10321035
template <TypeModifier Modifier = TypeModifier::None, TypeModifier... Other>
10331036
[[nodiscard]] static AwaitableResolver convert(
1034-
typename ResultTraits<Type>::future_type result, ResolverParams params)
1037+
typename ResultTraits<Type>::future_type result, ResolverParams&& params)
10351038
requires NoneScalarOrObjectType<Type, Modifier>
10361039
{
10371040
static_assert(sizeof...(Other) == 0, "None modifier should always be last");
@@ -1043,9 +1046,13 @@ struct ModifiedResult
10431046
// Peel off final nullable modifiers for std::shared_ptr of Object and subclasses of Object.
10441047
template <TypeModifier Modifier, TypeModifier... Other>
10451048
[[nodiscard]] static AwaitableResolver convert(
1046-
typename ResultTraits<Type, Modifier, Other...>::future_type result, ResolverParams params)
1049+
typename ResultTraits<Type, Modifier, Other...>::future_type result,
1050+
ResolverParams&& paramsArg)
10471051
requires NullableResultSharedPtr<Type, Modifier, Other...>
10481052
{
1053+
// Move the paramsArg into a local variable before the first suspension point.
1054+
auto params = std::move(paramsArg);
1055+
10491056
co_await params.launch;
10501057

10511058
auto awaitedResult = co_await std::move(result);
@@ -1064,7 +1071,8 @@ struct ModifiedResult
10641071
// Peel off nullable modifiers for anything else, which should all be std::optional.
10651072
template <TypeModifier Modifier, TypeModifier... Other>
10661073
[[nodiscard]] static AwaitableResolver convert(
1067-
typename ResultTraits<Type, Modifier, Other...>::future_type result, ResolverParams params)
1074+
typename ResultTraits<Type, Modifier, Other...>::future_type result,
1075+
ResolverParams&& paramsArg)
10681076
requires NullableResultOptional<Type, Modifier, Other...>
10691077
{
10701078
static_assert(std::is_same_v<std::optional<typename ResultTraits<Type, Other...>::type>,
@@ -1083,6 +1091,9 @@ struct ModifiedResult
10831091
}
10841092
}
10851093

1094+
// Move the paramsArg into a local variable before the first suspension point.
1095+
auto params = std::move(paramsArg);
1096+
10861097
co_await params.launch;
10871098

10881099
auto awaitedResult = co_await std::move(result);
@@ -1101,7 +1112,8 @@ struct ModifiedResult
11011112
// Peel off list modifiers.
11021113
template <TypeModifier Modifier, TypeModifier... Other>
11031114
[[nodiscard]] static AwaitableResolver convert(
1104-
typename ResultTraits<Type, Modifier, Other...>::future_type result, ResolverParams params)
1115+
typename ResultTraits<Type, Modifier, Other...>::future_type result,
1116+
ResolverParams&& paramsArg)
11051117
requires ListModifier<Modifier>
11061118
{
11071119
if constexpr (!ObjectBaseType<Type>)
@@ -1116,6 +1128,9 @@ struct ModifiedResult
11161128
}
11171129
}
11181130

1131+
// Move the paramsArg into a local variable before the first suspension point.
1132+
auto params = std::move(paramsArg);
1133+
11191134
std::vector<AwaitableResolver> children;
11201135
const auto parentPath = params.errorPath;
11211136

@@ -1242,7 +1257,7 @@ struct ModifiedResult
12421257
std::function<response::Value(typename ResultTraits<Type>::type, const ResolverParams&)>;
12431258

12441259
[[nodiscard]] static AwaitableResolver resolve(typename ResultTraits<Type>::future_type result,
1245-
ResolverParams params, ResolverCallback&& resolver)
1260+
ResolverParams&& paramsArg, ResolverCallback&& resolver)
12461261
{
12471262
static_assert(!ObjectBaseType<Type>, "ModfiedResult<Object> needs special handling");
12481263

@@ -1257,6 +1272,9 @@ struct ModifiedResult
12571272
auto pendingResolver = std::move(resolver);
12581273
ResolverResult document;
12591274

1275+
// Move the paramsArg into a local variable before the first suspension point.
1276+
auto params = std::move(paramsArg);
1277+
12601278
try
12611279
{
12621280
co_await params.launch;

include/graphqlservice/introspection/IntrospectionSchema.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ GRAPHQLSERVICE_EXPORT introspection::TypeKind Argument<introspection::TypeKind>:
181181
const response::Value& value);
182182
template <>
183183
GRAPHQLSERVICE_EXPORT AwaitableResolver Result<introspection::TypeKind>::convert(
184-
AwaitableScalar<introspection::TypeKind> result, ResolverParams params);
184+
AwaitableScalar<introspection::TypeKind> result, ResolverParams&& params);
185185
template <>
186186
GRAPHQLSERVICE_EXPORT void Result<introspection::TypeKind>::validateScalar(
187187
const response::Value& value);
@@ -190,7 +190,7 @@ GRAPHQLSERVICE_EXPORT introspection::DirectiveLocation Argument<introspection::D
190190
const response::Value& value);
191191
template <>
192192
GRAPHQLSERVICE_EXPORT AwaitableResolver Result<introspection::DirectiveLocation>::convert(
193-
AwaitableScalar<introspection::DirectiveLocation> result, ResolverParams params);
193+
AwaitableScalar<introspection::DirectiveLocation> result, ResolverParams&& params);
194194
template <>
195195
GRAPHQLSERVICE_EXPORT void Result<introspection::DirectiveLocation>::validateScalar(
196196
const response::Value& value);

samples/learn/schema/StarWarsSchema.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,16 @@ learn::Episode Argument<learn::Episode>::convert(const response::Value& value)
4848
}
4949

5050
template <>
51-
service::AwaitableResolver Result<learn::Episode>::convert(service::AwaitableScalar<learn::Episode> result, ResolverParams params)
51+
service::AwaitableResolver Result<learn::Episode>::convert(service::AwaitableScalar<learn::Episode> result, ResolverParams&& params)
5252
{
5353
return ModifiedResult<learn::Episode>::resolve(std::move(result), std::move(params),
5454
[](learn::Episode value, const ResolverParams&)
5555
{
56-
response::Value result(response::Type::EnumValue);
56+
response::Value resolvedResult(response::Type::EnumValue);
5757

58-
result.set<std::string>(std::string { s_namesEpisode[static_cast<size_t>(value)] });
58+
resolvedResult.set<std::string>(std::string { s_namesEpisode[static_cast<size_t>(value)] });
5959

60-
return result;
60+
return resolvedResult;
6161
});
6262
}
6363

samples/today/nointrospection/TodaySchema.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@ today::TaskState Argument<today::TaskState>::convert(const response::Value& valu
4949
}
5050

5151
template <>
52-
service::AwaitableResolver Result<today::TaskState>::convert(service::AwaitableScalar<today::TaskState> result, ResolverParams params)
52+
service::AwaitableResolver Result<today::TaskState>::convert(service::AwaitableScalar<today::TaskState> result, ResolverParams&& params)
5353
{
5454
return ModifiedResult<today::TaskState>::resolve(std::move(result), std::move(params),
5555
[](today::TaskState value, const ResolverParams&)
5656
{
57-
response::Value result(response::Type::EnumValue);
57+
response::Value resolvedResult(response::Type::EnumValue);
5858

59-
result.set<std::string>(std::string { s_namesTaskState[static_cast<size_t>(value)] });
59+
resolvedResult.set<std::string>(std::string { s_namesTaskState[static_cast<size_t>(value)] });
6060

61-
return result;
61+
return resolvedResult;
6262
});
6363
}
6464

samples/today/schema/TodaySchema.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@ today::TaskState Argument<today::TaskState>::convert(const response::Value& valu
4949
}
5050

5151
template <>
52-
service::AwaitableResolver Result<today::TaskState>::convert(service::AwaitableScalar<today::TaskState> result, ResolverParams params)
52+
service::AwaitableResolver Result<today::TaskState>::convert(service::AwaitableScalar<today::TaskState> result, ResolverParams&& params)
5353
{
5454
return ModifiedResult<today::TaskState>::resolve(std::move(result), std::move(params),
5555
[](today::TaskState value, const ResolverParams&)
5656
{
57-
response::Value result(response::Type::EnumValue);
57+
response::Value resolvedResult(response::Type::EnumValue);
5858

59-
result.set<std::string>(std::string { s_namesTaskState[static_cast<size_t>(value)] });
59+
resolvedResult.set<std::string>(std::string { s_namesTaskState[static_cast<size_t>(value)] });
6060

61-
return result;
61+
return resolvedResult;
6262
});
6363
}
6464

samples/validation/schema/ValidationSchema.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@ validation::DogCommand Argument<validation::DogCommand>::convert(const response:
4949
}
5050

5151
template <>
52-
service::AwaitableResolver Result<validation::DogCommand>::convert(service::AwaitableScalar<validation::DogCommand> result, ResolverParams params)
52+
service::AwaitableResolver Result<validation::DogCommand>::convert(service::AwaitableScalar<validation::DogCommand> result, ResolverParams&& params)
5353
{
5454
return ModifiedResult<validation::DogCommand>::resolve(std::move(result), std::move(params),
5555
[](validation::DogCommand value, const ResolverParams&)
5656
{
57-
response::Value result(response::Type::EnumValue);
57+
response::Value resolvedResult(response::Type::EnumValue);
5858

59-
result.set<std::string>(std::string { s_namesDogCommand[static_cast<size_t>(value)] });
59+
resolvedResult.set<std::string>(std::string { s_namesDogCommand[static_cast<size_t>(value)] });
6060

61-
return result;
61+
return resolvedResult;
6262
});
6363
}
6464

@@ -105,16 +105,16 @@ validation::CatCommand Argument<validation::CatCommand>::convert(const response:
105105
}
106106

107107
template <>
108-
service::AwaitableResolver Result<validation::CatCommand>::convert(service::AwaitableScalar<validation::CatCommand> result, ResolverParams params)
108+
service::AwaitableResolver Result<validation::CatCommand>::convert(service::AwaitableScalar<validation::CatCommand> result, ResolverParams&& params)
109109
{
110110
return ModifiedResult<validation::CatCommand>::resolve(std::move(result), std::move(params),
111111
[](validation::CatCommand value, const ResolverParams&)
112112
{
113-
response::Value result(response::Type::EnumValue);
113+
response::Value resolvedResult(response::Type::EnumValue);
114114

115-
result.set<std::string>(std::string { s_namesCatCommand[static_cast<size_t>(value)] });
115+
resolvedResult.set<std::string>(std::string { s_namesCatCommand[static_cast<size_t>(value)] });
116116

117-
return result;
117+
return resolvedResult;
118118
});
119119
}
120120

src/GraphQLService.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ void blockSubFields(const ResolverParams& params)
694694
}
695695

696696
template <>
697-
AwaitableResolver Result<int>::convert(AwaitableScalar<int> result, ResolverParams params)
697+
AwaitableResolver Result<int>::convert(AwaitableScalar<int> result, ResolverParams&& params)
698698
{
699699
blockSubFields(params);
700700

@@ -706,7 +706,7 @@ AwaitableResolver Result<int>::convert(AwaitableScalar<int> result, ResolverPara
706706
}
707707

708708
template <>
709-
AwaitableResolver Result<double>::convert(AwaitableScalar<double> result, ResolverParams params)
709+
AwaitableResolver Result<double>::convert(AwaitableScalar<double> result, ResolverParams&& params)
710710
{
711711
blockSubFields(params);
712712

@@ -719,7 +719,7 @@ AwaitableResolver Result<double>::convert(AwaitableScalar<double> result, Resolv
719719

720720
template <>
721721
AwaitableResolver Result<std::string>::convert(
722-
AwaitableScalar<std::string> result, ResolverParams params)
722+
AwaitableScalar<std::string> result, ResolverParams&& params)
723723
{
724724
blockSubFields(params);
725725

@@ -731,7 +731,7 @@ AwaitableResolver Result<std::string>::convert(
731731
}
732732

733733
template <>
734-
AwaitableResolver Result<bool>::convert(AwaitableScalar<bool> result, ResolverParams params)
734+
AwaitableResolver Result<bool>::convert(AwaitableScalar<bool> result, ResolverParams&& params)
735735
{
736736
blockSubFields(params);
737737

@@ -744,7 +744,7 @@ AwaitableResolver Result<bool>::convert(AwaitableScalar<bool> result, ResolverPa
744744

745745
template <>
746746
AwaitableResolver Result<response::Value>::convert(
747-
AwaitableScalar<response::Value> result, ResolverParams params)
747+
AwaitableScalar<response::Value> result, ResolverParams&& params)
748748
{
749749
blockSubFields(params);
750750

@@ -757,7 +757,7 @@ AwaitableResolver Result<response::Value>::convert(
757757

758758
template <>
759759
AwaitableResolver Result<response::IdType>::convert(
760-
AwaitableScalar<response::IdType> result, ResolverParams params)
760+
AwaitableScalar<response::IdType> result, ResolverParams&& params)
761761
{
762762
blockSubFields(params);
763763

@@ -786,9 +786,12 @@ void requireSubFields(const ResolverParams& params)
786786

787787
template <>
788788
AwaitableResolver Result<Object>::convert(
789-
AwaitableObject<std::shared_ptr<const Object>> result, ResolverParams params)
789+
AwaitableObject<std::shared_ptr<const Object>> result, ResolverParams&& paramsArg)
790790
{
791-
requireSubFields(params);
791+
requireSubFields(paramsArg);
792+
793+
// Move the paramsArg into a local variable before the first suspension point.
794+
auto params = std::move(paramsArg);
792795

793796
co_await params.launch;
794797

src/SchemaGenerator.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ GRAPHQLSERVICE_EXPORT AwaitableResolver Result<)cpp"
629629
<< R"cpp(>::convert(
630630
AwaitableScalar<)cpp" << _loader.getSchemaNamespace()
631631
<< R"cpp(::)cpp" << enumType.cppType
632-
<< R"cpp(> result, ResolverParams params);
632+
<< R"cpp(> result, ResolverParams&& params);
633633
template <>
634634
GRAPHQLSERVICE_EXPORT void Result<)cpp"
635635
<< _loader.getSchemaNamespace() << R"cpp(::)cpp" << enumType.cppType
@@ -1327,20 +1327,20 @@ service::AwaitableResolver Result<)cpp"
13271327
<< _loader.getSchemaNamespace() << R"cpp(::)cpp" << enumType.cppType
13281328
<< R"cpp(>::convert(service::AwaitableScalar<)cpp"
13291329
<< _loader.getSchemaNamespace() << R"cpp(::)cpp" << enumType.cppType
1330-
<< R"cpp(> result, ResolverParams params)
1330+
<< R"cpp(> result, ResolverParams&& params)
13311331
{
13321332
return ModifiedResult<)cpp"
13331333
<< _loader.getSchemaNamespace() << R"cpp(::)cpp" << enumType.cppType
13341334
<< R"cpp(>::resolve(std::move(result), std::move(params),
13351335
[]()cpp" << _loader.getSchemaNamespace()
13361336
<< R"cpp(::)cpp" << enumType.cppType << R"cpp( value, const ResolverParams&)
13371337
{
1338-
response::Value result(response::Type::EnumValue);
1338+
response::Value resolvedResult(response::Type::EnumValue);
13391339
1340-
result.set<std::string>(std::string { s_names)cpp"
1340+
resolvedResult.set<std::string>(std::string { s_names)cpp"
13411341
<< enumType.cppType << R"cpp([static_cast<size_t>(value)] });
13421342
1343-
return result;
1343+
return resolvedResult;
13441344
});
13451345
}
13461346

0 commit comments

Comments
 (0)