155 uintptr_t alignment_mask_ = 0;
157 void (*default_construct_)(
void *
ptr) =
nullptr;
158 void (*default_construct_n_)(
void *
ptr,
int64_t n) =
nullptr;
159 void (*default_construct_indices_)(
void *
ptr,
const IndexMask &
mask) =
nullptr;
161 void (*value_initialize_)(
void *
ptr) =
nullptr;
162 void (*value_initialize_n_)(
void *
ptr,
int64_t n) =
nullptr;
163 void (*value_initialize_indices_)(
void *
ptr,
const IndexMask &
mask) =
nullptr;
165 void (*destruct_)(
void *
ptr) =
nullptr;
166 void (*destruct_n_)(
void *
ptr,
int64_t n) =
nullptr;
169 void (*copy_assign_)(
const void *src,
void *dst) =
nullptr;
170 void (*copy_assign_n_)(
const void *src,
void *dst,
int64_t n) =
nullptr;
171 void (*copy_assign_indices_)(
const void *src,
void *dst,
const IndexMask &
mask) =
nullptr;
172 void (*copy_assign_compressed_)(
const void *src,
void *dst,
const IndexMask &
mask) =
nullptr;
174 void (*copy_construct_)(
const void *src,
void *dst) =
nullptr;
175 void (*copy_construct_n_)(
const void *src,
void *dst,
int64_t n) =
nullptr;
176 void (*copy_construct_indices_)(
const void *src,
void *dst,
const IndexMask &
mask) =
nullptr;
177 void (*copy_construct_compressed_)(
const void *src,
void *dst,
const IndexMask &
mask) =
nullptr;
179 void (*move_assign_)(
void *src,
void *dst) =
nullptr;
180 void (*move_assign_n_)(
void *src,
void *dst,
int64_t n) =
nullptr;
181 void (*move_assign_indices_)(
void *src,
void *dst,
const IndexMask &
mask) =
nullptr;
183 void (*move_construct_)(
void *src,
void *dst) =
nullptr;
184 void (*move_construct_n_)(
void *src,
void *dst,
int64_t n) =
nullptr;
185 void (*move_construct_indices_)(
void *src,
void *dst,
const IndexMask &
mask) =
nullptr;
187 void (*relocate_assign_)(
void *src,
void *dst) =
nullptr;
188 void (*relocate_assign_n_)(
void *src,
void *dst,
int64_t n) =
nullptr;
189 void (*relocate_assign_indices_)(
void *src,
void *dst,
const IndexMask &
mask) =
nullptr;
191 void (*relocate_construct_)(
void *src,
void *dst) =
nullptr;
192 void (*relocate_construct_n_)(
void *src,
void *dst,
int64_t n) =
nullptr;
193 void (*relocate_construct_indices_)(
void *src,
void *dst,
const IndexMask &
mask) =
nullptr;
195 void (*fill_assign_n_)(
const void *value,
void *dst,
int64_t n) =
nullptr;
196 void (*fill_assign_indices_)(
const void *value,
void *dst,
const IndexMask &
mask) =
nullptr;
198 void (*fill_construct_n_)(
const void *value,
void *dst,
int64_t n) =
nullptr;
199 void (*fill_construct_indices_)(
const void *value,
void *dst,
const IndexMask &
mask) =
nullptr;
201 void (*print_)(
const void *value, std::stringstream &ss) =
nullptr;
202 bool (*is_equal_)(
const void *a,
const void *
b) =
nullptr;
203 uint64_t (*hash_)(
const void *value) =
nullptr;
205 const void *default_value_ =
nullptr;
206 std::string debug_name_;
209 template<
typename T, CPPTypeFlags Flags>
218 template<
typename T>
static const CPPType &
get();
277 void copy_assign(
const void *src,
void *dst)
const;
369 void print(
const void *value, std::stringstream &ss)
const;
370 std::string
to_string(
const void *value)
const;
373 bool is_equal(
const void *a,
const void *
b)
const;
389 template<
typename T>
bool is()
const;
391 template<
typename...
T>
bool is_any()
const;
403 template<
typename... Types,
typename Fn>
void to_static_type(
const Fn &
fn)
const;
406 template<
typename Fn>
struct TypeTagExecutor {
430 TypeTagExecutor<Fn> executor{
fn};
443#define BUFFER_FOR_CPP_TYPE_VALUE(type, variable_name) \
444 blender::DynamicStackBuffer<64, 64> stack_buffer_for_##variable_name((type).size, \
446 void *variable_name = stack_buffer_for_##variable_name.buffer();
481 return print_ !=
nullptr;
486 return is_equal_ !=
nullptr;
491 return hash_ !=
nullptr;
496 return (uintptr_t(
ptr) & alignment_mask_) == 0;
506 default_construct_(
ptr);
511 default_construct_n_(
ptr, n);
516 default_construct_indices_(
ptr,
mask);
521 value_initialize_(
ptr);
526 value_initialize_n_(
ptr, n);
531 value_initialize_indices_(
ptr,
mask);
551 copy_assign_(src, dst);
556 copy_assign_n_(src, dst, n);
561 copy_assign_indices_(src, dst,
mask);
568 copy_assign_compressed_(src, dst,
mask);
573 copy_construct_(src, dst);
578 copy_construct_n_(src, dst, n);
585 copy_construct_indices_(src, dst,
mask);
592 copy_construct_compressed_(src, dst,
mask);
597 move_assign_(src, dst);
602 move_assign_n_(src, dst, n);
607 move_assign_indices_(src, dst,
mask);
612 move_construct_(src, dst);
617 move_construct_n_(src, dst, n);
622 move_construct_indices_(src, dst,
mask);
627 relocate_assign_(src, dst);
632 relocate_assign_n_(src, dst, n);
637 relocate_assign_indices_(src, dst,
mask);
642 relocate_construct_(src, dst);
647 relocate_construct_n_(src, dst, n);
652 relocate_construct_indices_(src, dst,
mask);
657 fill_assign_n_(value, dst, n);
662 fill_assign_indices_(value, dst,
mask);
667 fill_construct_n_(value, dst, n);
674 fill_construct_indices_(value, dst,
mask);
678 const int64_t buffer_alignment)
const
680 return this->size <= buffer_size && this->alignment <= buffer_alignment;
691 return is_equal_(a,
b);
710 return this->
hash(value);
712 return fallback_hash;
717 return default_value_;
737 return (this->
is<T>() || ...);
742 using Callback = void (*)(
const Fn &
fn);
752 fn.template operator()<Types>();
758 const Callback callback = callback_map.
lookup_default(
this,
nullptr);
759 if (callback !=
nullptr) {
#define ENUM_OPERATORS(_type, _max)
unsigned long long int uint64_t
void(*)(void *) destruct_fn() const
void copy_construct_n(const void *src, void *dst, int64_t n) const
void(*)(void *) destruct_fn() const
static const CPPType & get()
void value_initialize_indices(void *ptr, const IndexMask &mask) const
void to_static_type(const Fn &fn) const
void default_construct_n(void *ptr, int64_t n) const
virtual ~CPPType()=default
void destruct_n(void *ptr, int64_t n) const
void copy_assign_indices(const void *src, void *dst, const IndexMask &mask) const
void move_construct_n(void *src, void *dst, int64_t n) const
bool is_trivially_destructible
void fill_assign_n(const void *value, void *dst, int64_t n) const
uint64_t hash_or_fallback(const void *value, uint64_t fallback_hash) const
bool is_equal(const void *a, const void *b) const
void fill_construct_indices(const void *value, void *dst, const IndexMask &mask) const
void relocate_assign_n(void *src, void *dst, int64_t n) const
bool is_default_constructible
void copy_construct_indices(const void *src, void *dst, const IndexMask &mask) const
void fill_assign_indices(const void *value, void *dst, const IndexMask &mask) const
void move_assign(void *src, void *dst) const
bool is_printable() const
std::string to_string(const void *value) const
void move_assign_indices(void *src, void *dst, const IndexMask &mask) const
void fill_construct_n(const void *value, void *dst, int64_t n) const
void relocate_construct(void *src, void *dst) const
void move_assign_n(void *src, void *dst, int64_t n) const
bool is_equal_or_false(const void *a, const void *b) const
bool is_move_constructible
StringRefNull name() const
static const CPPType & get_impl()
void relocate_assign_indices(void *src, void *dst, const IndexMask &mask) const
void copy_construct_compressed(const void *src, void *dst, const IndexMask &mask) const
void copy_assign_n(const void *src, void *dst, int64_t n) const
bool is_equality_comparable() const
void value_initialize_n(void *ptr, int64_t n) const
bool has_special_member_functions
void destruct_indices(void *ptr, const IndexMask &mask) const
bool is_copy_constructible
void copy_construct(const void *src, void *dst) const
void destruct(void *ptr) const
bool pointer_has_valid_alignment(const void *ptr) const
void default_construct_indices(void *ptr, const IndexMask &mask) const
void print_or_default(const void *value, std::stringstream &ss, StringRef default_value) const
void copy_assign(const void *src, void *dst) const
void to_static_type_tag(const Fn &fn) const
const void * default_value() const
void move_construct(void *src, void *dst) const
bool can_exist_in_buffer(const int64_t buffer_size, const int64_t buffer_alignment) const
void print(const void *value, std::stringstream &ss) const
bool pointer_can_point_to_instance(const void *ptr) const
void relocate_construct_n(void *src, void *dst, int64_t n) const
CPPType(TypeTag< T >, TypeForValue< CPPTypeFlags, Flags >, StringRef debug_name)
void relocate_assign(void *src, void *dst) const
void default_construct(void *ptr) const
void relocate_construct_indices(void *src, void *dst, const IndexMask &mask) const
void copy_assign_compressed(const void *src, void *dst, const IndexMask &mask) const
void move_construct_indices(void *src, void *dst, const IndexMask &mask) const
void value_initialize(void *ptr) const
Value lookup_default(const Key &key, const Value &default_value) const
void add_new(const Key &key, const Value &value)
NonCopyable(const NonCopyable &other)=delete
NonMovable(NonMovable &&other)=delete
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
bool operator!=(const CPPType &a, const CPPType &b)
uint64_t get_default_hash(const T &v, const Args &...args)
void register_cpp_types()
bool operator==(const CPPType &a, const CPPType &b)