Revision: 1555
http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1555&view=rev
Author: roman_yakovenko
Date: 2009-01-10 21:13:22 +0000 (Sat, 10 Jan 2009)
Log Message:
-----------
adding gmp example
Added Paths:
-----------
pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py
pyplusplus_dev/examples/gmplib_dev/dev/project_env.py
pyplusplus_dev/examples/gmplib_dev/pygmplib/ctypes_utils.py
pyplusplus_dev/examples/gmplib_dev/test.py
Added: pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py
===================================================================
--- pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py (rev 0)
+++ pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py 2009-01-10 21:13:22 UTC (rev 1555)
@@ -0,0 +1,32 @@
+import os
+import sys
+
+import project_env
+
+from pygccxml import utils
+from pygccxml import parser
+from pygccxml import declarations
+from pyplusplus.module_builder import ctypes_module_builder_t
+
+
+gccxml_cfg = parser.gccxml_configuration_t( gccxml_path=project_env.settings.gccxml_path )
+
+mb = ctypes_module_builder_t( [project_env.gmp.header_file], project_env.gmp.symbols_file, gccxml_cfg )
+
+#there is a bug in the code generator
+has_varargs = lambda f: f.arguments \
+ and isinstance( f.arguments[-1].type, declarations.ellipsis_t )
+
+mb.calldefs( has_varargs ).exclude()
+mb.classes( '' ).exclude()
+
+#gmp uses strange convention: every function name starts with __gmp and than, it
+#introduces define, which aliass __gmpy to gmpy
+for f in mb.calldefs( lambda x: x.name.startswith('__gmp') ):
+ f.alias = f.name[2:]
+#enums
+
+#~ mb.print_declarations()
+mb.build_code_creator( project_env.gmp.shared_library_file )
+mb.write_module( os.path.join( project_env.gmp.generated_code_dir, '__init__.py' ) )
+
Added: pyplusplus_dev/examples/gmplib_dev/dev/project_env.py
===================================================================
--- pyplusplus_dev/examples/gmplib_dev/dev/project_env.py (rev 0)
+++ pyplusplus_dev/examples/gmplib_dev/dev/project_env.py 2009-01-10 21:13:22 UTC (rev 1555)
@@ -0,0 +1,11 @@
+import os
+import sys
+sys.path.append( os.path.join( '..', '..' ) )
+
+from environment import settings, complete_path
+
+class gmp:
+ header_file = '/usr/include/gmp.h'
+ symbols_file = '/usr/lib/libgmp.so.3.4.2'
+ shared_library_file = '/usr/lib/libgmp.so.3.4.2'
+ generated_code_dir = complete_path( 'pyplusplus_dev', 'examples', 'gmplib_dev', 'pygmplib' )
Added: pyplusplus_dev/examples/gmplib_dev/pygmplib/ctypes_utils.py
===================================================================
--- pyplusplus_dev/examples/gmplib_dev/pygmplib/ctypes_utils.py (rev 0)
+++ pyplusplus_dev/examples/gmplib_dev/pygmplib/ctypes_utils.py 2009-01-10 21:13:22 UTC (rev 1555)
@@ -0,0 +1,131 @@
+# This file has been generated by Py++.
+
+# Copyright 2004-2008 Roman Yakovenko.
+# Distributed under the Boost Software License, Version 1.0. (See
+# accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+import os
+import ctypes
+
+# what is the best way to treat overloaded constructors
+class native_callable( object ):
+ def __init__(self, dll, name, restype=None, argtypes=None ):
+ self.name = name
+ self.func = getattr( dll, dll.undecorated_names[name] )
+ self.func.restype = restype
+ self.func.argtypes = argtypes
+
+ def __call__(self, *args, **keywd ):
+ return self.func( *args, **keywd )
+
+class native_overloaded_callable( object ):
+ def __init__(self, functions ):
+ self.__functions = functions
+
+ def __call__( self, *args ):
+ types = None
+ if args:
+ types = tuple(arg.__class__ for arg in args)
+ f = self.__functions.get(types)
+ if f is None:
+ msg = ['Unable to find a function that match the arguments you passed.']
+ msg.append( 'First argument type is "this" type.' )
+ msg.append( 'This function call argument types: ' + str( types ) )
+ msg.append( 'Registered methods argument types: ' )
+ for key in self.__functions.iterkeys():
+ msg.append(' ' + str(key))
+ raise TypeError(os.linesep.join(msg))
+ else:
+ return f(*args)
+
+class multi_method_registry_t:
+ def __init__( self, factory, restype ):
+ self.factory = factory
+ self.restype = restype
+ self.__functions = {}
+
+ def register( self, callable_or_name, argtypes=None ):
+ if isinstance( callable_or_name, native_callable ):
+ callable = callable_or_name
+ else:
+ name = callable_or_name
+ callable = self.factory( name, restype=self.restype, argtypes=argtypes )
+ self.__functions[ tuple(callable.func.argtypes) ] = callable.func
+ return self
+
+ def finalize(self):
+ return native_overloaded_callable( self.__functions )
+
+
+class mem_fun_factory( object ):
+ def __init__( self, dll, wrapper, class_name, namespace='' ):
+ self.dll = dll
+ self.namespace = namespace
+ self.class_name = class_name
+ self.this_type = ctypes.POINTER( wrapper )
+
+ def __call__( self, name, **keywd ):
+ if 'argtypes' not in keywd or keywd['argtypes'] is None:
+ keywd['argtypes'] = [ self.this_type ]
+ else:
+ keywd['argtypes'].insert( 0, self.this_type )
+ return native_callable( self.dll, name, **keywd )
+
+ def __get_ns_name(self):
+ if self.namespace:
+ return self.namespace + '::'
+ else:
+ return ''
+
+ def default_constructor( self ):
+ return self( '%(ns)s%(class_name)s::%(class_name)s(void)'
+ % dict( ns=self.__get_ns_name()
+ , class_name=self.class_name ) )
+
+ def constructor( self, argtypes_str, **keywd ):
+ return self( '%(ns)s%(class_name)s::%(class_name)s(%(args)s)'
+ % dict( ns=self.__get_ns_name()
+ , class_name=self.class_name
+ , args=argtypes_str )
+ , **keywd )
+
+ def copy_constructor( self ):
+ return self( '%(ns)s%(class_name)s::%(class_name)s(%(ns)s%(class_name)s const &)'
+ % dict( ns=self.__get_ns_name()
+ , class_name=self.class_name )
+ , argtypes=[self.this_type] )
+
+ def destructor( self, is_virtual=False ):
+ virtuality = ''
+ if is_virtual:
+ virtuality = 'virtual '
+ return self( '%(virtuality)s%(ns)s%(class_name)s::~%(class_name)s(void)'
+ % dict( ns=self.__get_ns_name()
+ , virtuality=virtuality
+ , class_name=self.class_name ) )
+
+ def operator_assign( self ):
+ return self( '%(ns)s%(class_name)s & %(class_name)s::operator=(%(class_name)s const &)'
+ % dict( ns=self.__get_ns_name()
+ , class_name=self.class_name )
+ , restype=self.this_type
+ , argtypes=[self.this_type] )
+
+ def method( self, name, restype_str=None, argtypes_str=None, **keywd ):
+ if None is restype_str:
+ restype_str = 'void'
+ if None is argtypes_str:
+ argtypes_str = 'void'
+
+ return self( '%(return_)s %(ns)s%(class_name)s::%(method_name)s(%(args)s)'
+ % dict( return_=restype_str
+ , ns=self.__get_ns_name()
+ , class_name=self.class_name
+ , method_name=name
+ , args=argtypes_str )
+ , **keywd )
+
+ def multi_method( self, restype=None ):
+ return multi_method_registry_t( self, restype )
+
Added: pyplusplus_dev/examples/gmplib_dev/test.py
===================================================================
--- pyplusplus_dev/examples/gmplib_dev/test.py (rev 0)
+++ pyplusplus_dev/examples/gmplib_dev/test.py 2009-01-10 21:13:22 UTC (rev 1555)
@@ -0,0 +1,4 @@
+import pygmplib as gmp
+
+mpz = gmp.__mpz_struct()
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|