From 1b0272a5b907a48a530d4387be2c8267278019a0 Mon Sep 17 00:00:00 2001 From: "Frank B. Brokken" Date: Fri, 11 Dec 2015 15:48:54 +0100 Subject: [PATCH] ready for 10.4.0 --- annotations/icmake/docs | 1 + annotations/required | 2 +- annotations/src/htmlindex/build | 132 ++---------------- annotations/src/tab/flex.c | 2 + annotations/yo/classtemplates/converting.yo | 21 ++- .../examples/staticpolymorphism/double.cc | 8 +- .../examples/staticpolymorphism/multiple.cc | 8 +- .../examples/staticpolymorphism/polymorph.cc | 6 +- .../yo/classtemplates/examplestaticpoly.yo | 2 +- annotations/yo/overloading.yo | 3 +- .../yo/overloading/examples/refbinding1.cc | 6 - .../yo/overloading/examples/refbinding2.cc | 6 - .../yo/overloading/examples/refbinding3.cc | 6 - annotations/yo/overloading/reference.yo | 8 +- annotations/yo/whatsnew.yo | 8 ++ 15 files changed, 47 insertions(+), 172 deletions(-) diff --git a/annotations/icmake/docs b/annotations/icmake/docs index 1678d8e2..51fcdbf0 100644 --- a/annotations/icmake/docs +++ b/annotations/icmake/docs @@ -64,6 +64,7 @@ void htmldoc() chdir("yo"); system("yodl2html --no-warnings -l3 cplusplus "); system("mv *.html ../tmp/docs/html"); + system("cp cplusplus.css ../tmp/docs/html"); chdir(".."); } diff --git a/annotations/required b/annotations/required index d42a79b8..6fff0553 100644 --- a/annotations/required +++ b/annotations/required @@ -5,7 +5,7 @@ compilers explicitly mentioned, but fairly recent ones are assumed. Required software for building the C++ Annotations 10.4.0 --------------------------------------------------------- -icmake (>= 8.00.02), yodl (>= 3.06.00), libbobcat-dev (>= 4.01.03), flex, zip, +icmake (>= 8.00.03), yodl (>= 3.06.00), libbobcat-dev (>= 4.01.03), flex, zip, texlive-latex-base, texlive-generic-recommended, texlive-latex-recommended, texlive-fonts-recommended, ghostscript diff --git a/annotations/src/htmlindex/build b/annotations/src/htmlindex/build index 09ef20cc..c2debaae 100755 --- a/annotations/src/htmlindex/build +++ b/annotations/src/htmlindex/build @@ -34,9 +34,6 @@ string sources, // sources to be used wild, // wildcard of extension current; // contains name of current dir. -/* - O B J F I L E S . I M -*/ list objfiles(list files) { @@ -46,7 +43,7 @@ list objfiles(list files) int i; - for (i = 0; i < sizeof(files); i++) + for (i = 0; i < listlen(files); i++) { file = element(i, files); // determine element of the list @@ -60,64 +57,6 @@ list objfiles(list files) } return (files); } -/* - parser.im -*/ - -void parser() -{ - chdir("parser/gramspec"); - system("grambuild"); - chdir(".."); - - if - ( - exists("grammar") - && - "grammar" younger "parser.cc" - ) // new parser needed - { - exec("bisonc++", "-d", "-o", "parser.cc", "grammar"); - printf("Note: the compilation of parser.cc may produce " - "several compiler warnings.\n"); - } - - chdir(".."); -} -/* - scanner.im -*/ - -void scanner() -{ - chdir("scanner"); - - if - ( // new lexer needed - exists("lexer") - && - ( - "lexer" younger "yylex.cc" - || - "../parser/parser.h" younger "yylex.cc" - ) - ) - { - exec("flex++", -#ifdef INTERACTIVE - "-I", -#endif - "-oyylex.cc", "lexer"); - - printf("Note: the compilation of yylex.cc may produce " - "several compiler warnings.\n"); - } - - chdir(".."); -} -/* - A L T E R E D . I M -*/ list altered(list files, string target) { @@ -126,7 +65,7 @@ list altered(list files, string target) string file; - for (i = 0; i < sizeof(files); i++) // try all elements of the list + for (i = 0; i < listlen(files); i++) // try all elements of the list { file = element(i, files); // use element i of the list @@ -138,9 +77,6 @@ list altered(list files, string target) } return (files); // return the new list } -/* - F I L E L I S T . I M -*/ list file_list(string type, string library) { @@ -153,9 +89,6 @@ list file_list(string type, string library) return (files); } -/* - L I N K . I M -*/ void link(string library, string exe) { @@ -165,10 +98,6 @@ void link(string library, string exe) ); } -/* - C C O M P I L E . I M -*/ - void c_compile(list cfiles) { string nextfile; @@ -177,7 +106,7 @@ void c_compile(list cfiles) if (!exists("o")) system("mkdir o"); - if (sizeof(cfiles)) // files to compile ? + if (listlen(cfiles)) // files to compile ? { printf(current, "\n"); @@ -190,9 +119,6 @@ void c_compile(list cfiles) } } } -/* - U P D A T E L I . I M -*/ void updatelib(string library) { @@ -205,7 +131,7 @@ void updatelib(string library) objlist = makelist("*.o"); - if (!sizeof(objlist)) + if (!listlen(objlist)) return; printf("\n"); @@ -230,9 +156,6 @@ void prefix_class(string class_id) for (i = 0; o_file = element(i, o_files); i++) exec("mv", o_file, class_id + o_file); } -/* - S T D C P P . I M -*/ void std_cpp(string library) { @@ -244,25 +167,6 @@ void std_cpp(string library) c_compile(cfiles); // compile cpp-files } -/* - C P P M A K E . C - - CPP files are processed by stdmake. - - Arguments of CPPMAKE: - - cpp_make( - string mainfile, : name of the main .cpp file, or "" for library - maintenance - string library, : name of the local library to use/create - (without lib prefix, .a suffix - if main is given here, libmain.a is created) - string exe, : (path) name of the exe file to create - ) - - Both mainfile and library MUST be in the current directory -*/ - void cpp_make(string mainfile, string library, string exe) { int @@ -273,18 +177,6 @@ void cpp_make(string mainfile, string library, string exe) string cwd; -#ifdef BISON++ - CLASSES += "parser "; - if (exists("parser")) // subdir parser exists - parser(); -#endif - -#ifdef FLEX++ - CLASSES += "scanner "; - if (exists("scanner")) // subdir scannerexists - scanner(); -#endif - setClasses(); // remaining classes cwd = chdir("."); @@ -293,7 +185,7 @@ void cpp_make(string mainfile, string library, string exe) classes = strtok(CLASSES, " "); // list of classes - if (n = sizeof(classes)) + if (n = listlen(classes)) ofiles += " */o/*.o"; // set ofiles for no LIBRARY use wild = sources; @@ -327,9 +219,7 @@ void cpp_make(string mainfile, string library, string exe) if (mainfile != "") // mainfile -> do link link(library, exe); } -/* - S E T L I B S . I M -*/ + void setlibs() { int @@ -339,24 +229,18 @@ void setlibs() cut; cut = strtok(LIBS, " "); // cut op libraries - n = sizeof(cut); + n = listlen(cut); for (index = 0; index < n; index++) libs += " -l" + element(index, cut); -#ifdef FLEX++ - libs += " -lfl"; -#endif - cut = strtok(LIBPATH, " "); // cut up the paths - n = sizeof(cut); + n = listlen(cut); for (index = 0; index < n; index++) libpath += " -L" + element(index, cut); } - void main() { - echo(ECHO_REQUEST); sources = "*.cc"; diff --git a/annotations/src/tab/flex.c b/annotations/src/tab/flex.c index fae76fc0..8e153af3 100644 --- a/annotations/src/tab/flex.c +++ b/annotations/src/tab/flex.c @@ -1,3 +1,5 @@ +#define YY_NO_INPUT + #line 2 "flex.c" #line 4 "flex.c" diff --git a/annotations/yo/classtemplates/converting.yo b/annotations/yo/classtemplates/converting.yo index 32a633f3..5fcfe316 100644 --- a/annotations/yo/classtemplates/converting.yo +++ b/annotations/yo/classtemplates/converting.yo @@ -26,7 +26,6 @@ this (regarding the members that are involved in their polymorphic behaviors): int vmass() const override; }; ) - ) When converting dynamically polymorphic classes to statically polymorphic classes we must realize that polymorphic classes show two important @@ -88,7 +87,7 @@ should it call tt(Class::vmass) or should it call tt(Truck::vmass)? COMMENT(see examples/staticpolymorphism/multiple.cc) ) To solve this problem (i.e., to ensure that tt(Truck{}.mass()) calls -tt(Truck::vmass) the redefinable interface must be separated +tt(Truck::vmass)) the redefinable interface must be separated from the inheritable interface. In derived classes the protected and public interfaces of (direct or indirect) @@ -125,12 +124,12 @@ to the right. E.g., tt(VehicleBase) declares tt(Vechicle) as its friend: }; ) -The top level class to the right (tt(VehicleBase) lays the foundation of +The top level class to the right (tt(VehicleBase)) lays the foundation of static polymorphism, by defining that part of the interface that uses the statically redefinable functions. E.g, using the curiously recurring template pattern it defines a class member tt(mass) that calls the function tt(vmass) -of its derived class (at the same time it can use all members of its non-class -template base class. E.g,: +of its derived class (in addition it can use all members of its non-class +template base class). E.g,: verb( template class Vehicle: public VehicleBase @@ -199,14 +198,14 @@ polymorphic base class (allowing for definitions like tt(Vehicle<> vehicle)). it() Likewise the remaining classes have their members not involved in static polymorphism moved to a base class. E.g., class tt(Car) moves these members to tt(CarBase) and -tt(Truck) moves those members to TruckBase). +tt(Truck) moves those members to tt(TruckBase). it() A standard linear line of inheritance is used from tt(VehicleBase) to tt(CarBase) and from there to tt(TruckBase). - it() Each of the remaining classes (here: tt(Car) and tt(Truck) is a class -template that derives from its base classes, and also, using the curiously -recurrent template pattern, from tt(Vehicle). + it() Each of the remaining classes (here: tt(Car) and tt(Truck)) is a +class template that derives from its base classes, and also, using the +curiously recurrent template pattern, from tt(Vehicle). it() Each of these remaining classes can now implement its own version of the redefinable interface, as used by the members of tt(Vehicle). @@ -248,6 +247,6 @@ template: two implementations, one for the tt(Car) type, and one for the tt(Truck) type. The statically polumorphic program will be slightly faster, though. - (An compilable example using static polymorphism is found in the + (A compilable example using static polymorphism is found in the annotation()'s source distribution's file -tt(yo/classtemplates/examples/staticpolymorphism/polymorph.cc). +tt(yo/classtemplates/examples/staticpolymorphism/polymorph.cc).) diff --git a/annotations/yo/classtemplates/examples/staticpolymorphism/double.cc b/annotations/yo/classtemplates/examples/staticpolymorphism/double.cc index 44ff1b87..48063948 100644 --- a/annotations/yo/classtemplates/examples/staticpolymorphism/double.cc +++ b/annotations/yo/classtemplates/examples/staticpolymorphism/double.cc @@ -6,11 +6,11 @@ template class Vehicle { public: - void mass() + void mass() { static_cast(this)->vmass(); } - + // no need to implement vmass here, as it should be implemented // by derived classes. }; @@ -20,7 +20,7 @@ class Car: public Vehicle friend void Vehicle::mass(); private: - void vmass() + void vmass() { cout << "Car's vmass called\n"; } @@ -29,7 +29,7 @@ class Car: public Vehicle class Truck: public Car { private: - void vmass() + void vmass() { cout << "Car's vmass called\n"; } diff --git a/annotations/yo/classtemplates/examples/staticpolymorphism/multiple.cc b/annotations/yo/classtemplates/examples/staticpolymorphism/multiple.cc index 3223437f..990b0b6a 100644 --- a/annotations/yo/classtemplates/examples/staticpolymorphism/multiple.cc +++ b/annotations/yo/classtemplates/examples/staticpolymorphism/multiple.cc @@ -6,11 +6,11 @@ template class Vehicle { public: - void mass() + void mass() { static_cast(this)->vmass(); } - + // no need to implement vmass here, as it should be implemented // by derived classes. }; @@ -20,7 +20,7 @@ class Car: public Vehicle friend void Vehicle::mass(); private: - void vmass() + void vmass() { cout << "Car's vmass called\n"; } @@ -30,7 +30,7 @@ class Truck: public Car, public Vehicle { friend void Vehicle::mass(); private: - void vmass() + void vmass() { cout << "Car's vmass called\n"; } diff --git a/annotations/yo/classtemplates/examples/staticpolymorphism/polymorph.cc b/annotations/yo/classtemplates/examples/staticpolymorphism/polymorph.cc index 785c98a6..aa3f5d7e 100644 --- a/annotations/yo/classtemplates/examples/staticpolymorphism/polymorph.cc +++ b/annotations/yo/classtemplates/examples/staticpolymorphism/polymorph.cc @@ -6,7 +6,7 @@ class VehicleBase { // original Vehicle members, not implementing the // redefinable interface, but used as a implementable rather than - // instantiatable part of the corresponding class template. + // instantiatable part of the corresponding class template. // That's why it declares its corresponding class template a friend. template @@ -29,7 +29,7 @@ class Vehicle: public VehicleBase class CarBase: public VehicleBase { // original Car members, not implementing the - // redefinable interface + // redefinable interface int x = 1000; friend class Car; @@ -48,7 +48,7 @@ class Car: public CarBase, public Vehicle class TruckBase: public CarBase { // original Truck members, not implementing the - // redefinable interface + // redefinable interface friend class Truck; }; diff --git a/annotations/yo/classtemplates/examplestaticpoly.yo b/annotations/yo/classtemplates/examplestaticpoly.yo index 40c352b4..6e7f694c 100644 --- a/annotations/yo/classtemplates/examplestaticpoly.yo +++ b/annotations/yo/classtemplates/examplestaticpoly.yo @@ -40,7 +40,7 @@ a tt(Derived) class object. So, to call a tt(Derived) class member from inside tt(interface) we can use the following implementation (remember that tt(Base) is a base class -of tt(Derived): +of tt(Derived)): verb( template void Base::interface() diff --git a/annotations/yo/overloading.yo b/annotations/yo/overloading.yo index 5608c5b3..6235314e 100644 --- a/annotations/yo/overloading.yo +++ b/annotations/yo/overloading.yo @@ -23,11 +23,10 @@ includefile(overloading/increment.yo) lsect(OVERLOADBINARY)(Overloading binary operators) includefile(overloading/binary.yo) - subsect(Member function reference bindings (& and &&)) + lsubsect(REFBIND)(Member function reference bindings (& and &&)) includefile(overloading/reference.yo) COMMENT(13.3.3.2) - lsect(OVERLOADNEW)(Overloading `operator new(size_t)') includefile(overloading/new) diff --git a/annotations/yo/overloading/examples/refbinding1.cc b/annotations/yo/overloading/examples/refbinding1.cc index 4d00c590..4ac83a0b 100644 --- a/annotations/yo/overloading/examples/refbinding1.cc +++ b/annotations/yo/overloading/examples/refbinding1.cc @@ -49,9 +49,3 @@ int main() cout << "========\n"; Demo{} + d1 + d1; } - - - - - - diff --git a/annotations/yo/overloading/examples/refbinding2.cc b/annotations/yo/overloading/examples/refbinding2.cc index 99c4ea40..b0106fea 100644 --- a/annotations/yo/overloading/examples/refbinding2.cc +++ b/annotations/yo/overloading/examples/refbinding2.cc @@ -58,9 +58,3 @@ int main() Demo{} + d1 + d1; } - - - - - - diff --git a/annotations/yo/overloading/examples/refbinding3.cc b/annotations/yo/overloading/examples/refbinding3.cc index b64d4fa6..87b1030b 100644 --- a/annotations/yo/overloading/examples/refbinding3.cc +++ b/annotations/yo/overloading/examples/refbinding3.cc @@ -52,9 +52,3 @@ int main() cout << "========\n"; Binary{} + Binary{} + Binary{}; } - - - - - - diff --git a/annotations/yo/overloading/reference.yo b/annotations/yo/overloading/reference.yo index 738c2bcc..8fe26440 100644 --- a/annotations/yo/overloading/reference.yo +++ b/annotations/yo/overloading/reference.yo @@ -21,8 +21,8 @@ Our implementation of tt(operator+=) thus far looks like this: } ) However, when implementing tt(operator+) we either already have a -temporary object (when using tt(operator+(Binary &&lhs, ...)), or just created -a temporary object (when using tt(operator+(Binary const &lhs, ...)). In our +temporary object (when using tt(operator+(Binary &&lhs, ...))), or just created +a temporary object (when using tt(operator+(Binary const &lhs, ...))). In our current implementation lots of additional temporaries are being constructed, each of them requiring a copy construction. E.g, in an expression like verb( @@ -31,7 +31,7 @@ each of them requiring a copy construction. E.g, in an expression like a temporary is constructed when computing tt(Binary{} + varB), then another one for tt(Binary{} + varC), and yet one more for tt(Binary{} + varD). In addition, each addition also performs a swap, even though we already -have a temporary (i.e., tt(Binary{}) in our hands. +have a temporary (i.e., tt(Binary{})) in our hands. How to tell the compiler that we don't need these temporaries? @@ -97,7 +97,7 @@ expression tt(b1 + b2 + b3) Move += = tmp += b3 ) It's even faster when the first operand already is a temporary (e.g., -tt(Binary{} + b2 + b3): +tt(Binary{} + b2 + b3)): verb( Move += = Binary{} += b2 Move += = Binary{} += b3 diff --git a/annotations/yo/whatsnew.yo b/annotations/yo/whatsnew.yo index b129b894..7875d1b3 100644 --- a/annotations/yo/whatsnew.yo +++ b/annotations/yo/whatsnew.yo @@ -1,6 +1,14 @@ This section is modified when the first or second part of the version number changes (and sometimes for the third part as well). itemization( + it() Version 10.4.0 adds the previously missing section about reference + bindings (section ref(REFBIND)). This section is a subsection of + section ref(OVERLOADBINARY), covering overloading binary operators, + and this latter section, as well as the section covering static + polymorphism (section ref(STATICPOLY)) was completely + rewritten. In addition, the appearance of the html-version of the + annotations() can now to some extent be fine-tuned by adding CSS + elements in the top-level file tt(cplusplus.css). it() Version 10.3.0 contains new sections about expression templates, about at tributes, about shared mutexes, about shared locks, about heterogeneous lookups, about sized deallocation functions, and about