9#include "pxr/base/vt/api.h"
11PXR_NAMESPACE_OPEN_SCOPE
15struct _ArrayPyOpHelp {
16 static T __add__(T l, T r) {
return l + r; }
17 static T __sub__(T l, T r) {
return l - r; }
18 static T __mul__(T l, T r) {
return l * r; }
19 static T __div__(T l, T r) {
return l / r; }
20 static T __mod__(T l, T r) {
return l % r; }
26struct _ArrayPyOpHelp<bool> {
27 static bool __add__(
bool l,
bool r) {
return l | r; }
28 static bool __sub__(
bool l,
bool r) {
return l ^ r; }
29 static bool __mul__(
bool l,
bool r) {
return l & r; }
30 static bool __div__(
bool l,
bool r) {
return l; }
31 static bool __mod__(
bool l,
bool r) {
return false; }
43#define VTOPERATOR_WRAP_PYTYPE_BASE(op, method, pytype, isRightVer) \
44 template <typename T> static \
45 VtArray<T> method##pytype(VtArray<T> vec, pytype obj) { \
46 size_t length = len(obj); \
47 if (length != vec.size()) { \
48 TfPyThrowValueError("Non-conforming inputs for operator " \
50 return VtArray<T>(); \
52 VtArray<T> ret(vec.size()); \
53 for (size_t i = 0; i < length; ++i) { \
54 if (!extract<T>(obj[i]).check()) \
55 TfPyThrowValueError("Element is of incorrect type."); \
57 ret[i] = _ArrayPyOpHelp<T>:: op ( \
58 (T)extract<T>(obj[i]), vec[i]); \
61 ret[i] = _ArrayPyOpHelp<T>:: op ( \
62 vec[i], (T)extract<T>(obj[i])); \
69#define VTOPERATOR_WRAP_PYTYPE(op, method, pytype) \
70 VTOPERATOR_WRAP_PYTYPE_BASE(op, method, pytype, false)
73#define VTOPERATOR_WRAP_PYTYPE_R(op, method, pytype) \
74 VTOPERATOR_WRAP_PYTYPE_BASE(op, method, pytype, true)
79#define VTOPERATOR_WRAP(lmethod,rmethod) \
80 VTOPERATOR_WRAP_PYTYPE(lmethod,lmethod,tuple) \
81 VTOPERATOR_WRAP_PYTYPE(lmethod,lmethod,list) \
82 VTOPERATOR_WRAP_PYTYPE(lmethod,rmethod,tuple) \
83 VTOPERATOR_WRAP_PYTYPE(lmethod,rmethod,list)
86#define VTOPERATOR_WRAP_NONCOMM(lmethod,rmethod) \
87 VTOPERATOR_WRAP_PYTYPE(lmethod,lmethod,tuple) \
88 VTOPERATOR_WRAP_PYTYPE(lmethod,lmethod,list) \
89 VTOPERATOR_WRAP_PYTYPE_R(lmethod,rmethod,tuple) \
90 VTOPERATOR_WRAP_PYTYPE_R(lmethod,rmethod,list)
93#define VTOPERATOR_WRAPDECLARE_BASE(op,method,rettype) \
95 .def(self op Type()) \
96 .def(Type() op self) \
97 .def(#method,method##tuple<rettype>) \
98 .def(#method,method##list<rettype>)
100#define VTOPERATOR_WRAPDECLARE(op,lmethod,rmethod) \
101 VTOPERATOR_WRAPDECLARE_BASE(op,lmethod,Type) \
102 .def(#rmethod,rmethod##tuple<Type>) \
103 .def(#rmethod,rmethod##list<Type>)
107#define VTOPERATOR_WRAP_PYTYPE_BOOL(func,pytype,op) \
108 VTOPERATOR_WRAP_PYTYPE_BOOL_BASE(func, \
109 VtArray<T> const &vec, pytype const &obj, \
110 (vec[i] op (T)extract<T>(obj[i])) ) \
111 VTOPERATOR_WRAP_PYTYPE_BOOL_BASE(func, \
112 pytype const &obj,VtArray<T> const &vec, \
113 ((T)extract<T>(obj[i]) op vec[i]) )
115#define VTOPERATOR_WRAP_BOOL(func,op) \
116 VTOPERATOR_WRAP_PYTYPE_BOOL(func,list,op) \
117 VTOPERATOR_WRAP_PYTYPE_BOOL(func,tuple,op)
120PXR_NAMESPACE_CLOSE_SCOPE