53# define FN_LAZY_FUNCTION_DEBUG_THREADS
139#ifdef FN_LAZY_FUNCTION_DEBUG_THREADS
195 template<
typename T> T &
get_input(
int index)
const;
198 template<
typename T>
void set_output(
int index, T &&value);
207 void assert_valid_thread()
const;
214 virtual void *try_get_input_data_ptr_impl(
int index)
const = 0;
215 virtual void *try_get_input_data_ptr_or_request_impl(
int index) = 0;
216 virtual void *get_output_data_ptr_impl(
int index) = 0;
217 virtual void output_set_impl(
int index) = 0;
218 virtual bool output_was_set_impl(
int index)
const = 0;
219 virtual ValueUsage get_output_usage_impl(
int index)
const = 0;
220 virtual void set_input_unused_impl(
int index) = 0;
221 virtual bool try_enable_multi_threading_impl();
290 virtual std::string
name()
const;
291 virtual std::string
input_name(
int index)
const;
369 this->execute_impl(
params, context);
379 [[maybe_unused]]
bool allow_multi_threading_initially)
383 main_thread_id_(std::this_thread::get_id()),
384 allow_multi_threading_(allow_multi_threading_initially)
392 return this->try_get_input_data_ptr_impl(index);
398 this->assert_valid_thread();
399 return this->try_get_input_data_ptr_or_request_impl(index);
405 this->assert_valid_thread();
406 return this->get_output_data_ptr_impl(index);
412 this->assert_valid_thread();
413 this->output_set_impl(index);
419 return this->output_was_set_impl(index);
425 return this->get_output_usage_impl(index);
431 this->assert_valid_thread();
432 this->set_input_unused_impl(index);
437 this->assert_valid_thread();
440 T return_value = std::move(*
static_cast<T *
>(data));
448 return *
static_cast<T *
>(
data);
453 this->assert_valid_thread();
459 this->assert_valid_thread();
465 using DecayT = std::decay_t<T>;
466 this->assert_valid_thread();
468 new (
data) DecayT(std::forward<T>(value));
474 this->assert_valid_thread();
475 const bool success = this->try_enable_multi_threading_impl();
476#ifdef FN_LAZY_FUNCTION_DEBUG_THREADS
484inline void Params::assert_valid_thread()
const
486#ifdef FN_LAZY_FUNCTION_DEBUG_THREADS
501namespace lf = fn::lazy_function;
#define BLI_assert_unreachable()
#define FN_LAZY_FUNCTION_DEBUG_THREADS
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_
virtual ~LocalUserData()=default
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)
virtual destruct_ptr< LocalUserData > get_local(LinearAllocator<> &allocator)
virtual ~UserData()=default
std::unique_ptr< T, DestructValueAtAddress< T > > destruct_ptr
Context(void *storage, UserData *user_data, LocalUserData *local_user_data)
LocalUserData * local_user_data
Output(const char *debug_name, const CPPType &type)