11 #ifndef __APEX_CALLBACK_H__
12 #define __APEX_CALLBACK_H__
36 #include <type_traits>
84 return theUndefTypeName.asRef();
94 static const APEX_Parm theInvalidParm = {
"__invalid__",
nullptr};
109 name_view = name_view.
trimLeft(
"*");
110 name_view = name_view.
trimLeft(
"+");
111 name_view = name_view.
trimLeft(
"-");
151 auto it = std::find_if (myInputs.begin(), myInputs.end(),
ParmNameComp(name));
152 return it != myInputs.end() ?
std::distance(myInputs.begin(), it) : -1;
157 auto it = std::find_if (myOutputs.begin(), myOutputs.end(),
ParmNameComp(name));
158 return it != myOutputs.end() ?
std::distance(myOutputs.begin(), it) : -1;
163 auto it = std::find_if (myInputs.begin(), myInputs.end(),
ParmNameComp(name));
164 if (it == myInputs.end())
165 return theInvalidParm;
171 auto it = std::find_if (myOutputs.begin(), myOutputs.end(),
ParmNameComp(name));
172 if (it == myOutputs.end())
173 return theInvalidParm;
181 *parm = &myInputs[index];
190 *parm = &myOutputs[index];
199 exint size()
const {
return numInputs() + numOutputs(); }
204 idx = myInputs.append(parm);
207 if (myInputs.isEmpty())
209 idx = myInputs.append(parm);
212 myInputs.insertAt(parm, idx);
214 return myInputs[idx];
220 idx = myOutputs.append(parm);
223 if (myOutputs.isEmpty())
225 idx = myOutputs.append(parm);
228 idx = myOutputs.insertAt(parm, idx);
230 return myOutputs[idx];
237 addInput(-1, {theSparePortName.asRef(),
nullptr});
238 addOutput(-1, {theSparePortName.asRef(),
nullptr});
244 addInput(
SYSmin(
index, myInputs.size()), {full_name,
nullptr});
245 addOutput(
SYSmin(
index, myOutputs.size()), {full_name,
nullptr});
256 alias_view = alias_view.
trimLeft(
"*");
257 alias_view = alias_view.
trimLeft(
"+");
258 alias_view = alias_view.
trimLeft(
"-");
259 if (findInputIndex(alias_view) >= 0)
262 myInputs[index].myAlias = alias_view;
273 alias_view = alias_view.
trimLeft(
"*");
274 alias_view = alias_view.
trimLeft(
"+");
275 alias_view = alias_view.
trimLeft(
"-");
276 if (findOutputIndex(alias_view) >= 0)
279 myOutputs[index].myAlias = alias_view;
326 if (!myOwns && !myOwner)
347 exint myRefCount = 0;
400 return {
"invalid",
nullptr};
417 const APEX_Graph *graph,
442 virtual bool usesCE()
const {
return false; }
447 const APEX_Graph *in_graph,
449 APEX_Program *bind_to)
const
456 auto t = callbackType();
463 auto t = callbackType();
478 template <
typename...
T,
size_t... Index>
485 T *
result =
reinterpret_cast<std::remove_pointer_t<T> *
>(arg_ptrs[Index]);
491 template <
typename...
T>
495 return castArgs<
T...>(arg_ptrs, std::index_sequence_for<
T...>{});
498 template <
typename T>
504 if constexpr (std::is_const_v<T>)
514 || name.
startsWith(theConditionalInplacePortPrefix))
519 template <
typename... Ts,
size_t... Index>
522 const char *
const argnames[
sizeof...(Ts)],
523 std::index_sequence<Index...>)
526 ((addToSignature<Ts>(
result, argnames[Index])), ...);
530 template <
typename... Ts>
539 const char *
const[(
sizeof...(Ts) > 0 ?
sizeof...(Ts) : 1)],
540 std::nullptr_t> argnames)
542 if constexpr (
sizeof...(Ts) > 0)
543 return makeSignature<Ts...>(argnames, std::index_sequence_for<Ts...>{});
548 template <
typename C,
typename... Ts>
554 myName = C::funcname.asHolder();
559 myDefaults->mergeUtOptions(&defaults,
false,
true,
true, &mySignature);
592 auto cast_args = castArgs<std::remove_const_t<Ts>...>(arg_ptrs);
593 auto ref_args =
makerefs(cast_args);
595 const auto &derived =
static_cast<const C &
>(*this);
597 std::apply(derived, ref_args);
610 inline std::pair<UT_StringHolder, UT_StringHolder>
615 fullname, &scope, &name_space, &core_name, &version);
625 return {std::move(name), std::move(version)};
635 template <
typename T>
639 exint removed_count = 0;
640 for (
auto it = callbacks.
rbegin(); it != callbacks.
rend(); ++it)
646 bool input_matches =
true;
652 input_matches =
false;
664 bool output_matches =
true;
670 output_matches =
false;
681 return removed_count;
std::string toStdString() const
const APEX_TypeDefinitionBase * typeDefinition()
exint APEXfilterCallbacksBySignature(UT_Array< const T * > &callbacks, const APEX_Signature &filter)
const UT_StringHolder & getName() const override
Normal callback which is unconditionally executed.
exint findOutputIndex(const UT_StringView &name) const
virtual bool hasSubnetTemplate() const
bool operator!=(const APEX_Signature &other) const
APEX_Parm duplicateParm() const
APEX_ParmHandle(APEX_SignaturePtr &sig, APEX_Parm *parm)
typename std::conditional< B, T, F >::type conditional_t
OIIO_UTIL_API bool copy(string_view from, string_view to, std::string &err)
UT_Tuple< std::string, std::string > tuple_t
APEX_ParmHandle(const APEX_ParmHandle &other)
const UT_StringHolder & name() const
exint findOutput(const UT_StringRef &name, APEX_Parm **parm)
virtual void runDataCompileHook(APEX_Argument *rundata_instance, const APEX_Graph *in_graph, APEX_NodeID for_node, APEX_Program *bind_to) const
Called for any type with rundata with a reference to the rundata so it can be initialized.
SYS_NO_DISCARD_RESULT SYS_FORCE_INLINE UT_StringView trimLeft(const char *c=" \t\n\r") const
bool opensScope() const
Does this node open a scope?
virtual bool requiresCEFlush() const
Whether the callback requires its input geometry CE caches to be flushed.
bool isEmpty() const
Same as !isstring()
UT_SharedPtr< APEX_Parm > APEX_ParmPtr
auto makerefs(UT_Tuple< T...> &t)
virtual void compile(const APEX_Graph *graph, APEX_NodeID node_id, APEX_Program *prog, UT_Array< APEX_Argument > &args) const
bool closesScope() const
Does this node close a scope?
static void getComponentsFromFullName(const char *full_name, UT_WorkBuffer *scope_opname, UT_WorkBuffer *namespace_name, UT_WorkBuffer *op_name, UT_WorkBuffer *version)
void addToSignature(APEX_Signature &sig, const UT_StringHolder &name)
std::tuple< Types...> UT_Tuple
**But if you need a result
bool isConditionalInplace() const
std::ptrdiff_t difference_type
APEX_CallbackType callbackType() const override
What kind of function is this? Informs things like scopes & conditions.
APEX_Parm(const UT_StringHolder &name, const APEX_TypeDefinitionBase *typedefn)
void addSparePort(const UT_StringRef &name="", exint index=-1)
APEX_ParmHandle freeze() const
Marks the start of an arbitrary loop, expects RunData to be an iterator.
const APEX_ParmList & inputs() const
A utility class to do read-only operations on a subset of an existing string.
#define utZoneScopedN(name)
bool setFromPyDictionary(const char *dict)
reverse_iterator rbegin()
Begin iterating over the array in reverse.
exint emplace_back(S &&...s)
virtual void execute(APEX_ArgPtrs &arg_ptrs) const
bool addOutputAlias(const UT_StringRef &name, const UT_StringRef &alias)
std::shared_ptr< T > UT_SharedPtr
Wrapper around std::shared_ptr.
PXL_API const char * getName(const ColorSpace *space)
Return the name of the color space.
virtual const UT_StringRef & repr() const =0
Return a human-readable string representing the type.
virtual APEX_CallbackType callbackType() const
What kind of function is this? Informs things like scopes & conditions.
virtual const Dict & parmDefaults() const
const APEX_TypeDefinitionBase * typeDefinition() const
const Dict & parmDefaults() const override
bool addInputAlias(const UT_StringRef &name, const UT_StringRef &alias)
bool operator==(const APEX_Parm &other) const
SYS_FORCE_INLINE bool isEmpty() const
bool addInputAlias(const UT_StringRef &name, const UT_StringRef &alias)
GLuint const GLchar * name
size_t format(const char *fmt, const Args &...args)
Format a string using the same formatting codes as UTformat.
bool operator!=(const APEX_Parm &other) const
virtual const APEX_TypeDefinitionBase * runDataTypeDef() const
bool operator()(APEX_Parm const &p)
reverse_iterator rend()
End reverse iterator.
bool addOutputAlias(const UT_StringRef &name, const UT_StringRef &alias)
APEX_Parm & addInput(int idx, const APEX_Parm &parm)
bool isConditionalInplace() const
const APEX_Signature & signature() const override
std::forward_iterator_tag iterator_category
const UT_StringRef & typeName()
GT_API const UT_StringHolder version
const APEX_ParmList & outputs() const
A map of string to various well defined value types.
virtual const char * minProductVersion() const
Earliest Houdini version that this callback is allowed in "X.Y.Z" format.
void setPtr(APEX_Parm *ptr, bool owns)
static const APEX_Signature theEmptySignature
APEX_ParmHandle(APEX_Parm &&parm)
virtual UT_StringHolder scopeConnection() const
Name of the fake wire which is used to denote scope relationships.
const UT_StringRef & typeName() const
exint findInputIndex(const UT_StringView &name) const
const APEX_Parm & findInput(const UT_StringRef &name) const
bool operator==(const APEX_Signature &other) const
SYS_FORCE_INLINE void append(char character)
auto makeSignature(const char *const argnames[sizeof...(Ts)], std::index_sequence< Index...>)
**If you just want to fire and args
void removeItem(const reverse_iterator &it)
Remove item specified by the reverse_iterator.
APEX_Parm & addOutput(int idx, const APEX_Parm &parm)
const APEX_Parm & findOutput(const UT_StringRef &name) const
virtual bool isHidden() const
Determines whether the callback should be hidden from the UI.
APEX_ParmHandleRef(APEX_SignaturePtr &sig, APEX_Parm *parm)
~APEX_GenericFunction() override
void addSparePort(const UT_StringRef &name="", exint index=-1)
exint findInput(const UT_StringRef &name, APEX_Parm **parm)
static constexpr const char * parm_defaults
ParmNameComp(const UT_StringView &s)
APEX_ParmHandleRef(APEX_Parm *parm)
Represents a location for a single object inside of an APEX_Buffer.
static const APEX_COWHandle< APEX_ParmDict > & getAPEXStaticEmpty()
SIM_API const UT_StringHolder distance
std::pair< UT_StringHolder, UT_StringHolder > APEXsplitNameAndVersion(const char *fullname)
bool startsWith(const UT_StringView &pfx, bool case_sense=true) const
Imported from UT_String.
virtual bool usesCE() const
Whether the callback leaves CE caches in its output geometry.
void execute(APEX_ArgPtrs &arg_ptrs) const override
UT_SharedPtr< APEX_Signature > APEX_SignaturePtr
Do nothing; ignored after compilation.
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
UT_Tuple< T *...> castArgs(APEX_ArgPtrs &arg_ptrs, std::index_sequence< Index...>)
const APEX_TypeDefinitionBase * myTypeDefn