diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-02-15 03:26:31 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-02-15 06:01:59 +0300 |
commit | a9d979c8ef2b6de25c1953da341dd5e207416540 (patch) | |
tree | 8647bedb1815977967694b302e9d6d2fd98573e6 /source/blender/python/mathutils/mathutils.c | |
parent | ce85aef0d9f2df094f2859236dc75a2c7f70bfcd (diff) |
mathutils: add freeze() method, is_frozen attr
This allows you to make any mathutils object immutable.
Diffstat (limited to 'source/blender/python/mathutils/mathutils.c')
-rw-r--r-- | source/blender/python/mathutils/mathutils.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c index ca20f837b4a..28b2d26d3fd 100644 --- a/source/blender/python/mathutils/mathutils.c +++ b/source/blender/python/mathutils/mathutils.c @@ -452,6 +452,13 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index) return -1; } +void _BaseMathObject_RaiseFrozenExc(const BaseMathObject *self) +{ + PyErr_Format(PyExc_TypeError, + "%s is frozen (immutable)", + Py_TYPE(self)->tp_name); +} + /* BaseMathObject generic functions for all mathutils types */ char BaseMathObject_owner_doc[] = "The item this is wrapping or None (read-only)."; PyObject *BaseMathObject_owner_get(BaseMathObject *self, void *UNUSED(closure)) @@ -466,6 +473,33 @@ PyObject *BaseMathObject_is_wrapped_get(BaseMathObject *self, void *UNUSED(closu return PyBool_FromLong((self->flag & BASE_MATH_FLAG_IS_WRAP) != 0); } +char BaseMathObject_is_frozen_doc[] = "True when this object has been frozen (read-only).\n\n:type: boolean"; +PyObject *BaseMathObject_is_frozen_get(BaseMathObject *self, void *UNUSED(closure)) +{ + return PyBool_FromLong((self->flag & BASE_MATH_FLAG_IS_FROZEN) != 0); +} + +char BaseMathObject_freeze_doc[] = +".. function:: freeze()\n" +"\n" +" Make this object immutable.\n" +"\n" +" After this the object can be hashed, used in dictionaries & sets.\n" +"\n" +" :return: An instance of this object.\n" +; +PyObject *BaseMathObject_freeze(BaseMathObject *self) +{ + if (self->flag & BASE_MATH_FLAG_IS_WRAP) { + PyErr_SetString(PyExc_TypeError, "Cannot freeze wrapped data"); + return NULL; + } + + self->flag |= BASE_MATH_FLAG_IS_FROZEN; + + return Py_INCREF_RET((PyObject *)self);; +} + int BaseMathObject_traverse(BaseMathObject *self, visitproc visit, void *arg) { Py_VISIT(self->cb_user); |