|
Petr Machata |
f94892 |
Index: /trunk/libs/python/test/enum.py
|
|
Petr Machata |
f94892 |
===================================================================
|
|
Petr Machata |
f94892 |
--- /trunk/libs/python/test/enum.py (revision 36256)
|
|
Petr Machata |
f94892 |
+++ /trunk/libs/python/test/enum.py (revision 53660)
|
|
Petr Machata |
f94892 |
@@ -5,6 +5,6 @@
|
|
Petr Machata |
f94892 |
>>> from enum_ext import *
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
->>> identity(color.red)
|
|
Petr Machata |
f94892 |
-enum_ext.color.red
|
|
Petr Machata |
f94892 |
+>>> identity(color.red) # in case of duplicated enums it always take the last enum
|
|
Petr Machata |
f94892 |
+enum_ext.color.blood
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
>>> identity(color.green)
|
|
Petr Machata |
f94892 |
@@ -14,6 +14,6 @@
|
|
Petr Machata |
f94892 |
enum_ext.color.blue
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
->>> identity(color(1))
|
|
Petr Machata |
f94892 |
-enum_ext.color.red
|
|
Petr Machata |
f94892 |
+>>> identity(color(1)) # in case of duplicated enums it always take the last enum
|
|
Petr Machata |
f94892 |
+enum_ext.color.blood
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
>>> identity(color(2))
|
|
Petr Machata |
f94892 |
@@ -29,5 +29,5 @@
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
>>> identity(red)
|
|
Petr Machata |
f94892 |
-enum_ext.color.red
|
|
Petr Machata |
f94892 |
+enum_ext.color.blood
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
>>> identity(green)
|
|
Petr Machata |
f94892 |
@@ -43,8 +43,16 @@
|
|
Petr Machata |
f94892 |
>>> c = colorized()
|
|
Petr Machata |
f94892 |
>>> c.x
|
|
Petr Machata |
f94892 |
-enum_ext.color.red
|
|
Petr Machata |
f94892 |
+enum_ext.color.blood
|
|
Petr Machata |
f94892 |
>>> c.x = green
|
|
Petr Machata |
f94892 |
>>> c.x
|
|
Petr Machata |
f94892 |
enum_ext.color.green
|
|
Petr Machata |
f94892 |
+>>> red == blood
|
|
Petr Machata |
f94892 |
+True
|
|
Petr Machata |
f94892 |
+>>> red == green
|
|
Petr Machata |
f94892 |
+False
|
|
Petr Machata |
f94892 |
+>>> hash(red) == hash(blood)
|
|
Petr Machata |
f94892 |
+True
|
|
Petr Machata |
f94892 |
+>>> hash(red) == hash(green)
|
|
Petr Machata |
f94892 |
+False
|
|
Petr Machata |
f94892 |
'''
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
Index: /trunk/libs/python/test/enum.cpp
|
|
Petr Machata |
f94892 |
===================================================================
|
|
Petr Machata |
f94892 |
--- /trunk/libs/python/test/enum.cpp (revision 24614)
|
|
Petr Machata |
f94892 |
+++ /trunk/libs/python/test/enum.cpp (revision 53660)
|
|
Petr Machata |
f94892 |
@@ -13,5 +13,5 @@
|
|
Petr Machata |
f94892 |
using namespace boost::python;
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
-enum color { red = 1, green = 2, blue = 4 };
|
|
Petr Machata |
f94892 |
+enum color { red = 1, green = 2, blue = 4, blood = 1 };
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
#if BOOST_WORKAROUND(__MWERKS__, <= 0x2407)
|
|
Petr Machata |
f94892 |
@@ -35,4 +35,5 @@
|
|
Petr Machata |
f94892 |
.value("green", green)
|
|
Petr Machata |
f94892 |
.value("blue", blue)
|
|
Petr Machata |
f94892 |
+ .value("blood", blood)
|
|
Petr Machata |
f94892 |
.export_values()
|
|
Petr Machata |
f94892 |
;
|
|
Petr Machata |
f94892 |
Index: /trunk/libs/python/src/object/enum.cpp
|
|
Petr Machata |
f94892 |
===================================================================
|
|
Petr Machata |
f94892 |
--- /trunk/libs/python/src/object/enum.cpp (revision 41521)
|
|
Petr Machata |
f94892 |
+++ /trunk/libs/python/src/object/enum.cpp (revision 53660)
|
|
Petr Machata |
f94892 |
@@ -15,5 +15,5 @@
|
|
Petr Machata |
f94892 |
#include <structmember.h>
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
-namespace boost { namespace python { namespace objects {
|
|
Petr Machata |
f94892 |
+namespace boost { namespace python { namespace objects {
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
struct enum_object
|
|
Petr Machata |
f94892 |
@@ -44,5 +44,5 @@
|
|
Petr Machata |
f94892 |
if (name == 0)
|
|
Petr Machata |
f94892 |
return 0;
|
|
Petr Machata |
f94892 |
-
|
|
Petr Machata |
f94892 |
+
|
|
Petr Machata |
f94892 |
return PyString_FromFormat("%s.%s.%s", mod, self_->ob_type->tp_name, name);
|
|
Petr Machata |
f94892 |
}
|
|
Petr Machata |
f94892 |
@@ -140,4 +140,5 @@
|
|
Petr Machata |
f94892 |
d["__slots__"] = tuple();
|
|
Petr Machata |
f94892 |
d["values"] = dict();
|
|
Petr Machata |
f94892 |
+ d["names"] = dict();
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
object module_name = module_prefix();
|
|
Petr Machata |
f94892 |
@@ -146,7 +147,7 @@
|
|
Petr Machata |
f94892 |
if (doc)
|
|
Petr Machata |
f94892 |
d["__doc__"] = doc;
|
|
Petr Machata |
f94892 |
-
|
|
Petr Machata |
f94892 |
+
|
|
Petr Machata |
f94892 |
object result = (object(metatype))(name, make_tuple(base), d);
|
|
Petr Machata |
f94892 |
-
|
|
Petr Machata |
f94892 |
+
|
|
Petr Machata |
f94892 |
scope().attr(name) = result;
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
@@ -168,5 +169,5 @@
|
|
Petr Machata |
f94892 |
= const_cast<converter::registration&>(
|
|
Petr Machata |
f94892 |
converter::registry::lookup(id));
|
|
Petr Machata |
f94892 |
-
|
|
Petr Machata |
f94892 |
+
|
|
Petr Machata |
f94892 |
converters.m_class_object = downcast<PyTypeObject>(this->ptr());
|
|
Petr Machata |
f94892 |
converter::registry::insert(to_python, id);
|
|
Petr Machata |
f94892 |
@@ -187,21 +188,22 @@
|
|
Petr Machata |
f94892 |
dict d = extract<dict>(this->attr("values"))();
|
|
Petr Machata |
f94892 |
d[value] = x;
|
|
Petr Machata |
f94892 |
-
|
|
Petr Machata |
f94892 |
+
|
|
Petr Machata |
f94892 |
// Set the name field in the new enum instanec
|
|
Petr Machata |
f94892 |
enum_object* p = downcast<enum_object>(x.ptr());
|
|
Petr Machata |
f94892 |
Py_XDECREF(p->name);
|
|
Petr Machata |
f94892 |
p->name = incref(name.ptr());
|
|
Petr Machata |
f94892 |
+
|
|
Petr Machata |
f94892 |
+ dict names_dict = extract<dict>(this->attr("names"))();
|
|
Petr Machata |
f94892 |
+ names_dict[x.attr("name")] = x;
|
|
Petr Machata |
f94892 |
}
|
|
Petr Machata |
f94892 |
|
|
Petr Machata |
f94892 |
void enum_base::export_values()
|
|
Petr Machata |
f94892 |
{
|
|
Petr Machata |
f94892 |
- dict d = extract<dict>(this->attr("values"))();
|
|
Petr Machata |
f94892 |
- list values = d.values();
|
|
Petr Machata |
f94892 |
+ dict d = extract<dict>(this->attr("names"))();
|
|
Petr Machata |
f94892 |
+ list items = d.items();
|
|
Petr Machata |
f94892 |
scope current;
|
|
Petr Machata |
f94892 |
-
|
|
Petr Machata |
f94892 |
- for (unsigned i = 0, max = len(values); i < max; ++i)
|
|
Petr Machata |
f94892 |
- {
|
|
Petr Machata |
f94892 |
- api::setattr(current, object(values[i].attr("name")), values[i]);
|
|
Petr Machata |
f94892 |
- }
|
|
Petr Machata |
f94892 |
+
|
|
Petr Machata |
f94892 |
+ for (unsigned i = 0, max = len(items); i < max; ++i)
|
|
Petr Machata |
f94892 |
+ api::setattr(current, items[i][0], items[i][1]);
|
|
Petr Machata |
f94892 |
}
|
|
Petr Machata |
f94892 |
|