Thread: [pygccxml-commit] SF.net SVN: pygccxml:[1411] pyplusplus_dev/pyplusplus
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-09-05 19:39:54
|
Revision: 1411 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1411&view=rev Author: roman_yakovenko Date: 2008-09-05 19:39:55 +0000 (Fri, 05 Sep 2008) Log Message: ----------- small refactoring to improve no_init handling Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2008-09-03 12:01:18 UTC (rev 1410) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2008-09-05 19:39:55 UTC (rev 1411) @@ -217,38 +217,18 @@ if self.documentation: result.append( ', %s' % self.documentation ) used_init = None - inits = filter( lambda x: isinstance( x, calldef.constructor_t ), self.creators ) - has_nonpublic_destructor = declarations.has_destructor( self.declaration ) \ - and not declarations.has_public_destructor( self.declaration ) - - #select all public constructors and exclude copy constructor - cs = self.declaration.constructors( lambda c: not c.is_copy_constructor and c.access_type == 'public' - , recursive=False, allow_empty=True ) - has_suitable_constructor = bool( cs ) - if cs and len(cs) == 1 and cs[0].is_trivial_constructor and self.declaration.find_noncopyable_vars(): - has_suitable_constructor = False + inits = filter( lambda x: isinstance( x, calldef.constructor_t ), self.creators ) trivial_constructor = self.declaration.find_trivial_constructor() - - if has_nonpublic_destructor \ - or ( self.declaration.is_abstract and not self.wrapper ) \ - or not has_suitable_constructor: + + if self.declaration.no_init: result.append( ", " ) result.append( algorithm.create_identifier( self, '::boost::python::no_init' ) ) - elif not trivial_constructor or trivial_constructor.access_type != 'public': + else: if inits: used_init = inits[0] result.append( ", " ) result.append( used_init.create_init_code() ) - elif self.declaration.indexing_suite: - pass #in this case all constructors are exposed by indexing suite - else:#it is possible to class to have public accessed constructor - #that could not be exported by boost.python library - #for example constructor takes as argument pointer to function - result.append( ", " ) - result.append( algorithm.create_identifier( self, '::boost::python::no_init' ) ) - else: - pass result.append( ' )' ) return ( ''.join( result ), used_init ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-09-03 12:01:18 UTC (rev 1410) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-09-05 19:39:55 UTC (rev 1411) @@ -196,6 +196,7 @@ self._expose_this = None self._expose_sizeof = None self._fake_constructors = [] + self._no_init = None @property def fake_constructors(self): @@ -685,3 +686,38 @@ return False else: return True + + def _get_no_init( self ): + if None is self._no_init and False == bool( self.indexing_suite ): + #select all public constructors and exclude copy constructor + cs = self.constructors( lambda c: not c.is_copy_constructor and c.access_type == 'public' + , recursive=False, allow_empty=True ) + + has_suitable_constructor = bool( cs ) + if cs and len(cs) == 1 and cs[0].is_trivial_constructor and self.find_noncopyable_vars(): + has_suitable_constructor = False + + has_nonpublic_destructor = declarations.has_destructor( self ) \ + and not declarations.has_public_destructor( self ) + + trivial_constructor = self.find_trivial_constructor() + + if has_nonpublic_destructor \ + or ( self.is_abstract and not self.is_wrapper_needed() ) \ + or not has_suitable_constructor: + self._no_init = True + elif not trivial_constructor or trivial_constructor.access_type != 'public': + exportable_cs = filter( lambda c: c.exportable and c.ignore == False + , cs ) + if not exportable_cs: + self._no_init = True + else: + pass + if None is self._no_init: + self._no_init = False + return self._no_init + def _set_no_init( self, value ): + self._no_init = value + + no_init = property( _get_no_init, _set_no_init + , doc="If True, class will be registered with 'boost::python::no_init'" ) \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-11-24 20:22:37
|
Revision: 1453 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1453&view=rev Author: roman_yakovenko Date: 2008-11-24 20:22:35 +0000 (Mon, 24 Nov 2008) Log Message: ----------- fixing 64 bit issues in ctypes integration functionality Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/global_variable.py pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py Modified: pyplusplus_dev/pyplusplus/code_creators/global_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/global_variable.py 2008-11-24 07:52:15 UTC (rev 1452) +++ pyplusplus_dev/pyplusplus/code_creators/global_variable.py 2008-11-24 20:22:35 UTC (rev 1453) @@ -177,7 +177,7 @@ #TODO: porting to 64Bit is welcome result.append( algorithm.create_identifier( self, '::boost::python::scope' ) ) result.append( '().attr("%s")' % self.alias ) - result.append( ' = boost::uint32_t( boost::addressof( %s ) );' % self.decl_identifier ) + result.append( ' = size_t( boost::addressof( %s ) );' % self.decl_identifier ) return ''.join( result ) def _get_system_headers_impl( self ): Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-11-24 07:52:15 UTC (rev 1452) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-11-24 20:22:35 UTC (rev 1453) @@ -25,7 +25,6 @@ #include "boost/utility/addressof.hpp" #include "boost/mpl/vector.hpp" #include "boost/function.hpp" -#include "boost/cstdint.hpp" #include "boost/type.hpp" #include "boost/bind.hpp" @@ -33,23 +32,23 @@ namespace pyplusplus{ namespace convenience{ template< typename TType, typename TMemVarType > -boost::uint32_t +size_t addressof( const TType* inst_ptr, const TMemVarType TType::* offset){ if( !inst_ptr ){ throw std::runtime_error( "unable to dereference null pointer" ); } const TType& inst = *inst_ptr; - return boost::uint32_t( boost::addressof( inst.*offset ) ); + return size_t( boost::addressof( inst.*offset ) ); } template< typename TType > -boost::uint32_t +size_t addressof_inst( const TType* inst_ptr){ if( !inst_ptr ){ throw std::runtime_error( "unable to dereference null pointer" ); } - return boost::uint32_t( inst_ptr ); + return size_t( inst_ptr ); } template< typename TType, typename TMemVarType > @@ -59,7 +58,7 @@ namespace pyppc = pyplusplus::convenience; return bpl::make_function( boost::bind( &pyppc::addressof< TType, TMemVarType >, _1, offset ) , bpl::default_call_policies() - , boost::mpl::vector< boost::uint32_t, const TType* >() ); + , boost::mpl::vector< size_t, const TType* >() ); } template< typename TType > @@ -69,7 +68,7 @@ namespace pyppc = pyplusplus::convenience; return bpl::make_function( boost::bind( &pyppc::addressof_inst< TType >, _1 ) , bpl::default_call_policies() - , boost::mpl::vector< boost::uint32_t, const TType* >() ); + , boost::mpl::vector< size_t, const TType* >() ); } class register_addressof_static_var : public boost::python::def_visitor<register_addressof_static_var> @@ -91,7 +90,7 @@ } private: - boost::uint32_t m_address; + size_t m_address; const char* m_name; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-17 22:22:09
|
Revision: 1475 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1475&view=rev Author: roman_yakovenko Date: 2008-12-17 21:43:57 +0000 (Wed, 17 Dec 2008) Log Message: ----------- adding ctypes-cpp tester Added Paths: ----------- pyplusplus_dev/pyplusplus/cpptypes/ pyplusplus_dev/pyplusplus/cpptypes/decorators.py pyplusplus_dev/pyplusplus/cpptypes/decorators.pyc pyplusplus_dev/pyplusplus/cpptypes/get_exports.py pyplusplus_dev/pyplusplus/cpptypes/mydll/ pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.cpp pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.h pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.sln pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.suo pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.vcproj pyplusplus_dev/pyplusplus/cpptypes/mydll/release/ pyplusplus_dev/pyplusplus/cpptypes/mydll/release/mydll.dll pyplusplus_dev/pyplusplus/cpptypes/tester.py Added: pyplusplus_dev/pyplusplus/cpptypes/decorators.py =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/decorators.py (rev 0) +++ pyplusplus_dev/pyplusplus/cpptypes/decorators.py 2008-12-17 21:43:57 UTC (rev 1475) @@ -0,0 +1,9 @@ +class public( object ): + def __init__(self , dll, decorated_name, return_type, argumen_types): + self.decorated_name = decorated_name + self.func = getattr( dll, decorated_name ) + self.func.restype = return_type + self.func.argtypes = argumen_types + + def __call__(self, *args, **keywd ): + return self.func( *args, **keywd ) Added: pyplusplus_dev/pyplusplus/cpptypes/decorators.pyc =================================================================== (Binary files differ) Property changes on: pyplusplus_dev/pyplusplus/cpptypes/decorators.pyc ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: pyplusplus_dev/pyplusplus/cpptypes/get_exports.py =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/get_exports.py (rev 0) +++ pyplusplus_dev/pyplusplus/cpptypes/get_exports.py 2008-12-17 21:43:57 UTC (rev 1475) @@ -0,0 +1,289 @@ +# This code was contributed by 'leppton', see +# https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1559219&group_id=5470 +# +# This example shows how to use ctypes module to read all +# function names from dll export directory + +import os +if os.name != "nt": + raise Exception("Wrong OS") + +import ctypes as ctypes +import ctypes.wintypes as wintypes + +def convert_cdef_to_pydef(line): + """\ +convert_cdef_to_pydef(line_from_c_header_file) -> python_tuple_string +'DWORD var_name[LENGTH];' -> '("var_name", DWORD*LENGTH)' + +doesn't work for all valid c/c++ declarations""" + l = line[:line.find(';')].split() + if len(l) != 2: + return None + type_ = l[0] + name = l[1] + i = name.find('[') + if i != -1: + name, brac = name[:i], name[i:][1:-1] + return '("%s", %s*%s)'%(name,type_,brac) + else: + return '("%s", %s)'%(name,type_) + +def convert_cdef_to_structure(cdef, name, data_dict=ctypes.__dict__): + """\ +convert_cdef_to_structure(struct_definition_from_c_header_file) + -> python class derived from ctypes.Structure + +limited support for c/c++ syntax""" + py_str = '[\n' + for line in cdef.split('\n'): + field = convert_cdef_to_pydef(line) + if field != None: + py_str += ' '*4 + field + ',\n' + py_str += ']\n' + + pyarr = eval(py_str, data_dict) + class ret_val(ctypes.Structure): + _fields_ = pyarr + ret_val.__name__ = name + ret_val.__module__ = None + return ret_val + +#struct definitions we need to read dll file export table +winnt = ( + ('IMAGE_DOS_HEADER', """\ + WORD e_magic; + WORD e_cblp; + WORD e_cp; + WORD e_crlc; + WORD e_cparhdr; + WORD e_minalloc; + WORD e_maxalloc; + WORD e_ss; + WORD e_sp; + WORD e_csum; + WORD e_ip; + WORD e_cs; + WORD e_lfarlc; + WORD e_ovno; + WORD e_res[4]; + WORD e_oemid; + WORD e_oeminfo; + WORD e_res2[10]; + LONG e_lfanew; +"""), + + ('IMAGE_FILE_HEADER', """\ + WORD Machine; + WORD NumberOfSections; + DWORD TimeDateStamp; + DWORD PointerToSymbolTable; + DWORD NumberOfSymbols; + WORD SizeOfOptionalHeader; + WORD Characteristics; +"""), + + ('IMAGE_DATA_DIRECTORY', """\ + DWORD VirtualAddress; + DWORD Size; +"""), + + ('IMAGE_OPTIONAL_HEADER32', """\ + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; + DWORD BaseOfData; + DWORD ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Win32VersionValue; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + DWORD SizeOfStackReserve; + DWORD SizeOfStackCommit; + DWORD SizeOfHeapReserve; + DWORD SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; +""", + {'IMAGE_NUMBEROF_DIRECTORY_ENTRIES':16}), + + ('IMAGE_NT_HEADERS', """\ + DWORD Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_OPTIONAL_HEADER32 OptionalHeader; +"""), + + ('IMAGE_EXPORT_DIRECTORY', """\ + DWORD Characteristics; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD Name; + DWORD Base; + DWORD NumberOfFunctions; + DWORD NumberOfNames; + DWORD AddressOfFunctions; + DWORD AddressOfNames; + DWORD AddressOfNameOrdinals; +"""), + ) + +#Construct python ctypes.Structures from above definitions +data_dict = dict(wintypes.__dict__) +for definition in winnt: + name = definition[0] + def_str = definition[1] + if len(definition) == 3: + data_dict.update(definition[2]) + type_ = convert_cdef_to_structure(def_str, name, data_dict) + data_dict[name] = type_ + globals()[name] = type_ + + ptype = ctypes.POINTER(type_) + pname = 'P'+name + data_dict[pname] = ptype + globals()[pname] = ptype + +del data_dict +del winnt + +class DllException(Exception): + pass + +def read_export_table(dll_name, mmap=False, use_kernel=False): + """\ +read_export_table(dll_name [,mmap=False [,use_kernel=False]]]) + -> list of exported names + +default is to load dll into memory: dll sections are aligned to +page boundaries, dll entry points is called, etc... + +with mmap=True dll file image is mapped to memory, Relative Virtual +Addresses (RVAs) must be mapped to real addresses manually + +with use_kernel=True direct kernel32.dll calls are used, +instead of python mmap module + +see http://www.windowsitlibrary.com/Content/356/11/1.html +for details on Portable Executable (PE) file format +""" + if not mmap: + dll = ctypes.cdll.LoadLibrary(dll_name) + if dll == None: + raise DllException("Cant load dll") + base_addr = dll._handle + + else: + if not use_kernel: + fileH = open(dll_name) + if fileH == None: + raise DllException("Cant load dll") + import mmap + m = mmap.mmap(fileH.fileno(), 0, None, mmap.ACCESS_READ) + # id(m)+8 sucks, is there better way? + base_addr = ctypes.cast(id(m)+8, ctypes.POINTER(ctypes.c_int))[0] + else: + kernel32 = ctypes.windll.kernel32 + if kernel32 == None: + raise DllException("cant load kernel") + fileH = kernel32.CreateFileA(dll_name, 0x00120089, 1,0,3,0,0) + if fileH == 0: + raise DllException("Cant open, errcode = %d"%kernel32.GetLastError()) + mapH = kernel32.CreateFileMappingW(fileH,0,0x8000002,0,0,0) + if mapH == 0: + raise DllException("Cant mmap, errocode = %d"%kernel32.GetLastError()) + base_addr = ctypes.windll.kernel32.MapViewOfFile(mapH, 0x4, 0, 0, 0) + if base_addr == 0: + raise DllException("Cant mmap(2), errocode = %d"%kernel32.GetLastError()) + + dbghelp = ctypes.windll.dbghelp + if dbghelp == None: + raise DllException("dbghelp.dll not installed") + pimage_nt_header = dbghelp.ImageNtHeader(base_addr) + if pimage_nt_header == 0: + raise DllException("Cant find IMAGE_NT_HEADER") + + #Functions like dbghelp.ImageNtHeader above have no type information + #let's make one prototype for extra buzz + #PVOID ImageRvaToVa(PIMAGE_NT_HEADERS NtHeaders, PVOID Base, + # ULONG Rva, PIMAGE_SECTION_HEADER* LastRvaSection) + # we use integers instead of pointers, coz integers are better + # for pointer arithmetic + prototype = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_int, + ctypes.c_int, ctypes.c_int, ctypes.c_int) + paramflags = ((1,"NtHeaders",pimage_nt_header),(1,"Base",base_addr),(1,"Rva"),(1,"LastRvaSection",0)) + ImageRvaToVa = prototype(('ImageRvaToVa', dbghelp), paramflags) + + def cast_rva(rva, type_): + va = base_addr + rva + if mmap and va > pimage_nt_header: + va = ImageRvaToVa(Rva=rva) + if va == 0: + raise DllException("ImageRvaToVa failed") + return ctypes.cast(va, type_) + + if not mmap: + dos_header = cast_rva(0, PIMAGE_DOS_HEADER)[0] + if dos_header.e_magic != 0x5A4D: + raise DllException("IMAGE_DOS_HEADER.e_magic error") + nt_header = cast_rva(dos_header.e_lfanew, PIMAGE_NT_HEADERS)[0] + else: + nt_header = ctypes.cast(pimage_nt_header, PIMAGE_NT_HEADERS)[0] + if nt_header.Signature != 0x00004550: + raise DllException("IMAGE_NT_HEADERS.Signature error") + + opt_header = nt_header.OptionalHeader + if opt_header.Magic != 0x010b: + raise DllException("IMAGE_OPTIONAL_HEADERS32.Magic error") + + ret_val = [] + exports_dd = opt_header.DataDirectory[0] + if opt_header.NumberOfRvaAndSizes > 0 or exports_dd != 0: + export_dir = cast_rva(exports_dd.VirtualAddress, PIMAGE_EXPORT_DIRECTORY)[0] + + nNames = export_dir.NumberOfNames + if nNames > 0: + PNamesType = ctypes.POINTER(ctypes.c_int * nNames) + names = cast_rva(export_dir.AddressOfNames, PNamesType)[0] + for rva in names: + name = cast_rva(rva, ctypes.c_char_p).value + ret_val.append(name) + + if mmap: + if use_kernel: + kernel32.UnmapViewOfFile(base_addr) + kernel32.CloseHandle(mapH) + kernel32.CloseHandle(fileH) + else: + m.close() + fileH.close() + return ret_val + + +if __name__ == '__main__': + import sys + if len(sys.argv) != 2: + print 'usage: %s dll_file_name'%sys.argv[0] + sys.exit() +## names = read_export_table(sys.argv[1], mmap=False, use_kernel=False) + names = read_export_table(sys.argv[1], mmap=False, use_kernel=False) + for name in names: + print name + + Added: pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.cpp =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.cpp (rev 0) +++ pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.cpp 2008-12-17 21:43:57 UTC (rev 1475) @@ -0,0 +1,52 @@ +#include "mydll.h" +#include "windows.h" +#include <iostream> + +number_t::number_t() +: m_value(0) +{ +// std::cout << "{C++} number_t( 0 )" << std::endl; +} + + +number_t::number_t(int value) +: m_value(value) +{ +// std::cout << "{C++} number_t( " << value << " )" << std::endl; +} + +number_t::~number_t() { +// std::cout << "{C++} ~number_t()" << std::endl; +} +void number_t::print_it() const { + std::cout << "{C++} value: " << m_value << std::endl; +} + +int number_t::get_value() const{ + return m_value; +} + +void number_t::set_value(int x){ + m_value = x; +} + +number_t number_t::clone() const{ + return number_t(*this); +} + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + Added: pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.h =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.h (rev 0) +++ pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.h 2008-12-17 21:43:57 UTC (rev 1475) @@ -0,0 +1,17 @@ +#pragma once + +class __declspec(dllexport) number_t{ +public: + number_t(); + explicit number_t(int value); + virtual ~number_t(); + void print_it() const; + int get_value() const; + void set_value(int x); + + number_t clone() const; + +private: + int m_value; +}; + Added: pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.sln =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.sln (rev 0) +++ pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.sln 2008-12-17 21:43:57 UTC (rev 1475) @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mydll", "mydll.vcproj", "{E7A34C45-534F-43A6-AF95-3CA2428619E2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E7A34C45-534F-43A6-AF95-3CA2428619E2}.Debug|Win32.ActiveCfg = Debug|Win32 + {E7A34C45-534F-43A6-AF95-3CA2428619E2}.Debug|Win32.Build.0 = Debug|Win32 + {E7A34C45-534F-43A6-AF95-3CA2428619E2}.Release|Win32.ActiveCfg = Release|Win32 + {E7A34C45-534F-43A6-AF95-3CA2428619E2}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal Added: pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.suo =================================================================== (Binary files differ) Property changes on: pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.suo ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.vcproj =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.vcproj (rev 0) +++ pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.vcproj 2008-12-17 21:43:57 UTC (rev 1475) @@ -0,0 +1,179 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="mydll" + ProjectGUID="{E7A34C45-534F-43A6-AF95-3CA2428619E2}" + RootNamespace="mydll" + Keyword="Win32Proj" + TargetFrameworkVersion="196613" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MYDLL_EXPORTS" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="2" + WarningLevel="3" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + EnableIntrinsicFunctions="true" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MYDLL_EXPORTS" + RuntimeLibrary="2" + EnableFunctionLevelLinking="true" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkIncremental="1" + GenerateDebugInformation="true" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath=".\mydll.cpp" + > + </File> + <File + RelativePath=".\mydll.h" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Added: pyplusplus_dev/pyplusplus/cpptypes/mydll/release/mydll.dll =================================================================== (Binary files differ) Property changes on: pyplusplus_dev/pyplusplus/cpptypes/mydll/release/mydll.dll ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: pyplusplus_dev/pyplusplus/cpptypes/tester.py =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/tester.py (rev 0) +++ pyplusplus_dev/pyplusplus/cpptypes/tester.py 2008-12-17 21:43:57 UTC (rev 1475) @@ -0,0 +1,133 @@ +import ctypes +import unittest +import decorators + +mydll = ctypes.CPPDLL( './mydll/release/mydll.dll' ) + +#we should keep somewhere decorated-undecorated name mappings +#I don't feel like parsing source code is a good strategy +# - there is no way to create mangled name for a function. In this example, other way is used - binary file is parsed +# and the functions are mapped to dll entry using "human readable" format. +# GCCXML reports mangled and demangled names of the function, but it is not a cross platform( compile ) solution. +# It looks like I will have to cause mspdb package to work ( from where ctypes loads dlls? ctypes.windll.msvcr90 ??? + + +tmp = [ ( "number_t::number_t(class number_t const &)", "??0number_t@@QAE@ABV0@@Z" ) + , ( "number_t::number_t(int)", "??0number_t@@QAE@H@Z" ) + , ( "number_t::number_t(void)", "??0number_t@@QAE@XZ" ) + , ( "number_t::~number_t(void)", "??1number_t@@UAE@XZ" ) + , ( "class number_t & number_t::operator=(class number_t const &)", "??4number_t@@QAEAAV0@ABV0@@Z" ) + , ( "const number_t::'vftable'", "??_7number_t@@6B@" ) + , ( "int number_t::get_value(void)", "?get_value@number_t@@QBEHXZ" ) + , ( "void number_t::print_it(void)", "?print_it@number_t@@QBEXXZ" ) + , ( "void number_t::set_value(int)", "?set_value@number_t@@QAEXH@Z" ) ] + +mydll.name_mapping = {} +for n1, n2 in tmp: + mydll.name_mapping[n1] = n2 + mydll.name_mapping[n2] = n1 + +# what is the best way to treat overloaded constructors +class public( object ): + def __init__(self, dll, this, name, restype=None, argtypes=None ): + self.this = this #reference to class instance + self.name = name + self.func = getattr( dll, dll.name_mapping[name] ) + self.func.restype = restype + this_call_arg_types = [ ctypes.POINTER( this._obj.__class__ ) ] + if argtypes: + this_call_arg_types.extend( argtypes ) + self.func.argtypes = this_call_arg_types + + def __call__(self, *args, **keywd ): + return self.func( self.this, *args, **keywd ) + +class mem_fun_factory( object ): + def __init__( self, dll, this ): + self.dll = dll + self.this = this + + def __call__( self, *args, **keywd ): + return public( self.dll, self.this, *args, **keywd ) + +class Number(ctypes.Structure): + #http://www.phpcompiler.org/articles/virtualinheritance.html, + _fields_ = [("vptr", ctypes.POINTER(ctypes.c_void_p)), + ("m_value", ctypes.c_int)] + + def __init__(self, x=None): + mem_fun = mem_fun_factory( mydll, ctypes.byref( self ) ) + self.get_value = mem_fun( 'int number_t::get_value(void)', restype=ctypes.c_int ) + self.set_value = mem_fun( 'void number_t::set_value(int)', argtypes=[ctypes.c_int]) + self.print_it = mem_fun( 'void number_t::print_it(void)' ) + self.assign = mem_fun( "class number_t & number_t::operator=(class number_t const &)" + , restype=ctypes.POINTER(Number) + , argtypes=[ctypes.POINTER(Number)] ) + #overloading example + if None is x: + mem_fun( 'number_t::number_t(void)' )() + elif isinstance( x, int ): + mem_fun( 'number_t::number_t(int)', argtypes=[ctypes.c_int] )( x ) + elif isinstance( x, Number ): + mem_fun( 'number_t::number_t(class number_t const &)', argtypes=[ctypes.POINTER(Number)] )( ctypes.byref( x ) ) + else: + raise RuntimeError( "Wrong argument" ) + + def __del__(self): + public( mydll, ctypes.byref(self), "number_t::~number_t(void)" )() + +class tester_t( unittest.TestCase ): + def test_constructors(self): + obj1 = Number(32) + self.failUnless( obj1.m_value == 32 ) + obj2 = Number() + self.failUnless( obj2.m_value == 0 ) + obj3 = Number(obj1) + self.failUnless( obj3.m_value == obj1.m_value == 32 ) + + def test_get_value( self ): + obj = Number(99) + self.failUnless( 99 == obj.get_value() ) + + def test_set_value( self ): + obj = Number() + obj.set_value( 13 ) + self.failUnless( 13 == obj.get_value() == obj.m_value ) + + def test_assign( self ): + obj1 = Number(1) + obj2 = Number(2) + x = obj1.assign( obj2 ) + #there are special cases, where ctypes could introduce "optimized" behaviour and not create new python object + self.failUnless( x is obj1 ) + self.failUnless( obj1.m_value == obj2.m_value ) + +def main(): + obj = Number(42) + print obj.m_value + print hex(obj.vptr[0]) + obj.print_it() + print '42 == ', obj.get_value() + +if __name__ == "__main__": + unittest.main() + +#problems: +#consider generic algorithm for resolving overloaded functions call +# * function name should be unique +# * write something very smart and bugy and let the smart people to improve it + + +""" +TODO: + +* I think more testers and "demos", before I write code generator: + * a class instance passed\returned by value\reference\pointer\smart pointer + * function overloading + * how much code, we can put in the helper files. I mean class like "public". Or std::vector - there is no reason, to define\generate this class every time + * how we are going to manage relationship between objects: + class X{...}; + class Y{ X x; public: const X& get_x() const { return x;} }; + I think our solution should be very similar to Boost.Python call policies. It is definitely possible to go without it. + +""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-26 07:53:06
|
Revision: 1500 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1500&view=rev Author: roman_yakovenko Date: 2008-12-26 07:53:03 +0000 (Fri, 26 Dec 2008) Log Message: ----------- small refactoring before introducing ctypes code generator Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/include.py pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/creators_factory/creator.py pyplusplus_dev/pyplusplus/file_writers/balanced_files.py pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-25 11:46:00 UTC (rev 1499) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-26 07:53:03 UTC (rev 1500) @@ -116,7 +116,7 @@ from license import license_t -from module import module_t +from module import bpmodule_t from smart_pointers import held_type_t from smart_pointers import smart_pointers_converter_t Modified: pyplusplus_dev/pyplusplus/code_creators/include.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/include.py 2008-12-25 11:46:00 UTC (rev 1499) +++ pyplusplus_dev/pyplusplus/code_creators/include.py 2008-12-26 07:53:03 UTC (rev 1500) @@ -13,7 +13,7 @@ def __init__( self, header, user_defined=False, system=False ): code_creator.code_creator_t.__init__(self) self._header = include_directories.include_directories_t.normalize( header ) - self._include_dirs_optimization = None #This parameter will be set from module_t.create function + self._include_dirs_optimization = None #This parameter will be set from bpmodule_t.create function self._user_defined = user_defined self._system = system self.__created_code = None Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2008-12-25 11:46:00 UTC (rev 1499) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2008-12-26 07:53:03 UTC (rev 1500) @@ -7,15 +7,16 @@ import custom import license import include -import namespace +import namespace import compound import algorithm +import base_module import module_body import declaration_based import include_directories from pygccxml import utils -class module_t(compound.compound_t): +class bpmodule_t(base_module.base_module_t): """This class represents the source code for the entire extension module. The root of the code creator tree is always a module_t object. @@ -23,20 +24,14 @@ def __init__(self, global_ns): """Constructor. """ - compound.compound_t.__init__(self) + base_module.base_module_t.__init__(self, global_ns) self.__body = None - self.__global_ns = global_ns - - @property - def global_ns(self): - "reference to global_ns ( namespace_t ) declaration" - return self.__global_ns - + def _get_include_dirs(self): - include_dirs = algorithm.creator_finder.find_by_class_instance( + include_dirs = algorithm.creator_finder.find_by_class_instance( what=include_directories.include_directories_t , where=self.creators - , recursive=False) + , recursive=False) if 0 == len( include_dirs ): include_dirs = include_directories.include_directories_t() if self.license: @@ -46,9 +41,9 @@ return include_dirs elif 1 == len( include_dirs ): return include_dirs[0] - else: + else: assert not "only single instance of include_directories_t should exist" - + def _get_std_directories(self): include_dirs = self._get_include_dirs() return include_dirs.std @@ -59,7 +54,7 @@ return include_dirs.user_defined user_defined_directories = property( _get_user_defined_directories ) - @property + @property def body(self): """Return reference to L{module_body_t} code creator""" if None is self.__body: @@ -70,23 +65,6 @@ self.__body = found[0] return self.__body - def _get_license( self ): - if isinstance( self.creators[0], license.license_t ): - return self.creators[0] - return None - - def _set_license( self, license_text ): - if not isinstance( license_text, license.license_t ): - license_inst = license.license_t( license_text ) - if isinstance( self.creators[0], license.license_t ): - self.remove_creator( self.creators[0] ) - self.adopt_creator( license_inst, 0 ) - license = property( _get_license, _set_license, - doc="""License text. - - The license text will always be the first children node. - @type: str or L{license_t}""") - def last_include_index(self): """Return the children index of the last L{include_t} object. @@ -109,9 +87,9 @@ to_be_removed.append( creator ) elif isinstance( creator, module_body.module_body_t ): break - + for creator in to_be_removed: - if creator.is_system: + if creator.is_system: if not leave_system_headers: self.remove_creator( creator ) elif creator.is_user_defined: @@ -146,9 +124,6 @@ for include_creator in includes: include_creator.include_dirs_optimization = include_dirs - def _get_system_headers_impl( self ): - return [] - def _create_impl(self): self.do_include_dirs_optimization() index = 0 @@ -159,19 +134,19 @@ else: includes.append( self.creators[index].create() ) code = compound.compound_t.create_internal_code( self.creators[index:] ) - code = self.unindent(code) + code = self.unindent(code) return os.linesep.join( includes ) + 2 * os.linesep + code + os.linesep - + def add_include( self, header, user_defined=True, system=False ): creator = include.include_t( header=header, user_defined=user_defined, system=system ) self.adopt_include( creator ) - + def add_namespace_usage( self, namespace_name ): self.adopt_creator( namespace.namespace_using_t( namespace_name ) , self.last_include_index() + 1 ) def add_namespace_alias( self, alias, full_namespace_name ): - self.adopt_creator( namespace.namespace_alias_t( + self.adopt_creator( namespace.namespace_alias_t( alias=alias , full_namespace_name=full_namespace_name ) , self.last_include_index() + 1 ) @@ -179,21 +154,21 @@ def adopt_declaration_creator( self, creator ): self.adopt_creator( creator, self.creators.index( self.body ) ) - def add_declaration_code( self, code, position ): + def add_declaration_code( self, code, position ): self.adopt_declaration_creator( custom.custom_text_t( code ) ) - - @utils.cached + + @utils.cached def specially_exposed_decls(self): - """list of exposed declarations, which were not ``included``, but still + """list of exposed declarations, which were not ``included``, but still were exposed. For example, std containers. """ decls = set() #select all declaration based code creators ccs = filter( lambda cc: isinstance( cc, declaration_based.declaration_based_t ) , algorithm.make_flatten_list( self ) ) - #leave only "ignored" + #leave only "ignored" ccs = filter( lambda cc: cc.declaration.ignore == True, ccs ) - + decls = map( lambda cc: cc.declaration, ccs ) - + return set( decls ) Modified: pyplusplus_dev/pyplusplus/creators_factory/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/creator.py 2008-12-25 11:46:00 UTC (rev 1499) +++ pyplusplus_dev/pyplusplus/creators_factory/creator.py 2008-12-26 07:53:03 UTC (rev 1500) @@ -81,7 +81,7 @@ self.__types_db = types_database.types_database_t() global_ns = declarations.get_global_namespace(decls) - self.__extmodule = code_creators.module_t( global_ns ) + self.__extmodule = code_creators.bpmodule_t( global_ns ) if boost_python_ns_name: bp_ns_alias = code_creators.namespace_alias_t( alias=boost_python_ns_name , full_namespace_name='::boost::python' ) Modified: pyplusplus_dev/pyplusplus/file_writers/balanced_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/balanced_files.py 2008-12-25 11:46:00 UTC (rev 1499) +++ pyplusplus_dev/pyplusplus/file_writers/balanced_files.py 2008-12-26 07:53:03 UTC (rev 1500) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"""defines a class that writes L{code_creators.module_t} to multiple files""" +"""defines a class that writes L{code_creators.bpmodule_t} to multiple files""" import os import math @@ -34,7 +34,7 @@ """Constructor. @param extmodule: The root of a code creator tree - @type extmodule: module_t + @type extmodule: bpmodule_t @param directory_path: The output directory where the source files are written @type directory_path: str Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2008-12-25 11:46:00 UTC (rev 1499) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2008-12-26 07:53:03 UTC (rev 1500) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"""defines a class that writes L{code_creators.module_t} to multiple files, the class +"""defines a class that writes L{code_creators.bpmodule_t} to multiple files, the class also splits huge C++ classes to few source files """ Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2008-12-25 11:46:00 UTC (rev 1499) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2008-12-26 07:53:03 UTC (rev 1500) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"""defines a class that writes L{code_creators.module_t} to multiple files""" +"""defines a class that writes L{code_creators.bpmodule_t} to multiple files""" import os import writer @@ -26,7 +26,7 @@ """Constructor. @param extmodule: The root of a code creator tree - @type extmodule: module_t + @type extmodule: bpmodule_t @param directory_path: The output directory where the source files are written @type directory_path: str Modified: pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2008-12-25 11:46:00 UTC (rev 1499) +++ pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2008-12-26 07:53:03 UTC (rev 1500) @@ -208,7 +208,7 @@ , enable_indexing_suite=True , doc_extractor=None): """ - Creates L{module_t} code creator. + Creates L{bpmodule_t} code creator. @param module_name: module name @type module_name: string @@ -248,7 +248,7 @@ @property def code_creator( self ): - "reference to L{code_creators.module_t} instance" + "reference to L{code_creators.bpmodule_t} instance" if not self.__code_creator: raise RuntimeError( "self.module is equal to None. Did you forget to call build_code_creator function?" ) return self.__code_creator Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-25 11:46:00 UTC (rev 1499) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-26 07:53:03 UTC (rev 1500) @@ -107,7 +107,7 @@ @property def code_creator( self ): - "reference to L{code_creators.module_t} instance" + "reference to L{code_creators.ctypes_module_t} instance" if not self.__code_creator: raise RuntimeError( "self.module is equal to None. Did you forget to call build_code_creator function?" ) return self.__code_creator This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-26 08:05:30
|
Revision: 1502 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1502&view=rev Author: roman_yakovenko Date: 2008-12-26 08:05:27 +0000 (Fri, 26 Dec 2008) Log Message: ----------- Modified Paths: -------------- pyplusplus_dev/pyplusplus/creators_factory/__init__.py pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py Added Paths: ----------- pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py Removed Paths: ------------- pyplusplus_dev/pyplusplus/creators_factory/creator.py Modified: pyplusplus_dev/pyplusplus/creators_factory/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/__init__.py 2008-12-26 07:58:38 UTC (rev 1501) +++ pyplusplus_dev/pyplusplus/creators_factory/__init__.py 2008-12-26 08:05:27 UTC (rev 1502) @@ -3,10 +3,10 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -from creator import creator_t +from bpcreator import bpcreator_t from sort_algorithms import sort_classes as findout_desired_order from call_policies_resolver import built_in_resolver_t def create( decls, module_name ): - maker = creator_t(decls, module_name) + maker = bpcreator_t(decls, module_name) return maker.create() Copied: pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py (from rev 1500, pyplusplus_dev/pyplusplus/creators_factory/creator.py) =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py (rev 0) +++ pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2008-12-26 08:05:27 UTC (rev 1502) @@ -0,0 +1,745 @@ +# 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 types_database +import creators_wizard +import sort_algorithms +import dependencies_manager +import opaque_types_manager +import call_policies_resolver +import fake_constructors_manager + +from pygccxml import declarations +from pyplusplus import decl_wrappers +from pyplusplus import code_creators +from pyplusplus import code_repository +from pyplusplus import _logging_ + +ACCESS_TYPES = declarations.ACCESS_TYPES +VIRTUALITY_TYPES = declarations.VIRTUALITY_TYPES + +class bpcreator_t( declarations.decl_visitor_t ): + """Creating code creators. + + This class takes a set of declarations as input and creates a code + creator tree that contains the Boost.Python C++ source code for the + final extension module. Each node in the code creators tree represents + a block of text (C++ source code). + + Usage of this class: Create an instance and pass all relevant input + data to the constructor. Then call L{create()} to obtain the code + creator tree whose root node is a L{module_t<code_creators.module_t>} + object representing the source code for the entire extension module. + """ + + def __init__( self + , decls + , module_name + , boost_python_ns_name='bp' + , call_policies_resolver_=None + , types_db=None + , target_configuration=None + , enable_indexing_suite=True + , doc_extractor=None ): + """Constructor. + + @param decls: Declarations that should be exposed in the final module. + @param module_name: The name of the final module. + @param boost_python_ns_name: The alias for the boost::python namespace. + @param call_policies_resolver_: Callable that takes one declaration (calldef_t) as input and returns a call policy object which should be used for this declaration. + @param types_db: ...todo... + @param target_configuration: A target configuration object can be used to customize the generated source code to a particular compiler or a particular version of Boost.Python. + @param doc_extractor: callable, that takes as argument declaration reference and returns documentation string + @param already_exposed_dbs: list of files/directories other modules, this module depends on, generated their code too + @type decls: list of declaration_t + @type module_name: str + @type boost_python_ns_name: str + @type call_policies_resolver_: callable + @type types_db: L{types_database_t<types_database.types_database_t>} + @type target_configuration: L{target_configuration_t<code_creators.target_configuration_t>} + @type doc_extractor: callable + @type already_exposed_dbs: list of strings + """ + declarations.decl_visitor_t.__init__(self) + self.logger = _logging_.loggers.module_builder + self.decl_logger = _logging_.loggers.declarations + + self.__enable_indexing_suite = enable_indexing_suite + self.__target_configuration = target_configuration + if not self.__target_configuration: + self.__target_configuration = code_creators.target_configuration_t() + + self.__call_policies_resolver = call_policies_resolver_ + if not self.__call_policies_resolver: + self.__call_policies_resolver \ + = call_policies_resolver.built_in_resolver_t(self.__target_configuration) + + self.__types_db = types_db + if not self.__types_db: + self.__types_db = types_database.types_database_t() + + global_ns = declarations.get_global_namespace(decls) + self.__extmodule = code_creators.bpmodule_t( global_ns ) + if boost_python_ns_name: + bp_ns_alias = code_creators.namespace_alias_t( alias=boost_python_ns_name + , full_namespace_name='::boost::python' ) + self.__extmodule.adopt_creator( bp_ns_alias ) + + self.__module_body = code_creators.module_body_t( name=module_name ) + + self.__extmodule.adopt_creator( self.__module_body ) + + self.__opaque_types_manager = opaque_types_manager.manager_t( self.__extmodule ) + self.__dependencies_manager = dependencies_manager.manager_t(self.decl_logger) + + prepared_decls = self._prepare_decls( decls, doc_extractor ) + self.__decls = sort_algorithms.sort( prepared_decls ) + + self.curr_code_creator = self.__module_body + self.curr_decl = None + self.__array_1_registered = set() #(type.decl_string,size) + self.__free_operators = [] + self.__std_containers_free_operators = {} + self.__exposed_free_fun_overloads = set() + self.__fc_manager = fake_constructors_manager.manager_t( global_ns ) + + def __print_readme( self, decl ): + readme = decl.readme() + if not readme: + return + + if not decl.exportable: + reason = readme[0] + readme = readme[1:] + self.decl_logger.warn( "%s;%s" % ( decl, reason ) ) + + for msg in readme: + self.decl_logger.warn( "%s;%s" % ( decl, msg ) ) + + def _prepare_decls( self, decls, doc_extractor ): + to_be_exposed = [] + for decl in declarations.make_flatten( decls ): + if decl.ignore: + continue + + if isinstance( decl, declarations.namespace_t ): + continue + + if not decl.exportable: + #leave only decls that user wants to export and that could be exported + self.__print_readme( decl ) + continue + + if decl.already_exposed: + #check wether this is already exposed in other module + continue + + if isinstance( decl.parent, declarations.namespace_t ): + #leave only declarations defined under namespace, but remove namespaces + to_be_exposed.append( decl ) + + #Right now this functionality introduce a bug: declarations that should + #not be exported for some reason are not marked as such. I will need to + #find out. + #if isinstance( decl, declarations.calldef_t ) and not isinstance( decl, declarations.destructor_t ): + #self.__types_db.update( decl ) + #if None is decl.call_policies: + #decl.call_policies = self.__call_policies_resolver( decl ) + + #if isinstance( decl, declarations.variable_t ): + #self.__types_db.update( decl ) + + if doc_extractor: + decl.documentation = doc_extractor( decl ) + + self.__print_readme( decl ) + + return to_be_exposed + + def _adopt_free_operator( self, operator ): + def adopt_operator_impl( operator, found_creators ): + creator = filter( lambda creator: isinstance( creator, code_creators.class_t ) + , found_creators ) + if len(creator) == 1: + creator = creator[0] + #I think I don't need this condition any more + if not find( lambda creator: isinstance( creator, code_creators.declaration_based_t ) + and operator is creator.declaration + , creator.creators ): + #expose operator only once + self.__dependencies_manager.add_exported( operator ) + creator.adopt_creator( code_creators.operator_t( operator=operator ) ) + elif not creator: + pass + else: + assert not "Found %d class code creators" % len(creator) + + find = code_creators.creator_finder.find_by_declaration + if operator.target_class and operator.target_class.ignore == False: + found = find( lambda decl: operator.target_class is decl + , self.__extmodule.body.creators ) + adopt_operator_impl( operator, found ) + + def _is_registered_smart_pointer_creator( self, creator, db ): + for registered in db: + if not isinstance( creator, registered.__class__ ): + continue + elif registered.smart_ptr != creator.smart_ptr: + continue + elif isinstance( creator, code_creators.smart_pointer_registrator_t ): + if creator.declaration is registered.declaration: + return True + elif isinstance( creator, code_creators.smart_pointers_converter_t ): + if ( creator.source is registered.source ) \ + and ( creator.target is registered.target ): + return True + else: + assert not "unknown instace of registrator: " % str( registered ) + + def _treat_smart_pointers( self ): + """ Go to all class creators and apply held_type and creator registrators + as needed. + """ + find_classes = code_creators.creator_finder.find_by_class_instance + class_creators = find_classes( what=code_creators.class_t + , where=self.__extmodule.body.creators + , recursive=True ) + registrators_db = [] + for creator in class_creators: + if None is creator.held_type: + if not creator.declaration.is_abstract: + creator.held_type = self.__types_db.create_holder( creator.declaration ) + registrators = self.__types_db.create_registrators( creator ) + for r in registrators: + if not self._is_registered_smart_pointer_creator( r, registrators_db ): + creator.adopt_creator(r) + registrators_db.append(r) + + def _append_user_code( self ): + find_classes = code_creators.creator_finder.find_by_class_instance + class_creators = find_classes( what=code_creators.class_t + , where=self.__extmodule.body.creators + , recursive=True ) + + ctext_t = code_creators.custom_text_t + for cls_creator in class_creators: + cls_decl = cls_creator.declaration + + uc_creators_head = map( lambda uc: ctext_t( uc.text, uc.works_on_instance ) + , cls_decl.registration_code_head ) + cls_creator.adopt_creators( uc_creators_head, 0 ) + + uc_creators_tail = map( lambda uc: ctext_t( uc.text, uc.works_on_instance ) + , cls_decl.registration_code_tail ) + cls_creator.adopt_creators( uc_creators_tail ) + + uc_creators = map( lambda uc: ctext_t( uc.text ), cls_decl.wrapper_code ) + if uc_creators: + cls_creator.wrapper.adopt_creators( uc_creators ) + + uc_creators = map( lambda uc: ctext_t( uc.text ), cls_decl.declaration_code ) + insert_pos = self.__extmodule.creators.index( self.__module_body ) + self.__extmodule.adopt_creators( uc_creators, insert_pos ) + cls_creator.associated_decl_creators.extend( uc_creators ) + + def __get_exposed_containers(self): + """list of exposed declarations, which were not ``included``, but still + were exposed. For example, std containers + + std containers exposed by Py++, even if the user didn't ``include`` them. + """ + cmp_by_name = lambda cls1, cls2: cmp( cls1.decl_string, cls2.decl_string ) + used_containers = list( self.__types_db.used_containers ) + used_containers = filter( lambda cls: cls.indexing_suite.include_files + , used_containers ) + used_containers.sort( cmp_by_name ) + used_containers = filter( lambda cnt: cnt.already_exposed == False + , used_containers ) + return used_containers + + def _treat_indexing_suite( self ): + def create_explanation(cls): + msg = '//WARNING: the next line of code will not compile, because "%s" does not have operator== !' + msg = msg % cls.indexing_suite.element_type.decl_string + return code_creators.custom_text_t( msg, False ) + + def create_cls_cc( cls ): + if isinstance( cls, declarations.class_t ): + return code_creators.class_t( class_inst=cls ) + else: + return code_creators.class_declaration_t( class_inst=cls ) + + if not self.__types_db.used_containers: + return + + creators = [] + created_value_traits = set() + for cls in self.__get_exposed_containers(): + self.__print_readme( cls ) + + cls_creator = create_cls_cc( cls ) + self.__dependencies_manager.add_exported( cls ) + creators.append( cls_creator ) + try: + element_type = cls.indexing_suite.element_type + except: + element_type = None + + if isinstance( cls.indexing_suite, decl_wrappers.indexing_suite1_t ): + if not ( None is element_type ) \ + and declarations.is_class( element_type ) \ + and not declarations.has_public_equal( element_type ): + cls_creator.adopt_creator( create_explanation( cls ) ) + cls_creator.adopt_creator( code_creators.indexing_suite1_t(cls) ) + else: + class_traits = declarations.class_traits + if not ( None is element_type ) and class_traits.is_my_case( element_type ): + value_cls = class_traits.get_declaration( element_type ) + has_prerequisits = value_cls.less_than_comparable \ + and value_cls.equality_comparable + if ( not has_prerequisits ) and ( value_cls not in created_value_traits ): + created_value_traits.add( value_cls ) + element_type_cc = code_creators.value_traits_t( value_cls ) + self.__extmodule.adopt_declaration_creator( element_type_cc ) + cls_creator.adopt_creator( code_creators.indexing_suite2_t(cls) ) + + scfo = self.__std_containers_free_operators + if cls in scfo: + for operator in scfo[cls]: + self.__dependencies_manager.add_exported( operator ) + cls_creator.adopt_creator( code_creators.operator_t( operator=operator ) ) + + creators.reverse() + self.__module_body.adopt_creators( creators, 0 ) + + def create(self, decl_headers=None): + """Create and return the module for the extension. + + @param decl_headers: If None the headers for the wrapped decls are automatically found. + But you can pass a list of headers here to override that search. + @returns: Returns the root of the code creators tree + @rtype: L{module_t<code_creators.module_t>} + """ + # Invoke the appropriate visit_*() method on all decls + for decl in self.__decls: + self.curr_decl = decl + declarations.apply_visitor( self, decl ) + for operator in self.__free_operators: + self._adopt_free_operator( operator ) + self._treat_smart_pointers() + if self.__enable_indexing_suite: + self._treat_indexing_suite() + for creator in code_creators.make_flatten_generator( self.__extmodule ): + creator.target_configuration = self.__target_configuration + #last action. + self._append_user_code() + + add_include = self.__extmodule.add_include + #add system headers + system_headers = self.__extmodule.get_system_headers( recursive=True, unique=True ) + map( lambda header: add_include( header, user_defined=False, system=True ) + , system_headers ) + #add user defined header files + if decl_headers is None: + decl_headers = declarations.declaration_files( self.__decls ) + map( lambda header: add_include( header, user_defined=False, system=False ) + , decl_headers ) + + self.__dependencies_manager.inform_user() + + return self.__extmodule + + def visit_member_function( self ): + self.__types_db.update( self.curr_decl ) + self.__dependencies_manager.add_exported( self.curr_decl ) + + if self.__fc_manager.is_fake_constructor( self.curr_decl ): + return + + fwrapper = None + if None is self.curr_decl.call_policies: + self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) + + maker_cls, fwrapper_cls = creators_wizard.find_out_mem_fun_creator_classes( self.curr_decl ) + + maker = None + fwrapper = None + if fwrapper_cls: + fwrapper = fwrapper_cls( function=self.curr_decl ) + if fwrapper_cls is code_creators.mem_fun_transformed_wrapper_t: + if self.curr_code_creator.wrapper: + class_wrapper = self.curr_code_creator.wrapper + class_wrapper.adopt_creator( fwrapper ) + else: + self.__extmodule.adopt_declaration_creator( fwrapper ) + self.curr_code_creator.associated_decl_creators.append(fwrapper) + else: + class_wrapper = self.curr_code_creator.wrapper + class_wrapper.adopt_creator( fwrapper ) + + if maker_cls: + if fwrapper: + maker = maker_cls( function=self.curr_decl, wrapper=fwrapper ) + else: + maker = maker_cls( function=self.curr_decl ) + self.curr_code_creator.adopt_creator( maker ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) + + if self.curr_decl.has_static: + #static_method should be created only once. + found = filter( lambda creator: isinstance( creator, code_creators.static_method_t ) + and creator.declaration.name == self.curr_decl.name + , self.curr_code_creator.creators ) + if not found: + static_method = code_creators.static_method_t( function=self.curr_decl + , function_code_creator=maker ) + self.curr_code_creator.adopt_creator( static_method ) + + def visit_constructor( self ): + self.__types_db.update( self.curr_decl ) + self.__dependencies_manager.add_exported( self.curr_decl ) + + cwrapper = None + if self.curr_decl.parent.is_wrapper_needed(): + class_wrapper = self.curr_code_creator.wrapper + cwrapper = code_creators.constructor_wrapper_t( constructor=self.curr_decl ) + class_wrapper.adopt_creator( cwrapper ) + #TODO: FT for constructor + #~ if self.curr_decl.transformations: + #~ cwrapper = code_creators.constructor_transformed_wrapper_t( constructor=self.curr_decl ) + #~ class_wrapper.adopt_creator( cwrapper ) + #~ else: + #~ if self.curr_decl.transformations: + #~ cwrapper = code_creators.constructor_transformed_wrapper_t( constructor=self.curr_decl ) + #~ class_wrapper.adopt_creator( cwrapper ) + #~ self.__module_body.adopt_creator( cwrapper ) + #~ self.curr_code_creator.associated_decl_creators.append( cwrapper ) + #~ maker = None + #~ if self.curr_decl.transformations: + #~ maker = code_creators.constructor_transformed_t( constructor=self.curr_decl ) + #~ else: + maker = code_creators.constructor_t( constructor=self.curr_decl, wrapper=cwrapper ) + if None is self.curr_decl.call_policies: + self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) + self.curr_code_creator.adopt_creator( maker ) + + if self.curr_decl.allow_implicit_conversion: + maker = code_creators.casting_constructor_t( constructor=self.curr_decl ) + #casting constructor will be generated in the same file as class + self.curr_code_creator.adopt_creator( maker ) + + + def visit_destructor( self ): + pass + + def visit_member_operator( self ): + if self.curr_decl.symbol in ( '()', '[]', '=' ): + self.visit_member_function() + else: + self.__types_db.update( self.curr_decl ) + maker = code_creators.operator_t( operator=self.curr_decl ) + self.curr_code_creator.adopt_creator( maker ) + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_casting_operator( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + if None is self.curr_decl.call_policies: + self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) + + self.__types_db.update( self.curr_decl ) + if not self.curr_decl.parent.is_abstract and not declarations.is_reference( self.curr_decl.return_type ): + maker = code_creators.casting_operator_t( operator=self.curr_decl ) + self.__module_body.adopt_creator( maker ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) + + #what to do if class is abstract + maker = code_creators.casting_member_operator_t( operator=self.curr_decl ) + self.curr_code_creator.adopt_creator( maker ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) + + def visit_free_function( self ): + if self.curr_decl in self.__exposed_free_fun_overloads: + return + + if self.__fc_manager.is_fake_constructor( self.curr_decl ): + self.__types_db.update( self.curr_decl ) + self.__dependencies_manager.add_exported( self.curr_decl ) + return + + elif self.curr_decl.use_overload_macro: + parent_decl = self.curr_decl.parent + names = set( map( lambda decl: decl.name + , parent_decl.free_functions( allow_empty=True, recursive=False ) ) ) + for name in names: + overloads = parent_decl.free_functions( name, allow_empty=True, recursive=False ) + overloads = filter( lambda decl: decl.ignore == False and decl.use_overload_macro, overloads ) + if not overloads: + continue + else: + self.__exposed_free_fun_overloads.update( overloads ) + for f in overloads: + self.__types_db.update( f ) + self.__dependencies_manager.add_exported( f ) + if None is f.call_policies: + f.call_policies = self.__call_policies_resolver( f ) + + overloads_cls_creator = code_creators.free_fun_overloads_class_t( overloads ) + self.__extmodule.adopt_declaration_creator( overloads_cls_creator ) + + overloads_reg = code_creators.free_fun_overloads_t( overloads_cls_creator ) + self.curr_code_creator.adopt_creator( overloads_reg ) + overloads_reg.associated_decl_creators.append( overloads_cls_creator ) + self.__opaque_types_manager.register_opaque( overloads_reg, overloads ) + + ctext_t = code_creators.custom_text_t + for f in overloads: + uc_creators = map( lambda uc: ctext_t( uc.text ), f.declaration_code ) + insert_pos = self.__extmodule.creators.index( self.__module_body ) + self.__extmodule.adopt_creators( uc_creators, insert_pos ) + overloads_reg.associated_decl_creators.extend( uc_creators ) + else: + self.__types_db.update( self.curr_decl ) + self.__dependencies_manager.add_exported( self.curr_decl ) + if None is self.curr_decl.call_policies: + self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) + + maker = None + if self.curr_decl.transformations: + wrapper = code_creators.free_fun_transformed_wrapper_t( self.curr_decl ) + self.__extmodule.adopt_declaration_creator( wrapper ) + maker = code_creators.free_fun_transformed_t( self.curr_decl, wrapper ) + maker.associated_decl_creators.append( wrapper ) + else: + maker = code_creators.free_function_t( function=self.curr_decl ) + self.curr_code_creator.adopt_creator( maker ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) + + ctext_t = code_creators.custom_text_t + uc_creators = map( lambda uc: ctext_t( uc.text ), self.curr_decl.declaration_code ) + insert_pos = self.__extmodule.creators.index( self.__module_body ) + self.__extmodule.adopt_creators( uc_creators, insert_pos ) + maker.associated_decl_creators.extend( uc_creators ) + + def visit_free_operator( self ): + self.__types_db.update( self.curr_decl ) + + operator = self.curr_decl + target_class = operator.target_class + scfo = self.__std_containers_free_operators + if target_class and target_class.indexing_suite: + if target_class not in scfo: + scfo[ target_class ] = [ operator ] + else: + scfo[ target_class ].append( operator ) + else: + self.__free_operators.append( self.curr_decl ) + + def visit_class_declaration(self ): + pass + + def expose_overloaded_mem_fun_using_macro( self, cls, cls_creator ): + #returns set of exported member functions + exposed = set() + names = set( map( lambda decl: decl.name + , cls.member_functions( allow_empty=True, recursive=False ) ) ) + for name in names: + overloads = cls.member_functions( name, allow_empty=True, recursive=False ) + overloads = filter( lambda decl: decl.ignore == False and decl.use_overload_macro + , overloads ) + if not overloads: + continue + else: + exposed.update( overloads ) + + for f in overloads: + self.__types_db.update( f ) + self.__dependencies_manager.add_exported( f ) + if None is f.call_policies: + f.call_policies = self.__call_policies_resolver( f ) + + overloads_cls_creator = code_creators.mem_fun_overloads_class_t( overloads ) + self.__extmodule.adopt_declaration_creator( overloads_cls_creator ) + + overloads_reg = code_creators.mem_fun_overloads_t( overloads_cls_creator ) + cls_creator.adopt_creator( overloads_reg ) + overloads_reg.associated_decl_creators.append( overloads_cls_creator ) + + self.__opaque_types_manager.register_opaque( overloads_reg, overloads ) + return exposed + + def visit_class(self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + cls_decl = self.curr_decl + cls_parent_cc = self.curr_code_creator + exportable_members = self.curr_decl.get_exportable_members(sort_algorithms.sort) + + wrapper = None + cls_cc = None + if cls_decl.introduces_new_scope: + cls_cc = code_creators.class_t( class_inst=self.curr_decl ) + else: + cls_cc = self.curr_code_creator + + if self.curr_decl.is_wrapper_needed(): + wrapper = code_creators.class_wrapper_t( declaration=self.curr_decl + , class_creator=cls_cc ) + cls_cc.wrapper = wrapper + cls_cc.associated_decl_creators.append( wrapper ) + #insert wrapper before module body + if isinstance( self.curr_decl.parent, declarations.class_t ): + #we deal with internal class + self.curr_code_creator.wrapper.adopt_creator( wrapper ) + else: + self.__extmodule.adopt_declaration_creator( wrapper ) + + #next constructors are not present in code, but compiler generated + #Boost.Python requiers them to be declared in the wrapper class + noncopyable_vars = self.curr_decl.find_noncopyable_vars() + + copy_constr = self.curr_decl.find_copy_constructor() + if not self.curr_decl.noncopyable and copy_constr and copy_constr.is_artificial: + cccc = code_creators.copy_constructor_wrapper_t( constructor=copy_constr) + wrapper.adopt_creator( cccc ) + + trivial_constr = self.curr_decl.find_trivial_constructor() + if trivial_constr and trivial_constr.is_artificial and not noncopyable_vars: + tcons = code_creators.null_constructor_wrapper_t( constructor=trivial_constr ) + wrapper.adopt_creator( tcons ) + + exposed = self.expose_overloaded_mem_fun_using_macro( cls_decl, cls_cc ) + + if cls_decl.introduces_new_scope: + cls_parent_cc.adopt_creator( cls_cc ) + self.curr_code_creator = cls_cc + + if cls_decl.expose_this: + cls_cc.adopt_creator( code_creators.expose_this_t( cls_decl ) ) + + if cls_decl.expose_sizeof: + cls_cc.adopt_creator( code_creators.expose_sizeof_t( cls_decl ) ) + + for decl in exportable_members: + if decl in exposed: + continue + self.curr_decl = decl + declarations.apply_visitor( self, decl ) + + for redefined_func in cls_decl.redefined_funcs(): + if isinstance( redefined_func, declarations.operator_t ): + continue + self.curr_decl = redefined_func + declarations.apply_visitor( self, redefined_func ) + + #all static_methods_t should be moved to the end + #better approach is to move them after last def of relevant function + static_methods = filter( lambda creator: isinstance( creator, code_creators.static_method_t ) + , cls_cc.creators ) + for static_method in static_methods: + cls_cc.remove_creator( static_method ) + cls_cc.adopt_creator( static_method ) + + if cls_decl.exception_translation_code: + translator = code_creators.exception_translator_t( cls_decl ) + self.__extmodule.adopt_declaration_creator( translator ) + cls_cc.associated_decl_creators.append( translator ) + translator_register \ + = code_creators.exception_translator_register_t( cls_decl, translator ) + cls_cc.adopt_creator( translator_register ) + + for property_def in cls_decl.properties: + cls_cc.adopt_creator( code_creators.property_t(property_def) ) + + if wrapper and cls_decl.destructor_code: + destructor = code_creators.destructor_wrapper_t( class_=cls_decl ) + wrapper.adopt_creator( destructor ) + + for fc in cls_decl.fake_constructors: + if self.__fc_manager.should_generate_code( fc ): + self.__dependencies_manager.add_exported( fc ) + cls_cc.adopt_creator( code_creators.make_constructor_t( fc ) ) + + self.curr_decl = cls_decl + self.curr_code_creator = cls_parent_cc + + + def visit_enumeration(self): + self.__dependencies_manager.add_exported( self.curr_decl ) + maker = None + if self.curr_decl.name: + maker = code_creators.enum_t( enum=self.curr_decl ) + else: + maker = code_creators.unnamed_enum_t( unnamed_enum=self.curr_decl ) + self.curr_code_creator.adopt_creator( maker ) + + def visit_namespace(self): + pass + + def visit_typedef(self): + pass + + def _register_array_1( self, array_type ): + data = ( array_type.decl_string, declarations.array_size( array_type ) ) + if data in self.__array_1_registered: + return False + else: + self.__array_1_registered.add( data ) + return True + + def visit_variable(self): + self.__types_db.update( self.curr_decl ) + self.__dependencies_manager.add_exported( self.curr_decl ) + + if self.curr_decl.expose_address: + creator_type = None + if isinstance( self.curr_decl.parent, declarations.namespace_t ): + creator_type = code_creators.global_variable_addressof_t + else: + creator_type = code_creators.member_variable_addressof_t + self.curr_code_creator.adopt_creator( creator_type(self.curr_decl) ) + return + + if not self.curr_decl.expose_value: + return + + if declarations.is_array( self.curr_decl.type ): + if self._register_array_1( self.curr_decl.type ): + array_1_registrator = code_creators.array_1_registrator_t( array_type=self.curr_decl.type ) + self.curr_code_creator.adopt_creator( array_1_registrator ) + + if isinstance( self.curr_decl.parent, declarations.namespace_t ): + maker = None + wrapper = None + if declarations.is_array( self.curr_decl.type ): + wrapper = code_creators.array_gv_wrapper_t( variable=self.curr_decl ) + maker = code_creators.array_gv_t( variable=self.curr_decl, wrapper=wrapper ) + else: + maker = code_creators.global_variable_t( variable=self.curr_decl ) + if wrapper: + self.__extmodule.adopt_declaration_creator( wrapper ) + else: + maker = None + wrapper = None + if self.curr_decl.bits != None: + wrapper = code_creators.bit_field_wrapper_t( variable=self.curr_decl ) + maker = code_creators.bit_field_t( variable=self.curr_decl, wrapper=wrapper ) + elif declarations.is_array( self.curr_decl.type ): + wrapper = code_creators.array_mv_wrapper_t( variable=self.curr_decl ) + maker = code_creators.array_mv_t( variable=self.curr_decl, wrapper=wrapper ) + elif declarations.is_pointer( self.curr_decl.type ): + wrapper = code_creators.member_variable_wrapper_t( variable=self.curr_decl ) + maker = code_creators.member_variable_t( variable=self.curr_decl, wrapper=wrapper ) + elif declarations.is_reference( self.curr_decl.type ): + if None is self.curr_decl.getter_call_policies: + self.curr_decl.getter_call_policies = self.__call_policies_resolver( self.curr_decl, 'get' ) + if None is self.curr_decl.setter_call_policies: + self.curr_decl.setter_call_policies = self.__call_policies_resolver( self.curr_decl, 'set' ) + wrapper = code_creators.mem_var_ref_wrapper_t( variable=self.curr_decl ) + maker = code_creators.mem_var_ref_t( variable=self.curr_decl, wrapper=wrapper ) + self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) + else: + maker = code_creators.member_variable_t( variable=self.curr_decl ) + if wrapper: + self.curr_code_creator.wrapper.adopt_creator( wrapper ) + self.curr_code_creator.adopt_creator( maker ) Deleted: pyplusplus_dev/pyplusplus/creators_factory/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/creator.py 2008-12-26 07:58:38 UTC (rev 1501) +++ pyplusplus_dev/pyplusplus/creators_factory/creator.py 2008-12-26 08:05:27 UTC (rev 1502) @@ -1,745 +0,0 @@ -# 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 types_database -import creators_wizard -import sort_algorithms -import dependencies_manager -import opaque_types_manager -import call_policies_resolver -import fake_constructors_manager - -from pygccxml import declarations -from pyplusplus import decl_wrappers -from pyplusplus import code_creators -from pyplusplus import code_repository -from pyplusplus import _logging_ - -ACCESS_TYPES = declarations.ACCESS_TYPES -VIRTUALITY_TYPES = declarations.VIRTUALITY_TYPES - -class creator_t( declarations.decl_visitor_t ): - """Creating code creators. - - This class takes a set of declarations as input and creates a code - creator tree that contains the Boost.Python C++ source code for the - final extension module. Each node in the code creators tree represents - a block of text (C++ source code). - - Usage of this class: Create an instance and pass all relevant input - data to the constructor. Then call L{create()} to obtain the code - creator tree whose root node is a L{module_t<code_creators.module_t>} - object representing the source code for the entire extension module. - """ - - def __init__( self - , decls - , module_name - , boost_python_ns_name='bp' - , call_policies_resolver_=None - , types_db=None - , target_configuration=None - , enable_indexing_suite=True - , doc_extractor=None ): - """Constructor. - - @param decls: Declarations that should be exposed in the final module. - @param module_name: The name of the final module. - @param boost_python_ns_name: The alias for the boost::python namespace. - @param call_policies_resolver_: Callable that takes one declaration (calldef_t) as input and returns a call policy object which should be used for this declaration. - @param types_db: ...todo... - @param target_configuration: A target configuration object can be used to customize the generated source code to a particular compiler or a particular version of Boost.Python. - @param doc_extractor: callable, that takes as argument declaration reference and returns documentation string - @param already_exposed_dbs: list of files/directories other modules, this module depends on, generated their code too - @type decls: list of declaration_t - @type module_name: str - @type boost_python_ns_name: str - @type call_policies_resolver_: callable - @type types_db: L{types_database_t<types_database.types_database_t>} - @type target_configuration: L{target_configuration_t<code_creators.target_configuration_t>} - @type doc_extractor: callable - @type already_exposed_dbs: list of strings - """ - declarations.decl_visitor_t.__init__(self) - self.logger = _logging_.loggers.module_builder - self.decl_logger = _logging_.loggers.declarations - - self.__enable_indexing_suite = enable_indexing_suite - self.__target_configuration = target_configuration - if not self.__target_configuration: - self.__target_configuration = code_creators.target_configuration_t() - - self.__call_policies_resolver = call_policies_resolver_ - if not self.__call_policies_resolver: - self.__call_policies_resolver \ - = call_policies_resolver.built_in_resolver_t(self.__target_configuration) - - self.__types_db = types_db - if not self.__types_db: - self.__types_db = types_database.types_database_t() - - global_ns = declarations.get_global_namespace(decls) - self.__extmodule = code_creators.bpmodule_t( global_ns ) - if boost_python_ns_name: - bp_ns_alias = code_creators.namespace_alias_t( alias=boost_python_ns_name - , full_namespace_name='::boost::python' ) - self.__extmodule.adopt_creator( bp_ns_alias ) - - self.__module_body = code_creators.module_body_t( name=module_name ) - - self.__extmodule.adopt_creator( self.__module_body ) - - self.__opaque_types_manager = opaque_types_manager.manager_t( self.__extmodule ) - self.__dependencies_manager = dependencies_manager.manager_t(self.decl_logger) - - prepared_decls = self._prepare_decls( decls, doc_extractor ) - self.__decls = sort_algorithms.sort( prepared_decls ) - - self.curr_code_creator = self.__module_body - self.curr_decl = None - self.__array_1_registered = set() #(type.decl_string,size) - self.__free_operators = [] - self.__std_containers_free_operators = {} - self.__exposed_free_fun_overloads = set() - self.__fc_manager = fake_constructors_manager.manager_t( global_ns ) - - def __print_readme( self, decl ): - readme = decl.readme() - if not readme: - return - - if not decl.exportable: - reason = readme[0] - readme = readme[1:] - self.decl_logger.warn( "%s;%s" % ( decl, reason ) ) - - for msg in readme: - self.decl_logger.warn( "%s;%s" % ( decl, msg ) ) - - def _prepare_decls( self, decls, doc_extractor ): - to_be_exposed = [] - for decl in declarations.make_flatten( decls ): - if decl.ignore: - continue - - if isinstance( decl, declarations.namespace_t ): - continue - - if not decl.exportable: - #leave only decls that user wants to export and that could be exported - self.__print_readme( decl ) - continue - - if decl.already_exposed: - #check wether this is already exposed in other module - continue - - if isinstance( decl.parent, declarations.namespace_t ): - #leave only declarations defined under namespace, but remove namespaces - to_be_exposed.append( decl ) - - #Right now this functionality introduce a bug: declarations that should - #not be exported for some reason are not marked as such. I will need to - #find out. - #if isinstance( decl, declarations.calldef_t ) and not isinstance( decl, declarations.destructor_t ): - #self.__types_db.update( decl ) - #if None is decl.call_policies: - #decl.call_policies = self.__call_policies_resolver( decl ) - - #if isinstance( decl, declarations.variable_t ): - #self.__types_db.update( decl ) - - if doc_extractor: - decl.documentation = doc_extractor( decl ) - - self.__print_readme( decl ) - - return to_be_exposed - - def _adopt_free_operator( self, operator ): - def adopt_operator_impl( operator, found_creators ): - creator = filter( lambda creator: isinstance( creator, code_creators.class_t ) - , found_creators ) - if len(creator) == 1: - creator = creator[0] - #I think I don't need this condition any more - if not find( lambda creator: isinstance( creator, code_creators.declaration_based_t ) - and operator is creator.declaration - , creator.creators ): - #expose operator only once - self.__dependencies_manager.add_exported( operator ) - creator.adopt_creator( code_creators.operator_t( operator=operator ) ) - elif not creator: - pass - else: - assert not "Found %d class code creators" % len(creator) - - find = code_creators.creator_finder.find_by_declaration - if operator.target_class and operator.target_class.ignore == False: - found = find( lambda decl: operator.target_class is decl - , self.__extmodule.body.creators ) - adopt_operator_impl( operator, found ) - - def _is_registered_smart_pointer_creator( self, creator, db ): - for registered in db: - if not isinstance( creator, registered.__class__ ): - continue - elif registered.smart_ptr != creator.smart_ptr: - continue - elif isinstance( creator, code_creators.smart_pointer_registrator_t ): - if creator.declaration is registered.declaration: - return True - elif isinstance( creator, code_creators.smart_pointers_converter_t ): - if ( creator.source is registered.source ) \ - and ( creator.target is registered.target ): - return True - else: - assert not "unknown instace of registrator: " % str( registered ) - - def _treat_smart_pointers( self ): - """ Go to all class creators and apply held_type and creator registrators - as needed. - """ - find_classes = code_creators.creator_finder.find_by_class_instance - class_creators = find_classes( what=code_creators.class_t - , where=self.__extmodule.body.creators - , recursive=True ) - registrators_db = [] - for creator in class_creators: - if None is creator.held_type: - if not creator.declaration.is_abstract: - creator.held_type = self.__types_db.create_holder( creator.declaration ) - registrators = self.__types_db.create_registrators( creator ) - for r in registrators: - if not self._is_registered_smart_pointer_creator( r, registrators_db ): - creator.adopt_creator(r) - registrators_db.append(r) - - def _append_user_code( self ): - find_classes = code_creators.creator_finder.find_by_class_instance - class_creators = find_classes( what=code_creators.class_t - , where=self.__extmodule.body.creators - , recursive=True ) - - ctext_t = code_creators.custom_text_t - for cls_creator in class_creators: - cls_decl = cls_creator.declaration - - uc_creators_head = map( lambda uc: ctext_t( uc.text, uc.works_on_instance ) - , cls_decl.registration_code_head ) - cls_creator.adopt_creators( uc_creators_head, 0 ) - - uc_creators_tail = map( lambda uc: ctext_t( uc.text, uc.works_on_instance ) - , cls_decl.registration_code_tail ) - cls_creator.adopt_creators( uc_creators_tail ) - - uc_creators = map( lambda uc: ctext_t( uc.text ), cls_decl.wrapper_code ) - if uc_creators: - cls_creator.wrapper.adopt_creators( uc_creators ) - - uc_creators = map( lambda uc: ctext_t( uc.text ), cls_decl.declaration_code ) - insert_pos = self.__extmodule.creators.index( self.__module_body ) - self.__extmodule.adopt_creators( uc_creators, insert_pos ) - cls_creator.associated_decl_creators.extend( uc_creators ) - - def __get_exposed_containers(self): - """list of exposed declarations, which were not ``included``, but still - were exposed. For example, std containers - - std containers exposed by Py++, even if the user didn't ``include`` them. - """ - cmp_by_name = lambda cls1, cls2: cmp( cls1.decl_string, cls2.decl_string ) - used_containers = list( self.__types_db.used_containers ) - used_containers = filter( lambda cls: cls.indexing_suite.include_files - , used_containers ) - used_containers.sort( cmp_by_name ) - used_containers = filter( lambda cnt: cnt.already_exposed == False - , used_containers ) - return used_containers - - def _treat_indexing_suite( self ): - def create_explanation(cls): - msg = '//WARNING: the next line of code will not compile, because "%s" does not have operator== !' - msg = msg % cls.indexing_suite.element_type.decl_string - return code_creators.custom_text_t( msg, False ) - - def create_cls_cc( cls ): - if isinstance( cls, declarations.class_t ): - return code_creators.class_t( class_inst=cls ) - else: - return code_creators.class_declaration_t( class_inst=cls ) - - if not self.__types_db.used_containers: - return - - creators = [] - created_value_traits = set() - for cls in self.__get_exposed_containers(): - self.__print_readme( cls ) - - cls_creator = create_cls_cc( cls ) - self.__dependencies_manager.add_exported( cls ) - creators.append( cls_creator ) - try: - element_type = cls.indexing_suite.element_type - except: - element_type = None - - if isinstance( cls.indexing_suite, decl_wrappers.indexing_suite1_t ): - if not ( None is element_type ) \ - and declarations.is_class( element_type ) \ - and not declarations.has_public_equal( element_type ): - cls_creator.adopt_creator( create_explanation( cls ) ) - cls_creator.adopt_creator( code_creators.indexing_suite1_t(cls) ) - else: - class_traits = declarations.class_traits - if not ( None is element_type ) and class_traits.is_my_case( element_type ): - value_cls = class_traits.get_declaration( element_type ) - has_prerequisits = value_cls.less_than_comparable \ - and value_cls.equality_comparable - if ( not has_prerequisits ) and ( value_cls not in created_value_traits ): - created_value_traits.add( value_cls ) - element_type_cc = code_creators.value_traits_t( value_cls ) - self.__extmodule.adopt_declaration_creator( element_type_cc ) - cls_creator.adopt_creator( code_creators.indexing_suite2_t(cls) ) - - scfo = self.__std_containers_free_operators - if cls in scfo: - for operator in scfo[cls]: - self.__dependencies_manager.add_exported( operator ) - cls_creator.adopt_creator( code_creators.operator_t( operator=operator ) ) - - creators.reverse() - self.__module_body.adopt_creators( creators, 0 ) - - def create(self, decl_headers=None): - """Create and return the module for the extension. - - @param decl_headers: If None the headers for the wrapped decls are automatically found. - But you can pass a list of headers here to override that search. - @returns: Returns the root of the code creators tree - @rtype: L{module_t<code_creators.module_t>} - """ - # Invoke the appropriate visit_*() method on all decls - for decl in self.__decls: - self.curr_decl = decl - declarations.apply_visitor( self, decl ) - for operator in self.__free_operators: - self._adopt_free_operator( operator ) - self._treat_smart_pointers() - if self.__enable_indexing_suite: - self._treat_indexing_suite() - for creator in code_creators.make_flatten_generator( self.__extmodule ): - creator.target_configuration = self.__target_configuration - #last action. - self._append_user_code() - - add_include = self.__extmodule.add_include - #add system headers - system_headers = self.__extmodule.get_system_headers( recursive=True, unique=True ) - map( lambda header: add_include( header, user_defined=False, system=True ) - , system_headers ) - #add user defined header files - if decl_headers is None: - decl_headers = declarations.declaration_files( self.__decls ) - map( lambda header: add_include( header, user_defined=False, system=False ) - , decl_headers ) - - self.__dependencies_manager.inform_user() - - return self.__extmodule - - def visit_member_function( self ): - self.__types_db.update( self.curr_decl ) - self.__dependencies_manager.add_exported( self.curr_decl ) - - if self.__fc_manager.is_fake_constructor( self.curr_decl ): - return - - fwrapper = None - if None is self.curr_decl.call_policies: - self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) - - maker_cls, fwrapper_cls = creators_wizard.find_out_mem_fun_creator_classes( self.curr_decl ) - - maker = None - fwrapper = None - if fwrapper_cls: - fwrapper = fwrapper_cls( function=self.curr_decl ) - if fwrapper_cls is code_creators.mem_fun_transformed_wrapper_t: - if self.curr_code_creator.wrapper: - class_wrapper = self.curr_code_creator.wrapper - class_wrapper.adopt_creator( fwrapper ) - else: - self.__extmodule.adopt_declaration_creator( fwrapper ) - self.curr_code_creator.associated_decl_creators.append(fwrapper) - else: - class_wrapper = self.curr_code_creator.wrapper - class_wrapper.adopt_creator( fwrapper ) - - if maker_cls: - if fwrapper: - maker = maker_cls( function=self.curr_decl, wrapper=fwrapper ) - else: - maker = maker_cls( function=self.curr_decl ) - self.curr_code_creator.adopt_creator( maker ) - self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) - - if self.curr_decl.has_static: - #static_method should be created only once. - found = filter( lambda creator: isinstance( creator, code_creators.static_method_t ) - and creator.declaration.name == self.curr_decl.name - , self.curr_code_creator.creators ) - if not found: - static_method = code_creators.static_method_t( function=self.curr_decl - , function_code_creator=maker ) - self.curr_code_creator.adopt_creator( static_method ) - - def visit_constructor( self ): - self.__types_db.update( self.curr_decl ) - self.__dependencies_manager.add_exported( self.curr_decl ) - - cwrapper = None - if self.curr_decl.parent.is_wrapper_needed(): - class_wrapper = self.curr_code_creator.wrapper - cwrapper = code_creators.constructor_wrapper_t( constructor=self.curr_decl ) - class_wrapper.adopt_creator( cwrapper ) - #TODO: FT for constructor - #~ if self.curr_decl.transformations: - #~ cwrapper = code_creators.constructor_transformed_wrapper_t( constructor=self.curr_decl ) - #~ class_wrapper.adopt_creator( cwrapper ) - #~ else: - #~ if self.curr_decl.transformations: - #~ cwrapper = code_creators.constructor_transformed_wrapper_t( constructor=self.curr_decl ) - #~ class_wrapper.adopt_creator( cwrapper ) - #~ self.__module_body.adopt_creator( cwrapper ) - #~ self.curr_code_creator.associated_decl_creators.append( cwrapper ) - #~ maker = None - #~ if self.curr_decl.transformations: - #~ maker = code_creators.constructor_transformed_t( constructor=self.curr_decl ) - #~ else: - maker = code_creators.constructor_t( constructor=self.curr_decl, wrapper=cwrapper ) - if None is self.curr_decl.call_policies: - self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) - self.curr_code_creator.adopt_creator( maker ) - - if self.curr_decl.allow_implicit_conversion: - maker = code_creators.casting_constructor_t( constructor=self.curr_decl ) - #casting constructor will be generated in the same file as class - self.curr_code_creator.adopt_creator( maker ) - - - def visit_destructor( self ): - pass - - def visit_member_operator( self ): - if self.curr_decl.symbol in ( '()', '[]', '=' ): - self.visit_member_function() - else: - self.__types_db.update( self.curr_decl ) - maker = code_creators.operator_t( operator=self.curr_decl ) - self.curr_code_creator.adopt_creator( maker ) - self.__dependencies_manager.add_exported( self.curr_decl ) - - def visit_casting_operator( self ): - self.__dependencies_manager.add_exported( self.curr_decl ) - if None is self.curr_decl.call_policies: - self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) - - self.__types_db.update( self.curr_decl ) - if not self.curr_decl.parent.is_abstract and not declarations.is_reference( self.curr_decl.return_type ): - maker = code_creators.casting_operator_t( operator=self.curr_decl ) - self.__module_body.adopt_creator( maker ) - self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) - - #what to do if class is abstract - maker = code_creators.casting_member_operator_t( operator=self.curr_decl ) - self.curr_code_creator.adopt_creator( maker ) - self.__opaque_types_manager.register_opaque( maker, self.curr_decl ) - - def visit_free_function( self ): - if self.curr_decl in self.__exposed_free_fun_overloads: - ... [truncated message content] |
From: <rom...@us...> - 2009-01-03 09:00:23
|
Revision: 1521 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1521&view=rev Author: roman_yakovenko Date: 2009-01-03 09:00:19 +0000 (Sat, 03 Jan 2009) Log Message: ----------- few changes to allow easybmp example to work Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py pyplusplus_dev/pyplusplus/code_creators/fields_definition.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/typedef_as_pyvar.py Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-01-03 08:50:16 UTC (rev 1520) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-01-03 09:00:19 UTC (rev 1521) @@ -163,3 +163,4 @@ from function_definition import multi_method_definition_t from function_definition import del_definition_t from function_definition import mem_fun_definition_t +from typedef_as_pyvar import typedef_as_pyvar_t Modified: pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py 2009-01-03 08:50:16 UTC (rev 1520) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py 2009-01-03 09:00:19 UTC (rev 1521) @@ -133,7 +133,12 @@ #~ raise NotImplementedError() def visit_declarated( self ): - return self.decl_formatter( self.user_type.declaration ) + #TODO: the follwoing code removes typedefs + if isinstance( self.user_type.declaration, declarations.typedef_t ): + base_visitor = type_converter_t( self.user_type.declaration.type, self.decl_formatter ) + return declarations.apply_visitor( base_visitor, base_visitor.user_type ) + else: + return self.decl_formatter( self.user_type.declaration ) def visit_restrict( self ): base_visitor = type_converter_t( self.user_type.base, self.decl_formatter ) Modified: pyplusplus_dev/pyplusplus/code_creators/fields_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2009-01-03 08:50:16 UTC (rev 1520) +++ pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2009-01-03 09:00:19 UTC (rev 1521) @@ -5,6 +5,7 @@ import os import code_creator +import ctypes_formatter import declaration_based from pygccxml import declarations @@ -25,8 +26,17 @@ , decl_identifier=self.decl_identifier) ) if self.declaration.has_vtable: result.append( self.indent( '("_vtable_", ctypes.POINTER(ctypes.c_void_p)),' ) ) - result.append( self.indent( '("__hidden__", ctypes.c_char * %d),' - % ( self.declaration.byte_size - 4*int(self.declaration.has_vtable) ) ) ) + + vars = self.declaration.vars( allow_empty=True, recursive=False ) + if not vars: + result.append( self.indent( '("__empty__", ctypes.c_char * 4)' ) ) + else: + vars = vars.to_list() + vars.sort( key=lambda d: d.location.line ) + for v in vars: + result.append( self.indent( '("%(name)s", %(type)s),' + % dict( name=v.name + ,type=ctypes_formatter.as_ctype( v.type ) ) ) ) result.append( ']' ) return os.linesep.join( result ) Added: pyplusplus_dev/pyplusplus/code_creators/typedef_as_pyvar.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/typedef_as_pyvar.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/typedef_as_pyvar.py 2009-01-03 09:00:19 UTC (rev 1521) @@ -0,0 +1,22 @@ +# 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 code_creator +import ctypes_formatter +import declaration_based + +class typedef_as_pyvar_t(code_creator.code_creator_t, declaration_based.declaration_based_t): + def __init__( self, ns ): + code_creator.code_creator_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, ns ) + + def _create_impl(self): + return "%(complete_py_name)s = %(type)s" \ + % dict( complete_py_name=self.complete_py_name + , type=ctypes_formatter.as_ctype( self.declaration.type ) ) + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-03 08:50:16 UTC (rev 1520) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-03 09:00:19 UTC (rev 1521) @@ -36,7 +36,8 @@ self.__class_ccs = code_creators.bookmark_t() #bookmark for class deinitions self.__class_defs_ccs = code_creators.bookmark_t() - + #bookmark for typedef definitions + self.__typedefs_ccs = code_creators.bookmark_t() #~ prepared_decls = self.__prepare_decls( global_ns, doc_extractor ) #~ self.__decls = sort_algorithms.sort( prepared_decls ) self.curr_decl = global_ns @@ -138,11 +139,14 @@ ns_classes = self.global_ns.classes( f, recursive=True, allow_empty=True) ns_classes = sort_algorithms.sort_classes( ns_classes ) for class_ in ns_classes: - if self.__contains_exported( class_ ): - self.__add_class_introductions( self.__class_ccs, class_ ) + self.__add_class_introductions( self.__class_ccs, class_ ) ccc.adopt_creator( self.__class_defs_ccs ) + ccc.adopt_creator( code_creators.separator_t() ) + + ccc.adopt_creator( self.__typedefs_ccs ) + declarations.apply_visitor( self, self.curr_decl ) self.__dependencies_manager.inform_user() @@ -248,6 +252,7 @@ def visit_typedef(self): self.__dependencies_manager.add_exported( self.curr_decl ) + self.__typedefs_ccs.adopt_creator( code_creators.typedef_as_pyvar_t( self.curr_decl ) ) def visit_variable(self): self.__dependencies_manager.add_exported( self.curr_decl ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-05 20:35:14
|
Revision: 1534 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1534&view=rev Author: roman_yakovenko Date: 2009-01-05 20:35:09 +0000 (Mon, 05 Jan 2009) Log Message: ----------- calling convention is taking into account, while generating free functions Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/calldef.py pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py pyplusplus_dev/examples/pyeasybmp_dev/ctypes/grayscale.py pyplusplus_dev/pyplusplus/code_creators/function_definition.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py Modified: pygccxml_dev/pygccxml/declarations/calldef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/calldef.py 2009-01-05 15:07:31 UTC (rev 1533) +++ pygccxml_dev/pygccxml/declarations/calldef.py 2009-01-05 20:35:09 UTC (rev 1534) @@ -43,7 +43,7 @@ FASTCALL = 'fastcall' SYSTEM_DEFAULT = '<<<system default>>>' - ALL = ( UNKNOWN, CDECL, STDCALL, THISCALL, FASTCALL ) + all = ( UNKNOWN, CDECL, STDCALL, THISCALL, FASTCALL, SYSTEM_DEFAULT ) pattern = re.compile( r'.*(?:^|\s)(?:__)?(?P<cc>cdecl|stdcall|thiscall|fastcall)(?:__)?.*' ) Modified: pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py =================================================================== --- pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py 2009-01-05 15:07:31 UTC (rev 1533) +++ pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py 2009-01-05 20:35:09 UTC (rev 1534) @@ -1,5 +1,7 @@ # This file has been generated by Py++. +import sys + import ctypes import ctypes_utils @@ -251,9 +253,7 @@ mfcreator = ctypes_utils.mem_fun_factory( easybmplib, BMFH, "BMFH" ) BMFH._methods_ = { #class non-virtual member functions definition list - "__init__" : mfcreator.multi_method() - .register( mfcreator.default_constructor() ) - .finalize(), + "__init__" : mfcreator.default_constructor(), "display" : mfcreator( "void BMFH::display(void)" ), @@ -277,9 +277,7 @@ mfcreator = ctypes_utils.mem_fun_factory( easybmplib, BMIH, "BMIH" ) BMIH._methods_ = { #class non-virtual member functions definition list - "__init__" : mfcreator.multi_method() - .register( mfcreator.default_constructor() ) - .finalize(), + "__init__" : mfcreator.default_constructor(), "display" : mfcreator( "void BMIH::display(void)" ), @@ -330,9 +328,7 @@ "TellHorizontalDPI" : mfcreator( "int BMP::TellHorizontalDPI(void)", restype=ctypes.c_int ), - "__init__" : mfcreator.multi_method() - .register( mfcreator.default_constructor() ) - .finalize(), + "__init__" : mfcreator.default_constructor(), "__del__" : mfcreator.destructor(is_virtual=False), @@ -372,21 +368,17 @@ } del mfcreator -Square = getattr( easybmplib, easybmplib.undecorated_names["double Square(double)"] ) -Square.restype = ctypes.c_double -Square.argtypes = [ ctypes.c_double ] +Square_type = ctypes.CFUNCTYPE( ctypes.c_double, ctypes.c_double ) +Square = Square_type( ( easybmplib.undecorated_names["double Square(double)"], easybmplib ) ) -IntSquare = getattr( easybmplib, easybmplib.undecorated_names["int IntSquare(int)"] ) -IntSquare.restype = ctypes.c_int -IntSquare.argtypes = [ ctypes.c_int ] +IntSquare_type = ctypes.CFUNCTYPE( ctypes.c_int, ctypes.c_int ) +IntSquare = IntSquare_type( ( easybmplib.undecorated_names["int IntSquare(int)"], easybmplib ) ) -FlipDWORD = getattr( easybmplib, easybmplib.undecorated_names["unsigned int FlipDWORD(unsigned int)"] ) -FlipDWORD.restype = ctypes.c_uint -FlipDWORD.argtypes = [ ctypes.c_uint ] +FlipDWORD_type = ctypes.CFUNCTYPE( ctypes.c_uint, ctypes.c_uint ) +FlipDWORD = FlipDWORD_type( ( easybmplib.undecorated_names["unsigned int FlipDWORD(unsigned int)"], easybmplib ) ) -IsBigEndian = getattr( easybmplib, easybmplib.undecorated_names["bool IsBigEndian(void)"] ) -IsBigEndian.restype = ctypes.c_bool +IsBigEndian_type = ctypes.CFUNCTYPE( ctypes.c_bool ) +IsBigEndian = IsBigEndian_type( ( easybmplib.undecorated_names["bool IsBigEndian(void)"], easybmplib ) ) -FlipWORD = getattr( easybmplib, easybmplib.undecorated_names["unsigned short FlipWORD(unsigned short)"] ) -FlipWORD.restype = ctypes.c_ushort -FlipWORD.argtypes = [ ctypes.c_ushort ] +FlipWORD_type = ctypes.CFUNCTYPE( ctypes.c_ushort, ctypes.c_ushort ) +FlipWORD = FlipWORD_type( ( easybmplib.undecorated_names["unsigned short FlipWORD(unsigned short)"], easybmplib ) ) Modified: pyplusplus_dev/examples/pyeasybmp_dev/ctypes/grayscale.py =================================================================== --- pyplusplus_dev/examples/pyeasybmp_dev/ctypes/grayscale.py 2009-01-05 15:07:31 UTC (rev 1533) +++ pyplusplus_dev/examples/pyeasybmp_dev/ctypes/grayscale.py 2009-01-05 20:35:09 UTC (rev 1534) @@ -5,10 +5,8 @@ # http://www.boost.org/LICENSE_1_0.txt) import sys -import math import easybmp as pyeasybmp -pyeasybmp.IntSquare = lambda x: int( math.sqrt( x ) ) def grayscale_example(source, target): bmp = pyeasybmp.BMP() @@ -20,15 +18,10 @@ print 'bit depth: ', bmp.TellBitDepth() print 'number of colors: ', bmp.TellNumberOfColors() - print bmp.GetPixel( 1,1 ) - byte = lambda x: 255 & x for j in range( bmp.TellHeight() ): - j += 1 for i in range( bmp.TellWidth() ): - i += 1 - print i, ', ', j temp = pyeasybmp.IntSquare( bmp.GetPixel(i,j).Red ) \ + pyeasybmp.IntSquare( bmp.GetPixel(i,j).Green ) \ + pyeasybmp.IntSquare( bmp.GetPixel(i,j).Blue ) Modified: pyplusplus_dev/pyplusplus/code_creators/function_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2009-01-05 15:07:31 UTC (rev 1533) +++ pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2009-01-05 20:35:09 UTC (rev 1534) @@ -12,7 +12,19 @@ #TODO - unable to call C function, if dll was loaded as CPPDLL +CCT = declarations.CALLING_CONVENTION_TYPES +function_prototype_mapping = { + CCT.UNKNOWN : 'CFUNCTYPE' + , CCT.CDECL : 'CFUNCTYPE' + , CCT.STDCALL : 'WINFUNCTYPE' + , CCT.THISCALL : 'CPPMETHODTYPE' + , CCT.FASTCALL : '<<<fastcall unsupported>>>' + , CCT.SYSTEM_DEFAULT : 'CFUNCTYPE' +} + +assert len( function_prototype_mapping ) == len( CCT.all ) + class METHOD_MODE: STAND_ALONE = "stand alone" MULTI_METHOD = "multi method" @@ -42,14 +54,17 @@ def ftype( self ): return self.declaration.function_type() - def join_arguments( self, args ): + def join_arguments( self, args, group_in_list=True ): args_str = '' arg_separator = ', ' if 1 == len( args ): args_str = ' ' + args[0] + ' ' else: args_str = ' ' + arg_separator.join( args ) + ' ' - return '[%s]' % args_str + if group_in_list: + return '[%s]' % args_str + else: + return args_str @property def mem_fun_factory_var_name( self ): @@ -61,11 +76,11 @@ else: return '' - def argtypes_code(self): + def argtypes_code(self, group_in_list=True): if not self.ftype.arguments_types: return '' args = map( ctypes_formatter.as_ctype, self.ftype.arguments_types ) - return self.join_arguments( args ) + return self.join_arguments( args, group_in_list ) def _get_system_headers_impl( self ): return [] @@ -76,21 +91,36 @@ callable_definition_t.__init__( self, free_fun ) def _create_impl(self): + global function_prototype_mapping result = [] - result.append( '%(alias)s = getattr( %(library_var_name)s, %(library_var_name)s.undecorated_names["%(undecorated_decl_name)s"] )' - % dict( alias=self.declaration.alias - , library_var_name=self.top_parent.library_var_name - , undecorated_decl_name=self.undecorated_decl_name) ) + result.append( '%(alias)s_type = ctypes.%(prototype)s( %(restype)s%(argtypes)s )' ) + result.append( '%(alias)s = %(alias)s_type( ( %(library_var_name)s.undecorated_names["%(undecorated_decl_name)s"], %(library_var_name)s ) )' ) + restype = self.restype_code() - if restype: - result.append( '%(alias)s.restype = %(restype)s' - % dict( alias=self.declaration.alias, restype=restype ) ) + argtypes = self.argtypes_code( group_in_list=False ) - argtypes = self.argtypes_code() - if argtypes: - result.append( '%(alias)s.argtypes = %(argtypes)s' - % dict( alias=self.declaration.alias, argtypes=argtypes ) ) + return os.linesep.join( result ) \ + % dict( alias=self.declaration.alias + , prototype=function_prototype_mapping[ self.declaration.calling_convention ] + , restype=self.iif( restype, restype, 'None' ) + , argtypes=self.iif( argtypes, ',' + argtypes, '' ) + , library_var_name=self.top_parent.library_var_name + , undecorated_decl_name=self.undecorated_decl_name ) + #~ result.append( '%(alias)s = getattr( %(library_var_name)s, %(library_var_name)s.undecorated_names["%(undecorated_decl_name)s"] )' + #~ % dict( alias=self.declaration.alias + #~ , library_var_name=self.top_parent.library_var_name + #~ , undecorated_decl_name=self.undecorated_decl_name) ) + #~ restype = self.restype_code() + #~ if restype: + #~ result.append( '%(alias)s.restype = %(restype)s' + #~ % dict( alias=self.declaration.alias, restype=restype ) ) + + #~ argtypes = self.argtypes_code() + #~ if argtypes: + #~ result.append( '%(alias)s.argtypes = %(argtypes)s' + #~ % dict( alias=self.declaration.alias, argtypes=argtypes ) ) + return os.linesep.join( result ) class init_definition_t( callable_definition_t ): @@ -111,11 +141,10 @@ tmpl = '"%(undecorated_decl_name)s", argtypes=%(args)s' if self.method_mode == METHOD_MODE.STAND_ALONE: tmpl = '%(mfcreator)s( ' + tmpl + ' )' - substitue_dict['args'] = self.argtypes_code() substitue_dict['undecorated_decl_name'] = self.undecorated_decl_name if self.method_mode == METHOD_MODE.STAND_ALONE: - tmp = '"%s" : %s' % ( self.declaration.alias, tmpl ) + tmpl = '"%s" : %s,' % ( self.alias, tmpl ) return tmpl % substitue_dict #TODO: aliases for a mem fun and const mem fun with the same name should be different @@ -156,6 +185,12 @@ return self.get_first_callable().alias def _create_impl(self): + #small hack, this class should not be created at all if there is only one callable + if len( self.creators ) == 1: + if isinstance( self.creators[0], callable_definition_t ): + self.creators[0].method_mode = METHOD_MODE.STAND_ALONE + return self.creators[0].create() + result = [] return_type = self.get_first_callable().ftype.return_type Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-05 15:07:31 UTC (rev 1533) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-05 20:35:09 UTC (rev 1534) @@ -92,26 +92,26 @@ they_depend_on_me = decls_package.dependency_info_t.they_depend_on_me for d in included_decls: d.include() - self.logger.info( 'including decl %s' % str(d) ) + self.logger.debug( 'including decl %s' % str(d) ) parent = d.parent while True: if isinstance( parent, decls_package.namespace_t ): break else: - self.logger.info( 'including parent class %s' % str(parent) ) + self.logger.debug( 'including parent class %s' % str(parent) ) parent.ignore = False parent = parent.parent for dependency in they_depend_on_me( d ): - self.logger.info( 'discovered dependency %s' % str(dependency) ) + self.logger.debug( 'discovered dependency %s' % str(dependency) ) #include declarations, on which exported declarations depend #I need this for classes, referenced by function arguments decls_traits = ( decls_package.class_traits, decls_package.class_declaration_traits, decls_package.enum_traits ) for traits in decls_traits: if traits.is_my_case( dependency ): - self.logger.info( 'discovered dependency %s - included' % str(dependency) ) + self.logger.debug( 'discovered dependency %s - included' % str(dependency) ) traits.get_declaration( dependency ).ignore = False - self.logger.info( 'including decl %s - done' % str(d) ) + self.logger.debug( 'including decl %s - done' % str(d) ) def build_code_creator( self, library_path, doc_extractor=None ): creator = creators_factory.ctypes_creator_t( self.global_ns This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-12 22:55:23
|
Revision: 1563 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1563&view=rev Author: roman_yakovenko Date: 2009-01-12 22:02:33 +0000 (Mon, 12 Jan 2009) Log Message: ----------- changing treatment of opaque types Modified Paths: -------------- pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py Modified: pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-01-12 21:48:25 UTC (rev 1562) +++ pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-01-12 22:02:33 UTC (rev 1563) @@ -126,6 +126,10 @@ if isinstance( decl, declarations.namespace_t ): continue + + if isinstance( decl, declarations.class_types ): + if decl.opaque: + continue if not decl.exportable: #leave only decls that user wants to export and that could be exported Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2009-01-12 21:48:25 UTC (rev 1562) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2009-01-12 22:02:33 UTC (rev 1563) @@ -137,15 +137,14 @@ def _get_opaque( self ): return self._opaque - def _set_opaque( self, value ): self._opaque = value - self.ignore = value #don't expose opaque type - opaque = property( _get_opaque, _set_opaque - , doc="If True, Py++ will treat return types and arguments T* as opaque types." \ - +"Thus it will be able to generate code, that uses " \ - +" BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID macro in a right places." ) + , doc="If True, Py++ will treat return types and arguments T* as opaque types. " + +"nFor Boost.Python code generator it means that macro BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID everywhere it needed. " + +"For ctypes code generator it means that the class will be introduced, but without fields. " + +"For both code generators it means: you will only be able to get and pass pointers around. " + +"Other functionality will not be available." ) @property def class_var_name(self): @@ -731,4 +730,4 @@ self._no_init = value no_init = property( _get_no_init, _set_no_init - , doc="If True, class will be registered with 'boost::python::no_init'" ) \ No newline at end of file + , doc="If True, class will be registered with 'boost::python::no_init'" ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-19 19:09:38
|
Revision: 1591 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1591&view=rev Author: roman_yakovenko Date: 2009-01-19 19:09:33 +0000 (Mon, 19 Jan 2009) Log Message: ----------- adding code generator type Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2009-01-19 12:39:54 UTC (rev 1590) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2009-01-19 19:09:33 UTC (rev 1591) @@ -12,6 +12,7 @@ import algorithm +from decl_wrapper import CODE_GENERATOR_TYPES from decl_wrapper import decl_wrapper_t from calldef_wrapper import calldef_t Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2009-01-19 12:39:54 UTC (rev 1590) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2009-01-19 19:09:33 UTC (rev 1591) @@ -10,12 +10,17 @@ from pygccxml import declarations from pyplusplus import messages +class CODE_GENERATOR_TYPES: + BOOST_PYTHON = 'Boost.Python' + CTYPES = 'ctypes' + all = [ BOOST_PYTHON, CTYPES ] + class decl_wrapper_t(object): """code generator declaration configuration base class This class contains configuration that could be applied to all declarations. """ - + SPECIAL_TYPEDEF_PICK_ANY = True def __init__(self): @@ -28,8 +33,14 @@ self._documentation = None self.__msgs_to_ignore = set() self._include_files = [] + self._code_generator = None @property + def code_generator( self ): + """code generator type, could be Boost.Python or ctypes""" + return self._code_generator + + @property def logger( self ): """reference to L{_logging_.loggers.declarations}""" return _logging_.loggers.declarations @@ -46,7 +57,7 @@ name = self.name return algorithm.create_valid_name( name ) - def __select_alias_directives( self, be_smart ): + def __select_alias_directives( self, be_smart ): if not isinstance( self, declarations.class_types ): return [] typedefs = list( set( filter( lambda typedef: typedef.is_directive, self.aliases ) ) ) @@ -92,7 +103,7 @@ def rename( self, new_name ): """give new name to the declaration, under which Python will know the declaration - + Code generators: ctypes, Boost.Python """ self.alias = new_name @@ -113,25 +124,25 @@ def exclude( self, compilation_errors=False ): """exclude "self" and child declarations from being exposed. - + If compile_time_errors is True, than only declarations, which will cause compilation error will be excluded - + Code generators: ctypes, Boost.Python """ self.ignore = True def include( self, already_exposed=False ): """include "self" and child declarations to be exposed. - + Code generators: ctypes, Boost.Python. """ self.ignore = False self.already_exposed = already_exposed - + def why_not_exportable( self ): """return the reason( string ) that explains why this declaration could not be exported - + If declaration could be exported, than method will return None """ if None is self._exportable_reason: @@ -157,8 +168,8 @@ return self._exportable def set_exportable( self, exportable ): """change "exportable" status - - This function should be use in case Py++ made a mistake and signed the + + This function should be use in case Py++ made a mistake and signed the declaration as unexportable.""" self._exportable = exportable @@ -178,18 +189,18 @@ msgs = [] if not self.exportable: msgs.append( self.why_not_exportable() ) - + if declarations.templates.is_instantiation( self.name ) \ and self.alias == self._generate_valid_name(): msgs.append( messages.W1043 % self.alias ) - + directives = self.__select_alias_directives(be_smart=False) - if 1 < len( directives ): - msgs.append( messages.W1048 + if 1 < len( directives ): + msgs.append( messages.W1048 % ( self.alias, ', '.join( map( lambda typedef: typedef.name, directives ) ) ) ) - msgs.extend( self._readme_impl() ) - + msgs.extend( self._readme_impl() ) + return messages.filter_disabled_msgs( msgs, self.__msgs_to_ignore ) @property @@ -197,10 +208,10 @@ """list of messages to ignore""" return self.__msgs_to_ignore disabled_messaged = disabled_messages - + def disable_messages( self, *args ): """set messages, which should not be reported to you - + Usage example: decl.disable_messages( messages.W1001, messages.W1040 ) """ for msg in args: Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-19 12:39:54 UTC (rev 1590) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-19 19:09:33 UTC (rev 1591) @@ -57,6 +57,7 @@ module_builder.module_builder_t.__init__( self, global_ns=None, encoding=encoding ) self.global_ns = self.__parse_declarations( files, gccxml_config ) + self.global_ns.decls(recursive=True, allow_empty=True)._code_generator = decl_wrappers.CODE_GENERATOR_TYPES.CTYPES self.__blob2decl = binary_parsers.merge_information( self.global_ns, exported_symbols_file ) self.__apply_defaults() @@ -79,7 +80,7 @@ return decls_package.matcher.get_single( decls_package.namespace_matcher_t( name='::' ) , decls ) - + def __include_declarations( self ): self.global_ns.exclude() #include exported declarations @@ -87,13 +88,13 @@ to_be_included = ctypes_decls_dependencies.find_out_dependencies( included_decls ) to_be_included.update( included_decls ) map( lambda d: d.include(), to_be_included ) - + def __apply_defaults( self ): - self.__include_declarations() + self.__include_declarations() anonymous_classes = self.global_ns.classes( '', recursive=True, allow_empty=True ) anonymous_classes.alias = '_' #TODO: check whether the anonymous class unique or not - #if 1 == len( anonymous.parent.classes( '', recursive=False ) ): + #if 1 == len( anonymous.parent.classes( '', recursive=False ) ): anonymous_vars = self.global_ns.vars( '', recursive=True, allow_empty=True ) anonymous_vars.alias = '_' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-19 20:13:18
|
Revision: 1592 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1592&view=rev Author: roman_yakovenko Date: 2009-01-19 20:13:07 +0000 (Mon, 19 Jan 2009) Log Message: ----------- small refactoring, which improves code repository files handling Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py pyplusplus_dev/pyplusplus/code_creators/bookmark.py pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/code_creators/calldef_transformed.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/code_creators/class_introduction.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/compound.py pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py pyplusplus_dev/pyplusplus/code_creators/custom.py pyplusplus_dev/pyplusplus/code_creators/embedded_code_repository.py pyplusplus_dev/pyplusplus/code_creators/enum.py pyplusplus_dev/pyplusplus/code_creators/exception_translator.py pyplusplus_dev/pyplusplus/code_creators/fields_definition.py pyplusplus_dev/pyplusplus/code_creators/function_definition.py pyplusplus_dev/pyplusplus/code_creators/global_variable.py pyplusplus_dev/pyplusplus/code_creators/import_.py pyplusplus_dev/pyplusplus/code_creators/include.py pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py pyplusplus_dev/pyplusplus/code_creators/instruction.py pyplusplus_dev/pyplusplus/code_creators/library_reference.py pyplusplus_dev/pyplusplus/code_creators/license.py pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/code_creators/methods_definition.py pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/code_creators/module_body.py pyplusplus_dev/pyplusplus/code_creators/name_mappings.py pyplusplus_dev/pyplusplus/code_creators/namespace.py pyplusplus_dev/pyplusplus/code_creators/namespace_as_pyclass.py pyplusplus_dev/pyplusplus/code_creators/opaque_type_registrator.py pyplusplus_dev/pyplusplus/code_creators/properties.py pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py pyplusplus_dev/pyplusplus/code_creators/typedef_as_pyvar.py pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py Modified: pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -65,5 +65,5 @@ fn_def = templates.join( '::'.join( [ns_name, fn_name] ), fn_def_tmpl_args ) return call_invocation.join( fn_def, [ '"%s"' % self._create_name() ] ) + ';' - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [code_repository.array_1.file_name] Modified: pyplusplus_dev/pyplusplus/code_creators/bookmark.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/bookmark.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/bookmark.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -14,5 +14,5 @@ def _create_impl(self): return compound.compound_t.create_internal_code( self.creators, indent_code=False ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -136,7 +136,7 @@ return ''.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): files = [] if self.declaration.call_policies: files.append( self.declaration.call_policies.header_file ) @@ -176,7 +176,7 @@ else: return ' throw()' - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): files = [] if self.declaration.transformations: ft = self.declaration.transformations[0] @@ -950,7 +950,7 @@ def _create_impl( self ): return 'staticmethod( "%s" )' % self.function_code_creator.alias - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class constructor_wrapper_t( calldef_wrapper_t ): @@ -1047,7 +1047,7 @@ answer.append( '}' ) return os.linesep.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class null_constructor_wrapper_t( code_creator.code_creator_t @@ -1079,7 +1079,7 @@ answer.append( '}' ) return os.linesep.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] #in python all operators are members of class, while in C++ @@ -1163,7 +1163,7 @@ code = self._create_unary_operator() return 'def( %s )' % code - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class casting_operator_t( registration_based.registration_based_t @@ -1188,7 +1188,7 @@ , [ from_arg , to_arg ] ) \ + '();' - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class casting_member_operator_t( registration_based.registration_based_t @@ -1225,7 +1225,7 @@ , 'doc' : doc } - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class casting_constructor_t( registration_based.registration_based_t @@ -1250,7 +1250,7 @@ return declarations.templates.join(implicitly_convertible, [from_arg, to_arg ]) \ + '();' - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class destructor_wrapper_t( code_creator.code_creator_t @@ -1268,7 +1268,7 @@ answer.append( '}' ) return os.linesep.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] @@ -1342,7 +1342,7 @@ , 'max' : max_ } - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class free_fun_overloads_class_t( calldef_overloads_class_t ): @@ -1363,7 +1363,7 @@ , 'max' : max_ } - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class calldef_overloads_t( registration_based.registration_based_t ): @@ -1450,7 +1450,7 @@ return ''.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class mem_fun_overloads_t( calldef_overloads_t ): Modified: pyplusplus_dev/pyplusplus/code_creators/calldef_transformed.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef_transformed.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/calldef_transformed.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -417,8 +417,8 @@ def _create_impl(self): return os.linesep.join([ self.create_override(), '', self.create_default() ]) - def _get_system_headers_impl( self ): - files = super( mem_fun_v_transformed_wrapper_t, self )._get_system_headers_impl() + def _get_system_files_impl( self ): + files = super( mem_fun_v_transformed_wrapper_t, self )._get_system_files_impl() files.append( code_repository.convenience.file_name ) return files Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -82,7 +82,7 @@ else: return self._generate_code_no_scope() - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class class_t( scoped.scoped_t, registration_based.registration_based_t ): @@ -320,7 +320,7 @@ else: return self._generate_code_no_scope() - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] #open question: should I put class wrapper under some specifiec namespace? @@ -395,5 +395,5 @@ answer.append( '};' ) return os.linesep.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/class_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -41,7 +41,7 @@ % dict( ns_full_name=self.complete_py_name, name=self.alias )) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] @@ -62,5 +62,5 @@ % dict( ns_full_name=self.complete_py_name, name=self.alias )) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/code_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -5,6 +5,8 @@ import os import types +from pyplusplus import decl_wrappers +from pyplusplus import code_repository class code_creator_t(object): """ @@ -23,6 +25,8 @@ __INDENTATION = ' ' LINE_LENGTH = 80 PARAM_SEPARATOR = ', ' + CODE_GENERATOR_TYPES = decl_wrappers.CODE_GENERATOR_TYPES + def __init__(self): """Constructor. @@ -33,7 +37,11 @@ self._parent = None self._target_configuration = None self._works_on_instance = True + self._code_generator = None + @property + def code_generator( self ): + return self._code_generator def _get_works_on_instance(self): return self._works_on_instance @@ -110,18 +118,32 @@ uheaders.append( h ) return uheaders - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): """Return list of system header files the generated code depends on""" raise NotImplementedError(self.__class__.__name__) - def get_system_headers( self, recursive=False, unique=False ): - files = [ "boost/python.hpp" ] - files.extend( self._get_system_headers_impl() ) + def get_system_files( self, recursive=False, unique=False, language='any' ): + files = [] + if self.code_generator == self.CODE_GENERATOR_TYPES.BOOST_PYTHON: + files.append( "boost/python.hpp" ) + files.append( code_repository.named_tuple.file_name ) + else: + files.append( 'ctypes_utils.py' ) + files.extend( self._get_system_files_impl() ) files = filter( None, files) if unique: files = self.unique_headers( files ) - return files + language = language.lower() + if language == 'python': + selector = lambda f: os.path.splitext( f )[1] in ( '.py' ) + elif language == 'c++': + selector = lambda f: os.path.splitext( f )[1] in ( '.h', '.hpp', '.cpp' ) + else: + selector = None + + return filter( selector, files ) + def beautify( self, code ): """ function that returns code without leading and trailing whitespaces. @@ -205,5 +227,5 @@ def _create_impl(self): return self.__code - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/compound.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/compound.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/compound.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -77,12 +77,12 @@ internals[index] = internals[index] + os.linesep return os.linesep.join( internals ) - def get_system_headers( self, recursive=False, unique=False ): + def get_system_files( self, recursive=False, unique=False ): files = [ "boost/python.hpp" ] - files.extend( self._get_system_headers_impl() ) + files.extend( self._get_system_files_impl() ) if recursive: for creator in self._creators: - files.extend( creator.get_system_headers(recursive, unique=False) ) + files.extend( creator.get_system_files(recursive, unique=False) ) files = filter( None, files ) if unique: files = self.unique_headers( files ) Modified: pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -35,7 +35,7 @@ return ''.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [code_repository.ctypes_integration.file_name] class expose_sizeof_t( registration_based.registration_based_t @@ -51,5 +51,5 @@ def _create_impl(self): return 'def( pyplus_conv::register_sizeof( boost::type< %s >() ) )' % self.decl_identifier - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [code_repository.ctypes_integration.file_name] Modified: pyplusplus_dev/pyplusplus/code_creators/custom.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/custom.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/custom.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -17,7 +17,7 @@ def _create_impl(self): raise NotImplementedError() - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class custom_text_t(custom_t): @@ -34,5 +34,5 @@ def _create_impl(self): return self.text - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/embedded_code_repository.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/embedded_code_repository.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/embedded_code_repository.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -14,5 +14,5 @@ def _create_impl(self): return self.__code - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/enum.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/enum.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/enum.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -65,7 +65,7 @@ values = self.indent( os.linesep.join( values ) ) return bpl_enum + os.linesep + values - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] @@ -80,5 +80,5 @@ result.append( self.indent( '%(name)s = %(value)s' % dict( name=name, value=value ) ) ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/exception_translator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/exception_translator.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/exception_translator.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -32,7 +32,7 @@ , 'cls_name' : self.decl_identifier , 'arg_name' : self.declaration.exception_argument_name } - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] @@ -53,6 +53,6 @@ , 'cls' : self.decl_identifier , 'translator' : self.translator.translator_name } - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/code_creators/fields_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -59,5 +59,5 @@ result.append( ']' ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/function_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -84,7 +84,7 @@ args = map( ctypes_formatter.as_ctype, self.ftype.arguments_types ) return self.join_arguments( args, group_in_list ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] @@ -217,7 +217,7 @@ result.append( self.indent( '.finalize(),', 4 ) ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/global_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/global_variable.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/global_variable.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -31,7 +31,7 @@ self._wrapper = new_wrapper wrapper = property( _get_wrapper, _set_wrapper ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class global_variable_t( global_variable_base_t ): @@ -69,7 +69,7 @@ def __init__(self, variable, wrapper ): global_variable_base_t.__init__( self, variable=variable, wrapper=wrapper ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] def _create_impl( self ): @@ -156,7 +156,7 @@ answer.append( '}' * len( self._create_namespaces() ) ) return os.linesep.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [code_repository.array_1.file_name] class global_variable_addressof_t( global_variable_base_t ): @@ -181,7 +181,7 @@ result.append( ' = size_t( boost::addressof( %s ) );' % self.decl_identifier ) return ''.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [code_repository.ctypes_integration.file_name] class global_variable_reference_t( code_creator.code_creator_t, declaration_based.declaration_based_t ): @@ -196,5 +196,5 @@ , library_var_name=self.top_parent.library_var_name , undecorated_decl_name=self.undecorated_decl_name ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/import_.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/import_.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/import_.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -17,5 +17,5 @@ def _create_impl(self): return 'import %(module)s' % dict( module=os.path.splitext(self._module_name)[0] ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/include.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/include.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/include.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -58,5 +58,5 @@ self.__created_code = self._create_include_directive_code() return self.__created_code - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -49,7 +49,7 @@ def _create_impl(self): return "def( %s() )" % self._create_suite_declaration() - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return self.configuration.include_files class indexing_suite2_t( registration_based.registration_based_t @@ -118,7 +118,7 @@ answer.append( ';' ) return ''.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return self.declaration.indexing_suite.include_files class value_traits_t( code_creator.code_creator_t @@ -176,5 +176,5 @@ #the value_type return self.generate_value_traits() - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return ['indexing_suite/value_traits.hpp'] Modified: pyplusplus_dev/pyplusplus/code_creators/instruction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/instruction.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/instruction.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -37,5 +37,5 @@ def _generate_description(self): raise NotImplementedError() - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/library_reference.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -46,7 +46,7 @@ , loader='CDLL' , path=self._library_path ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] if __name__ == '__main__': Modified: pyplusplus_dev/pyplusplus/code_creators/license.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/license.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/license.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -20,7 +20,7 @@ self._text = new_text text = property( _get_text, _set_text ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] def _create_impl(self): Modified: pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -20,7 +20,7 @@ return os.linesep.join( tmpl ) \ % dict( alias=self.declaration.alias, name=self.undecorated_decl_name ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class vmem_fun_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): @@ -37,7 +37,7 @@ , name=self.undecorated_decl_name , ordinal=0) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class init_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): @@ -52,7 +52,7 @@ return os.linesep.join( tmpl ) \ % dict( alias=self.declaration.alias, name=self.undecorated_decl_name ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class opaque_init_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): @@ -65,7 +65,7 @@ tmpl.append( self.indent('raise RuntimeError( "Unable to create instance of opaque type." )') ) return os.linesep.join( tmpl ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class del_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): @@ -80,5 +80,5 @@ return os.linesep.join( tmpl ) \ % dict( name=self.undecorated_decl_name ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -31,7 +31,7 @@ self._wrapper = new_wrapper wrapper = property( _get_wrapper, _set_wrapper ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): files = [] if self.declaration.getter_call_policies: files.append( self.declaration.getter_call_policies.header_file ) @@ -269,7 +269,7 @@ , 'cls_type' : self.inst_arg_type( has_const=False ) }) return os.linesep.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class bit_field_t( member_variable_base_t ): @@ -376,7 +376,7 @@ answer.append( self.BF_SET_TEMPLATE % substitutions ) return os.linesep.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class array_mv_t( member_variable_base_t ): @@ -426,7 +426,7 @@ answer.append( '}' ) return ''.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] @@ -492,7 +492,7 @@ , 'mem_var_ref' : self.declaration.name } - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [code_repository.array_1.file_name] @@ -642,7 +642,7 @@ answer.append( self.SET_TEMPLATE % substitutions ) return os.linesep.join( answer ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class member_variable_addressof_t( member_variable_base_t ): @@ -692,5 +692,5 @@ return self._create_s_var() else: return self._create_m_var() - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [code_repository.ctypes_integration.file_name] Modified: pyplusplus_dev/pyplusplus/code_creators/methods_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -54,5 +54,5 @@ result.append( 'del %s' % self.mem_fun_factory_var_name ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -41,5 +41,5 @@ The license text will always be the first children node. @type: str or L{license_t}""") - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/module_body.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module_body.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/module_body.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -22,5 +22,5 @@ result.append( "}" ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/name_mappings.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/name_mappings.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/name_mappings.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -32,7 +32,7 @@ result.append( '}' ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/namespace.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/namespace.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/namespace.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -31,7 +31,7 @@ self.__created_code = 'namespace %s = %s;' % ( self.alias, self.full_namespace_name ) return self.__created_code - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class namespace_using_t(code_creator.code_creator_t): @@ -53,5 +53,5 @@ self.__created_code = 'using namespace %s;' % self.namespace_name return self.__created_code - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/namespace_as_pyclass.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/namespace_as_pyclass.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/namespace_as_pyclass.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -21,5 +21,5 @@ result.append( compound.compound_t.create_internal_code( self.creators ) ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/opaque_type_registrator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/opaque_type_registrator.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/opaque_type_registrator.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -20,5 +20,5 @@ def _create_impl(self): return 'BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID( %s )' % self.decl_identifier - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/properties.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/properties.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/properties.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -145,7 +145,7 @@ result.append( '}' ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -74,7 +74,7 @@ held_type = held_type_t(self.smart_ptr).create( self ) return templates.join( rptp, [ held_type ] ) + '();' - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] class smart_pointers_converter_t( registration_based.registration_based_t @@ -115,6 +115,6 @@ to_arg = self._instantiate_smart_ptr( self.target ) return templates.join(implicitly_convertible, [ from_arg, to_arg ] ) + '();' - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/code_creators/typedef_as_pyvar.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/typedef_as_pyvar.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/typedef_as_pyvar.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -18,5 +18,5 @@ % dict( complete_py_name=self.complete_py_name , type=ctypes_formatter.as_ctype( self.declaration.type ) ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -34,6 +34,6 @@ , algorithm.create_identifier( self, full_name + '::' + name ) ) ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): + def _get_system_files_impl( self ): return [] \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -126,7 +126,7 @@ if isinstance( decl, declarations.namespace_t ): continue - + if isinstance( decl, declarations.class_types ): if decl.opaque: continue @@ -342,7 +342,7 @@ add_include = self.__extmodule.add_include #add system headers - system_headers = self.__extmodule.get_system_headers( recursive=True, unique=True ) + system_headers = self.__extmodule.get_system_files( recursive=True, unique=True, language='c++' ) map( lambda header: add_include( header, user_defined=False, system=True ) , system_headers ) #add user defined header files @@ -353,6 +353,9 @@ self.__dependencies_manager.inform_user() + for cc in code_creators.make_flatten( self.__extmodule ): + cc._code_generator = decl_wrappers.CODE_GENERATOR_TYPES.BOOST_PYTHON + return self.__extmodule def visit_member_function( self ): Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -152,6 +152,9 @@ self.__dependencies_manager.inform_user() + for cc in code_creators.make_flatten( self.module ): + cc._code_generator = decl_wrappers.CODE_GENERATOR_TYPES.CTYPES + return self.module def visit_member_function( self ): @@ -240,18 +243,18 @@ class_ = self.curr_decl for decl in self.curr_decl.decls( recursive=False, allow_empty=True ): if isinstance( decl, declarations.variable_t ): - continue #fields_definition_t class treats them + continue #fields_definition_t class treats them if self.__should_generate_code( decl ): self.curr_decl = decl declarations.apply_visitor( self, decl ) self.curr_decl = class_ #fields definition should be recursive using the visitor #internal classes fields should be defined first - self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) + self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) else: cls_intro_cc = self.__class2introduction[ self.curr_decl ] cls_intro_cc.adopt_creator( code_creators.opaque_init_introduction_t( self.curr_decl ) ) - + def visit_enumeration(self): self.__dependencies_manager.add_exported( self.curr_decl ) paretn_cc = None @@ -268,7 +271,7 @@ def visit_variable(self): self.__dependencies_manager.add_exported( self.curr_decl ) self.curr_code_creator.adopt_creator( code_creators.global_variable_reference_t( self.curr_decl ) ) - + def visit_namespace(self ): if not self.__contains_exported( self.curr_decl ): return Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -179,7 +179,7 @@ dependend_on_headers = [] for creator in creators: - dependend_on_headers.extend( creator.get_system_headers( recursive=True ) ) + dependend_on_headers.extend( creator.get_system_files( recursive=True, language='C++' ) ) dependend_on_headers = unique_headers( map( normalize, dependend_on_headers ) ) Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -66,18 +66,11 @@ def write_code_repository(self, dir): """creates files defined in L{code_repository} package""" - system_headers = self.extmodule.get_system_headers( recursive=True ) + system_files = self.extmodule.get_system_files( recursive=True ) for cr in code_repository.all: - if cr.file_name in system_headers: + if cr.file_name in system_files: #check whether file from code repository is used self.write_file( os.path.join( dir, cr.file_name ), cr.code ) - #Python files are a special case - if isinstance( self.extmodule, code_creators.bpmodule_t ): - self.write_file( os.path.join( dir, code_repository.named_tuple.file_name ) - , code_repository.named_tuple.code ) - else: - self.write_file( os.path.join( dir, code_repository.ctypes_utils.file_name ) - , code_repository.ctypes_utils.code ) @staticmethod def write_file( fpath, content, files_sum_repository=None, encoding='ascii' ): Modified: pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-01-19 19:09:33 UTC (rev 1591) +++ pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-01-19 20:13:07 UTC (rev 1592) @@ -86,6 +86,8 @@ , compilation_mode , cache , indexing_suite_version) + self.global_ns.decls(recursive=True, allow_empty=True)._code_generator = decl_wrappers.CODE_GENERATOR_TYPES.CTYPES + self.__code_creator = None if optimize_queries: self.run_query_optimizer() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-02-02 18:31:48
|
Revision: 1650 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1650&view=rev Author: roman_yakovenko Date: 2009-02-02 18:31:43 +0000 (Mon, 02 Feb 2009) Log Message: ----------- sphinx - correct documentation string Modified Paths: -------------- pydsc_dev/pydsc.py pygccxml_dev/docs/apidocs/api.rest pygccxml_dev/docs/apidocs/binary_parsers.rest pygccxml_dev/docs/apidocs/declarations.rest pygccxml_dev/docs/apidocs/parser.rest pygccxml_dev/docs/apidocs/utils.rest pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/algorithm.py pygccxml_dev/pygccxml/declarations/call_invocation.py pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/declarations/cpptypes.py pygccxml_dev/pygccxml/declarations/enumeration.py pygccxml_dev/pygccxml/declarations/matcher.py pygccxml_dev/pygccxml/declarations/matchers.py pygccxml_dev/pygccxml/declarations/mdecl_wrapper.py pygccxml_dev/pygccxml/declarations/namespace.py pygccxml_dev/pygccxml/declarations/scopedef.py pygccxml_dev/pygccxml/declarations/templates.py pygccxml_dev/pygccxml/parser/__init__.py pygccxml_dev/pygccxml/parser/declarations_cache.py pygccxml_dev/pygccxml/parser/directory_cache.py pygccxml_dev/pygccxml/parser/project_reader.py pygccxml_dev/pygccxml/parser/source_reader.py pygccxml_dev/unittests/data/core_cache.hpp pyplusplus_dev/pyplusplus/code_creators/calldef_transformed.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/compound.py pyplusplus_dev/pyplusplus/code_creators/declaration_based.py pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/file_writers/balanced_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/function_transformers/controllers.py pyplusplus_dev/pyplusplus/function_transformers/transformer.py pyplusplus_dev/pyplusplus/function_transformers/transformers.py pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/pyplusplus/module_builder/module_builder.py Modified: pydsc_dev/pydsc.py =================================================================== --- pydsc_dev/pydsc.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pydsc_dev/pydsc.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -66,13 +66,13 @@ """ returns true if one of the directories is root directory for the `path`, false otherwise - @param path: path - @type path: str + :param path: path + :type path: str - @param dirs: list of directories and\\or files - @type dirs: [ str ] + :param dirs: list of directories and\\or files + :type dirs: [ str ] - @return: bool + :rtype: bool """ #precondition: dirs and fpath should be normalize_path'ed before calling this function return bool( filter( lambda dir: path.startswith( dir ), dirs ) ) @@ -106,23 +106,23 @@ saved in one of the members of the class, and replaced with import_ member function. - @param speller: reference to enchant.checker.SpellChecker object - @type speller: enchant.checker.SpellChecker + :param speller: reference to enchant.checker.SpellChecker object + :type speller: enchant.checker.SpellChecker - @param writer: reference to instance of class that has write method. + :param writer: reference to instance of class that has write method. By default sys.stdout will be used. - @param filter: list of files or directories - @type filter: [ str ] + :param filter: list of files or directories + :type filter: [ str ] - @param filter_type: provides interpretation for content of filter parameter - @type filter_type: L{FILTER_TYPE} + :param filter_type: provides interpretation for content of filter parameter + :type filter_type: L{FILTER_TYPE} - @param ignore_identifiers: often comments/documentation strings contains + :param ignore_identifiers: often comments/documentation strings contains class\\method\\function names. Those names, usually introduce spell error. If ignore_identifiers set to True, those names will be ignored. - @type ignore_identifiers: bool + :type ignore_identifiers: bool """ object.__init__( self ) self.__checked = set() Modified: pygccxml_dev/docs/apidocs/api.rest =================================================================== --- pygccxml_dev/docs/apidocs/api.rest 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/docs/apidocs/api.rest 2009-02-02 18:31:43 UTC (rev 1650) @@ -7,7 +7,7 @@ .. toctree:: :maxdepth: 4 - declarations - contains classes, which describe C++ declarations <declarations> - parser - contains classes, which parse GCC-XML generated file <parser> - binary_parsers - contains classes, which extract some information from `.dll`, `.map`, `.so` files <binary_parsers> - utils - few useful utilities <utils> + declarations.rest + parser.rest + binary_parsers.rest + utils.rest Modified: pygccxml_dev/docs/apidocs/binary_parsers.rest =================================================================== --- pygccxml_dev/docs/apidocs/binary_parsers.rest 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/docs/apidocs/binary_parsers.rest 2009-02-02 18:31:43 UTC (rev 1650) @@ -1,23 +1,10 @@ -=============================== -pygccxml.binary_parsers package -=============================== +=========================== +pygccxml.binary_parsers API +=========================== -This page contains the `pygccxml.binary_parsers` package API documentation. +parsers +------- -The :mod:`pygccxml.binary_parsers` package ------------------------------------------- - -.. automodule:: pygccxml.binary_parsers - :members: - :undoc-members: - :show-inheritance: - - -The :mod:`parsers <pygccxml.binary_parsers.parsers>` module ------------------------------------------------------------ - .. automodule:: pygccxml.binary_parsers.parsers :members: - :undoc-members: :show-inheritance: - Modified: pygccxml_dev/docs/apidocs/declarations.rest =================================================================== --- pygccxml_dev/docs/apidocs/declarations.rest 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/docs/apidocs/declarations.rest 2009-02-02 18:31:43 UTC (rev 1650) @@ -2,187 +2,176 @@ pygccxml.declarations package ============================= -This page contains the `pygccxml.declarations` package API documentation. +algorithm +--------- -The :mod:`pygccxml.declarations` package ----------------------------------------- - -.. automodule:: pygccxml.declarations - :members: - :undoc-members: - :show-inheritance: - - -The :mod:`algorithm <pygccxml.declarations.algorithm>` module --------------------------------------------------------------- - .. automodule:: pygccxml.declarations.algorithm :members: :show-inheritance: -The :mod:`algorithms_cache <pygccxml.declarations.algorithms_cache>` module ---------------------------------------------------------------------------- +algorithms_cache +---------------- .. automodule:: pygccxml.declarations.algorithms_cache :members: :show-inheritance: -The :mod:`calldef <pygccxml.declarations.calldef>` module ---------------------------------------------------------- +calldef +------- .. automodule:: pygccxml.declarations.calldef :members: :show-inheritance: -The :mod:`call_invocation <pygccxml.declarations.call_invocation>` module -------------------------------------------------------------------------- +call_invocation +--------------- .. automodule:: pygccxml.declarations.call_invocation :members: :show-inheritance: -The :mod:`class_declaration <pygccxml.declarations.class_declaration>` module ------------------------------------------------------------------------------ +class_declaration +----------------- .. automodule:: pygccxml.declarations.class_declaration :members: :show-inheritance: -The :mod:`compilers <pygccxml.declarations.compilers>` module -------------------------------------------------------------- +compilers +--------- .. automodule:: pygccxml.declarations.compilers :members: :show-inheritance: -The :mod:`container_traits <pygccxml.declarations.container_traits>` module ---------------------------------------------------------------------------- +container_traits +---------------- .. automodule:: pygccxml.declarations.container_traits :members: :show-inheritance: -The :mod:`cpptypes <pygccxml.declarations.cpptypes>` module ------------------------------------------------------------ +cpptypes +-------- .. automodule:: pygccxml.declarations.cpptypes :members: :show-inheritance: -The :mod:`declaration <pygccxml.declarations.declaration>` module ------------------------------------------------------------------ +declaration +----------- .. automodule:: pygccxml.declarations.declaration :members: :show-inheritance: -The :mod:`decl_factory <pygccxml.declarations.decl_factory>` module -------------------------------------------------------------------- +decl_factory +------------ .. automodule:: pygccxml.declarations.decl_factory :members: :show-inheritance: -The :mod:`decl_printer <pygccxml.declarations.decl_printer>` module -------------------------------------------------------------------- +ecl_printer +----------- .. automodule:: pygccxml.declarations.decl_printer :members: :show-inheritance: -The :mod:`decl_visitor <pygccxml.declarations.decl_visitor>` module --------------------------------------------------------------------- +decl_visitor +------------ .. automodule:: pygccxml.declarations.decl_visitor :members: :show-inheritance: -The :mod:`dependencies <pygccxml.declarations.dependencies>` module --------------------------------------------------------------------- +dependencies +------------ .. automodule:: pygccxml.declarations.dependencies :members: :show-inheritance: -The :mod:`enumeration <pygccxml.declarations.enumeration>` module ------------------------------------------------------------------- +enumeration +----------- .. automodule:: pygccxml.declarations.enumeration :members: :show-inheritance: -The :mod:`function_traits <pygccxml.declarations.function_traits>` module -------------------------------------------------------------------------- +function_traits +--------------- .. automodule:: pygccxml.declarations.function_traits :members: :show-inheritance: -The :mod:`matcher <pygccxml.declarations.matcher>` module ---------------------------------------------------------- +matcher +------- .. automodule:: pygccxml.declarations.matcher :members: :show-inheritance: -The :mod:`matchers <pygccxml.declarations.matchers>` module ------------------------------------------------------------ +matchers +-------- .. automodule:: pygccxml.declarations.matchers :members: :show-inheritance: -The :mod:`mdecl_wrapper <pygccxml.declarations.mdecl_wrapper>` module ---------------------------------------------------------------------- +mdecl_wrapper +------------- .. automodule:: pygccxml.declarations.mdecl_wrapper :members: :show-inheritance: -The :mod:`namespace <pygccxml.declarations.namespace>` module -------------------------------------------------------------- +namespace +--------- .. automodule:: pygccxml.declarations.namespace :members: :show-inheritance: -The :mod:`scopedef <pygccxml.declarations.scopedef>` module ------------------------------------------------------------ +scopedef +-------- .. automodule:: pygccxml.declarations.scopedef :members: :show-inheritance: -The :mod:`templates <pygccxml.declarations.templates>` module -------------------------------------------------------------- +templates +--------- .. automodule:: pygccxml.declarations.templates :members: :show-inheritance: -The :mod:`typedef <pygccxml.declarations.typedef>` module ---------------------------------------------------------- +typedef +------- .. automodule:: pygccxml.declarations.typedef :members: :show-inheritance: -The :mod:`type_traits <pygccxml.declarations.type_traits>` module ------------------------------------------------------------------ +type_traits +----------- .. automodule:: pygccxml.declarations.type_traits :members: :show-inheritance: -The :mod:`type_visitor <pygccxml.declarations.type_visitor>` module -------------------------------------------------------------------- +type_visitor +------------ .. automodule:: pygccxml.declarations.type_visitor :members: :show-inheritance: -The :mod:`variable <pygccxml.declarations.variable>` module ------------------------------------------------------------ +variable +-------- .. automodule:: pygccxml.declarations.variable :members: Modified: pygccxml_dev/docs/apidocs/parser.rest =================================================================== --- pygccxml_dev/docs/apidocs/parser.rest 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/docs/apidocs/parser.rest 2009-02-02 18:31:43 UTC (rev 1650) @@ -2,54 +2,45 @@ pygccxml.parser package ======================= -This page contains the `pygccxml.parser` package API documentation. +config +------ -The :mod:`pygccxml.parser` Package ----------------------------------------------------------- - -.. automodule:: pygccxml.parser +.. automodule:: pygccxml.parser.config :members: - :undoc-members: :show-inheritance: -The :mod:`config <pygccxml.parser.config>` module -------------------------------------------------- +declarations_cache +------------------ -.. automodule:: pygccxml.parser.config +.. automodule:: pygccxml.parser.declarations_cache :members: - :undoc-members: :show-inheritance: -The :mod:`declarations_cache <pygccxml.parser.declarations_cache>` module --------------------------------------------------------------------------- +directory_cache +--------------- -.. automodule:: pygccxml.parser.declarations_cache +.. automodule:: pygccxml.parser.directory_cache :members: - :undoc-members: :show-inheritance: +patcher +------- -The :mod:`pygccxml.parser.patcher` module ------------------------------------------ - .. automodule:: pygccxml.parser.patcher :members: - :undoc-members: :show-inheritance: -The :mod:`project_reader <pygccxml.parser.project_reader>` module ------------------------------------------------------------------ +project_reader +-------------- .. automodule:: pygccxml.parser.project_reader :members: - :undoc-members: :show-inheritance: -The :mod:`source_reader <pygccxml.parser.source_reader>` module ------------------------------------------------ +source_reader +------------- + .. automodule:: pygccxml.parser.source_reader :members: - :undoc-members: :show-inheritance: - Modified: pygccxml_dev/docs/apidocs/utils.rest =================================================================== --- pygccxml_dev/docs/apidocs/utils.rest 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/docs/apidocs/utils.rest 2009-02-02 18:31:43 UTC (rev 1650) @@ -2,23 +2,11 @@ pygccxml.utils package ====================== -This page contains the `pygccxml.utils` package API documentation. -The :mod:`pygccxml.utils` package ---------------------------------- +fs_utils +-------- -.. automodule:: pygccxml.utils - :members: - :undoc-members: - :show-inheritance: - - - -The :mod:`utils.fs_utils` module ---------------------------------- - .. automodule:: pygccxml.utils.fs_utils :members: - :undoc-members: :show-inheritance: Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -3,9 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -""" -contains classes that describe different C++ declarations -""" +"""contains classes that describe different C++ declarations""" import compilers Modified: pygccxml_dev/pygccxml/declarations/algorithm.py =================================================================== --- pygccxml_dev/pygccxml/declarations/algorithm.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/algorithm.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -11,10 +11,10 @@ """ returns a list of parent declarations names - @param decl: declaration for which declaration path should be calculated - @type decl: L{declaration_t} + :param decl: declaration for which declaration path should be calculated + :type decl: L{declaration_t} - @return: [names], where first item contains top parent name and last item + :rtype: [names], where first item contains top parent name and last item contains decl name """ if not decl: @@ -41,10 +41,10 @@ returns a list of parent declarations names without template arguments that have default value - @param decl: declaration for which declaration path should be calculated - @type decl: L{declaration_t} + :param decl: declaration for which declaration path should be calculated + :type decl: L{declaration_t} - @return: [names], where first item contains top parent name and last item + :rtype: [names], where first item contains top parent name and last item contains decl name """ #TODO: @@ -74,10 +74,10 @@ """ returns a reference to a named parent declaration - @param decl: the child declaration - @type decl: L{declaration_t} + :param decl: the child declaration + :type decl: L{declaration_t} - @return: reference to L{declaration_t} or None if not found + :rtype: reference to L{declaration_t} or None if not found """ if not decl: return None @@ -98,12 +98,12 @@ def full_name( decl, with_defaults=True ): """ returns full name of the declaration - @param decl: declaration for which full name should be calculated. If decl + :param decl: declaration for which full name should be calculated. If decl belongs to unnamed namespace, then L{full_name} is not valid C++ full name. - @type decl: L{declaration_t} + :type decl: L{declaration_t} - @return: full name of declarations. + :rtype: full name of declarations. """ if None is decl: raise RuntimeError( "Unable to generate full name for None object!" ) @@ -121,10 +121,10 @@ """ converts tree representation of declarations to flatten one. - @param decl_or_decls: reference to list of declaration's or single declaration - @type decl_or_decls: L{declaration_t} or [ L{declaration_t} ] + :param decl_or_decls: reference to list of declaration's or single declaration + :type decl_or_decls: L{declaration_t} or [ L{declaration_t} ] - @return: [ all internal declarations ] + :rtype: [ all internal declarations ] """ import pygccxml.declarations #prevent cyclic import def proceed_single( decl ): @@ -152,10 +152,10 @@ """ converts tree representation of declarations to flatten one. - @param decl_or_decls: reference to list of declaration's or single declaration - @type decl_or_decls: L{declaration_t} or [ L{declaration_t} ] + :param decl_or_decls: reference to list of declaration's or single declaration + :type decl_or_decls: L{declaration_t} or [ L{declaration_t} ] - @return: [ all internal declarations ] + :rtype: [ all internal declarations ] """ import pygccxml.declarations @@ -208,10 +208,10 @@ """ returns True if inst do match one of specified criteria - @param inst: declaration instance - @type inst: L{declaration_t} + :param inst: declaration instance + :type inst: L{declaration_t} - @return: bool + :rtype: bool """ answer = True if None != self.type: @@ -242,7 +242,7 @@ For more information about arguments see L{match_declaration_t} class. - @return: [ matched declarations ] + :rtype: [ matched declarations ] """ decls = [] if recursive: @@ -264,7 +264,7 @@ For more information about arguments see L{match_declaration_t} class. - @return: matched declaration L{declaration_t} or None + :rtype: matched declaration L{declaration_t} or None """ decl = find_all_declarations( declarations, type=type, name=name, parent=parent, recursive=recursive, fullname=fullname ) if len( decl ) == 1: @@ -276,7 +276,7 @@ For more information about arguments see L{match_declaration_t} class. - @return: matched declaration L{declaration_t} or None + :rtype: matched declaration L{declaration_t} or None """ matcher = match_declaration_t(type, name, fullname, parent) if recursive: @@ -295,10 +295,10 @@ Every declaration is declared in some file. This function returns set, that contains all file names of declarations. - @param decl_or_decls: reference to list of declaration's or single declaration - @type decl_or_decls: L{declaration_t} or [ L{declaration_t} ] + :param decl_or_decls: reference to list of declaration's or single declaration + :type decl_or_decls: L{declaration_t} or [ L{declaration_t} ] - @return: set( declaration file names ) + :rtype: set( declaration file names ) """ files = set() decls = make_flatten( decl_or_decls ) @@ -325,8 +325,8 @@ """ applies a visitor on declaration instance - @param visitor: instance - @type visitor: L{type_visitor_t} or L{decl_visitor_t} + :param visitor: instance + :type visitor: L{type_visitor_t} or L{decl_visitor_t} """ fname = 'visit_' + decl_inst.__class__.__name__[:-2] #removing '_t' from class name if not hasattr(visitor, fname ): Modified: pygccxml_dev/pygccxml/declarations/call_invocation.py =================================================================== --- pygccxml_dev/pygccxml/declarations/call_invocation.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/call_invocation.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -27,10 +27,10 @@ """ returns True if `decl_string` is function invocation and False otherwise - @param decl_string: string that should be checked for pattern presence - @type decl_string: str + :param decl_string: string that should be checked for pattern presence + :type decl_string: str - @return: bool + :rtype: bool """ global __THE_PARSER return __THE_PARSER.has_pattern( decl_string ) @@ -39,8 +39,8 @@ """ returns name of function - @type decl_string: str - @return: str + :type decl_string: str + :rtype: str """ global __THE_PARSER return __THE_PARSER.name( decl_string ) @@ -49,8 +49,8 @@ """ returns list of function arguments - @type decl_string: str - @return: [str] + :type decl_string: str + :rtype: [str] """ global __THE_PARSER return __THE_PARSER.args( decl_string ) @@ -60,8 +60,8 @@ """ finds arguments within function invocation. - @type text: str - @return: [ arguments ] or L{NOT_FOUND} if arguments could not be found + :type text: str + :rtype: [ arguments ] or L{NOT_FOUND} if arguments could not be found """ global __THE_PARSER return __THE_PARSER.find_args( text, start ) Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -363,10 +363,10 @@ You should not modify the list content, otherwise different optimization data will stop work and may to give you wrong results. - @param access: describes desired members - @type access: L{ACCESS_TYPES} + :param access: describes desired members + :type access: L{ACCESS_TYPES} - @return: [ members ] + :rtype: [ members ] """ if access == ACCESS_TYPES.PUBLIC: return self.public_members @@ -384,10 +384,10 @@ def adopt_declaration( self, decl, access ): """adds new declaration to the class - @param decl: reference to a L{declaration<declaration_t>} + :param decl: reference to a L{declaration<declaration_t>} - @param access: member access type - @type access: L{ACCESS_TYPES} + :param access: member access type + :type access: L{ACCESS_TYPES} """ if access == ACCESS_TYPES.PUBLIC: self.public_members.append( decl ) @@ -405,8 +405,8 @@ """ removes decl from members list - @param decl: declaration to be removed - @type decl: L{declaration_t} + :param decl: declaration to be removed + :type decl: L{declaration_t} """ container = None access_type = self.find_out_member_access_type( decl ) @@ -423,10 +423,10 @@ """ returns member access type - @param member: member of the class - @type member: L{declaration_t} + :param member: member of the class + :type member: L{declaration_t} - @return: L{ACCESS_TYPES} + :rtype: L{ACCESS_TYPES} """ assert member.parent is self if not member.cache.access_type: Modified: pygccxml_dev/pygccxml/declarations/cpptypes.py =================================================================== --- pygccxml_dev/pygccxml/declarations/cpptypes.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/cpptypes.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -494,12 +494,12 @@ """ returns free function type - @param return_type: function return type - @type return_type: L{type_t} + :param return_type: function return type + :type return_type: L{type_t} - @param arguments_types: list of argument L{type<type_t>} + :param arguments_types: list of argument L{type<type_t>} - @return: L{free_function_type_t} + :rtype: L{free_function_type_t} """ f = lambda x: x.build_decl_string( with_defaults ) return free_function_type_t.NAME_TEMPLATE % { @@ -520,7 +520,7 @@ def create_typedef( self, typedef_name, unused=None, with_defaults=True): """returns string, that contains valid C++ code, that defines typedef to function type - @param name: the desired name of typedef + :param name: the desired name of typedef """ #unused argument simplifies user code f = lambda x: x.build_decl_string( with_defaults ) @@ -558,8 +558,8 @@ def create_typedef( self, typedef_name, class_alias=None, with_defaults=True): """creates typedef to the function type - @param typedef_name: desired type name - @return: string + :param typedef_name: desired type name + :rtype: string """ has_const_str = '' if self.has_const: Modified: pygccxml_dev/pygccxml/declarations/enumeration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/enumeration.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/enumeration.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -22,12 +22,12 @@ The items of the list 'values' may either be strings containing the enumeration value name or tuples (name, numvalue). - @param name: Enum name - @type name: str - @param parent: Parent declaration - @type parent: declaration_t - @param values: Enumeration values - @type values: list + :param name: Enum name + :type name: str + :param parent: Parent declaration + :type parent: declaration_t + :param values: Enumeration values + :type values: list """ declaration.declaration_t.__init__( self, name ) @@ -83,10 +83,10 @@ When the 'values' attribute is accessed the resulting list will be in the same order as append_value() was called. - @param valuename: The name of the value. - @type valuename: str - @param valuenum: The numeric value or None. - @type valuenum: int + :param valuename: The name of the value. + :type valuename: str + :param valuenum: The numeric value or None. + :type valuenum: int """ # No number given? Then use the previous one + 1 if valuenum==None: @@ -101,9 +101,9 @@ def has_value_name(self, name): """Check if this enum has a particular name among its values. - @param name: Enumeration value name - @type name: str - @return: True if there is an enumeration value with the given name + :param name: Enumeration value name + :type name: str + :rtype: True if there is an enumeration value with the given name """ for val,num in self._values: if val==name: Modified: pygccxml_dev/pygccxml/declarations/matcher.py =================================================================== --- pygccxml_dev/pygccxml/declarations/matcher.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/matcher.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -34,9 +34,9 @@ def find( decl_matcher, decls, recursive=True ): """returns a list of declarations that match "decl_matcher" defined criretia or None - @param decl_matcher: Python callable object, that takes one argument - reference to declaration - @param decls: reference to declaration or list of declarations to be searched in - @param recursive: boolean, if True the method will run decl_matcher, on internal declarations too + :param decl_matcher: Python callable object, that takes one argument - reference to declaration + :param decls: reference to declaration or list of declarations to be searched in + :param recursive: boolean, if True the method will run decl_matcher, on internal declarations too """ where = [] @@ -54,9 +54,9 @@ criretia, if a unique declaration could not be found the method will return None. - @param decl_matcher: Python callable object, that takes one argument - reference to declaration - @param decls: reference to declaration or list of declarations to be searched in - @param recursive: boolean, if True the method will run decl_matcher, on internal declarations too + :param decl_matcher: Python callable object, that takes one argument - reference to declaration + :param decls: reference to declaration or list of declarations to be searched in + :param recursive: boolean, if True the method will run decl_matcher, on internal declarations too """ answer = matcher.find( decl_matcher, decls, recursive ) if len(answer) == 1: @@ -68,9 +68,9 @@ criretia, if a unique declaration could not be found, an appropriate exception will be raised. - @param decl_matcher: Python callable object, that takes one argument - reference to declaration - @param decls: reference to declaration or list of declarations to be searched in - @param recursive: boolean, if True the method will run decl_matcher, on internal declarations too + :param decl_matcher: Python callable object, that takes one argument - reference to declaration + :param decls: reference to declaration or list of declarations to be searched in + :param recursive: boolean, if True the method will run decl_matcher, on internal declarations too """ answer = matcher.find( decl_matcher, decls, recursive ) if len(answer) == 1: Modified: pygccxml_dev/pygccxml/declarations/matchers.py =================================================================== --- pygccxml_dev/pygccxml/declarations/matchers.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/matchers.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -117,17 +117,17 @@ """ def __init__( self, name=None, decl_type=None, header_dir=None, header_file=None ): """ - @param decl_type: declaration type to match by. For example L{enumeration_t}. - @type decl_type: any class that derives from L{declarations.declaration_t} class + :param decl_type: declaration type to match by. For example L{enumeration_t}. + :type decl_type: any class that derives from L{declarations.declaration_t} class - @param name: declaration name, could be full name. - @type name: str + :param name: declaration name, could be full name. + :type name: str - @param header_dir: absolute directory path - @type header_dir: str + :param header_dir: absolute directory path + :type header_dir: str - @param header_file: absolute file path - @type header_file: str + :param header_file: absolute file path + :type header_file: str """ #An other option is that pygccxml will create absolute path using @@ -264,8 +264,8 @@ """ def __init__( self, name=None, type=None, header_dir=None, header_file=None ): """ - @param type: variable type - @type type: string or instance of L{type_t} derived class + :param type: variable type + :type type: string or instance of L{type_t} derived class """ declaration_matcher_t.__init__( self , name=name @@ -322,10 +322,10 @@ def __init__( self, name=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None): """ - @param return_type: callable return type - @type return_type: string or instance of L{type_t} derived class + :param return_type: callable return type + :type return_type: string or instance of L{type_t} derived class - @param arg_types: list of function argument types. arg_types can contain. + :param arg_types: list of function argument types. arg_types can contain. Any item within the list could be string or instance of L{type_t} derived class. If you don't want some argument to participate in match you can put None. For example: @@ -334,7 +334,7 @@ will match all functions that takes 2 arguments, where the first one is reference to integer and second any - @type arg_types: list + :type arg_types: list """ if None is decl_type: decl_type = calldef.calldef_t @@ -402,8 +402,8 @@ """ def __init__( self, name=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None): """ - @param symbol: operator symbol - @type symbol: str + :param symbol: operator symbol + :type symbol: str """ if None is decl_type: decl_type = calldef.operator_t @@ -443,10 +443,10 @@ """ def __init__( self, regex, function=None ): """ - @param regex: regular expression - @type regex: string, an instance of this class will compile it for you + :param regex: regular expression + :type regex: string, an instance of this class will compile it for you - @param function: function that will be called to get an information from + :param function: function that will be called to get an information from declaration as string. As input this function takes 1 argument: reference to declaration. Return value should be string. If function is None, then the matcher will use declaration name. @@ -474,8 +474,8 @@ def __init__( self, access_type ): """ - @param access_type: declaration access type - @type access_type: L{ACCESS_TYPES} defines few consts for your convinience. + :param access_type: declaration access type + :type access_type: L{ACCESS_TYPES} defines few consts for your convinience. Any way you can pass public, private or protected as argument to this function """ matcher_base_t.__init__( self ) @@ -498,8 +498,8 @@ def __init__( self, virtuality_type ): """ - @param access_type: declaration access type - @type access_type: L{VIRTUALITY_TYPES} defines few consts for your convinience. + :param access_type: declaration access type + :type access_type: L{VIRTUALITY_TYPES} defines few consts for your convinience. """ matcher_base_t.__init__( self ) self.virtuality_type = virtuality_type @@ -520,7 +520,7 @@ def __init__( self, function ): """ - @param function: callable, that takes single argument - declaration instance + :param function: callable, that takes single argument - declaration instance should return True or False """ matcher_base_t.__init__( self ) Modified: pygccxml_dev/pygccxml/declarations/mdecl_wrapper.py =================================================================== --- pygccxml_dev/pygccxml/declarations/mdecl_wrapper.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/mdecl_wrapper.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -17,8 +17,8 @@ def __init__( self, name, decls ): """creates call_redirector_t instance. - @param name: name of method, to be called on every object in C{decls} list - @param decls: list of objects + :param name: name of method, to be called on every object in C{decls} list + :param decls: list of objects """ object.__init__( self ) self.name = name @@ -45,8 +45,8 @@ """ def __init__( self, decls ): - """@param decls: list of declarations to operate on. - @type decls: list of L{declaration wrappers<decl_wrapper_t>} + """:param decls: list of declarations to operate on. + :type decls: list of L{declaration wrappers<decl_wrapper_t>} """ object.__init__( self ) self.__dict__['declarations'] = decls @@ -74,15 +74,15 @@ def __setattr__( self, name, value ): """Updates the value of attribute on all declarations. - @param name: name of attribute - @param value: new value of attribute + :param name: name of attribute + :param value: new value of attribute """ self.__ensure_attribute( name ) for d in self.declarations: setattr( d, name, value ) def __getattr__( self, name ): - """@param name: name of method + """:param name: name of method """ return call_redirector_t( name, self.declarations ) Modified: pygccxml_dev/pygccxml/declarations/namespace.py =================================================================== --- pygccxml_dev/pygccxml/declarations/namespace.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/namespace.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -57,8 +57,8 @@ """ removes decl from members list - @param decl: declaration to be removed - @type decl: L{declaration_t} + :param decl: declaration to be removed + :type decl: L{declaration_t} """ del self.declarations[ self.declarations.index( decl ) ] decl.cache.reset() Modified: pygccxml_dev/pygccxml/declarations/scopedef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/scopedef.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/scopedef.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -652,7 +652,7 @@ def __getitem__(self, name_or_function): """ Allow simple name based find of decls. Internally just calls decls() method. - @param name_or_function Name of decl to lookup or finder function. + :param name_or_function Name of decl to lookup or finder function. """ return self.decls(name_or_function) Modified: pygccxml_dev/pygccxml/declarations/templates.py =================================================================== --- pygccxml_dev/pygccxml/declarations/templates.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/declarations/templates.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -23,10 +23,10 @@ """ returns True if decl_string is template instantiation and False otherwise - @param decl_string: string that should be checked for pattern presence - @type decl_string: str + :param decl_string: string that should be checked for pattern presence + :type decl_string: str - @return: bool + :rtype: bool """ global __THE_PARSER return __THE_PARSER.has_pattern( decl_string ) @@ -35,8 +35,8 @@ """ returns name of instantiated template - @type decl_string: str - @return: str + :type decl_string: str + :rtype: str """ global __THE_PARSER return __THE_PARSER.name( decl_string ) @@ -45,8 +45,8 @@ """ returns list of template arguments - @type decl_string: str - @return: [str] + :type decl_string: str + :rtype: [str] """ global __THE_PARSER return __THE_PARSER.args( decl_string ) Modified: pygccxml_dev/pygccxml/parser/__init__.py =================================================================== --- pygccxml_dev/pygccxml/parser/__init__.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/parser/__init__.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -37,14 +37,14 @@ """ Parse header files. - @param files: The header files that should be parsed - @type files: list of str - @param config: Configuration object or None - @type config: L{config_t} - @param compilation_mode: Determines whether the files are parsed individually or as one single chunk - @type compilation_mode: L{COMPILATION_MODE} - @param cache: Declaration cache (None=no cache) - @type cache: L{cache_base_t} or str + :param files: The header files that should be parsed + :type files: list of str + :param config: Configuration object or None + :type config: L{config_t} + :param compilation_mode: Determines whether the files are parsed individually or as one single chunk + :type compilation_mode: L{COMPILATION_MODE} + :param cache: Declaration cache (None=no cache) + :type cache: L{cache_base_t} or str @returns: Declarations """ if not config: Modified: pygccxml_dev/pygccxml/parser/declarations_cache.py =================================================================== --- pygccxml_dev/pygccxml/parser/declarations_cache.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/parser/declarations_cache.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -58,19 +58,19 @@ def update(self, source_file, configuration, declarations, included_files): """ Update cache entry. - @param source_file: path to the C++ source file being parsed - @param configuration: configuration used in parsing (config_t) - @param declarations: declaration tree found when parsing - @param included_files: files included by parsing. + :param source_file: path to the C++ source file being parsed + :param configuration: configuration used in parsing (config_t) + :param declarations: declaration tree found when parsing + :param included_files: files included by parsing. """ raise NotImplementedError() def cached_value(self, source_file, configuration): - """ Return declarations we have cached for the source_file and configuration - given. - @param source_file: path to the C++ source file being parsed. - @param configuration: configuration to use for parsing (config_t) """ + Return declarations, we have cached, for the source_file and the given configuration. + :param source_file: path to the C++ source file being parsed. + :param configuration: configuration to use for parsing (config_t) + """ raise NotImplementedError() class record_t( object ): @@ -131,7 +131,7 @@ def __init__( self, name ): """ - @param name: name of the cache file. + :param name: name of the cache file. """ cache_base_t.__init__( self ) self.__name = name # Name of cache file Modified: pygccxml_dev/pygccxml/parser/directory_cache.py =================================================================== --- pygccxml_dev/pygccxml/parser/directory_cache.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/parser/directory_cache.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -109,14 +109,14 @@ def update(self, source_file, configuration, declarations, included_files): """Replace a cache entry by a new value. - @param source_file: Header file name. - @type source_file: str - @param configuration: Configuration object. - @type configuration: L{config_t} - @param declarations: Declarations contained in the header file. - @type declarations: picklable object - @param included_files: Dependent files - @type included_files: list of str + :param source_file: Header file name. + :type source_file: str + :param configuration: Configuration object. + :type configuration: L{config_t} + :param declarations: Declarations contained in the header file. + :type declarations: picklable object + :param included_files: Dependent files + :type included_files: list of str """ # Normlize all paths... source_file = os.path.normpath(source_file) @@ -156,11 +156,11 @@ def cached_value(self, source_file, configuration): """Return the cached declarations or None. - @param source_file: Header file name - @type source_file: str - @param configuration: Configuration object - @type configuration: L{config_t} - @return: Cached declarations or None + :param source_file: Header file name + :type source_file: str + :param configuration: Configuration object + :type configuration: L{config_t} + :rtype: Cached declarations or None """ # Check if the cache contains an entry for source_file @@ -240,8 +240,8 @@ Reads a pickled object from disk and returns it. - @param filename: Name of the file that should be read. - @type filename: str + :param filename: Name of the file that should be read. + :type filename: str @returns: Unpickled file contents """ if self.__compression: @@ -257,10 +257,10 @@ The data object is written to a file using the pickle mechanism. - @param filename: Output file name - @type filename: str - @param data: A Python object that will be pickled - @type data: picklable object + :param filename: Output file name + :type filename: str + :param data: A Python object that will be pickled + :type data: picklable object """ if self.__compression: f = gzip.GzipFile(filename, "wb") @@ -280,10 +280,10 @@ If key references a non-existing entry, the method returns immediately. - @param source_file: Header file name - @type source_file: str - @param key: Key value for the specified header file - @type key: hashable object + :param source_file: Header file name + :type source_file: str + :param key: Key value for the specified header file + :type key: hashable object """ entry = self.__index.get(key) @@ -309,8 +309,8 @@ def _create_cache_key(self, source_file): """Return the cache key for a header file. - @param source_file: Header file name - @type source_file: str + :param source_file: Header file name + :type source_file: str @returns: Key for the given header file @rtype: str """ @@ -320,8 +320,8 @@ def _create_cache_filename(self, source_file): """Return the cache file name for a header file. - @param source_file: Header file name - @type source_file: str + :param source_file: Header file name + :type source_file: str @returns: Cache file name (*.cache) @rtype: str """ @@ -335,8 +335,8 @@ working_directory, include_paths, define_symbols and undefine_symbols. - @param config: Configuration object - @type config: L{config_t} + :param config: Configuration object + :type config: L{config_t} @returns: Signature @rtype: str """ Modified: pygccxml_dev/pygccxml/parser/project_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/project_reader.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/parser/project_reader.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -92,10 +92,10 @@ Creates L{file_configuration_t} instance, configured to contain Python string, that contains valid C++ code - @param text: C++ code - @type text: str + :param text: C++ code + :type text: str - @return: L{file_configuration_t} + :rtype: L{file_configuration_t} """ return file_configuration_t( data=text , content_type=file_configuration_t.CONTENT_TYPE.TEXT ) @@ -105,10 +105,10 @@ Creates L{file_configuration_t} instance, configured to contain path to C++ source file - @param header: path to C++ source file - @type header: str + :param header: path to C++ source file + :type header: str - @return: L{file_configuration_t} + :rtype: L{file_configuration_t} """ return file_configuration_t( data=header , content_type=file_configuration_t.CONTENT_TYPE.STANDARD_SOURCE_FILE ) @@ -118,10 +118,10 @@ Creates L{file_configuration_t} instance, configured to contain path to GCC-XML generated XML file. - @param xml_file: path to GCC-XML generated XML file - @type xml_file: str + :param xml_file: path to GCC-XML generated XML file + :type xml_file: str - @return: L{file_configuration_t} + :rtype: L{file_configuration_t} """ return file_configuration_t( data=xml_file , content_type=file_configuration_t.CONTENT_TYPE.GCCXML_GENERATED_FILE ) @@ -133,13 +133,13 @@ it will be created and used for parsing. If XML file exists, it will be used for parsing. - @param header: path to C++ source file - @type header: str + :param header: path to C++ source file + :type header: str - @param cached_source_file: path to GCC-XML generated XML file - @type cached_source_file: str + :param cached_source_file: path to GCC-XML generated XML file + :type cached_source_file: str - @return: L{file_configuration_t} + :rtype: L{file_configuration_t} """ return file_configuration_t( data=header , cached_source_file=cached_source_file @@ -161,12 +161,12 @@ appropriate declaration class. By default, the declaration classes defined in the L{declarations} package are used. - @param config: Configuration object - @type config: L{config_t} - @param cache: Declaration cache (None=no cache) - @type cache: L{cache_base_t} or str - @param decl_factory: Custom declaration factory object or None - @type decl_factory: decl_factory_t + :param config: Configuration object + :type config: L{config_t} + :param cache: Declaration cache (None=no cache) + :type cache: L{cache_base_t} or str + :param decl_factory: Custom declaration factory object or None + :type decl_factory: decl_factory_t """ self.__config = config self.__dcache = None @@ -186,9 +186,9 @@ def get_os_file_names( files ): """Returns a list of OS file names - @param files: list of strings or L{file_configuration_t} instances. + :param files: list of strings or L{file_configuration_t} instances. files could contain a mix of them - @type files: list + :type files: list """ fnames = [] for f in files: @@ -205,11 +205,11 @@ def read_files( self, files, compilation_mode=COMPILATION_MODE.FILE_BY_FILE): """Parse header files. - @param files: list of strings or L{file_configuration_t} instances. + :param files: list of strings or L{file_configuration_t} instances. files could contain a mix of them - @type files: list - @param compilation_mode: Determines whether the files are parsed individually or as one single chunk - @type compilation_mode: L{COMPILATION_MODE} + :type files: list + :param compilation_mode: Determines whether the files are parsed individually or as one single chunk + :type compilation_mode: L{COMPILATION_MODE} @returns: Declarations """ if compilation_mode == COMPILATION_MODE.ALL_AT_ONCE \ @@ -300,8 +300,8 @@ def read_string(self, content): """Parse a string containing C/C++ source code. - @param content: C/C++ source code. - @type content: str + :param content: C/C++ source code. + :type content: str @returns: Declarations """ reader = source_reader.source_reader_t( self.__config, None, self.__decl_factory ) Modified: pygccxml_dev/pygccxml/parser/source_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/source_reader.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/pygccxml/parser/source_reader.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -27,10 +27,10 @@ """ This function binds between class and it's typedefs. - @param decls: list of all declarations - @type all_classes: list of L{declaration_t} items + :param decls: list of all declarations + :type all_classes: list of L{declaration_t} items - @return: None + :rtype: None """ visited = set() typedefs = filter( lambda decl: isinstance( decl, typedef_t ), decls ) @@ -65,15 +65,15 @@ """ def __init__( self, config, cache=None, decl_factory=None ): """ - @param config: instance of L{config_t} class, that contains GCC-XML + :param config: instance of L{config_t} class, that contains GCC-XML configuration - @type config: L{config_t} + :type config: L{config_t} - @param cache: reference to cache object, that will be updated after + :param cache: reference to cache object, that will be updated after file has been parsed. - @param cache: instance of class, that derives from {cache_base_t} + :param cache: instance of class, that derives from {cache_base_t} - @param decl_factory: declarations factory, if not given default + :param decl_factory: declarations factory, if not given default declarations factory L{decl_factory_t} will be used """ self.logger = utils.loggers.cxx_parser @@ -128,14 +128,14 @@ for "header" file. If destination_file_path is not None, then this file path will be used and returned. - @param header: path to source file, that should be parsed - @type header: str + :param header: path to source file, that should be parsed + :type header: str - @param destination: if given, will be used as target file/path for + :param destination: if given, will be used as target file/path for GCC-XML generated file. - @type destination: str + :type destination: str - @return: path to GCC-XML generated file + :rtype: path to GCC-XML generated file """ gccxml_file = destination # If file specified, remove it to start else create new file name @@ -173,13 +173,13 @@ """ Creates XML file from text. - @param content: C++ source code - @type content: str + :param content: C++ source code + :type content: str - @param destination: file name for GCC-XML generated file - @type destination: str + :param destination: file name for GCC-XML generated file + :type destination: str - @return: returns file name of GCC-XML generated file + :rtype: returns file name of GCC-XML generated file """ header_file = pygccxml.utils.create_temp_file_name( suffix='.h' ) gccxml_file = None @@ -199,8 +199,8 @@ """ Reads C++ source file and returns declarations tree - @param source_file: path to C++ source file - @type source_file: str + :param source_file: path to C++ source file + :type source_file: str """ declarations = None gccxml_file = '' @@ -227,10 +227,10 @@ """ Reads GCC-XML generated XML file. - @param gccxml_created_file: path to GCC-XML generated file - @type gccxml_created_file: str + :param gccxml_created_file: path to GCC-XML generated file + :type gccxml_created_file: str - @return: declarations tree + :rtype: declarations tree """ assert(self.__config!=None) Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2009-02-02 13:53:17 UTC (rev 1649) +++ pygccxml_dev/unittests/data/core_cache.hpp 2009-02-02 18:31:43 UTC (rev 1650) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file +//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/code_creators/calldef_transformed.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef_transformed.py 2009-02-02 13:53:17 UTC (rev 1649) +++ pyplusplus_dev/pyplusplus/code_creators/calldef_transformed.py 2009-02-02 18:31:43 UTC (rev 1650) @@ -137,8 +137,8 @@ def __init__( self, function ): """Constructor. - @param function: Function declaration - @type function: calldef_t + :param function: Function declaration + :type function: calldef_t """ sealed_fun_transformed_wrapper_t .__init__( self, function=function ) @@ -193,8 +193,8 @@ def __init__( self, function ): """Constructor. - @param function: Function declaration - @type function: calldef_t + :param function: Function declaration... [truncated message content] |
From: <rom...@us...> - 2009-02-08 19:52:55
|
Revision: 1663 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1663&view=rev Author: roman_yakovenko Date: 2009-02-08 19:52:49 +0000 (Sun, 08 Feb 2009) Log Message: ----------- sphinx Modified Paths: -------------- pydsc_dev/docs/pydsc.rest pydsc_dev/pydsc.py pygccxml_dev/pygccxml/binary_parsers/undname.py pygccxml_dev/pygccxml/parser/directory_cache.py pyplusplus_dev/pyplusplus/_logging_/multi_line_formatter.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py pyplusplus_dev/pyplusplus/creators_factory/sort_algorithms.py pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py pyplusplus_dev/pyplusplus/file_writers/balanced_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py Modified: pydsc_dev/docs/pydsc.rest =================================================================== --- pydsc_dev/docs/pydsc.rest 2009-02-08 13:53:58 UTC (rev 1662) +++ pydsc_dev/docs/pydsc.rest 2009-02-08 19:52:49 UTC (rev 1663) @@ -35,20 +35,14 @@ import pydsc -and every module, that will be imported after it, will be checked. The errors -will be printed to stdout. +and every module, that will be imported after it, in the current working directory +will be checked. The errors will be printed to stdout. -For example: - -.. code-block:: python - - import pydsc - import readline - :mod:`pydsc` contains few functions, which helps you to configure the spell checker: * to define your own "ignore" dictionary * to define the error messages destination (file, stdout) - * to define set of files, which should be included or excluded + * to define set of files, which should be checked + * to ignore Sphinx specific words and code blocks For more information see :mod:`pydsc` module. Modified: pydsc_dev/pydsc.py =================================================================== --- pydsc_dev/pydsc.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pydsc_dev/pydsc.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -11,15 +11,16 @@ .. code-block:: python import pydsc - pydsc.include( r'D:\pygccxml_dev\pygccxml' ) #check only pygccxml package - pydsc.exclude( r'C:\Python' ) #don't check standard library - pydsc.ignore([ 'Yakovenko', 'www', 'org', 'py' ]) + pydsc.include_paths( r'D:\pygccxml_dev\pygccxml' ) #check only pygccxml package + pydsc.ignore_words([ 'Yakovenko', 'www', 'org', 'py' ]) + #if you use sphinx as a documentation tool: + pydsc.set_text_preprocessor( pydsc.sphinx_preprocessor ) """ -__version__ = '0.2' #current version -__author__ = 'Roman Yakovenko <rom...@gm...>' #Don't you want to know who is guilty? -__url__ = 'http://www.language-binding.net' #project home -__license__ = 'Boost Software License <http://boost.org/more/license_info.html>' #license +__version__ = '0.3' #current version +__author__ = 'Roman Yakovenko <rom...@gm...>' +__url__ = 'http://www.language-binding.net' +__license__ = 'Boost Software License <http://boost.org/more/license_info.html>' import os import re @@ -51,18 +52,6 @@ return bool( filter( lambda dir: path.startswith( dir ), dirs ) ) -#~ class DynamicIdentifiersFilter( enchant.tokenize.Filter): - #~ _pattern = re.compile(r"^.+@[^\.].*\.[a-z]{2,}$") - #~ def __init__( self, *args, **keywd ): - #~ super( DynamicIdentifiersFilter, self ).__init__( self, *args, **keywd ) - #~ self.global_identifiers = set() - #~ self.local_identifiers = set() - - #~ def _skip(self,word): - #~ if self._pattern.match(word): - #~ return True - #~ return False - def is_identifier( word ): """ returns `True` is the word represents an identifier, constructed from two or more words, `False` otherwise. @@ -242,7 +231,7 @@ for word, suggestions in errors.items(): write( ' misspelled word : %s%s' % ( word, os.linesep ) ) write( ' suggestions : %s%s' % ( `suggestions`, os.linesep ) ) - if 1: #debug code + if 0: #debug code clean = lambda t: t.replace( '\n', ' ' ).replace( '\r', '' ) write( ' source file text: %s\n' % clean( text_ ) ) write( ' checked text : %s\n' % clean( text ) ) @@ -370,4 +359,6 @@ def __call__( self, text ): return self.__replace_via_re( text ) +#sphinx_preprocessor, instance of :class:`sphinx_preprocessor_t` allows to remove +#some special words and code from the text. sphinx_preprocessor = sphinx_preprocessor_t() Modified: pygccxml_dev/pygccxml/binary_parsers/undname.py =================================================================== --- pygccxml_dev/pygccxml/binary_parsers/undname.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pygccxml_dev/pygccxml/binary_parsers/undname.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -67,7 +67,7 @@ .dll, .map and .so files. On Windows, the class works with unique name produced by MSVC compiler and - with undecorated names produced by dbghelp.dll + with undecorated names produced by `dbghelp.dll` On Linux, the class works with mangled names produced by GCC-XML ( GCC 4.2 ) compiler and demangled name produced by "nm" utility. Modified: pygccxml_dev/pygccxml/parser/directory_cache.py =================================================================== --- pygccxml_dev/pygccxml/parser/directory_cache.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pygccxml_dev/pygccxml/parser/directory_cache.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -156,7 +156,7 @@ :param source_file: Header file name :type source_file: str :param configuration: Configuration object - :type configuration: L{config_t} + :type configuration: :class:`parser.config_t` :rtype: Cached declarations or None """ @@ -199,10 +199,9 @@ def _load(self): """Load the cache. - Loads the file index.dat which contains the index table and - the file name repository. + Loads the `index.dat` file, which contains the index table and the file name repository. - This method is called by the constructor. + This method is called by the :meth:`__init__` """ indexfilename = os.path.join(self.__dir, "index.dat") Modified: pyplusplus_dev/pyplusplus/_logging_/multi_line_formatter.py =================================================================== --- pyplusplus_dev/pyplusplus/_logging_/multi_line_formatter.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pyplusplus_dev/pyplusplus/_logging_/multi_line_formatter.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -44,7 +44,7 @@ record.message = record.getMessage() Now this method temporarily replaces the getMessage() method of - the record by a version that returns a pre-generated message that + the record by a version that returns a generated message that spans several lines. Then the original format() method is called which will invoke the 'fake' method. """ Modified: pyplusplus_dev/pyplusplus/code_creators/code_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -147,7 +147,7 @@ def beautify( self, code ): """ - function that returns code without leading and trailing whitespaces. + function that returns code without leading and trailing white spaces. :param code: A code block with C++ source code. :type code: str Modified: pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -82,7 +82,7 @@ class smart_pointers_converter_t( registration_based.registration_based_t , declaration_based.declaration_based_t ): """ creator for boost::python::implicitly_convertible. - This creates a statemnt that allows the usage of C++ implicit + This creates a statement that allows the usage of C++ implicit conversion from source to target. See: http://www.boost.org/libs/python/doc/v2/implicit.html """ Modified: pyplusplus_dev/pyplusplus/creators_factory/sort_algorithms.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/sort_algorithms.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pyplusplus_dev/pyplusplus/creators_factory/sort_algorithms.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -116,20 +116,20 @@ for fname in self.__desired_order: answer.append( fname2inst[fname] ) return answer - -class calldef_organizer_t( object ): + +class calldef_organizer_t( object ): #Take a look on this post: # http://mail.python.org/pipermail/c++-sig/2006-October/011463.html - #calldef_organizer_t will take into account only requiered arguments. + #calldef_organizer_t will take into account only required arguments. #Next rules are implemented: #1. calldef( bool ) will be the last registered function #2. T* will come after T ( const T& ) def __init__( self ): object.__init__( self ) - #preserve order in which functions where defined + #preserve order in which functions where defined self.__cmp_unrelated = lambda d1, d2: cmp( d1.location.line, d2.location.line ) - + def __build_groups( self, decls ): groups = { None: [] } for d in decls: @@ -145,7 +145,7 @@ return decl_wrappers.algorithm.registration_order.is_related( t1, t2 ) def __cmp( self, f1, f2 ): - result = self.__cmp_types( f1.arguments[0].type, f2.arguments[0].type ) + result = self.__cmp_types( f1.arguments[0].type, f2.arguments[0].type ) if None is result: result = self.__cmp_unrelated( f1, f2 ) return result @@ -155,7 +155,7 @@ if None is group: continue groups[ group ].sort( self.__cmp ) - + def __join_groups( self, groups ): decls = [] sorted_keys = groups.keys() @@ -168,7 +168,7 @@ groups = self.__build_groups( decls ) self.__sort_groups(groups) result = self.__join_groups(groups) - return result + return result def sort_classes( classes ): organizer = class_organizer_t( classes ) @@ -177,8 +177,8 @@ def sort_calldefs( decls ): return calldef_organizer_t().sort( decls ) -USE_CALLDEF_ORGANIZER = False -#If you understand what problem calldef_organizer_t solves, than may be you should +USE_CALLDEF_ORGANIZER = False +#If you understand what problem calldef_organizer_t solves, than may be you should #use this. def sort( decls ): @@ -219,7 +219,7 @@ else: others.sort( cmp=cmp_by_name ) constructors.sort( cmp=cmp_by_line ) - + new_ordered = [] new_ordered.extend( enums ) new_ordered.extend( classes ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -92,7 +92,7 @@ def has_wrapper( self ): """returns True, if function - wrapper is needed - The functionality by this function is uncomplete. So please don't + The functionality by this function is incomplete. So please don't use it in your code. """ if not isinstance( self, declarations.member_calldef_t ): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -170,7 +170,7 @@ """change "exportable" status This function should be use in case `Py++` made a mistake and signed the - declaration as unexportable.""" + declaration as non-exportable.""" self._exportable = exportable exportable = property( get_exportable, set_exportable Modified: pyplusplus_dev/pyplusplus/file_writers/balanced_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/balanced_files.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pyplusplus_dev/pyplusplus/file_writers/balanced_files.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -18,7 +18,7 @@ #TODO: to add namespace_alias_t classes class balanced_files_t(multiple_files.multiple_files_t): """ - This class implements classic strategy of deviding classes to files + This class implements classic strategy of dividing classes to files one class in one header + source files. """ HEADER_EXT = '.pypp.hpp' Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -16,22 +16,19 @@ #TODO: to add namespace_alias_t classes class multiple_files_t(writer.writer_t): """ - This class implements classic strategy of deviding classes to files + This class implements classic strategy of dividing classes to files one class in one header + source files. """ HEADER_EXT = '.pypp.hpp' SOURCE_EXT = '.pypp.cpp' def __init__(self, extmodule, directory_path, write_main=True, files_sum_repository=None, encoding='ascii'): - """Constructor. - - :param extmodule: The root of a code creator tree - :type extmodule: bpmodule_t - :param directory_path: The output directory where the source files are written + """ + :param extmodule: code creators tree root + :type extmodule: :class:`code_creators.bpmodule_t` + :param directory_path: generated source files directory :type directory_path: str - - :param write_main: if it is True, the class will write out a main file - that calls all the registration methods. + :param write_main: if True, the class will write out a main file that calls all the registration methods. :type write_main: boolean """ writer.writer_t.__init__( self, extmodule, files_sum_repository, encoding=encoding ) Modified: pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-02-08 13:53:58 UTC (rev 1662) +++ pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-02-08 19:52:49 UTC (rev 1663) @@ -216,20 +216,17 @@ , enable_indexing_suite=True , doc_extractor=None): """ - Creates L{bpmodule_t} code creator. + Creates :class:`code_creators.bpmodule_t` code creator. :param module_name: module name - :type module_name: string + :type module_name: str - :param boost_python_ns_name: boost::python namespace alias, by default - it is 'bp' - :type boost_python_ns_name: string + :param boost_python_ns_name: boost::python namespace alias, by default it is `bp` + :type boost_python_ns_name: str - :param call_policies_resolver_: callable, that will be invoked on every - calldef object. It should return call policies. + :param call_policies_resolver_: callable, that will be invoked on every calldef object. It should return call policies. :type call_policies_resolver_: callable - :param doc_extractor: callable, that takes as argument reference to declaration - and returns documentation string + :param doc_extractor: callable, that takes as argument reference to declaration and returns documentation string :type doc_extractor: callable or None """ @@ -333,17 +330,17 @@ , on_unused_file_found=os.remove , use_files_sum_repository=False): """ - Writes module to multiple files + writes module to multiple files :param dir_name: directory name - :type dir_name: string + :type dir_name: str :param huge_classes: list that contains reference to classes, that should be split :param on_unused_file_found: callable object that represents the action that should be taken on file, which is no more in use - @use_files_sum_repository: `Py++` can generate file, which will contain md5 sum of every generated file. + @use_files_sum_repository: `Py++` can generate file, which will contain `md5` sum of every generated file. Next time you generate code, md5sum will be loaded from the file and compared. This could speed-up code generation process by 10-15%. """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-02-09 09:48:31
|
Revision: 1664 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1664&view=rev Author: roman_yakovenko Date: 2009-02-09 09:48:27 +0000 (Mon, 09 Feb 2009) Log Message: ----------- sphinx Modified Paths: -------------- pydsc_dev/pydsc.py pygccxml_dev/pygccxml/__init__.py pygccxml_dev/pygccxml/declarations/algorithm.py pygccxml_dev/pygccxml/declarations/cpptypes.py pygccxml_dev/pygccxml/declarations/declaration.py pygccxml_dev/pygccxml/declarations/matchers.py pygccxml_dev/pygccxml/declarations/mdecl_wrapper.py pygccxml_dev/pygccxml/declarations/scopedef.py pygccxml_dev/pygccxml/declarations/templates.py pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/pygccxml/parser/__init__.py pygccxml_dev/pygccxml/parser/directory_cache.py pygccxml_dev/pygccxml/parser/project_reader.py pygccxml_dev/pygccxml/parser/source_reader.py pyplusplus_dev/pyplusplus/__init__.py pyplusplus_dev/pyplusplus/_logging_/__init__.py pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/compound.py pyplusplus_dev/pyplusplus/code_creators/declaration_based.py pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/code_repository/__init__.py pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py pyplusplus_dev/pyplusplus/decl_wrappers/scopedef_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/user_text.py pyplusplus_dev/pyplusplus/file_writers/single_file.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/function_transformers/controllers.py pyplusplus_dev/pyplusplus/function_transformers/function_transformation.py pyplusplus_dev/pyplusplus/function_transformers/transformer.py pyplusplus_dev/pyplusplus/module_builder/__init__.py pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/pyplusplus/module_builder/module_builder.py Modified: pydsc_dev/pydsc.py =================================================================== --- pydsc_dev/pydsc.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pydsc_dev/pydsc.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -96,9 +96,6 @@ :param writer: reference to instance of class that has write method. By default sys.stdout will be used. - :param filter_type: provides interpretation for content of filter parameter - :type filter_type: L{FILTER_TYPE} - :param ignore_identifiers: often comments/documentation strings contains class\\method\\function names. Those names, usually introduce spell error. If ignore_identifiers Modified: pygccxml_dev/pygccxml/__init__.py =================================================================== --- pygccxml_dev/pygccxml/__init__.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/__init__.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -7,7 +7,7 @@ This package provides functionality to extract and inspect declarations from C/C++ header files. This is accomplished -by invoking the external tool U{gccxml<http://www.gccxml.org/>} +by invoking the external tool `gccxml <http://www.gccxml.org/>`_ which parses a header file and dumps the declarations as a XML file. This XML file is then read by pygccxml and the contents are made available as appropriate Python objects. Modified: pygccxml_dev/pygccxml/declarations/algorithm.py =================================================================== --- pygccxml_dev/pygccxml/declarations/algorithm.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/declarations/algorithm.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -227,7 +227,11 @@ return answer def __call__(self, inst): - """C{return self.does_match_exist(inst)}""" + """ + .. code-block:: python + + return self.does_match_exist(inst) + """ return self.does_match_exist(inst) def find_all_declarations( declarations Modified: pygccxml_dev/pygccxml/declarations/cpptypes.py =================================================================== --- pygccxml_dev/pygccxml/declarations/cpptypes.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/declarations/cpptypes.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -354,7 +354,7 @@ ## Compaund types: class compound_t( type_t ): - """class that allows to represent compound types like C{const int*}""" + """class that allows to represent compound types like `const int*`""" def __init__( self, base ): type_t.__init__( self ) self._base = base @@ -368,7 +368,7 @@ , doc="reference to internal/base class") class volatile_t( compound_t ): - """represents C{volatile whatever} type""" + """represents `volatile whatever` type""" def __init__( self, base ): compound_t.__init__( self, base) @@ -379,7 +379,7 @@ return volatile_t( self.base.clone() ) class restrict_t( compound_t ): - """represents C{restrict whatever} type""" + """represents `restrict whatever` type""" #The restrict keyword can be considered an extension to the strict aliasing #rule. It allows the programmer to declare that pointers which share the same @@ -400,7 +400,7 @@ return restrict_t( self.base.clone() ) class const_t( compound_t ): - """represents C{whatever const} type""" + """represents `whatever const` type""" def __init__( self, base ): compound_t.__init__( self, base ) @@ -411,7 +411,7 @@ return const_t( self.base.clone() ) class pointer_t( compound_t ): - """represents C{whatever*} type""" + """represents `whatever*` type""" def __init__( self, base ): compound_t.__init__( self, base ) @@ -422,7 +422,7 @@ return pointer_t( self.base.clone() ) class reference_t( compound_t ): - """represents C{whatever&} type""" + """represents `whatever&` type""" def __init__( self, base ): compound_t.__init__( self, base) Modified: pygccxml_dev/pygccxml/declarations/declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/declaration.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/declarations/declaration.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -128,9 +128,11 @@ def __lt__(self, other): """ - C{if not isinstance( other, self.__class__ ):} - C{ return self.__class__.__name__ < other.__class__.__name__} - C{return self._get__cmp__data() < other._get__cmp__data()} + .. code-block:: python + + if not isinstance( other, self.__class__ ): + return self.__class__.__name__ < other.__class__.__name__ + return self._get__cmp__data() < other._get__cmp__data() """ if not isinstance( other, self.__class__ ): return self.__class__.__name__ < other.__class__.__name__ Modified: pygccxml_dev/pygccxml/declarations/matchers.py =================================================================== --- pygccxml_dev/pygccxml/declarations/matchers.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/declarations/matchers.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -94,12 +94,14 @@ class not_matcher_t(matcher_base_t): - """Return the inverse result of matcher, using "~" + """ + return the inverse result of a matcher - For example: find all private and protected declarations + For example: find all public and protected declarations - C{ matcher = ~access_type_matcher_t( 'private' ) } + .. code-block:: python + matcher = ~access_type_matcher_t( 'private' ) """ def __init__(self, matcher): matcher_base_t.__init__(self) @@ -343,7 +345,6 @@ reference to integer and second any :type arg_types: list - """ if None is decl_type: decl_type = calldef.calldef_t Modified: pygccxml_dev/pygccxml/declarations/mdecl_wrapper.py =================================================================== --- pygccxml_dev/pygccxml/declarations/mdecl_wrapper.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/declarations/mdecl_wrapper.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -17,7 +17,7 @@ def __init__( self, name, decls ): """creates call_redirector_t instance. - :param name: name of method, to be called on every object in C{decls} list + :param name: name of method, to be called on every object in the `decls` list :param decls: list of objects """ object.__init__( self ) @@ -25,7 +25,7 @@ self.decls = decls def __call__( self, *arguments, **keywords ): - """calls method C{self.name} on every object within C{self.decls} list""" + """calls method :attr:`call_redirector_t.name` on every object within the :attr:`call_redirector_t.decls` list""" for d in self.decls: callable_ = getattr(d, self.name) callable_( *arguments, **keywords ) Modified: pygccxml_dev/pygccxml/declarations/scopedef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/scopedef.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/declarations/scopedef.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -18,7 +18,7 @@ Base class for :class:`namespace_t` and :class:`class_t` classes. This is the base class for all declaration classes that may have - children nodes. The children can be accessed via the C{declarations} + children nodes. The children can be accessed via the :attr:`scopedef_t.declarations` property. Also this class provides "get/select/find" interface. Using this class you @@ -84,7 +84,7 @@ def _get_logger( self ): return utils.loggers.queries_engine - _logger = property( _get_logger, doc="reference to C{queries_engine} logger" ) + _logger = property( _get_logger, doc="reference to :attr:`pygccxml.utils.loggers.queries_engine` logger" ) def _get__cmp__scope_items(self): """implementation details""" Modified: pygccxml_dev/pygccxml/declarations/templates.py =================================================================== --- pygccxml_dev/pygccxml/declarations/templates.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/declarations/templates.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -8,9 +8,9 @@ This module implements all functionality necessary to parse C++ template instantiations.In other words this module is able to extract next information from -the string like this C{ std::vector<int> }. - - name ( std::vector ) - - list of arguments ( int ) +the string like this `std::vector<int>`. + - name ( `std::vector` ) + - list of arguments ( `int` ) This module also defines few convenience function like :func:split and :func:join. """ Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -84,7 +84,7 @@ def base_type(type): """returns base type. - For C{const int} will return C{int} + For `const int` will return `int` """ types = decompose_type( type ) return types[-1] @@ -115,15 +115,15 @@ return False def is_bool( type_ ): - """returns True, if type represents C{bool}, False otherwise""" + """returns True, if type represents `bool`, False otherwise""" return remove_alias( type_ ) in create_cv_types( cpptypes.bool_t() ) def is_void( type ): - """returns True, if type represents C{void}, False otherwise""" + """returns True, if type represents `void`, False otherwise""" return remove_alias( type ) in create_cv_types( cpptypes.void_t() ) def is_void_pointer( type ): - """returns True, if type represents C{void*}, False otherwise""" + """returns True, if type represents `void*`, False otherwise""" return is_same( type, cpptypes.pointer_t( cpptypes.void_t() ) ) def is_integral( type ): @@ -889,8 +889,9 @@ return __is_noncopyable_single( class_ ) def is_defined_in_xxx( xxx, cls ): - """small helper function, that checks whether class ( C{cls} ) is defined - under C{::xxx} namespace""" + """ + small helper function, that checks whether the class `cls` is defined under `::xxx` namespace + """ if not cls.parent: return False Modified: pygccxml_dev/pygccxml/parser/__init__.py =================================================================== --- pygccxml_dev/pygccxml/parser/__init__.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/parser/__init__.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -40,12 +40,12 @@ :param files: The header files that should be parsed :type files: list of str :param config: Configuration object or None - :type config: L{config_t} + :type config: :class:`parser.config_t` :param compilation_mode: Determines whether the files are parsed individually or as one single chunk - :type compilation_mode: L{COMPILATION_MODE} + :type compilation_mode: :class:`parser.COMPILATION_MODE` :param cache: Declaration cache (None=no cache) - :type cache: L{cache_base_t} or str - :rtype: Declarations + :type cache: :class:`parser.cache_base_t` or str + :rtype: list of :class:`declarations.declaration_t` """ if not config: config = config_t() Modified: pygccxml_dev/pygccxml/parser/directory_cache.py =================================================================== --- pygccxml_dev/pygccxml/parser/directory_cache.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/parser/directory_cache.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -10,8 +10,8 @@ This module contains the implementation of a cache that uses individual files stored in a dedicated cache directory to store the cached contents. -The cache class is L{directory_cache_t} which can be passed to the C{cache} -argument of the L{parse()} function. +The cache class is :class:`parser.directory_cache_t` which can be passed as the `cache` +argument of the :func:`parser.parse` function. """ import os, os.path, gzip, hashlib @@ -257,7 +257,7 @@ :param filename: Output file name :type filename: str :param data: A Python object that will be pickled - :type data: picklable object + :type data: pickable object """ if self.__compression: f = gzip.GzipFile(filename, "wb") @@ -270,7 +270,7 @@ """Remove an entry from the cache. source_file is the name of the header and key is its corresponding - cache key (obtained by a call to L{_create_cache_key()}). + cache key (obtained by a call to :meth:_create_cache_key ). The entry is removed from the index table, any referenced file name is released and the cache file is deleted. @@ -334,7 +334,7 @@ undefine_symbols. :param config: Configuration object - :type config: L{config_t} + :type config: :class:`parser.config_t` :rtype: str """ m = hashlib.md5() Modified: pygccxml_dev/pygccxml/parser/project_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/project_reader.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/parser/project_reader.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -89,46 +89,46 @@ def create_text_fc( text ): """ - Creates L{file_configuration_t} instance, configured to contain Python string, + Creates :class:`parser.file_configuration_t` instance, configured to contain Python string, that contains valid C++ code :param text: C++ code :type text: str - :rtype: L{file_configuration_t} + :rtype: :class:`parser.file_configuration_t` """ return file_configuration_t( data=text , content_type=file_configuration_t.CONTENT_TYPE.TEXT ) def create_source_fc( header ): """ - Creates L{file_configuration_t} instance, configured to contain path to + Creates :class:`parser.file_configuration_t` instance, configured to contain path to C++ source file :param header: path to C++ source file :type header: str - :rtype: L{file_configuration_t} + :rtype: :class:`parser.file_configuration_t` """ return file_configuration_t( data=header , content_type=file_configuration_t.CONTENT_TYPE.STANDARD_SOURCE_FILE ) def create_gccxml_fc( xml_file ): """ - Creates L{file_configuration_t} instance, configured to contain path to + Creates :class:`parser.file_configuration_t` instance, configured to contain path to GCC-XML generated XML file. :param xml_file: path to GCC-XML generated XML file :type xml_file: str - :rtype: L{file_configuration_t} + :rtype: :class:`parser.file_configuration_t` """ return file_configuration_t( data=xml_file , content_type=file_configuration_t.CONTENT_TYPE.GCCXML_GENERATED_FILE ) def create_cached_source_fc( header, cached_source_file ): """ - Creates L{file_configuration_t} instance, configured to contain path to + Creates :class:`parser.file_configuration_t` instance, configured to contain path to GCC-XML generated XML file and C++ source file. If XML file does not exists, it will be created and used for parsing. If XML file exists, it will be used for parsing. @@ -139,7 +139,7 @@ :param cached_source_file: path to GCC-XML generated XML file :type cached_source_file: str - :rtype: L{file_configuration_t} + :rtype: :class:`parser.file_configuration_t` """ return file_configuration_t( data=header , cached_source_file=cached_source_file Modified: pygccxml_dev/pygccxml/parser/source_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/source_reader.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pygccxml_dev/pygccxml/parser/source_reader.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -28,7 +28,7 @@ This function binds between class and it's typedefs. :param decls: list of all declarations - :type all_classes: list of L{declaration_t} items + :type all_classes: list of :class:`declarations.declaration_t` items :rtype: None """ Modified: pyplusplus_dev/pyplusplus/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/__init__.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/__init__.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -7,7 +7,7 @@ ======================================== This package (together with the accompanying pygccxml package and -U{Boost.Python<http://www.boost.org/libs/python/doc/index.html>}) +`Boost.Python <http://www.boost.org/libs/python/doc/index.html>`_ assists you in creating Python bindings for a C/C++ library. This is done by parsing a set of header files that contain all the stuff you want to expose in Python. The result of this parsing @@ -18,9 +18,6 @@ code before it is written to disk. As a last step, these source code blocks are finally written into one or more C++ source files, which can then be compiled to generate the final Python module. - -If you are just starting with U{`Py++`<http://www.language-binding.net>}, -then consider to read documentation of L{module_builder} package. """ import code_creators Modified: pyplusplus_dev/pyplusplus/_logging_/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/_logging_/__init__.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/_logging_/__init__.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -44,7 +44,7 @@ """ module_builder = _create_logger_( 'pyplusplus.module_builder' ) - """logger that in use by L{module_builder_t} class. + """logger that in use by :class:`module_builder.module_builder_t` class. Just another logger. It exists mostly for `Py++` developers. """ Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -11,7 +11,7 @@ distributed among several source files) and each individual code creator represents a single block of source code. -The base class for all code creators is L{code_creator_t}. +The base class for all code creators is :class:`code_creators.code_creator_t`. """ Modified: pyplusplus_dev/pyplusplus/code_creators/code_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -60,7 +60,7 @@ """parent - reference to parent code creator""" parent = property( _get_parent, _set_parent, doc="""Parent code creator or None if this is the root node. - @type: L{code_creator_t} + @type: :class:`code_creators.code_creator_t` """) def _get_target_configuration( self ): @@ -70,14 +70,14 @@ """target_configuration - reference to target_configuration_t class instance""" target_configuration = property( _get_target_configuration, _set_target_configuration, doc="""Target configuration. - @type: L{target_configuration_t} + @type: :class:`target_configuration_t` """) @property def top_parent(self): """top_parent - reference to top parent code creator - @type: L{code_creator_t} + @type: :class:`code_creators.code_creator_t` """ parent = self.parent me = self Modified: pyplusplus_dev/pyplusplus/code_creators/compound.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/compound.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/code_creators/compound.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -11,7 +11,7 @@ """Constructor. :param parent: Parent code creator. - :type parent: L{code_creator_t} + :type parent: :class:`code_creators.code_creator_t` """ code_creator.code_creator_t.__init__( self ) self._creators = [] @@ -20,13 +20,13 @@ return self._creators creators = property(_get_creators, doc="""A list of children nodes. - @type: list of L{code_creator_t}""") + @type: list of :class:`code_creators.code_creator_t`""") def adopt_creator( self, creator, index=None): """Add a creator to the list of children creators. :param creator: Creator object - :type creator: L{code_creator_t} + :type creator: :class:`code_creators.code_creator_t` :param index: Desired position of the creator or None to append it to the end of the list :type index: int """ @@ -40,7 +40,7 @@ """Add a creators to the list of children creators. :param creators: list of creators object - :type creator: L{code_creator_t} + :type creator: :class:`code_creators.code_creator_t` :param index: Desired position of the creator or None to append it to the end of the list :type index: int """ @@ -55,7 +55,7 @@ @precondition: creator must be a children of self :param creator: The creator node to remove - :type creator: L{code_creator_t} + :type creator: :class:`code_creators.code_creator_t` """ creator.parent = None del self._creators[ self._creators.index( creator ) ] @@ -66,7 +66,7 @@ concatenate the code from a list of code creators. :param creators: A list with code creators - :type creators: list of L{code_creator_t} + :type creators: list of :class:`code_creators.code_creator_t` :rtype: str """ internals = map( lambda expr: expr.create(), creators ) Modified: pyplusplus_dev/pyplusplus/code_creators/declaration_based.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -14,7 +14,7 @@ """Constructor. :param declaration: Declaration object - :type declaration: L{decl_wrapper_t<decl_wrappers.decl_wrapper_t>} + :type declaration: :class:`decl_wrappers.decl_wrapper_t` :param parent: Parent code creator. :type parent: code_creator_t """ @@ -28,7 +28,7 @@ @property def declaration(self): """The declaration this code creator is based on. - @type: L{decl_wrapper_t<decl_wrappers.decl_wrapper_t>} + @type: :class:`decl_wrappers.decl_wrapper_t` """ return self._decl Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -50,7 +50,7 @@ doc="""License text. The license text will always be the first children node. - @type: str or L{license_t}""") + @type: str or :class:`code_creators.license_t`""") def _get_system_files_impl( self ): return [] @@ -113,18 +113,18 @@ @property def body(self): - """Return reference to L{module_body_t} code creator""" + """Return reference to :class:`code_creators.module_body_t` code creator""" if None is self.__body: found = algorithm.creator_finder.find_by_class_instance( what=module_body.module_body_t - , where=self.creators - , recursive=False ) + , where=self.creators + , recursive=False ) if found: self.__body = found[0] return self.__body def last_include_index(self): """ - return the children index of the last L{include_t} object. + return the children index of the last :class:`code_creators.include_t` object. An exception is raised when there is no include_t object among the children creators. @@ -157,12 +157,12 @@ , headers ) def adopt_include(self, include_creator): - """Insert an L{include_t} object. + """Insert an :class:`code_creators.include_t` object. The include creator is inserted right after the last include file. :param include_creator: Include creator object - :type include_creator: L{include_t} + :type include_creator: :class:`code_creators.include_t` """ lii = self.last_include_index() if lii == 0: Modified: pyplusplus_dev/pyplusplus/code_repository/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/__init__.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/code_repository/__init__.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -4,13 +4,8 @@ # http://www.boost.org/LICENSE_1_0.txt) """ -Code repository package is used as a repository of C++ classes/functions. +Code repository package is used as a repository of C++/Python classes/functions. Those classes/functions solve problems, that are typical to most projects. -Right now, this package contains set of classes that help to export one -dimensional static arrays. For example: - -C{char data[23];} - """ import array_1 Modified: pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -21,17 +21,13 @@ VIRTUALITY_TYPES = declarations.VIRTUALITY_TYPES class bpcreator_t( declarations.decl_visitor_t ): - """Creating code creators. + """ + code creators factory for Boost.Python library This class takes a set of declarations as input and creates a code - creator tree that contains the Boost.Python C++ source code for the + creators tree that contains the Boost.Python C++ source code for the final extension module. Each node in the code creators tree represents a block of text (C++ source code). - - Usage of this class: Create an instance and pass all relevant input - data to the constructor. Then call L{create()} to obtain the code - creator tree whose root node is a L{module_t<code_creators.module_t>} - object representing the source code for the entire extension module. """ def __init__( self @@ -57,8 +53,8 @@ :type module_name: str :type boost_python_ns_name: str :type call_policies_resolver_: callable - :type types_db: L{types_database_t<types_database.types_database_t>} - :type target_configuration: L{target_configuration_t<code_creators.target_configuration_t>} + :type types_db: L:class:`types_database.types_database_t` + :type target_configuration: :class:`code_creators.target_configuration_t` :type doc_extractor: callable :type already_exposed_dbs: list of strings """ Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -5,8 +5,8 @@ """Code generator configuration classes -L{pygccxml.declarations} package contains classes, which describe C++ declarations. -This package contains classes that derive from the L{pygccxml.declarations} classes. +:mod:`pygccxml.declarations` package contains classes, which describe C++ declarations. +This package contains classes that derive from the :mod:`pygccxml.declarations` classes. The classes in this package allow you to configure the code generator. """ Modified: pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -25,11 +25,11 @@ def create(self, function_creator, creation_policy=CREATION_POLICY.AS_INSTANCE): """Creates code from the call policies class instance. :param function_creator: parent code creator - :type function_creator: L{code_creators.function_t} or L{code_creators.constructor_t} + :type function_creator: :class:`code_creators.function_t` or :class:`code_creators.constructor_t` :param creation_policy: indicates whether we this call policy used as template argument or as an instance - :type creation_policy: L{CREATION_POLICY} + :type creation_policy: :class:`decl_wrappers.CREATION_POLICY` """ code = self._create_impl( function_creator ) if code and creation_policy == CREATION_POLICY.AS_INSTANCE: @@ -45,7 +45,7 @@ return self.create( function_creator, CREATION_POLICY.AS_TEMPLATE_ARGUMENT ) def is_default( self ): - """return True is self is instance of L{default_call_policies_t} class""" + """return True is self is instance of :class:`decl_wrappers.default_call_policies_t` class""" return False def is_predefined( self ): @@ -91,7 +91,7 @@ def _set_base_policy( self, new_policy ): self._base = new_policy base_policy = property( _get_base_policy, _set_base_policy - , doc="base call policy, by default is reference to L{default_call_policies_t} call policy") + , doc="base call policy, by default is reference to :class:`decl_wrappers.default_call_policies_t` call policy") def _get_args(self, function_creator): return [] Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -40,7 +40,7 @@ def set_call_policies(self, call_policies): self._call_policies = call_policies call_policies = property( get_call_policies, set_call_policies - , doc="reference to L{call policies<call_policy_t>} class." \ + , doc="reference to :class:`decl_wrappers.call_policy_t` class." \ +"Default value is calculated at runtime, based on return value.") def _get_use_keywords(self): @@ -152,7 +152,7 @@ """add new function transformation. transformer_creators - list of transformer creators, which should be applied on the function - keywd - keyword arguments for L{function_transformation_t} class initialization + keywd - keyword arguments for :class:`function_transformers.function_transformation_t` class initialization """ self.transformations.append( ft.function_transformation_t( self, transformer_creators, **keywd ) ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -51,10 +51,10 @@ """ class class_common_details_t( object ): - """defines few properties that are common to - L{class declaration<pygccxml.declarations.class_declaration_t>} and - L{definition<pygccxml.declarations.class_t>} classes """ + defines :class:`pygccxml.declarations.class_declaration_t` and :class:`pygccxml.declarations.class_t` + classes common properties + """ def __init__(self): object.__init__( self ) self._always_expose_using_scope = None @@ -109,7 +109,7 @@ def _set_always_expose_using_scope( self, value ): self._always_expose_using_scope = value always_expose_using_scope = property( _get_always_expose_using_scope, _set_always_expose_using_scope - , doc="please see L{class_wrapper.always_expose_using_scope_documentation} variable for documentation." ) + , doc="please see :attr:`class_wrapper.always_expose_using_scope_documentation` variable for documentation." ) def _get_equality_comparable( self ): if None is self._equality_comparable: @@ -480,24 +480,28 @@ self._properties.append( properties.property_t( name, fget, fset, doc, True ) ) def redefined_funcs( self ): - """returns list of member functions that should be defined in class wrapper + """ + returns list of member functions that should be defined in the class wrapper It comes useful in 3 tier hierarchy: - struct base{ - virtual void do_nothing() = 0; - }; - struct derived{ - virtual void do_something() = 0; - }; + .. code-block:: c++ - struct concrete{ - virtual void do_nothing(){} - virtual void do_something(){} - }; + struct base{ + virtual void do_nothing() = 0; + }; - derived_wrapper should define do_nothing function, otherwise the generated - code will not compile + struct derived{ + virtual void do_something() = 0; + }; + + struct concrete{ + virtual void do_nothing(){} + virtual void do_something(){} + }; + + The wrapper for class `derived`, should define `do_nothing` function, + otherwise the generated code will not compile """ if isinstance( self._redefined_funcs, list ): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -42,7 +42,7 @@ @property def logger( self ): - """reference to L{_logging_.loggers.declarations}""" + """reference to :attr:`_logging_.loggers.declarations`""" return _logging_.loggers.declarations def _get_documentation( self ): @@ -210,9 +210,13 @@ disabled_messaged = disabled_messages def disable_messages( self, *args ): - """set messages, which should not be reported to you + """ + disable messages - `Py++` will not report the disabled messages + Usage example: - Usage example: decl.disable_messages( messages.W1001, messages.W1040 ) + .. code-block:: python + + decl.disable_messages( messages.W1001, messages.W1040 ) """ for msg in args: msg_id = messages.find_out_message_id( msg ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -118,9 +118,11 @@ super( decl_wrapper_printer_t, self ).visit_variable() def print_declarations( decls, detailed=True, recursive=True, writer=sys.stdout.write ): - """ Print decl tree rooted at each of the included nodes. - decls - either a single decl or a list of decls. """ + print declarations tree + + :param decls: could be single :class:`pygccxml.declarations.declaration_t` object or list of them + """ prn = decl_wrapper_printer_t(0, detailed, recursive, writer) if type(decls) is not list: decls = [decls] Modified: pyplusplus_dev/pyplusplus/decl_wrappers/scopedef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/scopedef_wrapper.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/decl_wrappers/scopedef_wrapper.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -3,13 +3,13 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"""defines base class for L{decl_wrappers.class_t} and L{decl_wrappers.namespace_t} classes""" +"""defines base class for :class:`decl_wrappers.class_t` and :class:`decl_wrappers.namespace_t` classes""" import decl_wrapper from pyplusplus import messages class scopedef_t(decl_wrapper.decl_wrapper_t): - """base class for L{decl_wrappers.class_t} and L{decl_wrappers.namespace_t} classes + """base class for :class:`decl_wrappers.class_t` and :class:`decl_wrappers.namespace_t` classes It provides convenience functionality: include\\exclude all internal declarations (not) to be exported. Modified: pyplusplus_dev/pyplusplus/decl_wrappers/user_text.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/user_text.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/decl_wrappers/user_text.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"defines few classes, used by L{decl_wrapper.class_t} class to keep user code" +"defines few classes, used by :class:`decl_wrapper.class_t` class to keep user code" class user_text_t(object): "keeps reference to user code that belongs to declaration section" Modified: pyplusplus_dev/pyplusplus/file_writers/single_file.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/single_file.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/file_writers/single_file.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"""defines a class that writes L{code_creators.module_t} to single file""" +"""defines a class that writes :class:`code_creators.module_t` to single file""" import os import writer Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"""defines interface for all classes that writes L{code_creators.module_t} to file(s)""" +"""defines interface for all classes that writes :class:`code_creators.module_t` to file(s)""" import os import time @@ -60,7 +60,7 @@ @staticmethod def create_backup(fpath): - """creates backup of the file, by renaming it to C{fpath + ~}""" + """creates backup of the file""" if not os.path.exists( fpath ): return backup_fpath = fpath + '~' @@ -69,7 +69,7 @@ os.rename( fpath, backup_fpath ) def write_code_repository(self, dir): - """creates files defined in L{code_repository} package""" + """creates files defined in :mod:`code_repository` package""" visited = set() system_files = self.extmodule.get_system_files( recursive=True ) for cr in code_repository.all: Modified: pyplusplus_dev/pyplusplus/function_transformers/controllers.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/controllers.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/function_transformers/controllers.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -20,7 +20,7 @@ def __init__( self, type, name, initialize_expr='' ): """ :param type: type of the variable - :type type: instance of L{pygccxml.declarations.type_t} + :type type: instance of :class:`pygccxml.declarations.type_t` :param name: name( str ) of the variable @@ -74,7 +74,7 @@ """declare variable :param type: type of the variable - :type type: instance of L{pygccxml.declarations.type_t} + :type type: instance of :class:`pygccxml.declarations.type_t` :param name: name( str ) of the variable Modified: pyplusplus_dev/pyplusplus/function_transformers/function_transformation.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/function_transformation.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/function_transformers/function_transformation.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -3,23 +3,23 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"""This module contains the class L{function_transformation_t}. -""" +"""defines :class:function_transformation_t class""" + import md5 import controllers from pygccxml import declarations from pyplusplus import code_repository -class function_transformation_t: +class function_transformation_t: + """the class holds function transformation definition - all transformations that should be applied""" def __init__(self, function, transformer_creator, **keywd): - """Constructor. """ self.__function = function self.__controller = None if isinstance( function.parent, declarations.class_t ): if declarations.VIRTUALITY_TYPES.NOT_VIRTUAL == function.virtuality: self.__controller = controllers.mem_fun_controller_t( function ) elif declarations.VIRTUALITY_TYPES.PURE_VIRTUAL == function.virtuality: - self.__controller = controllers.pure_virtual_mem_fun_controller_t( function ) + self.__controller = controllers.pure_virtual_mem_fun_controller_t( function ) else: self.__controller = controllers.virtual_mem_fun_controller_t( function ) else: @@ -29,7 +29,7 @@ self.__controller.apply( self.__transformers ) self.__unique_name = None self.__alias = keywd.get( 'alias', None ) - + @property def unique_name( self ): if None is self.__unique_name: @@ -51,7 +51,7 @@ else: self.__alias = self.__function.alias return self.__alias - + @property def transformers( self ): return self.__transformers Modified: pyplusplus_dev/pyplusplus/function_transformers/transformer.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/transformer.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/function_transformers/transformer.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -3,8 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"""This module contains the class L{transformer_t}. -""" +"""defines :class:transformer_t class""" import sys, os.path, copy, re, types from pygccxml import declarations, parser @@ -71,7 +70,7 @@ transformers should override the method, in order to define custom transformation for free function. - :param controller: instance of L{free_fun_controller_t} class + :param controller: instance of :class:`free_fun_controller_t` class """ raise NotImplementedError(self.__class__.__name__) Modified: pyplusplus_dev/pyplusplus/module_builder/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/__init__.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/module_builder/__init__.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -4,12 +4,7 @@ # http://www.boost.org/LICENSE_1_0.txt) """ -This package provides users with simple and convenient interface to `Py++` -functionality. - -L{module_builder_t} class is the main class. Please read it's documentation first. -Also take a look on tutorials. You can find them on `Py++` -U{web site<http://www.language-binding.net>} +This package provides simple and convenient interface to `Py++` functionality. """ from boost_python_builder import builder_t as module_builder_t Modified: pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -25,7 +25,7 @@ """ This class provides users with simple and intuitive interface to `Py++` and/or pygccxml functionality. If this is your first attempt to use `Py++` - consider to read tutorials. You can find them on U{web site<http://www.language-binding.net>}. + consider to read tutorials. You can find them on `web site <http://www.language-binding.net>`_. """ def __init__( self @@ -47,7 +47,7 @@ , gccxml_config=None): """ :param files: list of files, declarations from them you want to export - :type files: list of strings or L{file_configuration_t} instances + :type files: list of strings or :class:`parser.file_configuration_t` instances :param gccxml_path: path to gccxml binary. If you don't pass this argument, pygccxml parser will try to locate it using you environment PATH variable Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -26,7 +26,7 @@ """ This class provides users with simple and intuitive interface to `Py++` and/or pygccxml functionality. If this is your first attempt to use `Py++` - consider to read tutorials. You can find them on U{web site<http://www.language-binding.net>}. + consider to read tutorials. You can find them on `web site <http://www.language-binding.net>`_. """ def __init__( self , files @@ -36,7 +36,7 @@ , encoding='ascii' ): """ :param files: list of files, declarations from them you want to export - :type files: list of strings or L{file_configuration_t} instances + :type files: list of strings or :class:`parser.file_configuration_t` instances :param gccxml_path: path to gccxml binary. If you don't pass this argument, pygccxml parser will try to locate it using you environment PATH variable @@ -108,7 +108,7 @@ @property def code_creator( self ): - "reference to L{code_creators.ctypes_module_t} instance" + "reference to :class:`code_creators.ctypes_module_t` instance" if not self.__code_creator: raise RuntimeError( "self.module is equal to None. Did you forget to call build_code_creator function?" ) return self.__code_creator Modified: pyplusplus_dev/pyplusplus/module_builder/module_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/module_builder.py 2009-02-08 19:52:49 UTC (rev 1663) +++ pyplusplus_dev/pyplusplus/module_builder/module_builder.py 2009-02-09 09:48:27 UTC (rev 1664) @@ -36,9 +36,9 @@ def run_query_optimizer(self): """ - It is possible to optimze time that takes to execute queries. In most cases - this is done from __init__ method. But there are use-case, when you need - to disable optimizer at __init__ and run it later. + It is possible to optimize time that takes to execute queries. In most cases + this is done from the :meth:`__init__` method. But there are use-case, + when you need to disable optimizer and run it later. """ self.global_ns.init_optimizer() @@ -48,7 +48,7 @@ some specific one. :param decl: optional, if passed, then only it will be printed - :type decl: instance of L{decl_wrappers.decl_wrapper_t} class + :type decl: instance of :class:`decl_wrappers.decl_wrapper_t` class """ if None is decl: decl = self.global_ns This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-02-15 20:51:25
|
Revision: 1682 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1682&view=rev Author: roman_yakovenko Date: 2009-02-15 20:51:18 +0000 (Sun, 15 Feb 2009) Log Message: ----------- move doc_extractor to module_t class Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2009-02-15 09:41:59 UTC (rev 1681) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2009-02-15 20:51:18 UTC (rev 1682) @@ -71,8 +71,18 @@ return set( decls ) + def update_documentation( self, doc_extractor ): + if not doc_extractor: + return + visited = set() + for cc in algorithm.make_flatten( self ): + if not isinstance( cc, declaration_based.declaration_based_t ): + continue + if id( cc.declaration ) in visited: + continue + cc.declaration.documentation = doc_extractor( cc.declaration ) + visited.add( cc.declaration ) - class bpmodule_t(module_t): """This class represents the source code for the entire extension module. @@ -116,8 +126,8 @@ """Return reference to :class:`code_creators.module_body_t` code creator""" if None is self.__body: found = algorithm.creator_finder.find_by_class_instance( what=module_body.module_body_t - , where=self.creators - , recursive=False ) + , where=self.creators + , recursive=False ) if found: self.__body = found[0] return self.__body Modified: pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-02-15 09:41:59 UTC (rev 1681) +++ pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-02-15 20:51:18 UTC (rev 1682) @@ -37,8 +37,7 @@ , call_policies_resolver_=None , types_db=None , target_configuration=None - , enable_indexing_suite=True - , doc_extractor=None ): + , enable_indexing_suite=True ): """Constructor. :param decls: Declarations that should be exposed in the final module. @@ -47,7 +46,6 @@ :param call_policies_resolver_: Callable that takes one declaration (calldef_t) as input and returns a call policy object which should be used for this declaration. :param types_db: ...todo... :param target_configuration: A target configuration object can be used to customize the generated source code to a particular compiler or a particular version of Boost.Python. - :param doc_extractor: callable, that takes as argument declaration reference and returns documentation string :param already_exposed_dbs: list of files/directories other modules, this module depends on, generated their code too :type decls: list of declaration_t :type module_name: str @@ -55,7 +53,6 @@ :type call_policies_resolver_: callable :type types_db: L:class:`types_database.types_database_t` :type target_configuration: :class:`code_creators.target_configuration_t` - :type doc_extractor: callable :type already_exposed_dbs: list of strings """ declarations.decl_visitor_t.__init__(self) @@ -91,7 +88,7 @@ self.__opaque_types_manager = opaque_types_manager.manager_t( self.__extmodule ) self.__dependencies_manager = dependencies_manager.manager_t(self.decl_logger) - prepared_decls = self._prepare_decls( decls, doc_extractor ) + prepared_decls = self._prepare_decls( decls ) self.__decls = sort_algorithms.sort( prepared_decls ) self.curr_code_creator = self.__module_body @@ -115,7 +112,7 @@ for msg in readme: self.decl_logger.warn( "%s;%s" % ( decl, msg ) ) - def _prepare_decls( self, decls, doc_extractor ): + def _prepare_decls( self, decls ): to_be_exposed = [] for decl in declarations.make_flatten( decls ): if decl.ignore: @@ -152,9 +149,6 @@ #if isinstance( decl, declarations.variable_t ): #self.__types_db.update( decl ) - if doc_extractor: - decl.documentation = doc_extractor( decl ) - self.__print_readme( decl ) return to_be_exposed Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-02-15 09:41:59 UTC (rev 1681) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-02-15 20:51:18 UTC (rev 1682) @@ -19,8 +19,7 @@ def __init__( self , global_ns , library_path - , exported_symbols - , doc_extractor=None ): + , exported_symbols ): declarations.decl_visitor_t.__init__(self) self.logger = _logging_.loggers.module_builder self.decl_logger = _logging_.loggers.declarations @@ -71,7 +70,7 @@ return decl in self.__exported_decls return True - #~ def __prepare_decls( self, global_ns, doc_extractor ): + #~ def __prepare_decls( self, global_ns ): #~ to_be_exposed = [] #~ for decl in declarations.make_flatten( global_ns ): #~ if decl.ignore: @@ -90,9 +89,6 @@ #~ #leave only declarations defined under namespace, but remove namespaces #~ to_be_exposed.append( decl ) - #~ if doc_extractor: - #~ decl.documentation = doc_extractor( decl ) - #~ self.__print_readme( decl ) #~ return to_be_exposed Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-02-15 09:41:59 UTC (rev 1681) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-02-15 20:51:18 UTC (rev 1682) @@ -109,9 +109,9 @@ start_time = time.clock() fcontent_new = [] if os.path.splitext( fpath )[1] == '.py': - fcontent_new.append( '# This file has been generated by `Py++`.' ) + fcontent_new.append( '# This file has been generated by Py++.' ) else: - fcontent_new.append( '// This file has been generated by `Py++`.' ) + fcontent_new.append( '// This file has been generated by Py++.' ) fcontent_new.append( os.linesep * 2 ) fcontent_new.append( content ) fcontent_new.append( os.linesep ) #keep gcc happy Modified: pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-02-15 09:41:59 UTC (rev 1681) +++ pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-02-15 20:51:18 UTC (rev 1682) @@ -237,10 +237,10 @@ , call_policies_resolver_ , types_db , target_configuration - , enable_indexing_suite - , doc_extractor) + , enable_indexing_suite ) self.__code_creator = creator.create() self.__code_creator.replace_included_headers(self.__parsed_files) + self.__code_creator.update_documentation( doc_extractor ) return self.__code_creator @property Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-02-15 09:41:59 UTC (rev 1681) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-02-15 20:51:18 UTC (rev 1682) @@ -101,9 +101,9 @@ def build_code_creator( self, library_path, doc_extractor=None ): creator = creators_factory.ctypes_creator_t( self.global_ns , library_path - , self.__blob2decl - , doc_extractor) + , self.__blob2decl ) self.__code_creator = creator.create() + self.__code_creator.update_documentation( doc_extractor ) return self.__code_creator @property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-05-19 17:45:05
|
Revision: 1737 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1737&view=rev Author: roman_yakovenko Date: 2009-05-19 17:44:52 +0000 (Tue, 19 May 2009) Log Message: ----------- update version number Modified Paths: -------------- pygccxml_dev/docs/history/history.rest pygccxml_dev/pygccxml/__init__.py pyplusplus_dev/docs/history/history.rest pyplusplus_dev/pyplusplus/__init__.py Modified: pygccxml_dev/docs/history/history.rest =================================================================== --- pygccxml_dev/docs/history/history.rest 2009-05-17 08:34:14 UTC (rev 1736) +++ pygccxml_dev/docs/history/history.rest 2009-05-19 17:44:52 UTC (rev 1737) @@ -23,7 +23,7 @@ * Gustavo Carneiro ----------- -Version 1.1 +SVN Version ----------- 1. Experimental back-ends based on ``.pdb`` and ``.bsc`` files were removed. Modified: pygccxml_dev/pygccxml/__init__.py =================================================================== --- pygccxml_dev/pygccxml/__init__.py 2009-05-17 08:34:14 UTC (rev 1736) +++ pygccxml_dev/pygccxml/__init__.py 2009-05-19 17:44:52 UTC (rev 1737) @@ -33,6 +33,6 @@ #TODO: # 1. Add "explicit" property for constructors -__version__ = '1.1.0' +__version__ = '1.5.0' __revision__ = 1080 Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2009-05-17 08:34:14 UTC (rev 1736) +++ pyplusplus_dev/docs/history/history.rest 2009-05-19 17:44:52 UTC (rev 1737) @@ -1,560 +1,560 @@ -=================== -Development history -=================== - ------------- -Contributors ------------- - -Thanks to all the people that have contributed patches, bug reports and suggestions: - -* My wife - Yulia -* John Pallister -* Matthias Baas -* Allen Bierbaum -* Lakin Wecker -* Georgiy Dernovoy -* Gottfried Ganssauge -* Andy Miller -* Martin Preisler -* Meghana Haridev -* Julian Scheid -* Oliver Schweitzer -* Hernán Ordiales -* Bernd Fritzke -* Andrei Vermel -* Carsten( spom.spom ) - ------------ -Version 1.1 ------------ - -1. The bug related to exposing free operators was fixed. Many thanks to Andrei Vermel. - -2. Few bugs were fixed for 64Bit platform. Many thanks to Carsten. - -3. :mod:`ctypes` backend was introduced - :doc:`Py++ <../pyplusplus>` is able to - generate Python code, which uses :mod:`ctypes` package to call functions in - DLLs or shared libraries. - - Massive refactoring, which preserve backward compatibility to previous releases, - was done. - -4. From now on, :doc:`Py++ <../pyplusplus>` will use `Sphinx <http://sphinx.pocoo.org/>`_ - for all documentation. - -5. :doc:`Indexing Suite V2 <../documentation/indexing_suite_v2.html>` introduces - few backward compatibility changes. The indexing suite became "headers only" - library and doesn't requier Boost.Python library patching. - See ":doc:`../documentation/containers`" document for more information. - -6. Support for `std::hash_map<...>` and `std::hash_set<...>` containers was added. - ------------ -Version 1.0 ------------ - -1. The algorithm, which calculates what member functions should be redefined in - derived class wrappers, was improved. Many thanks to Julian Scheid for the bug - fix. - - The change explanation. - - .. code-block:: c++ - - struct A{ - virtual void foo() {} - }; - - class B: public A{ - }; - - Previous version of :doc:`Py++ <../pyplusplus>` didn't generate wrapper for class ``B``, even - though ``B`` inherits ``A``'s virtual function. Now if you have the following - Python code: - - .. code-block:: python - - class C(B): - def __init__( self ): - B.__init__(self) - def foo(self): - print "C.foo" - - then when ``foo`` is invoked on this instance on the C++ side of things, the - Python code won't be executed as the wrapper was missing. - - **Warning!** **There is a possibility that your generated code will not work!** - **Keep reading.** - - If you use "function transformation" functionality, than it is possible the - generated code will **NOT** work. Consider the following example: - - .. code-block:: c++ - - struct A{ - virtual void foo(int& i) {/*do smth*/} - }; - - class B: public A{ - virtual void foo(int& i) {/*do smth else*/} - }; - - The :doc:`Py++ <../pyplusplus>` code: - - .. code-block:: python - - from pyplusplus import module_builder - from pyplusplus import function_transformers as FT - - mb = module_builder_t( ... ) - foo = mb.mem_funs( 'foo' ) - foo.add_transformation( FT.output(0) ) - - The generated code, for class ``B``, is: - - .. code-block:: c++ - - namespace bp = boost::python; - - struct B_wrapper : B, bp::wrapper< B > { - virtual void foo( int & i ) const { ... } - - static boost::python::tuple default_foo( ::B const & inst ) - { ... } - - virtual void foo( int & i ) const - { ... } - - static boost::python::object default_foo( ::A const & inst ) - { ... } - }; - ... - bp::class_< B_wrapper, bp::bases< A > >( "B" ) - .def( "foo", (boost::python::tuple (*)( ::B const & ))( &B_wrapper::default_foo ) ) - .def( "foo", (boost::python::object (*)( ::A const & ))( &B_wrapper::default_foo ) ); - - As you can see, after applying the transformation both functions have same - signature. Do you know what function will be called in some situation? I do - - the wrong one :-(. - - Unfortunately, there is no easy work around or some trick that you can use, - which will not break the existing code. I see few solutions to the problem: - - * change the alias of the functions - - .. code-block:: python - - from pyplusplus import module_builder - from pyplusplus import function_transformers as FT - - mb = module_builder_t( ... ) - foo = mb.mem_funs( '::A::foo' ).add_transformation( FT.output(0), alias="foo_a" ) - foo = mb.mem_funs( '::B::foo' ).add_transformation( FT.output(0), alias="foo_b" ) - - * use ``inout`` transformation - it preserves a function signature - - * :doc:`Py++ <../pyplusplus>` can introduce a configuration, that will preserve the previous behaviour. - I think this is a wrong way to go and doing the API changes is the 'right' - longer term solution. - - If you **absolutely need** to preserve API backward compatible, contact me - and I will introduce such configuration option. - - Sorry for inconvenience. - -2. Few bugs, related to Indexing Suite 2, were fixed. Many thanks to Oliver Schweitzer - for reporting them. - -3. New and highly experimental feature was introduced - - :doc:`Boost.Python and ctypes integration <../documentation/ctypes/ctypes_integration>`. - -4. Support for :doc:`boost::python::make_constructor <../documentation/functions/make_constructor>` functionality was added. - -5. Support for unions and unnamed classes was added. - -6. Doxygen documentation extractor was improved. Many thanks to Hernán Ordiales. - -7. Py++ documentation was improved. Many thanks to Bernd Fritzke. - -------------- -Version 0.9.5 -------------- - -1. Bug fixes: - - * Py++ will not expose free operators, if at least one of the classes, it works - on, is not exposed. - Many thanks to Meghana Haridev for reporting the bug. - -2. Added ability to completely disable warnings reporting. - -3. All logging is now done to ``stderr`` instead of ``stdout``. - -4. Generated code improvements: - - * ``default_call_policies`` is not generated - - * ``return_internal_reference`` call policies - default arguments are not - generated - - * STD containers are generated without default arguments. For example instead - of ``std::vector< int, std::allocator< int > >``, in many cases :doc:`Py++ <../pyplusplus>` will - generate ``std::vector< int >``. - -5. :doc:`create_with_signature <../documentation/functions/overloading>` algorithm was improved. - :doc:`Py++ <../pyplusplus>` will generate correct code in one more use case. - -6. Added ability to exclude declarations from being exposed, if they will cause - compilation to fail. - -7. Starting from this version, :doc:`Py++ <../pyplusplus>` provides a complete solution for - :doc:`multi-module development <../documentation/multi_module_development>`. - -8. Classes, which expose C arrays will be registered only once. - -9. Starting from this version, :doc:`Py++ <../pyplusplus>` supports a code generation with different - encodings. - -10. There is a new strategy to split code into files. It is IDE friendly. Be sure - to read :doc:`the updated documentation <../documentation/split_module>`. - -------------- -Version 0.9.0 -------------- - -1. Bug fixes: - - * Declaration of virtual functions that have an exception specification with - an empty throw was fixed. Now the exception specification is generated properly. - Many thanks to Martin Preisler for reporting the bug. - -2. Added exposing of copy constructor, ``operator=`` and ``operator<<``. - - * ``operator=`` is exposed under "assign" name - - * ``operator<<`` is exposed under "__str__" name - -3. Added new call policies: - - * :doc:`as_tuple <../documentation/functions/call_policies/as_tuple>` - - * :doc:`custom_call_policies <../documentation/functions/call_policies/return_range>` - - * :doc:`return_range <../documentation/functions/call_policies/return_range>` - -4. Added an initial support for multi-module development. Now you can mark your - declarations as ``already_exposed`` and :doc:`Py++ <../pyplusplus>` will do the rest. For more - information read :doc:`multi-module development guide <../documentation/multi_module_development>`. - -.. line-separator - -5. :doc:`input_c_buffer <../documentation/functions/transformation/input_c_buffer>` - new functions - transformation, which allows to pass a Python sequence to function, instead of pair of arguments: pointer to buffer and size. - -6. Added ability to control generated "include" directives. Now you can ask :doc:`Py++ <../pyplusplus>` - to include a header file, when it generates code for some declaration. For more - information refers to `inserting code guide`_. - -.. _`inserting code guide` : ../documentation/inserting_code.html#header-files - -7. Code generation improvements: system header files ( Boost.Python or Py++ defined ) - will be included from the generated files only in case the generated code - depends on them. - -8. Performance improvements: Py++ runs 1.5 - 2 times faster, than the previous one. - -9. Added ability to add code before overridden and default function calls. - For more information refer to `member function API documentation`_. - -.. _`member function API documentation` : ../documentation/apidocs/pyplusplus.decl_wrappers.calldef_wrapper.member_function_t-class.html - -10. :doc:`Py++ <../pyplusplus>` will generate documentation for automatically constructed properties. - For more information refer to :doc:`properties guide <../documentation/properties>`. - -11. Added iteration functionality to Boost.Python Indexing Suite V2 ``std::map`` - and ``std::multimap`` containers. - -------------- -Version 0.8.5 -------------- - -1. Added :doc:`Function Transformation <../documentation/functions/transformation/transformation>` feature. - -2. "Py++" introduces new functionality, which allows you to control messages and - warnings: :doc:`how to disable warnings? <../documentation/warnings>`. - -3. Added new algorithm, which controls the registration order of the functions. - See :doc:`registration order document <../documentation/functions/registration_order>` - -4. New "Py++" defined :doc:`return_pointee_value <../documentation/functions/call_policies/return_pointee_value>` - call policy was introduced. - -5. Support for opaque types was added. Read more about this feature `here`__. - -.. __ : ../documentation/functions/call_policies/call_policies.html#special-case - -6. It is possible to configure "Py++" to generate faster ( compilation time ) - code for indexing suite version 2. See API documentation. - -7. The algorithm, which finds all class properties was improved. It provides - user with a better way to control properties creation. A property that would - hide another exposed declaration will not be registered\\created. - -8. Work around for "custom smart pointer as member variable" Boost.Python bug - was introduced. - -9. Bugs fixes and documentation improvement. - - -------------- -Version 0.8.2 -------------- - -1. Interface changes: - - * ``module_builder.module_builder_t.build_code_creator`` method: - argument ``create_casting_constructor`` was removed and deprecation warning - was introduced. - -2. Performance improvements. In some cases you can get x10 performance boost. - Many thanks to Allen Bierbaum! Saving and reusing results of different - :doc:`pygccxml <../../pygccxml/pygccxml>` algorithms and type traits functions achieved this. - -3. Convenience API for registering exception translator was introduced. - -4. :doc:`Py++ <../pyplusplus>` can generate code that uses ``BOOST_PYTHON_FUNCTION_OVERLOADS`` and - ``BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS`` macros. - -5. Treatment to previously generated and no more in-use files was added. By - default :doc:`Py++ <../pyplusplus>` will delete these files, but of course you can redefine this - behaviour. - -6. Generated code changes: - - * ``default_call_policies`` should not be generated any more. - - * For functions that have ``return_value_policy< return_opaque_pointer >`` - call policy, :doc:`Py++ <../pyplusplus>` will automatically generate ``BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID`` - macro. Thank you very much for Gottfried Ganssauge for this idea. - -7. Support for Boost.Python properties was introduced. :doc:`Py++ <../pyplusplus>` implements small - algorithm, that will automatically discover properties, base on naming conventions. - -8. ``decl_wrappers.class_t`` has new function: ``is_wrapper_needed``. This - function explains why :doc:`Py++ <../pyplusplus>` creates class wrapper for exposed class. - -9. Python type traits module was introduce. Today it contains only single function: - - * ``is_immutable`` - returns ``True`` if exposed type is Python immutable type - - - -------------- -Version 0.8.1 -------------- - - -1. Georgiy Dernovoy contributed a patch, which allows :doc:`Py++ <../pyplusplus>` GUI to - save\\load last used header file. - - -2. :doc:`Py++ <../pyplusplus>` improved a lot functionality related to providing feedback to user: - - * every package has its own logger - * only important user messages are written to ``stdout`` - * user messages are clear - -3. Support for Boost.Python indexing suite version 2 was implemented. - -4. Every code creator class took ``parent`` argument in ``__init__`` method. - This argument was removed. ``adopt_creator`` and ``remove_creator`` will - set\unset reference to parent. - -5. Generated code for member and free functions was changed. This changed was - introduced to fix compilation errors on msvc 7.1 compiler. - -6. :doc:`Py++ <../pyplusplus>` generates "stable" code. If header files were not changed, - :doc:`Py++ <../pyplusplus>` will not change any file. - -7. Support for huge classes was added. :doc:`Py++ <../pyplusplus>` is able to split registration - code for the class to multiple cpp files. - -8. User code could be added almost anywhere, without use of low level API. - -9. Generated source files include only header files you passes as an argument - to module builder. - -10. Bug fixes. - -11. Documentation was improved. - - -Project name changed --------------------- - -In this version the project has been renamed from "pyplusplus" to "Py++". -There were few reasons to this: - -1. I like "Py++" more then "pyplusplus". - -2. "Py++" was the original name of the project: http://mail.python.org/pipermail/c++-sig/2005-July/009280.html - -3. Users always changed the name of the projects. I saw at least 6 different names. - - - -------------- -Version 0.8.0 -------------- - -1. :doc:`Py++ <../pyplusplus>` "user guide" functionality has been improved. Now :doc:`Py++ <../pyplusplus>` - can answer few questions: - - * why this declaration could not be exported - - * why this function could not be overridden from Python - -2. :doc:`Py++ <../pyplusplus>` can suggest an alias for exported classes. - -3. Small redesign has been done - now it is much easier to understand and - maintain code creators, which creates code for C++ functions. - -4. Exception specification is taken into account, when :doc:`Py++ <../pyplusplus>` exports - member functions. - -5. Member variables, that are pointers exported correctly. - -6. Added experimental support for ``vector_indexing_suite``. - -7. Bug fixes. - -------------- -Version 0.7.0 -------------- - -Many thanks to *Matthias Baas* and *Allen Bierbaum*! They contributed so much to -Py++, especially Matthias: - - * New high-level API: :doc:`Py++ <../pyplusplus>` has simple and powerful API - - * Documentation: Matthias and Allen added a lot of documentation strings - - * Bug fixes and performance improvements - -1. New GUI features: - - * It is possible now to see XML generated by GCC-XML. - - * It is possible to use GUI as wizard. It will help you to start with - :doc:`Py++ <../pyplusplus>`, by generating :doc:`Py++ <../pyplusplus>` code. - -2. **Attention - non backward compatible change**. - - ``module_creator.creator_t.__init__`` method has been changed. ``decls`` - argument could be interpreted as - - * list of all declaration to be exported - - * list of top-level declarations. ``creator_t`` should export all - declarations recursively. - - In order to clarify the use of ``decls`` argument new argument ``recursive`` - has been added. By default new value of ``recursive`` is ``False``. - - Guide for users/upgraders: if use are exporting all declaration without - filtering, you should set ``recursive`` argument to ``True``. If you use - ``pygccxml.declarations.filtering.*`` functions, you have nothing to do. - - Sorry for the inconvenience :-(. - -3. Better split of extension module to files. From now the following declarations will - have dedicated file: - - * named enumerations, defined within namespace - * unnamed enumerations and global variables - * free functions - - This functionality will keep the number of instantiated templates within - one file, ``main.cpp``, to be very low. Also it is possible to implement - solution, where ``main.cpp`` file does not contain templates instantiations - at all. - -4. Only constant casting operators could be used with ``implicitly_convertible``. - This bug has been fixed. - -5. Bug exporting non copyable class has been fixed. - -6. Small bug fix - from now file with identical content will not be overwritten. - -7. Boost.Python ``optional`` is now supported and used when a constructor has a - a default argument. - -8. :doc:`Py++ <../pyplusplus>` now generates correct code for hierarchy of abstract classes: - - .. code-block:: c++ - - struct abstract1{ - virtual void do_smth() = 0; - } - - struct abstract2 : public abstract1{ - virtual void do_smth_else() = 0; - } - - struct concrete : public abstract2{ - virtual void do_smth(){}; - virtual void do_smth_else(){}; - } - -9. Logging functionality has been added - -10. New packages ``module_builder``, ``decl_wrappers`` and ``_logging_`` has - been added. - -11. ... - -http://boost.org/libs/python/doc/v2/init.html#optional-spec - -------------- -Version 0.6.0 -------------- - -1. Code repository has been introduced. This repository contains classes - and functions that will help users to export different C++ classes and - declarations. Right now this repository contains two classes: - - * *array_1_t* - - * *const_array_1_t* - - Those classes helps to export static, single dimension arrays. - -2. Code generation has been improved. - -3. Code generation speed has been improved. - -4. If you have Niall Douglas *void\** patch, then you can enjoy from - automatically set call policies. - -5. Bit fields can be accessed from Python - -6. Creating custom code creator example has been added. - -7. Comparison to Pyste has been wrote. - -8. Using this version it is possible to export most of TnFOX Python bindings. - -------------- -Version 0.5.1 -------------- - -1. operator() is now supported. - -2. Special casting operators are renamed( *__int__*, *__str__*, ... ). - -3. Few bug fixes - - -.. _`SourceForge`: http://sourceforge.net/index.php - +=================== +Development history +=================== + +------------ +Contributors +------------ + +Thanks to all the people that have contributed patches, bug reports and suggestions: + +* My wife - Yulia +* John Pallister +* Matthias Baas +* Allen Bierbaum +* Lakin Wecker +* Georgiy Dernovoy +* Gottfried Ganssauge +* Andy Miller +* Martin Preisler +* Meghana Haridev +* Julian Scheid +* Oliver Schweitzer +* Hernán Ordiales +* Bernd Fritzke +* Andrei Vermel +* Carsten( spom.spom ) + +----------- +SVN Version +----------- + +1. The bug related to exposing free operators was fixed. Many thanks to Andrei Vermel. + +2. Few bugs were fixed for 64Bit platform. Many thanks to Carsten. + +3. :mod:`ctypes` backend was introduced - :doc:`Py++ <../pyplusplus>` is able to + generate Python code, which uses :mod:`ctypes` package to call functions in + DLLs or shared libraries. + + Massive refactoring, which preserve backward compatibility to previous releases, + was done. + +4. From now on, :doc:`Py++ <../pyplusplus>` will use `Sphinx <http://sphinx.pocoo.org/>`_ + for all documentation. + +5. :doc:`Indexing Suite V2 <../documentation/indexing_suite_v2.html>` introduces + few backward compatibility changes. The indexing suite became "headers only" + library and doesn't requier Boost.Python library patching. + See ":doc:`../documentation/containers`" document for more information. + +6. Support for `std::hash_map<...>` and `std::hash_set<...>` containers was added. + +----------- +Version 1.0 +----------- + +1. The algorithm, which calculates what member functions should be redefined in + derived class wrappers, was improved. Many thanks to Julian Scheid for the bug + fix. + + The change explanation. + + .. code-block:: c++ + + struct A{ + virtual void foo() {} + }; + + class B: public A{ + }; + + Previous version of :doc:`Py++ <../pyplusplus>` didn't generate wrapper for class ``B``, even + though ``B`` inherits ``A``'s virtual function. Now if you have the following + Python code: + + .. code-block:: python + + class C(B): + def __init__( self ): + B.__init__(self) + def foo(self): + print "C.foo" + + then when ``foo`` is invoked on this instance on the C++ side of things, the + Python code won't be executed as the wrapper was missing. + + **Warning!** **There is a possibility that your generated code will not work!** + **Keep reading.** + + If you use "function transformation" functionality, than it is possible the + generated code will **NOT** work. Consider the following example: + + .. code-block:: c++ + + struct A{ + virtual void foo(int& i) {/*do smth*/} + }; + + class B: public A{ + virtual void foo(int& i) {/*do smth else*/} + }; + + The :doc:`Py++ <../pyplusplus>` code: + + .. code-block:: python + + from pyplusplus import module_builder + from pyplusplus import function_transformers as FT + + mb = module_builder_t( ... ) + foo = mb.mem_funs( 'foo' ) + foo.add_transformation( FT.output(0) ) + + The generated code, for class ``B``, is: + + .. code-block:: c++ + + namespace bp = boost::python; + + struct B_wrapper : B, bp::wrapper< B > { + virtual void foo( int & i ) const { ... } + + static boost::python::tuple default_foo( ::B const & inst ) + { ... } + + virtual void foo( int & i ) const + { ... } + + static boost::python::object default_foo( ::A const & inst ) + { ... } + }; + ... + bp::class_< B_wrapper, bp::bases< A > >( "B" ) + .def( "foo", (boost::python::tuple (*)( ::B const & ))( &B_wrapper::default_foo ) ) + .def( "foo", (boost::python::object (*)( ::A const & ))( &B_wrapper::default_foo ) ); + + As you can see, after applying the transformation both functions have same + signature. Do you know what function will be called in some situation? I do - + the wrong one :-(. + + Unfortunately, there is no easy work around or some trick that you can use, + which will not break the existing code. I see few solutions to the problem: + + * change the alias of the functions + + .. code-block:: python + + from pyplusplus import module_builder + from pyplusplus import function_transformers as FT + + mb = module_builder_t( ... ) + foo = mb.mem_funs( '::A::foo' ).add_transformation( FT.output(0), alias="foo_a" ) + foo = mb.mem_funs( '::B::foo' ).add_transformation( FT.output(0), alias="foo_b" ) + + * use ``inout`` transformation - it preserves a function signature + + * :doc:`Py++ <../pyplusplus>` can introduce a configuration, that will preserve the previous behaviour. + I think this is a wrong way to go and doing the API changes is the 'right' + longer term solution. + + If you **absolutely need** to preserve API backward compatible, contact me + and I will introduce such configuration option. + + Sorry for inconvenience. + +2. Few bugs, related to Indexing Suite 2, were fixed. Many thanks to Oliver Schweitzer + for reporting them. + +3. New and highly experimental feature was introduced - + :doc:`Boost.Python and ctypes integration <../documentation/ctypes/ctypes_integration>`. + +4. Support for :doc:`boost::python::make_constructor <../documentation/functions/make_constructor>` functionality was added. + +5. Support for unions and unnamed classes was added. + +6. Doxygen documentation extractor was improved. Many thanks to Hernán Ordiales. + +7. Py++ documentation was improved. Many thanks to Bernd Fritzke. + +------------- +Version 0.9.5 +------------- + +1. Bug fixes: + + * Py++ will not expose free operators, if at least one of the classes, it works + on, is not exposed. + Many thanks to Meghana Haridev for reporting the bug. + +2. Added ability to completely disable warnings reporting. + +3. All logging is now done to ``stderr`` instead of ``stdout``. + +4. Generated code improvements: + + * ``default_call_policies`` is not generated + + * ``return_internal_reference`` call policies - default arguments are not + generated + + * STD containers are generated without default arguments. For example instead + of ``std::vector< int, std::allocator< int > >``, in many cases :doc:`Py++ <../pyplusplus>` will + generate ``std::vector< int >``. + +5. :doc:`create_with_signature <../documentation/functions/overloading>` algorithm was improved. + :doc:`Py++ <../pyplusplus>` will generate correct code in one more use case. + +6. Added ability to exclude declarations from being exposed, if they will cause + compilation to fail. + +7. Starting from this version, :doc:`Py++ <../pyplusplus>` provides a complete solution for + :doc:`multi-module development <../documentation/multi_module_development>`. + +8. Classes, which expose C arrays will be registered only once. + +9. Starting from this version, :doc:`Py++ <../pyplusplus>` supports a code generation with different + encodings. + +10. There is a new strategy to split code into files. It is IDE friendly. Be sure + to read :doc:`the updated documentation <../documentation/split_module>`. + +------------- +Version 0.9.0 +------------- + +1. Bug fixes: + + * Declaration of virtual functions that have an exception specification with + an empty throw was fixed. Now the exception specification is generated properly. + Many thanks to Martin Preisler for reporting the bug. + +2. Added exposing of copy constructor, ``operator=`` and ``operator<<``. + + * ``operator=`` is exposed under "assign" name + + * ``operator<<`` is exposed under "__str__" name + +3. Added new call policies: + + * :doc:`as_tuple <../documentation/functions/call_policies/as_tuple>` + + * :doc:`custom_call_policies <../documentation/functions/call_policies/return_range>` + + * :doc:`return_range <../documentation/functions/call_policies/return_range>` + +4. Added an initial support for multi-module development. Now you can mark your + declarations as ``already_exposed`` and :doc:`Py++ <../pyplusplus>` will do the rest. For more + information read :doc:`multi-module development guide <../documentation/multi_module_development>`. + +.. line-separator + +5. :doc:`input_c_buffer <../documentation/functions/transformation/input_c_buffer>` - new functions + transformation, which allows to pass a Python sequence to function, instead of pair of arguments: pointer to buffer and size. + +6. Added ability to control generated "include" directives. Now you can ask :doc:`Py++ <../pyplusplus>` + to include a header file, when it generates code for some declaration. For more + information refers to `inserting code guide`_. + +.. _`inserting code guide` : ../documentation/inserting_code.html#header-files + +7. Code generation improvements: system header files ( Boost.Python or Py++ defined ) + will be included from the generated files only in case the generated code + depends on them. + +8. Performance improvements: Py++ runs 1.5 - 2 times faster, than the previous one. + +9. Added ability to add code before overridden and default function calls. + For more information refer to `member function API documentation`_. + +.. _`member function API documentation` : ../documentation/apidocs/pyplusplus.decl_wrappers.calldef_wrapper.member_function_t-class.html + +10. :doc:`Py++ <../pyplusplus>` will generate documentation for automatically constructed properties. + For more information refer to :doc:`properties guide <../documentation/properties>`. + +11. Added iteration functionality to Boost.Python Indexing Suite V2 ``std::map`` + and ``std::multimap`` containers. + +------------- +Version 0.8.5 +------------- + +1. Added :doc:`Function Transformation <../documentation/functions/transformation/transformation>` feature. + +2. "Py++" introduces new functionality, which allows you to control messages and + warnings: :doc:`how to disable warnings? <../documentation/warnings>`. + +3. Added new algorithm, which controls the registration order of the functions. + See :doc:`registration order document <../documentation/functions/registration_order>` + +4. New "Py++" defined :doc:`return_pointee_value <../documentation/functions/call_policies/return_pointee_value>` + call policy was introduced. + +5. Support for opaque types was added. Read more about this feature `here`__. + +.. __ : ../documentation/functions/call_policies/call_policies.html#special-case + +6. It is possible to configure "Py++" to generate faster ( compilation time ) + code for indexing suite version 2. See API documentation. + +7. The algorithm, which finds all class properties was improved. It provides + user with a better way to control properties creation. A property that would + hide another exposed declaration will not be registered\\created. + +8. Work around for "custom smart pointer as member variable" Boost.Python bug + was introduced. + +9. Bugs fixes and documentation improvement. + + +------------- +Version 0.8.2 +------------- + +1. Interface changes: + + * ``module_builder.module_builder_t.build_code_creator`` method: + argument ``create_casting_constructor`` was removed and deprecation warning + was introduced. + +2. Performance improvements. In some cases you can get x10 performance boost. + Many thanks to Allen Bierbaum! Saving and reusing results of different + :doc:`pygccxml <../../pygccxml/pygccxml>` algorithms and type traits functions achieved this. + +3. Convenience API for registering exception translator was introduced. + +4. :doc:`Py++ <../pyplusplus>` can generate code that uses ``BOOST_PYTHON_FUNCTION_OVERLOADS`` and + ``BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS`` macros. + +5. Treatment to previously generated and no more in-use files was added. By + default :doc:`Py++ <../pyplusplus>` will delete these files, but of course you can redefine this + behaviour. + +6. Generated code changes: + + * ``default_call_policies`` should not be generated any more. + + * For functions that have ``return_value_policy< return_opaque_pointer >`` + call policy, :doc:`Py++ <../pyplusplus>` will automatically generate ``BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID`` + macro. Thank you very much for Gottfried Ganssauge for this idea. + +7. Support for Boost.Python properties was introduced. :doc:`Py++ <../pyplusplus>` implements small + algorithm, that will automatically discover properties, base on naming conventions. + +8. ``decl_wrappers.class_t`` has new function: ``is_wrapper_needed``. This + function explains why :doc:`Py++ <../pyplusplus>` creates class wrapper for exposed class. + +9. Python type traits module was introduce. Today it contains only single function: + + * ``is_immutable`` - returns ``True`` if exposed type is Python immutable type + + + +------------- +Version 0.8.1 +------------- + + +1. Georgiy Dernovoy contributed a patch, which allows :doc:`Py++ <../pyplusplus>` GUI to + save\\load last used header file. + + +2. :doc:`Py++ <../pyplusplus>` improved a lot functionality related to providing feedback to user: + + * every package has its own logger + * only important user messages are written to ``stdout`` + * user messages are clear + +3. Support for Boost.Python indexing suite version 2 was implemented. + +4. Every code creator class took ``parent`` argument in ``__init__`` method. + This argument was removed. ``adopt_creator`` and ``remove_creator`` will + set\unset reference to parent. + +5. Generated code for member and free functions was changed. This changed was + introduced to fix compilation errors on msvc 7.1 compiler. + +6. :doc:`Py++ <../pyplusplus>` generates "stable" code. If header files were not changed, + :doc:`Py++ <../pyplusplus>` will not change any file. + +7. Support for huge classes was added. :doc:`Py++ <../pyplusplus>` is able to split registration + code for the class to multiple cpp files. + +8. User code could be added almost anywhere, without use of low level API. + +9. Generated source files include only header files you passes as an argument + to module builder. + +10. Bug fixes. + +11. Documentation was improved. + + +Project name changed +-------------------- + +In this version the project has been renamed from "pyplusplus" to "Py++". +There were few reasons to this: + +1. I like "Py++" more then "pyplusplus". + +2. "Py++" was the original name of the project: http://mail.python.org/pipermail/c++-sig/2005-July/009280.html + +3. Users always changed the name of the projects. I saw at least 6 different names. + + + +------------- +Version 0.8.0 +------------- + +1. :doc:`Py++ <../pyplusplus>` "user guide" functionality has been improved. Now :doc:`Py++ <../pyplusplus>` + can answer few questions: + + * why this declaration could not be exported + + * why this function could not be overridden from Python + +2. :doc:`Py++ <../pyplusplus>` can suggest an alias for exported classes. + +3. Small redesign has been done - now it is much easier to understand and + maintain code creators, which creates code for C++ functions. + +4. Exception specification is taken into account, when :doc:`Py++ <../pyplusplus>` exports + member functions. + +5. Member variables, that are pointers exported correctly. + +6. Added experimental support for ``vector_indexing_suite``. + +7. Bug fixes. + +------------- +Version 0.7.0 +------------- + +Many thanks to *Matthias Baas* and *Allen Bierbaum*! They contributed so much to +Py++, especially Matthias: + + * New high-level API: :doc:`Py++ <../pyplusplus>` has simple and powerful API + + * Documentation: Matthias and Allen added a lot of documentation strings + + * Bug fixes and performance improvements + +1. New GUI features: + + * It is possible now to see XML generated by GCC-XML. + + * It is possible to use GUI as wizard. It will help you to start with + :doc:`Py++ <../pyplusplus>`, by generating :doc:`Py++ <../pyplusplus>` code. + +2. **Attention - non backward compatible change**. + + ``module_creator.creator_t.__init__`` method has been changed. ``decls`` + argument could be interpreted as + + * list of all declaration to be exported + + * list of top-level declarations. ``creator_t`` should export all + declarations recursively. + + In order to clarify the use of ``decls`` argument new argument ``recursive`` + has been added. By default new value of ``recursive`` is ``False``. + + Guide for users/upgraders: if use are exporting all declaration without + filtering, you should set ``recursive`` argument to ``True``. If you use + ``pygccxml.declarations.filtering.*`` functions, you have nothing to do. + + Sorry for the inconvenience :-(. + +3. Better split of extension module to files. From now the following declarations will + have dedicated file: + + * named enumerations, defined within namespace + * unnamed enumerations and global variables + * free functions + + This functionality will keep the number of instantiated templates within + one file, ``main.cpp``, to be very low. Also it is possible to implement + solution, where ``main.cpp`` file does not contain templates instantiations + at all. + +4. Only constant casting operators could be used with ``implicitly_convertible``. + This bug has been fixed. + +5. Bug exporting non copyable class has been fixed. + +6. Small bug fix - from now file with identical content will not be overwritten. + +7. Boost.Python ``optional`` is now supported and used when a constructor has a + a default argument. + +8. :doc:`Py++ <../pyplusplus>` now generates correct code for hierarchy of abstract classes: + + .. code-block:: c++ + + struct abstract1{ + virtual void do_smth() = 0; + } + + struct abstract2 : public abstract1{ + virtual void do_smth_else() = 0; + } + + struct concrete : public abstract2{ + virtual void do_smth(){}; + virtual void do_smth_else(){}; + } + +9. Logging functionality has been added + +10. New packages ``module_builder``, ``decl_wrappers`` and ``_logging_`` has + been added. + +11. ... + +http://boost.org/libs/python/doc/v2/init.html#optional-spec + +------------- +Version 0.6.0 +------------- + +1. Code repository has been introduced. This repository contains classes + and functions that will help users to export different C++ classes and + declarations. Right now this repository contains two classes: + + * *array_1_t* + + * *const_array_1_t* + + Those classes helps to export static, single dimension arrays. + +2. Code generation has been improved. + +3. Code generation speed has been improved. + +4. If you have Niall Douglas *void\** patch, then you can enjoy from + automatically set call policies. + +5. Bit fields can be accessed from Python + +6. Creating custom code creator example has been added. + +7. Comparison to Pyste has been wrote. + +8. Using this version it is possible to export most of TnFOX Python bindings. + +------------- +Version 0.5.1 +------------- + +1. operator() is now supported. + +2. Special casting operators are renamed( *__int__*, *__str__*, ... ). + +3. Few bug fixes + + +.. _`SourceForge`: http://sourceforge.net/index.php + Modified: pyplusplus_dev/pyplusplus/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/__init__.py 2009-05-17 08:34:14 UTC (rev 1736) +++ pyplusplus_dev/pyplusplus/__init__.py 2009-05-19 17:44:52 UTC (rev 1737) @@ -31,7 +31,7 @@ from _logging_ import multi_line_formatter_t -__version__ = '1.0.0' +__version__ = '1.5.0' import pygccxml if not hasattr( pygccxml, '__revision__' ) or pygccxml.__revision__ < 1080: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |