Add moveable_types=forward_setter option for perfect forwarding setters#3292
Merged
Jens-G merged 1 commit intoapache:masterfrom Feb 8, 2026
Merged
Add moveable_types=forward_setter option for perfect forwarding setters#3292Jens-G merged 1 commit intoapache:masterfrom
Jens-G merged 1 commit intoapache:masterfrom
Conversation
e537cf7 to
a037d53
Compare
Jens-G
requested changes
Feb 6, 2026
Member
Jens-G
left a comment
There was a problem hiding this comment.
Couild you please remove the [skip ci] piece from your commit message?
Adds `forward_setter` value to `moveable_types` option, generating perfect forwarding setters for complex types while preserving traditional setters for primitives. Also fixes missing `operator<` implementation that caused link errors when structs are used as map keys.
**Forward Setter Generation** (`compiler/cpp/src/thrift/generate/t_cpp_generator.cc`):
- Parse `moveable_types=forward_setter` option
- Complex types (strings, containers, structs) → template setters with `std::forward<T_>`
- Primitive types → traditional const-ref setters
- Template implementations in `.tcc` file (auto-included in header)
- Legacy `moveable_types` behavior unchanged
**Compiler Unit Tests** (`compiler/cpp/tests/cpp/`):
- New `test_forward_setter.thrift` fixture
- Dedicated `t_cpp_generator_forward_setter_tests.cc` (91 assertions, 9 test cases)
- Verify `.tcc` generation and template implementations
**Integration Tests** (`test/cpp/src/`):
- `ForwardSetterTest.cpp` - validates lvalue/rvalue/temporary/literal setters with move semantics
- `PrivateOptionalTest.cpp` - SFINAE + static_assert verify optional fields are private
- `EnumClassTest.cpp` - type_traits + static_assert verify true enum class semantics
**CMakeLists.txt** (`test/cpp/`):
- Separate gen-cpp-{forward,private,enumclass} directories
**Makefile.am** (`test/cpp/`):
- Library targets for each option variant
- Proper `BUILT_SOURCES` dependencies
- Include path ordering: option-specific directory before standard `gen-cpp`
```cpp
// Generated with --gen cpp:moveable_types=forward_setter
struct TestStruct {
int32_t primitive_field;
std::string complex_field;
void __set_primitive_field(const int32_t val); // Traditional
template <typename T_>
void __set_complex_field(T_&& val); // Perfect forwarding
};
// In .tcc file:
template <typename T_>
void TestStruct::__set_complex_field(T_&& val) {
this->complex_field = ::std::forward<T_>(val);
__isset.complex_field = true;
}
```
- [ ] Did you create an [Apache Jira](https://issues.apache.org/jira/projects/THRIFT/issues/) ticket? ([Request account here](https://selfserve.apache.org/jira-account.html), not required for trivial changes)
- [ ] If a ticket exists: Does your pull request title follow the pattern "THRIFT-NNNN: describe my issue"?
- [x] Did you squash your changes to a single commit? (not required, but preferred)
- [x] Did you do your best to avoid breaking changes? If one was needed, did you label the Jira ticket with "Breaking-Change"?
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: zsy056 <1074382+zsy056@users.noreply.github.com>
a037d53 to
1fc90d4
Compare
Contributor
Author
thanks, pushed an update. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds
forward_settervalue tomoveable_typesoption, generating perfect forwarding setters for complex types while preserving traditional setters for primitives. Also fixes missingoperator<implementation that caused link errors when structs are used as map keys.Generator Changes
Forward Setter Generation (
compiler/cpp/src/thrift/generate/t_cpp_generator.cc):moveable_types=forward_setteroptionstd::forward<T_>.tccfile (auto-included in header)moveable_typesbehavior unchangedTesting
Compiler Unit Tests (
compiler/cpp/tests/cpp/):test_forward_setter.thriftfixturet_cpp_generator_forward_setter_tests.cc(91 assertions, 9 test cases).tccgeneration and template implementationsIntegration Tests (
test/cpp/src/):ForwardSetterTest.cpp- validates lvalue/rvalue/temporary/literal setters with move semanticsPrivateOptionalTest.cpp- SFINAE + static_assert verify optional fields are privateEnumClassTest.cpp- type_traits + static_assert verify true enum class semanticsBuild System
CMakeLists.txt (
test/cpp/):Makefile.am (
test/cpp/):BUILT_SOURCESdependenciesgen-cppExample
[skip ci]anywhere in the commit message to free up build resources.