24#ifndef PXR_USD_SDF_PY_CHILDREN_VIEW_H
25#define PXR_USD_SDF_PY_CHILDREN_VIEW_H
34#include <boost/python.hpp>
36PXR_NAMESPACE_OPEN_SCOPE
39class SdfPyWrapChildrenView {
42 typedef typename View::ChildPolicy ChildPolicy;
43 typedef typename View::Predicate Predicate;
44 typedef typename View::key_type key_type;
45 typedef typename View::value_type value_type;
46 typedef typename View::const_iterator const_iterator;
47 typedef SdfPyWrapChildrenView<View> This;
49 SdfPyWrapChildrenView()
51 TfPyWrapOnce<View>(&This::_Wrap);
56 static boost::python::object Get(
const View& x,
const const_iterator& i)
58 return boost::python::make_tuple(x.key(i), *i);
63 static boost::python::object Get(
const View& x,
const const_iterator& i)
65 return boost::python::object(x.key(i));
69 struct _ExtractValue {
70 static boost::python::object Get(
const View& x,
const const_iterator& i)
72 return boost::python::object(*i);
79 _Iterator(
const boost::python::object&
object) :
81 _owner(boost::python::extract<const View&>(object)),
88 _Iterator<E> GetCopy()
const
93 boost::python::object GetNext()
98 boost::python::object result = E::Get(_owner, _cur);
104 boost::python::object _object;
112 using namespace boost::python;
114 std::string name = _GetName();
121 class_<View>(name.c_str(), no_init)
122 .def(
"__repr__", &This::_GetRepr)
123 .def(
"__len__", &View::size)
124 .def(
"__getitem__", &This::_GetItemByKey)
125 .def(
"__getitem__", &This::_GetItemByIndex)
126 .def(
"get", &This::_PyGet)
127 .def(
"__contains__", &This::_HasKey)
128 .def(
"__contains__", &This::_HasValue)
129 .def(
"__iter__", &This::_GetValueIterator)
130 .def(
"items", &This::_GetItemIterator)
131 .def(
"keys", &This::_GetKeyIterator)
132 .def(
"values", &This::_GetValueIterator)
133 .def(
"index", &This::_FindIndexByKey)
134 .def(
"index", &This::_FindIndexByValue)
139 class_<_Iterator<_ExtractItem> >
140 ((name +
"_Iterator").c_str(), no_init)
141 .def(
"__iter__", &This::template _Iterator<_ExtractItem>::GetCopy)
142 .def(
"__next__", &This::template _Iterator<_ExtractItem>::GetNext)
145 class_<_Iterator<_ExtractKey> >
146 ((name +
"_KeyIterator").c_str(), no_init)
147 .def(
"__iter__", &This::template _Iterator<_ExtractKey>::GetCopy)
148 .def(
"__next__", &This::template _Iterator<_ExtractKey>::GetNext)
151 class_<_Iterator<_ExtractValue> >
152 ((name +
"_ValueIterator").c_str(), no_init)
153 .def(
"__iter__", &This::template _Iterator<_ExtractValue>::GetCopy)
154 .def(
"__next__", &This::template _Iterator<_ExtractValue>::GetNext)
158 static std::string _GetName()
160 std::string name =
"ChildrenView_" +
161 ArchGetDemangled<ChildPolicy>() +
"_" +
162 ArchGetDemangled<Predicate>();
171 static std::string _GetRepr(
const View& x)
173 std::string result(
"{");
175 const_iterator i = x.begin(), n = x.end();
185 static value_type _GetItemByKey(
const View& x,
const key_type& key)
187 const_iterator i = x.find(key);
197 static value_type _GetItemByIndex(
const View& x,
size_t index)
199 if (index >= x.size()) {
205 static boost::python::object _PyGet(
const View& x,
const key_type& key)
207 const_iterator i = x.find(key);
208 return i == x.end() ? boost::python::object() :
209 boost::python::object(*i);
212 static bool _HasKey(
const View& x,
const key_type& key)
214 return x.find(key) != x.end();
217 static bool _HasValue(
const View& x,
const value_type& value)
219 return x.find(value) != x.end();
223 _Iterator<_ExtractItem> _GetItemIterator(
const boost::python::object& x)
225 return _Iterator<_ExtractItem>(x);
229 _Iterator<_ExtractKey> _GetKeyIterator(
const boost::python::object& x)
231 return _Iterator<_ExtractKey>(x);
235 _Iterator<_ExtractValue> _GetValueIterator(
const boost::python::object& x)
237 return _Iterator<_ExtractValue>(x);
241 static boost::python::list _Get(
const View& x)
243 boost::python::list result;
244 for (const_iterator i = x.begin(), n = x.end(); i != n; ++i) {
245 result.append(E::Get(x, i));
250 static int _FindIndexByKey(
const View& x,
const key_type& key)
252 size_t i = std::distance(x.begin(), x.find(key));
253 return i == x.size() ? -1 : i;
256 static int _FindIndexByValue(
const View& x,
const value_type& value)
258 size_t i = std::distance(x.begin(), x.find(value));
259 return i == x.size() ? -1 : i;
263PXR_NAMESPACE_CLOSE_SCOPE
Miscellaneous Utilities for dealing with script.
TF_API void TfPyThrowIndexError(const char *msg)
Raises a Python IndexError with the given error msg and throws a boost::python::error_already_set exc...
TF_API void TfPyThrowStopIteration(const char *msg)
Raises a Python StopIteration with the given error msg and throws a boost::python::error_already_set ...
std::string TfPyRepr(T const &t)
Return repr(t).
Demangle C++ typenames generated by the typeid() facility.
TF_API std::string TfStringReplace(const std::string &source, const std::string &from, const std::string &to)
Replaces all occurrences of string from with to in source.
Definitions of basic string utilities in tf.