.. -*- mode: rst -*-

====================================
 Boost.Python_ TODO list |(logo)|__
====================================

.. |(logo)| image:: ../../boost.png
   :alt: Boost
   :class: boost-logo

__ ../../index.htm

.. _`Boost.Python`: index.html

:copyright: Copyright David Abrahams 2003. Use, modification, and
    distribution are subject to 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) 

.. contents:: Outline

.. _`LICENSE_1_0.txt`: ../../LICENSE_1_0.txt

Class Support
=============

Base Class for Virtual Function Callback Wrappers
-------------------------------------------------

* http://aspn.activestate.com/ASPN/Mail/Message/c++-sig/1456023
  (bottom of message)

* http://mail.python.org/pipermail/c++-sig/2003-August/005297.html
  (search for ``VirtualDispatcher``) describes how callback classes
  can swap ownership relationship with their Python wrappers.

* http://aspn.activestate.com/ASPN/Mail/Message/c++-sig/1860301
  describes how this can also be used to considerably simplify
  callback classes, solve some "dangling reference" problems, and
  optimize the calling of non-overridden virtual functions.

Miscellaneous
=============

Support for Enums with Duplicate Values
---------------------------------------

  Scott Snyder provided a patch; Dave was dissatisfied for some
  reason, but maybe it should just be applied if no further action
  occurs http://aspn.activestate.com/ASPN/Mail/Message/1824616.


Functions
=========

Wrapping Function Objects
--------------------------

  It should be possible to wrap classes which support ``operator()``
  as Python methods.

  http://mail.python.org/pipermail/c++-sig/2003-August/005184.html


"Best Match" Overload Resolution
--------------------------------

  Overload resolution currently depends on the order in which ``def``
  calls are made (preferring later overloads).  This should be
  changed so that the best-matching overload is always selected.
  This may await Langbinding_ integration, since the technology is
  already in Luabind_.

  .. _Luabind: http://luabind.sf.net

Type Converters
===============

Lvalue conversions from non-const ``PyTypeObject*``\ s
------------------------------------------------------

  http://aspn.activestate.com/ASPN/Mail/Message/C++-sig/1662717

Converter Scoping
-----------------

  http://article.gmane.org/gmane.comp.python.c++/2044

  If this gets done at all, it is going to happen in conjunction
  with `Luabind integration`__.

  __ Langbinding_


``boost::tuple``
----------------

  Conversions to and from Python would be nice.  See
  http://news.gmane.org/find-root.php?message_id=%3cuvewak97m.fsf%40boost%2dconsulting.com%3e

``FILE*`` conversions
---------------------

  http://aspn.activestate.com/ASPN/Mail/Message/1411366

``void*`` conversions
---------------------

  Pointers to *cv* ``void`` should be able to be passed and
  returned as opaque values.

Post-Call Actions
-----------------

  From-Python converters should be passed an extra reference to a
  chain of post-call actions in the Policies object, where they can
  register an additional action.  See the end of
  http://aspn.activestate.com/ASPN/Mail/Message/C++-sig/1755435

``PyUnicode`` Support
---------------------

  Review and possibly incorporate changes from `Lijun Qin`_ at
  http://aspn.activestate.com/ASPN/Mail/Message/C++-sig/1771145

  .. _`Lijun Qin`: mailto:qinlj-at-solidshare.com

Ownership Metadata
------------------

  In the thread at
  http://aspn.activestate.com/ASPN/Mail/Message/c++-sig/1860301,
  Niall Douglas describes an idea for solving some "false"
  dangling pointer/reference return errors by attaching data about
  objects which lets the framework determine that the reference
  count on an object doesn't tell us anything about the lifetime
  of its data.

Documentation
=============

Builtin Converters
------------------

  Builtin correspondences between builtiin Python types and C++
  types need to be documented

Internals
---------

  The structure of the framework needs to get documented; `Brett
  Calcott`_ has promised to turn `this document`__ into something fit
  for users

  __ doc/internals.html

  .. _`Brett Calcott`: mailto:brett.calcott-at-paradise.net.nz


Large Scale
===========

Full Threading Support
----------------------

  Various people have proposed patches to improve threading support
  in Boost.Python: see the thread at
  http://aspn.activestate.com/ASPN/Mail/Message/1826544 and
  http://aspn.activestate.com/ASPN/Mail/Message/1865842 for some
  examples.  The only problem is that these are incomplete
  solutions and verifying that we *do* have a complete solution is
  going to take some time and attention.

Langbinding
-----------

  This project to generalizes Boost.Python to work for other
  languages, initially Lua.  See discussions at
  http://lists.sourceforge.net/lists/listinfo/boost-langbinding

Refactoring and Reorganization
------------------------------

  http://aspn.activestate.com/ASPN/Mail/Message/c++-sig/1673338

NumArray Support Enhancements
-----------------------------

  Consider integrating the enhancements described in
  http://aspn.activestate.com/ASPN/Mail/Message/C++-sig/1757092

``PyFinalize`` Safety
---------------------

  Currently Boost.Python has several global (or function-static)
  objects whose existence keeps reference counts from dropping to
  zero until the Boost.Python shared object is unloaded.  This can
  cause a crash because when the reference counts *do* go to zero,
  there's no interpreter.  In order to make it safe to call
  ``PyFinalize()`` we must register an ``atexit`` routine which
  destroys these objects and releases all Python reference counts
  so that Python can clean them up while there's still an
  interpreter.  `Dirk Gerrits`_ has promised to do this job.

  .. _`Dirk Gerrits`: mailto:dirk-at-gerrits.homeip.net

