Thread: [pygccxml-commit] SF.net SVN: pygccxml: [16] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <mb...@us...> - 2006-04-28 16:18:59
|
Revision: 16 Author: mbaas Date: 2006-04-28 09:18:49 -0700 (Fri, 28 Apr 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=16&view=rev Log Message: ----------- Updated the setup script so that it can be used to create source archives. Added a MANIFEST.in file. Modified Paths: -------------- pyplusplus_dev/setup.py Added Paths: ----------- pyplusplus_dev/MANIFEST.in Property Changed: ---------------- pyplusplus_dev/ Property changes on: pyplusplus_dev ___________________________________________________________________ Name: svn:ignore + build dist MANIFEST *.pyc Added: pyplusplus_dev/MANIFEST.in =================================================================== --- pyplusplus_dev/MANIFEST.in (rev 0) +++ pyplusplus_dev/MANIFEST.in 2006-04-28 16:18:49 UTC (rev 16) @@ -0,0 +1,15 @@ +include LICENSE_1_0.txt +include MANIFEST.in +include unittests/*.py +include unittests/data/* +recursive-include docs/apidocs *.css +recursive-include docs/apidocs *.html +include docs/*.rest +include docs/*.png +include docs/*.html +include docs/comparisons/* +recursive-include docs/examples * +include docs/history/* +include docs/logos/* +include docs/tutorials/* +recursive-include examples/* Modified: pyplusplus_dev/setup.py =================================================================== --- pyplusplus_dev/setup.py 2006-04-28 16:14:47 UTC (rev 15) +++ pyplusplus_dev/setup.py 2006-04-28 16:18:49 UTC (rev 16) @@ -3,25 +3,80 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -import os +import sys, os, os.path from distutils import sysconfig from distutils.core import setup - -setup( name="pyplusplus" - , description="pyplusplus is a framework of components for creating C++ code generator for boost.python library" - , author="Roman Yakovenko" - , author_email="rom...@gm..." - , url='http://pyplusplus.sourceforge.net' - , scripts= map( lambda script_name: os.path.join( 'pyplusplus', 'scripts', script_name ) - , os.listdir( os.path.join( 'pyplusplus', 'scripts' ) ) ) - , packages=[ 'pyplusplus' - , 'pyplusplus.gui' - , 'pyplusplus.file_writers' - , 'pyplusplus.code_creators' - , 'pyplusplus.module_creator' - , 'pyplusplus.code_repository' - , 'pyplusplus.decl_wrappers' - , 'pyplusplus.module_builder' - , 'pyplusplus.utils' - , 'pyplusplus._logging_'] +from distutils.cmd import Command + +try: + sys.path.append("../pygccxml_dev") + import pygccxml + pygccxml_available = True +except ImportError: + pygccxml_available = False + + +def generate_doc(): + """Generate the epydoc reference manual. + """ + if not pygccxml_available: + print "Please install pygccxml before generating the docs." + sys.exit() + + print "Generating epydoc files..." + options = [ '--output="%s"'%os.path.join('docs', 'apidocs'), + '--docformat=epytext', + '--url=http://www.language-binding.net', + '--name=pyplusplus', +# '--verbose', + 'pyplusplus'] + cmd_line = "epydoc " + ' '.join( options ) + print cmd_line + os.system(cmd_line) + + +class doc_cmd(Command): + """This is a new distutils command 'doc' to build the epydoc manual. + """ + + description = 'build the API reference using epydoc' + user_options = [('no-doc', None, "don't run epydoc")] + boolean_options = ['no-doc'] + + def initialize_options (self): + self.no_doc = 0 + + def finalize_options (self): + pass + + def run(self): + if self.no_doc: + return + generate_doc() + + +# Generate the doc when a source distribution is created +if sys.argv[-1]=="sdist": + generate_doc() + + +setup( name = "pyplusplus", + version = "0.7.1", + description="pyplusplus is a framework of components for creating C++ code generator for boost.python library", + author="Roman Yakovenko", + author_email="rom...@gm...", + url='http://www.language-binding.net/pyplusplus/pyplusplus.html', + scripts = ["scripts/pyplusplus_gui", + "scripts/pyplusplus_gui.pyw"], + packages=[ 'pyplusplus', + 'pyplusplus.gui', + 'pyplusplus.file_writers', + 'pyplusplus.code_creators', + 'pyplusplus.module_creator', + 'pyplusplus.code_repository', + 'pyplusplus.decl_wrappers', + 'pyplusplus.module_builder', + 'pyplusplus.utils', + 'pyplusplus._logging_'], + cmdclass = {"doc" : doc_cmd} ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2006-05-04 16:37:46
|
Revision: 64 Author: mbaas Date: 2006-05-04 09:37:40 -0700 (Thu, 04 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=64&view=rev Log Message: ----------- Added the contrib directory and the 'arrayinfo' helper utility Added Paths: ----------- pyplusplus_dev/contrib/ pyplusplus_dev/contrib/arrayinfo/ pyplusplus_dev/contrib/arrayinfo/arrayinfo.py pyplusplus_dev/contrib/arrayinfo/cpptokenize.py pyplusplus_dev/contrib/arrayinfo/createarrayinfo.py pyplusplus_dev/contrib/arrayinfo/readme.txt Added: pyplusplus_dev/contrib/arrayinfo/arrayinfo.py =================================================================== --- pyplusplus_dev/contrib/arrayinfo/arrayinfo.py (rev 0) +++ pyplusplus_dev/contrib/arrayinfo/arrayinfo.py 2006-05-04 16:37:40 UTC (rev 64) @@ -0,0 +1,72 @@ +###################################################################### +# Array info +# +# Author: Matthias Baas (ba...@ir...) +###################################################################### + +# ArrayInfo +class ArrayInfo: + """Reads the information that was created by createarrayinfo.py. + + Usage: + + Create an instance of this class and either provide the file + name in the constructor or call read() manually. After the info + file has been read you can call arraySize() to retrieve the + size of a particular argument. + """ + + def __init__(self, datfile=None): + """Constructor. + + datfile is the name of the file that contains the array size + information (as created by the createarrayinfo.py utility). + If a name is provided is already read in (so there's no need + to manually call read() anymore). + """ + + # Key: (filename, firstline, funcname) + self.funcargs = {} + + if datfile!=None: + self.read(datfile) + + # read + def read(self, datfile): + """Read an info file. + """ + + n = 0 + for s in file(datfile, "rt"): + a = s.split(";") + filename, firstline, lastline, classname, funcname, args = a + firstline = int(firstline) + lastline = int(lastline) + args = eval(args) + key = (filename, lastline, funcname) + self.funcargs[key] = args + n += 1 + print n,"entries read from",datfile + + # arraySize + def arraySize(self, decl, idx): + """Return the array size of an argument. + + decl is the pygccxml calldef declaration whose argument list + should be inspected. idx is the index of the argument (0-based). + The return value is None if the argument is no array or the + array size is not known, otherwise the size of the array is + returned. + """ + filename = decl.location.file_name + line = decl.location.line + funcname = decl.name + args = self.funcargs.get((filename, line, funcname)) + if args==None: + return None + if idx>=len(args): + return None + else: + return args[idx] + + Added: pyplusplus_dev/contrib/arrayinfo/cpptokenize.py =================================================================== --- pyplusplus_dev/contrib/arrayinfo/cpptokenize.py (rev 0) +++ pyplusplus_dev/contrib/arrayinfo/cpptokenize.py 2006-05-04 16:37:40 UTC (rev 64) @@ -0,0 +1,119 @@ +########################################################################### +# C/C++ tokenizer +# Copyright (C) 2006 Matthias Baas (ba...@ir...) +########################################################################### + +"""C/C++ tokenizer module. + +This module provides the function tokenize() that just works like the +equivalent Python function with the only difference that it scans +C/C++ source code. +""" + +import re + +WHITESPACE = 0 +NAME = 1 +NUMBER = 2 +STRING = 3 +NEWLINE = 4 +OPERATOR = 5 +CHARACTER = 6 + +# tokenize +def tokenize(readline, tokeater): + """Reads a C/C++ input stream and creates tokens. + + The first parameter, readline, must be a callable object which + provides the same interface as the readline() method of built-in + file objects. Each call to the function should return one line of + input as a string. + + The second parameter, tokeneater, must also be a callable object. + It is called with six parameters: the token type, the token + string, a tuple (srow, scol) specifying the row and column where + the token begins in the source, a tuple (erow, ecol) giving the + ending position of the token, the line on which the token was + found and the filename of the current file. + + By default the filename argument is an empty string. It will only + be the actual filename if you provide a preprocessed file stream + as input (so you should first run cpp on any source code). The + tokenizer actually expects preprocessed data as it doesn't handle + comments. + """ + + regs = ( (WHITESPACE, re.compile(r"[ \t]+")), + (NAME, re.compile(r"[A-Za-z_][A-Za-z_0-9]*")), + (NUMBER, re.compile(r"[0-9]+(\.[0-9]+)?(E(\+|-)?[0-9]+)?")), + (STRING, re.compile(r"\"[^\"]*\"|'[^\']*\'")), + (OPERATOR, re.compile(r"->|::|\+\+|--|->\*|\.\*|<<|>>|<=|>=|==|!=|&&|\|\||\+=|-=|\*=|/=|%=|&=|\^=|\|=|<<=|>>=|\(|\)|\[|\]|\.|\+|-|!|~|\*|/|&|\^|%|<|>|\?|:|=")), + (NEWLINE, re.compile(r"\n")) + ) + + linenr = 0 + filename = "" + while 1: + # Read next line + line = readline() + # No more lines? then finish + if line=="": + break + + linenr+=1 + # Base for starting column... + scolbase = 0 + + # Process preprocessor lines... + if line[0]=="#": + try: + f = line.strip().split(" ") + linenr = int(f[1])-1 + filename = f[2][1:-1] + except: + pass + continue + + s = line + + # Create tokens... + while s!="": + unmatched=1 + # Check all regular expressions... + for r in regs: + m=r[1].match(s) + # Does it match? then the token is found + if m!=None: + scol = m.start() + ecol = m.end() + tok = s[scol:ecol] + s = s[ecol:] + typ = r[0] + tokeater(typ, tok, (linenr, scolbase+scol), (linenr, scolbase+ecol), line, filename) + scolbase += ecol + unmatched=0 + continue + + # No match? then report a single character... + if unmatched: + tok = s[0] + tokeater(CHARACTER, tok, (linenr, scolbase), (linenr, scolbase+1), line, filename) + s = s[1:] + scolbase += 1 + + +def _tokeater(type, s, start, end, line, filename): + """Test token eater.""" + if type==WHITESPACE or type==NEWLINE: + return + type_str = ["WHITESPACE", "NAME", "NUMBER", "STRING", "NEWLINE", "OPERATOR", "CHARACTER"] + + print "Token: %-11s %-20s %s %s %s"%(type_str[type],s, start,end,filename) + +###################################################################### + +if __name__=="__main__": + + f=open("header.h") + tokenize(f.readline, _tokeater) + Added: pyplusplus_dev/contrib/arrayinfo/createarrayinfo.py =================================================================== --- pyplusplus_dev/contrib/arrayinfo/createarrayinfo.py (rev 0) +++ pyplusplus_dev/contrib/arrayinfo/createarrayinfo.py 2006-05-04 16:37:40 UTC (rev 64) @@ -0,0 +1,163 @@ +#!/usr/bin/env python +###################################################################### +# This tool parses header files inside a directory and stores info +# about the array size of function arguments into a file for later +# retrieval. +# +# usage: createarrayinfo.py [options] <headerpath> +# +# options: +# -h, --help show this help message and exit +# -o FILENAME, --output=FILENAME +# Output file name (default: stdout) +# -a ARGSTRING, --cppargs=ARGSTRING +# Additional C preproceesor arguments +# +# Author: Matthias Baas (ba...@ir...) +###################################################################### + +import sys, os, os.path, glob, optparse +from cpptokenize import * + +# Parser +class Parser: + """Parser class. + + This class contains the token eater method that processes the tokens + generated by cpptokenize. + Whenever a function signature is parsed a line is written to the output. + """ + + def __init__(self, headerpath, output=sys.stdout): + """Constructor. + """ + + self.headerpath = os.path.normpath(headerpath) + self.output = output + + # Buffer for the last NAME token (which might be a function name) + self.lastname = None + # The current state + self.state = "Outside" + + self.classname = None + self.funcname = None + self.args = None + self.arraysize = None + self.no_arg = False + self.firstline = None + + def tokeater(self, type, s, start, end, line, filename): + """Token eater.""" + if type==WHITESPACE or type==NEWLINE: + return + + method = getattr(self, "state%s"%self.state) + method(type, s, start, end, line, filename) + + # The state methods. They are called by the token eater and must take + # the same arguments than the token eater. + + def stateOutside(self, type, s, start, end, line, filename): + if type==NAME and s=="class": + self.state = "ClassName" + if type==NAME: + self.firstline = start[0] + self.lastname = s + elif self.lastname=="operator": + self.lastname += s + elif type==OPERATOR and s=="(": + self.funcname = self.lastname + self.args = [] + self.arraysize = None + self.no_arg = True + self.state = "Args" + + def stateClassName(self, type, s, start, end, line, filename): + if s.upper()==s: + return + self.classname = s + self.state = "Outside" + + def stateArgs(self, type, s, start, end, line, filename): + if s==")": + if not self.no_arg: + self.args.append(self.arraysize) + self.state = "End" + elif s==",": + self.args.append(self.arraysize) + self.arraysize = None + elif s=="[": + self.state = "ArgsSize" + self.no_arg = False + + def stateArgsSize(self, type, s, start, end, line, filename): + if s=="]": + self.state = "Args" + else: + self.arraysize = int(s) + self.state = "Args" + + def stateEnd(self, type, s, start, end, line, filename): + if s==";": + if os.path.normpath(os.path.dirname(filename))==self.headerpath: + self.onFuncComplete(self.classname, self.funcname, self.args, self.firstline, end[0], filename) + self.state = "Outside" + + + def onFuncComplete(self, classname, funcname, args, firstline, lastline, filename): + """Callback that is called when one function is completely processed. + """ + print >>self.output, "%s;%d;%d;%s;%s;%s"%(filename, firstline, lastline, classname, funcname, args) + + +# parseHeader +def parseHeader(filename, cpp="cpp", cppargs="", output=sys.stdout): + """Parse a header file. + + filename is the header file name and cppargs is a string with + additional arguments for the invocation of the preprocessor 'cpp'. + output is the output stream. + """ + # Run the file through the preprocessor... + filename = os.path.abspath(filename) + print >>sys.stderr, "Parsing",filename + cmd = "%s %s %s >_tmp.h"%(cpp, cppargs, filename) + print >>sys.stderr, cmd + os.system(cmd) + + # Parse the preprocessed file... + parser = Parser(os.path.dirname(filename), output) + tokenize(file("_tmp.h").readline, parser.tokeater) + +###################################################################### + +# Preprocessor +cpp = "cpp" +# Preprocessor arguments +cppargs = "" +# Output stream +output = sys.stdout + +usage = "usage: %prog [options] <headerpath>" +op = optparse.OptionParser(usage) +op.add_option("-o", "--output", metavar="FILENAME", + help="Output file name") +op.add_option("-a", "--cppargs", metavar="ARGSTRING", default="", + help="Additional C preproceesor arguments") + +options, args = op.parse_args() + +if len(args)==0: + op.print_help() + sys.exit(1) + +if options.output!=None: + output = file(options.output, "wt") + +cppargs = options.cppargs + +headerpath = args[0] +headers = glob.glob(os.path.join(headerpath, "*.h")) +for header in headers: + parseHeader(header, cpp, cppargs, output) Property changes on: pyplusplus_dev/contrib/arrayinfo/createarrayinfo.py ___________________________________________________________________ Name: svn:executable + * Added: pyplusplus_dev/contrib/arrayinfo/readme.txt =================================================================== --- pyplusplus_dev/contrib/arrayinfo/readme.txt (rev 0) +++ pyplusplus_dev/contrib/arrayinfo/readme.txt 2006-05-04 16:37:40 UTC (rev 64) @@ -0,0 +1,33 @@ +Array info utility +================== + +Author: Matthias Baas (ba...@ir...) + +This directory contains a small utility that can be used to determine +the array size of a function argument. For example, suppose you have +a C function that is defined as: + + void foo(double v[3]); + +When this function is parsed by gccxml the type of "v" will just be +reported as "double *" and the array size has got lost. +However, for creating Python wrappers the array size is a valuable +information that can be exploited for creating appropriate wrapper +functions automatically. + +The command line utility "createarrayinfo.py" can be used to parse +the original header files and extract just the above array sizes +from function definitions. This information is stored in a file that +can then be read by your own Python scripts that create Python bindings +using pyplusplus. In your own scripts you can use the "arrayinfo" module +to read the info file and query the array size of a particular argument +from a particular function (given as a pygccxml declaration object). + +See the comments and doc strings in the Python files to get more +usage information. + +NOTE: While the utility did work for me, it is not as general to deal +with all eventualities (it only uses a very simple C/C++ parser). +So it might well be that you have to adjust the code in +createarrayinfo.py to your own needs. + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-18 05:18:33
|
Revision: 133 Author: roman_yakovenko Date: 2006-05-17 22:18:19 -0700 (Wed, 17 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=133&view=rev Log Message: ----------- updating gccxml location Modified Paths: -------------- pygccxml_dev/unittests/autoconfig.py pyplusplus_dev/environment.py Property Changed: ---------------- pyplusplus_dev/unittests/temp/ Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2006-05-17 20:43:03 UTC (rev 132) +++ pygccxml_dev/unittests/autoconfig.py 2006-05-18 05:18:19 UTC (rev 133) @@ -16,7 +16,7 @@ if 'roman' in getpass.getuser(): if sys.platform == 'win32': - gccxml_path = 'c:/tools/gccxml/bin/gccxml.exe' + gccxml_path = 'd:/gccxml_cvs/gccxml-build/bin/release/gccxml.exe' else: gccxml_path = '/home/roman/gccxml-build/bin/gccxml' Modified: pyplusplus_dev/environment.py =================================================================== --- pyplusplus_dev/environment.py 2006-05-17 20:43:03 UTC (rev 132) +++ pyplusplus_dev/environment.py 2006-05-18 05:18:19 UTC (rev 133) @@ -31,7 +31,7 @@ boost.include = 'd:/boost_cvs' python.libs = 'c:/python/libs' python.include = 'c:/python/include' - gccxml.executable = 'c:/tools/gccxml/bin/gccxml.exe' + gccxml.executable = 'd:/gccxml_cvs/gccxml-build/bin/release/gccxml.exe' else: scons.suffix = '.so' boost.libs = '/home/roman/boost_cvs/bin' Property changes on: pyplusplus_dev/unittests/temp ___________________________________________________________________ Name: svn:ignore - internal_classes.dll member_functions.dll member_variables.dll module_body.dll namespaces.dll noncopyable.dll operators.dll operators_bug.dll optional.dll optional_bug.dll pointer_as_arg.dll pointer_to_function_as_argument.dll private_assign.dll recursive.dll regression1.dll regression2.dll regression3.dll smart_pointers.dll special_operators.dll statics.dll temprorary_variable.dll unnamed_enums.dll user_text.dll abstract.cpp~ call_policies.cpp~ casting.cpp~ class_order2.cpp~ class_order3.cpp~ class_order4.cpp~ class_order.cpp~ classes.cpp~ enums.cpp~ factory.cpp~ finalizables.cpp~ free_functions.cpp~ free_operators.cpp~ global_variables.cpp~ index_operator.cpp~ internal_classes.cpp~ member_functions.cpp~ member_variables.cpp~ noncopyable.cpp~ operators_bug.cpp~ optional.cpp~ optional_bug.cpp~ pointer_as_arg.cpp~ pointer_to_function_as_argument.cpp~ private_assign.cpp~ recursive.cpp~ regression1.cpp~ regression2.cpp~ regression3.cpp~ smart_pointers.cpp~ special_operators.cpp~ statics.cpp~ temprorary_variable.cpp~ unnamed_enums.cpp~ user_text.cpp~ abstract.exp call_policies.exp casting.exp class_order2.exp class_order3.exp class_order4.exp class_order.exp classes.exp enums.exp factory.exp finalizables.exp free_function_ignore_bug.exp free_functions.exp free_operators.exp global_variables.exp index_operator.exp internal_classes.exp member_functions.exp member_variables.exp module_body.exp namespaces.exp noncopyable.exp operators.exp operators_bug.exp optional.exp optional_bug.exp pointer_as_arg.exp pointer_to_function_as_argument.exp private_assign.exp recursive.exp regression1.exp regression2.exp regression3.exp smart_pointers.exp special_operators.exp statics.exp temprorary_variable.exp unnamed_enums.exp user_text.exp abstract.lib call_policies.lib casting.lib class_order2.lib class_order3.lib class_order4.lib class_order.lib classes.lib enums.lib factory.lib finalizables.lib free_function_ignore_bug.lib free_functions.lib free_operators.lib global_variables.lib index_operator.lib internal_classes.lib member_functions.lib member_variables.lib module_body.lib namespaces.lib noncopyable.lib operators.lib operators_bug.lib optional.lib optional_bug.lib pointer_as_arg.lib pointer_to_function_as_argument.lib private_assign.lib recursive.lib regression1.lib regression2.lib regression3.lib smart_pointers.lib special_operators.lib statics.lib temprorary_variable.lib unnamed_enums.lib user_text.lib abstract.obj call_policies.obj casting.obj class_order2.obj class_order3.obj class_order4.obj class_order.obj classes.obj enums.obj factory.obj finalizables.obj free_function_ignore_bug.obj free_functions.obj free_operators.obj global_variables.obj index_operator.obj internal_classes.obj member_functions.obj member_variables.obj module_body.obj namespaces.obj noncopyable.obj operators.obj operators_bug.obj optional.obj optional_bug.obj pointer_as_arg.obj pointer_to_function_as_argument.obj private_assign.obj recursive.obj regression1.obj regression2.obj regression3.obj smart_pointers.obj special_operators.obj statics.obj temprorary_variable.obj unnamed_enums.obj user_text.obj abstract.scons call_policies.scons casting.scons class_order2.scons class_order3.scons class_order4.scons class_order.scons classes.scons enums.scons factory.scons finalizables.scons free_function_ignore_bug.scons free_functions.scons free_operators.scons global_variables.scons index_operator.scons internal_classes.scons member_functions.scons member_variables.scons module_body.scons namespaces.scons noncopyable.scons operators.scons operators_bug.scons optional.scons optional_bug.scons pointer_as_arg.scons pointer_to_function_as_argument.scons private_assign.scons recursive.scons regression1.scons regression2.scons regression3.scons smart_pointers.scons special_operators.scons statics.scons temprorary_variable.scons unnamed_enums.scons user_text.scons abstract.dll call_policies.dll casting.dll class_order2.dll class_order3.dll class_order4.dll class_order.dll classes.dll enums.dll factory.dll finalizables.dll free_function_ignore_bug.dll free_functions.dll free_operators.dll global_variables.dll index_operator.dll .sconsign.dblite __array_1.pypp.hpp classes.cpp enums.cpp free_functions.cpp module_body.cpp namespaces.cpp unnamed_enums.cpp abstract.cpp call_policies.cpp casting.cpp class_order.cpp class_order2.cpp class_order3.cpp class_order4.cpp factory.cpp finalizables.cpp free_function_ignore_bug.cpp free_operators.cpp global_variables.cpp index_operator.cpp internal_classes.cpp member_functions.cpp member_variables.cpp noncopyable.cpp operators.cpp operators_bug.cpp optional.cpp optional_bug.cpp pointer_as_arg.cpp pointer_to_function_as_argument.cpp private_assign.cpp protected.cpp recursive.cpp regression1.cpp regression2.cpp regression3.cpp smart_pointers.cpp special_operators.cpp statics.cpp temprorary_variable.cpp user_text.cpp + internal_classes.dll member_functions.dll member_variables.dll module_body.dll namespaces.dll noncopyable.dll operators.dll operators_bug.dll optional.dll optional_bug.dll pointer_as_arg.dll pointer_to_function_as_argument.dll private_assign.dll recursive.dll regression1.dll regression2.dll regression3.dll smart_pointers.dll special_operators.dll statics.dll temprorary_variable.dll unnamed_enums.dll user_text.dll abstract.cpp~ call_policies.cpp~ casting.cpp~ class_order2.cpp~ class_order3.cpp~ class_order4.cpp~ class_order.cpp~ classes.cpp~ enums.cpp~ factory.cpp~ finalizables.cpp~ free_functions.cpp~ free_operators.cpp~ global_variables.cpp~ index_operator.cpp~ internal_classes.cpp~ member_functions.cpp~ member_variables.cpp~ noncopyable.cpp~ operators_bug.cpp~ optional.cpp~ optional_bug.cpp~ pointer_as_arg.cpp~ pointer_to_function_as_argument.cpp~ private_assign.cpp~ recursive.cpp~ regression1.cpp~ regression2.cpp~ regression3.cpp~ smart_pointers.cpp~ special_operators.cpp~ statics.cpp~ temprorary_variable.cpp~ unnamed_enums.cpp~ user_text.cpp~ abstract.exp call_policies.exp casting.exp class_order2.exp class_order3.exp class_order4.exp class_order.exp classes.exp enums.exp factory.exp finalizables.exp free_function_ignore_bug.exp free_functions.exp free_operators.exp global_variables.exp index_operator.exp internal_classes.exp member_functions.exp member_variables.exp module_body.exp namespaces.exp noncopyable.exp operators.exp operators_bug.exp optional.exp optional_bug.exp pointer_as_arg.exp pointer_to_function_as_argument.exp private_assign.exp recursive.exp regression1.exp regression2.exp regression3.exp smart_pointers.exp special_operators.exp statics.exp temprorary_variable.exp unnamed_enums.exp user_text.exp abstract.lib call_policies.lib casting.lib class_order2.lib class_order3.lib class_order4.lib class_order.lib classes.lib enums.lib factory.lib finalizables.lib free_function_ignore_bug.lib free_functions.lib free_operators.lib global_variables.lib index_operator.lib internal_classes.lib member_functions.lib member_variables.lib module_body.lib namespaces.lib noncopyable.lib operators.lib operators_bug.lib optional.lib optional_bug.lib pointer_as_arg.lib pointer_to_function_as_argument.lib private_assign.lib recursive.lib regression1.lib regression2.lib regression3.lib smart_pointers.lib special_operators.lib statics.lib temprorary_variable.lib unnamed_enums.lib user_text.lib abstract.obj call_policies.obj casting.obj class_order2.obj class_order3.obj class_order4.obj class_order.obj classes.obj enums.obj factory.obj finalizables.obj free_function_ignore_bug.obj free_functions.obj free_operators.obj global_variables.obj index_operator.obj internal_classes.obj member_functions.obj member_variables.obj module_body.obj namespaces.obj noncopyable.obj operators.obj operators_bug.obj optional.obj optional_bug.obj pointer_as_arg.obj pointer_to_function_as_argument.obj private_assign.obj recursive.obj regression1.obj regression2.obj regression3.obj smart_pointers.obj special_operators.obj statics.obj temprorary_variable.obj unnamed_enums.obj user_text.obj abstract.scons call_policies.scons casting.scons class_order2.scons class_order3.scons class_order4.scons class_order.scons classes.scons enums.scons factory.scons finalizables.scons free_function_ignore_bug.scons free_functions.scons free_operators.scons global_variables.scons index_operator.scons internal_classes.scons member_functions.scons member_variables.scons module_body.scons namespaces.scons noncopyable.scons operators.scons operators_bug.scons optional.scons optional_bug.scons pointer_as_arg.scons pointer_to_function_as_argument.scons private_assign.scons recursive.scons regression1.scons regression2.scons regression3.scons smart_pointers.scons special_operators.scons statics.scons temprorary_variable.scons unnamed_enums.scons user_text.scons abstract.dll call_policies.dll casting.dll class_order2.dll class_order3.dll class_order4.dll class_order.dll classes.dll enums.dll factory.dll finalizables.dll free_function_ignore_bug.dll free_functions.dll free_operators.dll global_variables.dll index_operator.dll .sconsign.dblite __array_1.pypp.hpp classes.cpp enums.cpp free_functions.cpp module_body.cpp namespaces.cpp unnamed_enums.cpp abstract.cpp call_policies.cpp casting.cpp class_order.cpp class_order2.cpp class_order3.cpp class_order4.cpp factory.cpp finalizables.cpp free_function_ignore_bug.cpp free_operators.cpp global_variables.cpp index_operator.cpp internal_classes.cpp member_functions.cpp member_variables.cpp noncopyable.cpp operators.cpp operators_bug.cpp optional.cpp optional_bug.cpp pointer_as_arg.cpp pointer_to_function_as_argument.cpp private_assign.cpp protected.cpp recursive.cpp regression1.cpp regression2.cpp regression3.cpp smart_pointers.cpp special_operators.cpp statics.cpp temprorary_variable.cpp user_text.cpp protected.dll protected.exp protected.lib protected.obj protected.scons This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-18 10:45:33
|
Revision: 137 Author: roman_yakovenko Date: 2006-05-18 03:45:18 -0700 (Thu, 18 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=137&view=rev Log Message: ----------- porting recent changes to windows Modified Paths: -------------- pyplusplus_dev/environment.py pyplusplus_dev/examples/pyboost_dev/dev/crc/generate_code.py pyplusplus_dev/examples/pyboost_dev/pyboost/boost_random/__init__.py pyplusplus_dev/examples/pyboost_dev/pyboost/crc/__init__.py pyplusplus_dev/examples/pyboost_dev/sconstruct Modified: pyplusplus_dev/environment.py =================================================================== --- pyplusplus_dev/environment.py 2006-05-18 07:40:05 UTC (rev 136) +++ pyplusplus_dev/environment.py 2006-05-18 10:45:18 UTC (rev 137) @@ -5,7 +5,8 @@ class boost: libs = '' include = '' - + include_linux = '' + class python: libs = '' include = '' @@ -28,7 +29,8 @@ scons.suffix = '.dll' scons.ccflags = ['/MD', '/EHsc', '/GR', '/Zc:wchar_t', '/Zc:forScope' ] boost.libs = 'd:/boost_cvs/bin' - boost.include = 'd:/boost_cvs' + boost.include = 'd:/boost_cvs' + boost.include_linux = '/home/roman/boost_cvs' python.libs = 'c:/python/libs' python.include = 'c:/python/include' gccxml.executable = 'd:/gccxml_cvs/gccxml-build/bin/release/gccxml.exe' Modified: pyplusplus_dev/examples/pyboost_dev/dev/crc/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/crc/generate_code.py 2006-05-18 07:40:05 UTC (rev 136) +++ pyplusplus_dev/examples/pyboost_dev/dev/crc/generate_code.py 2006-05-18 10:45:18 UTC (rev 137) @@ -39,7 +39,8 @@ boost_ns.classes( lambda decl: decl.name.startswith( 'crc_basic' ) ).include() boost_ns.classes( lambda decl: decl.name.startswith( 'crc_optimal' ) ).include() boost_ns.member_functions( 'process_bytes' ).exclude() - boost_ns.member_functions( 'process_block' ).exclude() + boost_ns.member_functions( 'process_block' ).exclude() + boost_ns.member_operators( symbol='()' ).exclude() def prepare_declarations( self ): boost_ns = self.__mb.namespace( 'boost' ) Modified: pyplusplus_dev/examples/pyboost_dev/pyboost/boost_random/__init__.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/pyboost/boost_random/__init__.py 2006-05-18 07:40:05 UTC (rev 136) +++ pyplusplus_dev/examples/pyboost_dev/pyboost/boost_random/__init__.py 2006-05-18 10:45:18 UTC (rev 137) @@ -3,7 +3,8 @@ # 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 sys import _random_ #TODO: @@ -19,8 +20,9 @@ from _random_ import lagged_fibonacci2281 from _random_ import lagged_fibonacci23209 from _random_ import lagged_fibonacci3217 -from _random_ import lagged_fibonacci4423 -from _random_ import lagged_fibonacci44497 +from _random_ import lagged_fibonacci4423 +if sys.platform != 'win32': + from _random_ import lagged_fibonacci44497 from _random_ import lagged_fibonacci607 from _random_ import lagged_fibonacci9689 from _random_ import minstd_rand @@ -44,8 +46,7 @@ , lagged_fibonacci2281 , lagged_fibonacci23209 , lagged_fibonacci3217 - , lagged_fibonacci4423 - , lagged_fibonacci44497 + , lagged_fibonacci4423 , lagged_fibonacci607 , lagged_fibonacci9689 , minstd_rand @@ -60,7 +61,9 @@ , ranlux64_4_01 , taus88 ] - + +if sys.platform != 'win32': + generators.append( lagged_fibonacci44497 ) #distribution from _random_ import bernoulli_distribution bernoulli_distribution.__call__ = _random_.py_bernoulli_distribution.call @@ -264,22 +267,22 @@ #__vg[ ][ uniform_int ] = _random_.does not exist #__vg[ ][ uniform_smallint ] = _random_.does not exist +if sys.platform != 'win32': + __vg[ lagged_fibonacci44497 ][ bernoulli_distribution ] = _random_.variate_generator_lagged_fibonacci44497__bernoulli_distribution + __vg[ lagged_fibonacci44497 ][ binomial_distribution ] = _random_.variate_generator_lagged_fibonacci44497__binomial_distribution + __vg[ lagged_fibonacci44497 ][ cauchy_distribution ] = _random_.variate_generator_lagged_fibonacci44497__cauchy_distribution + __vg[ lagged_fibonacci44497 ][ exponential_distribution ] = _random_.variate_generator_lagged_fibonacci44497__exponential_distribution + __vg[ lagged_fibonacci44497 ][ gamma_distribution ] = _random_.variate_generator_lagged_fibonacci44497__gamma_distribution + __vg[ lagged_fibonacci44497 ][ geometric_distribution ] = _random_.variate_generator_lagged_fibonacci44497__geometric_distribution + __vg[ lagged_fibonacci44497 ][ lognormal_distribution ] = _random_.variate_generator_lagged_fibonacci44497__lognormal_distribution + __vg[ lagged_fibonacci44497 ][ normal_distribution ] = _random_.variate_generator_lagged_fibonacci44497__normal_distribution + __vg[ lagged_fibonacci44497 ][ poisson_distribution ] = _random_.variate_generator_lagged_fibonacci44497__poisson_distribution + __vg[ lagged_fibonacci44497 ][ triangle_distribution ] = _random_.variate_generator_lagged_fibonacci44497__triangle_distribution + __vg[ lagged_fibonacci44497 ][ uniform_on_sphere ] = _random_.variate_generator_lagged_fibonacci44497__uniform_on_sphere + __vg[ lagged_fibonacci44497 ][ uniform_real ] = _random_.variate_generator_lagged_fibonacci44497__uniform_real + #__vg[ ][ uniform_int ] = _random_.does not exist + #__vg[ ][ uniform_smallint ] = _random_.does not exist -__vg[ lagged_fibonacci44497 ][ bernoulli_distribution ] = _random_.variate_generator_lagged_fibonacci44497__bernoulli_distribution -__vg[ lagged_fibonacci44497 ][ binomial_distribution ] = _random_.variate_generator_lagged_fibonacci44497__binomial_distribution -__vg[ lagged_fibonacci44497 ][ cauchy_distribution ] = _random_.variate_generator_lagged_fibonacci44497__cauchy_distribution -__vg[ lagged_fibonacci44497 ][ exponential_distribution ] = _random_.variate_generator_lagged_fibonacci44497__exponential_distribution -__vg[ lagged_fibonacci44497 ][ gamma_distribution ] = _random_.variate_generator_lagged_fibonacci44497__gamma_distribution -__vg[ lagged_fibonacci44497 ][ geometric_distribution ] = _random_.variate_generator_lagged_fibonacci44497__geometric_distribution -__vg[ lagged_fibonacci44497 ][ lognormal_distribution ] = _random_.variate_generator_lagged_fibonacci44497__lognormal_distribution -__vg[ lagged_fibonacci44497 ][ normal_distribution ] = _random_.variate_generator_lagged_fibonacci44497__normal_distribution -__vg[ lagged_fibonacci44497 ][ poisson_distribution ] = _random_.variate_generator_lagged_fibonacci44497__poisson_distribution -__vg[ lagged_fibonacci44497 ][ triangle_distribution ] = _random_.variate_generator_lagged_fibonacci44497__triangle_distribution -__vg[ lagged_fibonacci44497 ][ uniform_on_sphere ] = _random_.variate_generator_lagged_fibonacci44497__uniform_on_sphere -__vg[ lagged_fibonacci44497 ][ uniform_real ] = _random_.variate_generator_lagged_fibonacci44497__uniform_real -#__vg[ ][ uniform_int ] = _random_.does not exist -#__vg[ ][ uniform_smallint ] = _random_.does not exist - __vg[ lagged_fibonacci607 ][ bernoulli_distribution ] = _random_.variate_generator_lagged_fibonacci607__bernoulli_distribution __vg[ lagged_fibonacci607 ][ binomial_distribution ] = _random_.variate_generator_lagged_fibonacci607__binomial_distribution __vg[ lagged_fibonacci607 ][ cauchy_distribution ] = _random_.variate_generator_lagged_fibonacci607__cauchy_distribution Modified: pyplusplus_dev/examples/pyboost_dev/pyboost/crc/__init__.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/pyboost/crc/__init__.py 2006-05-18 07:40:05 UTC (rev 136) +++ pyplusplus_dev/examples/pyboost_dev/pyboost/crc/__init__.py 2006-05-18 10:45:18 UTC (rev 137) @@ -30,7 +30,10 @@ __basic__ = basic.values() -__all__ = __optimal__ + __basic__ +__all__ = __optimal__ + __basic__ + +for cls in __all__: + cls.__call__ = cls.process_byte def process_bytes( self, data ): if isinstance( data, str ): Modified: pyplusplus_dev/examples/pyboost_dev/sconstruct =================================================================== --- pyplusplus_dev/examples/pyboost_dev/sconstruct 2006-05-18 07:40:05 UTC (rev 136) +++ pyplusplus_dev/examples/pyboost_dev/sconstruct 2006-05-18 10:45:18 UTC (rev 137) @@ -13,7 +13,8 @@ , LIBPATH=[ environment.boost.libs, environment.python.libs ] , CPPPATH=[ environment.boost.include, environment.python.include ] , SHLIBPREFIX='' - , SHLIBSUFFIX=environment.scons.suffix + , SHLIBSUFFIX=environment.scons.suffix + , no_import_lib=1 ) Export( 'env' ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-18 14:07:41
|
Revision: 138 Author: roman_yakovenko Date: 2006-05-18 07:07:18 -0700 (Thu, 18 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=138&view=rev Log Message: ----------- fixing bug in date time Modified Paths: -------------- pyplusplus_dev/environment.py pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py pyplusplus_dev/examples/pyboost_dev/dev/date_time/sconscript pyplusplus_dev/examples/pyboost_dev/sconstruct pyplusplus_dev/examples/pyboost_dev/unittestst/boost_random/test_all.py Modified: pyplusplus_dev/environment.py =================================================================== --- pyplusplus_dev/environment.py 2006-05-18 10:45:18 UTC (rev 137) +++ pyplusplus_dev/environment.py 2006-05-18 14:07:18 UTC (rev 138) @@ -5,7 +5,6 @@ class boost: libs = '' include = '' - include_linux = '' class python: libs = '' @@ -30,7 +29,6 @@ scons.ccflags = ['/MD', '/EHsc', '/GR', '/Zc:wchar_t', '/Zc:forScope' ] boost.libs = 'd:/boost_cvs/bin' boost.include = 'd:/boost_cvs' - boost.include_linux = '/home/roman/boost_cvs' python.libs = 'c:/python/libs' python.include = 'c:/python/include' gccxml.executable = 'd:/gccxml_cvs/gccxml-build/bin/release/gccxml.exe' Modified: pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-05-18 10:45:18 UTC (rev 137) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-05-18 14:07:18 UTC (rev 138) @@ -147,11 +147,13 @@ extmodule = mb.code_creator #beautifying include code generation extmodule.license = customization_data.license - extmodule.user_defined_directories.append( date_time_settings.boost.include ) + extmodule.user_defined_directories.append( date_time_settings.boost.include ) extmodule.user_defined_directories.append( date_time_settings.working_dir ) extmodule.user_defined_directories.append( date_time_settings.generated_files_dir ) extmodule.license = customization_data.license extmodule.precompiled_header = 'boost/python.hpp' + extmodule.replace_included_headers( customization_data.includes ) + self.beautify_code( mb ) def write_files( self, mb ): Modified: pyplusplus_dev/examples/pyboost_dev/dev/date_time/sconscript =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/date_time/sconscript 2006-05-18 10:45:18 UTC (rev 137) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/sconscript 2006-05-18 14:07:18 UTC (rev 138) @@ -21,6 +21,7 @@ source_files = filter( lambda s: s.endswith( '.cpp' ), os.listdir(date_time_settings.generated_files_dir) ) return map( lambda fname: os.path.join( date_time_settings.generated_files_dir, fname ), source_files ) + def get_libs(): libs = [] if sys.platform == 'linux2': @@ -39,4 +40,10 @@ _date_time_ = local_env.SharedLibrary( target=date_time_settings.module_name , source=get_source_files() ) -local_env.Install( '#pyboost/date_time', _date_time_ ) \ No newline at end of file +if sys.platform == 'win32': + boost_date_time_so_dll = os.path.join( date_time_settings.boost.libs, 'boost_date_time-vc71-mt-1_34.dll' ) +else: + boost_date_time_so_dll = os.path.join( date_time_settings.boost.libs, 'libboost_date_time-gcc-1_34.so' ) + + +local_env.Install( '#pyboost/date_time', [_date_time_, boost_date_time_so_dll ] ) \ No newline at end of file Modified: pyplusplus_dev/examples/pyboost_dev/sconstruct =================================================================== --- pyplusplus_dev/examples/pyboost_dev/sconstruct 2006-05-18 10:45:18 UTC (rev 137) +++ pyplusplus_dev/examples/pyboost_dev/sconstruct 2006-05-18 14:07:18 UTC (rev 138) @@ -13,9 +13,13 @@ , LIBPATH=[ environment.boost.libs, environment.python.libs ] , CPPPATH=[ environment.boost.include, environment.python.include ] , SHLIBPREFIX='' - , SHLIBSUFFIX=environment.scons.suffix - , no_import_lib=1 + , SHLIBSUFFIX=environment.scons.suffix ) + +if sys.platform == 'win32': + env.Replace( no_import_lib=1 ) +else: + env.Append( CCFLAGS=' -ggdb3 -DNDEBUG -O3' ) Export( 'env' ) env.SConscript( ['dev/date_time/sconscript'] ) Modified: pyplusplus_dev/examples/pyboost_dev/unittestst/boost_random/test_all.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/unittestst/boost_random/test_all.py 2006-05-18 10:45:18 UTC (rev 137) +++ pyplusplus_dev/examples/pyboost_dev/unittestst/boost_random/test_all.py 2006-05-18 14:07:18 UTC (rev 138) @@ -38,8 +38,7 @@ def instantiate_dist( self, urng, dist ): if not boost_random.variate_generator_exists( urng, dist ): - return - + return gen1 = boost_random.variate_generator( urng, dist) gen2 = boost_random.variate_generator( urng, dist) self.randomness_tester( gen1 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-12 12:08:13
|
Revision: 302 Author: roman_yakovenko Date: 2006-07-12 05:07:35 -0700 (Wed, 12 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=302&view=rev Log Message: ----------- adding indexing suite v2 to the repository. Added Paths: ----------- pyplusplus_dev/indexing_suite_v2/ pyplusplus_dev/indexing_suite_v2/docs/ pyplusplus_dev/indexing_suite_v2/docs/indexing_suite_v2.html pyplusplus_dev/indexing_suite_v2/docs/indexing_suite_v2_files/ pyplusplus_dev/indexing_suite_v2/docs/indexing_suite_v2_files/boost.css pyplusplus_dev/indexing_suite_v2/docs/indexing_suite_v2_files/cboost.gif pyplusplus_dev/indexing_suite_v2/indexing/ pyplusplus_dev/indexing_suite_v2/indexing/algorithms.hpp pyplusplus_dev/indexing_suite_v2/indexing/container_proxy.hpp pyplusplus_dev/indexing_suite_v2/indexing/container_suite.hpp pyplusplus_dev/indexing_suite_v2/indexing/container_traits.hpp pyplusplus_dev/indexing_suite_v2/indexing/deque.hpp pyplusplus_dev/indexing_suite_v2/indexing/element_proxy.hpp pyplusplus_dev/indexing_suite_v2/indexing/element_proxy_traits.hpp pyplusplus_dev/indexing_suite_v2/indexing/int_slice_helper.hpp pyplusplus_dev/indexing_suite_v2/indexing/iterator_range.hpp pyplusplus_dev/indexing_suite_v2/indexing/iterator_traits.hpp pyplusplus_dev/indexing_suite_v2/indexing/list.hpp pyplusplus_dev/indexing_suite_v2/indexing/map.hpp pyplusplus_dev/indexing_suite_v2/indexing/methods.hpp pyplusplus_dev/indexing_suite_v2/indexing/proxy_iterator.hpp pyplusplus_dev/indexing_suite_v2/indexing/python_iterator.hpp pyplusplus_dev/indexing_suite_v2/indexing/readme.txt pyplusplus_dev/indexing_suite_v2/indexing/set.hpp pyplusplus_dev/indexing_suite_v2/indexing/shared_proxy_impl.hpp pyplusplus_dev/indexing_suite_v2/indexing/slice.hpp pyplusplus_dev/indexing_suite_v2/indexing/slice_handler.hpp pyplusplus_dev/indexing_suite_v2/indexing/suite_utils.hpp pyplusplus_dev/indexing_suite_v2/indexing/value_traits.hpp pyplusplus_dev/indexing_suite_v2/indexing/vector.hpp pyplusplus_dev/indexing_suite_v2/indexing/visitor.hpp pyplusplus_dev/indexing_suite_v2/indexing/workaround.hpp pyplusplus_dev/indexing_suite_v2/readme.txt pyplusplus_dev/indexing_suite_v2/src/ pyplusplus_dev/indexing_suite_v2/src/indexing/ pyplusplus_dev/indexing_suite_v2/src/indexing/indexing_slice.cpp pyplusplus_dev/indexing_suite_v2/src/indexing/python_iterator.cpp pyplusplus_dev/indexing_suite_v2/src/readme.txt Added: pyplusplus_dev/indexing_suite_v2/docs/indexing_suite_v2.html =================================================================== --- pyplusplus_dev/indexing_suite_v2/docs/indexing_suite_v2.html (rev 0) +++ pyplusplus_dev/indexing_suite_v2/docs/indexing_suite_v2.html 2006-07-12 12:07:35 UTC (rev 302) @@ -0,0 +1,2213 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html><head> + + + <meta name="generator" content="A human being"> + <meta http-equiv="Content-Type" content="text/html; charset=us-ascii"> + <link rel="stylesheet" type="text/css" href="indexing_suite_v2_files/boost.css"><title>Boost.Python - C++ Container Support</title></head><body> + <table summary="header" border="0" cellpadding="7" cellspacing="0" width="100%"> + <tbody><tr> + <td valign="top" width="300"> + <h3> + <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/index.htm"><img alt="C++ Boost" src="indexing_suite_v2_files/cboost.gif" border="0" height="86" width="277"></a> + </h3> + </td> + <td valign="top"> + <h1 align="center"> + <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/libs/python/doc/index.html">Boost.Python</a><br> + C++ Container Support + </h1> + </td> + </tr> + </tbody></table> + + <hr> + + <h2> + Contents + </h2> + + <dl class="page-index"> + <dt> + <a href="#introduction">Introduction</a> + </dt> + <dt> + <a href="#design_goals">Design goals</a> + </dt> + <dt> + <a href="#interface">Interface</a> + </dt> + <dd> + <dl class="page-index"> + <dt> + <a href="#container_suite">container_suite.hpp</a> + </dt> + <dt> + <a href="#specific">Container-specific headers</a> + </dt> + <dt> + <a href="#policies">Using policies</a> + </dt> + <dt> + <a href="#visitor_flags">Visitor flag values</a> + </dt> + <dt> + <a href="#extending">Extending and customizing</a> + </dt> + <dd> + <dl class="page-index"> + <dt> + <a href="#ValueTraits">ValueTraits</a> + </dt> + <dt> + <a href="#ContainerTraits">ContainerTraits</a> + </dt> + <dt> + <a href="#Algorithms">Algorithms</a> + </dt> + <dt> + <a href="#SliceHelper">SliceHelper</a> + </dt> + </dl> + </dd> + <dt> + <a href="#extending">Container adapters</a> + </dt> + <dd> + <dl class="page-index"> + <dt> + <a href="#container_proxy">container_proxy</a> + </dt> + <dt> + <a href="#iterator_range">iterator_range</a> + </dt> + </dl> + </dd> + <dt> + <a href="#workarounds">Compiler workarounds</a> + </dt> + <dt> + <a href="#limitations">Known limitations</a> + </dt> + </dl> + </dd> + <dt> + <a href="#references">References</a> + </dt> + <dt> + <a href="#acknoweldegments">Acknowledgements and Copyright</a> + </dt> + </dl> + + <h2><a name="introduction">Introduction</a></h2> + + The purpose of the container indexing suite is to allow Python + code to access C++ containers using regular Python + interfaces. Since each C++ container is different, it is + non-trivial to decide what Python methods can be emulated, and how + to map them to C++ function calls. The indexing suite provides a + framework for representing those decisions, as well as bindings + for the standard C++ container templates. The indexing headers are + in the Boost subdirectory + <i>boost/python/suite/indexing</i> and non-template + implementations are in + <i>libs/python/src/indexing</i>. Various tests, which can also + serve as examples are in <i>libs/python/test</i>. + + <h2><a name="design_goals">Design goals</a></h2> + + The primary design goals of the container indexing suite are as + follows. The suite should: + + <ul> + <li> + + Support instances of all useful standard container templates + + </li> + <li> + + Provide as much of the normal Python interface as is + reasonable for each container + + </li> + <li> + + Be extensible to user-defined container types + + </li> + <li> + + Support client-provided <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/libs/python/doc/v2/CallPolicies.html">CallPolicies</a> + + </li> + </ul> + + Secondary design goals are as follows. The library should: + + <ul> + <li> + + Provide an emulation of Python reference semantics for + <i>values</i> in vector-like containers. + + </li> + <li> + + Provide an emulation of container semantics for iterator + ranges. + + </li> + </ul> + + <h2><a name="interface">Interface</a></h2> + + <p> + + The main iterface to the library is via the templated class + <code>container_suite</code>, an object of which adds a number + of Python functions to an extension class via a single + <code>def</code> call. Support is provided for all of the + standard container templates <a href="#Note1">[1]</a> via + container-specific header files, as shown in the following + example: + + </p> + +<pre>#include <boost/python/suite/indexing/container_suite.hpp> +#include <boost/python/suite/indexing/vector.hpp> +#include <boost/python/class.hpp> +#include <boost/python/module.hpp> +#include <vector> + +BOOST_PYTHON_MODULE(example) { + class_< std::vector<int> > ("vector_int") + .def (indexing::container_suite< std::vector<int> >()); +} +</pre> + + <p> + + The <code>container_suite</code> object achieves this using the + <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/libs/python/doc/v2/def_visitor.html">def_visitor interface</a>, which + provides a hook for the <code>def</code> function to install + multiple Python methods in one call. If the container element + type (<code>int</code> in the example above) is a user-defined + type, you would have to expose this type to Python via a + separate <code>class_</code> instance. + + </p> + <p> + + <a name="Note1">[1]</a> Automatic operation with the standard + containers works properly if your compiler supports partial + template specializations. Otherwise, refer to the <a href="#workarounds">compiler workarounds</a> section. + + </p> + + <h2><a name="container_suite">boost/python/suite/indexing/container_suite.hpp</a></h2> + + <p> + + The <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/boost/python/suite/indexing/container_suite.hpp"><code>container_suite.hpp</code></a> + header is summarized below: + + </p> + <p> +</p><pre>#include <boost/python/suite/indexing/algo_selector.hpp> +#include <boost/python/suite/indexing/visitor.hpp> + +#include <boost/python/return_by_value.hpp> +#include <boost/python/return_value_policy.hpp> + +namespace boost { namespace python { namespace indexing { + typedef return_value_policy<return_by_value> default_container_policies; + + template<class Container, + int Flags = 0, + class Algorithms = algo_selector<Container> > + struct container_suite + : public visitor<Algorithms, default_container_policies, Flags> + { + typedef Algorithms algorithms; + + template<typename Policy> + static visitor<Algorithms, Policy, Flags> + with_policies (Policy const &policy) + { + return visitor <Algorithms, Policy> (policy); + } + }; +} } } +</pre> + <p></p> + + <p> + + Some important points to note about <code>container_suite</code>: + + </p><ol> + <li> + + It does not include any of the container-specific headers + (like <code>vector.hpp</code> or <code>set.hpp</code>), so + these must be included separately to add support each type + of container. + + </li> + <li> + + It derives from the <code>indexing::visitor</code> + template, using a <code>return_by_value</code> return + policy. This is a reasonable default, and follows the + Boost.Python idiom of passing a default-constructed object + to the <code>def</code> function. + + </li> + <li> + + The <code>with_policies</code> static function template + generates different instances of the + <code>indexing::visitor</code> template, with + client-provided policies. + + </li> + <li> + + The template parameter <code>Flags</code> allows client code + to disable unneeded features in order to reduce code + size. Details are provided <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/libs/python/doc/v2/visitor_flags">below</a>. + + </li> + </ol> + + <p></p> + + <h2><a name="specific">Container-specific headers</a></h2> + + <p> + + The container indexing suite includes support for many of the + standard C++ container templates, but note that the support code + for each is in a separate header file. These header files (in + the <i>boost/python/suite/indexing</i> subdirectory) are: + <code>vector.hpp</code>, <code>deque.hpp</code>, + <code>list.hpp</code>, <code>set.hpp</code> and + <code>map.hpp</code>. These correspond in the obvious way to the + standard headers <code>vector</code>, <code>deque</code>, + etc. The header files for the <a href="#container_proxy"><code>container_proxy</code></a> and <a href="#iterator_range"><code>iterator_range</code></a> templates + provide their own support implicitly. + + </p> + + <h2><a name="policies">Using policies</a></h2> + + You can select call policies using the + <code>container_suite</code> static member function + <code>with_policies</code> as in the following example: + +<pre> class_< std::list<heavy_class> > ("list_heavy_class") + .def (indexing::container_suite< std::list<heavy_class> > + ::with_policies (my_policies)); +</pre> + + <h3>Caution with policies</h3> + + <p> + + It can be tempting to use <code>return_internal_reference</code> + if the container elements are expensive to copy. However, this + can be quite dangerous, since references to the elements can + easily become invalid (e.g. if the element is deleted or + moved). The Boost.Python code for + <code>return_internal_reference</code> can only manage the + lifetime of the entire container object, and not those of the + elements actually being referenced. Various alternatives exist, + the best of which is to store the container elements indirectly, + using <code>boost::shared_ptr</code> or an equivalent. If this + is not possible, + <code><a href="#container_proxy">container_proxy</a></code> + may provide a + solution, at least for vector-like containers. + + </p> + + <h3>Internal policies detail</h3> + + <p> + + The <code>container_suite</code> object typically adds more than + one function to the Python class, and not all of those functions + can, or should, use exactly the same policies. For instance, the + Python <code>len</code> method, if provided, should always + return its result by value. The library actually uses up to + three different sets of policies derived from the one provided + to the <code>with_policies</code> function. These are: + + </p><ol> + <li> + + The supplied policies, unchanged + + </li> + <li> + + The supplied precall policy only, using <code>default_call_policies</code> for result conversion. + + </li> + <li> + + The supplied precall policies, and the supplied result + conversion policies applied to <i>each element</i> of a + returned list. + + </li> + </ol> + + Roughly speaking, methods returning a single container element + use the first option, while methods returning an integer value + (or <code>void</code>) use the second option. The third option + applies only to the slice version of <code>__getitem__</code>, + which generates a Python list by applying the return conversion + policies to each element in the list. + + <p></p> + + <h2><a name="visitor_flags">Visitor Flag values</a></h2> + + <p> + + The <code>container_suite</code> template has an optional + <code>Flags</code> parameter that allows client code to disable + various optional features of the suite. This can lead to + significant savings in the size of object files and executables + if features such as sorting or Python slice support are not + needed. The <code>Flags</code> parameter (an integer) can be any + bitwise combination of the following values (defined in the + <code>boost::python::indexing</code> namespace by <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/boost/python/suite/indexing/visitor.hpp"><code>visitor.hpp</code></a>): + + </p> + + <p> + + <table border="1"> + <tbody><tr> + <th>Flag</th> + <th>Effect</th> + </tr> + <tr> + + <td><code>disable_len</code></td> + + <td>omits the Python <code>__len__</code> method</td> + + </tr> + <tr> + + <td><code>disable_slices</code></td> + + <td>omits slice support code from <code>__getitem__</code>, + <code>__setitem__</code> and <code>__delitem__</code>.</td> + + </tr> + <tr> + + <td><code>disable_search</code></td> + + <td>omits the container search methods <code>count<code>, + </code>index</code> and <code>__contains__</code></td> + + </tr> + <tr> + + <td><code>disable_reorder</code></td> + + <td>omits the container reordering operations + <code>sort</code> and <code>reverse</code></td> + + </tr> + <tr> + + <td><code>disable_extend</code></td> + + <td>omits the <code>extend</code> method</td> + + </tr> + <tr> + + <td><code>disable_insert</code></td> + + <td>omits the <code>insert</code> method</td> + + </tr> + </tbody></table> + + </p> + + <p> + + Note that some containers don't support some of the optional + features at all, in which case the relevant flags are + ignored. The value <code>minimum_support</code> may be passed as + a flag value to disable all optional features. A simple example + is provided in <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/libs/python/test/test_vector_disable.cpp"><code>test_vector_disable.cpp</code></a> + + </p> + + <h2><a name="extending">Extending and customizing</a></h2> + + <p> + + The <code>container_suite</code> template relies on seven main + support templates, five of which are suitable for specialization + or replacement by client code. The following diagram shows the + templates <a href="#Note2">[2]</a> and their dependencies, with + the replaceable ones highlighted in grey. For full details, + refer to the specific section on each component – what + follows here is an overview. + + </p> + + <table align="right"> + <tbody><tr> + <td> + + <img src="indexing_suite_v2_files/overview.png" alt="Dependencies between main templates" height="261" width="486"> + + </td> + </tr> + <tr> + <td><font size="-1"> + + Diagram 1. Overview of class dependencies + + </font></td> + </tr> + </tbody></table> + + <p> + + The <code>visitor</code> template, which implements the <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/libs/python/doc/v2/def_visitor.html">def_visitor interface</a>, decides what + Python methods to provide for a container. It takes two template + parameters, <code>Algorithms</code> and <code>Policy</code> (the + <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/libs/python/doc/v2/CallPolicies.html">CallPolicies</a> for the Python + methods on the container). The <code>Algorithms</code> argument + must provide implementations for the Python methods that the + container supports, as well as a matching + <code>ContainerTraits</code> type. This type provides various + compile-time constants that <code>visitor</code> uses to decide + what Python features the container provides. It also provides a + <code>value_traits</code> typedef, which has similar + compile-time constants related to the values stored in the + container. If the <code>visitor</code> instance decides to + provide Python slice support for the container, it instantiates + the <code>slice_handler</code> template, which also takes + <code>Algorithms</code> and <code>Policy</code> parameters. In + such cases, the <code>Algorithms</code> argument must supply a + <code>SliceHelper</code> type and factory function. + + </p> + <p> + + The high-level <code>container_suite</code> template uses the + <code>algo_selector</code> template to determine what types to + use in the instantiation of <code>visitor</code>. The + <code>algo_selector</code> template has partial specializations + for all of the STL container templates. + + </p> + + <p> + + <a name="Note2">[2]</a> Note that <code>Algorithms</code> and + <code>ContainerTraits</code> don't represent individual + templates in the diagram, but <i>groups</i> of related + templates. For instance, there are actually templates called + <code>list_algorithms</code> and <code>assoc_algorithms</code>, + among others. + + </p> + + + <h2><a name="ValueTraits">ValueTraits</a></h2> + + <p> + + A <code>ValueTraits</code> class provides simple information + about the type of value stored within a container that will be + exposed to Python via the <code>container_suite</code> + interface. It controls the provision of some operations that are + dependant on the operations supported by container elements (for + instance, <code>find</code> requires a comparison operator for + the elements). A <code>ValueTraits</code> class also provides a + hook called during initialization of the Python class, which can + be used for custom processing at this point. + + </p> + <p> + + The following table lists the static constants required in a + <code>ValueTraits</code> class: + + </p> + + <p> + <table border="1"> + <tbody><tr> + <th align="left"> + Static constant + </th> + <th align="center"> + Type + </th> + <th align="left"> + Meaning + </th> + </tr> + + <tr> + <td> + <code>equality_comparable</code> + </td> + <td> + bool + </td> + <td> + + Whether the value supports comparison via + <code>operator==</code>. + + </td> + </tr> + + <tr> + <td> + <code>lessthan_comparable</code> + </td> + <td> + bool + </td> + <td> + + Whether the value supports comparison via + <code>operator<</code>. + + </td> + </tr> + + </tbody></table> + </p> + + <p> + + A <code>ValueTraits</code> class should provide the following + member function template, which will be called during execution + of the <code>def</code> call for the container suite: + + </p> + + <p> + +</p><pre>template <typename PythonClass, typename Policy> +static void visitor_helper (PythonClass &, Policy const &); +</pre> + + <p></p> + + <h3>Usage notes for ValueTraits</h3> + + <p> + + In order to include a custom <code>ValueTraits</code> class into + the container suite, it is easiest to supply it as a + specialization of the template + <code>indexing::value_traits</code> for the container's element + type. The existing <code>ContainerTraits</code> classes all + make use of + <code>value_traits<container::value_type></code>, and so + will use a specialization for the value type if available. The + default, unspecialized, version of <code>value_traits</code> + sets both of the static constants to <code>true</code> and has + an empty implementation of <code>visitor_helper</code>. + + </p> + <p> + + As an example, if a user defined type does not have any + comparison operations, then there will probably be compile-time + errors caused by an attempt to provide the Python + <code>find</code> or <code>sort</code> methods. The solution is + to write a specialized version of + <code>indexing::value_traits</code> that disables the + appropriate features. For example: + + </p> + + <p> +</p><pre>namespace boost { namespace python { namespace indexing { + template<> + struct value_traits<my_type> : public value_traits<int> + { + static bool const equality_comparable = false; + static bool const lessthan_comparable = false; + }; +} } } +</pre> + <p></p> + + <p> + + In this example, there is no need to perform any processing in + the <code>visitor_helper</code> function, and deriving from an + unspecialized version of the template (e.g. + <code>value_traits<int></code>) exposes an empty + <code>visitor_helper</code>. + + </p> + + <h3>Synopsis: boost/python/suite/indexing/value_traits.hpp</h3> + + <p> +</p><pre>namespace boost { namespace python { namespace indexing { + template<typename T> + struct value_traits { + static bool const equality_comparable = true; + static bool const lessthan_comparable = true; + + template<typename PythonClass, typename Policy> + static void visitor_helper (PythonClass &, Policy const &) + { } + }; +} } } +</pre> + <p></p> + + <h2><a name="ContainerTraits">ContainerTraits</a></h2> + + <p> + + A <code>ContainerTraits</code> class serves three + purposes. Firstly, it identifies what facilities the container + supports in principle (i.e. either directly or via some support + code). Secondly, it identifies the types used to pass values + into and out of the supported operations. Thirdly, it provides a + hook for additional code to run during initialization of the + Python class (i.e. during the <code>def</code> call for the + suite). + + </p> + <p> + + Note that a <code>ContainerTraits</code> class can be any class, + derived from the existing implementations or not, as long as it + meets the requirements listed in the following sections. + + </p> + + <h3>Static constants for ContainerTraits</h3> + + The following table lists the static constants that a + <code>ContainerTraits</code> class should define. Note that these + must be <i>compile-time constants</i>, since parts of the library + use these constants to select between template specializations. + The constants must at least be convertible to the type shown in + the second column. + + <p> + <table border="1"> + <tbody><tr> + <th align="left"> + Static constant + </th> + <th align="center"> + Type + </th> + <th align="left"> + Meaning + </th> + <th align="left"> + Influence + </th> + </tr> + <tr> + <td> + <code>has_copyable_iter</code> + </td> + <td align="center"> + <code>bool</code> + </td> + <td> + + Whether copies of an iterator are independant <a href="#Note3">[3]</a> + + </td> + <td> + + Required for <code>len</code> and <code>__iter__</code> + + </td> + </tr> + + <tr> + <td> + <code>is_reorderable</code> + </td> + <td align="center"> + <code>bool</code> + </td> + <td> + + Whether it is possible to re-order the contents of the + container. + + </td> + <td> + + Required for <code>reverse</code> and <code>sort</code> + + </td> + </tr> + + <tr> + <td> + <code>has_mutable_ref</code> + </td> + <td align="center"> + <code>bool</code> + </td> + <td> + Whether container elements can be altered via a reference + </td> + <td> + Determines <code>is_reorderable</code> for most containers. + </td> + </tr> + + <tr> + <td> + <code>has_find</code> + </td> + <td align="center"> + <code>bool</code> + </td> + <td> + + Whether find is possible in principle (via member function + or otherwise) + + </td> + <td> + <code>__contains__</code>, + <code>index</code>, + <code>count</code>, + <code>has_key</code> + </td> + </tr> + + <tr> + <td> + <code>has_insert</code> + </td> + <td align="center"> + <code>bool</code> + </td> + <td> + + Whether it is possible to insert new elements into the container. + + </td> + <td> + <code>insert</code>, + <code>extend</code>, + slice version of <code>__setitem__</code> + </td> + </tr> + + <tr> + <td> + <code>has_erase</code> + </td> + <td align="center"> + <code>bool</code> + </td> + <td> + + Whether it is possible to erase elements from the container. + + </td> + <td> + <code>__delitem__</code>, + slice version of <code>__setitem__</code> + </td> + </tr> + + <tr> + <td> + <code>has_push_back</code> + </td> + <td align="center"> + <code>bool</code> + </td> + <td> + + Whether container supports insertion at the end. + + </td> + <td> + <code>append</code> + </td> + </tr> + + <tr> + <td> + <code>has_pop_back</code> + </td> + <td align="center"> + <code>bool</code> + </td> + <td> + + Whether container supports element deletion at the end. + + </td> + <td> + Currently unused + </td> + </tr> + + <tr> + <td> + <code>index_style</code> + </td> + <td align="center"> + <code>index_style_t</code> + </td> + <td> + + Type of indexing the container supports <a href="#Note4">[4]</a> + + </td> + <td> + <code>__getitem__</code>, + <code>__setitem__</code>, + <code>__delitem__</code>, + <code>__iter__</code>, + <code>extend</code>, + <code>index</code>, + <code>count</code>, + <code>has_key</code> + </td> + </tr> + </tbody></table> + </p> + + <p> + </p><h3>Notes</h3> + + <table> + <tbody><tr> + <td valign="top"> + <a name="Note3">[3]</a> + </td> + <td> + + For example, copies of stream iterators are <i>not</i> + independant. All iterator copies refer to the same stream, + which has only one read and one write position. + + </td> + </tr> + + <tr> + <td valign="top"> + <a name="Note4">[4]</a> + </td> + <td> + + <code>index_style_none</code>, no indexing at all + (e.g. <code>list</code>)<br> + + <code>index_style_linear</code>, continuous integer-like + index type (e.g. <code>vector</code>)<br> + + <code>index_style_nonlinear</code>, indexing via other + types (e.g. <code>map</code>). + + </td> + </tr> + </tbody></table> + + <p></p> + + <h3>Member types for ContainerTraits</h3> + + <p> + + The following table lists the type names that must be defined in + a compatible implementation of <code>ContainerTraits</code>. + The large number of types is supposed to provide flexibility for + containers with differing interfaces. For example, + <code>map</code> uses the same type for searching and "indexing" + (i.e. <code>find</code> and <code>operator[]</code>) so + <code>key_type</code> and <code>index_type</code> would have to + be the same. In contrast, searching a <code>vector</code> would + typically use a different type to that used for indexing into a + vector. + + </p> + + <p> + <table border="1"> + <tbody><tr> + <th align="left"> + Type name + </th> + <th align="left"> + Meaning + </th> + </tr> + + <tr> + <td> + <code>container</code> + </td> + <td> + The type of the C++ container. + </td> + </tr> + + <tr> + <td> + <code>size_type</code> + </td> + <td> + + The type used to represent the number of elements in the + container. + + </td> + </tr> + + <tr> + <td> + <code>iterator</code> + </td> + <td> + + The container's iterator type. This should be a non-const + iterator unless the container itself is const. + + </td> + </tr> + + <tr> + <td> + <code>index_type</code> + </td> + <td> + + The type used to represent indexes extracted from a + <code>__getitem__</code> call (and others). For + <code>index_style_linear</code>, this <i>should be a + signed type</i>, so that negative indices can be + processed. For <code>index_style_nonlinear</code>, this + will most likely be the same type as + <code>key_type</code>. + + </td> + </tr> + + <tr> + <td> + <code>index_param</code> + </td> + <td> + + The type to use when passing <code>index_type</code> into + a function. + + </td> + </tr> + + <tr> + <td> + <code>value_type</code> + </td> + <td> + + The type to use when copying a value into or out of the + container. + + </td> + </tr> + + <tr> + <td> + <code>value_param</code> + </td> + <td> + + The type to use when passing <code>value_type</code> into + a function. + + </td> + </tr> + + <tr> + <td> + <code>key_type</code> + </td> + <td> + + The type used for search operations like <code>find</code> + and <code>count</code>. + + </td> + </tr> + + <tr> + <td> + <code>key_param</code> + </td> + <td> + + The type to use when passing <code>key_type</code> into a + function. + + </td> + </tr> + + <tr> + <td> + <code>reference</code> + </td> + <td> + + The type to use when returning a reference to a container + element. + + </td> + </tr> + + <tr> + <td> + <code>value_traits_</code> + </td> + <td> + + Traits for the container elements. See <a href="#ValueTraits">the ValueTraits section</a> for + information about the requirements on this type. + + </td> + </tr> + + </tbody></table> + + </p> + + <h3>Member functions for ContainerTraits</h3> + + In order to support additional initialization code to run, a + <code>ContainerTraits</code> class should provide a static member + function template as follows: + + <p> +</p><pre>template <typename PythonClass, typename Policy> +static void visitor_helper (PythonClass &, Policy const &); +</pre> + <p></p> + + <p> + + Typically, the implementation would just forward the call to the + equivalent function in the <code>value_traits_</code> class. + + </p> + + <h3>Usage notes for ContainerTraits</h3> + + <p> + + It may be possible to mix your own <code>ContainerTraits</code> + class with one of the existing <code>Algorithms</code> + implementations, thus saving yourself a fair bit of work. The + easiest way to do this would be to specialize the + <code>algo_selector</code> template for your container type, + using public deriviation to get the implementation from one of + the existing <code>Algorithms</code> templates. For example, + assuming that <code>default_algorithms</code> is suitable for + your container: + + </p> + + <p> +</p><pre>namespace boost { namespace python { namespace indexing { + template<> + struct algo_selector<my_container> + : public default_algorithms<my_container_traits> + { + }; +} } } +</pre> + <p></p> + <p> + + Alternatively, you could select the algorithms and traits using + the <code>visitor</code> template directly, as described in the + <a href="#workarounds">compiler workarounds</a> section. + + </p> + + <h3><a name="simple_ctraits">Simplistic ContainerTraits example</a></h3> + + <p> + + The following block of code shows a simplistic implementation of + <code>ContainerTraits</code> for the container + <code>std::map<std::string, int></code>. The actual + implementation used by the suite relies on template + metaprogramming techniques, whereas this example is designed to + show only the essential elements of a + <code>ContainerTraits</code> implementation. + + </p> + + <p> +</p><pre>#include <map> +#include <string> +#include <boost/python/suite/indexing/suite_utils.hpp> +// Include suite_utils to get index_style_t + +struct simple_map_traits { + // Traits information for std::map<std::string, int> + + typedef std::map<std::string, int> container; + typedef container::size_type size_type; + typedef container::iterator iterator; + + typedef int value_type; + typedef int & reference; + typedef std::string key_type; + typedef std::string index_type; + + typedef int value_param; + typedef std::string const & key_param; + typedef std::string const & index_param; + + static bool const has_copyable_iter = true; + static bool const has_mutable_ref = true; + static bool const has_find = true; + static bool const has_insert = true; + static bool const has_erase = true; + static bool const has_pop_back = false; + static bool const has_push_back = false; + static bool const is_reorderable = false; + + static boost::python::indexing::index_style_t const index_style + = boost::python::indexing::index_style_nonlinear; + + struct value_traits_ { + // Traits information for our value_type + static bool const equality_comparable = true; + static bool const lessthan_comparable = true; + }; + + template<typename PythonClass, typename Policy> + static void visitor_helper (PythonClass &, Policy const &) + { + // Empty + } +}; +</pre> + <p></p> + + <p> + + Example usage of the <code>simple_map_traits</code>: + + </p> + + <p> +</p><pre>#include "simple_map_traits.hpp" + +#include <boost/python/suite/indexing/container_suite.hpp> + +#include <boost/python/module.hpp> +#include <boost/python/class.hpp> + +BOOST_PYTHON_MODULE(test_simple) { + using namespace boost::python; + + typedef std::map<std::string, int> container_t; + typedef indexing::map_algorithms<simple_map_traits> algorithms_t; + + class_<container_t> ("map") + .def (indexing::container_suite<container_t, algorithms_t>()); +} +</pre> + <p></p> + + <h2><a name="Algorithms">Algorithms</a></h2> + + <p> + + The <code>Algorithms</code> requirements are designed to provide + a predictable interface to any container, so that the same + <code>visitor</code> code can expose any supported container to + Python. An implemention of <code>Algorithms</code> does this by + providing functions and typedefs with fixed names. The exact + interfaces to the functions can vary to some extent, since the + <code>def</code> function calls used internally by the + <code>visitor</code> deduce the function type + automatically. However, certain points should be confomed to: + + </p><ol> + <li> + + The functions should be static, with + <code>container &</code> as first parameter. + + </li> + + <li> + + The functions should <i>not</i> be overloaded – this + avoids problems with type deduction. + + </li> + <li> + + Generally, not all of the possible functions need to be + implemented, dependant on the static constants in the + <code>ContainerTraits</code>. + + </li> + </ol> + + <p></p> + + <p> + + The block of code below shows the definition of the + <code>default_algorithms</code> class template, which is the + basis for all current implementations of + <code>Algorithms</code>. The typedefs that it defines are + primarily for convenience within the implementation itself, + however <code>container</code>, <code>reference</code> and + <code>slice_helper</code> are also required by the + <code>slice_handler</code> template, if slices are + supported. Note that <code>default_algorithms</code> derives all + of the type information from its <code>ContainerTraits</code> + template argument, which allows the same implementation to be + used for various container types. + + </p> + + <h3>Partial boost/python/suite/indexing/algorithms.hpp</h3> + + <p> +</p><pre>namespace boost { namespace python { namespace indexing { + template<typename ContainerTraits, typename Ovr = detail::no_override> + class default_algorithms + { + typedef default_algorithms<ContainerTraits, Ovr> self_type; + + public: + typedef ContainerTraits container_traits; + + typedef typename ContainerTraits::container container; + typedef typename ContainerTraits::iterator iterator; + typedef typename ContainerTraits::reference reference; + typedef typename ContainerTraits::size_type size_type; + typedef typename ContainerTraits::value_type value_type; + typedef typename ContainerTraits::value_param value_param; + typedef typename ContainerTraits::index_param index_param; + typedef typename ContainerTraits::key_param key_param; + + typedef int_slice_helper<self_type, integer_slice> slice_helper; + + static size_type size (container &); + static iterator find (container &, key_param); + static size_type get_index (container &, key_param); + static size_type count (container &, key_param); + static bool contains (container &, key_param); + static void reverse (container &); + static reference get (container &, index_param); + static void assign (container &, index_param, value_param); + static void insert (container &, index_param, value_param); + static void erase_one (container &, index_param); + static void erase_range(container &, index_param, index_param); + static void push_back (container &, value_param); + static void sort (container &); + + static slice_helper make_slice_helper (container &c, slice const &); + + template<typename PythonClass, typename Policy> + static void visitor_helper (PythonClass &, Policy const &); + }; +} } } +</pre> + <p></p> + + <h3>Slice support</h3> + <p> + + For containers that support Python slices, the + <code>visitor</code> template will instantiate and use + internally the <code>slice_handler</code> template. This + template requires a type called <code>slice_helper</code> and a + factory function called <code>make_slice_helper</code> from its + <code>Algorithms</code> argument. More details are provided in + the section <a href="#SliceHelper">SliceHelper</a>. + + </p> + + <h3>Usage notes for Algorithms</h3> + + <p> + + The existing <code>indexing::algo_selector</code> template uses + partial specializations and public derivation to select an + <code>Algorithms</code> implementation suitable for any of the + standard container types. Exactly how it does this should be + considered an implementation detail, and uses some tricks to + reuse various existing <code>Algorithms</code> + implementations. In any case, client code can specialize the + <code>algo_selector</code> template for new container types, as + long as the specialized instances conform to the requirements + for <code>Algorithms</code> as already given. + + </p> + <p> + + A new implementation of <code>Algorithms</code> could derive + from any one of the existing implementation templates, or be + completely independant. The existing implementation templates + are listed in the following table. They each take one template + parameter, which should be a valid <code>ContainerTraits</code> + class, as specified in a <a href="#ContainerTraits">previous + section</a>. + + </p> + + <p> + <table border="1"> + <tbody><tr> + <th> + Template name + </th> + <th> + Description + </th> + </tr> + + <tr> + <td> + + <code>default_algorithms</code> + + </td> + <td> + + Uses standard iterator-based algorithms wherever + possible. Assumes that the container provides + <code>begin</code> and end <code>end</code> member + functions that return iterators, and some or all of + <code>size</code>, <code>insert</code>, <code>erase</code> + and <code>push_back</code>, depending on what functions get + instantiated. + + </td> + </tr> + + <tr> + <td> + + <code>list_algorithms</code> + + </td> + <td> + + Similar to the above (in fact, it derives from + <code>default_algorithms</code>) except that it uses + container member functions <code>reverse</code> and + <code>sort</code> instead of the iterator-based + versions. Defined in + <code>boost/python/suite/indexing/list.hpp</code>. + + </td> + </tr> + + <tr> + <td> + + <code>assoc_algorithms</code> + + </td> + <td> + + Also derived from <code>default_algorithms</code>, for use + with associative containers. Uses the container member + function <code>find</code> for indexing, and member + function <code>count</code> instead of iterator-based + implementations. + + </td> + </tr> + + <tr> + <td> + + <code>set_algorithms</code> + + </td> + <td> + + Derived from <code>assoc_algorithms</code> to handle + <code>set</code> insertion operations, which are slightly + different to the <code>map</code> versions. + + </td> + </tr> + + <tr> + <td> + + <code>map_algorithms</code> + + </td> + <td> + + Derived from <code>assoc_algorithms</code> to handle + <code>map</code> insertion and lookup, which are slightly + different to the <code>set</code> versions. + + </td> + </tr> + </tbody></table> + + </p> + <p> + + The <code>default_algorithms</code> template attempts to place + as few restrictions as possible on the container type, by using + iterators and standard algorithms in most of its functions. It + accepts an optional second template parameter, which can be used + via the curiously recurring template idiom to replace any of its + functions that it relies on internally. For instance, if you've + created an iterator-style interface to a container that is not + at all STL-like (let's call it <code>weird_container</code>), + you might be able to re-use most of + <code>default_algorithms</code> by replacing its basic functions + like this: + + </p> + <p> +</p><pre>namespace indexing = boost::python::indexing; + +struct my_algorithms + : public indexing::default_algorithms < + weird_container_traits, my_algorithms + > +{ + size_t size (weird_container const &c) { + return ...; + } + + my_iterator_t begin (weird_container &c) { + return ...; + } + + my_iterator_t end (weird_container &c) { + return ...; + } +}; +</pre> + <p></p> + + <h2><a name="SliceHelper">SliceHelper</a></h2> + + <p> + + Support code for Python slices is split into two portions, the + <code>slice_handler</code> template, and a "slice helper" that + can easily be replaced by client code via a typedef and factory + function in the <code>Algorithms</code> argument supplied to + <code>container_suite</code>. The slice helper object takes care + of reading and writing elements from a slice in a C++ container, + and optionally insertion and deletion. Effectively, the slice + helper object maintains a pointer to the current element of the + slice within the container, and provides a <code>next</code> + function to advance to the next element of the slice. The + container suite uses the following interface for slices: + + </p> + <p> + <table border="1"> + <tbody><tr> + <th> + + Expression + + </th> + <th> + + Return type + + </th> + <th> + + Notes + + </th> + </tr> + <tr> + <td> + + <code>Algorithms::</code> <code>make_slice_helper</code> + <code>(c, s)</code> + + </td> + <td> + + <code>Algorithms::</code> <code>slice_helper</code> + + </td> + <td> + + <code>c</code> is of type + <code>Algorithms::</code> <code>container &</code> and + <code>s</code> is of type <code>indexing::</code> + <code>slice const &</code>. + Returns a newly constructed <code>slice_helper</code> + object by value. + + </td> + </tr> + + <tr> + <td> + + <code>slice_helper.</code><code>next()</code> + + </td> + <td> + + <code>bool</code> + + </td> + <td> + + Advances the slice helper's current element pointer to the + next element of the slice. Returns true if such an element + exists, and false otherwise. The first time this function + is called, it should set the current pointer to the first + element of the slice (if any). + + </td> + </tr> + + <tr> + <td> + + <code>slice_helper.</code> <code>current()</code> + + </td> + <td> + + <code>Algorithms::</code> <code>reference</code> + + </td> + <td> + + Returns a reference to the current element of the + slice. This will only be called if the last call to + <code>next()</code> returned true. + + </td> + </tr> + <tr> + <td> + + <code>slice_helper.</code><code>write (v)</code> + + </td> + <td> + + <code>void</code> + + </td> + <td> + + The parameter <code>v</code> is of type + <code>Algorthims::value_param</code>. Advances to the + next element of the slice, as defined in + <code>next</code>, and writes the given value + <code>v</code> at the new location in the container.If the + slice is exhausted (i.e. <code>next</code> would return + false) then <code>write</code> <i>either</i> inserts the + value into the container at the next location (past the + end of the slice), <i>or</i> sets a Python exception and + throws. + + </td> + </tr> + <tr> + <td> + + <code>slice_helper.</code> <code>erase_remaining()</code> + + </td> + <td> + + <code>void</code> + + </td> + <td> + + <i>Either</i> erases any remaining elements in the slice + not already consumed by calls to <code>next</code> or + <code>write</code>, + <i>or</i> sets a Python exception and throws. + + </td> + </tr> + </tbody></table> + </p> + + <p> + + The container suite provides a generic implementation of the + <code>SliceHelper</code> requirements for containers that have + integer-like indexes. It is parameterized with a + <code>SliceType</code> parameter that allows the integer index + values to come from various different sources, the default being + the <code>PySlice_GetIndices</code> function. Refer to the + header file <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/boost/python/suite/indexing/int_slice_helper.hpp"><code>int_slice_helper.hpp</code></a> + and the references to it in the <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/boost/python/suite/indexing/algorithms.hpp"><code>algorithms.hpp</code></a> + header for details. + + </p> + + <h2><a name="container_proxy">container_proxy</a></h2> + + <p> + + The <code>container_proxy</code> template provides an emulation + of Python reference semantics for objects held by value in a + vector-like container. Of course, this introduces some + performance penalties in terms of memory usage and run time, so + the primary application of this template is in situations where + all of the following apply: + + </p><ol> + <li> + + It is not practical to switch to a container of shared + pointers + + </li> + <li> + + Python code requires reference semantics for the objects + within the container + + </li> + <li> + + Element insertion, deletion or assignment takes place, so + that using <code>return_internal_reference</code> would be + dangerous. + + </li> + </ol> + + <p></p> + + <p> + + + The <code>container_proxy</code> template wraps any vector-like + container and presents an interface that is similar to that of + <code>std::vector</code>, but which returns + <code>element_proxy</code> objects instead of plain references + to values stored in the wrapped container. During an operation + that alters the position of an element within the container + (e.g. <code>insert</code>) the <code>container_proxy</code> code + updates the relevant proxy objects, so that they still refer to + the <i>same</i> elements at their new locations. Any operation + that would delete or overwrite a value in the container + (e.g. <code>erase</code>) copies the to-be-deleted value into + its corresponding proxy object. This means that a proxy's + "reference" to an element is robust in the face of changes to + the element's position in the container, and even the element's + removal. + + </p> + <p> + + Ideally, any code that changes the positions of elements within + the container would use only the <code>container_proxy</code> + interface, to ensure that the proxies are maintained in + synchronization. Code that otherwise makes direct modifications + to the raw container must notify the + <code>container_proxy</code> of the changes, as detailed in the + following section. + + </p> + + <h3>container_proxy interface</h3> + + <p> + + The <code>container_proxy</code> template takes three + parameters, only the first of which is mandatory: + + </p> + <p> + +</p><pre>template<class Container + , class Holder = identity<Container> + , class Generator = vector_generator> class container_proxy; +</pre> + + <p></p> + <p> + + The <code>Container</code> argument is the raw container type + that the <code>container_proxy</code> will manage. It must + provide random-access indexing. + + </p> + <p> + + The <code>Holder</code> argument determines how the + <code>container_proxy</code> stores the raw container object. + There are currently two types of holder implemented, the default + <code>identity</code> template which will store the raw + container by value within the <code>container_proxy</code>, and + the <code>deref</code> template which stores a (plain) pointer + to an external object. It would also be possible, for instance, + to create a holder that uses a <code>shared_pointer</code>, or + one that stores a pointer but performs deep copies. + + </p> + <p> + + The <code>Generator</code> argument determines what container to + use for storing the proxy objects. The argument must be a + suitable class so that + <code>Generator::apply<proxy_t>::type</code> is a typedef + for the container to use for storing the proxies. The default is + <code>vector_generator</code>, which generates + <code>std::vector</code> instances. The usefulness of allowing + other generators can be seen from the example + + <code>container_proxy<std::deque<...> ></code>. + + Insertion at the beginning of this <code>container_proxy</code> + requires an insertion at the beginning of the + <code>std::deque</code> raw container, which has amortized + constant time complexity. However, it also requires an insertion + at the beginning of the proxy container, which (using the + <code>std::vector</code> provided by + <code>vector_generator</code>) has linear time complexity. If + this is a significant issue, you can use a custom + <code>Generator</code> to match the performance characteristics + of the proxy container to those of the raw container. + + </p> + <p> + + Examples in <a href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/libs/python/test/test_container_proxy.cpp">libs/python/test/test_container_proxy.cpp</a> + ... + + </p> + + <h3>Synopsis: boost/python/suite/indexing/container_proxy.hpp</h3> + +<pre>namespace boost { namespace python { namespace indexing { + template<class Container + , class Holder = identity<Container> + , class Generator = vector_generator> + class container_proxy + { + public: + typedef typename Container::size_type size_type; + typedef typename Container::difference_type difference_type; + typedef typename Container::value_type raw_value_type; + + typedef typename Holder::held_type held_type; + + typedef <i>implementation defined</i> value_type; + typedef <i>implementation defined</i> const_value_type; + typedef <i>implementation defined</i> iterator; + typedef <i>implementation defined</i> const_iterator; + + typedef value_type reference; // Has reference semantics + typedef const_value_type const_reference; // Has reference semantics + + container_proxy (); + explicit container_proxy (held_type const &); + template<typename Iter> container_proxy (Iter, Iter); + + container_proxy (container_proxy const &); + container_proxy &operator= (container_proxy const &); + ~... [truncated message content] |
From: <rom...@us...> - 2006-08-14 12:47:55
|
Revision: 401 Author: roman_yakovenko Date: 2006-08-14 05:47:13 -0700 (Mon, 14 Aug 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=401&view=rev Log Message: ----------- renaming pyplusplus to Py++ Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/decl_printer.py pygccxml_dev/unittests/autoconfig.py pygccxml_dev/unittests/data/core_cache.hpp pyplusplus_dev/docs/examples/boost/www_configuration.py pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py pyplusplus_dev/pyplusplus/__init__.py pyplusplus_dev/pyplusplus/_logging_/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/__init__.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/variable_wrapper.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/gui/__init__.py pyplusplus_dev/pyplusplus/gui/ui.py pyplusplus_dev/pyplusplus/module_builder/__init__.py pyplusplus_dev/pyplusplus/module_builder/builder.py pyplusplus_dev/pyplusplus/module_creator/class_organizer.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/pyplusplus/module_creator/types_database.py pyplusplus_dev/setup.py Modified: pygccxml_dev/pygccxml/declarations/decl_printer.py =================================================================== --- pygccxml_dev/pygccxml/declarations/decl_printer.py 2006-08-14 10:10:54 UTC (rev 400) +++ pygccxml_dev/pygccxml/declarations/decl_printer.py 2006-08-14 12:47:13 UTC (rev 401) @@ -14,7 +14,7 @@ This class provides more information than the __str__() methods do. The class is not just meant to provide a unique "id" for a declaration but to inspect an entire declaration tree. This is particularly useful - for new users who want to find out how pyplusplus works and how it + for new users who want to find out how Py++ works and how it stores its data. """ JUSTIFY = 20 Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2006-08-14 10:10:54 UTC (rev 400) +++ pygccxml_dev/unittests/autoconfig.py 2006-08-14 12:47:13 UTC (rev 401) @@ -66,7 +66,7 @@ #, 'dat'#file extension of directory cache #, 'config'#parameter description #, 'gccxml'#parameter description - #, 'pyplusplus' + #, 'Py++' #, 'pygccxml' #, 'calldef' #, 'XXX' Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2006-08-14 10:10:54 UTC (rev 400) +++ pygccxml_dev/unittests/data/core_cache.hpp 2006-08-14 12:47:13 UTC (rev 401) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file +//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file Modified: pyplusplus_dev/docs/examples/boost/www_configuration.py =================================================================== --- pyplusplus_dev/docs/examples/boost/www_configuration.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/docs/examples/boost/www_configuration.py 2006-08-14 12:47:13 UTC (rev 401) @@ -1,2 +1,2 @@ name = 'boost' -#This directory used as place holder for pyplusplus directory \ No newline at end of file +#This directory used as place holder for Py++ directory \ No newline at end of file Modified: pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-08-14 12:47:13 UTC (rev 401) @@ -102,7 +102,7 @@ boost_ns.classes( lambda decl: decl.alias.endswith( 'formatter' ) ).exclude() #boost.date_time has problem to create local_[micro]sec_clock - #variable, it has nothing to do with pyplusplus + #variable, it has nothing to do with Py++ empty_classes = ['local_microsec_clock', 'local_sec_clock'] for alias in empty_classes: class_ = boost_ns.class_( lambda decl: decl.alias == alias ) Modified: pyplusplus_dev/pyplusplus/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/__init__.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/__init__.py 2006-08-14 12:47:13 UTC (rev 401) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -"""pyplusplus - Boost.Python code generator +"""Py++ - Boost.Python code generator ======================================== This package (together with the accompanying pygccxml package and @@ -19,7 +19,7 @@ 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{pyplusplus<http://www.language-binding.net>}, +If you are just starting with U{Py++<http://www.language-binding.net>}, then consider to read documentation of L{module_builder} package. """ @@ -37,12 +37,8 @@ __version__ = '0.7.1' #Known issues: -#1. Generated code for exporting function of template intsantiated classes could not be compiled -# with visual studio 7.1 -#2. Add logging of some statistics -# #3. -#~ > > 2. An other difference: when pyplusplus creates bindings for a set of +#~ > > 2. An other difference: when Py++ creates bindings for a set of #~ > > declarations, it #~ > > should (?) see all declarations that are going to be exported: #~ > > reasons: Modified: pyplusplus_dev/pyplusplus/_logging_/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/_logging_/__init__.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/_logging_/__init__.py 2006-08-14 12:47:13 UTC (rev 401) @@ -5,7 +5,7 @@ #TODO: find better place for it """ -This package contains logging configuration for pyplusplus. Default log level +This package contains logging configuration for Py++. Default log level is DEBUG. Default log messages destination is sys.stdout. """ Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-08-14 12:47:13 UTC (rev 401) @@ -5,7 +5,7 @@ """Declaration decorators. -This sub-package contains the pyplusplus specific declaration objects +This sub-package contains the Py++ specific declaration objects that are the nodes of the declaration tree. In addition to the interface of the declarations in the pygccxml package the objects in this package also provide a I{decoration} interface. This interface Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-08-14 12:47:13 UTC (rev 401) @@ -58,7 +58,7 @@ if not isinstance( self, declarations.member_calldef_t ): pass elif self.virtuality == declarations.VIRTUALITY_TYPES.PURE_VIRTUAL: - raise RuntimeError( "In order to expose pure virtual function, you should allow to pyplusplus to create wrapper." ) + raise RuntimeError( "In order to expose pure virtual function, you should allow to Py++ to create wrapper." ) elif self.access_type == declarations.ACCESS_TYPES.PROTECTED: self.ignore = True else: @@ -112,12 +112,12 @@ dtype = units[-1] if isinstance( dtype.declaration.parent, declarations.class_t ): if dtype.declaration not in dtype.declaration.parent.public_members: - return "pyplusplus can not expose function that takes as argument/returns instance of non public class. Generated code will not compile." + return "Py++ can not expose function that takes as argument/returns instance of non public class. Generated code will not compile." no_ref = declarations.remove_reference( some_type ) no_ptr = declarations.remove_pointer( no_ref ) no_const = declarations.remove_const( no_ptr ) if declarations.is_array( no_const ): - return "pyplusplus can not expose function that takes as argument/returns C++ arrays. This will be changed in near future." + return "Py++ can not expose function that takes as argument/returns C++ arrays. This will be changed in near future." return self._exportable_impl_derived() def _readme_impl( self ): @@ -169,7 +169,7 @@ def _exportable_impl_derived( self ): if self.is_artificial: - return 'pyplusplus does not exports compiler generated constructors' + return 'Py++ does not exports compiler generated constructors' return '' Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-08-14 12:47:13 UTC (rev 401) @@ -190,10 +190,10 @@ def _exportable_impl( self ): if not self.name: - return 'pyplusplus can not expose unnamed classes.' + return 'Py++ can not expose unnamed classes.' #it is possible to do so, but not for unnamed classes defined under namespace. if isinstance( self.parent, declarations.namespace_t ): return '' if not self in self.parent.public_members: - return 'pyplusplus can not expose private class.' + return 'Py++ can not expose private class.' return '' Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2006-08-14 12:47:13 UTC (rev 401) @@ -97,9 +97,9 @@ def get_exportable( self ): if self._exportable is None: if self.name.startswith( '__' ): - self._exportable_reason = 'pyplusplus, by default, does not expose internal compilers declarations. Names of those declarations usually start with "__".' + self._exportable_reason = 'Py++, by default, does not expose internal compilers declarations. Names of those declarations usually start with "__".' elif self.location and self.location.file_name == "<internal>": - self._exportable_reason = 'pyplusplus, by default, does not expose internal declarations (those that gccxml say belong to "<internal>" header).' + self._exportable_reason = 'Py++, by default, does not expose internal declarations (those that gccxml say belong to "<internal>" header).' else: self._exportable_reason = self._exportable_impl( ) self._exportable = not bool( self._exportable_reason ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-08-14 12:47:13 UTC (rev 401) @@ -14,11 +14,11 @@ self._setter_call_policies = None __call_policies_doc__ = \ - """There are usecase, when exporting member variable forces pyplusplus to + """There are usecase, when exporting member variable forces Py++ to create accessors functions. Sometime, those functions requires call policies. To be more specific: when you export member variable that has reference or pointer type, you need to tell boost.python library how to manage object - life-time. In all cases, pyplusplus will give reasonable default value. I am + life-time. In all cases, Py++ will give reasonable default value. I am sure, that there are use cases, when you need to change it. You should use this property to change it. """ @@ -41,16 +41,16 @@ #if not isinstance( self.parent, declarations.class_t ): # return '' if not self.name: - return "pyplusplus can not expose unnamed variables" + return "Py++ can not expose unnamed variables" if self.bits == 0 and self.name == "": - return "pyplusplus can not expose alignement bit." + return "Py++ can not expose alignement bit." type_ = declarations.remove_alias( self.type ) type_ = declarations.remove_const( type_ ) if declarations.is_pointer( type_ ): if self.type_qualifiers.has_static: - return "pyplusplus can not expose static pointer member variables. This could be changed in future." + return "Py++ can not expose static pointer member variables. This could be changed in future." if declarations.is_fundamental( type_.base ): - return "pyplusplus can not expose pointer to fundamental member variables. This could be changed in future." + return "Py++ can not expose pointer to fundamental member variables. This could be changed in future." units = declarations.decompose_type( type_ ) ptr2functions = filter( lambda unit: isinstance( unit, declarations.calldef_type_t ) @@ -62,6 +62,6 @@ if declarations.class_traits.is_my_case( type_ ): cls = declarations.class_traits.get_declaration( type_ ) if not cls.name: - return "pyplusplus can not expose variables of with unnamed type." + return "Py++ can not expose variables of with unnamed type." return '' \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2006-08-14 12:47:13 UTC (rev 401) @@ -65,7 +65,7 @@ writer_t.logger.debug( 'write code to file "%s" - started' % fpath ) start_time = time.clock() fcontent_new = [] - fcontent_new.append( '// This file has been generated by pyplusplus.' ) + 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/gui/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/gui/__init__.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/gui/__init__.py 2006-08-14 12:47:13 UTC (rev 401) @@ -4,7 +4,7 @@ # http://www.boost.org/LICENSE_1_0.txt) """ -This package provide simple GUI interface. If you have installed pyplusplus and +This package provide simple GUI interface. If you have installed Py++ and pygccxml you can invoke GUI from shell using pyplusplus_gui command on Linux. On Windows you can run pyplusplus_gui.pyw file. """ Modified: pyplusplus_dev/pyplusplus/gui/ui.py =================================================================== --- pyplusplus_dev/pyplusplus/gui/ui.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/gui/ui.py 2006-08-14 12:47:13 UTC (rev 401) @@ -128,7 +128,7 @@ map( self._include_paths.delete, selected ) def _add_define( self ): - symbol = tkSimpleDialog.askstring(title='pyplusplus - code generator demo' + symbol = tkSimpleDialog.askstring(title='Py++ - code generator demo' , prompt="Define symbol ( example 'max(a,b)=a<b?b:a' ):") if symbol: self._defines.insert( Tkinter.END, symbol ) @@ -195,7 +195,7 @@ temp.grid( row=0, columnspan=3, sticky=Tkinter.NW + Tkinter.E ) temp = Tkinter.Button( self - , text="generate pyplusplus code" + , text="generate Py++ code" , command=on_generate_pyplusplus ) temp.grid( row=1, sticky=Tkinter.NW + Tkinter.E) @@ -270,7 +270,7 @@ top.rowconfigure( 0, weight=1 ) top.columnconfigure( 0, weight=1 ) - self.master.title('pyplusplus - code generator demo') + self.master.title('Py++ - code generator demo') self._header_file_configurator = header_file_ui_t( self ) self._header_file_configurator.grid( row=0, column=0, sticky=Tkinter.NW, padx=2, pady=2) Modified: pyplusplus_dev/pyplusplus/module_builder/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/__init__.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/module_builder/__init__.py 2006-08-14 12:47:13 UTC (rev 401) @@ -4,11 +4,11 @@ # http://www.boost.org/LICENSE_1_0.txt) """ -This package provides users with simple and convinient interface to pyplusplus +This package provides users with simple and convinient 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 pyplusplus +Also take a look on tutorials. You can find them on Py++ U{web site<http://www.language-binding.net>} """ Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-08-14 12:47:13 UTC (rev 401) @@ -18,8 +18,8 @@ class module_builder_t(object): """ - This class provides users with simple and intuitive interface to pyplusplus - and/or pygccxml functionality. If this is your first attempt to use pyplusplus + 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>}. """ Modified: pyplusplus_dev/pyplusplus/module_creator/class_organizer.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/class_organizer.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/module_creator/class_organizer.py 2006-08-14 12:47:13 UTC (rev 401) @@ -88,7 +88,7 @@ else: pass #there is usecase where base class defined within some class - #but his derives defined out of the class. right now pyplusplus + #but his derives defined out of the class. right now Py++ #doesn't supports this situation. self.__colors[base] = COLOR.BLACK Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-08-14 12:47:13 UTC (rev 401) @@ -44,7 +44,7 @@ INDEXING_SUITE_2_MAIN_HEADER = "boost/python/suite/indexing/container_suite.hpp" -DO_NOT_REPORT_MSGS = [ "pyplusplus does not exports compiler generated constructors" ] +DO_NOT_REPORT_MSGS = [ "Py++ does not exports compiler generated constructors" ] class creator_t( declarations.decl_visitor_t ): """Creating code creators. @@ -221,7 +221,7 @@ vfunction_selector = lambda member: isinstance( member, declarations.member_function_t ) \ and member.virtuality == VIRTUALITY_TYPES.PURE_VIRTUAL members.extend( filter( vfunction_selector, class_decl.private_members ) ) - #now lets filter out none public operators: pyplusplus does not support them right now + #now lets filter out none public operators: Py++ does not support them right now members = filter( lambda decl: not isinstance( decl, declarations.member_operator_t ) or decl.access_type == ACCESS_TYPES.PUBLIC , members ) Modified: pyplusplus_dev/pyplusplus/module_creator/types_database.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/types_database.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/pyplusplus/module_creator/types_database.py 2006-08-14 12:47:13 UTC (rev 401) @@ -75,7 +75,7 @@ except RuntimeError: msg = "%s;%s" \ % ( str(container_cls) - , "pyplusplus can not find out container value_type( mapped_type )." + , "Py++ can not find out container value_type( mapped_type )." "The container class is template instantiation declaration and not definition." "This container class will be exported, but there is a posiblity, that generated code will not compile." "The solution to the problem is to create a variable of the class." ) Modified: pyplusplus_dev/setup.py =================================================================== --- pyplusplus_dev/setup.py 2006-08-14 10:10:54 UTC (rev 400) +++ pyplusplus_dev/setup.py 2006-08-14 12:47:13 UTC (rev 401) @@ -50,9 +50,9 @@ print "Generating epydoc files..." - docindex = build_doc_index(['pyplusplus', 'pygccxml']) + docindex = build_doc_index(['Py++', 'pygccxml']) html_writer = HTMLWriter( docindex - , prj_name='pyplusplus' + , prj_name='Py++' , prj_url='http://www.language-binding.net' , include_sourcecode=False #This will decrease the size of generated documentation , show_private=False @@ -86,9 +86,9 @@ generate_doc() -setup( name = "pyplusplus", +setup( name = "Py++", version = "0.8.1", - description="pyplusplus is a framework of components for creating C++ code generator for boost.python library", + description="Py++ is a framework of components for creating C++ code generator for Boost.Python library", author="Roman Yakovenko", author_email="rom...@gm...", url='http://www.language-binding.net/pyplusplus/pyplusplus.html', This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-08-21 13:42:42
|
Revision: 429 Author: roman_yakovenko Date: 2006-08-21 06:42:15 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=429&view=rev Log Message: ----------- updating documentation strings Modified Paths: -------------- pyplusplus_dev/docs/documentation/best_practices.rest pyplusplus_dev/docs/documentation/how_to.rest 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/enumeration_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/pyplusplus/decl_wrappers/namespace_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/scopedef_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/typedef_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/user_text.py pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py pyplusplus_dev/setup.py Modified: pyplusplus_dev/docs/documentation/best_practices.rest =================================================================== --- pyplusplus_dev/docs/documentation/best_practices.rest 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/docs/documentation/best_practices.rest 2006-08-21 13:42:15 UTC (rev 429) @@ -9,7 +9,7 @@ ------------ `Py++`_ has reach interface and a lot of functionality. Sometimes reach -interface helps, but sometimes it can confuse. This document will describe how +interface helps, but sometimes it can confuse. This document will describe how effectively to use `Py++`_. ------------ @@ -19,48 +19,47 @@ Definition ---------- -First of all, let me to define "big project". "Big project" is a project with +First of all, let me to define "big project". "Big project" is a project with few hundred of header files. `Py++`_ was born to create `Python`_ bindings -for such projects. If you take a look `here`__ you will find few such projects, -that use `Py++`_. +for such projects. If you take a look `here`__ you will find few such projects. .. __ : ./../../pygccxml/quotes.html Tips ---- -* Create one header file, which will include all project header files. +* Create one header file, which will include all project header files. - Doing it this way makes it so `GCC-XML`_ is only called once and it reduces the + Doing it this way makes it so `GCC-XML`_ is only called once and it reduces the overhead that would occur if you pass `GCC-XML`_ all the files individually. - Namely `GCC-XML`_ would have to run hundreds of times and each call would - actually end up including quite a bit of common code anyway. This way takes a - `GCC-XML`_ processing time from multiple hours with gigabytes of caches to a + Namely `GCC-XML`_ would have to run hundreds of times and each call would + actually end up including quite a bit of common code anyway. This way takes a + `GCC-XML`_ processing time from multiple hours with gigabytes of caches to a couple minutes with a reasonable cache size. - + You can read more about different caches supported by `pygccxml`_ `here`__. ``module_builder_t.__init__`` methods takes reference to an instance of cache class or ``None``: - + :: - from module_builder import * + from module_builder import * mb = module_builder_t( ..., cache=file_cache_t( path to project cache file ), ... ) - + * Single header file, will also improve performance compiling the generated bindings. - When `Py++`_ generated the bindings, you have a lot of .cpp files to + When `Py++`_ generated the bindings, you have a lot of .cpp files to compile. The project you are working on is big. I am sure it takes a lot of - time to compile projects that depend on it. Generated code also depend on it, - more over this code contains a lot of template instantiations. So it could - take a great deal of time to compile it. Allen Bierbaum investigated this - problem. He found out that most of the time is really spent processing all the - headers, templates, macros from the project and from the boost library. So he + time to compile projects that depend on it. Generated code also depend on it, + more over this code contains a lot of template instantiations. So it could + take a great deal of time to compile it. Allen Bierbaum investigated this + problem. He found out that most of the time is really spent processing all the + headers, templates, macros from the project and from the boost library. So he come to conclusion, that in order to improve compilation speed, user should - be able to control( to be able to generate ) precompiled header file. He + be able to control( to be able to generate ) precompiled header file. He implemented an initial version of the functionality. After small discussion, we agreed on next interface: - + :: class module_builder_t( ... ): @@ -68,17 +67,17 @@ def split_module( self, directory_path, huge_classes=None, precompiled_header=None ): ... ... - - ``precompiled_header`` argument could be ``None`` or string, that contains - name of precompiled header file, which will be created in the directory. - `Py++`_ will add to it header files from `Boost.Python`_ library and - your header files. - + + ``precompiled_header`` argument could be ``None`` or string, that contains + name of precompiled header file, which will be created in the directory. + `Py++`_ will add to it header files from `Boost.Python`_ library and + your header files. + What is ``huge_classes`` argument for? ``huge_classes`` could be ``None`` or - list of references to class declarations. It is there to provide a solution to - `this error`_. `Py++`_ will automatically split generated code for the + list of references to class declarations. It is there to provide a solution to + `this error`_. `Py++`_ will automatically split generated code for the huge classes to few files: - + :: mb = module_builder_t( ... ) @@ -89,9 +88,9 @@ .. _`this error` : http://boost.org/libs/python/doc/v2/faq.html#c1204 .. __ : ./../../pygccxml/design.html - - + + .. _`Py++` : ./../pyplusplus.html .. _`pygccxml` : ./../../pygccxml/pygccxml.html .. _`Boost.Python`: http://www.boost.org/libs/python/doc/index.html Modified: pyplusplus_dev/docs/documentation/how_to.rest =================================================================== --- pyplusplus_dev/docs/documentation/how_to.rest 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/docs/documentation/how_to.rest 2006-08-21 13:42:15 UTC (rev 429) @@ -20,7 +20,7 @@ :: translate_code = \ - """ + """ void translate(const my_exception &exception){ PyErr_SetString( PyExc_RuntimeError, exception.error().c_str() ); } @@ -48,7 +48,7 @@ mb = module_builder_t( ... ) exception_classes = mb.decls( lambda decl: decl.name.endswith( 'exception' ) ) -Now you can iterate on ``exception_classes``, generate and register translate +Now you can iterate on ``exception_classes``, generate and register translate code for every class. That's all. @@ -64,7 +64,7 @@ ... }; -You can not expose ``get_size`` function as is - ``int`` is immutable type in +You can not expose ``get_size`` function as is - ``int`` is immutable type in Python. So, we need to create a wrapper to the function: :: @@ -81,7 +81,7 @@ ... ; -Now, after you know how this problem is solved. I will show how this solution +Now, after you know how this problem is solved. I will show how this solution could be integrated with `Py++`_. @@ -108,26 +108,25 @@ window.add_wrapper_code( wrapper_code ) window.registration_code( registration_code ) -That's all. +That's all. ------------------------------------------------------------- Fatal error C1204:Compiler limit: internal structure overflow ------------------------------------------------------------- -If you get this error, that the generated file is too big. You will have to split -it to few files. Well, not you but `Py++`_ you will only have to tell that -to it. +If you get this error, than the generated file is too big. You will have to split +it to few files. Well, not you but `Py++`_, you will only have to tell it to do +that. If you are using ``module_builder_t.write_module`` method, consider to switch -to ``module_builder_t.split_module``. +to ``module_builder_t.split_module``. -If you are using ``split_method``, but still generated code for some specific -class could not be compiled because of error, you can ask `Py++`_ to split -class registration code to few cpp files. +If you are using ``split_module``, but still the generated code for some class +could not be compiled, because of the error, you can ask `Py++`_ to split the +code generated for class to be splitted to few cpp files. For more information, please read the documentation. - ------------------------------------------------------ How to automatically export template functions\\class? ------------------------------------------------------ @@ -150,7 +149,7 @@ :: - template <class T> + template <class T> double distance( const point_t<T>& point ){ return sqrt( point.x * point.x + point.y*point.y ); } @@ -167,7 +166,7 @@ * free function invocation causes a compiler to instantiate the function -Lets say that we need to export the class and the function template +Lets say that we need to export the class and the function template instantiations for ``int`` and ``custom_type`` types. There are few ways to do it. Simple and straightforward @@ -191,8 +190,8 @@ } } -Now, you add this file to the list of files you pass as input to -``module_builder_t.__init__`` method and excludes the ``py_details`` namespace +Now, you add this file to the list of files you pass as input to +``module_builder_t.__init__`` method and excludes the ``py_details`` namespace declarations from being exported: :: @@ -203,10 +202,10 @@ "Dynamic" instantiation ----------------------- -Lets say you are less lucky than I, and you have to create ``X`` instantiations +Lets say you are less lucky than I, and you have to create ``X`` instantiations of the class\\function. Obviously, the previous approach will not work for you. -The solution is to build your own code generator, which will generate code similar -to the one, in the previous paragraph. +The solution is to build your own code generator, which will generate code similar +to the one, in the previous paragraph. :: @@ -237,7 +236,7 @@ I understand that the provided solution is not perfect. I understand that something -better and simpler should be done, but a priority of this is low. There are few +better and simpler should be done, but a priority of this is low. There are few tasks, that have much higher priority. Allen Bierbaum wants to fix the situation. He created a `wiki page`_, that discuss possible solutions. Your contribution is welcome too! Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,14 +3,16 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +"""defines class that configure "callable" declaration exposing""" + import os import decl_wrapper from pygccxml import declarations class calldef_t(decl_wrapper.decl_wrapper_t): - + """keeps configur global and member variable exposing""" BOOST_PYTHON_MAX_ARITY = 10 - + def __init__(self, *arguments, **keywords): decl_wrapper.decl_wrapper_t.__init__( self, *arguments, **keywords ) @@ -92,10 +94,10 @@ overridable = property( get_overridable, set_overridable , doc = get_overridable.__doc__ ) - + def _exportable_impl_derived( self ): return '' - + def _exportable_impl( self ): all_types = [ arg.type for arg in self.arguments ] all_types.append( self.return_type ) @@ -117,7 +119,7 @@ no_ptr = declarations.remove_pointer( no_ref ) no_const = declarations.remove_const( no_ptr ) if declarations.is_array( no_const ): - return "Py++ can not expose function that takes as argument/returns C++ arrays. This will be changed in near future." + return "Py++ can not expose function that takes as argument/returns C++ arrays. This will be changed in near future." return self._exportable_impl_derived() def _readme_impl( self ): @@ -136,7 +138,7 @@ tmp.append( "For more information see: http://mail.python.org/pipermail/c++-sig/2002-June/001554.html" ) tmp = ' '.join( tmp ) msgs.append( tmp % ( calldef_t.BOOST_PYTHON_MAX_ARITY, len( self.arguments ) ) ) - + if suspicious_type( self.return_type ) and None is self.call_policies: msgs.append( 'The function "%s" returns non-const reference to C++ fundamental type - value can not be modified from Python.' % str( self ) ) for index, arg in enumerate( self.arguments ): @@ -193,7 +195,7 @@ #dereference does not make sense return False return oper.symbol in operators_helper.all - + @staticmethod def exportable( oper ): if isinstance( oper, declarations.member_operator_t ) and oper.symbol in ( '()', '[]' ): @@ -203,7 +205,7 @@ msg.append( 'See Boost.Python documentation: http://www.boost.org/libs/python/doc/v2/operators.html#introduction.' ) return ' '.join( msg ) return '' - + class member_operator_t( declarations.member_operator_t, calldef_t ): def __init__(self, *arguments, **keywords): declarations.member_operator_t.__init__( self, *arguments, **keywords ) @@ -300,4 +302,4 @@ calldef_t.__init__( self ) def _exportable_impl_derived( self ): - return operators_helper.exportable( self ) \ No newline at end of file + return operators_helper.exportable( self ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,6 +3,9 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +"""defines class that configure class definition and class declaration exposing""" + +import os import user_text import decl_wrapper import scopedef_wrapper @@ -10,7 +13,36 @@ import indexing_suite1 as isuite1 import indexing_suite2 as isuite2 -class class_common_impl_details_t( object ): + +always_expose_using_scope_documentation = \ +"""boolean, configures how Py++ should generate code for class. +Py can generate code using IDL like syntax: + + C{class_< ... >( ... )} + C{.def( ... );} + +Or it can generate code using more complex form: + + C{typedef bp::class_< my_class > my_class_exposer_t;} + C{my_class_exposer_t my_class_exposer = my_class_exposer_t( "my_class" );} + C{boost::python::scope my_class_scope( my_class_exposer );} + C{my_class_exposer.def( ... );} + +Also, the second way is much longer, it solves few problems: + + - you can not expose enums and internal classes defined within the class using first method + - you will get much better compilation errors + - the code looks like regular C++ code after all :-) + +By default, this property is set to False. Also, Py++ knows pretty well +when it have to ignore this property and generate right code +""" + +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 + """ def __init__(self): object.__init__( self ) self._always_expose_using_scope = False @@ -26,18 +58,9 @@ if self._isuite_version != version: self._isuite_version = version self._indexing_suite = None - indexing_suite_version = property( _get_indexing_suite_version, _set_indexing_suite_version ) + indexing_suite_version = property( _get_indexing_suite_version, _set_indexing_suite_version + , doc="indexing suite version") - def _get_always_expose_using_scope( self ): - #I am almost sure this logic should be moved to code_creators - if isinstance( self.indexing_suite, isuite2.indexing_suite2_t ) \ - and ( self.indexing_suite.disable_methods or self.indexing_suite.disabled_methods_groups ): - return True - return self._always_expose_using_scope - 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 ) - def _get_indexing_suite( self ): if self._indexing_suite is None: for container_traits in declarations.all_container_traits: @@ -48,8 +71,21 @@ self._indexing_suite = isuite2.indexing_suite2_t( self, container_traits ) break return self._indexing_suite - indexing_suite = property( _get_indexing_suite ) + indexing_suite = property( _get_indexing_suite + , doc="returns reference to indexing suite configuration class. " \ + +"If the class is not STD container, returns None") + def _get_always_expose_using_scope( self ): + #I am almost sure this logic should be moved to code_creators + if isinstance( self.indexing_suite, isuite2.indexing_suite2_t ) \ + and ( self.indexing_suite.disable_methods or self.indexing_suite.disabled_methods_groups ): + return True + return self._always_expose_using_scope + 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{always_expose_using_scope_documentation} for documentation." ) + def _get_equality_comparable( self ): if None is self._equality_comparable: self._equality_comparable = declarations.has_public_equal( self ) @@ -72,19 +108,19 @@ #this will only be exported if indexing suite is not None and only when needed -class class_declaration_t( class_common_impl_details_t +class class_declaration_t( class_common_details_t , decl_wrapper.decl_wrapper_t , declarations.class_declaration_t ): def __init__(self, *arguments, **keywords): - class_common_impl_details_t.__init__( self ) + class_common_details_t.__init__( self ) declarations.class_declaration_t.__init__(self, *arguments, **keywords ) decl_wrapper.decl_wrapper_t.__init__( self ) -class class_t( class_common_impl_details_t +class class_t( class_common_details_t , scopedef_wrapper.scopedef_t , declarations.class_t): def __init__(self, *arguments, **keywords): - class_common_impl_details_t.__init__( self ) + class_common_details_t.__init__( self ) declarations.class_t.__init__(self, *arguments, **keywords ) scopedef_wrapper.scopedef_t.__init__( self ) @@ -198,4 +234,4 @@ return '' if not self in self.parent.public_members: return 'Py++ can not expose private class.' - return '' \ No newline at end of file + return '' Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,16 +3,13 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +"""defines base class for all classes, that will keep Py++ code generator engine +instructions.""" + import algorithm from pyplusplus import _logging_ from pygccxml import declarations - - -class ERROR_BEHAVIOR: - PRINT = 'print' - RAISE = 'raise' - class decl_wrapper_t(object): """Declaration interface. @@ -22,7 +19,7 @@ this class are never created by the user, instead they are returned by the API. """ - + def __init__(self): object.__init__(self) self._alias = None @@ -30,28 +27,28 @@ self._exportable = None self._exportable_reason = None self._documentation = None - + @property def logger( self ): + """returns reference to L{_logging_.loggers.declarations}""" return _logging_.loggers.declarations def _get_documentation( self ): return self._documentation - def _set_documentation( self, value ): self._documentation = value documentation = property( _get_documentation, _set_documentation - , doc="Using this property you can set documentatio of exported declaration." ) - + , doc="Using this property you can set documentatio of exported declaration." ) + def _generate_valid_name(self, name=None): if name == None: name = self.name return algorithm.create_valid_name( name ) - + def _get_alias(self): if not self._alias: if declarations.templates.is_instantiation( self.name ): - container_aliases = [ 'value_type', 'key_type' ] + container_aliases = [ 'value_type', 'key_type', 'mapped_type' ] if isinstance( self, declarations.class_t ) \ and 1 == len( set( map( lambda typedef: typedef.name, self.aliases ) ) ) \ and self.aliases[0].name not in container_aliases: @@ -61,32 +58,32 @@ else: self._alias = self.name return self._alias - def _set_alias(self, alias): self._alias = alias alias = property( _get_alias, _set_alias , doc="Using this property you can easily change Python name of declaration" ) - + def rename( self, new_name ): + """renames the declaration name, under which it is exposed""" self.alias = new_name - + def _get_ignore( self ): - return self._ignore - + return self._ignore def _set_ignore( self, value ): self._ignore = value ignore = property( _get_ignore, _set_ignore - ,doc="If you set ignore to True then this declaration will not be exported." ) - + ,doc="If you set ignore to True then this declaration will not be exported." ) + def exclude( self ): """Exclude "self" and child declarations from being exposed.""" self.ignore = True - + def include( self ): """Include "self" and child declarations to be exposed.""" self.ignore = False def why_not_exportable( self ): + """returns strings that explains why this declaration could not be exported or None otherwise""" if None is self._exportable_reason: self.get_exportable() return self._exportable_reason @@ -104,16 +101,15 @@ self._exportable_reason = self._exportable_impl( ) self._exportable = not bool( self._exportable_reason ) return self._exportable - def set_exportable( self, exportable ): self._exportable = exportable - + exportable = property( get_exportable, set_exportable , doc="Returns True if declaration could be exported to Python, otherwise False" ) - + def _readme_impl( self ): return [] - + def readme( self ): """This function will returns some hints/tips/description of problems that applied to the declarations. For example function that has argument @@ -123,5 +119,5 @@ text = [] if not self.exportable: text.append( self.why_not_exportable() ) - text.extend( self._readme_impl() ) - return text \ No newline at end of file + text.extend( self._readme_impl() ) + return text Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,6 +3,9 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +"""defines class that will print in a user friendly format declarations tree and +declarations Py++ configuration instructions""" + import os import sys from pygccxml import declarations @@ -11,7 +14,7 @@ """ Helper class for printing decl tree. """ JUSTIFY = 20 INDENT_SIZE = 4 - + def __init__( self, level=0, print_details=True, recursive=True, writer=None ): declarations.decl_printer_t.__init__(self, level, print_details, recursive, writer) @@ -20,42 +23,42 @@ if increment_level: level += 1 return decl_wrapper_printer_t(level, self.print_details, self.recursive, self.writer) - - def print_decl_header(self): + + def print_decl_header(self): super( decl_wrapper_printer_t, self ).print_decl_header() if not self.print_details: - return - intend_txt = ' ' * (self.level+1) * self.INDENT_SIZE + return + intend_txt = ' ' * (self.level+1) * self.INDENT_SIZE self.writer( intend_txt + "Alias: " + self.instance.alias + os.linesep ) self.writer( intend_txt + "Ignore: " + str( self.instance.ignore ) + os.linesep ) if not self.instance.ignore: msgs = self.instance.readme() if msgs: self.writer( intend_txt + "ReadMe: " + os.linesep ) - more_intend_txt = ' ' * (self.level+2) * self.INDENT_SIZE + more_intend_txt = ' ' * (self.level+2) * self.INDENT_SIZE for msg in msgs: self.writer( more_intend_txt + msg + os.linesep ) - + def print_calldef_wrapper(self): if not self.print_details: - return - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + return + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Call policies: " + str(self.instance.call_policies) + os.linesep ) - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Use keywords: " + str(self.instance.use_keywords) + os.linesep ) - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Use signature: " + str(self.instance.create_with_signature) + os.linesep ) - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Use default arguments: " + str(self.instance.use_default_arguments) + os.linesep ) - + def visit_member_function( self ): super( decl_wrapper_printer_t, self ).visit_member_function() self.print_calldef_wrapper() - + def visit_constructor( self ): super( decl_wrapper_printer_t, self ).visit_constructor() self.print_calldef_wrapper() - + def visit_destructor( self ): super( decl_wrapper_printer_t, self ).visit_destructor() self.print_calldef_wrapper() @@ -80,23 +83,23 @@ super( decl_wrapper_printer_t, self ).visit_class_declaration() def visit_class(self ): - super( decl_wrapper_printer_t, self ).visit_class() - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + super( decl_wrapper_printer_t, self ).visit_class() + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Expose using scope: " + str(self.instance.always_expose_using_scope) + os.linesep ) - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Redefine operators: " + str(self.instance.redefine_operators) + os.linesep ) - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Held type: " + str(self.instance.held_type) + os.linesep ) - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Use noncopyable: " + str(self.instance.noncopyable) + os.linesep ) - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Class wrapper alias: " + str(self.instance.wrapper_alias) + os.linesep ) def visit_enumeration(self): super( decl_wrapper_printer_t, self ).visit_enumeration() - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Enumeration value aliases: " + str(self.instance.value_aliases) + os.linesep ) - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Enumeration export values: " + str(self.instance.export_values) + os.linesep ) def visit_namespace(self ): @@ -104,7 +107,7 @@ def visit_typedef(self ): super( decl_wrapper_printer_t, self ).visit_typedef() - + def visit_variable(self ): super( decl_wrapper_printer_t, self ).visit_variable() Modified: pyplusplus_dev/pyplusplus/decl_wrappers/enumeration_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/enumeration_wrapper.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/enumeration_wrapper.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,10 +3,16 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -from pygccxml import declarations +"""defines class that configure enumeration declaration exposing""" + +from pygccxml import declarations import decl_wrapper class enumeration_t(decl_wrapper.decl_wrapper_t, declarations.enumeration_t): + """defines a set of properties, that will instruct Py++ how to expose the enumeration + + By default, Py++ will export all enumeration values. + """ def __init__(self, *arguments, **keywords): declarations.enumeration_t.__init__(self, *arguments, **keywords ) decl_wrapper.decl_wrapper_t.__init__( self ) @@ -48,7 +54,7 @@ if name not in export_values: res.append(name) return res - + def _set_no_export_values(self, no_export_values): all_values = map(lambda x: x[0], self.values) export_values = [] @@ -56,11 +62,11 @@ if name not in no_export_values: export_values.append(name) self.export_values = export_values - + no_export_values = property( _get_no_export_values, _set_export_values, doc= """A list of (C++) enumeration names that should not be exported. @type: list""") - + def _readme_impl( self ): msgs = [] if self.name: @@ -68,5 +74,5 @@ if len( set( name2value.keys() ) ) != len( set( name2value.values() ) ): msgs.append( "Boost.Python does not support enums with duplicate values. " "You can read more about this here: http://boost.org/libs/python/todo.html#support-for-enums-with-duplicate-values . " - "The quick work around is to add new class variable to the exported enum, from Python. " ) + "The quick work around is to add new class variable to the exported enum, from Python. " ) return msgs Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,10 +3,12 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +"""defines interface for exposing STD containers, using current version of indexing suite""" + from pygccxml import declarations #NoProxy -#By default indexed elements have Python reference semantics and are returned by +#By default indexed elements have Python reference semantics and are returned by #proxy. This can be disabled by supplying true in the NoProxy template parameter. #When we want to disable is: #1. We deal with immutable objects: @@ -21,24 +23,24 @@ This class helps user to export STD containers, using Boost.Python indexing suite V2. """ - + def __init__( self, container_class, container_traits, no_proxy=None, derived_policies=None ): object.__init__( self ) self.__no_proxy = no_proxy self.__derived_policies = derived_policies self.__container_class = container_class self.__container_traits = container_traits - + def _get_container_class( self ): return self.__container_class container_class = property( _get_container_class , doc="Reference to STD container class" ) - + def _get_element_type(self): return self.__container_traits.element_type( self.container_class ) - element_type = property( _get_element_type - , doc="Reference to container value_type( mapped_type ) type" ) - + element_type = property( _get_element_type + , doc="Reference to container value_type( mapped_type ) type" ) + def _get_no_proxy( self ): if self.__no_proxy is None: element_type = self.element_type @@ -51,16 +53,15 @@ else: self.__no_proxy = False return self.__no_proxy - + def _set_no_proxy( self, no_proxy ): self.__no_proxy = no_proxy - no_proxy = property( _get_no_proxy, _set_no_proxy , doc="NoProxy value, the initial value depends on container" +" element_type( mapped_type ) type. In most cases, " +"Py++ is able to guess this value, right. If you are not " +"lucky, you will have to set the property value.") - + def _get_derived_policies( self ): return self.__derived_policies def _set_derived_policies( self, derived_policies ): @@ -68,4 +69,3 @@ derived_policies = property( _get_derived_policies, _set_derived_policies , doc="This proprty contains DerivedPolicies string. " +"It will be added as is to the generated code.") - \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-08-21 13:42:15 UTC (rev 429) @@ -2,25 +2,28 @@ # 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) + +"""defines interface for exposing STD containers, using next version of indexing suite""" + from pygccxml import declarations """ -method_len -method_iter -method_getitem -method_getitem_slice -method_index -method_contains -method_count -method_has_key -method_setitem -method_setitem_slice -method_delitem -method_delitem_slice -method_reverse -method_append -method_insert -method_extend +method_len +method_iter +method_getitem +method_getitem_slice +method_index +method_contains +method_count +method_has_key +method_setitem +method_setitem_slice +method_delitem +method_delitem_slice +method_reverse +method_append +method_insert +method_extend method_sort slice_methods = method_getitem_slice | method_setitem_slice | method_delitem_slice @@ -35,14 +38,14 @@ This class helps user to export STD containers, using Boost.Python indexing suite V2. """ - + #List of method names. These method could be excluded from being exposed. METHODS = ( 'len', 'iter', 'getitem', 'getitem_slice', 'index', 'contains' , 'count', 'has_key', 'setitem', 'setitem_slice', 'delitem' , 'delitem_slice', 'reverse', 'append', 'insert', 'extend', 'sort' ) - + #Dictionary of method group names. These method groups could be excluded from - #being exposed. Dictionary key is a method group name. Dictionary value is a + #being exposed. Dictionary key is a method group name. Dictionary value is a #list of all methods, which belong to the group. METHOD_GROUPS = { 'slice' : ( 'method_getitem_slice', 'method_setitem_slice', 'method_delitem_slice' ) @@ -50,7 +53,7 @@ , 'reorder' : ( 'method_sort', 'method_reverse' ) , 'insert' : ( 'method_append', 'method_insert', 'method_extend' ) } - + def __init__( self, container_class, container_traits ): object.__init__( self ) self.__call_policies = None @@ -67,15 +70,15 @@ def _get_container_traits( self ): return self._get_container_traits() - container_traits = property( _get_container_traits + container_traits = property( _get_container_traits , doc="Reference to container traits. See " "pygccxml documentation for STD container traits.") - + def _get_element_type(self): return self.__container_traits.element_type( self.container_class ) element_type = property( _get_element_type - , doc="Reference to container value_type( mapped_type ) type" ) - + , doc="Reference to container value_type( mapped_type ) type" ) + def _get_call_policies( self ): #TODO find out call policies return self.__call_policies @@ -86,26 +89,26 @@ def __apply_defaults_if_needed( self ): if self._default_applied: - return + return self._default_applied = True #find out what operators are supported by element_type and #then configure the _disable_[methods|groups] pass - + def disable_method( self, method_name ): """Disable method from being exposed""" assert method_name in self.METHODS self.__apply_defaults_if_needed() self._disabled_methods.add( method_name ) - + def enable_method( self, method_name ): """Enable method to be exposed""" assert method_name in self.METHODS self.__apply_defaults_if_needed() if method_name in self._disabled_methods: self._disabled_methods.remove( method_name ) - - def _get_disabled_methods( self ): + + def _get_disabled_methods( self ): self.__apply_defaults_if_needed() return self._disabled_methods disable_methods = property( _get_disabled_methods @@ -116,16 +119,16 @@ assert group_name in self.METHOD_GROUPS self.__apply_defaults_if_needed() self._disabled_groups.add( group_name ) - + def enable_methods_group( self, group_name ): """Enable methods group to be exposed""" assert group_name in self.METHOD_GROUPS self.__apply_defaults_if_needed() if group_name in self._disabled_groups: self._disabled_groups.remove( group_name ) - - def _get_disabled_methods_groups( self ): + + def _get_disabled_methods_groups( self ): self.__apply_defaults_if_needed() return self._disabled_groups disabled_methods_groups = property( _get_disabled_methods_groups - , doc="list of all disabled methods group") \ No newline at end of file + , doc="list of all disabled methods group") Modified: pyplusplus_dev/pyplusplus/decl_wrappers/namespace_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/namespace_wrapper.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/namespace_wrapper.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,11 +3,18 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +"""defines class that configure namespace exposing.""" + import scopedef_wrapper from pygccxml import declarations class namespace_t(scopedef_wrapper.scopedef_t, declarations.namespace_t): + """defines a set of properties, that will instruct Py++ how to expose the namespace + + Today, Py++ does not exposes namespaces, but this could be changed in future. + The future direction I see here, is to expose every namespace as sub-module + of the main one. + """ def __init__(self, *arguments, **keywords): scopedef_wrapper.scopedef_t.__init__( self ) declarations.namespace_t.__init__(self, *arguments, **keywords ) - \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/decl_wrappers/scopedef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/scopedef_wrapper.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/scopedef_wrapper.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,15 +3,17 @@ # 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""" + import decl_wrapper -class scopedef_t(decl_wrapper.decl_wrapper_t): +class scopedef_t(decl_wrapper.decl_wrapper_t): + """base class for L{decl_wrappers.class_t} and L{decl_wrappers.namespace_t} classes + + It provides convinience functionality: include\\exclude all internal declarations + (not) to be exported. """ - In C++ there are 2 declarations that can contain definition of other - declarations: class and namespace. This class is used as a base class for both - of them. - """ - + def __init__(self): decl_wrapper.decl_wrapper_t.__init__( self ) @@ -19,7 +21,7 @@ """Exclude "self" and child declarations from being exposed.""" self.ignore = True map( lambda decl: decl.exclude(), self.declarations ) - + def include( self ): """Include "self" and child declarations to be exposed.""" self.ignore = False Modified: pyplusplus_dev/pyplusplus/decl_wrappers/typedef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/typedef_wrapper.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/typedef_wrapper.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,10 +3,19 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -from pygccxml import declarations +"""defines class that configure typedef exposing""" + +from pygccxml import declarations import decl_wrapper class typedef_t(decl_wrapper.decl_wrapper_t, declarations.typedef_t): + """defines a set of properties, that will instruct Py++ how to expose the typedef + + Today, Py++ does not exposes typedefs, but this could be changed in future. + In C++, it is a common practises to give an aliases to the class. May be in + future, Py++ will generate code, that will register all those aliases. + """ + def __init__(self, *arguments, **keywords): declarations.typedef_t.__init__(self, *arguments, **keywords ) - decl_wrapper.decl_wrapper_t.__init__( self ) \ No newline at end of file + decl_wrapper.decl_wrapper_t.__init__( self ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/user_text.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/user_text.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/user_text.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,15 +3,19 @@ # 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" + class user_text_t(object): + "keeps reference to user code that belongs to declaration section" def __init__( self, text ): object.__init__( self ) self.text = text class class_user_text_t( user_text_t ): + "keeps reference to user code that belongs to registration section" def __init__( self, text, works_on_instance=True ): """works_on_instance: If true, the custom code can be applied directly to obj inst. Ex: ObjInst."CustomCode" """ user_text_t.__init__( self, text ) - self.works_on_instance = works_on_instance \ No newline at end of file + self.works_on_instance = works_on_instance Modified: pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-08-21 13:42:15 UTC (rev 429) @@ -3,29 +3,29 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -from pygccxml import declarations +"""defines class that configure global and member variable exposing""" + +from pygccxml import declarations import decl_wrapper class variable_t(decl_wrapper.decl_wrapper_t, declarations.variable_t): - - """This class helps user to expose member and global variables.""" - + """defines a set of properties, that will instruct Py++ how to expose the variable""" def __init__(self, *arguments, **keywords): declarations.variable_t.__init__(self, *arguments, **keywords ) decl_wrapper.decl_wrapper_t.__init__( self ) self._getter_call_policies = None self._setter_call_policies = None - + __call_policies_doc__ = \ - """There are usecase, when exporting member variable forces Py++ to + """There are usecase, when exporting member variable forces Py++ to create accessors functions. Sometime, those functions requires call policies. To be more specific: when you export member variable that has reference or - pointer type, you need to tell boost.python library how to manage object - life-time. In all cases, Py++ will give reasonable default value. I am - sure, that there are use cases, when you need to change it. You should use this - property to change it. + pointer type, you need to tell Boost.Python library how to manage object + life-time. In all cases, Py++ will give reasonable default value. I am + sure, that there are use cases, when you will have to change it. You should + use this property to change it. """ - + def get_getter_call_policies( self ): return self._getter_call_policies def set_getter_call_policies( self, call_policies ): @@ -52,7 +52,7 @@ return "Py++ can not expose static pointer member variables. This could be changed in future." if declarations.is_fundamental( type_.base ): return "Py++ can not expose pointer to fundamental member variables. This could be changed in future." - + units = declarations.decompose_type( type_ ) ptr2functions = filter( lambda unit: isinstance( unit, declarations.calldef_type_t ) , units ) @@ -65,4 +65,3 @@ if not cls.name: return "Py++ can not expose variables of with unnamed type." return '' - \ No newline at end of file Modified: pyplusplus_dev/setup.py =================================================================== --- pyplusplus_dev/setup.py 2006-08-21 08:29:47 UTC (rev 428) +++ pyplusplus_dev/setup.py 2006-08-21 13:42:15 UTC (rev 429) @@ -50,7 +50,7 @@ print "Generating epydoc files..." - docindex = build_doc_index(['Py++', 'pygccxml']) + docindex = build_doc_index(['pyplusplus', 'pygccxml']) html_writer = HTMLWriter( docindex , prj_name='Py++' , prj_url='http://www.language-binding.net' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-03 07:59:30
|
Revision: 506 http://svn.sourceforge.net/pygccxml/?rev=506&view=rev Author: roman_yakovenko Date: 2006-09-03 00:59:17 -0700 (Sun, 03 Sep 2006) Log Message: ----------- adding treatment to unused files Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/__init__.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_builder/builder.py pyplusplus_dev/unittests/algorithms_tester.py Modified: pyplusplus_dev/pyplusplus/file_writers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/__init__.py 2006-09-01 14:32:52 UTC (rev 505) +++ pyplusplus_dev/pyplusplus/file_writers/__init__.py 2006-09-03 07:59:17 UTC (rev 506) @@ -9,9 +9,9 @@ Right now 3 strategies were implemented: 1. All code is written in one file - + 2. Classic strategy of deviding classes to files: one class in one header + source files. - + 2.1 Huge classes are splitten to few source files. """ @@ -29,13 +29,15 @@ else: sf = single_file_t( data, file_path ) sf.write() - + def write_multiple_files( extmodule, dir_path ): """writes extmodule to multiple files""" mfs = multiple_files_t( extmodule, dir_path ) mfs.write() - + return mfs.written_files + def write_class_multiple_files( extmodule, dir_path, huge_classes ): """writes extmodule to multiple files and splits huge classes to few source files""" mfs = class_multiple_files_t( extmodule, dir_path, huge_classes ) - mfs.write() + mfs.write() + return mfs.written_files Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-01 14:32:52 UTC (rev 505) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-03 07:59:17 UTC (rev 506) @@ -16,7 +16,7 @@ """ This class implements classic strategy of deviding classes to files one class in one header + source files. - """ + """ HEADER_EXT = '.pypp.hpp' SOURCE_EXT = '.pypp.cpp' @@ -27,9 +27,9 @@ @type extmodule: module_t @param directory_path: The output directory where the source files are written @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 it is 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) @@ -39,8 +39,13 @@ self.split_header_names = [] # List of include file names for split files self.split_method_names = [] # List of methods from the split files self.write_main = write_main + self.written_files = [] - + + def write_file( self, fpath, content ): + self.written_files.append( fpath ) + writer.writer_t.write_file( fpath, content ) + def create_dir( self, directory_path ): """Create the output directory if it doesn't already exist. """ @@ -76,7 +81,7 @@ , "%(code)s" , '' , "#endif//__%(file_name)s_hpp__pyplusplus_wrapper__" ]) - + content = '' if self.extmodule.license: content = self.extmodule.license.create() + os.linesep @@ -117,19 +122,19 @@ includes = filter( lambda creator: isinstance( creator, code_creators.include_t ) , self.extmodule.creators ) answer.extend( map( lambda creator: creator.create(), includes ) ) - + for creator in creators: header = self.find_out_value_traits_header( creator ) if header: answer.append( '#include "%s"' % header ) - + if tail_headers: answer.extend( map( lambda header: '#include "%s"' % normalize( header ) , tail_headers ) ) - + return os.linesep.join( answer ) - - def create_namespaces_code( self, creators ): + + def create_namespaces_code( self, creators ): # Write all 'global' namespace_alias_t and namespace_using_t creators first... ns_types = ( code_creators.namespace_alias_t, code_creators.namespace_using_t ) ns_creators = filter( lambda x: isinstance( x, ns_types ), self.extmodule.creators ) @@ -152,15 +157,15 @@ @returns: The content for a cpp file @rtype: str """ - + if None is declaration_creators: declaration_creators = [] creators = registration_creators + declaration_creators - + answer = [] if self.extmodule.license: answer.append( self.extmodule.license.create() ) - + head_headers = [ file_name + self.HEADER_EXT ] answer.append( self.create_include_code( creators, head_headers ) ) @@ -182,7 +187,7 @@ answer.append( '' ) answer.append( '}' ) return os.linesep.join( answer ) - + def split_class_impl( self, class_creator): function_name = 'register_%s_class' % class_creator.alias file_path = os.path.join( self.directory_path, class_creator.alias ) @@ -198,7 +203,7 @@ if class_creator.wrapper: class_wrapper = class_creator.wrapper decl_creators.append( class_creator.wrapper ) - + # Write the .cpp file... cpp_code = self.create_source( class_creator.alias , function_name @@ -239,7 +244,7 @@ Write the value_traits class to header file, that will be included from files, that uses indexing suite 2 """ - header_name = self.create_value_traits_header_name( value_traits.declaration ) + header_name = self.create_value_traits_header_name( value_traits.declaration ) file_path = os.path.join( self.directory_path, header_name ) self.write_file( file_path , self.create_header( header_name.replace( '.', '_' ) @@ -271,10 +276,10 @@ , creators )) for creator in creators: creator.create = lambda: '' - self.extmodule.body.adopt_creator( + self.extmodule.body.adopt_creator( code_creators.custom_text_t( function_name + '();' ) , registrator_pos) - self.include_creators.append( code_creators.include_t( header_name ) ) + self.include_creators.append( code_creators.include_t( header_name ) ) self.split_header_names.append(header_name) self.split_method_names.append(function_name) @@ -320,20 +325,20 @@ value_traits_classes = filter( lambda x: isinstance(x, code_creators.value_traits_t ) , self.extmodule.creators ) map( self.split_value_traits, value_traits_classes ) - + # Obtain a list of all class creators... class_creators = filter( lambda x: isinstance(x, ( code_creators.class_t, code_creators.class_declaration_t ) ) , self.extmodule.body.creators ) # ...and write a .h/.cpp file for each class map( self.split_class, class_creators ) - + self.split_enums() self.split_global_variables() self.split_free_functions() - + if self.write_main: self.include_creators.sort( cmp=lambda ic1, ic2: cmp( ic1.header, ic2.header ) ) map( lambda creator: self.extmodule.adopt_include( creator ) , self.include_creators ) main_cpp = os.path.join( self.directory_path, self.extmodule.body.name + '.main.cpp' ) - self.write_file( main_cpp, self.extmodule.create() + os.linesep ) \ No newline at end of file + self.write_file( main_cpp, self.extmodule.create() + os.linesep ) Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-09-01 14:32:52 UTC (rev 505) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-09-03 07:59:17 UTC (rev 506) @@ -292,7 +292,7 @@ self.__merge_user_code() file_writers.write_file( self.code_creator, file_name ) - def split_module(self, dir_name, huge_classes=None): + def split_module(self, dir_name, huge_classes=None, on_unused_file_found=os.remove): """ Writes module to multiple files @@ -300,13 +300,34 @@ @type dir_name: string @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 """ self.__merge_user_code() + written_files = [] if None is huge_classes: - file_writers.write_multiple_files( self.code_creator, dir_name ) + written_files = file_writers.write_multiple_files( self.code_creator, dir_name ) else: - file_writers.write_class_multiple_files( self.code_creator, dir_name, huge_classes ) + written_files = file_writers.write_class_multiple_files( self.code_creator, dir_name, huge_classes ) + all_files = os.listdir( dir_name ) + all_files = map( lambda fname: os.path.join( dir_name, fname ), all_files ) + all_files = filter( lambda fname: os.path.isfile( fname ) \ + and os.path.splitext( fname )[1] in ( '.cpp', '.hpp' ) + , all_files ) + + unused_files = set( all_files ).difference( set( written_files ) ) + for fpath in unused_files: + try: + if on_unused_file_found is os.remove: + self.logger.info( 'removing file "%s"' % fpath ) + on_unused_file_found( fpath ) + except Exception, error: + self.logger.exception( "Exception was catched, while executing 'on_unused_file_found' function." ) + + return written_files + #select decl(s) interfaces def decl( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ): """Please see L{decl_wrappers.scopedef_t} class documentation""" @@ -561,4 +582,4 @@ return decl_wrappers.calldef_t.BOOST_PYTHON_MAX_ARITY def _set_BOOST_PYTHON_MAX_ARITY( self, value ): decl_wrappers.calldef_t.BOOST_PYTHON_MAX_ARITY = value - BOOST_PYTHON_MAX_ARITY = property( _get_BOOST_PYTHON_MAX_ARITY, _set_BOOST_PYTHON_MAX_ARITY ) \ No newline at end of file + BOOST_PYTHON_MAX_ARITY = property( _get_BOOST_PYTHON_MAX_ARITY, _set_BOOST_PYTHON_MAX_ARITY ) Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2006-09-01 14:32:52 UTC (rev 505) +++ pyplusplus_dev/unittests/algorithms_tester.py 2006-09-03 07:59:17 UTC (rev 506) @@ -9,7 +9,7 @@ import autoconfig from pygccxml import parser from pygccxml import declarations -from pyplusplus import code_creators +from pyplusplus import code_creators from pyplusplus import module_creator from pyplusplus import module_builder from pyplusplus import utils as pypp_utils @@ -21,7 +21,7 @@ class make_flatten_tester_t(unittest.TestCase): def test(self): - mb = module_builder.module_builder_t( + mb = module_builder.module_builder_t( [ module_builder.create_text_fc( 'namespace enums{ enum { OK=1 }; }' ) ] , gccxml_path=autoconfig.gccxml.executable ) mb.namespace( name='::enums' ).include() @@ -31,24 +31,24 @@ class creator_finder_tester_t( unittest.TestCase ): def test_find_by_declaration(self): - mb = module_builder.module_builder_t( + mb = module_builder.module_builder_t( [ module_builder.create_text_fc( 'namespace enums{ enum color{ red = 1}; }' )] , gccxml_path=autoconfig.gccxml.executable ) mb.namespace( name='::enums' ).include() - enum_matcher = declarations.match_declaration_t( name='color' ) + enum_matcher = declarations.match_declaration_t( name='color' ) mb.build_code_creator( 'dummy' ) - enum_found = code_creators.creator_finder.find_by_declaration( + enum_found = code_creators.creator_finder.find_by_declaration( enum_matcher , mb.code_creator.creators ) self.failUnless( enum_found ) def test_find_by_class_instance(self): - mb = module_builder.module_builder_t( + mb = module_builder.module_builder_t( [ module_builder.create_text_fc( 'namespace enums{ enum color{ red = 1}; }' )] , gccxml_path=autoconfig.gccxml.executable ) mb.namespace( name='::enums' ).include() mb.build_code_creator('dummy') - enum_found = code_creators.creator_finder.find_by_class_instance( + enum_found = code_creators.creator_finder.find_by_class_instance( code_creators.enum_t , mb.code_creator.creators , recursive=True) @@ -64,14 +64,14 @@ answer.append( base.related_class ) answer.extend( self._findout_base_classes( base.related_class ) ) return answer - + def test(self): config = parser.config_t( gccxml_path=autoconfig.gccxml.executable ) code = [] code.append('struct a{};') code.append('struct b{};') code.append('struct c{};') - code.append('struct d : public a{};') + code.append('struct d : public a{};') code.append('struct e : public a, public b{};') code.append('struct f{};') code.append('struct g : public d, public f{};') @@ -92,7 +92,7 @@ class exclude_function_with_array_arg_tester_t( unittest.TestCase ): def test(self): - mb = module_builder.module_builder_t( + mb = module_builder.module_builder_t( [ module_builder.create_text_fc( 'namespace arr{ struct x{ x( int arr[3][3], int ){} x( const x arr[3][3], int ){} }; }' )] , gccxml_path=autoconfig.gccxml.executable ) arr = mb.namespace( name='arr' ) @@ -103,8 +103,8 @@ class readme_tester_t( unittest.TestCase ): CODE = \ """ - namespace xxx{ - int do_smth(int); + namespace xxx{ + int do_smth(int); typedef int Int; struct data_t{ data_t& operator--(int a); @@ -112,7 +112,7 @@ } """ def test(self): - mb = module_builder.module_builder_t( + mb = module_builder.module_builder_t( [ module_builder.create_text_fc( self.CODE )] , gccxml_path=autoconfig.gccxml.executable ) xxx = mb.namespace( name='xxx' ) @@ -128,27 +128,29 @@ struct X{ enum EColor{ red, blue }; enum EFruit{ apple, orange }; - + X(){} X( int ){} - + void do_nothing(){} - + int do_somghing(){ return 1; } - - int m_dummy; + + int m_dummy; }; } """ def test(self): - mb = module_builder.module_builder_t( + mb = module_builder.module_builder_t( [ module_builder.create_text_fc( self.CLASS_DEF ) ] , gccxml_path=autoconfig.gccxml.executable ) mb.namespace( name='::tester' ).include() X = mb.class_( 'X' ) X.add_declaration_code( '//hello world' ) mb.build_code_creator('dummy') - mb.split_module( autoconfig.build_dir, [ mb.class_( '::tester::X' ) ] ) + mb.split_module( autoconfig.build_dir + , [ mb.class_( '::tester::X' ) ] + , on_unused_file_found=lambda fpath: fpath ) class split_sequence_tester_t(unittest.TestCase): @@ -161,7 +163,7 @@ self.failUnless( [[1,2,3]] == split( seq, 4 ) ) def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(class_organizer_tester_t)) suite.addTest( unittest.makeSuite(indent_tester_t)) suite.addTest( unittest.makeSuite(make_flatten_tester_t)) @@ -170,12 +172,12 @@ suite.addTest( unittest.makeSuite(class_multiple_files_tester_t)) suite.addTest( unittest.makeSuite(readme_tester_t)) suite.addTest( unittest.makeSuite(split_sequence_tester_t)) - - + + return suite def run_suite(): unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mb...@us...> - 2006-09-03 09:32:00
|
Revision: 507 http://svn.sourceforge.net/pygccxml/?rev=507&view=rev Author: mbaas Date: 2006-09-03 02:31:45 -0700 (Sun, 03 Sep 2006) Log Message: ----------- Added the 'function_transformers' sub-package. Modified Paths: -------------- pyplusplus_dev/setup.py Added Paths: ----------- pyplusplus_dev/pyplusplus/function_transformers/ pyplusplus_dev/pyplusplus/function_transformers/__init__.py pyplusplus_dev/pyplusplus/function_transformers/arg_policies.py pyplusplus_dev/pyplusplus/function_transformers/code_manager.py pyplusplus_dev/pyplusplus/function_transformers/function_transformer.py pyplusplus_dev/pyplusplus/function_transformers/subst.py pyplusplus_dev/pyplusplus/function_transformers/substitution_manager.py Added: pyplusplus_dev/pyplusplus/function_transformers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/__init__.py (rev 0) +++ pyplusplus_dev/pyplusplus/function_transformers/__init__.py 2006-09-03 09:31:45 UTC (rev 507) @@ -0,0 +1,21 @@ +# Helper classes for wrapper function creation + +"""This sub-package provides text substitution services for creating C++ functions. + +The helper classes in this package are meant to be used by the actual +calldef code creators (that are not part of this sub-package). They +implement the core of the "arg policy" mechanism which can be used by +a user to modify the source code for a function. + +The main class of this sub-package is the class L{substitution_manager_t}. This +class maintains two sets of special variables, one for the wrapper function +and one for the virtual function, and provides text substitution services. +The variables contain parts of source code that can be inserted into the +function source code template which is generated by the user of the class. + + +""" + +from substitution_manager import substitution_manager_t +from function_transformer import function_transformer_t + Property changes on: pyplusplus_dev/pyplusplus/function_transformers/__init__.py ___________________________________________________________________ Name: svn:eol-style + native Added: pyplusplus_dev/pyplusplus/function_transformers/arg_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/arg_policies.py (rev 0) +++ pyplusplus_dev/pyplusplus/function_transformers/arg_policies.py 2006-09-03 09:31:45 UTC (rev 507) @@ -0,0 +1,70 @@ +# Copyright 2006 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) +# +# Initial author: Matthias Baas + +"""This module contains standard argument policy objects. +""" + +from pygccxml import declarations + +# Output +class Output: + """Handles a single output variable. + + The specified variable is removed from the argument list and is turned + into a return value. + + void getValue(int& v) -> v = getValue() + """ + + def __init__(self, idx): + """Constructor. + + The specified argument must be a reference or a pointer. + + @param idx: Index of the argument that is an output value (the first arg has index 1). + @type idx: int + """ + self.idx = idx + self.localvar = "<not initialized>" + + def __str__(self): + return "Output(%d)"%(self.idx) + + def init_funcs(self, sm): + # Remove the specified output argument from the wrapper function + arg = sm.remove_arg(self.idx) + + # Do some sanity checking (whether the argument can actually be + # an output argument, i.e. it has to be a reference or a pointer) + reftype = arg.type + if not (isinstance(reftype, declarations.reference_t) or + isinstance(reftype, declarations.pointer_t)): + raise ValueError, 'Output variable %d ("%s") must be a reference or a pointer (got %s)'%(self.idx, arg.name, arg.type) + + # Declare a local variable that will receive the output value + self.localvar = sm.wrapperfunc.declare_local(arg.name, str(reftype.base)) + # Append the output to the result tuple + sm.wrapperfunc.resultexprs.append(self.localvar) + + # Replace the expression in the C++ function call + if isinstance(reftype, declarations.pointer_t): + sm.wrapperfunc.inputparams[self.idx-1] = "&%s"%self.localvar + else: + sm.wrapperfunc.inputparams[self.idx-1] = self.localvar + + + def virtual_post_call(self, sm): + """Extract the C++ value after the call to the Python function. + """ + arg = sm.virtualfunc.arglist[self.idx-1] + res = "// Extract the C++ value for output argument '%s' (index: %d)\n"%(arg.name, self.idx) + if isinstance(arg.type, declarations.pointer_t): + res += "*" + res += "%s = boost::python::extract<%s>(%s[%d]);"%(arg.name, arg.type.base, sm.virtualfunc.resultvar, sm.wrapperfunc.resultexprs.index(self.localvar)) + return res + + Property changes on: pyplusplus_dev/pyplusplus/function_transformers/arg_policies.py ___________________________________________________________________ Name: svn:eol-style + native Added: pyplusplus_dev/pyplusplus/function_transformers/code_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/code_manager.py (rev 0) +++ pyplusplus_dev/pyplusplus/function_transformers/code_manager.py 2006-09-03 09:31:45 UTC (rev 507) @@ -0,0 +1,267 @@ +# Copyright 2006 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) +# +# Initial author: Matthias Baas + +"""This module contains the L{code_manager_t} and L{wrapper_code_manager_t} classes. +""" + +import types +from subst import subst_t + +# code_manager_t +class code_manager_t(subst_t): + """This class manages pieces of source code for a C++ function. + + The class mainly provides the interface for the code blocks to + manipulate a function and stores the actual substitution variables. + Each function has its own code manager instance. + + A code block can declare a local variable using L{declare_local()} + and it can manipulate one of the attributes that are used to + initialize the final variables (see the documentation of the + instance variables below). The final variables (such as RETTYPE, + FUNCNAME, ARGLIST, etc.) are stored as regular attributes of the + object. + + The functionality to perform a text substitution (using the + substitution() method) is inherited + from the class L{subst_t}. + + @ivar classname: The name of the class of which the generated function is a member. A value of None or an empty string is used for free functions. This attribute is used for creating the CLASSSPEC variable. + @type classname: str + @ivar rettype: Return type. The value may be any object where str(obj) is valid C++ code. The value None corresponds to void. This will be the value of the variable RETTYPE. + @type rettype: str + @ivar arglist: The argument list. The items are pygccxml argument_t objects. This list will appear in the variables ARGLIST, ARGLISTDEF and ARGLISTTYPES. + @type arglist: list of argument_t + @ivar inputparams: A list of strings that contain the input parameter for the function call. This list is used for the INPUTPARAMS variable. + @type inputparams: list of str + @ivar resultvar: The name of the variable that will receive the result of the function call. If None, the return value is ignored. This attribute will be used for the variable RESULTVARASSIGNMENT. + @type resultvar: str + @ivar resultexpr: A string containing the expression that will be put after the "return" statement. This expression is used for the variable RETURNSTMT. + @type resultexpr: str + + @author: Matthias Baas + """ + + def __init__(self): + """Constructor. + """ + subst_t.__init__(self, blockvars=["DECLARATIONS", + "PRECALL", + "POSTCALL"]) + + # The name of the class of which the generated function is a member + # (pass None or an empty string if the function is a free function) + self.classname = None + + # Return type (the value may be any object where str(obj) is valid + # C++ code. The value None corresponds to "void"). + self.rettype = None + # The argument list. The items are argument_t objects. + self.arglist = [] + + # A list of strings that contain the input parameter for the + # function call + self.inputparams = [] + + # The name of the variable that will receive the result of the + # function call. If None, the return value is ignored. + self.resultvar = None + + # A string containing the expression that will be put after + # the "return" statement. + self.resultexpr = None + + # Key:Variable name / Value:(type,size,default) + self._declared_vars = {} + # A list with variable tuples: (name, type, size, default) + self._local_var_list = [] + + # declare_local + def declare_local(self, name, type, size=None, default=None): + """Declare a local variable and return its final name. + + @param name: The desired variable name + @type name: str + @param type: The type of the variable (must be valid C++ code) + @type type: str + @param size: The array length or None + @type size: int + @param default: The default value (must be valid C++ code) or None + @type default: str + @return: The assigned variable name (which is guaranteed to be unique) + @rtype: str + """ + name = self._make_name_unique(name) + self._declared_vars[name] = (type,size,default) + self._local_var_list.append((name, type, size, default)) + return name + + def is_defined(self, name): + """Check if a variable name is already in use. + + The method returns True if name is the name of an argument or of + a local variable. + + @rtype: bool + """ + if name in self._declared_vars: + return True + if filter(lambda a: a.name==name, self.arglist): + return True + return False + + def local_type_str(self, name): + """Return the type of a local variable. + + An exception is raised if a variable called name does not exist. + + @return: Returns the type of the specified local variable. + @rtype: str + """ + if name not in self._declared_vars: + raise ValueError, 'Local variable "%s" not found.'%name + + type,size,default = self._declared_vars[name] + + if size==None: + return type + else: + return "*%s"%type + + def init_variables(self): + """Initialize the substitution variables. + + Based on the (lowercase) attributes, the final (uppercase) + variables are created. Those variables are regular string + attributes. + """ + + # CLASSSPEC + if (self.classname in [None, ""]): + self.CLASSSPEC = "" + else: + self.CLASSSPEC = "%s::"%self.classname + + # RETTYPE + if self.rettype==None: + self.RETTYPE = "void" + else: + self.RETTYPE = str(self.rettype) + + # ARGLISTDEF + args = map(lambda a: str(a), self.arglist) + self.ARGLISTDEF = ", ".join(args) + + # ARGLIST + args = map(lambda s: s.split("=")[0], args) + self.ARGLIST = ", ".join(args) + + # ARGLISTTYPES + args = map(lambda a: str(a.type), self.arglist) + self.ARGLISTTYPES = ", ".join(args) + + # Create the declaration block -> DECLARATIONS + vardecls = [] + for varname,type,size,default in self._local_var_list: + if default==None: + vd = "%s %s"%(type, varname) + else: + vd = "%s %s = %s"%(type, varname, default) + if size!=None: + vd += "[%d]"%size + vardecls.append(vd+";") + self.DECLARATIONS = "\n".join(vardecls) + + # RESULTVARASSIGNMENT + if self.resultvar!=None: + self.RESULTVARASSIGNMENT = "%s = "%self.resultvar + + # INPUTPARAMS + self.INPUTPARAMS = ", ".join(self.inputparams) + + # RETURNSTMT + if self.resultexpr!=None: + self.RETURNSTMT = "return %s;"%self.resultexpr + + # _make_name_unique + def _make_name_unique(self, name): + """Make a variable name unique so that there's no clash with other names. + + @param name: The variable name that should be unique + @type name: str + @return: A unique name based on the input name + @rtype: str + """ + if not self.is_defined(name): + return name + + n = 2 + while 1: + newname = "%s_%d"%(name, n) + if not self.is_defined(newname): + return newname + n += 1 + + +# wrapper_code_manager_t +class wrapper_code_manager_t(code_manager_t): + """The CodeManager class for the wrapper function. + + In contrast to a regular C++ function a Python function can return + several values, so this class provides the extra attribute "resultexprs" + which is a list of individual expressions. Apart from that this + class is identical to L{code_manager_t}. + + @ivar resultexprs: Similar to resultexpr but this list variable can contain more than just one result. The items can be either strings containing the variable names (or expressions) that should be returned or it can be an argument_t object (usually from the argument list of the virtual function) whose name attribute will be used. This attribute only exists on the code manager for the wrapper function (the virtual function cannot return several values, use resultexpr instead). + @type resultexprs: list of str or argument_t + """ + + def __init__(self): + """Constructor. + """ + code_manager_t.__init__(self) + + # Similar to resultexpr but now there can be more than just one result + # The items can be either strings containing the variable names (or + # expressions) that should be returned or it can be an argument_t + # object (usually from the argument list of the virtual function) + # whose name attribute will be used. + self.resultexprs = [] + + def init_variables(self): + """Initialize the substitution variables. + """ + + # Prepare the variables for RETTYPE and RETURNSTMT... + + # Convert all items into strings + resultexprs = [] + for re in self.resultexprs: + # String? + if isinstance(re, types.StringTypes): + resultexprs.append(re) + # argument_t + else: + resultexprs.append(re.name) + + # No output values? + if len(resultexprs)==0: + self.rettype = None + self.resultexpr = None + # Exactly one output value? + elif len(resultexprs)==1: + self.rettype = "boost::python::object" + self.resultexpr = "boost::python::object(%s)"%resultexprs[0] + # More than one output value... + else: + self.rettype = "boost::python::object" + self.resultexpr = "boost::python::make_tuple(%s)"%(", ".join(resultexprs)) + + # Invoke the inherited method that sets the actual variables + code_manager_t.init_variables(self) + + Property changes on: pyplusplus_dev/pyplusplus/function_transformers/code_manager.py ___________________________________________________________________ Name: svn:eol-style + native Added: pyplusplus_dev/pyplusplus/function_transformers/function_transformer.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/function_transformer.py (rev 0) +++ pyplusplus_dev/pyplusplus/function_transformers/function_transformer.py 2006-09-03 09:31:45 UTC (rev 507) @@ -0,0 +1,109 @@ +# Copyright 2006 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) +# +# Initial author: Matthias Baas + +"""This module contains the class L{function_transformer_t}. +""" + +import sys, os.path, copy, re, types +from pygccxml import declarations, parser + + +# function_transformer_t +class function_transformer_t: + """Base class for a function transformer. + + This class specifies the interface that a user written transformer + has to implement. It doesn't contain any actual functionality so + a user doesn't have to derive from this class. Methods that are not + implemented are treated as if they would do nothing and return None. + + @author: Matthias Baas + """ + + def __init__(self): + """Constructor. + """ + pass + + def init_funcs(self, sm): + """Wrapper initialization. + + This method is called before the actual wrapper source code is + generated. This is the place where you can modify the signature + of the C++ wrapper function or allocate local variables. + + @param sm: Substitution manager instance + @type sm: substitution_manager_t + """ + pass + + def wrapper_pre_call(self, sm): + """Generate the C++ code that should be executed before the actual function call. + + The code from this method will be put into the wrapper function. + + @param sm: Substitution manager instance + @type sm: substitution_manager_t + @return: C++ code or None + @rtype: str + """ + pass + + def wrapper_post_call(self, sm): + """Generate the C++ code that should be executed after the actual function call. + + The code from this method will be put into the wrapper function. + + @param sm: Substitution manager instance + @type sm: substitution_manager_t + @return: C++ code or None + @rtype: str + """ + pass + + def wrapper_cleanup(self, sm): + """Generate code that should be executed in the case of an error. + + This method has to assume that the preCall code was executed but + the postCall code won't be executed because something went wrong. + + <not used yet> + + @param sm: Substitution manager instance + @type sm: substitution_manager_t + @return: C++ code or None + @rtype: str + """ + pass + + def virtual_pre_call(self, sm): + """Generate the C++ code that should be executed before the actual function call. + + The code from this method will be put into the virtual function. + + @param sm: Substitution manager instance + @type sm: substitution_manager_t + @return: C++ code or None + @rtype: str + """ + pass + + def virtual_post_call(self, sm): + """Generate the C++ code that should be executed after the actual function call. + + The code from this method will be put into the virtual function. + + @param sm: Substitution manager instance + @type sm: substitution_manager_t + @return: C++ code or None + @rtype: str + """ + pass + + def virtual_cleanup(self, sm): + pass + Property changes on: pyplusplus_dev/pyplusplus/function_transformers/function_transformer.py ___________________________________________________________________ Name: svn:eol-style + native Added: pyplusplus_dev/pyplusplus/function_transformers/subst.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/subst.py (rev 0) +++ pyplusplus_dev/pyplusplus/function_transformers/subst.py 2006-09-03 09:31:45 UTC (rev 507) @@ -0,0 +1,149 @@ +# Copyright 2006 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) +# +# Initial author: Matthias Baas + +"""This module contains the base class L{subst_t}. +""" + +import re + +# subst_t +class subst_t: + """Perform text substitutions. + + This class performs text substitutions on a template string. The + variables are simply stored as attributes inside the class and may + be of any type that can be converted to a string. An empty string + is used if a template string references a variable that does not + exist. + + Example:: + + sm = subst_t(blockvars=['BODY']) + sm.RETURNTYPE = 'int' + sm.FUNCNAME = 'foo' + sm.ARGLIST = 'int n' + sm.BODY = '''int res=0; + for(int i=0; i<n; i++) + { + res += n; + } + return res;''' + + template = ''' + $RETURNTYPE $FUNCNAME($ARGLIST) + { + $BODY + } + ''' + + print sm.substitute(template) + + The result of the substitution will be:: + + int foo(int n) + { + int res=0; + for(int i=0; i<n; i++) + { + res += n; + } + return res; + } + + The variable BODY is a block variable which means it may contain + an entire block of text where each line should be indented with + the same depth as the variable in the template string. The value + of BODY should not contain an already indented block. + + @author: Matthias Baas + """ + + def __init__(self, blockvars): + """Constructor. + + The argument blockvars is used to declare the names of those + variables that may contain a block of code (i.e. multiple lines). + + @param blockvars: A list of block variable names. + @type blockvars: list of str + """ + self._blockvars = dict(map(lambda x: (x,0), blockvars)) + + def substitute(self, template): + """Substitute the variables in template and return the result. + + All variables of the form "$<varname>" are replaced with the + corresponding attribute <varname>. Block variables must appear + in one single line. The indendation of the variable determines + the indendation of the entire block. + Unknown variables will be substituted with an empty string. + + @param template: The template string + @type template: str + @return: Returns the input string where all variables have been substituted. + @rtype: str + """ + + lines = [] + # Replace the block variables... + for line in template.split("\n"): + s = line.lstrip() + # Determine the indendation depth + depth = len(line)-len(s) + key = s.rstrip() + if key!="" and key[0]=="$" and key[1:] in self._blockvars: + block = getattr(self, key[1:], None) + if block==None or block=="": + line = None + else: + line = self._indent(depth, block) + else: + line = line.rstrip() + if line!=None and (line!="" or (lines!=[] and lines[-1]!="")): + lines.append(line) + code = "\n".join(lines) + + # Replace the non-block variables... + varexpr = re.compile("\$[a-zA-Z_]+") + while 1: + m = varexpr.search(code) + if m==None: + break + s = m.start() + e = m.end() + key = code[s+1:e] + code = "%s%s%s"%(code[:s], getattr(self, key, ""), code[e:]) + + # Replace trailing blanks on each line... + expr = re.compile("[ ]+$", re.MULTILINE) + code = expr.sub("", code) + + # Replace two subsequent empty lines with one single line... + expr = re.compile("^\n^\n", re.MULTILINE) + n1 = len(code) + while 1: + code = expr.sub("\n", code) + n2 = len(code) + if n2==n1: + break + n1 = n2 + + # Remove blank lines right after '{' or before '}' + code = code.replace("{\n\n", "{\n") + code = code.replace("\n\n}", "\n}") + + return code + + # _indent + def _indent(self, n, code): + """Indent source code. + """ + if code=="": + return "" + return "\n".join(map(lambda s: ((n*" ")+s).rstrip(), code.split("\n"))) + + Property changes on: pyplusplus_dev/pyplusplus/function_transformers/subst.py ___________________________________________________________________ Name: svn:eol-style + native Added: pyplusplus_dev/pyplusplus/function_transformers/substitution_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/substitution_manager.py (rev 0) +++ pyplusplus_dev/pyplusplus/function_transformers/substitution_manager.py 2006-09-03 09:31:45 UTC (rev 507) @@ -0,0 +1,554 @@ +# Copyright 2006 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) +# +# Initial author: Matthias Baas + +"""This module contains the L{substitution_manager_t} class. +""" + +from pygccxml import declarations +from code_manager import code_manager_t, wrapper_code_manager_t +from function_transformer import function_transformer_t + +# substitution_manager_t +class substitution_manager_t: + """Helper class for creating C++ source code for wrapper functions. + + The class does not create the entire function source code itself + but it maintains the individual parts that can be composed by the + user of the class. Those individual parts are stored inside + variables which can be used to perform text substitutions. + + Doing substitutions + =================== + + Here is an example that demonstrates the usage of the class. The + user creates a template string that contains the layout of the + entire wrapper function. Such a template string may look like + this:: + + $RETTYPE $CLASSSPEC$FUNCNAME($ARGLIST) + { + $DECLARATIONS + + $PRECALL + + $RESULTVARASSIGNMENT$CALLFUNCNAME($INPUTPARAMS); + + $POSTCALL + + $RETURNSTMT + } + + Any part of the function that is not fixed, i.e. that can be + modified by argument policies, is specified via a variable. The + substitution manager can now be used to substitute the variables with + their actual value. There are actually two sets of identical + variables, one for the wrapper function and one for the virtual + function. You choose a set either by using the L{subst_wrapper()} or + L{subst_virtual()} method for doing the substitution. For example, + performing a "wrapper" substitution on the above template string + might result in the following code:: + + boost::python::object Spam_wrapper::foo_wrapper(Spam& self, int mode) + { + int result; + int w; + int h; + + result = self.foo(w, &h, mode); + + return boost::python::make_tuple(result, w, h); + } + + In this example, the individual variables have the following values: + + - RETTYPE = C{boost::python::object} + - CLASSSPEC = C{Spam_wrapper::} + - FUNCNAME = C{foo_wrapper} + - ARGLIST = C{Spam& self, int mode} + - DECLARATIONS = C{int result;\\nint w;\\nint h;} + - PRECALL = <empty> + - RESULTVARASSIGNMENT = C{result =} + - CALLFUNCNAME = C{self.foo} + - INPUTPARAMS = C{w, &h, mode} + - POSTCALL = <empty> + - RETURNSTMT = C{return boost::python::make_tuple(result, w, h);} + + + Modifying the variables + ======================= + + In addition to the actual user of the class (who wants to do text + substitutions), the class is also used by the arg policies (code blocks) + to modify the variables. + There are two attributes L{wrapperfunc} and L{virtualfunc} that are + used to modify either the wrapper or the virtual function. If the + signature of the wrapper needs modification this should be done via + the methods L{remove_arg()} and L{insert_arg()} and not via the + wrapperfunc or virtualfunc attributes because this affects the + virtual function as well (because the virtual function makes a call + to the Python function). + + Variables + ========= + + + - RETTYPE: The return type (e.g. "void", "int", "boost::python::object") + + - CLASSSPEC: "<classname>::" or empty + + - FUNCNAME: The name of the wrapper or virtual function. + + - ARGLIST: The parameters for $FUNCNAME (including self if required) + + - ARGLISTDEF: Like ARGLIST, but including default values (if there are any) + + - ARGLISTTYPES: Like ARGLIST but the variable names are left out and only the types are listed (this can identify a particular signature). + + - DECLARATIONS: The declaration block + + - PRECALL:: + + +--------------------------+ + | [try {] | + +--------------------------+ + | Pre-call code block 1 | + +--------------------------+ + | Pre-call code block 2 | + +--------------------------+ + | ... | + +--------------------------+ + | Pre-call code block n | + +--------------------------+ + + - RESULTVARASSIGNMENT: "<varname> = " or empty + + - CALLFUNCNAME: The name of the function that should be invoked (self?). + + - INPUTPARAMS: The values or variables that will be passed to $FUNCNAME, + e.g. "a, b" or "0.5, 1.5" etc + + - POSTCALL:: + + +--------------------------+ + | Post-call code block n | + +--------------------------+ + | ... | + +--------------------------+ + | Post-call code block 2 | + +--------------------------+ + | Post-call code block 1 | + +--------------------------+ + | [} catch(...) {...}] | + +--------------------------+ + + - RETURNSTMT: "return <varname>" or "return boost::python::make_tuple(...)" + + + @ivar wrapperfunc: The L{code manager<code_manager_t>} object that manages the wrapper function. This is used by the arg policies to modify the wrapper function. + @type wrapperfunc: L{wrapper_code_manager_t} + @ivar virtualfunc: The L{code manager<code_manager_t>} object that manages the virtual function. This is used by the arg policies to modify the virtual function. + @type virtualfunc: L{code_manager_t} + + @group Methods called by the user of the class: append_code_block, subst_wrapper, subst_virtual, get_includes + @group Methods called by the arg policies: remove_arg, insert_arg, require_include + + @author: Matthias Baas + """ + + def __init__(self, decl, wrapperclass=None, transformers=None): + """Constructor. + + @param decl: calldef declaration + @type decl: calldef_t + @param wrapperclass: The name of the class the generated function should belong to (or None if the generated function should be a free function) + @type wrapperclass: str + @param transformers: Function transformer objects + @type transformers: list of function_transformer_t + """ + + # Code manager for the virtual function + self.virtualfunc = code_manager_t() + # Code manager for the wrapper function + self.wrapperfunc = wrapper_code_manager_t() + + # The declaration that represents the original C++ function + self.decl = decl + + # The function transformers + if transformers==None: + transformers = [] + self.transformers = transformers + + self.wrapperclass = wrapperclass + + # A list of required include files + self._virtual_includes = [] + self._wrapper_includes = [] + + # Initialize the code managers... + + if str(decl.return_type)=="void": + rettype = None + else: + rettype = decl.return_type + self.wrapperfunc.resultvar = self.wrapperfunc.declare_local("result", str(rettype)) + self.wrapperfunc.resultexprs = [self.wrapperfunc.resultvar] + + self.virtualfunc.rettype = rettype + self.virtualfunc.arglist = decl.arguments[:] + self.virtualfunc.classname = wrapperclass + self.virtualfunc.FUNCNAME = decl.name + self.virtualfunc.CALLFUNCNAME = decl.name + self.virtualfunc.inputparams = map(lambda a: a.name, decl.arguments) + + self.wrapperfunc.rettype = rettype + self.wrapperfunc.arglist = decl.arguments[:] + self.wrapperfunc.classname = wrapperclass + self.wrapperfunc.FUNCNAME = "%s_wrapper"%decl.alias + self.wrapperfunc.CALLFUNCNAME = decl.name + self.wrapperfunc.inputparams = map(lambda a: a.name, decl.arguments) + + # Check if we're dealing with a member function... + clsdecl = self._classDecl(decl) + if clsdecl!=None: + selfname = self.wrapperfunc._make_name_unique("self") + selfarg = declarations.argument_t(selfname, "%s&"%clsdecl.name) + self.wrapperfunc.arglist.insert(0, selfarg) + self.wrapperfunc.CALLFUNCNAME = "%s.%s"%(selfname, self.wrapperfunc.CALLFUNCNAME) + + # Argument index map + # Original argument index ---> Input arg index (indices are 0-based!) + # Initial state is the identity: f(x) = x + # The argument index map represents a function that maps the argument + # index of the original C++ function to the index of the corresponding + # parameter in the input parameter list for the Python call. + self.argidxmap = range(len(decl.arguments)) + + + # Flag that is set after the functions were initialized + self._funcs_initialized = False + + + def append_transformer(self, transformer): + """not yet implemented""" + pass + + # init_funcs + def init_funcs(self): + """Initialize the virtual function and the wrapper function. + + After this method has been called, the substitution variables + are ready for usage. + + It is not necessary to call this method manually, it is + automatically called at the time a substitution is requested. + """ + + # Append the default return_virtual_result_t code modifier + transformers = self.transformers+[return_virtual_result_t()] + + for cb in transformers: + if hasattr(cb, "init_funcs"): + cb.init_funcs(self) + + # Create a variable that will hold the result of the Python call + # inside the virtual function. + if len(self.wrapperfunc.resultexprs)>0: + self.virtualfunc.resultvar = self.virtualfunc.declare_local("pyresult", "boost::python::object") +# self.virtualfunc.resultexpr = self.virtualfunc.resultvar + + self.wrapperfunc.init_variables() + self.virtualfunc.init_variables() + + self._funcs_initialized = True + + # The default method which is used when a particular method from + # the code_base_t interface is not implemented + defmeth = lambda x: None + # Create the wrapper function pre-call block... + src = map(lambda cb: getattr(cb, "wrapper_pre_call", defmeth)(self), transformers) + src = filter(lambda x: x!=None, src) + precall = "\n\n".join(src) + self.wrapperfunc.PRECALL = precall + + # Create the wrapper function post-call block... + src = map(lambda cb: getattr(cb, "wrapper_post_call", defmeth)(self), transformers) + src = filter(lambda x: x!=None, src) + src.reverse() + postcall = "\n\n".join(src) + self.wrapperfunc.POSTCALL = postcall + + # Create the virtual function pre-call block... + src = map(lambda cb: getattr(cb, "virtual_pre_call", defmeth)(self), transformers) + src = filter(lambda x: x!=None, src) + precall = "\n\n".join(src) + self.virtualfunc.PRECALL = precall + + # Create the virtual function post-call block... + src = map(lambda cb: getattr(cb, "virtual_post_call", defmeth)(self), transformers) + src = filter(lambda x: x!=None, src) + src.reverse() + postcall = "\n\n".join(src) + self.virtualfunc.POSTCALL = postcall + + + # remove_arg + def remove_arg(self, idx): + """Remove an argument from the wrapper function. + + This function can also be used to remove the original return value + (idx=0). + + The function is supposed to be called by function transformer + objects. + + @param idx: Argument index of the original function (may be negative) + @type idx: int + @returns: Returns the argument_t object that was removed (or None + if idx is 0 and the function has no return type). You must not + modify this object as it may still be in use on the virtual + function. + @rtype: argument_t + """ + if self._funcs_initialized: + raise ValueError, "remove_arg() may only be called before function initialization." + if idx<0: + idx += len(self.virtualfunc.arglist)+1 + if idx>=len(self.virtualfunc.arglist)+1: + raise IndexError, "Index (%d) out of range."%idx + + # Remove original return type? + if idx==0: + if id(self.wrapperfunc.rettype)==id(self.wrapperfunc.rettype): + self.wrapperfunc.rettype = None + else: + raise ValueError, 'Argument %d not found on the wrapper function'%(idx) + # Remove argument... + else: + # Get the original argument... + arg = self.virtualfunc.arglist[idx-1] + # ...and remove it from the wrapper + try: + self.wrapperfunc.arglist.remove(arg) + except ValueError: + raise ValueError, 'Argument %d ("%s") not found on the wrapper function'%(idx, arg.name) + + # Remove the input parameter on the Python call in the + # virtual function. + paramidx = self.argidxmap[idx-1] + if paramidx==None: + raise ValueError, "Argument was already removed" + del self.virtualfunc.inputparams[paramidx] + self.argidxmap[idx-1] = None + for i in range(idx,len(self.argidxmap)): + if self.argidxmap[i]!=None: + self.argidxmap[i] -= 1 + + return arg + + # insert_arg + def insert_arg(self, idx, arg): + """Insert a new argument into the argument list of the wrapper function. + + This function is supposed to be called by function transformer + objects. + + @param idx: New argument index (may be negative) + @type idx: int + @param arg: New argument object + @type arg: argument_t + """ + if self._funcs_initialized: + raise ValueError, "insert_arg() may only be called before function initialization." + if idx==0: + pass + else: + if idx<0: + idx += len(self.wrapperfunc.arglist)+2 + self.wrapperfunc.arglist.insert(idx-1, arg) + + # What to insert? + self.virtualfunc.inputparams.insert(idx-1, "???") + # Adjust the argument index map + for i in range(idx-1,len(self.argidxmap)): + if self.argidxmap[i]!=None: + self.argidxmap[i] += 1 + + # require_include + def require_include(self, include, where=None): + """Declare an include file that is required for the code to compile. + + This function is supposed to be called by function transformer + objects to tell the substitution manager that they create code + that requires a particular header file. + + include is the name of the include file which may contain <> or "" + characters around the name. + + @param include: The name of the include file (may contain <> or "") + @type include: str + @param where: "wrapper", "virtual" or None (for both) + @type where: str + """ + if where not in ["wrapper", "virtual", None]: + raise ValueError, "Invalid 'where' argument: %s"%where + + if include=="": + return + + # Add apostrophes if there aren't any already + if include[0] not in '"<': + include = '"%s"'%include + + if where=="wrapper" or where==None: + if include not in self._wrapper_includes: + self._wrapper_includes.append(include) + + if where=="virtual" or where==None: + if include not in self._virtual_includes: + self._virtual_includes.append(include) + + # get_includes + def get_includes(self, where=None): + """Return a list of include files required for the wrapper and/or the virtual function. + + @param where: "wrapper", "virtual" or None (for a combined list) + @type where: str + @return: A list of include file names (all names contain <> or "") + @rtype: list of str + """ + if where not in ["wrapper", "virtual", None]: + raise ValueError, "Invalid 'where' argument: %s"%where + + if where=="wrapper": + return self._wrapper_includes[:] + + if where=="virtual": + return self._virtual_includes[:] + + # Merge both lists (without duplicating names) + res = self._virtual_includes[:] + for inc in self._wrapper_includes: + if inc not in res: + res.append(inc) + + return res + + # subst_virtual + def subst_virtual(self, template): + """Perform a text substitution using the "virtual" variable set. + + @return: Returns the input string that has all variables substituted. + @rtype: str + """ + if not self._funcs_initialized: + self.init_funcs() + return self.virtualfunc.substitute(template) + + # subst_wrapper + def subst_wrapper(self, template): + """Perform a text substitution using the "wrapper" variable set. + + @return: Returns the input string that has all variables substituted. + @rtype: str + """ + if not self._funcs_initialized: + self.init_funcs() + return self.wrapperfunc.substitute(template) + + # _classDecl + def _classDecl(self, decl): + """Return the class declaration that belongs to a member declaration. + """ + while decl.parent!=None: + parent = decl.parent + if isinstance(parent, declarations.class_t): + return parent + decl = parent + return None + + +# return_virtual_result_t +class return_virtual_result_t(function_transformer_t): + """Extract and return the result value of the virtual function. + + This is an internal code block object that is automatically appended + to the list of code blocks inside the substitution_manager_t class. + """ + + def __init__(self): + function_transformer_t.__init__(self) + self.resultvar = "<not initialized>" + + def __str__(self): + return "ReturnVirtualResult()"%(self.idx) + + def init_funcs(self, sm): + if sm.virtualfunc.rettype==None: + return + + # Declare the local variable that will hold the return value + # for the virtual function + self.resultvar = sm.virtualfunc.declare_local("result", sm.virtualfunc.rettype) + # Replace the result expression if there is still the default + # result expression (which will not work anyway) + if sm.virtualfunc.resultexpr==sm.virtualfunc.resultvar: + sm.virtualfunc.resultexpr = self.resultvar + + def virtual_post_call(self, sm): + # Search the result tuple of the wrapper function for the return + # value of the C++ function call. If the value exists it is extracted + # from the Python result tuple, converted to C++ and returned from + # the virtual function. If it does not exist, do nothing. + try: + resultidx = sm.wrapperfunc.resultexprs.index(sm.wrapperfunc.resultvar) + except ValueError: + return + + res = "// Extract the C++ return value\n" + res += "%s = boost::python::extract<%s>(%s[%d]);"%(self.resultvar, sm.virtualfunc.rettype, sm.virtualfunc.resultvar, resultidx) + return res + + +###################################################################### +if __name__=="__main__": + import pyplusplus + from pygccxml import parser + from arg_policies import Output + cpp = """ + class Spam + { + public: + int foo(int& w, int* h, int mode=0); + }; + """ + parser = parser.project_reader_t(parser.config.config_t(), + decl_factory=pyplusplus.decl_wrappers.dwfactory_t()) + root = parser.read_string(cpp) + spam = root[0].class_("Spam") + foo = spam.member_function("foo") + + wm = substitution_manager_t(foo, transformers=[Output(1), Output(2)], wrapperclass="Spam_wrapper") + + template = '''$RETTYPE $CLASSSPEC$FUNCNAME($ARGLIST) +{ + $DECLARATIONS + + $PRECALL + + $RESULTVARASSIGNMENT$CALLFUNCNAME($INPUTPARAMS); + + $POSTCALL + + $RETURNSTMT +} +''' + print wm.subst_virtual(template) + print wm.subst_wrapper(template) + print wm.get_includes() + print wm.get_includes("virtual") + print wm.get_includes("wrapper") Property changes on: pyplusplus_dev/pyplusplus/function_transformers/substitution_manager.py ___________________________________________________________________ Name: svn:eol-style + native Modified: pyplusplus_dev/setup.py =================================================================== --- pyplusplus_dev/setup.py 2006-09-03 07:59:17 UTC (rev 506) +++ pyplusplus_dev/setup.py 2006-09-03 09:31:45 UTC (rev 507) @@ -107,6 +107,7 @@ 'pyplusplus.decl_wrappers', 'pyplusplus.module_builder', 'pyplusplus.utils', + 'pyplusplus.function_transformers', 'pyplusplus._logging_'], cmdclass = {"doc" : doc_cmd} ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-04 06:18:05
|
Revision: 515 http://svn.sourceforge.net/pygccxml/?rev=515&view=rev Author: roman_yakovenko Date: 2006-09-03 23:17:49 -0700 (Sun, 03 Sep 2006) Log Message: ----------- adding documentation extractor interface to decl_wrappers package Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py pyplusplus_dev/pyplusplus/module_builder/__init__.py pyplusplus_dev/unittests/algorithms_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/decl_wrappers/doc_extractor.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-09-04 06:16:26 UTC (rev 514) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-09-04 06:17:49 UTC (rev 515) @@ -89,48 +89,51 @@ from indexing_suite1 import indexing_suite1_t from indexing_suite2 import indexing_suite2_t +from doc_extractor import doc_extractor_i + class dwfactory_t( declarations.decl_factory_t ): """ declarations factory class """ def __init__(self): declarations.decl_factory_t.__init__(self) - + def create_member_function( self, *arguments, **keywords ): return member_function_t(*arguments, **keywords) - + def create_constructor( self, *arguments, **keywords ): return constructor_t(*arguments, **keywords) - + def create_destructor( self, *arguments, **keywords ): return destructor_t(*arguments, **keywords) - + def create_member_operator( self, *arguments, **keywords ): return member_operator_t(*arguments, **keywords) - + def create_casting_operator( self, *arguments, **keywords ): return casting_operator_t(*arguments, **keywords) - + def create_free_function( self, *arguments, **keywords ): return free_function_t(*arguments, **keywords) - + def create_free_operator( self, *arguments, **keywords ): return free_operator_t(*arguments, **keywords) def create_class_declaration(self, *arguments, **keywords ): return class_declaration_t(*arguments, **keywords) - + def create_class( self, *arguments, **keywords ): return class_t(*arguments, **keywords) - + def create_enumeration( self, *arguments, **keywords ): return enumeration_t(*arguments, **keywords) - + def create_namespace( self, *arguments, **keywords ): return namespace_t(*arguments, **keywords) - + def create_typedef( self, *arguments, **keywords ): return typedef_t(*arguments, **keywords) - + def create_variable( self, *arguments, **keywords ): return variable_t(*arguments, **keywords) + Added: pyplusplus_dev/pyplusplus/decl_wrappers/doc_extractor.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/doc_extractor.py (rev 0) +++ pyplusplus_dev/pyplusplus/decl_wrappers/doc_extractor.py 2006-09-04 06:17:49 UTC (rev 515) @@ -0,0 +1,45 @@ +# Copyright 2004 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) + +"""defines documentation extractor class interface""" + +import re + +class doc_extractor_i(object): + """defines documentation extractor interface""" + + __escape_re = re.compile (r'((\\x[a-f0-9][a-f0-9])|(\\*"))', re.I) + + def __init__( self, encoding='ascii' ): + object.__init__( self ) + self.encoding = encoding + + def extract( self, decl ): + """returns documentation text for the declaration + + This function should be implemented in derived class. + + Using decl.location.file_name and decl.location.line variables you can + find out the location of declaration within source file + """ + raise NotImplementedError() + + def __call__( self, decl ): + decl_doc = self.extract( decl ) + return self.escape_doc( decl_doc ) + + @staticmethod + def escape_doc( doc ): + """converts a text to be valid C++ string literals""" + def replace_escape(m): + g = m.group(1) + if g.startswith ('\\x'): + return g + '""' + elif g == '"': + return '\\"' + else: + return g + return '"%s"' % doc_extractor_i.__escape_re.sub( replace_escape, repr(doc)[1:-1] ) + Modified: pyplusplus_dev/pyplusplus/module_builder/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/__init__.py 2006-09-04 06:16:26 UTC (rev 514) +++ pyplusplus_dev/pyplusplus/module_builder/__init__.py 2006-09-04 06:17:49 UTC (rev 515) @@ -8,7 +8,7 @@ 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++ +Also take a look on tutorials. You can find them on Py++ U{web site<http://www.language-binding.net>} """ @@ -45,6 +45,8 @@ from pyplusplus.decl_wrappers import print_declarations +from pyplusplus.decl_wrappers import doc_extractor_i + import call_policies from pygccxml import utils as __pygccxml_utils @@ -54,4 +56,4 @@ for l in __pygccxml_utils.loggers.all: l.setLevel( level ) for l in __pyplusplus_logging.loggers.all: - l.setLevel( level ) \ No newline at end of file + l.setLevel( level ) Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2006-09-04 06:16:26 UTC (rev 514) +++ pyplusplus_dev/unittests/algorithms_tester.py 2006-09-04 06:17:49 UTC (rev 515) @@ -162,8 +162,14 @@ self.failUnless( [[1,2,3]] == split( seq, 3 ) ) self.failUnless( [[1,2,3]] == split( seq, 4 ) ) +class doc_extractor_tester_t( unittest.TestCase ): + def test( self ): + escaped_doc = module_builder.doc_extractor_i.escape_doc('Hello "Py++"') + self.failUnless( escaped_doc == '"Hello \\"Py++\\""' ) + def create_suite(): suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(doc_extractor_tester_t)) suite.addTest( unittest.makeSuite(class_organizer_tester_t)) suite.addTest( unittest.makeSuite(indent_tester_t)) suite.addTest( unittest.makeSuite(make_flatten_tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-13 07:32:32
|
Revision: 536 http://svn.sourceforge.net/pygccxml/?rev=536&view=rev Author: roman_yakovenko Date: 2006-09-13 00:32:06 -0700 (Wed, 13 Sep 2006) Log Message: ----------- fixing "immutable" bug argument that have immutable type, should not be passed by value and not by reference Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py pyplusplus_dev/unittests/data/member_functions_to_be_exported.hpp pyplusplus_dev/unittests/member_functions_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py Modified: pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2006-09-13 07:32:06 UTC (rev 536) @@ -9,6 +9,7 @@ import code_creator from pyplusplus import code_repository from pyplusplus.decl_wrappers import call_policies +from pyplusplus.decl_wrappers import python_traits from pygccxml import declarations class array_1_registrator_t( code_creator.code_creator_t ): @@ -41,7 +42,7 @@ def _guess_call_policies(self): item_type = declarations.array_item_type( self.array_type ) - if declarations.is_fundamental( item_type ) or declarations.is_enum( item_type ): + if python_traits.is_immutable( item_type ): return call_policies.default_call_policies() else: return call_policies.return_internal_reference() Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-09-13 07:32:06 UTC (rev 536) @@ -9,6 +9,7 @@ import declaration_based import class_declaration from pygccxml import declarations +from pyplusplus.decl_wrappers import python_traits import pyplusplus.function_transformers as function_transformers #virtual functions that returns const reference to something @@ -174,17 +175,19 @@ params = [] for index in range( len( self.declaration.arguments ) ): arg_type = declarations.remove_alias( self.declaration.arguments[index].type ) - arg_base_type = declarations.base_type( arg_type ) - if declarations.is_fundamental( arg_base_type ): + if python_traits.is_immutable( arg_type ): params.append( self.argument_name( index ) ) - elif declarations.is_reference( arg_type ) \ - and not declarations.is_const( arg_type ) \ - and not declarations.is_enum( arg_base_type ): - params.append( 'boost::ref(%s)' % self.argument_name( index ) ) + elif declarations.is_reference( arg_type ): + no_ref = declarations.remove_reference( arg_type ) + if python_traits.is_immutable( no_ref ): + #pass by value + params.append( self.argument_name( index ) ) + else: + #pass by ref + params.append( 'boost::ref(%s)' % self.argument_name( index ) ) elif declarations.is_pointer( arg_type ) \ and not declarations.is_pointer( arg_type.base ) \ - and not declarations.is_fundamental( arg_type.base ) \ - and not declarations.is_enum( arg_base_type ): + and not python_traits.is_immutable( arg_type.base ): params.append( 'boost::python::ptr(%s)' % self.argument_name( index ) ) else: params.append( self.argument_name( index ) ) @@ -443,7 +446,7 @@ class mem_fun_v_transformed_t( calldef_t ): """Creates code for (public) virtual member functions. """ - + def __init__( self, function, wrapper=None ): calldef_t.__init__( self, function=function, wrapper=wrapper ) self.default_function_type_alias = 'default_' + self.function_type_alias @@ -504,7 +507,7 @@ @type function: calldef_t """ calldef_wrapper_t.__init__( self, function=function ) - + # Stores the name of the variable that holds the override self._override_var = None @@ -593,11 +596,11 @@ if( %(override_var)s ) { $PRE_CALL - + ${RESULT_VAR_ASSIGNMENT}boost::python::call<$RESULT_TYPE>($INPUT_PARAMS); - + $POST_CALL - + $RETURN_STMT } else @@ -636,7 +639,7 @@ cls_wrapper = self._subst_manager.wrapper_func.declare_local("cls_wrapper", cls_wrapper_type); # The name of the 'self' variable (i.e. first argument) selfname = self._subst_manager.wrapper_func.arg_list[0].name - + body = """$DECLARATIONS $PRE_CALL @@ -668,7 +671,7 @@ "cls_wrapper" : cls_wrapper, "self" : selfname, "base_name" : self.base_name() } - + # function_call = declarations.call_invocation.join( self.declaration.name # , [ self.function_call_args() ] ) # body = self.wrapped_class_identifier() + '::' + function_call + ';' @@ -693,20 +696,20 @@ header = 'static $RET_TYPE %s( $ARG_LIST_DEF ) {'%self.default_name() header = self._subst_manager.subst_wrapper(header) - + answer = [ header ] answer.append( self.indent( self.create_default_body() ) ) answer.append( '}' ) return os.linesep.join( answer ) - + def _create_impl(self): # Create the substitution manager decl = self.declaration sm = function_transformers.substitution_manager_t(decl, transformers=decl.function_transformers) self._override_var = sm.virtual_func.declare_local(decl.alias+"_callable", "boost::python::override", default='this->get_override( "%s" )'%decl.alias) self._subst_manager = sm - + answer = [ self.create_function() ] answer.append( os.linesep ) answer.append( self.create_base_function() ) Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-09-13 07:32:06 UTC (rev 536) @@ -8,6 +8,7 @@ import declaration_based from pyplusplus import code_repository from pyplusplus.decl_wrappers import call_policies +from pyplusplus.decl_wrappers import python_traits from pygccxml import declarations class member_variable_base_t( declaration_based.declaration_based_t ): @@ -508,7 +509,7 @@ def _get_exported_var_type( self ): type_ = declarations.remove_reference( self.declaration.type ) type_ = declarations.remove_const( type_ ) - if declarations.is_fundamental( type_ ) or declarations.is_enum( type_ ): + if python_traits.is_immutable( type_ ): return type_ else: return self.declaration.type @@ -533,10 +534,8 @@ def _get_has_setter( self ): if declarations.is_const( declarations.remove_reference( self.declaration.type ) ): return False - elif declarations.is_fundamental( self._get_exported_var_type() ): + elif python_traits.is_immutable( self._get_exported_var_type() ): return True - elif declarations.is_enum( self._get_exported_var_type() ): - return True else: pass Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-09-13 07:32:06 UTC (rev 536) @@ -91,6 +91,8 @@ from doc_extractor import doc_extractor_i +import python_traits + class dwfactory_t( declarations.decl_factory_t ): """ declarations factory class Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py 2006-09-13 07:32:06 UTC (rev 536) @@ -6,17 +6,11 @@ """defines interface for exposing STD containers, using current version of indexing suite""" from pygccxml import declarations - +import python_traits #NoProxy #By default indexed elements have Python reference semantics and are returned by #proxy. This can be disabled by supplying true in the NoProxy template parameter. -#When we want to disable is: -#1. We deal with immutable objects: -# 1. fundamental types -# 2. enum type -# 3. std::[w]string -# 4. std::complex -# 5. shared_ptr +#We want to disable NoProxy when we deal with immutable objects. class indexing_suite1_t( object ): """ @@ -43,15 +37,7 @@ def _get_no_proxy( self ): if self.__no_proxy is None: - element_type = self.element_type - if declarations.is_fundamental( element_type ) \ - or declarations.is_enum( element_type ) \ - or declarations.is_std_string( element_type ) \ - or declarations.is_std_wstring( element_type ) \ - or declarations.smart_pointer_traits.is_smart_pointer( element_type ): - self.__no_proxy = True - else: - self.__no_proxy = False + self.__no_proxy = python_traits.is_immutable( self.element_type ) return self.__no_proxy def _set_no_proxy( self, no_proxy ): Added: pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py (rev 0) +++ pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py 2006-09-13 07:32:06 UTC (rev 536) @@ -0,0 +1,19 @@ +# Copyright 2004 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) + +"""defines few "type traits" functions related to C++ Python bindings""" + +from pygccxml import declarations + +def is_immutable( type_ ): + """returns True, if type_ represents Python immutable type""" + return declarations.is_fundamental( type_ ) \ + or declarations.is_enum( type_ ) \ + or declarations.is_std_string( type_ ) \ + or declarations.is_std_wstring( type_ ) \ + or declarations.smart_pointer_traits.is_smart_pointer( type_ ) + #todo is_complex, ... + + Modified: pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-09-13 07:32:06 UTC (rev 536) @@ -5,8 +5,9 @@ """defines class that configure global and member variable exposing""" +import decl_wrapper from pygccxml import declarations -import decl_wrapper +from pyplusplus.decl_wrappers import python_traits class variable_t(decl_wrapper.decl_wrapper_t, declarations.variable_t): """defines a set of properties, that will instruct Py++ how to expose the variable""" @@ -50,8 +51,8 @@ if declarations.is_pointer( type_ ): if self.type_qualifiers.has_static: return "Py++ can not expose static pointer member variables. This could be changed in future." - if declarations.is_fundamental( type_.base ): - return "Py++ can not expose pointer to fundamental member variables. This could be changed in future." + if python_traits.is_immutable( type_.base ): + return "Py++ can not expose pointer to Python immutable member variables. This could be changed in future." units = declarations.decompose_type( type_ ) ptr2functions = filter( lambda unit: isinstance( unit, declarations.calldef_type_t ) Modified: pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2006-09-13 07:32:06 UTC (rev 536) @@ -6,6 +6,7 @@ from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import code_creators +from pyplusplus.decl_wrappers import python_traits class resolver_t( object ): def __init__( self ): @@ -100,7 +101,7 @@ return_type = declarations.remove_cv( calldef.return_type ) if declarations.is_reference( return_type ): return_type = declarations.remove_reference( return_type ) - if declarations.is_fundamental( return_type ) or declarations.is_enum( return_type ): + if python_traits.is_immutable( return_type ): if declarations.is_const( calldef.return_type ): return decl_wrappers.return_value_policy( decl_wrappers.copy_const_reference ) else: @@ -123,7 +124,7 @@ no_ref = declarations.remove_reference( variable.type ) base_type = declarations.remove_const( no_ref ) - if declarations.is_fundamental( base_type ) or declarations.is_enum( base_type ): + if python_traits.is_immutable( base_type ): #the relevant code creator will generate code, that will return this member variable #by value return decl_wrappers.default_call_policies() Modified: pyplusplus_dev/unittests/data/member_functions_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/member_functions_to_be_exported.hpp 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/unittests/data/member_functions_to_be_exported.hpp 2006-09-13 07:32:06 UTC (rev 536) @@ -1,161 +1,172 @@ -// Copyright 2004 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) - -#ifndef __member_functions_to_be_exported_hpp__ -#define __member_functions_to_be_exported_hpp__ - -namespace member_functions{ - -struct protected_mf_t{ -protected: - static int x(){ return 1;} -}; - -struct protected_base_t{ -protected: - int regular( int x ){ return x; } - int regular_overloaded( int x ){ return x * x; } - int regular_overloaded( int x, int y ){ return x * y; } - - int regular_const( int x ) const { return x; } - int regular_const_overloaded( int x ) const { return x * x; } - int regular_const_overloaded( int x, int y) const { return x * y; } - -//virtual - - virtual int virtual_( int x ){ return x; } - virtual int virtual_overloaded( int x ){ return x * x; } - virtual int virtual_overloaded( int x, int y ){ return x * y; } - - virtual int virtual_const( int x ) const { return x; } - virtual int virtual_const_overloaded( int x ) const { return x * x; } - virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } - -//pure virtual - virtual int pure_virtual( int x ) = 0; - virtual int pure_virtual_overloaded( int x ) = 0; - virtual int pure_virtual_overloaded( int x, int y ) = 0; - - virtual int pure_virtual_const( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; -}; - -struct protected_public_derived_t : public protected_base_t{ - - virtual int pure_virtual( int x ) { return x;} - virtual int pure_virtual_overloaded( int x ) { return x * x; } - virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } - - virtual int pure_virtual_const( int x ) const { return x; } - virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } - virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } -}; - -struct protected_protected_derived_t : public protected_base_t{ - - virtual int pure_virtual( int x ) { return x;} - virtual int pure_virtual_overloaded( int x ) { return x * x; } - virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } - - virtual int pure_virtual_const( int x ) const { return x; } - virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } - virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } -}; - - -struct public_base_t{ -public: - int regular( int x ){ return x; } - int regular_overloaded( int x ){ return x * x; } - int regular_overloaded( int x, int y ){ return x * y; } - - int regular_const( int x ) const { return x; } - int regular_const_overloaded( int x ) const { return x * x; } - int regular_const_overloaded( int x, int y) const { return x * y; } - -//virtual - - virtual int virtual_( int x ){ return x; } - virtual int virtual_overloaded( int x ){ return x * x; } - virtual int virtual_overloaded( int x, int y ){ return x * y; } - - virtual int virtual_const( int x ) const { return x; } - virtual int virtual_const_overloaded( int x ) const { return x * x; } - virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } - -//pure virtual - virtual int pure_virtual( int x ) = 0; - virtual int pure_virtual_overloaded( int x ) = 0; - virtual int pure_virtual_overloaded( int x, int y ) = 0; - - virtual int pure_virtual_const( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; -}; - -struct public_derived_t : public public_base_t{ - - virtual int pure_virtual( int x ) { return x;} - virtual int pure_virtual_overloaded( int x ) { return x * x; } - virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } - - virtual int pure_virtual_const( int x ) const { return x; } - virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } - virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } -}; - - -struct private_base_t{ - void remove_gcc_warning(){} -private: - int regular( int x ){ return x; } - int regular_overloaded( int x ){ return x * x; } - int regular_overloaded( int x, int y ){ return x * y; } - - int regular_const( int x ) const { return x; } - int regular_const_overloaded( int x ) const { return x * x; } - int regular_const_overloaded( int x, int y) const { return x * y; } - -//virtual - - virtual int virtual_( int x ){ return x; } - virtual int virtual_overloaded( int x ){ return x * x; } - virtual int virtual_overloaded( int x, int y ){ return x * y; } - - virtual int virtual_const( int x ) const { return x; } - virtual int virtual_const_overloaded( int x ) const { return x * x; } - virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } - -//pure virtual - virtual int pure_virtual( int x ) = 0; - virtual int pure_virtual_overloaded( int x ) = 0; - virtual int pure_virtual_overloaded( int x, int y ) = 0; - - virtual int pure_virtual_const( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; -}; - -struct private_derived_t : public private_base_t{ - - virtual int pure_virtual( int x ) { return x;} - virtual int pure_virtual_overloaded( int x ) { return x * x; } - virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } - - virtual int pure_virtual_const( int x ) const { return x; } - virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } - virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } -}; +// Copyright 2004 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) +#ifndef __member_functions_to_be_exported_hpp__ +#define __member_functions_to_be_exported_hpp__ + +#include <string> + +namespace member_functions{ + +struct protected_mf_t{ +protected: + static int x(){ return 1;} +}; + +struct protected_base_t{ +protected: + int regular( int x ){ return x; } + int regular_overloaded( int x ){ return x * x; } + int regular_overloaded( int x, int y ){ return x * y; } + + int regular_const( int x ) const { return x; } + int regular_const_overloaded( int x ) const { return x * x; } + int regular_const_overloaded( int x, int y) const { return x * y; } + +//virtual + + virtual int virtual_( int x ){ return x; } + virtual int virtual_overloaded( int x ){ return x * x; } + virtual int virtual_overloaded( int x, int y ){ return x * y; } + + virtual int virtual_const( int x ) const { return x; } + virtual int virtual_const_overloaded( int x ) const { return x * x; } + virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } + +//pure virtual + virtual int pure_virtual( int x ) = 0; + virtual int pure_virtual_overloaded( int x ) = 0; + virtual int pure_virtual_overloaded( int x, int y ) = 0; + + virtual int pure_virtual_const( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; +}; + +struct protected_public_derived_t : public protected_base_t{ + + virtual int pure_virtual( int x ) { return x;} + virtual int pure_virtual_overloaded( int x ) { return x * x; } + virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } + + virtual int pure_virtual_const( int x ) const { return x; } + virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } + virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } +}; + +struct protected_protected_derived_t : public protected_base_t{ + + virtual int pure_virtual( int x ) { return x;} + virtual int pure_virtual_overloaded( int x ) { return x * x; } + virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } + + virtual int pure_virtual_const( int x ) const { return x; } + virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } + virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } +}; + + +struct public_base_t{ +public: + int regular( int x ){ return x; } + int regular_overloaded( int x ){ return x * x; } + int regular_overloaded( int x, int y ){ return x * y; } + + int regular_const( int x ) const { return x; } + int regular_const_overloaded( int x ) const { return x * x; } + int regular_const_overloaded( int x, int y) const { return x * y; } + +//virtual + + virtual int virtual_( int x ){ return x; } + virtual int virtual_overloaded( int x ){ return x * x; } + virtual int virtual_overloaded( int x, int y ){ return x * y; } + + virtual int virtual_const( int x ) const { return x; } + virtual int virtual_const_overloaded( int x ) const { return x * x; } + virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } + +//pure virtual + virtual int pure_virtual( int x ) = 0; + virtual int pure_virtual_overloaded( int x ) = 0; + virtual int pure_virtual_overloaded( int x, int y ) = 0; + + virtual int pure_virtual_const( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; +}; + +struct public_derived_t : public public_base_t{ + + virtual int pure_virtual( int x ) { return x;} + virtual int pure_virtual_overloaded( int x ) { return x * x; } + virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } + + virtual int pure_virtual_const( int x ) const { return x; } + virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } + virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } +}; + + +struct private_base_t{ + void remove_gcc_warning(){} +private: + int regular( int x ){ return x; } + int regular_overloaded( int x ){ return x * x; } + int regular_overloaded( int x, int y ){ return x * y; } + + int regular_const( int x ) const { return x; } + int regular_const_overloaded( int x ) const { return x * x; } + int regular_const_overloaded( int x, int y) const { return x * y; } + +//virtual + + virtual int virtual_( int x ){ return x; } + virtual int virtual_overloaded( int x ){ return x * x; } + virtual int virtual_overloaded( int x, int y ){ return x * y; } + + virtual int virtual_const( int x ) const { return x; } + virtual int virtual_const_overloaded( int x ) const { return x * x; } + virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } + +//pure virtual + virtual int pure_virtual( int x ) = 0; + virtual int pure_virtual_overloaded( int x ) = 0; + virtual int pure_virtual_overloaded( int x, int y ) = 0; + + virtual int pure_virtual_const( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; +}; + +struct private_derived_t : public private_base_t{ + + virtual int pure_virtual( int x ) { return x;} + virtual int pure_virtual_overloaded( int x ) { return x * x; } + virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } + + virtual int pure_virtual_const( int x ) const { return x; } + virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } + virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } +}; + struct callable_t{ int operator()( int i, int j ) const { return i + j; } int operator()( int i, int j, int k ) const { return i + j + k; } -}; - -} - -#endif//__member_functions_to_be_exported_hpp__ - +}; + +struct immutable_by_ref_t{ + virtual std::string identity( std::string const & x ) = 0; + + static std::string + call_identity( immutable_by_ref_t& imm, std::string const & x ){ + return imm.identity( x ); + } +}; + +} + +#endif//__member_functions_to_be_exported_hpp__ + Modified: pyplusplus_dev/unittests/member_functions_tester.py =================================================================== --- pyplusplus_dev/unittests/member_functions_tester.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/unittests/member_functions_tester.py 2006-09-13 07:32:06 UTC (rev 536) @@ -11,13 +11,13 @@ class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'member_functions' - + def __init__( self, *args ): - fundamental_tester_base.fundamental_tester_base_t.__init__( + fundamental_tester_base.fundamental_tester_base_t.__init__( self , tester_t.EXTENSION_NAME , *args ) - + def customize(self, mb ): names = [ 'protected_protected_derived_t' @@ -33,7 +33,17 @@ #will reporoduce bug mb.class_('callable_t').always_expose_using_scope = True mb.BOOST_PYTHON_MAX_ARITY = 1 - + + def create_py_immutable_by_ref( self, module ): + class py_immutable_by_ref( module.immutable_by_ref_t ): + def __init__( self ): + module.immutable_by_ref_t.__init__( self ) + + def identity( self, x ): + return x*2 + + return py_immutable_by_ref() + def create_test_class_inst(self, class_ ): class tester_impl_t( class_ ): def __init__(self): @@ -63,39 +73,39 @@ def _test_instance( self, inst, class_defined_in_cpp): self.failUnless( 23 == inst.regular( 23 ) ) - self.failUnless( 9 == inst.regular_overloaded( 3 ) ) - self.failUnless( 15 == inst.regular_overloaded( 3, 5 ) ) + self.failUnless( 9 == inst.regular_overloaded( 3 ) ) + self.failUnless( 15 == inst.regular_overloaded( 3, 5 ) ) self.failUnless( 23 == inst.regular_const( 23 ) ) - self.failUnless( 9 == inst.regular_const_overloaded( 3 ) ) - self.failUnless( 15 == inst.regular_const_overloaded( 3, 5 ) ) + self.failUnless( 9 == inst.regular_const_overloaded( 3 ) ) + self.failUnless( 15 == inst.regular_const_overloaded( 3, 5 ) ) self.failUnless( 23 == inst.virtual_( 23 ) ) - self.failUnless( 9 == inst.virtual_overloaded( 3 ) ) - self.failUnless( 15 == inst.virtual_overloaded( 3, 5 ) ) + self.failUnless( 9 == inst.virtual_overloaded( 3 ) ) + self.failUnless( 15 == inst.virtual_overloaded( 3, 5 ) ) self.failUnless( 23 == inst.virtual_const( 23 ) ) - self.failUnless( 9 == inst.virtual_const_overloaded( 3 ) ) - self.failUnless( 15 == inst.virtual_const_overloaded( 3, 5 ) ) - + self.failUnless( 9 == inst.virtual_const_overloaded( 3 ) ) + self.failUnless( 15 == inst.virtual_const_overloaded( 3, 5 ) ) + if class_defined_in_cpp: self.failUnless( 23 == inst.pure_virtual( 23 ) ) - self.failUnless( 9 == inst.pure_virtual_overloaded( 3 ) ) - self.failUnless( 15 == inst.pure_virtual_overloaded( 3, 5 ) ) - + self.failUnless( 9 == inst.pure_virtual_overloaded( 3 ) ) + self.failUnless( 15 == inst.pure_virtual_overloaded( 3, 5 ) ) + self.failUnless( 23 == inst.pure_virtual_const( 23 ) ) - self.failUnless( 9 == inst.pure_virtual_const_overloaded( 3 ) ) - self.failUnless( 15 == inst.pure_virtual_const_overloaded( 3, 5 ) ) + self.failUnless( 9 == inst.pure_virtual_const_overloaded( 3 ) ) + self.failUnless( 15 == inst.pure_virtual_const_overloaded( 3, 5 ) ) else: self.failUnless( 46 == inst.pure_virtual( 23 ) ) - self.failUnless( 6 == inst.pure_virtual_overloaded( 3 ) ) - self.failUnless( 8 == inst.pure_virtual_overloaded( 3, 5 ) ) - + self.failUnless( 6 == inst.pure_virtual_overloaded( 3 ) ) + self.failUnless( 8 == inst.pure_virtual_overloaded( 3, 5 ) ) + self.failUnless( 46 == inst.pure_virtual_const( 23 ) ) - self.failUnless( 6 == inst.pure_virtual_const_overloaded( 3 ) ) - self.failUnless( 8 == inst.pure_virtual_const_overloaded( 3, 5 ) ) - - def run_tests(self, module): + self.failUnless( 6 == inst.pure_virtual_const_overloaded( 3 ) ) + self.failUnless( 8 == inst.pure_virtual_const_overloaded( 3, 5 ) ) + + def run_tests(self, module): derived = module.protected_public_derived_t() self._test_instance( derived, True ) derived = module.protected_protected_derived_t() @@ -106,9 +116,13 @@ self._test_instance( derived, False ) derived = self.create_test_class_inst( module.public_base_t ) self._test_instance( derived, False ) - + + x = self.create_py_immutable_by_ref(module) + self.failUnless( x.identity( '11' ) == '1111' ) + self.failUnless( module.immutable_by_ref_t.call_identity(x, '11') == '1111' ) + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite @@ -116,4 +130,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-13 09:24:50
|
Revision: 537 http://svn.sourceforge.net/pygccxml/?rev=537&view=rev Author: roman_yakovenko Date: 2006-09-13 02:24:37 -0700 (Wed, 13 Sep 2006) Log Message: ----------- fixing "create_castinig_constructor" functionality. As it was suggested by David Abrahams, by default they will be not generated. Previous behavior is preserved. Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/module_builder/builder.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/casting_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-09-13 07:32:06 UTC (rev 536) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-09-13 09:24:37 UTC (rev 537) @@ -216,6 +216,7 @@ declarations.constructor_t.__init__( self, *arguments, **keywords ) calldef_t.__init__( self ) self._body = '' + self._allow_implicit_conversion = False def _get_body(self): return self._body @@ -229,6 +230,33 @@ return 'Py++ does not exports compiler generated constructors' return '' + def does_define_implicit_conversion( self ): + """ returns true if the constructor can take part in implicit conversions. + + For more information see: + + * http://boost.org/libs/python/doc/v2/implicit.html#implicitly_convertible-spec + + * http://msdn2.microsoft.com/en-us/library/h1y7x448.aspx + """ + if self.parent.is_abstract: #user is not able to create an instance of the class + return False + if self.is_copy_constructor: + return False + if 1 != len( self.arguments ): + return False + if self.parent.find_out_member_access_type( self ) != declarations.ACCESS_TYPES.PUBLIC: + return False + return True + + def _get_allow_implicit_conversion(self): + return self._allow_implicit_conversion and self.does_define_implicit_conversion() + def _set_allow_implicit_conversion(self, allow_implicit_conversion): + self._allow_implicit_conversion = allow_implicit_conversion + allow_implicit_conversion = property( _get_allow_implicit_conversion, _set_allow_implicit_conversion + , doc="boolean, indicates whether Py++ should generate implicitly_convertible code or not" \ + "Default value is calculated from the constructor type" ) + class destructor_t( declarations.destructor_t, calldef_t ): """you may ignore this class for he time being. Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-09-13 07:32:06 UTC (rev 536) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-09-13 09:24:37 UTC (rev 537) @@ -7,6 +7,8 @@ import sys import time +import warnings + from pygccxml import parser from pygccxml import declarations as decls_package @@ -201,7 +203,7 @@ def build_code_creator( self , module_name , boost_python_ns_name='bp' - , create_castinig_constructor=True + , create_castinig_constructor=False , call_policies_resolver_=None , types_db=None , target_configuration=None @@ -224,10 +226,18 @@ and returns documentation string @type doc_extractor: callable or None """ + if create_castinig_constructor: + msg = os.linesep.join([ + "create_castinig_constructor argument is deprecated and should not be used." + , "If you still want Py++ to generate implicitly_convertible code, consider to use allow_implicit_conversion constructor property" + , "mb = module_builder_t(...)" + , "mb.constructors().allow_implicit_conversion = True"]) + warnings.warn(msg, DeprecationWarning, stacklevel=2) + self.global_ns.constructors().allow_implicit_conversion = True + creator = mcreator_package.creator_t( self.global_ns , module_name , boost_python_ns_name - , create_castinig_constructor , call_policies_resolver_ , types_db , target_configuration Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-13 07:32:06 UTC (rev 536) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-13 09:24:37 UTC (rev 537) @@ -64,7 +64,6 @@ , decls , module_name , boost_python_ns_name='bp' - , create_castinig_constructor=False , call_policies_resolver_=None , types_db=None , target_configuration=None @@ -75,7 +74,6 @@ @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 create_castinig_constructor: ...todo... @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. @@ -83,7 +81,6 @@ @type decls: list of declaration_t @type module_name: str @type boost_python_ns_name: str - @type create_castinig_constructor: bool @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>} @@ -110,7 +107,6 @@ self.__extmodule = code_creators.module_t() self.__extmodule.add_system_header( "boost/python.hpp" ) self.__extmodule.adopt_creator( code_creators.include_t( header="boost/python.hpp" ) ) - self.__create_castinig_constructor = create_castinig_constructor if boost_python_ns_name: bp_ns_alias = code_creators.namespace_alias_t( alias=boost_python_ns_name , full_namespace_name='::boost::python' ) @@ -251,10 +247,6 @@ def _does_class_have_smth_to_export(self, exportable_members ): return bool( self._filter_decls( exportable_members ) ) - def _is_constructor_of_abstract_class( self, decl ): - assert isinstance( decl, declarations.constructor_t ) - return decl.parent.is_abstract - def _filter_decls( self, decls ): # Filter out artificial (compiler created) types unless they are classes # See: http://public.kitware.com/pipermail/gccxml/2004-October/000486.html @@ -604,10 +596,7 @@ if self.curr_decl.is_copy_constructor: return self.__types_db.update( self.curr_decl ) - if not self._is_constructor_of_abstract_class( self.curr_decl ) \ - and 1 == len( self.curr_decl.arguments ) \ - and self.__create_castinig_constructor \ - and self.curr_decl.access_type == ACCESS_TYPES.PUBLIC: + if self.curr_decl.allow_implicit_conversion: maker = code_creators.casting_constructor_t( constructor=self.curr_decl ) self.__module_body.adopt_creator( maker ) Modified: pyplusplus_dev/unittests/casting_tester.py =================================================================== --- pyplusplus_dev/unittests/casting_tester.py 2006-09-13 07:32:06 UTC (rev 536) +++ pyplusplus_dev/unittests/casting_tester.py 2006-09-13 09:24:37 UTC (rev 537) @@ -10,13 +10,16 @@ class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'casting' - + def __init__( self, *args ): - fundamental_tester_base.fundamental_tester_base_t.__init__( + fundamental_tester_base.fundamental_tester_base_t.__init__( self , tester_t.EXTENSION_NAME , *args ) - + + def customize( self, mb ): + mb.constructors().allow_implicit_conversion = True + def run_tests( self, module): x_inst = module.x() x_inst.value = 25 @@ -26,7 +29,7 @@ self.failUnless( 0 == module.x_value(False) ) def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite @@ -34,4 +37,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-14 05:10:09
|
Revision: 539 http://svn.sourceforge.net/pygccxml/?rev=539&view=rev Author: roman_yakovenko Date: 2006-09-13 22:09:55 -0700 (Wed, 13 Sep 2006) Log Message: ----------- fixing "create_castinig_constructor" functionality. Py++ will do generate them by default Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/module_builder/builder.py pyplusplus_dev/unittests/casting_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-09-13 11:08:13 UTC (rev 538) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-09-14 05:09:55 UTC (rev 539) @@ -216,7 +216,7 @@ declarations.constructor_t.__init__( self, *arguments, **keywords ) calldef_t.__init__( self ) self._body = '' - self._allow_implicit_conversion = False + self._allow_implicit_conversion = True def _get_body(self): return self._body @@ -255,7 +255,7 @@ self._allow_implicit_conversion = allow_implicit_conversion allow_implicit_conversion = property( _get_allow_implicit_conversion, _set_allow_implicit_conversion , doc="boolean, indicates whether Py++ should generate implicitly_convertible code or not" \ - "Default value is calculated from the constructor type" ) + "Default value is calculated from the constructor type." ) class destructor_t( declarations.destructor_t, calldef_t ): """you may ignore this class for he time being. Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-09-13 11:08:13 UTC (rev 538) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-09-14 05:09:55 UTC (rev 539) @@ -203,7 +203,7 @@ def build_code_creator( self , module_name , boost_python_ns_name='bp' - , create_castinig_constructor=False + , create_castinig_constructor=True , call_policies_resolver_=None , types_db=None , target_configuration=None @@ -226,13 +226,14 @@ and returns documentation string @type doc_extractor: callable or None """ - if create_castinig_constructor: - msg = os.linesep.join([ + msg = os.linesep.join([ "create_castinig_constructor argument is deprecated and should not be used." , "If you still want Py++ to generate implicitly_convertible code, consider to use allow_implicit_conversion constructor property" , "mb = module_builder_t(...)" , "mb.constructors().allow_implicit_conversion = True"]) - warnings.warn(msg, DeprecationWarning, stacklevel=2) + warnings.warn(msg, DeprecationWarning, stacklevel=2) + + if create_castinig_constructor: self.global_ns.constructors().allow_implicit_conversion = True creator = mcreator_package.creator_t( self.global_ns Modified: pyplusplus_dev/unittests/casting_tester.py =================================================================== --- pyplusplus_dev/unittests/casting_tester.py 2006-09-13 11:08:13 UTC (rev 538) +++ pyplusplus_dev/unittests/casting_tester.py 2006-09-14 05:09:55 UTC (rev 539) @@ -17,9 +17,6 @@ , tester_t.EXTENSION_NAME , *args ) - def customize( self, mb ): - mb.constructors().allow_implicit_conversion = True - def run_tests( self, module): x_inst = module.x() x_inst.value = 25 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-14 06:19:30
|
Revision: 542 http://svn.sourceforge.net/pygccxml/?rev=542&view=rev Author: roman_yakovenko Date: 2006-09-13 23:19:18 -0700 (Wed, 13 Sep 2006) Log Message: ----------- fixing small bugs in file_writers. Bug was related to nested class associated declarations Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/unittests/algorithms_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-09-14 05:31:09 UTC (rev 541) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-09-14 06:19:18 UTC (rev 542) @@ -99,6 +99,18 @@ """ references to class declaration code creators. """ return self._associated_decl_creators + def recursive_associated_decl_creators( self ): + """ references to all class declaration code creators. """ + associated_creators = self.associated_decl_creators[:] + + relevant_creators = filter( lambda creator: isinstance( creator, class_t ) + , algorithm.make_flatten( self.creators ) ) + + map( lambda creator: associated_creators.extend( creator.associated_decl_creators ) + , relevant_creators ) + + return associated_creators + def _get_held_type(self): return self.declaration.held_type def _set_held_type(self, held_type): Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-14 05:31:09 UTC (rev 541) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-14 06:19:18 UTC (rev 542) @@ -72,7 +72,7 @@ header_file = os.path.join( self.directory_path, self.wrapper_header(class_creator) ) self.write_file( header_file, wrapper_code ) - def split_internal_creators( self, class_creator, creators, pattern ): + def split_internal_creators( self, class_creator, creators, pattern, decl_creators=None): file_path = os.path.join( self.directory_path , self.create_base_fname( class_creator, pattern ) ) @@ -104,6 +104,12 @@ source_code.append( '' ) source_code.append( self.create_namespaces_code( creators ) ) + if decl_creators: + for decl_creator in decl_creators: + source_code.append( '' ) + source_code.append( decl_creator.create() ) + decl_creator.create = lambda: '' + # Write the register() function... source_code.append( '' ) source_code.append( '%s{' % function_decl ) @@ -175,7 +181,14 @@ def split_internal_classes( self, class_creator ): class_types = ( code_creators.class_t, code_creators.class_declaration_t ) creators = filter( lambda x: isinstance(x, class_types ), class_creator.creators ) - self.split_internal_creators( class_creator, creators, 'classes' ) + + decl_creators = [] + for creator in creators: + if not isinstance( creator, code_creators.class_t ): + continue + decl_creators.extend( creator.recursive_associated_decl_creators() ) + + self.split_internal_creators( class_creator, creators, 'classes', decl_creators ) return 'classes' def split_internal_member_variables( self, class_creator ): Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-14 05:31:09 UTC (rev 541) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-14 06:19:18 UTC (rev 542) @@ -199,7 +199,7 @@ class_wrapper = None decl_creators = [] if isinstance( class_creator, code_creators.class_t ): - decl_creators.extend( class_creator.associated_decl_creators ) + decl_creators.extend( class_creator.recursive_associated_decl_creators() ) if class_creator.wrapper: class_wrapper = class_creator.wrapper decl_creators.append( class_creator.wrapper ) Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2006-09-14 05:31:09 UTC (rev 541) +++ pyplusplus_dev/unittests/algorithms_tester.py 2006-09-14 06:19:18 UTC (rev 542) @@ -121,22 +121,59 @@ minus_minus = xxx.operator( symbol='--' ) self.failUnless( 1 == len( minus_minus.readme() ), os.linesep.join( minus_minus.readme() ) ) +class multiple_files_tester_t(unittest.TestCase): + CLASS_DEF = \ + """ + namespace tester{ + struct b{ + enum EColor{ red, blue }; + enum EFruit{ apple, orange }; + + b(){} + b( int ){} + + void do_nothing(){} + + int do_somghing(){ return 1; } + + int m_dummy; + + struct b_nested{}; + }; + } + """ + def test(self): + mb = module_builder.module_builder_t( + [ module_builder.create_text_fc( self.CLASS_DEF ) ] + , gccxml_path=autoconfig.gccxml.executable ) + mb.namespace( name='::tester' ).include() + b = mb.class_( 'b' ) + b.add_declaration_code( '//hello world' ) + nested = b.class_( 'b_nested' ) + nested.add_declaration_code( '//hello nested decl' ) + nested.add_registration_code( '//hello nested reg', False ) + + mb.build_code_creator('b_multi') + mb.split_module( autoconfig.build_dir, on_unused_file_found=lambda fpath: fpath ) + class class_multiple_files_tester_t(unittest.TestCase): CLASS_DEF = \ """ namespace tester{ - struct X{ + struct x{ enum EColor{ red, blue }; enum EFruit{ apple, orange }; - X(){} - X( int ){} + x(){} + x( int ){} void do_nothing(){} int do_somghing(){ return 1; } int m_dummy; + + struct x_nested{}; }; } """ @@ -145,11 +182,16 @@ [ module_builder.create_text_fc( self.CLASS_DEF ) ] , gccxml_path=autoconfig.gccxml.executable ) mb.namespace( name='::tester' ).include() - X = mb.class_( 'X' ) - X.add_declaration_code( '//hello world' ) - mb.build_code_creator('dummy') + x = mb.class_( 'x' ) + x.add_registration_code( '//hello world reg' ) + x.add_declaration_code( '//hello world decl' ) + nested = x.class_( 'x_nested' ) + nested.add_declaration_code( '//hello nested decl' ) + nested.add_registration_code( '//hello nested reg', False ) + + mb.build_code_creator('x_class_multi') mb.split_module( autoconfig.build_dir - , [ mb.class_( '::tester::X' ) ] + , [ mb.class_( '::tester::x' ) ] , on_unused_file_found=lambda fpath: fpath ) @@ -169,6 +211,8 @@ def create_suite(): suite = unittest.TestSuite() + multiple_files_tester_t + suite.addTest( unittest.makeSuite(multiple_files_tester_t)) suite.addTest( unittest.makeSuite(doc_extractor_tester_t)) suite.addTest( unittest.makeSuite(class_organizer_tester_t)) suite.addTest( unittest.makeSuite(indent_tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-21 19:14:04
|
Revision: 574 http://svn.sourceforge.net/pygccxml/?rev=574&view=rev Author: roman_yakovenko Date: 2006-09-21 12:13:52 -0700 (Thu, 21 Sep 2006) Log Message: ----------- fixing bug in associated_decl_creators functionality Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/algorithms_tester.py Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-21 12:41:16 UTC (rev 573) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-09-21 19:13:52 UTC (rev 574) @@ -157,7 +157,7 @@ return patterns def split_internal_memfuns( self, class_creator ): - calldef_types = ( code_creators.mem_fun_t ) + calldef_types = ( code_creators.mem_fun_t, code_creators.mem_fun_overloads_t ) return self.split_internal_calldefs( class_creator, calldef_types, 'memfuns' ) def split_internal_v_memfuns( self, class_creator ): Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-21 12:41:16 UTC (rev 573) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-09-21 19:13:52 UTC (rev 574) @@ -70,10 +70,10 @@ internal_creators = [] if isinstance( creator, code_creators.compound_t ): - internal_creators.extend( - filter( lambda acreator: isinstance( acreator, code_creators.compound_t ) + internal_creators.extend( + filter( lambda creator: isinstance( creator, code_creators.registration_based_t ) , code_creators.make_flatten( creator.creators ) ) ) - + map( lambda internal_creator: associated_creators.extend( internal_creator.associated_decl_creators ) , internal_creators ) #now associated_creators contains all code creators associated with the creator @@ -315,8 +315,8 @@ def split_free_functions( self ): """Write all free functions into a separate .h/.cpp file. """ - creators = filter( lambda x: isinstance(x, code_creators.free_function_t ) - , self.extmodule.body.creators ) + free_functions = ( code_creators.free_function_t, code_creators.free_fun_overloads_t ) + creators = filter( lambda x: isinstance(x, free_functions ), self.extmodule.body.creators ) self.split_creators( creators, '_free_functions', 'register_free_functions', -1 ) #TODO: move write_main to __init__ Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-21 12:41:16 UTC (rev 573) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-21 19:13:52 UTC (rev 574) @@ -646,11 +646,13 @@ if None is f.call_policies: f.call_policies = self.__call_policies_resolver( f ) self.register_opaque_type( f.return_type, f.call_policies ) + 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 ) else: self.__types_db.update( self.curr_decl ) if None is self.curr_decl.call_policies: @@ -687,10 +689,11 @@ overloads_cls_creator = code_creators.mem_fun_overloads_class_t( overloads ) self.__extmodule.adopt_declaration_creator( overloads_cls_creator ) - cls_creator.associated_decl_creators.append( 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 ) return exposed def visit_class(self ): Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2006-09-21 12:41:16 UTC (rev 573) +++ pyplusplus_dev/unittests/algorithms_tester.py 2006-09-21 19:13:52 UTC (rev 574) @@ -125,6 +125,9 @@ CLASS_DEF = \ """ namespace tester{ + + void check_overload( int i=0, int j=1, int k=2 ); + struct b{ enum EColor{ red, blue }; enum EFruit{ apple, orange }; @@ -134,8 +137,10 @@ void do_nothing(){} - int do_somghing(){ return 1; } + int do_something(){ return 1; } + void check_overload( int i=0, int j=1, int k=2 ); + int m_dummy; struct b_nested{}; @@ -147,6 +152,7 @@ [ module_builder.create_text_fc( self.CLASS_DEF ) ] , gccxml_path=autoconfig.gccxml.executable ) mb.namespace( name='::tester' ).include() + mb.calldefs( 'check_overload' ).use_overload_macro = True b = mb.class_( 'b' ) b.add_declaration_code( '//hello world' ) nested = b.class_( 'b_nested' ) @@ -160,6 +166,9 @@ CLASS_DEF = \ """ namespace tester{ + + void check_overload( int i=0, int j=1, int k=2 ); + struct x{ enum EColor{ red, blue }; enum EFruit{ apple, orange }; @@ -169,7 +178,9 @@ void do_nothing(){} - int do_somghing(){ return 1; } + int do_something(){ return 1; } + + void check_overload( int i=0, int j=1, int k=2 ); int m_dummy; @@ -188,6 +199,7 @@ nested = x.class_( 'x_nested' ) nested.add_declaration_code( '//hello nested decl' ) nested.add_registration_code( '//hello nested reg', False ) + mb.calldefs( 'check_overload' ).use_overload_macro = True mb.build_code_creator('x_class_multi') mb.split_module( autoconfig.build_dir This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-24 18:11:24
|
Revision: 581 http://svn.sourceforge.net/pygccxml/?rev=581&view=rev Author: roman_yakovenko Date: 2006-09-24 11:07:46 -0700 (Sun, 24 Sep 2006) Log Message: ----------- adding initial support for automatic registrayion of opaque type Modified Paths: -------------- pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/unittests/operators_bug_tester.py Modified: pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml 2006-09-24 07:00:50 UTC (rev 580) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml 2006-09-24 18:07:46 UTC (rev 581) @@ -1,13 +1,13 @@ <?xml version="1.0"?> <GCC_XML cvs_revision="1.113"> - <Namespace id="_1" name="::" members="_3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _30 _31 _32 _33 _34 _35 _36 _37 _38 _39 _40 _41 _42 _43 _44 _45 _46 _47 _48 _49 _50 _51 _52 _53 _54 _55 _56 _57 _58 _59 _60 _61 _62 _63 _64 _65 _66 _67 _68 _69 _70 _71 _72 _73 _74 _75 _76 _77 _78 _79 _80 _81 _82 _83 _84 _85 _86 _87 _88 _89 _90 _91 _92 _93 _94 _95 _96 _97 _98 _99 _100 _101 _102 _103 _104 _105 _106 _107 _108 _109 _110 _111 _112 _113 _114 _115 _116 _117 _118 _119 _120 _121 _122 _123 _124 _125 _126 _127 _128 _129 _130 _131 _132 _133 _134 _135 _136 _137 _138 _139 _140 _141 _142 _143 _144 _145 _146 _147 _148 _149 _150 _151 _152 _153 _154 _155 _156 _157 _158 _159 _160 _161 _162 _163 _164 _165 _166 _167 _168 _169 _170 _171 _172 _173 _174 _175 _176 _177 _178 _179 _180 _181 _182 _183 _184 _185 _186 _187 _188 _189 _190 _191 _192 _193 _194 _195 _196 _197 _198 _199 _200 _201 _202 _203 _204 _205 _206 _207 _208 _209 _210 _211 _212 _213 _214 _215 _216 _217 _218 _219 _220 _221 _222 _223 _224 _225 _226 _227 _228 _229 _230 _231 _232 _233 _234 _235 _236 _237 _238 _239 _240 _241 _242 _243 _244 _245 _246 _247 _248 _249 _250 _251 _252 _253 _254 _255 _256 _257 _258 _259 _260 _261 _262 _263 _264 _265 _266 _267 _268 _269 _270 _271 _272 _273 _274 _275 _276 _277 _278 _279 _280 _281 _282 _283 _284 _285 _286 _287 _288 _289 _290 _291 _292 _293 _294 _295 _296 _297 _298 _299 _300 _301 _302 _303 _304 _305 _306 _307 _308 _309 _310 _311 _312 _313 _314 _315 _316 _317 _318 _319 _320 _321 _322 _323 _324 _325 _326 _327 _328 _329 _330 _331 _332 _333 _334 _335 _336 _337 _338 _339 _340 _341 _342 _343 _344 _345 _346 _347 _348 _349 _350 _351 _352 _353 _354 _355 _356 _357 _358 _359 _360 _361 _362 _363 _364 _365 _366 _367 _368 _369 _370 _371 _372 _373 _374 _375 _376 _377 _378 _379 _380 _381 _382 _383 _384 _385 _386 _387 _388 _389 _390 _391 _392 _393 _394 _395 _396 _397 _398 _399 _400 _401 _402 _403 _404 _405 _406 _407 _408 _409 _410 _411 _412 _413 _414 _415 _416 _417 _418 _419 _420 _421 _422 _423 _424 _425 _426 _427 _428 _429 _430 _431 _432 _433 _434 _435 _436 _437 _438 _439 _440 _441 _442 _443 _444 _445 _446 _447 _448 _449 _450 _451 _452 _453 _454 _455 _456 _457 _458 _459 _460 _461 _462 _463 _464 _465 _466 _467 _468 _469 _470 _471 _472 _473 _474 _475 _476 _477 _478 _479 _480 _482 _483 _484 _485 _486 _487 _488 _489 _490 _491 _492 _493 _494 _495 _496 _497 _498 _499 _501 _502 _503 _504 _505 _506 _508 _509 _510 _511 _512 _513 _514 _515 _516 _517 _518 _519 _520 _521 _522 _523 _524 _525 _526 _527 _528 _529 _530 _531 _532 _533 _534 _535 _536 _537 _538 _539 _540 _541 _542 _543 _544 _545 _546 _547 _548 _549 _550 _551 _552 _553 _554 _555 _556 _557 _558 _559 _560 _561 _562 _563 _564 _565 _566 _567 _568 _569 _570 _571 _572 _573 _574 _575 _576 _577 _578 _579 _580 _581 _582 _583 _584 _585 _586 _587 _588 _589 _590 _591 _592 _593 _594 _595 _596 _597 _598 _599 _600 _601 _602 _603 _604 _605 _606 _607 _608 _609 _610 _611 _612 _613 _614 _615 _616 _617 _618 _619 _621 _622 _623 _624 _625 _626 _627 _628 _629 _630 _631 _632 _633 _634 _635 _636 _638 _639 _640 _641 _642 _643 _644 _645 _646 _647 _648 _649 _650 _651 _652 _653 _654 _655 _656 _657 _658 _659 _660 _661 _662 _663 _664 _665 _666 _667 _668 _669 _670 _671 _672 _673 _674 _675 _676 _677 _678 _679 _680 _681 _682 _683 _684 _685 _686 _687 _688 _689 _690 _691 _692 _693 _694 _695 _696 _697 _698 _699 _700 _701 _702 _703 _704 _705 _706 _707 _708 _709 _710 _711 _712 _713 _714 _715 _716 _717 _718 _719 _720 _721 _722 _723 _724 _725 _726 _727 _728 _729 _730 _731 _732 _733 _734 _735 _736 _737 _738 _739 _740 _741 _742 _743 _744 _745 _746 _747 _748 _749 _750 _751 _752 _753 _754 _755 _756 _757 _758 _759 _760 _761 _762 _763 _764 _766 _767 _768 _769 _770 _771 _772 _773 _774 _775 _776 _777 _778 _779 _780 _781 _782 _783 _784 _785 _786 _787 _788 _789 _790 _791 _792 _793 _794 _795 _796 _797 _798 _799 _800 _801 _802 _803 _804 _805 _806 _807 _808 _809 _810 _811 _812 _813 _814 _815 _816 _817 _819 _820 _821 _823 _824 _825 _826 _827 _828 _829 _830 _831 _832 _833 _834 _835 _836 _837 _838 _839 _840 _841 _842 _843 _844 _845 _846 _847 _848 _849 _850 _851 _852 _853 _854 _855 _856 _857 _858 _859 _860 _861 _862 _863 _864 _865 _866 _867 _868 _869 _870 _871 _872 _873 _874 _875 _876 _877 _878 _879 _880 _881 _882 _883 _884 _885 _886 _887 _888 _889 _890 _891 _892 _893 _894 _895 _896 _897 _898 _899 _900 _901 _902 _903 _904 _905 _906 _907 _908 _909 _910 _911 _912 _913 _914 _915 _916 _917 _918 _919 _920 _921 _922 _923 _924 _925 _926 _927 _928 _929 _930 _931 _932 _933 _934 _935 _936 _937 _938 _939 _940 _941 _942 _943 _944 _945 _946 _947 _948 _949 _950 _951 _952 _953 _954 _955 _956 _957 _958 _959 _960 _961 _962 _963 _964 _965 _966 _967 _968 _969 _970 _971 _972 _973 _974 _975 _976 _977 _978 _979 _980 _981 _982 _983 _984 _985 _986 _987 _988 _989 _990 _991 _992 _993 _994 _995 _996 _997 _998 _999 _1000 _1001 _1002 _1003 _1005 _1006 _1007 _1008 _1009 _1010 _1011 _1012 _1013 _1014 _1015 _1016 _1017 _1018 _1019 _1020 _1021 _1022 _1023 _1024 _1025 _1026 _1027 _1028 _1029 _1030 _1031 _1032 _1033 _1034 _1035 _1036 _1037 _1038 _1039 _1040 _1041 _1042 _1043 _1044 _1045 _1046 _1047 _1048 _1049 _1050 _1051 _1052 _1053 _1054 _1055 _1056 _1057 _1058 _1059 _1060 _1061 _1062 _1063 _1064 _1065 _1066 _1067 _1068 _1069 _1070 _1071 _1072 _1073 _1074 _1075 _1076 _1077 _1078 _1079 _1080 _1081 _1082 _1083 _1084 _1085 _1086 _1087 _1088 _1089 _1090 _1091 _1092 _1093 _1094 _1095 _1096 _1097 _1098 _1099 _1100 _1101 _1102 _1103 _1104 _1106 _1108 _1110 _1111 _1112 _1113 _1114 _1115 _1116 _1117 _1118 _1119 _1120 _1121 _1122 _1123 _1124 _1125 _1126 _1127 _1128 _1129 _1130 _1131 _1132 _1133 _1135 _1134 _1137 _1139 _1141 _1143 _1144 _1145 _1146 _1147 _1148 _1149 _1150 _1151 _1152 _1153 _1155 _1156 _1157 _1158 _1160 _1161 _1163 _1164 _1166 _1167 _1169 _1171 _1173 _1175 _1177 _1179 _1181 _1183 _1185 _1186 _1187 _1188 _1189 _1190 _1191 _1105 _1107 _765 _1192 _1194 _1195 _1193 _1196 _1197 _1198 _1199 _1200 _1201 _1202 _1203 _1204 _1205 _1206 _1207 _1208 _1209 _1210 _1211 _1212 _1213 _1214 _1215 _1216 _1217 _1218 _1219 _1220 _1221 _1222 _1223 _1224 _1225 _1226 _1227 _1228 _1229 _1230 _1231 _1232 _1233 _1234 _1235 _1236 _1237 _1238 _1239 _1241 _1242 _1243 _1244 _1245 _1247 _1249 _1250 _1251 _1252 _1253 _1255 _1256 _1257 _1258 _1260 _1261 _1262 _1263 _1264 _1265 _1266 _1267 _1268 _1269 _1270 _1271 _1272 _1273 _1274 _1275 _1276 _1277 _1278 _1279 _1280 _1281 _1282 _1283 _1284 _1285 _1286 _1287 _1288 _1289 _1290 _1291 _1292 _1293 _1294 _1295 _1296 _1297 _1298 _1299 _1300 _1301 _1302 _1303 _1304 _1305 _1306 _1307 _1308 _1309 _1310 _1311 _1312 _1313 _1314 _1315 _1316 _1317 _1318 _1319 _1320 _1321 _1322 _1323 _1324 _1325 _1326 _1327 _1328 _1329 _1330 _1331 _1332 _1333 _1334 _1335 _1336 _1337 _1338 _1339 _1340 _1341 _1342 _1343 _1344 _1345 _1346 _1347 _1348 _1349 _1350 _1351 _1352 _1353 _1354 _1355 _1356 _1357 _1358 _1359 _1360 _1361 _1362 _1363 _1364 _1365 _1366 _1367 _1368 _1369 _1370 _1371 _1372 _1373 _1374 _1375 _1376 _1377 _1378 _1379 _1380 _1381 _1382 _1383 _1384 _1385 _1386 _1387 _1388 _1389 _1390 _1391 _1392 _1393 _1394 _1395 _1396 _1397 _1398 _1399 _1400 _1401 _1402 _1403 _1404 _1405 _1406 _1407 _1408 _1409 _1410 _1411 _1412 _1413 _1414 _1415 _1416 _1417 _1418 _1419 _1420 _1421 _1422 _1423 _1424 _1425 _1426 _1427 _1428 _1430 _1431 _1432 _1433 _1434 _1435 _1436 _1437 _1438 _1439 _1440 _1441 _1442 _1443 _1444 _1445 _1446 _1447 _1448 _1449 _1450 _1451 _1452 _1453 _1454 _1455 _1456 _1457 _1458 _1459 _1460 _1461 _1462 _1463 _1464 _1465 _1466 _1467 _1468 _1469 _1470 _1471 _1472 _1473 _1474 _1475 _1476 _1477 _1478 _1479 _1480 _1481 _1482 _1483 _1484 _1485 _1486 _1487 _1488 _1489 _1491 _1490 _1492 _1493 _818 _1494 _1495 _1496 _1497 _1499 _1498 _1501 _1502 _1503 _1504 _1505 _1506 _1507 _1508 _1509 _1510 _1512 _1513 _1514 _1515 _1516 _1517 _1518 _1519 _1520 _1521 _1522 _1523 _1525 _1524 _1526 _1527 _1528 _1529 _1530 _1531 _1532 _1533 _1534 _1535 _1536 _1537 _1538 _1539 _1540 _1541 _1542 _1543 _1544 _1545 _1546 _1547 _1548 _1549 _1550 _1551 _1552 _1553 _1554 _1555 _1556 _1557 _1558 _1559 _1560 _1562 _1563 _1564 _1565 _1566 _1567 _1568 _1569 _1570 _1571 _1573 _1574 _1575 _1576 _1577 _1578 _1579 _1580 _1581 _1582 _1583 _1584 _1585 _1586 _1587 _1588 _1589 _1590 _1591 _1592 _1593 _1594 _1561 _1595 _1596 _1597 _1598 _1599 _1600 _1601 _1602 _1603 _1604 _1605 _1606 _1607 _1608 _1609 _1610 _1611 _1612 _1613 _1614 _1615 _1616 _1617 _1618 _1619 _1620 _1621 _1622 _1623 _1624 _1625 _1626 _1627 _1628 _1629 _1630 _1631 _1632 _1633 _1634 _1635 _1636 _1637 _1638 _1639 _1640 _1641 _1642 _1643 _1644 _1645 _1646 _1647 _1648 _1649 _1650 _1651 _1652 _1653 _1654 _1655 _1656 _1657 _1658 _1659 _1660 _1661 _1662 _1663 _1664 _1665 _1666 _1667 _1668 _1669 _1670 _1671 _1672 _1673 _1674 _1675 _1676 _1677 _1678 _1679 _1680 _1681 _1682 _1683 _1684 _1685 _1686 _1687 _1688 _1689 _1690 _1691 _1692 _1693 _1694 _1695 _1696 _1697 _1698 _1699 _1700 _1701 _1702 _1703 _1704 _1705 _1706 _1707 _1708 _1709 _1710 _1711 _1712 _1713 _1714 _1715 _1716 _1717 _1718 _1719 _1720 _1721 _1722 _1723 _1724 _1725 _1726 _1727 _1728 _1729 _1730 _1731 _1732 _1733 _1734 _1735 _1736 _1737 _1738 _1739 _1740 _1741 _1742 _1743 _1744 _1745 _1746 _1747 _1748 _1749 _1750 _1751 _1752 _1753 _1754 _1755 _1756 _1757 _1758 _1759 _1760 _1761 _1762 _1763 _1764 _1765 _1766 _1767 _1768 _1769 _1770 _1771 _1772 _1773 _1774 _1775 _1776 _1777 _1778 _1779 _1780 _1781 _1782 _1783 _1784 _1785 _1786 _1787 _1788 _1789 _1790 _1791 _1792 _1793 _1794 _1795 _1796 _1797 _1798 _1799 _1800 _1801 _1802 _1803 _1804 _1805 _1806 _1807 _1808 _1809 _1810 _1811 _1812 _1813 _1814 _1815 _1816 _1817 _1818 _1819 _1820 _1821 _1822 _1823 _1824 _1825 _1826 _1827 _1828 _1829 _1830 _1831 _1832 _1833 _1834 _1835 _1836 _1837 _1838 _1839 _1840 _1841 _1842 _1843 _1844 _1845 _1846 _1847 _1848 _1849 _1850 " mangled="_Z2::" demangled="::"/> - <Namespace id="_2" name="std" context="_1" members="_1852 _1853 _1854 _1855 _1856 _1857 _1858 _1859 _1860 _1861 _1862 _1863 _1864 _1865 _1866 _1867 _1868 _1869 _1870 _1871 _1872 _1873 _1874 _1875 _1876 _1877 _1878 _1879 _1880 _1881 _1882 _1883 _1884 _1885 _1886 _1887 _1888 _1889 _1890 _1891 _1892 _1893 _1894 _1895 _1896 _1897 _1898 _1899 _1900 _1901 _1906 _1907 _1912 _1913 _1926 _1927 _1932 _1933 _1938 _1939 _1940 _1941 _1942 _1943 _1944 _1945 _1946 _1947 _1948 _1962 _1963 _1964 _1965 _1966 _1967 _1968 _1969 _1970 _1971 _1974 _1979 _1980 _1981 _1982 _1987 _1988 _1989 _1990 _1993 _1994 _1995 _1996 _1997 _1998 _1999 _2000 _2001 _2002 _2003 _2012 _2013 _2014 _2045 _2054 _2055 _2056 _2057 _2058 _2059 _2060 _2061 _2062 _2063 _2064 _2065 _2066 _2067 _2068 _2069 _2070 _2071 _2072 _2073 _2074 _2075 _2076 _2077 _2078 _2079 _2080 _2081 _2082 _2083 _2084 _2085 _2086 _2087 _2088 _2089 _2090 _2091 _2092 _2093 _2094 _2095 _2096 _2097 _2098 _2099 _2100 _2106 _2107 _2148 _2149 _2150 _2168 _2169 _2209 _2211 _2212 _2213 _2274 _2287 _2296 _2313 _2314 _2319 _2321 _2322 _2323 _2330 _2331 _2332 _2455 _2456 _2457 _2458 _2459 _2460 _2461 _2462 _2463 _2465 _2467 _2469 _2471 _2473 _2475 _2477 _2479 _2481 _2483 _2485 _2487 _2489 _2491 _2493 _2495 _2497 _2499 _2501 _2503 _2505 _2507 _2509 _2511 _2513 _2515 _2516 _2521 _2522 _2523 _2524 _2525 _2526 _2527 _2528 _2529 _2530 _2531 _2532 _2533 _2534 _2536 _2537 _2538 _2539 _2540 _2541 _2542 _2543 _2544 _2546 _2548 _2567 _2568 _2569 _2570 _2571 _2572 _2573 _2574 _2575 _2638 _2639 _2640 _2641 _2642 _2643 _2644 _2653 _2654 _2655 " mangled="_Z3std" demangled="std"/> - <Function id="_3" name="_GLOBAL__D__home_roman_pygccxml_sources_sources_pyplusplus_dev_examples_pyboost_dev_dev_date_time_include_date_time.pypp.hppsxu6vd" returns="_1154" context="_1" location="f0:131" file="f0" line="131" endline="131"/> - <Function id="_4" name="_GLOBAL__I__home_roman_pygccxml_sources_sources_pyplusplus_dev_examples_pyboost_dev_dev_date_time_include_date_time.pypp.hppsxu6vd" returns="_1154" context="_1" location="f0:131" file="f0" line="131" endline="131"/> - <Variable id="_5" name="_ZGVN5boost9date_time10date_facetINS_9gregorian4dateEcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE" type="_1248" context="_1" location="f1:372" file="f1" line="372" artificial="1"/> - <Function id="_6" name="__static_initialization_and_destruction_0" returns="_1154" context="_1" mangled="_Z41__static_initialization_and_destruction_0ii" demangled="__static_initialization_and_destruction_0(int, int)" location="f0:131" file="f0" line="131" endline="76"> - <Argument name="__initialize_p" type="_500" location="f0:131" file="f0" line="131"/> - <Argument name="__priority" type="_500" location="f0:131" file="f0" line="131"/> + <Namespace id="_1" name="::" members="_3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _30 _31 _32 _33 _34 _35 _36 _37 _38 _39 _40 _41 _42 _43 _44 _45 _46 _47 _48 _49 _50 _51 _52 _53 _54 _55 _56 _57 _58 _59 _60 _61 _62 _63 _64 _65 _66 _67 _68 _69 _70 _71 _72 _73 _74 _75 _76 _77 _78 _79 _80 _81 _82 _83 _84 _85 _86 _87 _88 _89 _90 _91 _92 _93 _94 _95 _96 _97 _98 _99 _100 _101 _102 _103 _104 _105 _106 _107 _108 _109 _110 _111 _112 _113 _114 _115 _116 _117 _118 _119 _120 _121 _122 _123 _124 _125 _126 _127 _128 _129 _130 _131 _132 _133 _134 _135 _136 _137 _138 _139 _140 _141 _142 _143 _144 _145 _146 _147 _148 _149 _150 _151 _152 _153 _154 _155 _156 _157 _158 _159 _160 _161 _162 _163 _164 _165 _166 _167 _168 _169 _170 _171 _172 _173 _174 _175 _176 _177 _178 _179 _180 _181 _182 _183 _184 _185 _186 _187 _188 _189 _190 _191 _192 _193 _194 _195 _196 _197 _198 _199 _200 _201 _202 _203 _204 _205 _206 _207 _208 _209 _210 _211 _212 _213 _214 _215 _216 _217 _218 _219 _220 _221 _222 _223 _224 _225 _226 _227 _228 _229 _230 _231 _232 _233 _234 _235 _236 _237 _238 _239 _240 _241 _242 _243 _244 _245 _246 _247 _248 _249 _250 _251 _252 _253 _254 _255 _256 _257 _258 _259 _260 _261 _262 _263 _264 _265 _266 _267 _268 _269 _270 _271 _272 _273 _274 _275 _276 _277 _278 _279 _280 _281 _282 _283 _284 _285 _286 _287 _288 _289 _290 _291 _292 _293 _294 _295 _296 _297 _298 _299 _300 _301 _302 _303 _304 _305 _306 _307 _308 _309 _310 _311 _312 _313 _314 _315 _316 _317 _318 _319 _320 _321 _322 _323 _324 _325 _326 _327 _328 _329 _330 _331 _332 _333 _334 _335 _336 _337 _338 _339 _340 _341 _342 _343 _344 _345 _346 _347 _348 _349 _350 _351 _352 _353 _354 _355 _356 _357 _358 _359 _360 _361 _362 _363 _364 _365 _366 _367 _368 _369 _370 _371 _372 _373 _374 _375 _376 _377 _378 _379 _380 _381 _382 _383 _384 _385 _386 _387 _388 _389 _390 _391 _392 _393 _394 _395 _396 _397 _398 _399 _400 _401 _402 _403 _404 _405 _406 _407 _408 _409 _410 _411 _412 _413 _414 _415 _416 _417 _418 _419 _420 _421 _422 _423 _424 _425 _426 _427 _428 _429 _430 _431 _432 _433 _434 _435 _436 _437 _438 _439 _440 _441 _442 _443 _444 _445 _446 _447 _448 _449 _450 _451 _452 _453 _454 _455 _456 _457 _458 _459 _460 _461 _462 _463 _464 _465 _466 _467 _468 _469 _470 _471 _472 _473 _474 _475 _476 _477 _478 _479 _480 _481 _483 _484 _485 _486 _487 _488 _489 _490 _491 _492 _493 _494 _495 _496 _497 _498 _499 _500 _502 _503 _504 _505 _506 _507 _509 _510 _511 _512 _513 _514 _515 _516 _517 _518 _519 _520 _521 _522 _523 _524 _525 _526 _527 _528 _529 _530 _531 _532 _533 _534 _535 _536 _537 _538 _539 _540 _541 _542 _543 _544 _545 _546 _547 _548 _549 _550 _551 _552 _553 _554 _555 _556 _557 _558 _559 _560 _561 _562 _563 _564 _565 _566 _567 _568 _569 _570 _571 _572 _573 _574 _575 _576 _577 _578 _579 _580 _581 _582 _583 _584 _585 _586 _587 _588 _589 _590 _591 _592 _593 _594 _595 _596 _597 _598 _599 _600 _601 _602 _603 _604 _605 _606 _607 _608 _609 _610 _611 _612 _613 _614 _615 _616 _617 _618 _619 _620 _622 _623 _624 _625 _626 _627 _628 _629 _630 _631 _632 _633 _634 _635 _636 _637 _639 _640 _641 _642 _643 _644 _645 _646 _647 _648 _649 _650 _651 _652 _653 _654 _655 _656 _657 _658 _659 _660 _661 _662 _663 _664 _665 _666 _667 _668 _669 _670 _671 _672 _673 _674 _675 _676 _677 _678 _679 _680 _681 _682 _683 _684 _685 _686 _687 _688 _689 _690 _691 _692 _693 _694 _695 _696 _697 _698 _699 _700 _701 _702 _703 _704 _705 _706 _707 _708 _709 _710 _711 _712 _713 _714 _715 _716 _717 _718 _719 _720 _721 _722 _723 _724 _725 _726 _727 _728 _729 _730 _731 _732 _733 _734 _735 _736 _737 _738 _739 _740 _741 _742 _743 _744 _745 _746 _747 _748 _749 _750 _751 _752 _753 _754 _755 _756 _757 _758 _759 _760 _761 _762 _763 _764 _765 _767 _768 _769 _770 _771 _772 _773 _774 _775 _776 _777 _778 _779 _780 _781 _782 _783 _784 _785 _786 _787 _788 _789 _790 _791 _792 _793 _794 _795 _796 _797 _798 _799 _800 _801 _802 _803 _804 _805 _806 _807 _808 _809 _810 _811 _812 _813 _814 _815 _816 _817 _818 _820 _821 _822 _824 _825 _826 _827 _828 _829 _830 _831 _832 _833 _834 _835 _836 _837 _838 _839 _840 _841 _842 _843 _844 _845 _846 _847 _848 _849 _850 _851 _852 _853 _854 _855 _856 _857 _858 _859 _860 _861 _862 _863 _864 _865 _866 _867 _868 _869 _870 _871 _872 _873 _874 _875 _876 _877 _878 _879 _880 _881 _882 _883 _884 _885 _886 _887 _888 _889 _890 _891 _892 _893 _894 _895 _896 _897 _898 _899 _900 _901 _902 _903 _904 _905 _906 _907 _908 _909 _910 _911 _912 _913 _914 _915 _916 _917 _918 _919 _920 _921 _922 _923 _924 _925 _926 _927 _928 _929 _930 _931 _932 _933 _934 _935 _936 _937 _938 _939 _940 _941 _942 _943 _944 _945 _946 _947 _948 _949 _950 _951 _952 _953 _954 _955 _956 _957 _958 _959 _960 _961 _962 _963 _964 _965 _966 _967 _968 _969 _970 _971 _972 _973 _974 _975 _976 _977 _978 _979 _980 _981 _982 _983 _984 _985 _986 _987 _988 _989 _990 _991 _992 _993 _994 _995 _996 _997 _998 _999 _1000 _1001 _1002 _1003 _1004 _1006 _1007 _1008 _1009 _1010 _1011 _1012 _1013 _1014 _1015 _1016 _1017 _1018 _1019 _1020 _1021 _1022 _1023 _1024 _1025 _1026 _1027 _1028 _1029 _1030 _1031 _1032 _1033 _1034 _1035 _1036 _1037 _1038 _1039 _1040 _1041 _1042 _1043 _1044 _1045 _1046 _1047 _1048 _1049 _1050 _1051 _1052 _1053 _1054 _1055 _1056 _1057 _1058 _1059 _1060 _1061 _1062 _1063 _1064 _1065 _1066 _1067 _1068 _1069 _1070 _1071 _1072 _1073 _1074 _1075 _1076 _1077 _1078 _1079 _1080 _1081 _1082 _1083 _1084 _1085 _1086 _1087 _1088 _1089 _1090 _1091 _1092 _1093 _1094 _1095 _1096 _1097 _1098 _1099 _1100 _1101 _1102 _1103 _1104 _1105 _1107 _1109 _1111 _1112 _1113 _1114 _1115 _1116 _1117 _1118 _1119 _1120 _1121 _1122 _1123 _1124 _1125 _1126 _1127 _1128 _1129 _1130 _1131 _1132 _1133 _1134 _1136 _1135 _1138 _1140 _1142 _1144 _1145 _1146 _1147 _1148 _1149 _1150 _1151 _1152 _1153 _1154 _1156 _1157 _1158 _1159 _1161 _1162 _1164 _1165 _1167 _1168 _1170 _1172 _1174 _1176 _1178 _1180 _1182 _1184 _1186 _1187 _1188 _1189 _1190 _1191 _1192 _1106 _1108 _766 _1193 _1195 _1196 _1194 _1197 _1198 _1199 _1200 _1201 _1202 _1203 _1204 _1205 _1206 _1207 _1208 _1209 _1210 _1211 _1212 _1213 _1214 _1215 _1216 _1217 _1218 _1219 _1220 _1221 _1222 _1223 _1224 _1225 _1226 _1227 _1228 _1229 _1230 _1231 _1232 _1233 _1234 _1235 _1236 _1237 _1238 _1239 _1240 _1242 _1243 _1244 _1245 _1246 _1248 _1250 _1251 _1252 _1253 _1254 _1256 _1257 _1258 _1259 _1261 _1262 _1263 _1264 _1265 _1266 _1267 _1268 _1269 _1270 _1271 _1272 _1273 _1274 _1275 _1276 _1277 _1278 _1279 _1280 _1281 _1282 _1283 _1284 _1285 _1286 _1287 _1288 _1289 _1290 _1291 _1292 _1293 _1294 _1295 _1296 _1297 _1298 _1299 _1300 _1301 _1302 _1303 _1304 _1305 _1306 _1307 _1308 _1309 _1310 _1311 _1312 _1313 _1314 _1315 _1316 _1317 _1318 _1319 _1320 _1321 _1322 _1323 _1324 _1325 _1326 _1327 _1328 _1329 _1330 _1331 _1332 _1333 _1334 _1335 _1336 _1337 _1338 _1339 _1340 _1341 _1342 _1343 _1344 _1345 _1346 _1347 _1348 _1349 _1350 _1351 _1352 _1353 _1354 _1355 _1356 _1357 _1358 _1359 _1360 _1361 _1362 _1363 _1364 _1365 _1366 _1367 _1368 _1369 _1370 _1371 _1372 _1373 _1374 _1375 _1376 _1377 _1378 _1379 _1380 _1381 _1382 _1383 _1384 _1385 _1386 _1387 _1388 _1389 _1390 _1391 _1392 _1393 _1394 _1395 _1396 _1397 _1398 _1399 _1400 _1401 _1402 _1403 _1404 _1405 _1406 _1407 _1408 _1409 _1410 _1411 _1412 _1413 _1414 _1415 _1416 _1417 _1418 _1419 _1420 _1421 _1422 _1423 _1424 _1425 _1426 _1427 _1428 _1429 _1431 _1432 _1433 _1434 _1435 _1436 _1437 _1438 _1439 _1440 _1441 _1442 _1443 _1444 _1445 _1446 _1447 _1448 _1449 _1450 _1451 _1452 _1453 _1454 _1455 _1456 _1457 _1458 _1459 _1460 _1461 _1462 _1463 _1464 _1465 _1466 _1467 _1468 _1469 _1470 _1471 _1472 _1473 _1474 _1475 _1476 _1477 _1478 _1479 _1480 _1481 _1482 _1483 _1484 _1485 _1486 _1487 _1488 _1489 _1490 _1492 _1491 _1493 _1494 _819 _1495 _1496 _1497 _1498 _1500 _1499 _1502 _1503 _1504 _1505 _1506 _1507 _1508 _1509 _1510 _1511 _1513 _1514 _1515 _1516 _1517 _1518 _1519 _1520 _1521 _1522 _1523 _1524 _1526 _1525 _1527 _1528 _1529 _1530 _1531 _1532 _1533 _1534 _1535 _1536 _1537 _1538 _1539 _1540 _1541 _1542 _1543 _1544 _1545 _1546 _1547 _1548 _1549 _1550 _1551 _1552 _1553 _1554 _1555 _1556 _1557 _1558 _1559 _1560 _1561 _1563 _1564 _1565 _1566 _1567 _1568 _1569 _1570 _1571 _1572 _1574 _1575 _1576 _1577 _1578 _1579 _1580 _1581 _1582 _1583 _1584 _1585 _1586 _1587 _1588 _1589 _1590 _1591 _1592 _1593 _1594 _1595 _1562 _1596 _1597 _1598 _1599 _1600 _1601 _1602 _1603 _1604 _1605 _1606 _1607 _1608 _1609 _1610 _1611 _1612 _1613 _1614 _1615 _1616 _1617 _1618 _1619 _1620 _1621 _1622 _1623 _1624 _1625 _1626 _1627 _1628 _1629 _1630 _1631 _1632 _1633 _1634 _1635 _1636 _1637 _1638 _1639 _1640 _1641 _1642 _1643 _1644 _1645 _1646 _1647 _1648 _1649 _1650 _1651 _1652 _1653 _1654 _1655 _1656 _1657 _1658 _1659 _1660 _1661 _1662 _1663 _1664 _1665 _1666 _1667 _1668 _1669 _1670 _1671 _1672 _1673 _1674 _1675 _1676 _1677 _1678 _1679 _1680 _1681 _1682 _1683 _1684 _1685 _1686 _1687 _1688 _1689 _1690 _1691 _1692 _1693 _1694 _1695 _1696 _1697 _1698 _1699 _1700 _1701 _1702 _1703 _1704 _1705 _1706 _1707 _1708 _1709 _1710 _1711 _1712 _1713 _1714 _1715 _1716 _1717 _1718 _1719 _1720 _1721 _1722 _1723 _1724 _1725 _1726 _1727 _1728 _1729 _1730 _1731 _1732 _1733 _1734 _1735 _1736 _1737 _1738 _1739 _1740 _1741 _1742 _1743 _1744 _1745 _1746 _1747 _1748 _1749 _1750 _1751 _1752 _1753 _1754 _1755 _1756 _1757 _1758 _1759 _1760 _1761 _1762 _1763 _1764 _1765 _1766 _1767 _1768 _1769 _1770 _1771 _1772 _1773 _1774 _1775 _1776 _1777 _1778 _1779 _1780 _1781 _1782 _1783 _1784 _1785 _1786 _1787 _1788 _1789 _1790 _1791 _1792 _1793 _1794 _1795 _1796 _1797 _1798 _1799 _1800 _1801 _1802 _1803 _1804 _1805 _1806 _1807 _1808 _1809 _1810 _1811 _1812 _1813 _1814 _1815 _1816 _1817 _1818 _1819 _1820 _1821 _1822 _1823 _1824 _1825 _1826 _1827 _1828 _1829 _1830 _1831 _1832 _1833 _1834 _1835 _1836 _1837 _1838 _1839 _1840 _1841 _1842 _1843 _1844 _1845 _1846 _1847 _1848 _1849 _1850 _1851 " mangled="_Z2::" demangled="::"/> + <Namespace id="_2" name="std" context="_1" members="_1853 _1854 _1855 _1856 _1857 _1858 _1859 _1860 _1861 _1862 _1863 _1864 _1865 _1866 _1867 _1868 _1869 _1870 _1871 _1872 _1873 _1874 _1875 _1876 _1877 _1878 _1879 _1880 _1881 _1882 _1883 _1884 _1885 _1886 _1887 _1888 _1889 _1890 _1891 _1892 _1893 _1894 _1895 _1896 _1897 _1898 _1899 _1900 _1901 _1902 _1907 _1908 _1913 _1914 _1927 _1928 _1933 _1934 _1939 _1940 _1941 _1942 _1943 _1944 _1945 _1946 _1947 _1948 _1949 _1963 _1964 _1965 _1966 _1967 _1968 _1969 _1970 _1971 _1972 _1975 _1980 _1981 _1982 _1983 _1988 _1989 _1990 _1991 _1994 _1995 _1996 _1997 _1998 _1999 _2000 _2001 _2002 _2003 _2004 _2013 _2014 _2015 _2046 _2055 _2056 _2057 _2058 _2059 _2060 _2061 _2062 _2063 _2064 _2065 _2066 _2067 _2068 _2069 _2070 _2071 _2072 _2073 _2074 _2075 _2076 _2077 _2078 _2079 _2080 _2081 _2082 _2083 _2084 _2085 _2086 _2087 _2088 _2089 _2090 _2091 _2092 _2093 _2094 _2095 _2096 _2097 _2098 _2099 _2100 _2101 _2107 _2108 _2148 _2149 _2150 _2168 _2169 _2209 _2211 _2212 _2213 _2274 _2287 _2296 _2313 _2314 _2319 _2321 _2322 _2323 _2330 _2331 _2332 _2455 _2456 _2457 _2458 _2459 _2460 _2461 _2462 _2463 _2465 _2467 _2469 _2471 _2473 _2475 _2477 _2479 _2481 _2483 _2485 _2487 _2489 _2491 _2493 _2495 _2497 _2499 _2501 _2503 _2505 _2507 _2509 _2511 _2513 _2515 _2516 _2521 _2522 _2523 _2524 _2525 _2526 _2527 _2528 _2529 _2530 _2531 _2532 _2533 _2534 _2536 _2537 _2538 _2539 _2540 _2541 _2542 _2543 _2544 _2546 _2548 _2567 _2568 _2569 _2570 _2571 _2572 _2573 _2574 _2575 _2638 _2639 _2640 _2641 _2642 _2643 _2644 _2653 _2654 _2655 " mangled="_Z3std" demangled="std"/> + <Function id="_3" name="_GLOBAL__D__home_roman_pygccxml_sources_sources_pyplusplus_dev_examples_pyboost_dev_dev_date_time_include_date_time.pypp.hpp7MXvEa" returns="_1155" context="_1" location="f0:131" file="f0" line="131" endline="131"/> + <Function id="_4" name="_GLOBAL__I__home_roman_pygccxml_sources_sources_pyplusplus_dev_examples_pyboost_dev_dev_date_time_include_date_time.pypp.hpp7MXvEa" returns="_1155" context="_1" location="f0:131" file="f0" line="131" endline="131"/> + <Variable id="_5" name="_ZGVN5boost9date_time10date_facetINS_9gregorian4dateEcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE" type="_1249" context="_1" location="f1:372" file="f1" line="372" artificial="1"/> + <Function id="_6" name="__static_initialization_and_destruction_0" returns="_1155" context="_1" mangled="_Z41__static_initialization_and_destruction_0ii" demangled="__static_initialization_and_destruction_0(int, int)" location="f0:131" file="f0" line="131" endline="76"> + <Argument name="__initialize_p" type="_501" location="f0:131" file="f0" line="131"/> + <Argument name="__priority" type="_501" location="f0:131" file="f0" line="131"/> </Function> <Variable id="_7" name="_ZTSSt12out_of_range" type="_2656c" init=""St12out_of_range"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> <Variable id="_8" name="_ZTSN5boost9gregorian11bad_weekdayE" type="_2658c" init=""N5boost9gregorian11bad_weekdayE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> @@ -17,1791 +17,1792 @@ <Variable id="_12" name="_ZTSN5boost12bad_weak_ptrE" type="_2666c" init=""N5boost12bad_weak_ptrE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> <Variable id="_13" name="_ZTSN5boost9gregorian9bad_monthE" type="_2668c" init=""N5boost9gregorian9bad_monthE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> <Variable id="_14" name="_ZTSN5boost16bad_lexical_castE" type="_2670c" init=""N5boost16bad_lexical_castE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> - <Variable id="_15" name="_ZTIs" type="_2672c" context="_1" location="f2:222" file="f2" line="222" extern="1" artificial="1"/> - <Variable id="_16" name="_ZTIx" type="_2672c" context="_1" location="f2:222" file="f2" line="222" extern="1" artificial="1"/> - <Variable id="_17" name="_ZTIi" type="_2672c" context="_1" location="f2:222" file="f2" line="222" extern="1" artificial="1"/> - <Variable id="_18" name="_ZTIt" type="_2672c" context="_1" location="f2:222" file="f2" line="222" extern="1" artificial="1"/> - <Variable id="_19" name="_ZTISs" type="_2674c" context="_1" location="f2:222" file="f2" line="222" extern="1" artificial="1"/> - <Function id="_20" name="__cxa_rethrow" returns="_1154" context="_1" location="f3:575" file="f3" line="575" extern="1"/> - <Variable id="_21" name="_ZTIN5boost9date_time10date_facetINS_9gregorian4dateEcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE" type="_2676c" context="_1" location="f1:45" file="f1" line="45" extern="1" artificial="1"/> - <Variable id="_22" name="_ZTIN5boost10local_time21custom_time_zone_baseIcEE" type="_2676c" context="_1" location="f4:29" file="f4" line="29" extern="1" artificial="1"/> - <Variable id="_23" name="_ZTIN5boost10local_time20posix_time_zone_baseIcEE" type="_2676c" context="_1" location="f5:64" file="f5" line="64" extern="1" artificial="1"/> - <Variable id="_24" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time18nth_kday_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_25" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time19last_last_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_26" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time20first_last_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_27" name="_ZTIN5boost9date_time14time_zone_baseINS_10posix_time5ptimeEcEE" type="_2674c" context="_1" location="f7:33" file="f7" line="33" extern="1" artificial="1"/> - <Variable id="_28" name="_ZTIN5boost9date_time15bad_field_countE" type="_2676c" context="_1" location="f8:40" file="f8" line="40" extern="1" artificial="1"/> - <Variable id="_29" name="_ZTIN5boost9date_time19data_not_accessibleE" type="_2676c" context="_1" location="f8:28" file="f8" line="28" extern="1" artificial="1"/> - <Variable id="_30" name="_ZTISt13basic_fstreamIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:95" file="f9" line="95" extern="1" artificial="1"/> - <Variable id="_31" name="_ZTISt14basic_ofstreamIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:92" file="f9" line="92" extern="1" artificial="1"/> - <Variable id="_32" name="_ZTISt14basic_ifstreamIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:89" file="f9" line="89" extern="1" artificial="1"/> - <Variable id="_33" name="_ZTISt13basic_filebufIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:86" file="f9" line="86" extern="1" artificial="1"/> - <Variable id="_34" name="_ZTISt13basic_fstreamIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:95" file="f9" line="95" extern="1" artificial="1"/> - <Variable id="_35" name="_ZTISt14basic_ofstreamIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:92" file="f9" line="92" extern="1" artificial="1"/> - <Variable id="_36" name="_ZTISt14basic_ifstreamIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:89" file="f9" line="89" extern="1" artificial="1"/> - <Variable id="_37" name="_ZTISt13basic_filebufIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:86" file="f9" line="86" extern="1" artificial="1"/> - <Variable id="_38" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time22partial_date_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_39" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time18nth_last_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_40" name="_ZTIN5boost9date_time17dst_day_calc_ruleINS_9gregorian4dateEEE" type="_2674c" context="_1" location="f6:18" file="f6" line="18" extern="1" artificial="1"/> - <Variable id="_41" name="_ZTIN5boost10local_time14bad_adjustmentE" type="_2676c" context="_1" location="f5:33" file="f5" line="33" extern="1" artificial="1"/> - <Variable id="_42" name="_ZTIN5boost10local_time10bad_offsetE" type="_2676c" context="_1" location="f5:28" file="f5" line="28" extern="1" artificial="1"/> - <Variable id="_43" name="_ZTIN5boost10local_time13dst_not_validE" type="_2676c" context="_1" location="f10:37" file="f10" line="37" extern="1" artificial="1"/> - <Variable id="_44" name="_ZTIN5boost10local_time18time_label_invalidE" type="_2676c" context="_1" location="f10:32" file="f10" line="32" extern="1" artificial="1"/> - <Variable id="_45" name="_ZTIN5boost10local_time16ambiguous_resultE" type="_2676c" context="_1" location="f10:26" file="f10" line="26" extern="1" artificial="1"/> - <Function id="_46" name="matherr" returns="_500" throw="" context="_1" location="f11:293" file="f11" line="293" extern="1"> + <Variable id="_15" name="_ZTIs" type="_2672c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> + <Variable id="_16" name="_ZTIx" type="_2672c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> + <Variable id="_17" name="_ZTIi" type="_2672c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> + <Variable id="_18" name="_ZTIt" type="_2672c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> + <Variable id="_19" name="_ZTISs" type="_2674c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> + <Variable id="_20" name="_ZTIN5boost6detail17lexical_streambufIcEE" type="_2676c" context="_1" location="f2:336" file="f2" line="336" extern="1" artificial="1"/> + <Function id="_21" name="__cxa_rethrow" returns="_1155" context="_1" location="f3:575" file="f3" line="575" extern="1"/> + <Variable id="_22" name="_ZTIN5boost9date_time10date_facetINS_9gregorian4dateEcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE" type="_2676c" context="_1" location="f1:45" file="f1" line="45" extern="1" artificial="1"/> + <Variable id="_23" name="_ZTIN5boost10local_time21custom_time_zone_baseIcEE" type="_2676c" context="_1" location="f4:29" file="f4" line="29" extern="1" artificial="1"/> + <Variable id="_24" name="_ZTIN5boost10local_time20posix_time_zone_baseIcEE" type="_2676c" context="_1" location="f5:64" file="f5" line="64" extern="1" artificial="1"/> + <Variable id="_25" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time18nth_kday_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_26" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time19last_last_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_27" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time20first_last_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_28" name="_ZTIN5boost9date_time14time_zone_baseINS_10posix_time5ptimeEcEE" type="_2674c" context="_1" location="f7:33" file="f7" line="33" extern="1" artificial="1"/> + <Variable id="_29" name="_ZTIN5boost9date_time15bad_field_countE" type="_2676c" context="_1" location="f8:40" file="f8" line="40" extern="1" artificial="1"/> + <Variable id="_30" name="_ZTIN5boost9date_time19data_not_accessibleE" type="_2676c" context="_1" location="f8:28" file="f8" line="28" extern="1" artificial="1"/> + <Variable id="_31" name="_ZTISt13basic_fstreamIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:95" file="f9" line="95" extern="1" artificial="1"/> + <Variable id="_32" name="_ZTISt14basic_ofstreamIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:92" file="f9" line="92" extern="1" artificial="1"/> + <Variable id="_33" name="_ZTISt14basic_ifstreamIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:89" file="f9" line="89" extern="1" artificial="1"/> + <Variable id="_34" name="_ZTISt13basic_filebufIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:86" file="f9" line="86" extern="1" artificial="1"/> + <Variable id="_35" name="_ZTISt13basic_fstreamIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:95" file="f9" line="95" extern="1" artificial="1"/> + <Variable id="_36" name="_ZTISt14basic_ofstreamIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:92" file="f9" line="92" extern="1" artificial="1"/> + <Variable id="_37" name="_ZTISt14basic_ifstreamIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:89" file="f9" line="89" extern="1" artificial="1"/> + <Variable id="_38" name="_ZTISt13basic_filebufIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:86" file="f9" line="86" extern="1" artificial="1"/> + <Variable id="_39" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time22partial_date_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_40" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time18nth_last_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_41" name="_ZTIN5boost9date_time17dst_day_calc_ruleINS_9gregorian4dateEEE" type="_2674c" context="_1" location="f6:18" file="f6" line="18" extern="1" artificial="1"/> + <Variable id="_42" name="_ZTIN5boost10local_time14bad_adjustmentE" type="_2676c" context="_1" location="f5:33" file="f5" line="33" extern="1" artificial="1"/> + <Variable id="_43" name="_ZTIN5boost10local_time10bad_offsetE" type="_2676c" context="_1" location="f5:28" file="f5" line="28" extern="1" artificial="1"/> + <Variable id="_44" name="_ZTIN5boost10local_time13dst_not_validE" type="_2676c" context="_1" location="f10:37" file="f10" line="37" extern="1" artificial="1"/> + <Variable id="_45" name="_ZTIN5boost10local_time18time_label_invalidE" type="_2676c" context="_1" location="f10:32" file="f10" line="32" extern="1" artificial="1"/> + <Variable id="_46" name="_ZTIN5boost10local_time16ambiguous_resultE" type="_2676c" context="_1" location="f10:26" file="f10" line="26" extern="1" artificial="1"/> + <Function id="_47" name="matherr" returns="_501" throw="" context="_1" location="f11:293" file="f11" line="293" extern="1"> <Argument name="__exc" type="_2678" location="f11:293" file="f11" line="293"/> </Function> - <Struct id="_47" name="__exception" context="_1" mangled="11__exception" demangled="__exception" location="f11:284" file="f11" line="284" artificial="1" size="256" align="32" members="_2679 _2680 _2681 _2682 _2683 _2684 _2685 " bases=""/> - <Variable id="_48" name="_LIB_VERSION" type="_49" context="_1" location="f11:269" file="f11" line="269" extern="1"/> - <Enumeration id="_49" name="_LIB_VERSION_TYPE" context="_1" location="f11:264" file="f11" line="264" size="32" align="32"> + <Struct id="_48" name="__exception" context="_1" mangled="11__exception" demangled="__exception" location="f11:284" file="f11" line="284" artificial="1" size="256" align="32" members="_2679 _2680 _2681 _2682 _2683 _2684 _2685 " bases=""/> + <Variable id="_49" name="_LIB_VERSION" type="_50" context="_1" location="f11:269" file="f11" line="269" extern="1"/> + <Enumeration id="_50" name="_LIB_VERSION_TYPE" context="_1" location="f11:264" file="f11" line="264" size="32" align="32"> <EnumValue name="_IEEE_" init="-1"/> <EnumValue name="_SVID_" init="0"/> <EnumValue name="_XOPEN_" init="1"/> <EnumValue name="_POSIX_" init="2"/> <EnumValue name="_ISOC_" init="3"/> </Enumeration> - <Enumeration id="_50" name="._92" context="_1" location="f11:172" file="f11" line="172" artificial="1" size="32" align="32"> + <Enumeration id="_51" name="._92" context="_1" location="f11:172" file="f11" line="172" artificial="1" size="32" align="32"> <EnumValue name="FP_NAN" init="0"/> <EnumValue name="FP_INFINITE" init="1"/> <EnumValue name="FP_ZERO" init="2"/> <EnumValue name="FP_SUBNORMAL" init="3"/> <EnumValue name="FP_NORMAL" init="4"/> </Enumeration> - <Variable id="_51" name="signgam" type="_500" context="_1" location="f11:130" file="f11" line="130" extern="1"/> - <Function id="_52" name="__scalbl" returns="_481" throw="" context="_1" location="f12:360" file="f12" line="360" extern="1"> - <Argument name="__x" type="_481" location="f12:360" file="f12" line="360"/> - <Argument name="__n" type="_481" location="f12:360" file="f12" line="360"/> + <Variable id="_52" name="signgam" type="_501" context="_1" location="f11:130" file="f11" line="130" extern="1"/> + <Function id="_53" name="__scalbl" returns="_482" throw="" context="_1" location="f12:360" file="f12" line="360" extern="1"> + <Argument name="__x" type="_482" location="f12:360" file="f12" line="360"/> + <Argument name="__n" type="_482" location="f12:360" file="f12" line="360"/> </Function> - <Function id="_53" name="scalbl" returns="_481" throw="" context="_1" location="f12:360" file="f12" line="360" extern="1"> - <Argument name="__x" type="_481" location="f12:360" file="f12" line="360"/> - <Argument name="__n" type="_481" location="f12:360" file="f12" line="360"/> + <Function id="_54" name="scalbl" returns="_482" throw="" context="_1" location="f12:360" file="f12" line="360" extern="1"> + <Argument name="__x" type="_482" location="f12:360" file="f12" line="360"/> + <Argument name="__n" type="_482" location="f12:360" file="f12" line="360"/> </Function> - <Function id="_54" name="__fmal" returns="_481" throw="" context="_1" location="f12:355" file="f12" line="355" extern="1"> - <Argument name="__x" type="_481" location="f12:355" file="f12" line="355"/> - <Argument name="__y" type="_481" location="f12:355" file="f12" line="355"/> - <Argument name="__z" type="_481" location="f12:355" file="f12" line="355"/> + <Function id="_55" name="__fmal" returns="_482" throw="" context="_1" location="f12:355" file="f12" line="355" extern="1"> + <Argument name="__x" type="_482" location="f12:355" file="f12" line="355"/> + <Argument name="__y" type="_482" location="f12:355" file="f12" line="355"/> + <Argument name="__z" type="_482" location="f12:355" file="f12" line="355"/> </Function> - <Function id="_55" name="fmal" returns="_481" throw="" context="_1" location="f12:355" file="f12" line="355" extern="1"> - <Argument name="__x" type="_481" location="f12:355" file="f12" line="355"/> - <Argument name="__y" type="_481" location="f12:355" file="f12" line="355"/> - <Argument name="__z" type="_481" location="f12:355" file="f12" line="355"/> + <Function id="_56" name="fmal" returns="_482" throw="" context="_1" location="f12:355" file="f12" line="355" extern="1"> + <Argument name="__x" type="_482" location="f12:355" file="f12" line="355"/> + <Argument name="__y" type="_482" location="f12:355" file="f12" line="355"/> + <Argument name="__z" type="_482" location="f12:355" file="f12" line="355"/> </Function> - <Function id="_56" name="__signbitl" returns="_500" throw="" context="_1" location="f12:351" file="f12" line="351" extern="1" attributes="const"> - <Argument name="__value" type="_481" location="f12:351" file="f12" line="351"/> + <Function id="_57" name="__signbitl" returns="_501" throw="" context="_1" location="f12:351" file="f12" line="351" extern="1" attributes="const"> + <Argument name="__value" type="_482" location="f12:351" file="f12" line="351"/> </Function> - <Function id="_57" name="__fpclassifyl" returns="_500" throw="" context="_1" location="f12:347" file="f12" line="347" extern="1" attributes="const"> - <Argument name="__value" type="_481" location="f12:347" file="f12" line="347"/> + <Function id="_58" name="__fpclassifyl" returns="_501" throw="" context="_1" location="f12:347" file="f12" line="347" extern="1" attributes="const"> + <Argument name="__value" type="_482" location="f12:347" file="f12" line="347"/> </Function> - <Function id="_58" name="__fminl" returns="_481" throw="" context="_1" location="f12:342" file="f12" line="342" extern="1"> - <Argument name="__x" type="_481" location="f12:342" file="f12" line="342"/> - <Argument name="__y" type="_481" location="f12:342" file="f12" line="342"/> + <Function id="_59" name="__fminl" returns="_482" throw="" context="_1" location="f12:342" file="f12" line="342" extern="1"> + <Argument name="__x" type="_482" location="f12:342" file="f12" line="342"/> + <Argument name="__y" type="_482" location="f12:342" file="f12" line="342"/> </Function> - <Function id="_59" name="fminl" returns="_481" throw="" context="_1" location="f12:342" file="f12" line="342" extern="1"> - <Argument name="__x" type="_481" location="f12:342" file="f12" line="342"/> - <Argument name="__y" type="_481" location="f12:342" file="f12" line="342"/> + <Function id="_60" name="fminl" returns="_482" throw="" context="_1" location="f12:342" file="f12" line="342" extern="1"> + <Argument name="__x" type="_482" location="f12:342" file="f12" line="342"/> + <Argument name="__y" type="_482" location="f12:342" file="f12" line="342"/> </Function> - <Function id="_60" name="__fmaxl" returns="_481" throw="" context="_1" location="f12:339" file="f12" line="339" extern="1"> - <Argument name="__x" type="_481" location="f12:339" file="f12" line="339"/> - <Argument name="__y" type="_481" location="f12:339" file="f12" line="339"/> + <Function id="_61" name="__fmaxl" returns="_482" throw="" context="_1" location="f12:339" file="f12" line="339" extern="1"> + <Argument name="__x" type="_482" location="f12:339" file="f12" line="339"/> + <Argument name="__y" type="_482" location="f12:339" file="f12" line="339"/> </Function> - <Function id="_61" name="fmaxl" returns="_481" throw="" context="_1" location="f12:339" file="f12" line="339" extern="1"> - <Argument name="__x" type="_481" location="f12:339" file="f12" line="339"/> - <Argument name="__y" type="_481" location="f12:339" file="f12" line="339"/> + <Function id="_62" name="fmaxl" returns="_482" throw="" context="_1" location="f12:339" file="f12" line="339" extern="1"> + <Argument name="__x" type="_482" location="f12:339" file="f12" line="339"/> + <Argument name="__y" type="_482" location="f12:339" file="f12" line="339"/> </Function> - <Function id="_62" name="__fdiml" returns="_481" throw="" context="_1" location="f12:336" file="f12" line="336" extern="1"> - <Argument name="__x" type="_481" location="f12:336" file="f12" line="336"/> - <Argument name="__y" type="_481" location="f12:336" file="f12" line="336"/> + <Function id="_63" name="__fdiml" returns="_482" throw="" context="_1" location="f12:336" file="f12" line="336" extern="1"> + <Argument name="__x" type="_482" location="f12:336" file="f12" line="336"/> + <Argument name="__y" type="_482" location="f12:336" file="f12" line="336"/> </Function> - <Function id="_63" name="fdiml" returns="_481" throw="" context="_1" location="f12:336" file="f12" line="336" extern="1"> - <Argument name="__x" type="_481" location="f12:336" file="f12" line="336"/> - <Argument name="__y" type="_481" location="f12:336" file="f12" line="336"/> + <Function id="_64" name="fdiml" returns="_482" throw="" context="_1" location="f12:336" file="f12" line="336" extern="1"> + <Argument name="__x" type="_482" location="f12:336" file="f12" line="336"/> + <Argument name="__y" type="_482" location="f12:336" file="f12" line="336"/> </Function> - <Function id="_64" name="__llroundl" returns="_1248" throw="" context="_1" location="f12:332" file="f12" line="332" extern="1"> - <Argument name="__x" type="_481" location="f12:332" file="f12" line="332"/> + <Function id="_65" name="__llroundl" returns="_1249" throw="" context="_1" location="f12:332" file="f12" line="332" extern="1"> + <Argument name="__x" type="_482" location="f12:332" file="f12" line="332"/> </Function> - <Function id="_65" name="llroundl" returns="_1248" throw="" context="_1" location="f12:332" file="f12" line="332" extern="1"> - <Argument name="__x" type="_481" location="f12:332" file="f12" line="332"/> + <Function id="_66" name="llroundl" returns="_1249" throw="" context="_1" location="f12:332" file="f12" line="332" extern="1"> + <Argument name="__x" type="_482" location="f12:332" file="f12" line="332"/> </Function> - <Function id="_66" name="__lroundl" returns="_1511" throw="" context="_1" location="f12:331" file="f12" line="331" extern="1"> - <Argument name="__x" type="_481" location="f12:331" file="f12" line="331"/> + <Function id="_67" name="__lroundl" returns="_1512" throw="" context="_1" location="f12:331" file="f12" line="331" extern="1"> + <Argument name="__x" type="_482" location="f12:331" file="f12" line="331"/> </Function> - <Function id="_67" name="lroundl" returns="_1511" throw="" context="_1" location="f12:331" file="f12" line="331" extern="1"> - <Argument name="__x" type="_481" location="f12:331" file="f12" line="331"/> + <Function id="_68" name="lroundl" returns="_1512" throw="" context="_1" location="f12:331" file="f12" line="331" extern="1"> + <Argument name="__x" type="_482" location="f12:331" file="f12" line="331"/> </Function> - <Function id="_68" name="__llrintl" returns="_1248" throw="" context="_1" location="f12:327" file="f12" line="327" extern="1"> - <Argument name="__x" type="_481" location="f12:327" file="f12" line="327"/> + <Function id="_69" name="__llrintl" returns="_1249" throw="" context="_1" location="f12:327" file="f12" line="327" extern="1"> + <Argument name="__x" type="_482" location="f12:327" file="f12" line="327"/> </Function> - <Function id="_69" name="llrintl" returns="_1248" throw="" context="_1" location="f12:327" file="f12" line="327" extern="1"> - <Argument name="__x" type="_481" location="f12:327" file="f12" line="327"/> + <Function id="_70" name="llrintl" returns="_1249" throw="" context="_1" location="f12:327" file="f12" line="327" extern="1"> + <Argument name="__x" type="_482" location="f12:327" file="f12" line="327"/> </Function> - <Function id="_70" name="__lrintl" returns="_1511" throw="" context="_1" location="f12:326" file="f12" line="326" extern="1"> - <Argument name="__x" type="_481" location="f12:326" file="f12" line="326"/> + <Function id="_71" name="__lrintl" returns="_1512" throw="" context="_1" location="f12:326" file="f12" line="326" extern="1"> + <Argument name="__x" type="_482" location="f12:326" file="f12" line="326"/> </Function> - <Function id="_71" name="lrintl" returns="_1511" throw="" context="_1" location="f12:326" file="f12" line="326" extern="1"> - <Argument name="__x" type="_481" location="f12:326" file="f12" line="326"/> + <Function id="_72" name="lrintl" returns="_1512" throw="" context="_1" location="f12:326" file="f12" line="326" extern="1"> + <Argument name="__x" type="_482" location="f12:326" file="f12" line="326"/> </Function> - <Function id="_72" name="__remquol" returns="_481" throw="" context="_1" location="f12:319" file="f12" line="319" extern="1"> - <Argument name="__x" type="_481" location="f12:319" file="f12" line="319"/> - <Argument name="__y" type="_481" location="f12:319" file="f12" line="319"/> + <Function id="_73" name="__remquol" returns="_482" throw="" context="_1" location="f12:319" file="f12" line="319" extern="1"> + <Argument name="__x" type="_482" location="f12:319" file="f12" line="319"/> + <Argument name="__y" type="_482" location="f12:319" file="f12" line="319"/> <Argument name="__quo" type="_2686" location="f12:319" file="f12" line="319"/> </Function> - <Function id="_73" name="remquol" returns="_481" throw="" context="_1" location="f12:319" file="f12" line="319" extern="1"> - <Argument name="__x" type="_481" location="f12:319" file="f12" line="319"/> - <Argument name="__y" type="_481" location="f12:319" file="f12" line="319"/> + <Function id="_74" name="remquol" returns="_482" throw="" context="_1" location="f12:319" file="f12" line="319" extern="1"> + <Argument name="__x" type="_482" location="f12:319" file="f12" line="319"/> + <Argument name="__y" type="_482" location="f12:319" file="f12" line="319"/> <Argument name="__quo" type="_2686" location="f12:319" file="f12" line="319"/> </Function> - <Function id="_74" name="__truncl" returns="_481" throw="" context="_1" location="f12:314" file="f12" line="314" extern="1" attributes="const"> - <Argument name="__x" type="_481" location="f12:314" file="f12" line="314"/> + <Function id="_75" name="__truncl" returns="_482" throw="" context="_1" location="f12:314" file="f12" line="314" extern="1" attributes="const"> + <Argument name="__x" type="_482" location="f12:314" file="f12" line="314"/> </Function> - <Function id="_75" name="truncl" returns="_481" throw="" context="_1" location="f12:314" file="f12" line="314" extern="1" attributes="const"> - <Argument name="__x" type="_481" location="f12:314" file="f12" line="314"/> + <Function id="_76" name="truncl" returns="_482" throw="" context="_1" location="f12:314" file="f12" line="314" extern="1" attributes="const"> + <Argument name="__x" type="_482" location="f12:314" file="f12" line="314"/> </Function> - <Function id="_76" name="__roundl" returns="_481" throw="" context="_1" location="f12:310" file="f12" line="310" extern="1" attributes="const"> - <Argument name="__x" type="_481" location="f12:310" file="f12" line="310"/> + <Function id="_77" name="__roundl" returns="_482" throw="" context="_1" location="f12:310" file="f12" line="310" extern="1" attributes="const"> + <Argument name="__x" type="_482" location="f12:310" file="f12" line="310"/> </Function> - <Function id="_77" name="roundl" returns="_481" throw="" context="_1" location="f12:310" file="f12" line="310" extern="1" attributes="const"> - <Argument name="__x" type="_481" location="f12:310" file="f12" line="310"/> + <Function id="_78" name="roundl" returns="_482" throw="" context="_1" location="f12:310" file="f12" line="310" extern="1" attributes="const"> + <Argument name="__x" type="_482" location="f12:310" file="f12" line="310"/> </Function> - <Function id="_78" name="__nearbyintl" returns="_481" throw="" context="_1" location="f12:306" file="f12" line="306" extern="1"> - <Argument name="__x" type="_481" location="f12:306" file="f12" line="306"/> + <Function id="_79" name="__nearbyintl" returns="_482" throw="" context="_1" location="f12:306" file="f12" line="306" extern="1"> + <Argument name="__x" type="_482" location="f12:306" file="f12" line="306"/> </Function> - <Function id="_79" name="nearbyintl" returns="_481" throw="" context="_1" location="f12:306" file="f12" line="306" extern="1"> - <Argument name="__x" type="_481" location="f12:306" file="f12" line="306"/> + <Function id="_80" name="nearbyintl" returns="_482" throw="" context="_1" location="f12:306" file="f12" line="306" extern="1"> + <Argument name="__x" type="_482" location="f12:306" file="f12" line="306"/> </Function> - <Function id="_80" name="__scalblnl" returns="_481" throw="" context="_1" location="f12:302" file="f12" line="302" extern="1"> - <Argument name="__x" type="_481" location="f12:302" file="f12" line="302"/> - <Argument name="__n" type="_1511" location="f12:302" file="f12" line="302"/> + <Function id="_81" name="__scalblnl" returns="_482" throw="" context="_1" location="f12:302" file="f12" line="302" extern="1"> + <Argument name="__x" type="_482" location="f12:302" file="f12" line="302"/> + <Argument name="__n" type="_1512" location="f12:302" file="f12" line="302"/> </Function> - <Function id="_81" name="scalblnl" returns="_481" throw="" context="_1" location="f12:302" file="f12" line="302" extern="1"> - <Argument name="__x" type="_481" location="f12:302" file="f12" line="302"/> - <Argument name="__n" type="_1511" location="f12:302" file="f12" line="302"/> + <Function id="_82" name="scalblnl" returns="_482" throw="" context="_1" location="f12:302" file="f12" line="302" extern="1"> + <Argument name="__x" type="_482" location="f12:302" file="f12" line="302"/> + <Argument name="__n" type="_1512" location="f12:302" file="f12" line="302"/> </Function> - <Function id="_82" name="__ilogbl" returns="_500" throw="" context="_1" location="f12:297" file="f12" line="297" extern="1"> - <Argument name="__x" type="_481" location="f12:297" file="f12" line="297"/> + <Function id="_83" name="__ilogbl" returns="_501" throw="" context="_1" location="f12:297" file="f12" line="297" extern="1"> + <Argument name="__x" type="_482" location="f12:297" file="f12" line="297"/> </Function> - <Function id="_83" name="ilogbl" returns="_500" throw="" context="_1" location="f12:297" file="f12" line="297" extern="1"> - <Argument name="__x" type="_481" location="f12:297" file="f12" line="297"/> + <Function id="_84" name="ilogbl" returns="_501" throw="" context="_1" location="f12:297" file="f12" line="297" extern="1"> + <Argument name="__x" type="_482" location="f12:297" file="f12" line="297"/> </Function> - <Function id="_84" name="__scalbnl" returns="_481" throw="" context="_1" location="f12:293" file="f12" line="293" extern="1"> - <Argument name="__x" type="_481" location="f12:293" file="f12" line="293"/> - <Argument name="__n" type="_500" location="f12:293" file="f12" line="293"/> + <Function id="_85" name="__scalbnl" returns="_482" throw="" context="_1" location="f12:293" file="f12" line="293" extern="1"> + <Argument name="__x" type="_482" location="f12:293" file="f12" line="293"/> + <Argument name="__n" type="_501" location="f12:293" file="f12" line="293"/> </Function> - <Function id="_85" name="scalbnl" returns="_481" throw="" context="_1" location="f12:293" file="f12" line="293" extern="1"> - <Argument name="__x" type="_481" location="f12:293" file="f12" line="293"/> - <Argument name="__n" type="_500" location="f12:293" file="f12" line="293"/> + <Function id="_86" name="scalbnl" returns="_482" throw="" context="_1" location="f12:293" file="f12" line="293" extern="1"> + <Argument name="__x" type="_482" location="f12:293" file="f12" line="293"/> + <Argument name="__n" type="_501" location="f12:293" file="f12" line="293"/> </Function> - <Function id="_86" name="__remainderl" returns="_481" throw="" context="_1" location="f12:289" file="f12" line="289" extern="1"> - <Argument name="__x" type="_481" location="f12:289" file="f12" line="289"/> - <Argument name="__y" type="_481" location="f12:289" file="f12" line="289"/> + <Function id="_87" name="__remainderl" returns="_482" throw="" context="_1" location="f12:289" file="f12" line="289" extern="1"> + <Argument name="__x" type="_482" location="f12:289" file="f12" line="289"/> + <Argument name="__y" type="_482" location="f12:289" file="f12" line="289"/> </Function> - <Function id="_87" name="remainderl" returns="_481" throw="" context="_1" location="f12:289" file="f12" line="289" extern="1"> - <Argument name="__x" type="_481" location="f12:289" file="f12" line="289"/> - <Argument name="__y" type="_481" location="f12:289" file="f12" line="289"/> + <Function id="_88" name="remainderl" returns="_482" throw="" context="_1" location="f12:289" file="f12" line="289" extern="1"> + <Argument name="__x" type="_482" location="f12:289" file="f12" line="289"/> + <Argument name="__y" type="_482" location="f12:289" file="f12" line="289"/> </Function> - <Function id="_88" name="__nexttowardl" returns="_481" throw="" context="_1" location="f12:285" file="f12" line="285" extern="1" attributes="const"> - <Argument name="__x" type="_481" location="f12:285" file="f12" line="285"/> - <Argument name="__y" type="_481" location="f12:285" file="f12" line="285"/> + <Function id="_89" name="__nexttowardl" returns="_482" throw="" context="_1" location="f12:285" file="f12" line="285" extern="1" attributes="const"> + <Argument name="__x" type="_482" location="f12:285" file="f12" line="285"/> + <Argument name="__y" type="_482" location="f12:285" file="f12" line="285"/> </Function> - <Function id="_89" name="nexttowardl" returns="_481" throw="" context="_1" location="f12:285" file="f12" line="285" extern="1" attributes="const"> - <Argument name="__x" type="_481" location="f12:285" file="f12" line="285"/> - <Argument name="__y" type="_481" location="f12:285" file="f12" line="285"/> + <Function id="_90" name="nexttowardl" returns="_482" throw="" context="_1" location="f12:285" file="f12" line="285" extern="1" attributes="const"> + <Argument name="__x" type="_482" location="f12:285" file="f12" line="285"/> + <Argument name="__y" type="_482" location="f12:285" file="f12" line="285"/> </Function> - <Function id="_90" name="__nextafterl" returns="_481" throw="" context="_1" location="f12:283" file="f12" line="283" extern="1" attributes="const"> - <Argument name="__x" type="_481" location="f12:283" file="f12" line="283"/> ... [truncated message content] |
From: <rom...@us...> - 2006-09-26 08:55:15
|
Revision: 589 http://svn.sourceforge.net/pygccxml/?rev=589&view=rev Author: roman_yakovenko Date: 2006-09-26 01:54:57 -0700 (Tue, 26 Sep 2006) Log Message: ----------- adding initial support for properties Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/properties_to_be_exported.hpp pyplusplus_dev/unittests/properties_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-09-26 08:52:53 UTC (rev 588) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-09-26 08:54:57 UTC (rev 589) @@ -124,3 +124,5 @@ from exception_translator import exception_translator_register_t from opaque_type_registrator import opaque_type_registrator_t + +from properties import property_t Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-09-26 08:52:53 UTC (rev 588) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-09-26 08:54:57 UTC (rev 589) @@ -7,6 +7,7 @@ import os import user_text +import properties import decl_wrapper import scopedef_wrapper from pygccxml import declarations @@ -137,6 +138,7 @@ self._null_constructor_body = '' self._copy_constructor_body = '' self._exception_translation_code = None + self._properties = [] def _get_redefine_operators( self ): return self._redefine_operators @@ -310,3 +312,25 @@ if sort: sorted_members = sort( members ) return sorted_members + + @property + def properties( self ): + """list of properties""" + return self._properties + + def add_property( self, name, fget, fset=None, doc='' ): + """adds new property to the class + + @param name: name of the property + @type name: str + + @param fget: reference to the class member function + @param fset: reference to the class member function, could be None + @param doc: documentation string + """ + self._properties.append( properties.property_t( name, fget, fset, doc ) ) + + def add_static_property( self, name, fget, fset=None, doc='' ): + """adds new static property to the class""" + self._properties.append( properties.property_t( name, fget, fset, doc, True ) ) + Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-26 08:52:53 UTC (rev 588) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-09-26 08:54:57 UTC (rev 589) @@ -331,14 +331,14 @@ else:#class declaration: decl = declarations.class_declaration_traits.get_declaration( naked_type ) opaque_type_registrator = None - if not id(decl) in self.__exposed_opaque_decls.keys(): + if id(decl) not in self.__exposed_opaque_decls.keys(): opaque_type_registrator = code_creators.opaque_type_registrator_t( decl ) self.__exposed_opaque_decls[ id(decl) ] = opaque_type_registrator self.__extmodule.adopt_declaration_creator( opaque_type_registrator ) else: opaque_type_registrator = self.__exposed_opaque_decls[ id(decl) ] creator.associated_decl_creators.append(opaque_type_registrator) - + def _adopt_free_operator( self, operator ): def adopt_operator_impl( operator, found_creators ): creator = filter( lambda creator: isinstance( creator, code_creators.class_t ) @@ -561,7 +561,7 @@ self.curr_code_creator.adopt_creator( maker ) self.register_opaque_type( maker, self.curr_decl.return_type, self.curr_decl.call_policies ) - + # Make sure all required headers are included... required_headers = getattr(fwrapper, "get_required_headers", lambda : [])() for header in required_headers: @@ -654,7 +654,7 @@ self.__types_db.update( 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 ) @@ -697,11 +697,11 @@ 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.register_opaque_type( overloads_reg, f.return_type, f.call_policies ) return exposed @@ -769,6 +769,9 @@ = 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) ) + self.curr_decl = cls_decl self.curr_code_creator = cls_parent_cc Added: pyplusplus_dev/unittests/data/properties_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/properties_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/properties_to_be_exported.hpp 2006-09-26 08:54:57 UTC (rev 589) @@ -0,0 +1,28 @@ +// Copyright 2004 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) + +#ifndef __properties_to_be_exported_hpp__ +#define __properties_to_be_exported_hpp__ + +namespace properties{ + +struct properties_tester_t{ + properties_tester_t() + : m_count( 0 ) + {} + + int count() const + { return m_count; } + + void set_count( int x ) + { m_count = x; } + + int m_count; +}; + +} + + +#endif//__properties_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/properties_tester.py =================================================================== --- pyplusplus_dev/unittests/properties_tester.py (rev 0) +++ pyplusplus_dev/unittests/properties_tester.py 2006-09-26 08:54:57 UTC (rev 589) @@ -0,0 +1,40 @@ +# Copyright 2004 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 sys +import unittest +import fundamental_tester_base + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'properties' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, mb ): + cls = mb.class_( 'properties_tester_t' ) + count = cls.member_function( 'count' ) + set_count = cls.member_function( 'set_count' ) + count.exclude() + set_count.exclude() + cls.add_property( "count", count, set_count ) + + def run_tests(self, module): + pass + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-09-26 08:52:53 UTC (rev 588) +++ pyplusplus_dev/unittests/test_all.py 2006-09-26 08:54:57 UTC (rev 589) @@ -62,6 +62,7 @@ import no_init_tester import overloads_macro_tester import split_module_tester +import properties_tester def create_suite(times): testers = [ @@ -120,6 +121,7 @@ , no_init_tester , overloads_macro_tester , split_module_tester + , properties_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-26 10:51:22
|
Revision: 591 http://svn.sourceforge.net/pygccxml/?rev=591&view=rev Author: roman_yakovenko Date: 2006-09-26 03:51:08 -0700 (Tue, 26 Sep 2006) Log Message: ----------- adding few missing files and more unit tests Modified Paths: -------------- pyplusplus_dev/unittests/data/properties_to_be_exported.hpp pyplusplus_dev/unittests/properties_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/properties.py pyplusplus_dev/pyplusplus/decl_wrappers/properties.py Added: pyplusplus_dev/pyplusplus/code_creators/properties.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/properties.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/properties.py 2006-09-26 10:51:08 UTC (rev 591) @@ -0,0 +1,125 @@ +# Copyright 2004 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 algorithm +import registration_based +from pygccxml import declarations + +#I am sure in future I will have to treat template classes +class property_t( registration_based.registration_based_t ): + def __init__(self, property_def, wrapper=None ): + registration_based.registration_based_t.__init__( self ) + self._property_def = property_def + self.works_on_instance = False + self._make_function = None + + @property + def property_def( self ): + return self._property_def + + @property + def make_function_identifier( self ): + if not self._make_function: + self._make_function = algorithm.create_identifier( self, '::boost::python::make_function' ) + return self._make_function + + def create_function_type_alias_code( self, f, ftype_alias, exported_class_alias=None ): + return 'typedef ' + f.function_type().create_typedef( ftype_alias, exported_class_alias ) + ';' + + def create_accessor_code( self, f, ftype_alias ): + f_ref_code = '%s( %s )' % ( ftype_alias, declarations.full_name( f ) ) + if f.call_policies and f.call_policies.is_default(): + return f_ref_code + result = [ self.make_function_identifier ] + result.append( '( ' ) + result.append( os.linesep ) + result.append( self.indent( ' ', 2 ) ) + result.append( f_ref_code ) + if f.call_policies: + result.append( os.linesep ) + result.append( self.indent( ', ', 2 ) ) + result.append( f.call_policies.create( self ) ) + else: + result.append( os.linesep ) + result.append( self.indent( ' ', 2 ) ) + result.append( '/* undefined call policies */' ) + result.append( ' ) ' ) + return ''.join( result ) + + def has_long_line( self ): + pd = self.property_def + if pd.fget.call_policies and not pd.fget.call_policies.is_default(): + return True + elif pd.fset or pd.fset.call_policies or not pd.fset.call_policies.is_default(): + return True + elif pd.doc: + return True + else: + return True + + def create_property_code( self ): + result = [] + param_sep = ', ' + if self.has_long_line(): + param_sep = os.linesep + self.indent( param_sep ) + + result.append( self.create_function_type_alias_code( self.property_def.fget, 'fget' ) ) + if self.property_def.fset: + result.append( os.linesep ) + result.append( self.create_function_type_alias_code( self.property_def.fset, 'fset' ) ) + + result.append( 2 * os.linesep ) + + add_property = None + if self.property_def.is_static: + add_property = 'add_static_property' + else: + add_property = 'add_property' + + class_var_name = self.parent.class_var_name + if self.has_long_line(): + result.append( '%s.%s( ' % ( class_var_name, add_property ) ) + result.append( os.linesep + self.indent( '"%s"' % self.property_def.name ) ) + else: + result.append( '%s.%s( "%s"' % ( class_var_name, add_property, self.property_def.name ) ) + result.append( param_sep + self.create_accessor_code( self.property_def.fget, 'fget' ) ) + if self.property_def.fset: + result.append( param_sep + self.create_accessor_code( self.property_def.fset, 'fset' )) + if self.property_def.doc: + result.append( param_sep + self.property_def.doc) + result.append( ' );') + return ''.join( result ) + + def _create_impl( self ): + result = [] + result.append( '{ //%s' % self.property_def ) + result.append( '' ) + result.append( self.indent( self.create_property_code() ) ) + result.append( '' ) + result.append( '}' ) + return os.linesep.join( result ) + + + + + + + + + + + + + + + + + + + + + + Added: pyplusplus_dev/pyplusplus/decl_wrappers/properties.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/properties.py (rev 0) +++ pyplusplus_dev/pyplusplus/decl_wrappers/properties.py 2006-09-26 10:51:08 UTC (rev 591) @@ -0,0 +1,57 @@ +# Copyright 2004 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) + +"defines property_t helper class" + +from pygccxml import declarations + +class property_t( object ): + def __init__( self, name, fget, fset=None, doc='', is_static=False ): + self._name = name + self._fget = fget + self._fset = fset + self._doc = doc + self._is_static = is_static + + @property + def name( self ): + return self._name + + @property + def fget( self ): + return self._fget + + @property + def fset( self ): + return self._fset + + @property + def doc( self ): + return self._doc + + @property + def is_static( self ): + return self._is_static + + def __str__( self ): + desc = [] + desc.append( 'fget=%s' % declarations.full_name( self.fget ) ) + if self.fset: + desc.append( ', ' ) + desc.append( 'fset=%s' % declarations.full_name( self.fset ) ) + return "property [%s]"% ''.join( desc ) + +def find_properties( cls ): + """this function should return a list of possible properties for the class""" + #get* set* + #get_* set_* + #*, set* + #*, set_* + #get defined on [derived|base], set defined on [base|derived] + + raise NotImplemented() + + + Modified: pyplusplus_dev/unittests/data/properties_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/properties_to_be_exported.hpp 2006-09-26 09:06:43 UTC (rev 590) +++ pyplusplus_dev/unittests/data/properties_to_be_exported.hpp 2006-09-26 10:51:08 UTC (rev 591) @@ -9,6 +9,11 @@ namespace properties{ struct properties_tester_t{ + + struct nested{ + int n; + }; + properties_tester_t() : m_count( 0 ) {} @@ -19,7 +24,14 @@ void set_count( int x ) { m_count = x; } + nested& get_nested() + { return m_nested; } + + void set_nested( nested x ) + { m_nested = x; } + int m_count; + nested m_nested; }; } Modified: pyplusplus_dev/unittests/properties_tester.py =================================================================== --- pyplusplus_dev/unittests/properties_tester.py 2006-09-26 09:06:43 UTC (rev 590) +++ pyplusplus_dev/unittests/properties_tester.py 2006-09-26 10:51:08 UTC (rev 591) @@ -7,6 +7,7 @@ import sys import unittest import fundamental_tester_base +from pyplusplus.module_builder import call_policies class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'properties' @@ -25,9 +26,20 @@ set_count.exclude() cls.add_property( "count", count, set_count ) + get_nested = cls.member_function( 'get_nested' ) + get_nested.call_policies = call_policies.return_internal_reference() + set_nested = cls.member_function( 'set_nested' ) + cls.add_property( "nested_", get_nested, set_nested ) + + cls.add_property( "nested_ro", get_nested ) + def run_tests(self, module): - pass + pt = module.properties_tester_t() + self.failUnless( pt.count == 0 ) + pt.count = 21 + self.failUnless( pt.m_count == 21 ) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-26 20:34:46
|
Revision: 595 http://svn.sourceforge.net/pygccxml/?rev=595&view=rev Author: roman_yakovenko Date: 2006-09-26 13:34:29 -0700 (Tue, 26 Sep 2006) Log Message: ----------- fixing bug in property_t code creator updating unit tests Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/properties.py pyplusplus_dev/unittests/casting_tester.py pyplusplus_dev/unittests/data/operators_bug_to_be_exported.hpp pyplusplus_dev/unittests/impl_conv/sconstruct pyplusplus_dev/unittests/impl_conv/test.py pyplusplus_dev/unittests/operators_bug_tester.py pyplusplus_dev/unittests/properties_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/properties.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/properties.py 2006-09-26 18:56:36 UTC (rev 594) +++ pyplusplus_dev/pyplusplus/code_creators/properties.py 2006-09-26 20:34:29 UTC (rev 595) @@ -53,7 +53,7 @@ pd = self.property_def if pd.fget.call_policies and not pd.fget.call_policies.is_default(): return True - elif pd.fset or pd.fset.call_policies or not pd.fset.call_policies.is_default(): + elif pd.fset or ( pd.fset and ( pd.fset.call_policies or not pd.fset.call_policies.is_default() ) ): return True elif pd.doc: return True Modified: pyplusplus_dev/unittests/casting_tester.py =================================================================== --- pyplusplus_dev/unittests/casting_tester.py 2006-09-26 18:56:36 UTC (rev 594) +++ pyplusplus_dev/unittests/casting_tester.py 2006-09-26 20:34:29 UTC (rev 595) @@ -26,11 +26,7 @@ self.failUnless( 25 == module.x_value(25) ) self.failUnless( 1 == module.x_value(True) ) self.failUnless( 0 == module.x_value(False) ) - try: - fv = module.float_vector( 5.0 ) - self.fail( "TypeError exception was not raised" ) - except TypeError: - pass + fv = module.float_vector( 5.0 ) def create_suite(): suite = unittest.TestSuite() Modified: pyplusplus_dev/unittests/data/operators_bug_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/operators_bug_to_be_exported.hpp 2006-09-26 18:56:36 UTC (rev 594) +++ pyplusplus_dev/unittests/data/operators_bug_to_be_exported.hpp 2006-09-26 20:34:29 UTC (rev 595) @@ -1,40 +1,52 @@ -// Copyright 2004 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) - -#ifndef __operators_bug_to_be_exported_hpp__ -#define __operators_bug_to_be_exported_hpp__ - -namespace operators_bug{ - -template< typename derived_type, typename value_type > -struct number{ - - value_type value; - - friend derived_type operator+( const derived_type& y, const derived_type& x ){ - derived_type tmp; - tmp.value = y.value + x.value; - return tmp; - } -protected: - bool operator==( const derived_type& other ){ return value == other.value; } -}; - -struct integral : public number< integral, int >{ - integral operator+( int x ){ - integral tmp; - tmp.value = value + x; - return tmp; - } -}; - -struct integral2 : public number< integral, int >{ - //in this case no operator should be redefined -}; - -} - - -#endif//__operators_bug_to_be_exported_hpp__ +// Copyright 2004 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) + +#ifndef __operators_bug_to_be_exported_hpp__ +#define __operators_bug_to_be_exported_hpp__ + +namespace operators_bug{ + +template< typename derived_type, typename value_type > +struct number{ + + value_type value; + + friend derived_type operator+( const derived_type& y, const derived_type& x ){ + derived_type tmp; + tmp.value = y.value + x.value; + return tmp; + } +protected: + bool operator==( const derived_type& other ){ return value == other.value; } +}; + +struct integral : public number< integral, int >{ + integral operator+( int x ){ + integral tmp; + tmp.value = value + x; + return tmp; + } +}; + +struct integral2 : public number< integral, int >{ + //in this case no operator should be redefined +}; + +struct vector +{ + double x; + static const vector one; + + vector(double ax) : x(ax) {} + vector operator+(const vector& other) const { return vector(x+other.x); } + + virtual void trigger_wrapper() {} +}; + + +} + + +#endif//__operators_bug_to_be_exported_hpp__ \ No newline at end of file Modified: pyplusplus_dev/unittests/impl_conv/sconstruct =================================================================== --- pyplusplus_dev/unittests/impl_conv/sconstruct 2006-09-26 18:56:36 UTC (rev 594) +++ pyplusplus_dev/unittests/impl_conv/sconstruct 2006-09-26 20:34:29 UTC (rev 595) @@ -1,5 +1,5 @@ -SharedLibrary( target=r'ic_ext' - , source=[ r'ic.cpp' ] +SharedLibrary( target=r'operators_ext' + , source=[ r'operators_ext.cpp' ] , LIBS=[ r"boost_python" ] , LIBPATH=[ r"/home/roman/boost_cvs/bin",r"" ] , CPPPATH=[ r"/home/roman/boost_cvs",r"/usr/include/python2.4" ] Modified: pyplusplus_dev/unittests/impl_conv/test.py =================================================================== --- pyplusplus_dev/unittests/impl_conv/test.py 2006-09-26 18:56:36 UTC (rev 594) +++ pyplusplus_dev/unittests/impl_conv/test.py 2006-09-26 20:34:29 UTC (rev 595) @@ -1,3 +1,11 @@ -import ic_ext +import operators_ext -ic_ext.float_vector( 5.0 ) +print 'envoke operator+ using old Boost.Python interface' +old = operators_ext.vector_old() +tmp = old + operators_ext.vector_old.v_old +print 'It works.' + +print 'envoke operator+ using new Boost.Python interface' +new = operators_ext.vector_new() +tmp = new + operators_ext.vector_new.v_new +print 'If you see this message than the bug was fixed. Thank you.' Modified: pyplusplus_dev/unittests/operators_bug_tester.py =================================================================== --- pyplusplus_dev/unittests/operators_bug_tester.py 2006-09-26 18:56:36 UTC (rev 594) +++ pyplusplus_dev/unittests/operators_bug_tester.py 2006-09-26 20:34:29 UTC (rev 595) @@ -22,7 +22,7 @@ mb.classes().redefine_operators = True mb.add_declaration_code( 'const operators_bug::vector operators_bug::vector::one(1);' ) tg = code_creators.target_configuration_t( ) - tg.boost_python_has_wrapper_held_type = False + #tg.boost_python_has_wrapper_held_type = False mb.build_code_creator( self.EXTENSION_NAME, target_configuration=tg ) def run_tests(self, module): Modified: pyplusplus_dev/unittests/properties_tester.py =================================================================== --- pyplusplus_dev/unittests/properties_tester.py 2006-09-26 18:56:36 UTC (rev 594) +++ pyplusplus_dev/unittests/properties_tester.py 2006-09-26 20:34:29 UTC (rev 595) @@ -25,7 +25,8 @@ count.exclude() set_count.exclude() cls.add_property( "count", count, set_count ) - + cls.add_property( "count_ro", count ) + get_nested = cls.member_function( 'get_nested' ) get_nested.call_policies = call_policies.return_internal_reference() set_nested = cls.member_function( 'set_nested' ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-10-04 00:48:19
|
Revision: 617 http://svn.sourceforge.net/pygccxml/?rev=617&view=rev Author: roman_yakovenko Date: 2006-10-03 15:14:04 -0700 (Tue, 03 Oct 2006) Log Message: ----------- array bug fix Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/arrays_bug_tester.py pyplusplus_dev/unittests/data/arrays_bug_to_be_exported.hpp Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-10-03 12:34:25 UTC (rev 616) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-10-03 22:14:04 UTC (rev 617) @@ -347,35 +347,47 @@ """ def __init__(self, variable, wrapper ): member_variable_base_t.__init__( self, variable=variable, wrapper=wrapper ) + self.works_on_instance = False - def _create_impl( self ): - assert isinstance( self.wrapper, array_mv_wrapper_t ) + def _create_body( self ): + answer = [] + answer.append( 'typedef %s;' % self.wrapper.wrapper_creator_type.create_typedef( 'array_wrapper_creator' ) ) + answer.append( os.linesep * 2 ) + doc = '' if self.declaration.type_qualifiers.has_static: - answer = [ 'add_static_property' ] + answer.append( self.parent.class_var_name + '.add_static_property' ) else: if self.documentation: doc = self.documentation - answer = [ 'add_property' ] + answer.append( self.parent.class_var_name + '.add_property' ) answer.append( '( ' ) answer.append('"%s"' % self.declaration.name ) answer.append( os.linesep + self.indent( self.PARAM_SEPARATOR ) ) temp = [ algorithm.create_identifier( self, "::boost::python::make_function" ) ] temp.append( '( ' ) - temp.append( '(%s)(&%s)' - % ( self.wrapper.wrapper_creator_type - , self.wrapper.wrapper_creator_full_name ) ) + temp.append( 'array_wrapper_creator(&%s)' % self.wrapper.wrapper_creator_full_name ) if not self.declaration.type_qualifiers.has_static: - temp.append( os.linesep + self.indent( self.PARAM_SEPARATOR, 4 ) ) + temp.append( os.linesep + self.indent( self.PARAM_SEPARATOR, 6 ) ) temp.append( call_policies.with_custodian_and_ward_postcall( 0, 1 ).create(self) ) temp.append( ' )' ) answer.append( ''.join( temp ) ) if doc: + answer.append( os.linesep ) answer.append( self.PARAM_SEPARATOR ) answer.append( doc ) answer.append( ' );' ) return ''.join( answer ) + def _create_impl( self ): + answer = [] + answer.append( '{ //%s, type=%s' % ( self.declaration, self.declaration.type ) ) + answer.append( os.linesep * 2 ) + answer.append( self.indent( self._create_body() ) ) + answer.append( os.linesep ) + answer.append( '}' ) + return ''.join( answer ) + #TODO: generated fucntion should be static and take instance of the wrapped class #as first argument. class array_mv_wrapper_t( code_creator.code_creator_t @@ -388,49 +400,55 @@ code_creator.code_creator_t.__init__( self ) declaration_based.declaration_based_t.__init__( self, declaration=variable) - def _get_wrapper_type( self ): - ns_name = code_repository.array_1.namespace + @property + def wrapper_type( self ): + tmpl = "%(namespace)s::%(constness)sarray_1_t< %(item_type)s, %(array_size)d>" + + constness = '' if declarations.is_const( self.declaration.type ): - class_name = 'const_array_1_t' - else: - class_name = 'array_1_t' + constness = 'const_' + result = tmpl % { + 'namespace' : code_repository.array_1.namespace + , 'constness' : constness + , 'item_type' : declarations.array_item_type( self.declaration.type ).decl_string + , 'array_size': declarations.array_size( self.declaration.type ) + } + return declarations.dummy_type_t( result ) - decl_string = declarations.templates.join( - '::'.join( [ns_name, class_name] ) - , [ declarations.array_item_type( self.declaration.type ).decl_string - , str( declarations.array_size( self.declaration.type ) ) - ]) - - return declarations.dummy_type_t( decl_string ) - wrapper_type = property( _get_wrapper_type ) - - def _get_wrapper_creator_type(self): - return declarations.member_function_type_t.create_decl_string( + @property + def wrapped_class_type( self ): + wrapped_cls_type = declarations.declarated_t( self.declaration.parent ) + if declarations.is_const( self.declaration.type ): + wrapped_cls_type = declarations.const_t( wrapped_cls_type ) + return declarations.reference_t( wrapped_cls_type ) + + @property + def wrapper_creator_type(self): + return declarations.free_function_type_t( return_type=self.wrapper_type - , class_decl_string=self.parent.full_name - , arguments_types=[] - , has_const=False ) - wrapper_creator_type = property( _get_wrapper_creator_type ) - - def _get_wrapper_creator_name(self): + , arguments_types=[self.wrapped_class_type] ) + + @property + def wrapper_creator_name(self): return '_'.join( ['pyplusplus', self.declaration.name, 'wrapper'] ) - wrapper_creator_name = property( _get_wrapper_creator_name ) - def _get_wrapper_creator_full_name(self): + @property + def wrapper_creator_full_name(self): return '::'.join( [self.parent.full_name, self.wrapper_creator_name] ) - wrapper_creator_full_name = property( _get_wrapper_creator_full_name ) def _create_impl( self ): - answer = [self.wrapper_type.decl_string] - answer.append( ''.join([ self.wrapper_creator_name, '(){']) ) - temp = ''.join([ 'return ' - , self.wrapper_type.decl_string - , '( ' - , self.declaration.name - , ' );']) - answer.append( self.indent( temp ) ) - answer.append('}') - return os.linesep.join( answer ) + tmpl = os.linesep.join([ + "static %(wrapper_type)s" + , "%(wrapper_creator_name)s( %(wrapped_class_type)s inst ){" + , self.indent( "return %(wrapper_type)s( inst.%(mem_var_ref)s );" ) + , "}" + ]) + return tmpl % { + 'wrapper_type' : self.wrapper_type.decl_string + , 'wrapper_creator_name' : self.wrapper_creator_name + , 'wrapped_class_type' : self.wrapped_class_type.decl_string + , 'mem_var_ref' : self.declaration.name + } class mem_var_ref_t( member_variable_base_t ): Added: pyplusplus_dev/unittests/arrays_bug_tester.py =================================================================== --- pyplusplus_dev/unittests/arrays_bug_tester.py (rev 0) +++ pyplusplus_dev/unittests/arrays_bug_tester.py 2006-10-03 22:14:04 UTC (rev 617) @@ -0,0 +1,38 @@ +# Copyright 2004 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 sys +import unittest +import fundamental_tester_base +from pyplusplus import code_creators + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'arrays_bug' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def run_tests( self, module): + m = module.arrays_bug + c = m.container() + x = c.items[0].values[0] + c.items[0].values[0] = 1 + y = c.items[0] + c.items[0] = m.item() + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() \ No newline at end of file Added: pyplusplus_dev/unittests/data/arrays_bug_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/arrays_bug_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/arrays_bug_to_be_exported.hpp 2006-10-03 22:14:04 UTC (rev 617) @@ -0,0 +1,17 @@ +// Copyright 2004 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) + +#ifndef __arrays_bug_to_be_exported_hpp__ +#define __arrays_bug_to_be_exported_hpp__ + +struct arrays_bug{ + +struct item{ int values[10]; }; + +struct container{ item items[10]; }; + +}; + +#endif//__arrays_bug_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-10-03 12:34:25 UTC (rev 616) +++ pyplusplus_dev/unittests/test_all.py 2006-10-03 22:14:04 UTC (rev 617) @@ -63,6 +63,7 @@ import overloads_macro_tester import split_module_tester import properties_tester +import arrays_bug_tester def create_suite(times): testers = [ @@ -122,6 +123,7 @@ , overloads_macro_tester , split_module_tester , properties_tester + , arrays_bug_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-10-04 00:48:47
|
Revision: 614 http://svn.sourceforge.net/pygccxml/?rev=614&view=rev Author: roman_yakovenko Date: 2006-10-03 00:01:44 -0700 (Tue, 03 Oct 2006) Log Message: ----------- fixing bug in add_properties algorithm Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/properties.py pyplusplus_dev/unittests/data/properties_to_be_exported.hpp pyplusplus_dev/unittests/properties_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/properties.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/properties.py 2006-10-02 20:45:21 UTC (rev 613) +++ pyplusplus_dev/pyplusplus/decl_wrappers/properties.py 2006-10-03 07:01:44 UTC (rev 614) @@ -47,17 +47,17 @@ class property_recognizer_i(object): def __init__( self ): object.__init__( self ) - + def create_property( self, fget, fset ): raise NotImplementedError() def create_read_only_property( sefl, fget ): raise NotImplementedError() - + class name_based_recognizer_t( property_recognizer_i ): def __init__( self ): property_recognizer_i.__init__( self ) - self.__prefixes = ( + self.__prefixes = ( ( 'is', 'set' ) , ( 'get', 'set' ) , ( 'has', 'set' ) @@ -69,7 +69,7 @@ if not name.startswith( prefix ): return False return True - + def check_name_compatibility( self, gname, sname, gprefix, sprefix ): if not self.check_prefix( gname, gprefix ): return False @@ -84,13 +84,13 @@ if gprefix: gprefix = convert( gprefix ) return ( gprefix, convert( sprefix ) ) - + def make_u_camel_convention( self, gprefix, sprefix ): convert = lambda x: x[0].upper() + x[1:] if gprefix: gprefix = convert( gprefix ) return ( gprefix, convert( sprefix ) ) - + def make_l_camel_convention( self, gprefix, sprefix ): convert = lambda x: x[0].lower() + x[1:] if gprefix: @@ -98,7 +98,7 @@ return ( gprefix, convert( sprefix ) ) def find_out_prefixes( self, gname, sname ): - convention_makers = [ + convention_makers = [ self.make_std_convention #longest first , self.make_u_camel_convention , self.make_l_camel_convention ] @@ -111,17 +111,19 @@ return None def find_out_ro_prefixes( self, gname ): - convention_makers = [ + convention_makers = [ self.make_std_convention #longest first , self.make_u_camel_convention , self.make_l_camel_convention ] for convention_maker in convention_makers: for g, unused in self.__prefixes: + if not g: + continue gc, unused = convention_maker( g, 'set' ) if self.check_prefix( gname, gc ): return gc - return None + return '' def check_type_compatibility( self, fget, fset ): #algorithms allows "const" differences between types @@ -140,7 +142,7 @@ return declarations.is_same( t1, t2 ) else: return False - + def create_property( self, fget, fset ): if not self.check_type_compatibility( fget, fset ): return None @@ -151,10 +153,10 @@ def create_read_only_property( self, fget ): found = self.find_out_ro_prefixes( fget.name ) - if found: - return property_t( fget.name[len(found[0]):], fget ) + if None is found: + return None else: - return None + return property_t( fget.name[len(found):], fget ) class properties_finder_t: def __init__( self, cls, recognizer=None, exclude_accessors=False ): @@ -177,7 +179,7 @@ self.inherited_getters, self.inherited_setters \ = self.__get_accessors( inherted_mem_funs ) - + def __is_getter( self, mem_fun ): if mem_fun.arguments: return False @@ -186,7 +188,7 @@ if not mem_fun.has_const: return False return True - + def __is_setter( self, mem_fun ): if len( mem_fun.arguments ) != 1: return False @@ -195,7 +197,7 @@ if mem_fun.has_const: return False return True - + def __get_accessors( self, mem_funs ): getters = [] setters = [] @@ -231,21 +233,21 @@ properties.append( property_ ) break return properties - + def __call__( self ): used_getters = set() used_setters = set() properties = [] #this get, this set - properties.extend( + properties.extend( self.find_properties( self.getters, self.setters, used_getters, used_setters ) ) #this get, base set - properties.extend( + properties.extend( self.find_properties( self.getters, self.inherited_setters, used_getters, used_setters ) ) #base get, this set - properties.extend( + properties.extend( self.find_properties( self.inherited_getters, self.setters, used_getters, used_setters ) ) - + for fget in self.getters: if fget in used_getters: continue @@ -253,14 +255,14 @@ if property_: used_getters.add( fget ) properties.append( property_ ) - + if self.exclude_accessors: map( lambda accessor: accessor.exclude(), used_getters ) map( lambda accessor: accessor.exclude(), used_setters ) - + return properties - + def find_properties( cls, recognizer=None, exclude_accessors=False ): pf = properties_finder_t( cls, recognizer, exclude_accessors ) properties = pf() - return properties \ No newline at end of file + return properties Modified: pyplusplus_dev/unittests/data/properties_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/properties_to_be_exported.hpp 2006-10-02 20:45:21 UTC (rev 613) +++ pyplusplus_dev/unittests/data/properties_to_be_exported.hpp 2006-10-03 07:01:44 UTC (rev 614) @@ -29,7 +29,7 @@ void set_nested( nested x ) { m_nested = x; } - + int m_count; nested m_nested; }; @@ -38,16 +38,18 @@ int count() const { return 0; } void set_count( int ){} - + int get_size() const { return 0; } void set_size( int ){} - + int getWidth() const { return 0; } void setWidth(int) {} - + int GetHeight() const { return 0; } void SetHeight(int){} - + + int GetType() const { return 0; } + }; } Modified: pyplusplus_dev/unittests/properties_tester.py =================================================================== --- pyplusplus_dev/unittests/properties_tester.py 2006-10-02 20:45:21 UTC (rev 613) +++ pyplusplus_dev/unittests/properties_tester.py 2006-10-03 07:01:44 UTC (rev 614) @@ -26,17 +26,18 @@ set_count.exclude() cls.add_property( "count", count, set_count ) cls.add_property( "count_ro", count ) - + get_nested = cls.member_function( 'get_nested' ) get_nested.call_policies = call_policies.return_internal_reference() set_nested = cls.member_function( 'set_nested' ) cls.add_property( "nested_", get_nested, set_nested ) cls.add_property( "nested_ro", get_nested ) - + cls = mb.class_( 'properties_finder_tester_t' ) cls.add_properties( exclude_accessors=True ) - self.failUnless( 4 == len( cls.properties ) ) + print len( cls.properties ) + self.failUnless( 5 == len( cls.properties ) ) def run_tests(self, module): pt = module.properties_tester_t() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-10-04 01:40:24
|
Revision: 613 http://svn.sourceforge.net/pygccxml/?rev=613&view=rev Author: roman_yakovenko Date: 2006-10-02 13:45:21 -0700 (Mon, 02 Oct 2006) Log Message: ----------- adding small algorithm that will discover class properties Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/properties.py pyplusplus_dev/unittests/data/properties_to_be_exported.hpp pyplusplus_dev/unittests/properties_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-10-01 19:49:39 UTC (rev 612) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-10-02 20:45:21 UTC (rev 613) @@ -333,6 +333,10 @@ """ self._properties.append( properties.property_t( name, fget, fset, doc ) ) + def add_properties( self, recognizer=None, exclude_accessors=False ): + props = properties.find_properties( self, recognizer, exclude_accessors ) + self.properties.extend( props ) + def add_static_property( self, name, fget, fset=None, doc='' ): """adds new static property to the class""" self._properties.append( properties.property_t( name, fget, fset, doc, True ) ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/properties.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/properties.py 2006-10-01 19:49:39 UTC (rev 612) +++ pyplusplus_dev/pyplusplus/decl_wrappers/properties.py 2006-10-02 20:45:21 UTC (rev 613) @@ -43,15 +43,224 @@ desc.append( 'fset=%s' % declarations.full_name( self.fset ) ) return "property [%s]"% ''.join( desc ) -def find_properties( cls ): - """this function should return a list of possible properties for the class""" - #get* set* - #get_* set_* - #*, set* - #*, set_* - #get defined on [derived|base], set defined on [base|derived] - raise NotImplemented() +class property_recognizer_i(object): + def __init__( self ): + object.__init__( self ) + + def create_property( self, fget, fset ): + raise NotImplementedError() + def create_read_only_property( sefl, fget ): + raise NotImplementedError() + +class name_based_recognizer_t( property_recognizer_i ): + def __init__( self ): + property_recognizer_i.__init__( self ) + self.__prefixes = ( + ( 'is', 'set' ) + , ( 'get', 'set' ) + , ( 'has', 'set' ) + , ( '', 'set' ) ) + def check_prefix( self, name, prefix ): + if len( prefix ) >= len( name ): + return False + if not name.startswith( prefix ): + return False + return True + + def check_name_compatibility( self, gname, sname, gprefix, sprefix ): + if not self.check_prefix( gname, gprefix ): + return False + if not self.check_prefix( sname, sprefix ): + return False + if gname[ len( gprefix ): ] != sname[ len( sprefix ): ]: + return False + return True + def make_std_convention( self, gprefix, sprefix ): + convert = lambda x: x + '_' + if gprefix: + gprefix = convert( gprefix ) + return ( gprefix, convert( sprefix ) ) + + def make_u_camel_convention( self, gprefix, sprefix ): + convert = lambda x: x[0].upper() + x[1:] + if gprefix: + gprefix = convert( gprefix ) + return ( gprefix, convert( sprefix ) ) + + def make_l_camel_convention( self, gprefix, sprefix ): + convert = lambda x: x[0].lower() + x[1:] + if gprefix: + gprefix = convert( gprefix ) + return ( gprefix, convert( sprefix ) ) + + def find_out_prefixes( self, gname, sname ): + convention_makers = [ + self.make_std_convention #longest first + , self.make_u_camel_convention + , self.make_l_camel_convention ] + + for convention_maker in convention_makers: + for g, s in self.__prefixes: + gc, sc = convention_maker( g, s ) + if self.check_name_compatibility( gname, sname, gc, sc ): + return ( gc, sc ) + return None + + def find_out_ro_prefixes( self, gname ): + convention_makers = [ + self.make_std_convention #longest first + , self.make_u_camel_convention + , self.make_l_camel_convention ] + + for convention_maker in convention_makers: + for g, unused in self.__prefixes: + gc, unused = convention_maker( g, 'set' ) + if self.check_prefix( gname, gc ): + return gc + return None + + def check_type_compatibility( self, fget, fset ): + #algorithms allows "const" differences between types + t1 = fget.return_type + t2 = fset.arguments[0].type + + if declarations.is_same( t1, t2 ): + return True + elif declarations.is_pointer( t1 ) and declarations.is_pointer( t2 ): + t1 = declarations.remove_cv( declarations.remove_pointer( t1 ) ) + t2 = declarations.remove_cv( declarations.remove_pointer( t2 ) ) + return declarations.is_same( t1, t2 ) + elif declarations.is_reference( t1 ) and declarations.is_reference( t2 ): + t1 = declarations.remove_cv( declarations.remove_reference( t1 ) ) + t2 = declarations.remove_cv( declarations.remove_reference( t2 ) ) + return declarations.is_same( t1, t2 ) + else: + return False + + def create_property( self, fget, fset ): + if not self.check_type_compatibility( fget, fset ): + return None + found = self.find_out_prefixes( fget.name, fset.name ) + if not found: + return None + return property_t( fget.name[len(found[0]):], fget, fset ) + + def create_read_only_property( self, fget ): + found = self.find_out_ro_prefixes( fget.name ) + if found: + return property_t( fget.name[len(found[0]):], fget ) + else: + return None + +class properties_finder_t: + def __init__( self, cls, recognizer=None, exclude_accessors=False ): + self.cls = cls + if None is recognizer: + recognizer = name_based_recognizer_t() + self.recognizer = recognizer + self.exclude_accessors = exclude_accessors + self.getters, self.setters \ + = self.__get_accessors( cls.member_functions( recursive=False, allow_empty=True ) ) + + inherted_mem_funs = [] + for hierarchy_info in cls.recursive_bases: + if hierarchy_info.related_class.ignore: #don't scan excluded classes + continue + if 'public' != hierarchy_info.access_type: #don't scan non public hierarchy + continue + base_cls = hierarchy_info.related_class + inherted_mem_funs.extend( base_cls.member_functions( recursive=False, allow_empty=True ) ) + + self.inherited_getters, self.inherited_setters \ + = self.__get_accessors( inherted_mem_funs ) + + def __is_getter( self, mem_fun ): + if mem_fun.arguments: + return False + if declarations.is_void( mem_fun.return_type ): + return False + if not mem_fun.has_const: + return False + return True + + def __is_setter( self, mem_fun ): + if len( mem_fun.arguments ) != 1: + return False + if not declarations.is_void( mem_fun.return_type ): + return False + if mem_fun.has_const: + return False + return True + + def __get_accessors( self, mem_funs ): + getters = [] + setters = [] + for mem_fun in mem_funs: + if mem_fun.ignore: + continue + elif mem_fun.access_type != 'public': + continue + elif mem_fun.has_static: + continue #TODO: should be supported + elif mem_fun.virtuality == declarations.VIRTUALITY_TYPES.PURE_VIRTUAL: + continue + elif self.__is_getter( mem_fun ): + getters.append( mem_fun ) + elif self.__is_setter( mem_fun ): + setters.append( mem_fun ) + else: + continue + return ( getters, setters ) + + def find_properties( self, getters, setters, used_getters, used_setters ): + properties = [] + for fget in getters: + if fget in used_getters: + continue + for fset in setters: + if fset in used_setters: + continue + property_ = self.recognizer.create_property( fget, fset ) + if property_: + used_getters.add( fget ) + used_setters.add( fset ) + properties.append( property_ ) + break + return properties + + def __call__( self ): + used_getters = set() + used_setters = set() + properties = [] + #this get, this set + properties.extend( + self.find_properties( self.getters, self.setters, used_getters, used_setters ) ) + #this get, base set + properties.extend( + self.find_properties( self.getters, self.inherited_setters, used_getters, used_setters ) ) + #base get, this set + properties.extend( + self.find_properties( self.inherited_getters, self.setters, used_getters, used_setters ) ) + + for fget in self.getters: + if fget in used_getters: + continue + property_ = self.recognizer.create_read_only_property( fget ) + if property_: + used_getters.add( fget ) + properties.append( property_ ) + + if self.exclude_accessors: + map( lambda accessor: accessor.exclude(), used_getters ) + map( lambda accessor: accessor.exclude(), used_setters ) + + return properties + +def find_properties( cls, recognizer=None, exclude_accessors=False ): + pf = properties_finder_t( cls, recognizer, exclude_accessors ) + properties = pf() + return properties \ No newline at end of file Modified: pyplusplus_dev/unittests/data/properties_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/properties_to_be_exported.hpp 2006-10-01 19:49:39 UTC (rev 612) +++ pyplusplus_dev/unittests/data/properties_to_be_exported.hpp 2006-10-02 20:45:21 UTC (rev 613) @@ -24,16 +24,31 @@ void set_count( int x ) { m_count = x; } - nested& get_nested() + const nested& get_nested() const { return m_nested; } void set_nested( nested x ) { m_nested = x; } - + int m_count; nested m_nested; }; +struct properties_finder_tester_t{ + + int count() const { return 0; } + void set_count( int ){} + + int get_size() const { return 0; } + void set_size( int ){} + + int getWidth() const { return 0; } + void setWidth(int) {} + + int GetHeight() const { return 0; } + void SetHeight(int){} + +}; } Modified: pyplusplus_dev/unittests/properties_tester.py =================================================================== --- pyplusplus_dev/unittests/properties_tester.py 2006-10-01 19:49:39 UTC (rev 612) +++ pyplusplus_dev/unittests/properties_tester.py 2006-10-02 20:45:21 UTC (rev 613) @@ -33,6 +33,10 @@ cls.add_property( "nested_", get_nested, set_nested ) cls.add_property( "nested_ro", get_nested ) + + cls = mb.class_( 'properties_finder_tester_t' ) + cls.add_properties( exclude_accessors=True ) + self.failUnless( 4 == len( cls.properties ) ) def run_tests(self, module): pt = module.properties_tester_t() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-10-05 07:17:19
|
Revision: 623 http://svn.sourceforge.net/pygccxml/?rev=623&view=rev Author: roman_yakovenko Date: 2006-10-05 00:17:04 -0700 (Thu, 05 Oct 2006) Log Message: ----------- adding unit tests for convenience functions improving convenience functions error reporting Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_repository/convenience.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/convenience_tester.py pyplusplus_dev/unittests/data/convenience_to_be_exported.hpp Modified: pyplusplus_dev/pyplusplus/code_repository/convenience.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/convenience.py 2006-10-05 06:23:06 UTC (rev 622) +++ pyplusplus_dev/pyplusplus/code_repository/convenience.py 2006-10-05 07:17:04 UTC (rev 623) @@ -23,18 +23,16 @@ #include "boost/python.hpp" -//1 - dimension namespace pyplusplus{ namespace convenience{ -void raise_error( PyObject *exception, const char *message ){ - +inline void +raise_error( PyObject *exception, const char *message ){ PyErr_SetString(exception, message); boost::python::throw_error_already_set(); - } -void ensure_sequence( boost::python::object seq, Py_ssize_t expected_length=-1 ){ - +inline void +ensure_sequence( boost::python::object seq, Py_ssize_t expected_length=-1 ){ PyObject* seq_impl = seq.ptr(); if( !PySequence_Check( seq_impl ) ){ @@ -48,27 +46,32 @@ << "Actual sequence length is " << length << "."; raise_error( PyExc_ValueError, err.str().c_str() ); } - } template< class ExpectedType > void ensure_uniform_sequence( boost::python::object seq, Py_ssize_t expected_length=-1 ){ + ensure_sequence( seq, expected_length ); - ensure_sequence( seq, expected_length ); Py_ssize_t length = boost::python::len( seq ); for( Py_ssize_t index = 0; index < length; ++index ){ boost::python::object item = seq[index]; + boost::python::extract<ExpectedType> type_checker( item ); - if( type_checker.check() ){ - const boost::python::type_info expected_type_info( boost::python::type_id<ExpectedType>() ); - //TODO: How to extract type_info from PyObject? + if( !type_checker.check() ){ + std::string expected_type_name( boost::python::type_id<ExpectedType>().name() ); + + std::string item_type_name("different"); + PyObject* item_impl = item.ptr(); + if( item_impl && item_impl->ob_type && item_impl->ob_type->tp_name ){ + item_type_name = std::string( item_impl->ob_type->tp_name ); + } + std::stringstream err; - err << "Sequence should contain only items with type \"" << expected_type_info.name() << "\". " - << "Item at position " << index << " has different type."; + err << "Sequence should contain only items with type \\"" << expected_type_name << "\\". " + << "Item at position " << index << " has \\"" << item_type_name << "\\" type."; raise_error( PyExc_ValueError, err.str().c_str() ); } } - } } /*pyplusplus*/ } /*convenience*/ Added: pyplusplus_dev/unittests/convenience_tester.py =================================================================== --- pyplusplus_dev/unittests/convenience_tester.py (rev 0) +++ pyplusplus_dev/unittests/convenience_tester.py 2006-10-05 07:17:04 UTC (rev 623) @@ -0,0 +1,48 @@ +# Copyright 2004 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 sys +import unittest +import fundamental_tester_base + +from pyplusplus import code_repository + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'convenience' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, mb ): + mb.add_registration_code( 'bp::def( "ensure_sequence", &pyplusplus::convenience::ensure_sequence );' ) + mb.add_registration_code( 'bp::def( "ensure_int_sequence", &pyplusplus::convenience::ensure_uniform_sequence<int> );' ) + mb.build_code_creator( self.EXTENSION_NAME ) + + mb.code_creator.add_include( "__convenience.pypp.hpp" ) + mb.code_creator.add_system_header( code_repository.convenience.file_name ) + + def run_tests(self, module): + self.failIfRaisesAny( module.ensure_sequence, [1,2,3], -1 ) + self.failIfRaisesAny( module.ensure_sequence, [1,2,3], 3 ) + self.failIfNotRaisesAny( module.ensure_sequence, self, 1 ) + self.failIfRaisesAny( module.ensure_int_sequence, [1,2,3], -1 ) + self.failIfRaisesAny( module.ensure_int_sequence, [1,2,3], 3 ) + self.failIfNotRaisesAny( module.ensure_int_sequence, [self], 1 ) + self.failIfNotRaisesAny( module.ensure_int_sequence, [1,2.1,3] , 3 ) + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() Added: pyplusplus_dev/unittests/data/convenience_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/convenience_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/convenience_to_be_exported.hpp 2006-10-05 07:17:04 UTC (rev 623) @@ -0,0 +1,10 @@ +// Copyright 2004 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) + +#ifndef __convenience_to_be_exported_hpp__ +#define __convenience_to_be_exported_hpp__ + + +#endif//__convenience_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-10-05 06:23:06 UTC (rev 622) +++ pyplusplus_dev/unittests/test_all.py 2006-10-05 07:17:04 UTC (rev 623) @@ -64,6 +64,7 @@ import split_module_tester import properties_tester import arrays_bug_tester +import convenience_tester def create_suite(times): testers = [ @@ -124,6 +125,7 @@ , split_module_tester , properties_tester , arrays_bug_tester + , convenience_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-10-08 08:08:38
|
Revision: 627 http://svn.sourceforge.net/pygccxml/?rev=627&view=rev Author: roman_yakovenko Date: 2006-10-08 01:08:28 -0700 (Sun, 08 Oct 2006) Log Message: ----------- updating history Modified Paths: -------------- pyplusplus_dev/docs/history/history.rest pyplusplus_dev/pyplusplus/module_builder/builder.py Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2006-10-08 07:03:05 UTC (rev 626) +++ pyplusplus_dev/docs/history/history.rest 2006-10-08 08:08:28 UTC (rev 627) @@ -36,18 +36,44 @@ Version 0.8.* ------------- -1. Performance improvments. In some cases you can get x10 performance boost. - Many thanks to Allen Bierbaum! +1. Interface changes: -2. Convinience API for registering exception translator was introduced. + * ``module_builder.module_builder_t.build_code_creator`` method: + argument ``create_castinig_constructor`` was removed and deprecation warning + was introduced. -3. `Py++`_ can generate code that uses ``BOOST_PYTHON_FUNCTION_OVERLOADS`` and +2. Performance improvments. In some cases you can get x10 performance boost. + Many thanks to Allen Bierbaum! This was achieved by saving and reusing results + of different `pygccxml`_ algorithms and type traits functions. + +3. Convinience API for registering exception translator was introduced. + +4. `Py++`_ can generate code that uses ``BOOST_PYTHON_FUNCTION_OVERLOADS`` and ``BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS`` macros. -4. Treatment to previously generated and no more in-use files was added. By +5. Treatment to previously generated and no more in-use files was added. By default `Py++`_ 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, `Py++`_ will automaticly 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. `Py++`_ implements small + algorithm, that will automaticly discover properties, base on naming conventions. + +8. ``decl_wrappers.class_t`` has new function: ``is_wrapper_needed``. This + function explains why `Py++`_ 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 ------------- Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-10-08 07:03:05 UTC (rev 626) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-10-08 08:08:28 UTC (rev 627) @@ -226,15 +226,15 @@ and returns documentation string @type doc_extractor: callable or None """ - msg = os.linesep.join([ - "create_casting_constructor argument is deprecated and should not be used." - , "If you still want Py++ to generate implicitly_convertible code, consider to use allow_implicit_conversion constructor property" - , "mb = module_builder_t(...)" - , "mb.constructors().allow_implicit_conversion = True"]) - warnings.warn(msg, DeprecationWarning, stacklevel=2) + if not create_casting_constructor: + msg = os.linesep.join([ + "create_casting_constructor argument is deprecated." + , "If want to disable boost::python::implicitly_convertible code generation, consider to use allow_implicit_conversion constructor property" + , ">>> mb = module_builder_t(...)" + , ">>> mb.constructors().allow_implicit_conversion = False"]) + warnings.warn(msg, DeprecationWarning, stacklevel=2) - if create_casting_constructor: - self.global_ns.constructors(allow_empty=True).allow_implicit_conversion = True + self.global_ns.constructors(allow_empty=True).allow_implicit_conversion = False creator = mcreator_package.creator_t( self.global_ns , module_name This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |