7#ifndef PXR_BASE_TF_PY_OPTIONAL_H
8#define PXR_BASE_TF_PY_OPTIONAL_H
15#include <boost/optional.hpp>
16#include <boost/python/converter/from_python.hpp>
17#include <boost/python/extract.hpp>
18#include <boost/python/to_python_converter.hpp>
19#include <boost/python/to_python_value.hpp>
23PXR_NAMESPACE_OPEN_SCOPE
28namespace TfPyOptional {
30template <
typename T,
typename TfromPy>
31struct object_from_python
33 object_from_python() {
34 boost::python::converter::registry::push_back
35 (&TfromPy::convertible, &TfromPy::construct,
36 boost::python::type_id<T>());
40template <
typename T,
typename TtoPy,
typename TfromPy>
41struct register_python_conversion
43 register_python_conversion() {
44 boost::python::to_python_converter<T, TtoPy>();
45 object_from_python<T, TfromPy>();
52 python_optional(
const python_optional&) =
delete;
53 python_optional& operator=(
const python_optional&) =
delete;
54 template <
typename Optional>
55 struct optional_to_python
57 static PyObject * convert(
const Optional& value)
60 boost::python::object obj =
TfPyObject(*value);
64 return boost::python::detail::none();
68 template <
typename Optional>
69 struct optional_from_python
71 static void * convertible(PyObject * source)
73 using namespace boost::python::converter;
75 if ((source == Py_None) || boost::python::extract<T>(source).check())
81 static void construct(PyObject * source,
82 boost::python::converter::rvalue_from_python_stage1_data * data)
84 using namespace boost::python::converter;
86 void *
const storage =
87 ((rvalue_from_python_storage<T> *)data)->storage.bytes;
89 if (data->convertible == Py_None) {
90 new (storage) Optional();
92 new (storage) Optional(boost::python::extract<T>(source));
95 data->convertible = storage;
99 explicit python_optional() {
100 register_python_conversion<
102 optional_to_python<std::optional<T>>,
103 optional_from_python<std::optional<T>>>();
104 register_python_conversion<
106 optional_to_python<boost::optional<T>>,
107 optional_from_python<boost::optional<T>>>();
113PXR_NAMESPACE_CLOSE_SCOPE
Miscellaneous Utilities for dealing with script.
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.