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