diff options
Diffstat (limited to 'subversion/bindings/cxx/README')
-rw-r--r-- | subversion/bindings/cxx/README | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/subversion/bindings/cxx/README b/subversion/bindings/cxx/README new file mode 100644 index 0000000..6126c5a --- /dev/null +++ b/subversion/bindings/cxx/README @@ -0,0 +1,147 @@ +WORK IN PROGRESS +================ + +This directory contains an experimental implementation of SVN++, a +high-level Subversion C++ API. + +It is far from complete and may never see the light of day. + +On the other hand, one good reason for having a high-level C++ API is +to use it as a baseline for Swig-generated bindings. Our current set +of Perl, Python and Ruby bindings is too heterogenous in terms of +feature set, object and usage model. They're almost as hard to use as +the C API itself. + + +DESIGN GOALS +============ + +In no particular order: + + * Use modern C++ constructs (the current baseline is C++11). + + * Hide the dependency on APR that is exposed in Subversion's C API. + + * Use separate C++ types for different kinds of values returned + from the C API (e.g., dirent vs. property value vs. URL), to make + it easier to create generic typemaps for Swig. + + * Provide both synchronous and asynchronous interfaces. + + * Avoid unnecessary copies by defining strict lifetimes for + returned values. + + * Provide API variants that accept wide strings as well as + UTF-8-encoded narrow strings. + + * Provide high-level constructs for common parameter types; e.g., + revision ranges and lists for diff, merge, etc. + + * Provide optional header-only conversions and overload for Boost types (e.g., + boost::tribool, boost::filesystem::path), which can be enabled by users by + defining the SVNXX_USE_BOOST symbol. + + These convenience overloads and conversions must *not* make the SVN++ + library depend on any Boost runtime libraries. + + * API versioning (how?). + + +API COVERAGE +============ + +Planned: + + * libsvn_client (highest priority) + * svn_mtcc_* + * utilities (diff, revision ranges/lists, etc.) + * libsvn_ra + * libsvn_repos/libsvn_fs (lowest priority) + +Not planned: + * libsvn_subr + * libsvn_wc + + +C++ NAMESPACES AND SOURCE LAYOUT +================================ + +Public API +---------- + +The public API is in namespace apache::subversion::svnxx and we define +a namespace alias for that: + + namespace svn = ::apache::subversion::svnxx + +All elements of the public API are defined or declared in header files +in the directory + + .../include/svnxx/*.hpp + +with the single header file + + .../include/svnxx.hpp + +importing all relevant headers from that directory. + +Implementation details used by the public API and visible to user +code but that should not be directly used by user code are in the +namespace apache::subversion::svnxx::detail and should be defined +in header files in the directory: + + .../include/svnxx/detail/*.hpp + +Note on API versioning +---------------------- + +Version-specific elements of the public API should be defined in +namespaces within the public namespace; e.g., for version 1.13: + + apache::subversion::svnxx::v_1_13 + +and the default (or selected) version will be exposed in the +parent namespace by inlining the namespace declaration. +This versioning does not apply to things declared in svn::detail. + +Implementation +-------------- + +All entities that are private to the implementation should be +in the namespace apache::subversion::svnxx::impl and defined +in header files within the source directory tree: + + .../src/private/*_private.hpp + +with the single header file + + .../src/private.hpp + +importing all relevant headers from that directory. The exception to +this rule are C++ wrappers for APR types, which are defined in the +namespace apache::subversion::svnxx::apr in header files in the +directory: + + .../src/aprwrap/*.hpp + +with the single header file + + .../src/aprwrap.hpp + +importing all relevant headers from that directory. + +==================================================================== + +IMPLEMENTATION NOTES +==================== + +Asynchronous Operations (TODO) +------------------------------ + +In the current model of asyncrhonous operations, we do not protect +against using the same svn_client_ctx_t object from multiple +threads. This _should_ be safe as long as the callback +implementations are aware of it, but we should consider changing the +design so that whilst svn::client::context can be shared, we create +the actual svn_client_ctx_t on the fly for each operation -- +similarly to how we create a the scratch pool. |