31 evaluate_input_processors();
41 release_unneeded_results();
48 return results_.lookup(identifier);
53 results_mapped_to_inputs_.add_new(identifier, result);
61 int current_domain_priority = std::numeric_limits<int>::max();
65 for (
StringRef identifier : input_descriptors_.keys()) {
70 if (result.is_single_value() ||
descriptor.expects_single_value) {
75 if (!
descriptor.realization_options.realize_on_operation_domain) {
81 if (
descriptor.domain_priority < current_domain_priority) {
82 operation_domain = result.domain();
83 current_domain_priority =
descriptor.domain_priority;
87 return operation_domain;
98 for (
const StringRef &identifier : results_mapped_to_inputs_.keys()) {
104 for (
const StringRef &identifier : results_mapped_to_inputs_.keys()) {
110 for (
const StringRef &identifier : results_mapped_to_inputs_.keys()) {
125 ProcessorsVector &processors = input_processors_.lookup_or_add_default(identifier);
134 processors.
append(std::unique_ptr<SimpleOperation>(processor));
146 return *results_mapped_to_inputs_.lookup(identifier);
151 results_mapped_to_inputs_.lookup(identifier) =
result;
156 results_.add_new(identifier, result);
161 input_descriptors_.add_new(identifier,
descriptor);
166 return input_descriptors_.lookup(identifier);
179void Operation::evaluate_input_processors()
181 if (!input_processors_added_) {
183 input_processors_added_ =
true;
188 for (
const std::unique_ptr<SimpleOperation> &processor : processors) {
189 processor->evaluate();
194void Operation::reset_results()
196 for (Result &result : results_.values()) {
201void Operation::release_inputs()
203 for (Result *result : results_mapped_to_inputs_.values()) {
208void Operation::release_unneeded_results()
210 for (Result &result : results_.values()) {
211 if (!result.should_compute() && result.is_allocated()) {
void append(const T &value)
const T & last(const int64_t n=0) const
TexturePool & texture_pool()
virtual void evaluate_operation_post() const
static SimpleOperation * construct_if_needed(Context &context, const Result &input_result, const InputDescriptor &input_descriptor)
Result & get_input(StringRef identifier) const
void switch_result_mapped_to_input(StringRef identifier, Result *result)
Result & get_result(StringRef identifier)
virtual void compute_preview()
InputDescriptor & get_input_descriptor(StringRef identifier)
TexturePool & texture_pool() const
void populate_result(StringRef identifier, Result result)
Context & context() const
Operation(Context &context)
virtual void add_and_evaluate_input_processors()
void add_and_evaluate_input_processor(StringRef identifier, SimpleOperation *processor)
void map_input_to_result(StringRef identifier, Result *result)
void declare_input_descriptor(StringRef identifier, InputDescriptor descriptor)
virtual Domain compute_domain()
static SimpleOperation * construct_if_needed(Context &context, const Result &input_result, const InputDescriptor &input_descriptor, const Domain &operation_domain)
static SimpleOperation * construct_if_needed(Context &context, const Result &input_result)
void map_input_to_result(Result *result)
Vector< std::unique_ptr< SimpleOperation > > ProcessorsVector
void realize_on_domain(Context &context, Result &input, Result &output, const Domain &domain, const float3x3 &input_transformation, const RealizationOptions &realization_options)