mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-05 06:03:34 +00:00
Implements `As<Blah>()` and `Is<Blah>()` automatically. There are several benefits to using this over the pattern of hand-rolled `IsBlah()`, `AsBlah()` methods: (1) We don't have to maintain a whole lot of hand written code. (2) These allow us to cast from the base type to _any_ derived type in a single cast. The existing hand-rolled methods usually require a couple of intermediary casts to go from the base type to the leaf type. (3) The use of a template parameter means these casts can be called from other template logic. Note: Unlike the hand-rolled `AsBlah()` methods, it is safe to call `As<T>()` even if the type does not derive from `T`. If the object does not derive from `T` then `As` will simply return `nullptr`. This allows the calling logic to replace the common pattern of: ``` if (obj.IsBlah()) { auto* b = obj.AsBlah(); ... } ``` with: ``` if (auto* b = obj.As<Blah>()) { ... } ``` This halves the number of virtual method calls, and is one line shorter. Change-Id: I4312e9831d7de6703a97184640864b8050a34177 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34260 Reviewed-by: dan sinclair <dsinclair@chromium.org> Commit-Queue: Ben Clayton <bclayton@google.com>