iexpression.h File Reference
Description
Expressions of the MDL type system.
Code Example
iexpression.h
/***************************************************************************************************
* Copyright 2024 NVIDIA Corporation. All rights reserved.
**************************************************************************************************/
#ifndef MI_NEURAYLIB_IEXPRESSION_H
#define MI_NEURAYLIB_IEXPRESSION_H
#include <mi/neuraylib/ivalue.h>
#include <mi/neuraylib/version.h>
namespace mi {
class IString;
namespace neuraylib {
class IAnnotation;
class IAnnotation_block;
class IExpression_list;
enum Mdl_version {
MDL_VERSION_1_0,
MDL_VERSION_1_1,
MDL_VERSION_1_2,
MDL_VERSION_1_3,
MDL_VERSION_1_4,
MDL_VERSION_1_5,
MDL_VERSION_1_6,
MDL_VERSION_1_7,
MDL_VERSION_1_8,
MDL_VERSION_1_9,
MDL_VERSION_EXP,
MDL_VERSION_LATEST = MDL_VERSION_1_9,
MDL_VERSION_INVALID = 0xffffffffU,
MDL_VERSION_FORCE_32_BIT = 0xffffffffU // Undocumented, for alignment only
};
class IExpression : public
mi::base::Interface_declare<0x0f4a7542,0x9b27,0x4924,0xbd,0x8d,0x82,0xe3,0xa9,0xa7,0xa9,0xd6>
{
public:
enum Kind {
EK_CONSTANT,
EK_CALL,
EK_PARAMETER,
EK_DIRECT_CALL,
EK_TEMPORARY,
// Undocumented, for alignment only.
EK_FORCE_32_BIT = 0xffffffffU
};
virtual Kind
get_kind() const = 0;
virtual const IType* get_type() const = 0;
template <class T>
const T* get_type() const
{
const IType* ptr_type = get_type();
if( !ptr_type)
return 0;
const T* ptr_T = static_cast<const T*>( ptr_type->get_interface( typename T::IID()));
ptr_type->release();
return ptr_T;
}
};
mi_static_assert( sizeof( IExpression::Kind) == sizeof( Uint32));
class IExpression_constant : public
mi::base::Interface_declare<0x9da8d465,0x4058,0x46cb,0x83,0x6e,0x0e,0x38,0xa6,0x7f,0xcd,0xef,
neuraylib::IExpression>
{
public:
static const Kind
s_kind = EK_CONSTANT;
virtual const IValue* get_value() const = 0;
template <class T>
const T* get_value() const
{
const IValue* ptr_value = get_value();
if( !ptr_value)
return 0;
const T* ptr_T = static_cast<const T*>( ptr_value->get_interface( typename T::IID()));
ptr_value->release();
return ptr_T;
}
virtual IValue* get_value() = 0;
template <class T>
T* get_value()
{
IValue* ptr_value = get_value();
if( !ptr_value)
return 0;
T* ptr_T = static_cast<T*>( ptr_value->get_interface( typename T::IID()));
ptr_value->release();
return ptr_T;
}
virtual Sint32
set_value( IValue* value) = 0;
};
class IExpression_call : public
mi::base::Interface_declare<0xcf625aec,0x8eb8,0x4743,0x9f,0xf6,0x76,0x82,0x2c,0x02,0x54,0xa3,
neuraylib::IExpression>
{
public:
static const Kind
s_kind = EK_CALL;
virtual const char* get_call() const = 0;
virtual Sint32
set_call( const char* name) = 0;
};
class IExpression_parameter : public
mi::base::Interface_declare<0x206c4319,0x0b53,0x45a7,0x86,0x07,0x29,0x98,0xb3,0x44,0x7f,0xaa,
neuraylib::IExpression>
{
public:
static const Kind
s_kind = EK_PARAMETER;
virtual Size
get_index() const = 0;
virtual void set_index( Size index) = 0;
};
class IExpression_direct_call : public
mi::base::Interface_declare<0x9253c9d6,0xe162,0x4234,0xab,0x91,0x54,0xc1,0xe4,0x87,0x39,0x66,
neuraylib::IExpression>
{
public:
static const Kind
s_kind = EK_DIRECT_CALL;
virtual const char* get_definition() const = 0;
virtual const IExpression_list* get_arguments() const = 0;
};
class IExpression_temporary : public
mi::base::Interface_declare<0xd91f484b,0xdbf8,0x4585,0x9d,0xab,0xba,0xd9,0x91,0x7f,0xe1,0x4c,
neuraylib::IExpression>
{
public:
static const Kind
s_kind = EK_TEMPORARY;
virtual Size
get_index() const = 0;
virtual void set_index( Size index) = 0;
};
class IExpression_list : public
mi::base::Interface_declare<0x98ce8e89,0x9f23,0x45ec,0xa7,0xce,0x85,0x78,0x48,0x14,0x85,0x23>
{
public:
virtual Size
get_size() const = 0;
virtual Size
get_index( const char* name) const = 0;
virtual const char* get_name( Size index) const = 0;
virtual const IExpression* get_expression( Size index) const = 0;
template <class T>
const T* get_expression( Size index) const
{
const IExpression* ptr_expression = get_expression( index);
if( !ptr_expression)
return 0;
const T* ptr_T = static_cast<const T*>( ptr_expression->get_interface( typename T::IID()));
ptr_expression->release();
return ptr_T;
}
virtual const IExpression* get_expression( const char* name) const = 0;
template <class T>
const T* get_expression( const char* name) const
{
const IExpression* ptr_expression = get_expression( name);
if( !ptr_expression)
return 0;
const T* ptr_T = static_cast<const T*>( ptr_expression->get_interface( typename T::IID()));
ptr_expression->release();
return ptr_T;
}
virtual Sint32
set_expression( Size index, const IExpression* expression) = 0;
virtual Sint32
set_expression( const char* name, const IExpression* expression) = 0;
virtual Sint32
add_expression( const char* name, const IExpression* expression) = 0;
};
class IAnnotation_definition : public
mi::base::Interface_declare<0xa453318b,0xe056,0x4521,0x9f,0x3c,0x9d,0x5c,0x3,0x23,0x5f,0xb7>
{
public:
enum Semantics
{
AS_UNKNOWN = 0,
AS_INTRINSIC_ANNOTATION = 0x0100,
AS_ANNOTATION_FIRST = AS_INTRINSIC_ANNOTATION,
AS_THROWS_ANNOTATION,
AS_SINCE_ANNOTATION,
AS_REMOVED_ANNOTATION,
AS_CONST_EXPR_ANNOTATION,
AS_DERIVABLE_ANNOTATION,
AS_NATIVE_ANNOTATION,
AS_UNUSED_ANNOTATION,
AS_NOINLINE_ANNOTATION,
AS_SOFT_RANGE_ANNOTATION,
AS_HARD_RANGE_ANNOTATION,
AS_HIDDEN_ANNOTATION,
AS_DEPRECATED_ANNOTATION,
AS_VERSION_NUMBER_ANNOTATION,
AS_VERSION_ANNOTATION,
AS_DEPENDENCY_ANNOTATION,
AS_UI_ORDER_ANNOTATION,
AS_USAGE_ANNOTATION,
AS_ENABLE_IF_ANNOTATION,
AS_THUMBNAIL_ANNOTATION,
AS_DISPLAY_NAME_ANNOTATION,
AS_IN_GROUP_ANNOTATION,
AS_DESCRIPTION_ANNOTATION,
AS_AUTHOR_ANNOTATION,
AS_CONTRIBUTOR_ANNOTATION,
AS_COPYRIGHT_NOTICE_ANNOTATION,
AS_CREATED_ANNOTATION,
AS_MODIFIED_ANNOTATION,
AS_KEYWORDS_ANNOTATION,
AS_ORIGIN_ANNOTATION,
AS_NODE_OUTPUT_PORT_DEFAULT_ANNOTATION,
AS_ANNOTATION_LAST = AS_NODE_OUTPUT_PORT_DEFAULT_ANNOTATION,
AS_FORCE_32_BIT = 0xffffffffU // Undocumented, for alignment only.
};
virtual const char* get_module() const = 0;
virtual const char* get_name() const = 0;
virtual const char* get_mdl_module_name() const = 0;
virtual const char* get_mdl_simple_name() const = 0;
virtual const char* get_mdl_parameter_type_name( Size index) const = 0;
virtual Semantics
get_semantic() const = 0;
virtual bool is_exported() const = 0;
virtual void get_mdl_version( Mdl_version& since, Mdl_version& removed) const = 0;
virtual Size
get_parameter_count() const = 0;
virtual const char* get_parameter_name( Size index) const = 0;
virtual Size
get_parameter_index( const char* name) const = 0;
virtual const IType_list* get_parameter_types() const = 0;
virtual const IExpression_list* get_defaults() const = 0;
virtual const IAnnotation_block* get_annotations() const = 0;
virtual const IAnnotation* create_annotation( const IExpression_list* arguments) const = 0;
};
mi_static_assert( sizeof( IAnnotation_definition::Semantics) == sizeof( Uint32));
class IAnnotation : public
mi::base::Interface_declare<0xa9c652e7,0x952e,0x4887,0x93,0xb4,0x55,0xc8,0x66,0xd0,0x1a,0x1f>
{
public:
virtual const char* get_name() const = 0;
virtual void set_name( const char* name) = 0;
virtual const IExpression_list* get_arguments() const = 0;
virtual const IAnnotation_definition* get_definition() const = 0;
};
class IAnnotation_block : public
mi::base::Interface_declare<0x57b0ae97,0x0815,0x41e8,0x89,0xe7,0x16,0xa1,0x23,0x86,0x80,0x6e>
{
public:
virtual Size
get_size() const = 0;
virtual const IAnnotation* get_annotation( Size index) const = 0;
virtual Sint32
set_annotation( Size index, const IAnnotation* annotation) = 0;
virtual Sint32
add_annotation( IAnnotation* annotation) = 0;
};
class IAnnotation_list : public
mi::base::Interface_declare<0x6c4663c2,0x112f,0x4eeb,0x81,0x60,0x41,0xa5,0xa6,0xfb,0x74,0x3c>
{
public:
virtual Size
get_size() const = 0;
virtual Size
get_index( const char* name) const = 0;
virtual const char* get_name( Size index) const = 0;
virtual const IAnnotation_block* get_annotation_block( Size index) const = 0;
virtual const IAnnotation_block* get_annotation_block( const char* name) const = 0;
virtual Sint32
set_annotation_block( Size index, const IAnnotation_block* block) = 0;
virtual Sint32
set_annotation_block( const char* name, const IAnnotation_block* block) = 0;
virtual Sint32
add_annotation_block( const char* name, const IAnnotation_block* block) = 0;
};
class IExpression_factory : public
mi::base::Interface_declare<0x9fd3b2d4,0xb5b8,0x4ccd,0x9b,0x5f,0x7b,0xd9,0x9d,0xeb,0x62,0x64>
{
public:
virtual IValue_factory* get_value_factory() const = 0;
virtual IExpression_constant* create_constant( IValue* value) const = 0;
virtual const IExpression_constant* create_constant( const IValue* value) const = 0;
virtual IExpression_call* create_call( const char* name) const = 0;
virtual IExpression_parameter* create_parameter( const IType* type, Size index) const = 0;
virtual IExpression_direct_call* create_direct_call(
const char* name, IExpression_list* arguments, Sint32* errors = 0) const = 0;
virtual IExpression_temporary* create_temporary( const IType* type, Size index) const = 0;
virtual IExpression_list* create_expression_list() const = 0;
virtual IAnnotation* create_annotation(
const char* name, const IExpression_list* arguments) const = 0;
virtual IAnnotation_block* create_annotation_block() const = 0;
virtual IAnnotation_list* create_annotation_list() const = 0;
virtual IExpression* clone( const IExpression* expr) const = 0;
template <class T>
T* clone( const T* expr) const
{
IExpression* ptr_expr = clone( static_cast<const IExpression*>( expr));
if( !ptr_expr)
return 0;
T* ptr_T = static_cast<T*>( ptr_expr->get_interface( typename T::IID()));
ptr_expr->release();
return ptr_T;
}
virtual IExpression_list* clone( const IExpression_list* expression_list) const = 0;
enum Comparison_options {
DEFAULT_OPTIONS = 0,
DEEP_CALL_COMPARISONS = 1,
SKIP_TYPE_ALIASES = 2,
// Undocumented, for alignment only
COMPARISON_OPTIONS_FORCE_32_BIT = 0xffffffffU
};
virtual Sint32
compare(
const IExpression* lhs,
const IExpression* rhs,
Uint32 flags = 0,
Float64 epsilon = 0.0) const = 0;
virtual Sint32
compare(
const IExpression_list* lhs,
const IExpression_list* rhs,
Uint32 flags = 0,
Float64 epsilon = 0.0) const = 0;
virtual const IString* dump(
const IExpression* expr, const char* name, Size depth = 0) const = 0;
virtual const IString* dump(
const IExpression_list* list, const char* name, Size depth = 0) const = 0;
virtual const IString* dump(
const IAnnotation* annotation, const char* name, Size depth = 0) const = 0;
virtual const IString* dump(
const IAnnotation_block* block, const char* name, Size depth = 0) const = 0;
virtual const IString* dump(
const IAnnotation_list* list, const char* name, Size depth = 0) const = 0;
virtual IExpression* create_cast(
IExpression* src_expr,
const IType* target_type,
const char* cast_db_name,
bool force_cast,
bool direct_call,
Sint32* errors = 0) const = 0;
#ifdef MI_NEURAYLIB_DEPRECATED_15_0
inline IExpression* create_cast(
IExpression* src_expr,
const IType* target_type,
const char* cast_db_name,
bool force_cast,
Sint32* errors = 0) const
{
return create_cast(
src_expr, target_type, cast_db_name, force_cast, false, errors);
}
#endif // MI_NEURAYLIB_DEPRECATED_15_0
virtual IExpression* create_decl_cast(
IExpression* src_expr,
const IType_struct* target_type,
const char* cast_db_name,
bool force_cast,
bool direct_call,
Sint32* errors = 0) const = 0;
};
mi_static_assert( sizeof( IExpression_factory::Comparison_options) == sizeof( mi::Uint32));
// end group mi_neuray_mdl_types
} // namespace neuraylib
} // namespace mi
#endif // MI_NEURAYLIB_IEXPRESSION_H
Namespaces
- namespace
- Common namespace for APIs of NVIDIA Advanced Rendering Center GmbH. More...
- namespace
- Namespace for the neuray API. More...
Classes
- class
- An annotation is similar to a direct call expression, but without return type. More...
- class
- An annotation block is an array of annotations. More...
- class
- An annotation definition. More...
- class
- An ordered collection of annotation blocks identified by name or index. More...
- class
- The interface to MDL expressions. More...
- class
- An indirect call expression. More...
- class
- A constant expression. More...
- class
- A direct call expression. More...
- class
- The interface for creating expressions. More...
- class
- An ordered collection of expressions identified by name or index. More...
- class
- A parameter reference expression. More...
- class
- A temporary reference expression. More...
Enumerations
- enum {MDL_VERSION_1_0, MDL_VERSION_1_1, MDL_VERSION_1_2, MDL_VERSION_1_3, MDL_VERSION_1_4, MDL_VERSION_1_5, MDL_VERSION_1_6, MDL_VERSION_1_7, MDL_VERSION_1_8, MDL_VERSION_1_9, MDL_VERSION_EXP, MDL_VERSION_LATEST = MDL_VERSION_1_9, MDL_VERSION_INVALID = 0xffffffffU, MDL_VERSION_FORCE_32_BIT = 0xffffffffU }
- The MDL version. More...