
On Tue, Apr 6, 2010 at 2:12 PM, vicente.botet <vicente.botet@wanadoo.fr> wrote:
Lorenzo, As the () syntax is quite ugly, I was wondering if adding a contract preprocessing phase CP_PP could be a option to consider. Each contract programming line could be prefixed by a comment such as //~//.
template<typename T> class myvector: public pushable<T> { //~// invariant { //~// (size() == 0) == empty(); //~// }
public: void push_back(const T& element) //~// precondition { //~// size() < max_size(); //~// } //~// postcondition { //~// size() == oldof(this)->size() + 1; //~// } { vector_.push_back(element); } .... private: std::vector<T> vector_; };
As any CP sentence is commented with a C++ comment this code could work without CP preprocessing.
The CP_PP could generate #line directives so the original lines are preserved when warning or errors message are reported by the compiler.
The generated file could be generated in a specific contract directory so these files can be sees by the compiler before the original ones. The user will just need to add -Icontract directives.
JContract uses Javadoc comments. Doxygen provides \pre, \post, and \invariant tags so if a preprocessor was to extract contracts from code comments it might make sense to use these tags... There is already a preprocessing-based CP tool for C++ called "C^2" but I _think_ is not maintained anymore. If I have some free time (but not likely in the short term), I would like look into what can be done to generate Boost.Contract code using Boost.Wave/Spirit. However, while I recognize the ugliness of the contract macros syntax, my goal and interest were and remain to see how CP can be implemented within the C++ language itself (without external preprocessing)... Thanks, Lorenzo