You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@thrift.apache.org by "Jens-G (via GitHub)" <gi...@apache.org> on 2026/06/30 20:10:48 UTC

[PR] THRIFT-6075: Generate Equal method for Delphi Thrift structs [thrift]

Jens-G opened a new pull request, #3612:
URL: https://github.com/apache/thrift/pull/3612

   ## Summary
   
   - Adds `function Equal(const other: I{Name}): Boolean` to every generated Delphi struct interface and its implementation class
   - Overrides `function Equals(Obj: TObject): Boolean` on the implementation class to delegate to `Equal` via interface check
   - Overrides `Equals(Obj: TObject)` on generated exception wrapper classes (`T{Name}`) to compare the inner `FData` struct
   - Implements field-by-field comparison respecting `__isset` semantics for optional fields and recursing into all container/struct types
   
   ## Detail
   
   The generator gains two new methods:
   
   **`generate_equal_container`** — recursive helper that emits comparison code for any field type into a pair of `ostringstream` buffers (`code` and `vars`). Uses the boolean-variable pattern (`_eqN := True; ... if not _eqN then Exit(False)`) so comparison never uses `Exit` inside loops, supporting arbitrary nesting depth. Strategies per type:
   - Scalar: direct `<>` comparison
   - Binary (`TBytes` / `IThriftBytes`): length check then `System.SysUtils.CompareMem`
   - Struct: `.Equal()` recursive call
   - List: indexed element loop
   - Set with scalar elements: `Contains()` (O(n), value-hash equality)
   - Set with interface-typed elements: O(n²) scan calling `.Equal()` on each pair
   - Map with scalar keys: `ContainsKey()` + value comparison
   - Map with interface-typed keys: O(n²) key scan
   
   **`generate_delphi_struct_equality_impl`** — walks all struct fields. For optional/unqualified fields emits `__isset` guard first (mismatch ⇒ `Exit(False)`); required fields compare values directly with no isset check.
   
   ## Tests
   
   Extended `TTestSerializer.Test_Equal` in `lib/delphi/test/serializer/TestSerializer.Tests.pas`:
   - Unqualified scalar fields with isset guards (Bonk)
   - Optional fields: isset mismatch, both-unset, both-set (TupleProtocolTestStruct)
   - Nil vs non-nil nested struct, structural mismatch (Nesting)
   - List count mismatch and element mismatch (OneOfEach.Byte_list)
   - Set-of-scalar match/count-mismatch/element-mismatch (CompactProtoTestStruct.I32_set)
   - Set-of-struct match/nil-vs-non-nil (CompactProtoTestStruct.Struct_set)
   - Map match/missing-key/value-mismatch (CompactProtoTestStruct.Byte_byte_map)
   - Binary field match/content-mismatch/length-mismatch (Base64.B1, COM and non-COM branches)
   - `Equals(TObject)` compatible type, value mismatch, incompatible type (TBonkImpl)
   - Exception wrapper equality/mismatch/incompatible type (TMutableException)
   
   ## Test plan
   
   - [ ] CI Delphi build passes
   - [ ] `TTestSerializer.Test_Equal` assertions all pass
   - [ ] `make style` clean
   
   🤖 Generated with [Claude Code](https://claude.com/claude-code)
   
   Co-Authored-By: Claude Sonnet 4.6 <no...@anthropic.com>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@thrift.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] THRIFT-6075: Generate Equal method for Delphi Thrift structs [thrift]

Posted by "Jens-G (via GitHub)" <gi...@apache.org>.
Jens-G merged PR #3612:
URL: https://github.com/apache/thrift/pull/3612


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@thrift.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org