7#ifndef PXR_BASE_TF_PY_OPTIONAL_H
8#define PXR_BASE_TF_PY_OPTIONAL_H
15#include "pxr/external/boost/python/converter/from_python.hpp"
16#include "pxr/external/boost/python/extract.hpp"
17#include "pxr/external/boost/python/to_python_converter.hpp"
18#include "pxr/external/boost/python/to_python_value.hpp"
22PXR_NAMESPACE_OPEN_SCOPE
27namespace TfPyOptional {
29template <
typename T,
typename TfromPy>
30struct object_from_python
32 object_from_python() {
33 pxr_boost::python::converter::registry::push_back
34 (&TfromPy::convertible, &TfromPy::construct,
35 pxr_boost::python::type_id<T>());
39template <
typename T,
typename TtoPy,
typename TfromPy>
40struct register_python_conversion
42 register_python_conversion() {
43 pxr_boost::python::to_python_converter<T, TtoPy>();
44 object_from_python<T, TfromPy>();
51 python_optional(
const python_optional&) =
delete;
52 python_optional& operator=(
const python_optional&) =
delete;
53 template <
typename Optional>
54 struct optional_to_python
56 static PyObject * convert(
const Optional& value)
59 pxr_boost::python::object obj =
TfPyObject(*value);
63 return pxr_boost::python::detail::none();
67 template <
typename Optional>
68 struct optional_from_python
70 static void * convertible(PyObject * source)
72 using namespace pxr_boost::python::converter;
74 if ((source == Py_None) || pxr_boost::python::extract<T>(source).check())
80 static void construct(PyObject * source,
81 pxr_boost::python::converter::rvalue_from_python_stage1_data * data)
83 using namespace pxr_boost::python::converter;
85 void *
const storage =
86 ((rvalue_from_python_storage<T> *)data)->storage.bytes;
88 if (data->convertible == Py_None) {
89 new (storage) Optional();
91 new (storage) Optional(pxr_boost::python::extract<T>(source));
94 data->convertible = storage;
98 explicit python_optional() {
99 register_python_conversion<
101 optional_to_python<std::optional<T>>,
102 optional_from_python<std::optional<T>>>();
108PXR_NAMESPACE_CLOSE_SCOPE
Miscellaneous Utilities for dealing with script.
pxr_boost::python::object TfPyObject(T const &t, bool complainOnFailure=true)
Return a python object for the given C++ object, loading the appropriate wrapper code if necessary.