diff options
author | Jacques Lucke <jacques@blender.org> | 2022-11-12 20:33:31 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2022-11-12 20:33:31 +0300 |
commit | a6c822733ac7da4921297804475adadd50c08ed9 (patch) | |
tree | b34cc2924d7effa33d9ca9abfa026c8917fb953a /source/blender/blenlib/BLI_cpp_type_make.hh | |
parent | a145b96396c4d2b8dd5ae027c676e838df0bd701 (diff) |
BLI: improve CPPType system
* Support bidirectional type lookups. E.g. finding the base type of a
field was supported, but not the other way around. This also removes
the todo in `get_vector_type`. To achieve this, types have to be
registered up-front.
* Separate `CPPType` from other "type traits". For example, previously
`ValueOrFieldCPPType` adds additional behavior on top of `CPPType`.
Previously, it was a subclass, now it just contains a reference to the
`CPPType` it corresponds to. This follows the composition-over-inheritance
idea. This makes it easier to have self-contained "type traits" without
having to put everything into `CPPType`.
Differential Revision: https://developer.blender.org/D16479
Diffstat (limited to 'source/blender/blenlib/BLI_cpp_type_make.hh')
-rw-r--r-- | source/blender/blenlib/BLI_cpp_type_make.hh | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/source/blender/blenlib/BLI_cpp_type_make.hh b/source/blender/blenlib/BLI_cpp_type_make.hh index 1f494624821..725e73dbb5d 100644 --- a/source/blender/blenlib/BLI_cpp_type_make.hh +++ b/source/blender/blenlib/BLI_cpp_type_make.hh @@ -206,7 +206,9 @@ template<typename T> uint64_t hash_cb(const void *value) namespace blender { template<typename T, CPPTypeFlags Flags> -CPPType::CPPType(CPPTypeParam<T, Flags> /* unused */, StringRef debug_name) +CPPType::CPPType(TypeTag<T> /*type*/, + TypeForValue<CPPTypeFlags, Flags> /*flags*/, + const StringRef debug_name) { using namespace cpp_type_util; @@ -278,9 +280,15 @@ CPPType::CPPType(CPPTypeParam<T, Flags> /* unused */, StringRef debug_name) } // namespace blender -#define BLI_CPP_TYPE_MAKE(IDENTIFIER, TYPE_NAME, FLAGS) \ +/** Create a new #CPPType that can be accessed through `CPPType::get<T>()`. */ +#define BLI_CPP_TYPE_MAKE(TYPE_NAME, FLAGS) \ template<> const blender::CPPType &blender::CPPType::get_impl<TYPE_NAME>() \ { \ - static CPPType cpp_type{blender::CPPTypeParam<TYPE_NAME, FLAGS>(), STRINGIFY(IDENTIFIER)}; \ - return cpp_type; \ + static CPPType type{blender::TypeTag<TYPE_NAME>(), \ + TypeForValue<CPPTypeFlags, FLAGS>(), \ + STRINGIFY(TYPE_NAME)}; \ + return type; \ } + +/** Register a #CPPType created with #BLI_CPP_TYPE_MAKE. */ +#define BLI_CPP_TYPE_REGISTER(TYPE_NAME) blender::CPPType::get<TYPE_NAME>() |