Loading...
Searching...
No Matches
pyObjectFinder.h
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the Apache License, Version 2.0 (the "Apache License")
5// with the following modification; you may not use this file except in
6// compliance with the Apache License and the following modification to it:
7// Section 6. Trademarks. is deleted and replaced with:
8//
9// 6. Trademarks. This License does not grant permission to use the trade
10// names, trademarks, service marks, or product names of the Licensor
11// and its affiliates, except as required to comply with Section 4(c) of
12// the License and to reproduce the content of the NOTICE file.
13//
14// You may obtain a copy of the Apache License at
15//
16// http://www.apache.org/licenses/LICENSE-2.0
17//
18// Unless required by applicable law or agreed to in writing, software
19// distributed under the Apache License with the above modification is
20// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21// KIND, either express or implied. See the Apache License for the specific
22// language governing permissions and limitations under the Apache License.
23//
24#ifndef PXR_BASE_TF_PY_OBJECT_FINDER_H
25#define PXR_BASE_TF_PY_OBJECT_FINDER_H
26
27#include "pxr/pxr.h"
28
29#include "pxr/base/tf/api.h"
30#include "pxr/base/tf/pyIdentity.h"
31
32#include <boost/python/handle.hpp>
33#include <boost/python/object.hpp>
34
35#include <typeinfo>
36
37PXR_NAMESPACE_OPEN_SCOPE
38
39struct Tf_PyObjectFinderBase {
40 TF_API virtual ~Tf_PyObjectFinderBase();
41 virtual boost::python::object Find(void const *objPtr) const = 0;
42};
43
44template <class T, class PtrType>
45struct Tf_PyObjectFinder : public Tf_PyObjectFinderBase {
46 virtual ~Tf_PyObjectFinder() {}
47 virtual boost::python::object Find(void const *objPtr) const {
48 using namespace boost::python;
49 TfPyLock lock;
50 void *p = const_cast<void *>(objPtr);
51 PyObject *obj = Tf_PyGetPythonIdentity(PtrType(static_cast<T *>(p)));
52 return obj ? object(handle<>(obj)) : object();
53 }
54};
55
56TF_API
57void Tf_RegisterPythonObjectFinderInternal(std::type_info const &type,
58 Tf_PyObjectFinderBase const *finder);
59
60template <class T, class PtrType>
61void Tf_RegisterPythonObjectFinder() {
62 Tf_RegisterPythonObjectFinderInternal(typeid(T),
63 new Tf_PyObjectFinder<T, PtrType>());
64}
65
66TF_API boost::python::object
67Tf_FindPythonObject(void const *objPtr, std::type_info const &type);
68
69PXR_NAMESPACE_CLOSE_SCOPE
70
71#endif // PXR_BASE_TF_PY_OBJECT_FINDER_H
Convenience class for accessing the Python Global Interpreter Lock.
Definition: pyLock.h:122