7#ifndef PXR_BASE_VT_VALUE_FROM_PYTHON_H
8#define PXR_BASE_VT_VALUE_FROM_PYTHON_H
13#include "pxr/base/vt/api.h"
14#include "pxr/base/vt/value.h"
17#include "pxr/base/tf/hashmap.h"
25PXR_NAMESPACE_OPEN_SCOPE
29class Vt_ValueFromPythonRegistry {
32 static bool HasConversions() {
33 return !_GetInstance()._lvalueExtractors.empty() &&
34 !_GetInstance()._rvalueExtractors.empty();
37 VT_API
static VtValue Invoke(PyObject *obj);
40 static void Register(
bool registerRvalue) {
42 TF_FATAL_ERROR(
"Tried to register a VtValue from python conversion "
43 "but python is not initialized!");
45 _GetInstance()._RegisterLValue(_Extractor::MakeLValue<T>());
47 _GetInstance()._RegisterRValue(_Extractor::MakeRValue<T>());
50 Vt_ValueFromPythonRegistry(Vt_ValueFromPythonRegistry
const&) =
delete;
51 Vt_ValueFromPythonRegistry& operator=(
52 Vt_ValueFromPythonRegistry
const&) =
delete;
54 Vt_ValueFromPythonRegistry(Vt_ValueFromPythonRegistry &&) =
delete;
55 Vt_ValueFromPythonRegistry& operator=(
56 Vt_ValueFromPythonRegistry &&) =
delete;
59 Vt_ValueFromPythonRegistry() {}
60 VT_API ~Vt_ValueFromPythonRegistry();
62 friend class TfSingleton<Vt_ValueFromPythonRegistry>;
66 using _ExtractFunc =
VtValue (*)(PyObject *);
72 static VtValue _ExtractLValue(PyObject *);
78 static VtValue _ExtractRValue(PyObject *);
83 static _Extractor MakeLValue() {
84 return _Extractor(&_ExtractLValue<T>);
88 static _Extractor MakeRValue() {
89 return _Extractor(&_ExtractRValue<T>);
92 VtValue Invoke(PyObject *obj)
const {
97 explicit _Extractor(_ExtractFunc extract) : _extract(extract) {}
99 _ExtractFunc _extract;
102 VT_API
static Vt_ValueFromPythonRegistry &_GetInstance() {
106 VT_API
void _RegisterLValue(_Extractor
const &e);
107 VT_API
void _RegisterRValue(_Extractor
const &e);
109 std::vector<_Extractor> _lvalueExtractors;
110 std::vector<_Extractor> _rvalueExtractors;
112 typedef TfHashMap<PyObject *, _Extractor, TfHash> _LValueExtractorCache;
113 _LValueExtractorCache _lvalueExtractorCache;
120VtValue Vt_ValueFromPythonRegistry::
121_Extractor::_ExtractLValue(PyObject *obj) {
122 pxr_boost::python::extract<T &> x(obj);
129VtValue Vt_ValueFromPythonRegistry::
130_Extractor::_ExtractRValue(PyObject *obj) {
131 pxr_boost::python::extract<T> x(obj);
138void VtValueFromPython() {
139 Vt_ValueFromPythonRegistry::Register<T>(
true);
143void VtValueFromPythonLValue() {
144 Vt_ValueFromPythonRegistry::Register<T>(
false);
147PXR_NAMESPACE_CLOSE_SCOPE
Miscellaneous Utilities for dealing with script.
TF_API bool TfPyIsInitialized()
Returns true if python is initialized.
Manage a single instance of an object (see.
static T & GetInstance()
Return a reference to an object of type T, creating it if necessary.
Provides a container which may hold any type, and provides introspection and iteration over array typ...
#define TF_FATAL_ERROR(fmt, args)
Issue a fatal error and end the program.
Intended to replace a direct include of Python.h, which causes several build problems with certain co...
Manage a single instance of an object.