736: Add a README and a "SCOOP 1+" translation in stc/doc/tiny.
2007-02-05 Thierry GERAUD <theo@tegucigalpa.lrde.epita.fr> Add a README and a "SCOOP 1+" translation in doc/tiny. * doc/tiny/a_la_scoop_1_plus: New. * doc/tiny/README: New. * doc/tiny/local/scoop.hh (Concept): Rename as... (concept_): ...this. (stc_equip_namespace): Add "vtypes< stc::any<E> >" so that we can have SCOOP 1 with SCOOP 2 tools. (stc_deferred): New. * doc/tiny/a_la_scoop_2/main.cc: Update. * doc/tiny/a_la_scoop_2/desugar.cc: Update. * doc/tiny/more_scoop_2/main.cc: Update. (reference): New. * doc/tiny/design/main.cc (is_valid): Fix sig. Index: doc/tiny/a_la_scoop_2/main.cc =================================================================== --- doc/tiny/a_la_scoop_2/main.cc (revision 735) +++ doc/tiny/a_la_scoop_2/main.cc (working copy) @@ -48,7 +48,7 @@ // Iterator template <typename Exact> - struct Iterator : public Concept<Exact>, + struct Iterator : public concept_<Exact>, public automatic::impl<Iterator, Exact> { stc_typename(value); Index: doc/tiny/a_la_scoop_2/desugar.cc =================================================================== --- doc/tiny/a_la_scoop_2/desugar.cc (revision 735) +++ doc/tiny/a_la_scoop_2/desugar.cc (working copy) @@ -48,7 +48,7 @@ // Iterator template <typename Exact> - struct Iterator : public Concept<Exact>, + struct Iterator : public concept_<Exact>, public automatic::impl<Iterator, Exact> { stc_typename(value); Index: doc/tiny/a_la_scoop_1_plus/gpp =================================================================== --- doc/tiny/a_la_scoop_1_plus/gpp (revision 0) +++ doc/tiny/a_la_scoop_1_plus/gpp (revision 0) @@ -0,0 +1 @@ +g++ -Wall -ansi -pedantic -I../../../ -I../../../../metalic $1 Property changes on: doc/tiny/a_la_scoop_1_plus/gpp ___________________________________________________________________ Name: svn:executable + * Index: doc/tiny/a_la_scoop_1_plus/main.cc =================================================================== --- doc/tiny/a_la_scoop_1_plus/main.cc (revision 0) +++ doc/tiny/a_la_scoop_1_plus/main.cc (revision 0) @@ -0,0 +1,139 @@ +// Copyright (C) 2007 EPITA Research and Development Laboratory. +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 51 Franklin Street, Fifth Floor, +// Boston, MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + + +/* \file doc/tiny/a_la_scoop_1_plus/main.cc + + \brief Tiny sample use of FIXME: SCOOP 1. */ + + +#include "../local/scoop.hh" + + +stc_equip_namespace(abc); + + + +namespace abc +{ + + // List of associated types. + stc_decl_associated_type(value); + + + // Iterator + +# define super stc::any<Exact> + // ----------------- + // ^ + // | +# define current Iterator<Exact> + // ----------------- + +# define templ template <typename Exact> +# define classname Iterator + + stc_Header; + + typedef stc::abstract value; // stc::abstract is a feature of SCOOP 2. + + stc_End; + + template <typename Exact> + struct Iterator : public stc::any<Exact> + { + stc_typename(value); + void next() { this->exact().impl_next(); } + bool is_valid() const { return this->exact().impl_is_valid(); } + void set(const value& v) { this->exact().impl_set(v); } + }; + +# include "../local/undefs.hh" + + + + // array_iterator + +# define current array_iterator<T> + // ------------------- + +# define templ template <typename T> +# define classname array_iterator + +# define super Iterator< current > + + + stc_Header; + + typedef stc::final<T> value; // stc::final is a feature of SCOOP 2. + + stc_End; + + + template <typename T> + class array_iterator : public super + { + public: + + stc_using(value); + void impl_next() { i_ = i_ + 1; } + bool impl_is_valid() const { return i_ >= 0 and i_ < n_; } + void impl_set(const value& v) { v_ = v; } + + array_iterator(int n) : i_(0), n_(n) {} + protected: + int i_, n_; + value v_; + }; + +# include "../local/undefs.hh" + + + + // algo + + template <typename I> + void algo(Iterator<I>& iter, typename I::value val) + { + if (iter.is_valid()) + { + iter.set(val); + iter.next(); + } + } + + +} // abc + + +int main() +{ + abc::array_iterator<int> i(7); + int val = 51; + + abc::algo(i, val); +} Index: doc/tiny/more_scoop_2/main.cc =================================================================== --- doc/tiny/more_scoop_2/main.cc (revision 735) +++ doc/tiny/more_scoop_2/main.cc (working copy) @@ -43,6 +43,7 @@ // List of associated types. stc_decl_associated_type(value); + stc_decl_associated_type(reference); stc_decl_associated_type(forward); stc_decl_associated_type(backward); @@ -54,7 +55,7 @@ // Iterator template <typename Exact> - struct Iterator : public Concept<Exact>, + struct Iterator : public concept_<Exact>, public automatic::impl<Iterator, Exact> { stc_typename(value); @@ -120,7 +121,7 @@ # define super top<E> - // ------- + // -------- // ^ // | # define current iterator_base<E> @@ -134,6 +135,7 @@ typedef stc::is<Iterator> category; typedef stc::abstract value; + typedef stc::final< stc_deferred(value) & > reference; stc_End; Index: doc/tiny/design/main.cc =================================================================== --- doc/tiny/design/main.cc (revision 735) +++ doc/tiny/design/main.cc (working copy) @@ -38,7 +38,7 @@ { value : type next : () -> void - is_valid : const bool + is_valid : const () -> bool set : (v : value const&) -> void } Index: doc/tiny/local/scoop.hh =================================================================== --- doc/tiny/local/scoop.hh (revision 735) +++ doc/tiny/local/scoop.hh (working copy) @@ -903,13 +903,24 @@ \ \ \ + /* stc::any vtypes in equipped namespace; code required for SCOOP 1 */ \ + \ + template <typename E> \ + struct vtypes< stc::any<E> > \ + { \ + typedef mlc::none super_type; \ + typedef stc::final<E> exact_type; \ + }; \ + \ + \ + \ /* concept class */ \ \ template <typename E> \ - struct Concept : public virtual stc::any<E> \ + struct concept_ : public virtual stc::any<E> \ { \ protected: \ - Concept() {} \ + concept_() {} \ }; \ \ \ @@ -1031,6 +1042,12 @@ # define stc_using(Type) typedef typename super::Type Type +# define stc_deferred(Type) \ + typename deferred_vtype< typename deferred_vtype< current, \ + typedef_::exact_type >::ret, \ + typedef_::Type >::ret + + // For impl classes. # define stc_lookup(Type) typedef typename vtype< stc_type(current, exact_type), typedef_::Type>::ret Type @@ -1050,6 +1067,8 @@ { \ typedef super super_type \ + + # define stc_End } Index: doc/tiny/README =================================================================== --- doc/tiny/README (revision 0) +++ doc/tiny/README (revision 0) @@ -0,0 +1,158 @@ + -*- outline -*- + + + +* Introduction. + +FIXME: ... + + + +* Contents. + + +** design/ + +Presents the sample program in a pseudo language. + +It defines Iterator as a record type with value (type), next, +is_valid, set (three methods). The class array_iterator[T] is an +implementation of an Iterator. + + +** classical/ + +Classical object-oriented C++ with abstract class and inheritance. +The use of "void*" maps a generalization of all value types and allows +to manually implement a covariant behavior of the "set" method. + + +** cpp_with_virtual_types/ + +Rewriting of the "classical" example but in an extension of the C++ +language with virtual types. This code does not compile! Yet it +expresses an syntactically elegant solution to the covariance issue. + + +** a_la_scoop_1/ + +SCOOP 1 aims at writing C++ class hierarchies in a static way +(with methods and typedefs dispatching at compile-time). + +Same as "cpp_with_virtual_types" but conforming to the 2003 ISO/ANSI +C++. The "virtual" keyword has disappeared so polymorphic methods +now are fast at run-time and the use of covariance is statically +solved and checked. + +To break recursion that appears in types definitions (*), an auxiliary +structure (vtypes) is introduced. This structure shall map the +inheritance tree of the targeted classes so that we also get +inheritance for virtual types. + +For instance, if B derives from A, we should have vtypes<B> deriving +from vtypes<A>. + +(*) Precisely the following code cannot compile: + struct Iterator { typedef typename iter::value_ value; }; + struct iter : Iterator { typedef int value_; }; + because "Iterator" needs to be compiled before "iter" so + the definition of "value_" is unaccessible. + + +** a_la_scoop_1_plus/ + +Almost like the previous example but with the material offered to +design with SCOOP 2. + +The main difference is that the "vtypes" definitions do not need +anymore to replicate class inheritance. When B derives from A, +vtypes<B> is no more required to derive from vtypes<A>. Yet the +expected properties of virtual type inheritance and lookup are +verified. + +Extra features are also provided: +- "stc::abstract" to declare a typedef and get an error at + compile-time when a concrete subclass misses to give its definition; +- "stc::final" to ensure that a typedef is not overridden in a + subclass; +- "delegatee_type" to offer delegation; +- furthermore typedef definitions based on deferred ones are now + possible (*). + +For instance, we can have: + + stc_Header; + typedef stc::abstract value; + typedef stc::final< stc_deferred(value) & > reference; + stc_End; + + +** a_la_scoop_2/ + +SCOOP 2 aims both at writing C++ class hierarchies in a static way +(just like SCOOP 1) and at decoupling concepts, models, and +some automatic implementation when delegation is involved. + +In this sample code the "Iterator" concept (deriving from "concept_") +is defined apart from the "array_iterator" class (deriving from +"top"). An intermediate (non-client) meta-code looks up for the +category of the implementation class so that it is plugged to the +appropriate concept. + +What we can expect from this kind of design is better illustrated in +the "more_scoop_2/" directory. + + +** more_scoop_2/ + +A more elaborate example than the previous one. + +FIXME: Give some explanations. + + +** local/ + +Material to equip a namespace with SCOOP 2 facilities and to program +with the SCOOP 2 paradigm. + + +** generic_programming/ + +Dual code than the "classical" object-oriented C++ example. Iterator +only appears in documentation and there is no explicit dependency +between this concept and the "array_iterator" model. + + +** cpp_with_concepts/ + +The example is here rewritten in C++0x according to the proposal n2081 +from the evolution working group of the C++ Standard committee (*). +"Iterator" is then translated into a concept. + +(*) www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2081.pdf + + + +* Recap. + + Iterator array_iterator[T] + ------------------------- ------------------------ + +design/ type implementation class +(pseudo-code) + +classical/ abstract class derived class + +cpp_with_virtual_types/ abstract class derived class +(this is not C++) + +generic_programming/ documentation stand-alone class + +a_la_scoop_1/ abstract class derived class +(static) super is Any<Exact> + +a_la_scoop_2/ concept-like "stand-alone"-like class +(static) super is concept_<Exact> super is top<Exact> + +cpp_with_concepts/ concept stand-alone class +(future C++)
participants (1)
-
Thierry GERAUD