)]}'
{
  "log": [
    {
      "commit": "c3cdacf1beae8a309a904f27d65850f0b4c3e3d6",
      "tree": "e8f14b0a24cbf3710e61be36071f6e756435b13d",
      "parents": [
        "0b6822804eb4fdeefc6143fbe72478c7309be7b7"
      ],
      "author": {
        "name": "copilot-swe-agent[bot]",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Mon Feb 09 21:30:16 2026 +0000"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Fri Feb 20 00:15:44 2026 +0100"
      },
      "message": "cpp: add template_streamop generation with runtime/compiler test coverage\n\nAdd template_streamop support in the C++ generator so generated operator\u003c\u003c and printTo can target generic stream-like output types.\nKeep default behavior unchanged when the option is not set (std::ostream signatures remain).\nAdd compiler/runtime coverage for template generation, friend declaration correctness, enums, and collection printing.\n\ndefault:\n```cpp\nstd::ostream\u0026 operator\u003c\u003c(std::ostream\u0026 out, const SimpleStruct\u0026 obj);\n\nclass SimpleStruct {\npublic:\n  void printTo(std::ostream\u0026 out) const;\n};\n```\n\nwith `template_streamop`:\n```cpp\ntemplate \u003ctypename OStream_\u003e\nOStream_\u0026 operator\u003c\u003c(OStream_\u0026 out, const SimpleStruct\u0026 obj);\n\nclass SimpleStruct {\npublic:\n  template \u003ctypename OStream_\u003e\n  void printTo(OStream_\u0026 out) const;\n};\n```\n"
    },
    {
      "commit": "1e09a046e080765567b7125b01fd966c2596ee3f",
      "tree": "0caeb9c86a5416470a35a5a84ffc3d756d5bb38c",
      "parents": [
        "67bfb29af0837eefd32447c186d22aa45b2f1869"
      ],
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "time": "Thu Jan 29 10:36:28 2026 -0800"
      },
      "committer": {
        "name": "Jens Geyer",
        "email": "Jens-G@users.noreply.github.com",
        "time": "Sun Feb 08 22:09:37 2026 +0100"
      },
      "message": "Add moveable_types\u003dforward_setter option for perfect forwarding setters\n\nAdds `forward_setter` value to `moveable_types` option, generating perfect forwarding setters for complex types while preserving traditional setters for primitives. Also fixes missing `operator\u003c` implementation that caused link errors when structs are used as map keys.\n\n**Forward Setter Generation** (`compiler/cpp/src/thrift/generate/t_cpp_generator.cc`):\n- Parse `moveable_types\u003dforward_setter` option\n- Complex types (strings, containers, structs) → template setters with `std::forward\u003cT_\u003e`\n- Primitive types → traditional const-ref setters\n- Template implementations in `.tcc` file (auto-included in header)\n- Legacy `moveable_types` behavior unchanged\n\n**Compiler Unit Tests** (`compiler/cpp/tests/cpp/`):\n- New `test_forward_setter.thrift` fixture\n- Dedicated `t_cpp_generator_forward_setter_tests.cc` (91 assertions, 9 test cases)\n- Verify `.tcc` generation and template implementations\n\n**Integration Tests** (`test/cpp/src/`):\n- `ForwardSetterTest.cpp` - validates lvalue/rvalue/temporary/literal setters with move semantics\n- `PrivateOptionalTest.cpp` - SFINAE + static_assert verify optional fields are private\n- `EnumClassTest.cpp` - type_traits + static_assert verify true enum class semantics\n\n**CMakeLists.txt** (`test/cpp/`):\n- Separate gen-cpp-{forward,private,enumclass} directories\n\n**Makefile.am** (`test/cpp/`):\n- Library targets for each option variant\n- Proper `BUILT_SOURCES` dependencies\n- Include path ordering: option-specific directory before standard `gen-cpp`\n\n```cpp\n// Generated with --gen cpp:moveable_types\u003dforward_setter\n\nstruct TestStruct {\n  int32_t primitive_field;\n  std::string complex_field;\n\n  void __set_primitive_field(const int32_t val);  // Traditional\n\n  template \u003ctypename T_\u003e\n  void __set_complex_field(T_\u0026\u0026 val);  // Perfect forwarding\n};\n\n// In .tcc file:\ntemplate \u003ctypename T_\u003e\nvoid TestStruct::__set_complex_field(T_\u0026\u0026 val) {\n  this-\u003ecomplex_field \u003d ::std::forward\u003cT_\u003e(val);\n  __isset.complex_field \u003d true;\n}\n```\n\n- [ ] 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)\n- [ ] If a ticket exists: Does your pull request title follow the pattern \"THRIFT-NNNN: describe my issue\"?\n- [x] Did you squash your changes to a single commit?  (not required, but preferred)\n- [x] Did you do your best to avoid breaking changes?  If one was needed, did you label the Jira ticket with \"Breaking-Change\"?\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] \u003c198982749+Copilot@users.noreply.github.com\u003e\nCo-authored-by: zsy056 \u003c1074382+zsy056@users.noreply.github.com\u003e\n"
    }
  ]
}
