
On Tue, May 31, 2011 at 2:49 PM, Lorenzo Caminiti <lorcaminiti@gmail.com> wrote:
I can eliminate a large number of extra parenthesis based on a few pp tricks I've learned in processing Boost.Local's `const bind(type)& var`. Plus, I can provide (optional) support for variadics macros so to use comma-separated pp tuplets instead of parenthesized pp sequences on preprocessors with variadics.
For example, I _think_ (but I've not implemented this yet) that I can simplify the syntax like this:
#include <contract.hpp> #include <vector> #include "myvector/pushable.hpp"
// Wrapper class that adds contracts to std::vector. CONTRACT_CLASS( template( typename T ) class (myvector) extends( public pushable<T> ) // Subcontracting. ) { CONTRACT_CLASS_INVARIANT( empty() == (size() == 0) // More invariants here (comma separated)... )
CONTRACT_FUNCTION( public void (push_back)( (const T&) element ) precondition( size() < max_size() // More preconditions here (comma separated)... ) postcondition( auto old_size = CONTRACT_OLDOF(size()), // Old value. size() == old_size + 1 // More postconditions here (comma separated)... ) ) { vector_.push_back(element); // Implementation. }
// Rest of the class here (with more contracts if needed)... public: typedef typename std::vector<T>::size_type size_type; size_type size(void) const { return vector_.size(); } size_type max_size(void) const { return vector_.max_size(); } bool empty(void) const { return vector_.empty(); } const T& back(void) const { return vector_.back(); } private: std::vector<T> vector_; };
For whomever is curious, I have implemented the new Boost.Contract syntax. Here's large number of examples that now compile with the new syntax: http://svn.boost.org/svn/boost/sandbox/contract/libs/contract/doc/html2/cont... Highlights are: * Side-by-side comparison with N1962 (contracts) and N2081 (concepts) syntax: http://svn.boost.org/svn/boost/sandbox/contract/libs/contract/doc/html2/cont... * I have also added C++0x-like virtual specifiers (final, override, and new) to Boost.Contract: http://svn.boost.org/svn/boost/sandbox/contract/libs/contract/doc/html2/cont... * Side-by-side comparison with Eiffel syntax: http://svn.boost.org/svn/boost/sandbox/contract/libs/contract/doc/html2/cont... Comments are always welcome :) (I still have to implement named parameter support (using Boost.Parameter behind the scene) but that shouldn't be too hard. The macros already parse the named parameter syntax using in/out/inout "keywords".) --Lorenzo