53# define FN_LAZY_FUNCTION_DEBUG_THREADS
112#ifdef FN_LAZY_FUNCTION_DEBUG_THREADS
167 template<
typename T>
T &
get_input(
int index)
const;
170 template<
typename T>
void set_output(
int index,
T &&value);
179 void assert_valid_thread()
const;
186 virtual void *try_get_input_data_ptr_impl(
int index)
const = 0;
187 virtual void *try_get_input_data_ptr_or_request_impl(
int index) = 0;
188 virtual void *get_output_data_ptr_impl(
int index) = 0;
189 virtual void output_set_impl(
int index) = 0;
190 virtual bool output_was_set_impl(
int index)
const = 0;
191 virtual ValueUsage get_output_usage_impl(
int index)
const = 0;
192 virtual void set_input_unused_impl(
int index) = 0;
193 virtual bool try_enable_multi_threading_impl();
262 virtual std::string
name()
const;
263 virtual std::string
input_name(
int index)
const;
341 this->execute_impl(
params, context);
351 [[maybe_unused]]
bool allow_multi_threading_initially)
364 return this->try_get_input_data_ptr_impl(index);
370 this->assert_valid_thread();
371 return this->try_get_input_data_ptr_or_request_impl(index);
377 this->assert_valid_thread();
378 return this->get_output_data_ptr_impl(index);
384 this->assert_valid_thread();
385 this->output_set_impl(index);
391 return this->output_was_set_impl(index);
397 return this->get_output_usage_impl(index);
403 this->assert_valid_thread();
404 this->set_input_unused_impl(index);
409 this->assert_valid_thread();
412 T return_value = std::move(*
static_cast<T *
>(
data));
420 return *
static_cast<T *
>(
data);
425 this->assert_valid_thread();
431 this->assert_valid_thread();
437 using DecayT = std::decay_t<T>;
438 this->assert_valid_thread();
440 new (
data) DecayT(std::forward<T>(value));
446 this->assert_valid_thread();
447 const bool success = this->try_enable_multi_threading_impl();
448#ifdef FN_LAZY_FUNCTION_DEBUG_THREADS
456inline void Params::assert_valid_thread()
const
458#ifdef FN_LAZY_FUNCTION_DEBUG_THREADS
#define BLI_assert_unreachable()
#define FN_LAZY_FUNCTION_DEBUG_THREADS
BMesh const char void * data
Vector< Output > outputs_
virtual void * init_storage(LinearAllocator<> &allocator) const
Span< Input > inputs() const
Span< Output > outputs() const
bool always_used_inputs_available(const Params ¶ms) const
virtual void possible_output_dependencies(int output_index, FunctionRef< void(Span< int >)> fn) const
virtual std::string output_name(int index) const
virtual void destruct_storage(void *storage) const
virtual ~LazyFunction()=default
virtual std::string input_name(int index) const
virtual std::string name() const
bool allow_missing_requested_inputs() const
void execute(Params ¶ms, const Context &context) const
bool allow_missing_requested_inputs_
void set_output(int index, T &&value)
std::thread::id main_thread_id_
void * try_get_input_data_ptr_or_request(int index)
std::atomic< bool > allow_multi_threading_
void * try_get_input_data_ptr(int index) const
void * get_output_data_ptr(int index)
bool try_enable_multi_threading()
ValueUsage get_output_usage(int index) const
Params(const LazyFunction &fn, bool allow_multi_threading_initially)
T & get_input(int index) const
void output_set(int index)
bool output_was_set(int index) const
T extract_input(int index)
void set_input_unused(int index)
Context(void *storage, UserData *user_data, LocalUserData *local_user_data)
LocalUserData * local_user_data
Output(const char *debug_name, const CPPType &type)