[pygccxml-commit] SF.net SVN: pygccxml:[1556] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
|
From: <rom...@us...> - 2009-01-11 09:42:11
|
Revision: 1556
http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1556&view=rev
Author: roman_yakovenko
Date: 2009-01-11 09:42:07 +0000 (Sun, 11 Jan 2009)
Log Message:
-----------
adding support for enums for ctypes code generator
Modified Paths:
--------------
pyplusplus_dev/pyplusplus/code_creators/__init__.py
pyplusplus_dev/pyplusplus/code_creators/enum.py
pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py
pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py
pyplusplus_dev/unittests/ctypes_pof_tester.py
pyplusplus_dev/unittests/data/enums_to_be_exported.hpp
pyplusplus_dev/unittests/sconstruct
Added Paths:
-----------
pyplusplus_dev/unittests/data/ctypes/enums/
pyplusplus_dev/unittests/data/ctypes/enums/enums.cpp
pyplusplus_dev/unittests/data/ctypes/enums/enums.h
pyplusplus_dev/unittests/data/ctypes/enums/sconscript
pyplusplus_dev/unittests/data/libconfig.h
Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py
===================================================================
--- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-01-10 21:13:22 UTC (rev 1555)
+++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-01-11 09:42:07 UTC (rev 1556)
@@ -164,3 +164,4 @@
from function_definition import del_definition_t
from function_definition import mem_fun_definition_t
from typedef_as_pyvar import typedef_as_pyvar_t
+from enum import pyenum_t
Modified: pyplusplus_dev/pyplusplus/code_creators/enum.py
===================================================================
--- pyplusplus_dev/pyplusplus/code_creators/enum.py 2009-01-10 21:13:22 UTC (rev 1555)
+++ pyplusplus_dev/pyplusplus/code_creators/enum.py 2009-01-11 09:42:07 UTC (rev 1556)
@@ -5,6 +5,7 @@
import os
import algorithm
+import code_creator
import declaration_based
import registration_based
@@ -36,11 +37,11 @@
return '.value("%(alias)s", %(name)s)' \
% { 'alias' : self.value_aliases.get( value_name, value_name )
, 'name' : algorithm.create_identifier( self, full_name + '::' + value_name ) }
-
+
def _create_impl(self):
if self.declaration.already_exposed:
return ''
-
+
bpl_enum = '%(bpl::enum_)s< %(name)s>("%(alias)s")' \
% { 'bpl::enum_' : algorithm.create_identifier( self, '::boost::python::enum_' )
, 'name' : algorithm.create_identifier( self, self.declaration.decl_string )
@@ -60,9 +61,24 @@
values.append( self._generate_value_code( name ) )
values.append( ';' )
-
+
values = self.indent( os.linesep.join( values ) )
return bpl_enum + os.linesep + values
def _get_system_headers_impl( self ):
return []
+
+
+class pyenum_t( code_creator.code_creator_t, declaration_based.declaration_based_t ):
+ def __init__( self, enum ):
+ code_creator.code_creator_t.__init__( self )
+ declaration_based.declaration_based_t.__init__( self, declaration=enum )
+
+ def _create_impl( self ):
+ result = [ 'class %(alias)s( ctypes_utils.Enumeration ):' % dict( alias=self.alias ) ]
+ for name, value in self.declaration.values:
+ result.append( self.indent( '%(name)s = %(value)s' % dict( name=name, value=value ) ) )
+ return os.linesep.join( result )
+
+ def _get_system_headers_impl( self ):
+ return []
Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py
===================================================================
--- pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2009-01-10 21:13:22 UTC (rev 1555)
+++ pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2009-01-11 09:42:07 UTC (rev 1556)
@@ -134,4 +134,9 @@
def multi_method( self, restype=None ):
return multi_method_registry_t( self, restype )
+
+
+#take a look on http://code.activestate.com/recipes/413486/
+class Enumeration( object ):
+ pass
"""
Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py
===================================================================
--- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-10 21:13:22 UTC (rev 1555)
+++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-11 09:42:07 UTC (rev 1556)
@@ -247,6 +247,12 @@
def visit_enumeration(self):
self.__dependencies_manager.add_exported( self.curr_decl )
+ paretn_cc = None
+ if isinstance( self.curr_decl.parent, declarations.class_t ):
+ paretn_cc = self.__class2introduction[ self.curr_decl.parent ]
+ else:
+ paretn_cc = self.__namespace2pyclass[ self.curr_decl.parent ]
+ paretn_cc.adopt_creator( code_creators.pyenum_t( self.curr_decl ) )
def visit_typedef(self):
self.__dependencies_manager.add_exported( self.curr_decl )
Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py
===================================================================
--- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-10 21:13:22 UTC (rev 1555)
+++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-11 09:42:07 UTC (rev 1556)
@@ -37,6 +37,9 @@
def library_file( self ):
return os.path.join( self.project_dir, 'binaries', self.base_name + '.dll' )
+ def customize(self, mb ):
+ pass
+
def setUp( self ):
if self.base_name in sys.modules:
return sys.modules[ self.base_name ]
@@ -44,6 +47,7 @@
#~ pdb.set_trace()
autoconfig.scons_config.compile( autoconfig.scons.cmd_build + ' ' + self.base_name )
mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml )
+ self.customize( mb )
mb.build_code_creator( self.library_file )
mb.write_module( os.path.join( self.project_dir, 'binaries', self.base_name + '.py' ) )
sys.path.insert( 0, os.path.join( self.project_dir, 'binaries' ) )
@@ -103,11 +107,23 @@
def test_free_fun_add( self ):
self.failUnless( 1977 == self.module_ref.add( 77, 1900 ) )
+
+class enums_tester_t( ctypes_base_tester_t ):
+ def __init__( self, *args, **keywd ):
+ ctypes_base_tester_t.__init__( self, 'enums', *args, **keywd )
+
+ def customize( self, mb ):
+ mb.enums().include()
+
+ def test(self):
+ pass
+
def create_suite():
suite = unittest.TestSuite()
if 'win' in sys.platform:
suite.addTest( unittest.makeSuite(pof_tester_t))
suite.addTest( unittest.makeSuite(issues_tester_t))
+ suite.addTest( unittest.makeSuite(enums_tester_t))
return suite
def run_suite():
Added: pyplusplus_dev/unittests/data/ctypes/enums/enums.cpp
===================================================================
--- pyplusplus_dev/unittests/data/ctypes/enums/enums.cpp (rev 0)
+++ pyplusplus_dev/unittests/data/ctypes/enums/enums.cpp 2009-01-11 09:42:07 UTC (rev 1556)
@@ -0,0 +1 @@
+#include "enums.h"
Added: pyplusplus_dev/unittests/data/ctypes/enums/enums.h
===================================================================
--- pyplusplus_dev/unittests/data/ctypes/enums/enums.h (rev 0)
+++ pyplusplus_dev/unittests/data/ctypes/enums/enums.h 2009-01-11 09:42:07 UTC (rev 1556)
@@ -0,0 +1,2 @@
+#include "enums_to_be_exported.hpp"
+
Added: pyplusplus_dev/unittests/data/ctypes/enums/sconscript
===================================================================
--- pyplusplus_dev/unittests/data/ctypes/enums/sconscript (rev 0)
+++ pyplusplus_dev/unittests/data/ctypes/enums/sconscript 2009-01-11 09:42:07 UTC (rev 1556)
@@ -0,0 +1,7 @@
+Import('*')
+
+target_name = 'enums'
+shlib = env.SharedLibrary( target=target_name
+ , source=[ target_name + '.cpp' ]
+ , CPPPATH=['#data'] )
+env.Alias( target_name, shlib )
Modified: pyplusplus_dev/unittests/data/enums_to_be_exported.hpp
===================================================================
--- pyplusplus_dev/unittests/data/enums_to_be_exported.hpp 2009-01-10 21:13:22 UTC (rev 1555)
+++ pyplusplus_dev/unittests/data/enums_to_be_exported.hpp 2009-01-11 09:42:07 UTC (rev 1556)
@@ -6,22 +6,30 @@
#ifndef __enums_to_be_exported_hpp__
#define __enums_to_be_exported_hpp__
-enum Chisla{ nol, odin, dva, tri };
+#include "libconfig.h"
-namespace enums{
+enum EXPORT_SYMBOL Chisla{ nol, odin, dva, tri };
-enum color{
+namespace enums{
+
+enum EXPORT_SYMBOL color{
red = 1
, green = 2
- , blue = 4 };
+ , blue = 4 };
-enum numbers{
+enum EXPORT_SYMBOL numbers{
zero = 0
, noll = 0
};
-
-inline int to_int( int x=red ){ return x; }
+struct EXPORT_SYMBOL struct_with_enum{
+ enum fruits{
+ lemon, orange, apple
+ };
+};
+
+inline int EXPORT_SYMBOL to_int( int x=red ){ return x; }
+
}
Added: pyplusplus_dev/unittests/data/libconfig.h
===================================================================
--- pyplusplus_dev/unittests/data/libconfig.h (rev 0)
+++ pyplusplus_dev/unittests/data/libconfig.h 2009-01-11 09:42:07 UTC (rev 1556)
@@ -0,0 +1,15 @@
+#if defined _WIN32 || defined __CYGWIN__
+ #define IMPORT_SYMBOL __declspec(dllimport)
+ #define EXPORT_SYMBOL __declspec(dllexport)
+ #define PRIVATE_SYMBOL
+#else
+ #if __GNUC__ >= 4
+ #define IMPORT_SYMBOL __attribute__ ((visibility("default")))
+ #define EXPORT_SYMBOL __attribute__ ((visibility("default")))
+ #define PRIVATE_SYMBOL __attribute__ ((visibility("hidden")))
+ #else
+ #define IMPORT_SYMBOL
+ #define EXPORT_SYMBOL
+ #define PRIVATE_SYMBOL
+ #endif
+#endif
Modified: pyplusplus_dev/unittests/sconstruct
===================================================================
--- pyplusplus_dev/unittests/sconstruct 2009-01-10 21:13:22 UTC (rev 1555)
+++ pyplusplus_dev/unittests/sconstruct 2009-01-11 09:42:07 UTC (rev 1556)
@@ -11,7 +11,7 @@
env.AppendUnique( CCFLAGS=[ r"/MD",r"/EHsc",r"/GR",r"/Zc:wchar_t",r"/Zc:forScope" ] )
env.AppendUnique( LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] )
-scripts = [ 'pof', 'issues' ]
+scripts = [ 'pof', 'issues', 'enums' ]
for s in scripts:
SConscript( 'data/ctypes/%s/sconscript' % s
, variant_dir='data/ctypes/%s/binaries' % s
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|