From 2ef4a5d8434a8543f47840f7e1e218f9932f3205 Mon Sep 17 00:00:00 2001 From: Lorenzo Caminiti Date: Mon, 28 Aug 2017 20:51:08 -0700 Subject: [PATCH] added all files for release 0.2.190 --- COPYRIGHT.txt | 2 + LICENSE_1_0.txt | 27 + Makefile | 51 + README.txt | 53 + bin/README.txt | 1 + bin/cxx-duplicate_friend_warning_filter.pl | 32 + bin/cxx-ignore_duplicate_friend_warning | 28 + bin/env-MSVC8.sh | 18 + bin/install | 23 + bin/must-fail | 19 + bin/release | 66 + bin/release.dat | 4 + bin/upload-website | 29 + build/Makefile.example | 104 + build/Makefile.test | 158 + build/REAME.txt | 1 + build/svnignore | 7 + codedoc/Doxyfile.example | 1356 +++++++ codedoc/Doxyfile.test | 1356 +++++++ codedoc/REAME.txt | 1 + codedoc/svnignore | 6 + doc/README.txt | 3 + .../HOWTO_Create_New_Sourceforge_Release.txt | 23 + .../HOWTO_Upload_Sourceforge_Website_HTML.txt | 18 + doc/howto/README.txt | 1 + doc/html/Bibliography.html | 72 + doc/html/Design_By_Contract.html | 114 + doc/html/Errors.html | 157 + doc/html/Quick_Start.html | 337 ++ doc/html/README.txt | 1 + doc/html/Software_License.html | 52 + doc/html/Writing_Contracts.html | 313 ++ doc/html/annotated.html | 54 + doc/html/assertion_8hpp.html | 220 ++ doc/html/body_8hpp.html | 219 ++ doc/html/bug.html | 80 + doc/html/classdbc_1_1assertion-members.html | 49 + doc/html/classdbc_1_1assertion.html | 548 +++ doc/html/classdbc_1_1assertion.png | Bin 0 -> 433 bytes ...ssdbc_1_1condition__violation-members.html | 34 + .../classdbc_1_1condition__violation.html | 91 + doc/html/classdbc_1_1condition__violation.png | Bin 0 -> 769 bytes doc/html/classdbc_1_1copyable.html | 56 + doc/html/classdbc_1_1exit-members.html | 34 + doc/html/classdbc_1_1exit.html | 90 + doc/html/classdbc_1_1fun-members.html | 37 + doc/html/classdbc_1_1fun.html | 165 + .../classdbc_1_1fun_1_1constr-members.html | 41 + doc/html/classdbc_1_1fun_1_1constr.html | 366 ++ .../classdbc_1_1fun_1_1destr-members.html | 39 + doc/html/classdbc_1_1fun_1_1destr.html | 241 ++ doc/html/classdbc_1_1fun_1_1mem-members.html | 41 + doc/html/classdbc_1_1fun_1_1mem.html | 347 ++ ...assdbc_1_1invariat__violation-members.html | 34 + doc/html/classdbc_1_1invariat__violation.html | 81 + .../classdbc_1_1oassertionstream-members.html | 51 + doc/html/classdbc_1_1oassertionstream.html | 158 + doc/html/classdbc_1_1oassertionstream.png | Bin 0 -> 427 bytes doc/html/classdbc_1_1object.html | 65 + doc/html/classdbc_1_1post-members.html | 34 + doc/html/classdbc_1_1post.html | 81 + ...ssdbc_1_1post_3_01T_01_5_01_4-members.html | 34 + .../classdbc_1_1post_3_01T_01_5_01_4.html | 81 + ..._3_01copyable_3_01T_01_4_01_4-members.html | 35 + ..._1_1post_3_01copyable_3_01T_01_4_01_4.html | 103 + ...copyable_3_01T_01_5_01_4_01_4-members.html | 35 + ...ost_3_01copyable_3_01T_01_5_01_4_01_4.html | 103 + ...c_1_1postcondition__violation-members.html | 35 + .../classdbc_1_1postcondition__violation.html | 90 + .../classdbc_1_1postcondition__violation.png | Bin 0 -> 485 bytes ...bc_1_1precondition__violation-members.html | 35 + .../classdbc_1_1precondition__violation.html | 90 + .../classdbc_1_1precondition__violation.png | Bin 0 -> 487 bytes doc/html/classdbc_1_1raise.html | 65 + doc/html/classdbc_1_1terminate.html | 56 + doc/html/classdbc_1_1uraise-members.html | 34 + doc/html/classdbc_1_1uraise.html | 102 + doc/html/config_8hpp.html | 480 +++ doc/html/dbc_8hpp.html | 154 + doc/html/doxygen.css | 433 +++ doc/html/doxygen.png | Bin 0 -> 1281 bytes doc/html/exception_8hpp.html | 60 + doc/html/files.html | 44 + doc/html/fun_8hpp.html | 86 + doc/html/functions.html | 176 + doc/html/functions_func.html | 131 + doc/html/functions_type.html | 72 + doc/html/functions_vars.html | 52 + doc/html/globals.html | 130 + doc/html/globals_defs.html | 130 + doc/html/hierarchy.html | 58 + doc/html/index.html | 109 + doc/html/invariant_8hpp.html | 157 + doc/html/mfun_8hpp.html | 482 +++ doc/html/mparam_8hpp.html | 103 + doc/html/namespacedbc.html | 173 + doc/html/namespacemembers.html | 48 + doc/html/namespacemembers_func.html | 46 + doc/html/namespacemembers_type.html | 44 + doc/html/namespaces.html | 34 + doc/html/object_8hpp.html | 144 + doc/html/pages.html | 43 + doc/html/post_8hpp.html | 137 + doc/html/str/annotated.html | 32 + doc/html/str/classstr-members.html | 36 + doc/html/str/classstr.html | 245 ++ doc/html/str/doxygen.css | 433 +++ doc/html/str/doxygen.png | Bin 0 -> 1281 bytes doc/html/str/files.html | 32 + doc/html/str/functions.html | 50 + doc/html/str/functions_func.html | 48 + doc/html/str/functions_vars.html | 42 + doc/html/str/globals.html | 41 + doc/html/str/globals_func.html | 41 + doc/html/str/index.html | 25 + doc/html/str/str_8cpp.html | 61 + doc/html/str/tab_b.gif | Bin 0 -> 35 bytes doc/html/str/tab_l.gif | Bin 0 -> 706 bytes doc/html/str/tab_r.gif | Bin 0 -> 2585 bytes doc/html/str/tabs.css | 102 + doc/html/tab_b.gif | Bin 0 -> 35 bytes doc/html/tab_l.gif | Bin 0 -> 706 bytes doc/html/tab_r.gif | Bin 0 -> 2585 bytes doc/html/tabs.css | 102 + doc/html/todo.html | 79 + doc/reference/A++/A++-C++AtWork.pdf | Bin 0 -> 33343 bytes doc/reference/C#/article2.pdf | Bin 0 -> 148915 bytes ... for C++ - Mombu the Programming Forum.htm | 3413 +++++++++++++++++ .../1.html | 10 + .../2.html | 10 + .../abg-en-100c-000000.png | Bin 0 -> 1006 bytes .../ads(1).htm | 3 + .../ads(2).htm | 3 + .../ads(3).htm | 3 + .../ads(4).htm | 3 + .../ads.htm | 3 + .../brand | 31 + .../expansion_embed.js | 87 + .../graphics.js | 17 + .../icon1.gif | Bin 0 -> 1032 bytes .../mode_hybrid.gif | Bin 0 -> 588 bytes .../mode_linear.gif | Bin 0 -> 609 bytes .../mode_threaded.gif | Bin 0 -> 562 bytes .../mombu_naranja3.png | Bin 0 -> 46766 bytes .../navbits_start.gif | Bin 0 -> 49 bytes .../printer.gif | Bin 0 -> 610 bytes .../quote.gif | Bin 0 -> 2281 bytes .../reply.gif | Bin 0 -> 2397 bytes .../sendtofriend.gif | Bin 0 -> 615 bytes .../show_ads.js | 63 + .../sma8.js | 14 + .../style-30ca319c-00011.css | 288 ++ .../test_domain.js | 1 + .../threadheader.htm | 9 + .../urchin.js | 695 ++++ .../vbulletin_global.js | 1539 ++++++++ .../vbulletin_md5.js | 324 ++ doc/reference/DBC_and_Unit_Testing/madsen.pdf | Bin 0 -> 54994 bytes .../DBC_and_Unit_Testing/valle00combining.pdf | Bin 0 -> 80367 bytes ... in C++ - The Code Project - C++ - MFC.htm | 2757 +++++++++++++ .../codeproject225x90.gif | Bin 0 -> 7001 bytes .../cpmenu_var.js | 120 + .../forum_faq.gif | Bin 0 -> 1000 bytes .../forum_newmsg.gif | Bin 0 -> 1028 bytes .../forum_search.gif | Bin 0 -> 974 bytes .../front.asp | 12 + .../global.css | 615 +++ .../ind.gif | Bin 0 -> 824 bytes .../link.gif | Bin 0 -> 83 bytes .../mail.gif | Bin 0 -> 88 bytes .../mail_small.gif | Bin 0 -> 161 bytes .../menu10_com.js | 386 ++ .../news_answer.gif | Bin 0 -> 955 bytes .../news_blank.gif | Bin 0 -> 55 bytes .../news_game.gif | Bin 0 -> 659 bytes .../news_general.gif | Bin 0 -> 923 bytes .../news_info.gif | Bin 0 -> 958 bytes .../news_question.gif | Bin 0 -> 1062 bytes .../news_sticky.gif | Bin 0 -> 1020 bytes .../oncopy.js | 51 + .../print.gif | Bin 0 -> 118 bytes .../prize_winner_sm.gif | Bin 0 -> 1001 bytes .../red.gif | Bin 0 -> 77 bytes .../sitebuild_icon.gif | Bin 0 -> 218 bytes .../smiley_doh.gif | Bin 0 -> 646 bytes .../smiley_redface.gif | Bin 0 -> 1558 bytes .../smiley_smile.gif | Bin 0 -> 1021 bytes .../space.gif | Bin 0 -> 43 bytes .../staff_sm.gif | Bin 0 -> 561 bytes .../t.gif | Bin 0 -> 43 bytes .../togglePre.js | 100 + .../urchin.js | 636 +++ .../userinfo.gif | Bin 0 -> 166 bytes .../usersuss.gif | Bin 0 -> 109 bytes .../white.gif | Bin 0 -> 77 bytes ...{C5E31F70-B63C-43BB-8B03-CB04C24A3083}.jpg | Bin 0 -> 9380 bytes .../DesignByContract.zip | Bin 0 -> 8034 bytes .../Emulating Design by Contract in C++.pdf | Bin 0 -> 61453 bytes .../II.txt | 33 + .../app2.pdf | Bin 0 -> 1635 bytes .../appendices.html | 31 + .../article.aspx | 1546 ++++++++ .../article_files/1105logo_website.gif | Bin 0 -> 1577 bytes .../article_files/AE0.gif | Bin 0 -> 44 bytes .../article_files/B2100571.21 | Bin 0 -> 42 bytes .../article_files/adt_btn_go2.gif | Bin 0 -> 337 bytes .../article_files/aug01maleyfig1.gif | Bin 0 -> 5490 bytes .../article_files/aug01maleyfig2a.gif | Bin 0 -> 6652 bytes .../article_files/chunks.jsp | 3 + .../article_files/chunks_002.jsp | 3 + .../article_files/chunks_003.jsp | 3 + .../article_files/chunks_004.jsp | 3 + .../article_files/chunks_005.jsp | 3 + .../article_files/chunks_006.jsp | 3 + .../article_files/dice_utility.swf | Bin 0 -> 59549 bytes .../article_files/door.jsp | 245 ++ .../article_files/front.asp | 12 + .../article_files/func_200709182130.js | 2 + .../article_files/hero_banner_728x90.gif | Bin 0 -> 12984 bytes .../article_files/mtb_techbusiness_go_160.gif | Bin 0 -> 2898 bytes .../article_files/pageid76799364 | Bin 0 -> 43 bytes .../article_files/pageid76799364_002 | Bin 0 -> 43 bytes .../article_files/pageid76799364_003 | 40 + .../article_files/pageid97781495 | 2 + .../article_files/postx15 | 48 + .../relocate_data/Ph207_DTA_CDE_160x600.gif | Bin 0 -> 12926 bytes .../relocate_data/flashwrite_1_2.js | 30 + .../article_files/spit.jsp | 40 + .../article_files/subscribe.gif | Bin 0 -> 573 bytes .../article_files/swfobject.js | 8 + .../article_files/utils.js | 18 + .../article_files/wtid.js | 3 + .../backgrnd.pdf | Bin 0 -> 1635 bytes .../dbc.h | 33 + .../maleyappendix1.h | 182 + .../maleyappendix1.txt | 182 + .../maleyappendix1.zip | Bin 0 -> 1227 bytes .../matrix.cpp | 33 + .../tools29.ieee.pdf | Bin 0 -> 1635 bytes .../tools29.pdf | Bin 0 -> 1635 bytes .../appendixII.pdf | Bin 0 -> 23346 bytes .../Maley-old_and_Subcontracting/dbc.h | 510 +++ .../dbcmatrix.cpp | 510 +++ .../Maley-old_and_Subcontracting/europe99.doc | Bin 0 -> 239616 bytes .../Maley-old_and_Subcontracting/usa2000.pdf | Bin 0 -> 164458 bytes .../usa2000Appendices.doc | Bin 0 -> 37376 bytes .../Ottosen2004_Proposal_Rev1-n1613.pdf | Bin 0 -> 186976 bytes .../Ottosen2004_Proposal_Rev1-n1669.htm | 2153 +++++++++++ .../style.css | 9 + .../Ottosen2005_Proposal_Rev2-n1773.htm | 1222 ++++++ .../style.css | 9 + .../Ottosen2005_Proposal_Rev3-n1866.htm | 2013 ++++++++++ .../style.css | 9 + .../Ottosen2006_Presentation-n1800.pdf | Bin 0 -> 151095 bytes .../Ottosen2006_Proposal_Rev4-n1962.htm | 1769 +++++++++ .../style.css | 9 + doc/reference/README.txt | 1 + .../rosenblum_assert95.pdf | Bin 0 -> 2143804 bytes .../SCOOP/Concurrency_and_Eiffel_SCOOP.html | 203 + .../css1.css | 36 + ...urrent_CSP_Models_of_Concurrent_Eiffel.pdf | Bin 0 -> 157103 bytes ...Eiffel_Like_Seperate_Classes_for_Java.html | 386 ++ .../defaults.css | 53 + .../logintoboggan.css | 23 + .../node_002.css | 44 + .../system-menus.css | 50 + .../system.css | 544 +++ .../user_002.css | 59 + ...llel_Optimisation_in_the_SCOOP_Library.pdf | Bin 0 -> 137200 bytes ...SCOOP_Concurrent_Programming_Made_Easy.pdf | Bin 0 -> 205728 bytes doc/reference/SCOOP/Scoop_Tutorial_ETHZ.htm | 337 ++ .../Scoop_Tutorial_ETHZ_files/comment.css | 9 + .../Scoop_Tutorial_ETHZ_files/defaults.css | 30 + .../SCOOP/Scoop_Tutorial_ETHZ_files/drupal.js | 296 ++ .../SCOOP/Scoop_Tutorial_ETHZ_files/forum.css | 51 + .../Scoop_Tutorial_ETHZ_files/geshifilter.css | 15 + .../Scoop_Tutorial_ETHZ_files/google_cse.css | 21 + .../Scoop_Tutorial_ETHZ_files/google_cse.js | 32 + .../Scoop_Tutorial_ETHZ_files/img_assist.css | 15 + .../Scoop_Tutorial_ETHZ_files/img_assist.js | 40 + .../SCOOP/Scoop_Tutorial_ETHZ_files/jquery.js | 13 + .../SCOOP/Scoop_Tutorial_ETHZ_files/logo.png | Bin 0 -> 4196 bytes .../mediawiki_filter.css | 78 + .../mediawiki_filter.js | 18 + .../SCOOP/Scoop_Tutorial_ETHZ_files/node.css | 33 + .../oriact_button.png | Bin 0 -> 858 bytes .../origo_button_1.png | Bin 0 -> 1550 bytes .../Scoop_Tutorial_ETHZ_files/print(1).css | 30 + .../SCOOP/Scoop_Tutorial_ETHZ_files/print.css | 30 + .../scoop_figure_1.thumbnail.png | Bin 0 -> 2911 bytes .../scoop_figure_2.thumbnail.png | Bin 0 -> 3964 bytes .../Scoop_Tutorial_ETHZ_files/search.gif | Bin 0 -> 522 bytes .../SCOOP/Scoop_Tutorial_ETHZ_files/style.css | 615 +++ .../system-menus.css | 33 + .../Scoop_Tutorial_ETHZ_files/system.css | 408 ++ .../SCOOP/Scoop_Tutorial_ETHZ_files/user.css | 51 + .../DbC_and_Doxygen_demo.zip | Bin 0 -> 45892 bytes .../DbC_and_Doxygen_src.zip | Bin 0 -> 9913 bytes ... The Code Project - Macros and Add-ins.htm | 3009 +++++++++++++++ doc/src/BUG.doxy | 90 + doc/src/Bibliography.doxy | 75 + doc/src/Design_By_Contract.doxy | 346 ++ doc/src/Doxyfile | 1357 +++++++ doc/src/Doxyfile.str | 1357 +++++++ doc/src/Errors.doxy | 145 + doc/src/Main_Page.doxy | 81 + doc/src/Quick_Start.doxy | 324 ++ doc/src/README.txt | 1 + doc/src/Software_License.doxy | 9 + doc/src/TODO.doxy | 387 ++ doc/src/Writing_Contracts.doxy | 281 ++ doc/src/dbc.hpp | 93 + doc/src/dbc/assertion.hpp | 436 +++ doc/src/dbc/body.hpp | 192 + doc/src/dbc/config.hpp | 129 + doc/src/dbc/exception.hpp | 96 + doc/src/dbc/fun.hpp | 462 +++ doc/src/dbc/invariant.hpp | 152 + doc/src/dbc/mfun.hpp | 469 +++ doc/src/dbc/mparam.hpp | 108 + doc/src/dbc/object.hpp | 140 + doc/src/dbc/post.hpp | 189 + doc/src/svnignore | 5 + example/CPP_Prog_Lang/README.txt | 1 + example/CPP_Prog_Lang/String/String.hpp | 106 + example/CPP_Prog_Lang/String/main.cpp | 21 + example/CPP_Std_Proposal/README.txt | 1 + example/CPP_Std_Proposal/shape/main.cpp | 15 + example/CPP_Std_Proposal/shape/shapes.hpp | 49 + example/CPP_Std_Proposal/vector/main.cpp | 44 + example/CPP_Std_Proposal/vector/vector.hpp | 572 +++ example/DBC_by_Example/Counter/Counter.hpp | 60 + .../Counter/DecrementButton.hpp | 109 + example/DBC_by_Example/Counter/PushButton.hpp | 34 + .../DBC_by_Example/Counter/ViewOfCounter.hpp | 48 + example/DBC_by_Example/Counter/main.cpp | 43 + example/DBC_by_Example/Courier/couriers.cpp | 24 + example/DBC_by_Example/Courier/couriers.hpp | 144 + example/DBC_by_Example/Courier/main.cpp | 36 + .../CustomerManager/CustomerManager.cpp | 25 + .../CustomerManager/CustomerManager.hpp | 122 + .../DBC_by_Example/CustomerManager/main.cpp | 35 + .../DBC_by_Example/Dictionary/Dictionary.hpp | 104 + example/DBC_by_Example/Dictionary/main.cpp | 35 + example/DBC_by_Example/NameList/main.cpp | 32 + example/DBC_by_Example/NameList/names.cpp | 28 + example/DBC_by_Example/NameList/names.hpp | 107 + example/DBC_by_Example/Observer/Observer.hpp | 55 + example/DBC_by_Example/Observer/Subject.hpp | 122 + example/DBC_by_Example/Observer/main.cpp | 83 + example/DBC_by_Example/README.txt | 1 + .../SimpleQueue/SimpleQueue.hpp | 167 + example/DBC_by_Example/SimpleQueue/main.cpp | 46 + example/DBC_by_Example/Stack/Stack.hpp | 113 + example/DBC_by_Example/Stack/main.cpp | 38 + example/Java_Conc_in_Practice/README.txt | 2 + example/Java_Conc_in_Practice/Sequence.cpp | 43 + example/OO_SW_Construction/Gcd/main.cpp | 44 + .../Philosophers/Philosophers.cpp | 137 + example/OO_SW_Construction/README.txt | 2 + example/OO_SW_Construction/Stack3/Stack3.hpp | 194 + example/OO_SW_Construction/Stack3/main.cpp | 41 + example/OO_SW_Construction/Stack4/Stack4.hpp | 165 + example/OO_SW_Construction/Stack4/main.cpp | 41 + example/README.txt | 1 + example/str/README.txt | 1 + example/str/str-codeapi.cpp | 212 + example/str/str.cpp | 132 + include/README.txt | 1 + include/dbc.hpp | 30 + include/dbc/README.txt | 9 + include/dbc/assertion.hpp | 263 ++ include/dbc/body.hpp | 45 + include/dbc/config.hpp | 145 + include/dbc/detail/checking.hpp | 24 + include/dbc/detail/fun_macro_traits.hpp | 167 + include/dbc/detail/logging.hpp | 52 + include/dbc/detail/none.hpp | 19 + include/dbc/detail/pp/defines.hpp | 81 + include/dbc/detail/pp/fun.hpp | 138 + include/dbc/detail/pp/fun_parse/access.hpp | 51 + include/dbc/detail/pp/fun_parse/args.hpp | 205 + include/dbc/detail/pp/fun_parse/base_type.hpp | 49 + .../dbc/detail/pp/fun_parse/class_type.hpp | 31 + include/dbc/detail/pp/fun_parse/const.hpp | 17 + include/dbc/detail/pp/fun_parse/name.hpp | 16 + .../dbc/detail/pp/fun_parse/result_type.hpp | 16 + .../pp/fun_parse/util/append_traits.hpp | 25 + .../dbc/detail/pp/fun_parse/util/apply.hpp | 31 + .../dbc/detail/pp/fun_parse/util/copyable.hpp | 32 + .../detail/pp/fun_parse/util/match_not.hpp | 36 + .../dbc/detail/pp/fun_parse/util/optional.hpp | 41 + .../dbc/detail/pp/fun_parse/util/required.hpp | 61 + .../dbc/detail/pp/fun_parse/util/returns.hpp | 35 + .../dbc/detail/pp/fun_parse/util/validate.hpp | 37 + include/dbc/detail/pp/fun_parse/virtual.hpp | 17 + include/dbc/detail/pp/fun_traits.hpp | 114 + include/dbc/detail/pp/keywords.hpp | 69 + include/dbc/detail/pp/mparam.hpp | 19 + include/dbc/detail/pp/seq.hpp | 20 + include/dbc/detail/separating/functor.hpp | 168 + include/dbc/detail/separating/type_traits.hpp | 61 + include/dbc/detail/separating/variator.hpp | 135 + include/dbc/detail/threading/sync.hpp | 31 + include/dbc/detail/type_traits.hpp | 36 + include/dbc/exception.hpp | 117 + include/dbc/fun.hpp | 810 ++++ include/dbc/invariant.hpp | 56 + include/dbc/loop.hpp | 95 + include/dbc/mfun.hpp | 145 + include/dbc/mparam.hpp | 60 + include/dbc/object.hpp | 66 + include/dbc/post.hpp | 162 + include/dbc/process.hpp | 38 + include/dbc/separate.hpp | 385 ++ .../dbc/separators/boost_thread_separator.hpp | 106 + test/Access/access.cpp | 83 + test/Checking/checking.cpp | 21 + test/Checking/number.hpp | 61 + test/Const/body-err_assign_var.cpp | 20 + test/Const/body-err_call_nonconst_fun.cpp | 19 + test/Const/body-main.cpp | 17 + test/Const/body-ok.cpp | 19 + test/Const/body.hpp | 41 + test/Const/inv-err_assign_self_var.cpp | 59 + test/Const/inv-err_call_self_nonconst_fun.cpp | 59 + test/Const/postcond-err_assign_arg_now.cpp | 59 + test/Const/postcond-err_assign_arg_old.cpp | 59 + .../postcond-err_assign_self_now_var.cpp | 58 + .../postcond-err_assign_self_old_var.cpp | 58 + ...ostcond-err_call_self_now_nonconst_fun.cpp | 58 + ...ostcond-err_call_self_old_nonconst_fun.cpp | 58 + test/Const/precond-err_assign_arg.cpp | 59 + test/Const/precond-err_assign_self_var.cpp | 58 + .../precond-err_call_self_nonconst_fun.cpp | 58 + test/Const/precond_postcond_inv-ok.cpp | 57 + .../construction-err_precond_access_self.cpp | 45 + test/Construction/construction.cpp | 88 + test/Construction/throwing_constructor.cpp | 24 + .../throwing_constructor_init.cpp | 24 + test/Construction/throwing_destructor.cpp | 20 + test/Construction/throwing_mem_fun.cpp | 24 + test/Construction/throwing_number.hpp | 100 + test/Copyable/copyable.cpp | 88 + test/Copyable/copyable_ptr.cpp | 100 + test/Doc/doc.cpp | 77 + test/Operators/operators.cpp | 70 + test/README.txt | 1 + test/Separate/accessors.cpp | 194 + test/Separate/separated_access.cpp | 111 + test/Static/static.cpp | 56 + test/Subcontracting/base_class.cpp | 17 + test/Subcontracting/base_class.hpp | 53 + test/Subcontracting/base_template.cpp | 17 + test/Subcontracting/base_template.hpp | 58 + .../class_subcontracts_class.cpp | 17 + .../class_subcontracts_class.hpp | 51 + .../class_subcontracts_template.cpp | 17 + .../class_subcontracts_template.hpp | 62 + test/Subcontracting/deep_subcontracting.cpp | 111 + .../template_subcontracts_class.cpp | 17 + .../template_subcontracts_class.hpp | 52 + .../template_subcontracts_template.cpp | 17 + .../template_subcontracts_template.hpp | 56 + 464 files changed, 59231 insertions(+) create mode 100755 COPYRIGHT.txt create mode 100755 LICENSE_1_0.txt create mode 100755 Makefile create mode 100755 README.txt create mode 100755 bin/README.txt create mode 100755 bin/cxx-duplicate_friend_warning_filter.pl create mode 100755 bin/cxx-ignore_duplicate_friend_warning create mode 100755 bin/env-MSVC8.sh create mode 100755 bin/install create mode 100755 bin/must-fail create mode 100755 bin/release create mode 100755 bin/release.dat create mode 100755 bin/upload-website create mode 100755 build/Makefile.example create mode 100755 build/Makefile.test create mode 100755 build/REAME.txt create mode 100755 build/svnignore create mode 100755 codedoc/Doxyfile.example create mode 100755 codedoc/Doxyfile.test create mode 100755 codedoc/REAME.txt create mode 100755 codedoc/svnignore create mode 100755 doc/README.txt create mode 100755 doc/howto/HOWTO_Create_New_Sourceforge_Release.txt create mode 100755 doc/howto/HOWTO_Upload_Sourceforge_Website_HTML.txt create mode 100755 doc/howto/README.txt create mode 100755 doc/html/Bibliography.html create mode 100755 doc/html/Design_By_Contract.html create mode 100755 doc/html/Errors.html create mode 100755 doc/html/Quick_Start.html create mode 100755 doc/html/README.txt create mode 100755 doc/html/Software_License.html create mode 100755 doc/html/Writing_Contracts.html create mode 100755 doc/html/annotated.html create mode 100755 doc/html/assertion_8hpp.html create mode 100755 doc/html/body_8hpp.html create mode 100755 doc/html/bug.html create mode 100755 doc/html/classdbc_1_1assertion-members.html create mode 100755 doc/html/classdbc_1_1assertion.html create mode 100755 doc/html/classdbc_1_1assertion.png create mode 100755 doc/html/classdbc_1_1condition__violation-members.html create mode 100755 doc/html/classdbc_1_1condition__violation.html create mode 100755 doc/html/classdbc_1_1condition__violation.png create mode 100755 doc/html/classdbc_1_1copyable.html create mode 100755 doc/html/classdbc_1_1exit-members.html create mode 100755 doc/html/classdbc_1_1exit.html create mode 100755 doc/html/classdbc_1_1fun-members.html create mode 100755 doc/html/classdbc_1_1fun.html create mode 100755 doc/html/classdbc_1_1fun_1_1constr-members.html create mode 100755 doc/html/classdbc_1_1fun_1_1constr.html create mode 100755 doc/html/classdbc_1_1fun_1_1destr-members.html create mode 100755 doc/html/classdbc_1_1fun_1_1destr.html create mode 100755 doc/html/classdbc_1_1fun_1_1mem-members.html create mode 100755 doc/html/classdbc_1_1fun_1_1mem.html create mode 100755 doc/html/classdbc_1_1invariat__violation-members.html create mode 100755 doc/html/classdbc_1_1invariat__violation.html create mode 100755 doc/html/classdbc_1_1oassertionstream-members.html create mode 100755 doc/html/classdbc_1_1oassertionstream.html create mode 100755 doc/html/classdbc_1_1oassertionstream.png create mode 100755 doc/html/classdbc_1_1object.html create mode 100755 doc/html/classdbc_1_1post-members.html create mode 100755 doc/html/classdbc_1_1post.html create mode 100755 doc/html/classdbc_1_1post_3_01T_01_5_01_4-members.html create mode 100755 doc/html/classdbc_1_1post_3_01T_01_5_01_4.html create mode 100755 doc/html/classdbc_1_1post_3_01copyable_3_01T_01_4_01_4-members.html create mode 100755 doc/html/classdbc_1_1post_3_01copyable_3_01T_01_4_01_4.html create mode 100755 doc/html/classdbc_1_1post_3_01copyable_3_01T_01_5_01_4_01_4-members.html create mode 100755 doc/html/classdbc_1_1post_3_01copyable_3_01T_01_5_01_4_01_4.html create mode 100755 doc/html/classdbc_1_1postcondition__violation-members.html create mode 100755 doc/html/classdbc_1_1postcondition__violation.html create mode 100755 doc/html/classdbc_1_1postcondition__violation.png create mode 100755 doc/html/classdbc_1_1precondition__violation-members.html create mode 100755 doc/html/classdbc_1_1precondition__violation.html create mode 100755 doc/html/classdbc_1_1precondition__violation.png create mode 100755 doc/html/classdbc_1_1raise.html create mode 100755 doc/html/classdbc_1_1terminate.html create mode 100755 doc/html/classdbc_1_1uraise-members.html create mode 100755 doc/html/classdbc_1_1uraise.html create mode 100755 doc/html/config_8hpp.html create mode 100755 doc/html/dbc_8hpp.html create mode 100755 doc/html/doxygen.css create mode 100755 doc/html/doxygen.png create mode 100755 doc/html/exception_8hpp.html create mode 100755 doc/html/files.html create mode 100755 doc/html/fun_8hpp.html create mode 100755 doc/html/functions.html create mode 100755 doc/html/functions_func.html create mode 100755 doc/html/functions_type.html create mode 100755 doc/html/functions_vars.html create mode 100755 doc/html/globals.html create mode 100755 doc/html/globals_defs.html create mode 100755 doc/html/hierarchy.html create mode 100755 doc/html/index.html create mode 100755 doc/html/invariant_8hpp.html create mode 100755 doc/html/mfun_8hpp.html create mode 100755 doc/html/mparam_8hpp.html create mode 100755 doc/html/namespacedbc.html create mode 100755 doc/html/namespacemembers.html create mode 100755 doc/html/namespacemembers_func.html create mode 100755 doc/html/namespacemembers_type.html create mode 100755 doc/html/namespaces.html create mode 100755 doc/html/object_8hpp.html create mode 100755 doc/html/pages.html create mode 100755 doc/html/post_8hpp.html create mode 100755 doc/html/str/annotated.html create mode 100755 doc/html/str/classstr-members.html create mode 100755 doc/html/str/classstr.html create mode 100755 doc/html/str/doxygen.css create mode 100755 doc/html/str/doxygen.png create mode 100755 doc/html/str/files.html create mode 100755 doc/html/str/functions.html create mode 100755 doc/html/str/functions_func.html create mode 100755 doc/html/str/functions_vars.html create mode 100755 doc/html/str/globals.html create mode 100755 doc/html/str/globals_func.html create mode 100755 doc/html/str/index.html create mode 100755 doc/html/str/str_8cpp.html create mode 100755 doc/html/str/tab_b.gif create mode 100755 doc/html/str/tab_l.gif create mode 100755 doc/html/str/tab_r.gif create mode 100755 doc/html/str/tabs.css create mode 100755 doc/html/tab_b.gif create mode 100755 doc/html/tab_l.gif create mode 100755 doc/html/tab_r.gif create mode 100755 doc/html/tabs.css create mode 100755 doc/html/todo.html create mode 100755 doc/reference/A++/A++-C++AtWork.pdf create mode 100755 doc/reference/C#/article2.pdf create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum.htm create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/1.html create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/2.html create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/abg-en-100c-000000.png create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(1).htm create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(2).htm create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(3).htm create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(4).htm create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads.htm create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/brand create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/expansion_embed.js create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/graphics.js create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/icon1.gif create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/mode_hybrid.gif create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/mode_linear.gif create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/mode_threaded.gif create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/mombu_naranja3.png create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/navbits_start.gif create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/printer.gif create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/quote.gif create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/reply.gif create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/sendtofriend.gif create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/show_ads.js create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/sma8.js create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/style-30ca319c-00011.css create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/test_domain.js create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/threadheader.htm create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/urchin.js create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/vbulletin_global.js create mode 100755 doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/vbulletin_md5.js create mode 100755 doc/reference/DBC_and_Unit_Testing/madsen.pdf create mode 100755 doc/reference/DBC_and_Unit_Testing/valle00combining.pdf create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC.htm create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/codeproject225x90.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/cpmenu_var.js create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/forum_faq.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/forum_newmsg.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/forum_search.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/front.asp create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/global.css create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/ind.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/link.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/mail.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/mail_small.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/menu10_com.js create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_answer.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_blank.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_game.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_general.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_info.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_question.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_sticky.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/oncopy.js create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/print.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/prize_winner_sm.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/red.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/sitebuild_icon.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/smiley_doh.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/smiley_redface.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/smiley_smile.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/space.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/staff_sm.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/t.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/togglePre.js create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/urchin.js create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/userinfo.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/usersuss.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/white.gif create mode 100755 doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/{C5E31F70-B63C-43BB-8B03-CB04C24A3083}.jpg create mode 100755 doc/reference/Lindrud-Lambda_for_POST/DesignByContract.zip create mode 100755 doc/reference/Maley-old_and_Subcontracting/Emulating Design by Contract in C++.pdf create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/II.txt create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/app2.pdf create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/appendices.html create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article.aspx create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/1105logo_website.gif create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/AE0.gif create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/B2100571.21 create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/adt_btn_go2.gif create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/aug01maleyfig1.gif create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/aug01maleyfig2a.gif create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/chunks.jsp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/chunks_002.jsp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/chunks_003.jsp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/chunks_004.jsp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/chunks_005.jsp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/chunks_006.jsp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/dice_utility.swf create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/door.jsp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/front.asp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/func_200709182130.js create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/hero_banner_728x90.gif create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/mtb_techbusiness_go_160.gif create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/pageid76799364 create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/pageid76799364_002 create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/pageid76799364_003 create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/pageid97781495 create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/postx15 create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/relocate_data/Ph207_DTA_CDE_160x600.gif create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/relocate_data/flashwrite_1_2.js create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/spit.jsp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/subscribe.gif create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/swfobject.js create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/utils.js create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/wtid.js create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/backgrnd.pdf create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/dbc.h create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/maleyappendix1.h create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/maleyappendix1.txt create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/maleyappendix1.zip create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/matrix.cpp create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/tools29.ieee.pdf create mode 100755 doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/tools29.pdf create mode 100755 doc/reference/Maley-old_and_Subcontracting/appendixII.pdf create mode 100755 doc/reference/Maley-old_and_Subcontracting/dbc.h create mode 100755 doc/reference/Maley-old_and_Subcontracting/dbcmatrix.cpp create mode 100755 doc/reference/Maley-old_and_Subcontracting/europe99.doc create mode 100755 doc/reference/Maley-old_and_Subcontracting/usa2000.pdf create mode 100755 doc/reference/Maley-old_and_Subcontracting/usa2000Appendices.doc create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2004_Proposal_Rev1-n1613.pdf create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2004_Proposal_Rev1-n1669.htm create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2004_Proposal_Rev1-n1669_files/style.css create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2005_Proposal_Rev2-n1773.htm create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2005_Proposal_Rev2-n1773_files/style.css create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2005_Proposal_Rev3-n1866.htm create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2005_Proposal_Rev3-n1866_files/style.css create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2006_Presentation-n1800.pdf create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2006_Proposal_Rev4-n1962.htm create mode 100755 doc/reference/Ottosen-C++_Std_Proposal/Ottosen2006_Proposal_Rev4-n1962_files/style.css create mode 100755 doc/reference/README.txt create mode 100755 doc/reference/Rosenblum-External_Preprocessor/rosenblum_assert95.pdf create mode 100755 doc/reference/SCOOP/Concurrency_and_Eiffel_SCOOP.html create mode 100755 doc/reference/SCOOP/Concurrency_and_Eiffel_SCOOP_files/css1.css create mode 100755 doc/reference/SCOOP/Current_CSP_Models_of_Concurrent_Eiffel.pdf create mode 100755 doc/reference/SCOOP/Eiffel_Like_Seperate_Classes_for_Java.html create mode 100755 doc/reference/SCOOP/Eiffel_Like_Seperate_Classes_for_Java_files/defaults.css create mode 100755 doc/reference/SCOOP/Eiffel_Like_Seperate_Classes_for_Java_files/logintoboggan.css create mode 100755 doc/reference/SCOOP/Eiffel_Like_Seperate_Classes_for_Java_files/node_002.css create mode 100755 doc/reference/SCOOP/Eiffel_Like_Seperate_Classes_for_Java_files/system-menus.css create mode 100755 doc/reference/SCOOP/Eiffel_Like_Seperate_Classes_for_Java_files/system.css create mode 100755 doc/reference/SCOOP/Eiffel_Like_Seperate_Classes_for_Java_files/user_002.css create mode 100755 doc/reference/SCOOP/Parallel_Optimisation_in_the_SCOOP_Library.pdf create mode 100755 doc/reference/SCOOP/SCOOP_Concurrent_Programming_Made_Easy.pdf create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ.htm create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/comment.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/defaults.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/drupal.js create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/forum.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/geshifilter.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/google_cse.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/google_cse.js create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/img_assist.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/img_assist.js create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/jquery.js create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/logo.png create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/mediawiki_filter.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/mediawiki_filter.js create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/node.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/oriact_button.png create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/origo_button_1.png create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/print(1).css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/print.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/scoop_figure_1.thumbnail.png create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/scoop_figure_2.thumbnail.png create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/search.gif create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/style.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/system-menus.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/system.css create mode 100755 doc/reference/SCOOP/Scoop_Tutorial_ETHZ_files/user.css create mode 100755 doc/reference/Tandin-Macros_for_Doxygen/DbC_and_Doxygen_demo.zip create mode 100755 doc/reference/Tandin-Macros_for_Doxygen/DbC_and_Doxygen_src.zip create mode 100755 doc/reference/Tandin-Macros_for_Doxygen/Design by Contract macros for C++ and link to Doxygen - The Code Project - Macros and Add-ins.htm create mode 100755 doc/src/BUG.doxy create mode 100755 doc/src/Bibliography.doxy create mode 100755 doc/src/Design_By_Contract.doxy create mode 100755 doc/src/Doxyfile create mode 100755 doc/src/Doxyfile.str create mode 100755 doc/src/Errors.doxy create mode 100755 doc/src/Main_Page.doxy create mode 100755 doc/src/Quick_Start.doxy create mode 100755 doc/src/README.txt create mode 100755 doc/src/Software_License.doxy create mode 100755 doc/src/TODO.doxy create mode 100755 doc/src/Writing_Contracts.doxy create mode 100755 doc/src/dbc.hpp create mode 100755 doc/src/dbc/assertion.hpp create mode 100755 doc/src/dbc/body.hpp create mode 100755 doc/src/dbc/config.hpp create mode 100755 doc/src/dbc/exception.hpp create mode 100755 doc/src/dbc/fun.hpp create mode 100755 doc/src/dbc/invariant.hpp create mode 100755 doc/src/dbc/mfun.hpp create mode 100755 doc/src/dbc/mparam.hpp create mode 100755 doc/src/dbc/object.hpp create mode 100755 doc/src/dbc/post.hpp create mode 100755 doc/src/svnignore create mode 100755 example/CPP_Prog_Lang/README.txt create mode 100755 example/CPP_Prog_Lang/String/String.hpp create mode 100755 example/CPP_Prog_Lang/String/main.cpp create mode 100755 example/CPP_Std_Proposal/README.txt create mode 100755 example/CPP_Std_Proposal/shape/main.cpp create mode 100755 example/CPP_Std_Proposal/shape/shapes.hpp create mode 100755 example/CPP_Std_Proposal/vector/main.cpp create mode 100755 example/CPP_Std_Proposal/vector/vector.hpp create mode 100755 example/DBC_by_Example/Counter/Counter.hpp create mode 100755 example/DBC_by_Example/Counter/DecrementButton.hpp create mode 100755 example/DBC_by_Example/Counter/PushButton.hpp create mode 100755 example/DBC_by_Example/Counter/ViewOfCounter.hpp create mode 100755 example/DBC_by_Example/Counter/main.cpp create mode 100755 example/DBC_by_Example/Courier/couriers.cpp create mode 100755 example/DBC_by_Example/Courier/couriers.hpp create mode 100755 example/DBC_by_Example/Courier/main.cpp create mode 100755 example/DBC_by_Example/CustomerManager/CustomerManager.cpp create mode 100755 example/DBC_by_Example/CustomerManager/CustomerManager.hpp create mode 100755 example/DBC_by_Example/CustomerManager/main.cpp create mode 100755 example/DBC_by_Example/Dictionary/Dictionary.hpp create mode 100755 example/DBC_by_Example/Dictionary/main.cpp create mode 100755 example/DBC_by_Example/NameList/main.cpp create mode 100755 example/DBC_by_Example/NameList/names.cpp create mode 100755 example/DBC_by_Example/NameList/names.hpp create mode 100755 example/DBC_by_Example/Observer/Observer.hpp create mode 100755 example/DBC_by_Example/Observer/Subject.hpp create mode 100755 example/DBC_by_Example/Observer/main.cpp create mode 100755 example/DBC_by_Example/README.txt create mode 100755 example/DBC_by_Example/SimpleQueue/SimpleQueue.hpp create mode 100755 example/DBC_by_Example/SimpleQueue/main.cpp create mode 100755 example/DBC_by_Example/Stack/Stack.hpp create mode 100755 example/DBC_by_Example/Stack/main.cpp create mode 100755 example/Java_Conc_in_Practice/README.txt create mode 100755 example/Java_Conc_in_Practice/Sequence.cpp create mode 100755 example/OO_SW_Construction/Gcd/main.cpp create mode 100755 example/OO_SW_Construction/Philosophers/Philosophers.cpp create mode 100755 example/OO_SW_Construction/README.txt create mode 100755 example/OO_SW_Construction/Stack3/Stack3.hpp create mode 100755 example/OO_SW_Construction/Stack3/main.cpp create mode 100755 example/OO_SW_Construction/Stack4/Stack4.hpp create mode 100755 example/OO_SW_Construction/Stack4/main.cpp create mode 100755 example/README.txt create mode 100755 example/str/README.txt create mode 100755 example/str/str-codeapi.cpp create mode 100755 example/str/str.cpp create mode 100755 include/README.txt create mode 100755 include/dbc.hpp create mode 100755 include/dbc/README.txt create mode 100755 include/dbc/assertion.hpp create mode 100755 include/dbc/body.hpp create mode 100755 include/dbc/config.hpp create mode 100755 include/dbc/detail/checking.hpp create mode 100755 include/dbc/detail/fun_macro_traits.hpp create mode 100755 include/dbc/detail/logging.hpp create mode 100755 include/dbc/detail/none.hpp create mode 100755 include/dbc/detail/pp/defines.hpp create mode 100755 include/dbc/detail/pp/fun.hpp create mode 100755 include/dbc/detail/pp/fun_parse/access.hpp create mode 100755 include/dbc/detail/pp/fun_parse/args.hpp create mode 100755 include/dbc/detail/pp/fun_parse/base_type.hpp create mode 100755 include/dbc/detail/pp/fun_parse/class_type.hpp create mode 100755 include/dbc/detail/pp/fun_parse/const.hpp create mode 100755 include/dbc/detail/pp/fun_parse/name.hpp create mode 100755 include/dbc/detail/pp/fun_parse/result_type.hpp create mode 100755 include/dbc/detail/pp/fun_parse/util/append_traits.hpp create mode 100755 include/dbc/detail/pp/fun_parse/util/apply.hpp create mode 100755 include/dbc/detail/pp/fun_parse/util/copyable.hpp create mode 100755 include/dbc/detail/pp/fun_parse/util/match_not.hpp create mode 100755 include/dbc/detail/pp/fun_parse/util/optional.hpp create mode 100755 include/dbc/detail/pp/fun_parse/util/required.hpp create mode 100755 include/dbc/detail/pp/fun_parse/util/returns.hpp create mode 100755 include/dbc/detail/pp/fun_parse/util/validate.hpp create mode 100755 include/dbc/detail/pp/fun_parse/virtual.hpp create mode 100755 include/dbc/detail/pp/fun_traits.hpp create mode 100755 include/dbc/detail/pp/keywords.hpp create mode 100755 include/dbc/detail/pp/mparam.hpp create mode 100755 include/dbc/detail/pp/seq.hpp create mode 100755 include/dbc/detail/separating/functor.hpp create mode 100755 include/dbc/detail/separating/type_traits.hpp create mode 100755 include/dbc/detail/separating/variator.hpp create mode 100755 include/dbc/detail/threading/sync.hpp create mode 100755 include/dbc/detail/type_traits.hpp create mode 100755 include/dbc/exception.hpp create mode 100755 include/dbc/fun.hpp create mode 100755 include/dbc/invariant.hpp create mode 100755 include/dbc/loop.hpp create mode 100755 include/dbc/mfun.hpp create mode 100755 include/dbc/mparam.hpp create mode 100755 include/dbc/object.hpp create mode 100755 include/dbc/post.hpp create mode 100755 include/dbc/process.hpp create mode 100755 include/dbc/separate.hpp create mode 100755 include/dbc/separators/boost_thread_separator.hpp create mode 100755 test/Access/access.cpp create mode 100755 test/Checking/checking.cpp create mode 100755 test/Checking/number.hpp create mode 100755 test/Const/body-err_assign_var.cpp create mode 100755 test/Const/body-err_call_nonconst_fun.cpp create mode 100755 test/Const/body-main.cpp create mode 100755 test/Const/body-ok.cpp create mode 100755 test/Const/body.hpp create mode 100755 test/Const/inv-err_assign_self_var.cpp create mode 100755 test/Const/inv-err_call_self_nonconst_fun.cpp create mode 100755 test/Const/postcond-err_assign_arg_now.cpp create mode 100755 test/Const/postcond-err_assign_arg_old.cpp create mode 100755 test/Const/postcond-err_assign_self_now_var.cpp create mode 100755 test/Const/postcond-err_assign_self_old_var.cpp create mode 100755 test/Const/postcond-err_call_self_now_nonconst_fun.cpp create mode 100755 test/Const/postcond-err_call_self_old_nonconst_fun.cpp create mode 100755 test/Const/precond-err_assign_arg.cpp create mode 100755 test/Const/precond-err_assign_self_var.cpp create mode 100755 test/Const/precond-err_call_self_nonconst_fun.cpp create mode 100755 test/Const/precond_postcond_inv-ok.cpp create mode 100755 test/Construction/construction-err_precond_access_self.cpp create mode 100755 test/Construction/construction.cpp create mode 100755 test/Construction/throwing_constructor.cpp create mode 100755 test/Construction/throwing_constructor_init.cpp create mode 100755 test/Construction/throwing_destructor.cpp create mode 100755 test/Construction/throwing_mem_fun.cpp create mode 100755 test/Construction/throwing_number.hpp create mode 100755 test/Copyable/copyable.cpp create mode 100755 test/Copyable/copyable_ptr.cpp create mode 100755 test/Doc/doc.cpp create mode 100755 test/Operators/operators.cpp create mode 100755 test/README.txt create mode 100755 test/Separate/accessors.cpp create mode 100755 test/Separate/separated_access.cpp create mode 100755 test/Static/static.cpp create mode 100755 test/Subcontracting/base_class.cpp create mode 100755 test/Subcontracting/base_class.hpp create mode 100755 test/Subcontracting/base_template.cpp create mode 100755 test/Subcontracting/base_template.hpp create mode 100755 test/Subcontracting/class_subcontracts_class.cpp create mode 100755 test/Subcontracting/class_subcontracts_class.hpp create mode 100755 test/Subcontracting/class_subcontracts_template.cpp create mode 100755 test/Subcontracting/class_subcontracts_template.hpp create mode 100755 test/Subcontracting/deep_subcontracting.cpp create mode 100755 test/Subcontracting/template_subcontracts_class.cpp create mode 100755 test/Subcontracting/template_subcontracts_class.hpp create mode 100755 test/Subcontracting/template_subcontracts_template.cpp create mode 100755 test/Subcontracting/template_subcontracts_template.hpp diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt new file mode 100755 index 00000000..5f1431db --- /dev/null +++ b/COPYRIGHT.txt @@ -0,0 +1,2 @@ +Copyright (C) 2009 Lorenzo Caminiti. +Distributed under DBC++ Software License (see file LICENSE_1_0.txt). diff --git a/LICENSE_1_0.txt b/LICENSE_1_0.txt new file mode 100755 index 00000000..0542aedf --- /dev/null +++ b/LICENSE_1_0.txt @@ -0,0 +1,27 @@ +(File: LICENSE_1_0.txt) + +Design By Contract for C++ (DBC++) Software License, Version 1.0 +April 19th, 2009 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + diff --git a/Makefile b/Makefile new file mode 100755 index 00000000..4f93b938 --- /dev/null +++ b/Makefile @@ -0,0 +1,51 @@ + +all: + @echo "Design by Contract for C++ (DBC++)" + @echo + @echo "This library does not need to be built. It is composed of " + @echo "C/C++ header files only (contained int the \"include/\" directory)." + @echo + @echo "make install" + @echo " Install DBC++ files onto your system (you might need to " + @echo " be root). It will prompt you for the installation path." + @echo "make doc" + @echo " Build library documentation to \"doc/html/\"." + @echo "make [OPTION] example" + @echo " Build example programs to \"build/example/\" and their" + @echo " documentation to \"codedoc/example/\"." + @echo "make [OPTION] test" + @echo " Build test programs to \"build/test/\" and their" + @echo " documentation to \"codedoc/test/\"." + @echo + @echo "OPTION" + @echo "CXX GCC to use GNU C++ compiler 'g++' (e.g., under Linux)" + @echo " or MVVC to use Microsoft Visual C++ compiler (e.g.," + @echo " MSVC version 8 under Cygwin). CXX=GCC by default." + @echo + @echo "EXAMPLE" + @echo "make CXX=GCC example # Build all examples using g++" + @echo "make CXX=MSVC test # Build all tests using MSVC" + exit 0 + +force_: + +install: + bin/install + +example: force_ + make -f build/Makefile.example + +test: force_ + make -f build/Makefile.test + +doc: force_ + rm -f doc/html/*.* + rm -f doc/html/str/*.* + # Build str example, run it to upd str.out, create its doc. + make -f build/Makefile.example str_codeapi + make -f build/Makefile.example str + /bin/bash -c "./build/example/str &> doc/src/str.out" + doxygen doc/src/Doxyfile.str + # Create library doc (will href to str example). + cd doc/src && doxygen # From doc/src for correct path names. + diff --git a/README.txt b/README.txt new file mode 100755 index 00000000..3232d91f --- /dev/null +++ b/README.txt @@ -0,0 +1,53 @@ + +Design By Contract for C++ (DBC++) +================================== + +This library supports all Eiffel Design By Contract (DBC) features for C++. +Among others: + * Optional contract compilation/checking; + * Subcontracting; + * "old" in postconditions; + * Automatic contract documentation (with doxygen). +See http://dbcpp.sourceforge.net + +Copyright (C) 2009 Lorenzo Caminiti. +Distributed under DBC++ Software License (see file LICENSE_1_0.txt). + + +INSTALL +------- + +This library does not have to be built. It is composed only of the header files +in the "include" directory. To install this library, you simply have to add +this library header files your compiler's include path (see the documentation +for more details). + + +DOCUMENTATION +------------- + +See "doc/html/index.html" for documentation on how to install and use this +library. + +Run `make' in the main directory to see how to build examples, tests, etc. + +The library source is contained in "include/". Every directory contains a +README.txt files describing its contents. + + +RELEASE HISTORY +--------------- + +Releases from newset to oldest with number format "Major.Minor.SVN_Revision". + +Release 0.2.190 (2009-11-21) + Compiled on both GCC (Linux and Cygwin) and Microsoft Visual C++ (Windows). + Requiring to use "void" to specify empty function argument list. +Release 0.1.126 (2009-06-17) + Completed 1st documentation draft. +Release 0.1.55 (2009-04-19) + Reorganized files to cleanup root directory. + Added installation program. +Release 0.1.50 (2009-04-19) + First public release. + diff --git a/bin/README.txt b/bin/README.txt new file mode 100755 index 00000000..2de63e2a --- /dev/null +++ b/bin/README.txt @@ -0,0 +1 @@ +Binary files, programs, and scripts. diff --git a/bin/cxx-duplicate_friend_warning_filter.pl b/bin/cxx-duplicate_friend_warning_filter.pl new file mode 100755 index 00000000..58f38038 --- /dev/null +++ b/bin/cxx-duplicate_friend_warning_filter.pl @@ -0,0 +1,32 @@ +# $Id$ # + +@buffer = (); +@errors = (); + +while (<>) { + if (/^In file included from/ or /from/ or @buffer > 0) { + push(@buffer, $_); + #print "DEBUG: added $_ to buffer\n\n\n"; + if (/warning/ or /error/) { + #print "DEBUG: clearing buffer because of $_\n\n"; + if (not /already a friend/) { + print @buffer; + push(@errors, @buffer); + } + @buffer = (); + } + } else { + if (/error/ or (/warning/ and not /already a friend/ + and not /\/usr\/bin\/ld/)) { + push(@errors, $_); + } + print if not /already a friend/ and not /\/usr\/bin\/ld/; + } +} + +if(@errors > 0) { + #print "***** build did not complete, had the following errors or warnings: *****\n"; + #print @errors; + exit 1; +} + diff --git a/bin/cxx-ignore_duplicate_friend_warning b/bin/cxx-ignore_duplicate_friend_warning new file mode 100755 index 00000000..e862ac89 --- /dev/null +++ b/bin/cxx-ignore_duplicate_friend_warning @@ -0,0 +1,28 @@ +#!/bin/bash + +# $Id$ # + +# Usage: cxx-ignore_duplicate_friend_warning CXX_COMPILER [CXX_COMPILER_OPTION] +# If "-Werror" is found in compiler command's options, then output is filtered +# to error on any warning *but* the "duplicate friend" warning. +# Example: +# cxx-ignore_duplicate_friend_warning g++ -Wall -Werror ... # Error on warn. +# cxx-ignore_duplicate_friend_warning g++ -Wall ... # Does not error. + +werror=0 # If "-Werror" was specified. +cmd_without_werror="" # Compiler command with eventual "-Werror" stipped out. +for arg in ${*}; do + if [ "$arg" == "-Werror" ]; then + werror=1 + else + cmd_without_werror="$cmd_without_werror $arg" + fi +done + +if [ $werror -eq 0 ]; then + $cmd_without_werror +else + # All warnings (but duplicate friend) as errors. + $cmd_without_werror 2>&1 | perl bin/cxx-duplicate_friend_warning_filter.pl +fi + diff --git a/bin/env-MSVC8.sh b/bin/env-MSVC8.sh new file mode 100755 index 00000000..c4aaf6ba --- /dev/null +++ b/bin/env-MSVC8.sh @@ -0,0 +1,18 @@ +# source this `$ source THIS_FILE'. + +# Can be executed, for example under Cygwin, to setup enviroment to run +# Microsoft Visual C++ command line compiler `cl.exe'. + +msvc="E:\bin\Microsoft Visual Studio 8" +echo "env-MSVC8: Assuming MVSC 8 installed at \"$msvc\" -- is this correct?" + +# Setup Cygwin PATH. +export PATH="$PATH:/cygdrive/c/Program Files/Microsoft Visual Studio 8/Common7/IDE:/cygdrive/c/Program Files/Microsoft Visual Studio 8/VC/BIN:/cygdrive/c/Program Files/Microsoft Visual Studio 8/Common7/Tools:/cygdrive/c/Program Files/Microsoft Visual Studio 8/Common7/Tools/bin:/cygdrive/c/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/bin:/cygdrive/c/Program Files/Microsoft Visual Studio 8/SDK/v2.0/bin:/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v2.0.50727:/cygdrive/c/Program Files/Microsoft Visual Studio 8/VC/VCPackages:/cygdrive/c/oracle/ora81/bin:/cygdrive/c/Program Files/Oracle/jre/1.1.7/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/Program Files/TortoiseSVN/bin:/cygdrive/c/Program Files/Windows Imaging/:" + +# MSVC INCLUDE for this libray ./include, Boost 1.34.0, and MSVC 8. +export INCLUDE="./include;C:\Program Files\boost\boost_1_34_0;$msvc\VC\ATLMFC\INCLUDE;$msvc\VC\INCLUDE;$msvc\VC\PlatformSDK\include;$msvc\SDK\v2.0\include;" + +# MSVC LIB. +export LIB="$msvc\VC\ATLMFC\LIB;$msvc\VC\LIB;$msvc\VC\PlatformSDK\lib;$msvc\SDK\v2.0\lib;" + + diff --git a/bin/install b/bin/install new file mode 100755 index 00000000..194e0726 --- /dev/null +++ b/bin/install @@ -0,0 +1,23 @@ +#!/bin/bash + +echo "Design By Contract for C++ (DBC++) Library Installation" + +dest="" +echo +echo -en "Enter C/C++ header files directory [/usr/include/]: " +read dest +if [ -z $dest ]; then dest="/usr/include/"; fi + +mkdir -p $dest && cp -R include/dbc* $dest +ret=$? +echo +if [ $ret -ne 0 ]; then + echo "ERROR: Unable to copy DBC++ header files to \"$dest\"." + echo "Do you need to be root to access this directory?" +else + echo "NOTE: DBC++ header files successfully copied to \"$dest\"." + echo " Make sure this directory is in your C/C++ headers path (-I compiler option)." + echo + echo "You are ready to \`#include ' in your C++ programs!" +fi + diff --git a/bin/must-fail b/bin/must-fail new file mode 100755 index 00000000..9282fe7c --- /dev/null +++ b/bin/must-fail @@ -0,0 +1,19 @@ +#!/bin/bash + +# Execute program given at command line. +$@ + +# If program did not fail, return error code 1. +if [ $? -eq 0 ]; then + echo + echo "must-fail: error: executed program did not fail as expected" + echo + exit 1; +fi + +# Else (program failed), return OK code 0. +echo +echo "must-fail: executed program failed as expected -- returning OK" +echo +exit 0 + diff --git a/bin/release b/bin/release new file mode 100755 index 00000000..93d9e9e8 --- /dev/null +++ b/bin/release @@ -0,0 +1,66 @@ +#!/bin/bash + +dbc_dir=`pwd` +server=frs.sourceforge.net:uploads + +# SVN Commit # + +echo -en "Did you commit to SVN? (Y/n) "; read ci +if [ "$ci" != "Y" ]; then + echo -en "ERROR: You must commit before releasing\n" + exit 1; +fi + +# Release Numbers # + +old_major=`cat $dbc_dir/bin/release.dat | egrep "^Major: .*$" | sed 's/^Major: //'` +old_minor=`cat $dbc_dir/bin/release.dat | egrep "^Minor: .*$" | sed 's/^Minor: //'` +old_rev=`cat $dbc_dir/bin/release.dat | egrep "^Revision: .*$" | sed 's/^Revision: //'` + +new_rev=`svn info | egrep "^Revision: .*$" | sed 's/^Revision: //'` + +echo +echo "Release number: Major.Minor.Revision" +echo -en "New major release number [old = $old_major]: "; read new_major +if [ -z "$new_major"]; then new_major=$old_major; fi +echo -en "New minor release number [old = $old_minor]: "; read new_minor +if [ -z "$new_minor"]; then new_minor=$old_minor; fi +echo -en "New revision: $new_rev (current SVN revision)\n" + +rnum=${new_major}.${new_minor}.${new_rev} +dbcpp_rnum=dbcpp_${new_major}_${new_minor}_${new_rev} + +# Tar Ball # + +echo +echo "Exporting SVN repository..." +cd /tmp +svn export https://dbcpp.svn.sourceforge.net/svnroot/dbcpp $dbcpp_rnum +tar czf $dbcpp_rnum.tar.gz $dbcpp_rnum + +echo +echo "Secure-copy tar-ball..." +echo -en "$server user: "; read user +scp $dbcpp_rnum.tar.gz $user@$server + +# Manual Steps # + +echo """# Lateset release number Major.Minor.Revision (Revision from SVN). +Major: $new_major +Minor: $new_minor +Revision: $new_rev" > $dbc_dir/bin/release.dat + +echo -en """ +IMPORTANT: To complete the release do the following manual steps. +1. Log into 'http://sourceforge.net/projects/dbcpp/' as administrator. +2. Select 'Project Admin > Feature Settings > File Release Systm > Manage'. +3. For package name 'dbcpp', select 'Add Release' entering '$rnum' as + 'New Release Name'. +4. Enter release notes from \"./RELEASE.txt\". +5. Select \"$dbcpp_rnum.tar.gz\". +6. Select 'Project Admin > Feature Settings > File Release System > Manage > + Create / Edit Download Page' and enable the uploaded + \"$dbcpp_rnum.tar.gz\" for download. +7. Commit this sandbox to SVN (the release script made local modiciations). +""" + diff --git a/bin/release.dat b/bin/release.dat new file mode 100755 index 00000000..32971d7f --- /dev/null +++ b/bin/release.dat @@ -0,0 +1,4 @@ +# Lateset release number Major.Minor.Revision (Revision from SVN). +Major: 0 +Minor: 2 +Revision: 189 diff --git a/bin/upload-website b/bin/upload-website new file mode 100755 index 00000000..8fc55668 --- /dev/null +++ b/bin/upload-website @@ -0,0 +1,29 @@ +#!/bin/bash + +echo "Making documentation..." +echo + +make doc +if [ $? -ne 0 ]; then + echo "ERROR: Unable to build documentation" + echo " Make sure to run this script from dbcpp root directory" + exit 1 +fi + +echo +echo "Uploading documentation to website..." + +server=dbcpp@web.sourceforge.net +echo -en "$server user: " && read user + +echo -en """ +cd htdocs +put doc/html/* +cd str +put doc/html/str/* +exit +""" | sftp $user,$server + +echo +echo "Done" + diff --git a/build/Makefile.example b/build/Makefile.example new file mode 100755 index 00000000..2a5f0cf8 --- /dev/null +++ b/build/Makefile.example @@ -0,0 +1,104 @@ +# $Id$ # + +# Supported C++ compliers `make CXX=compiler ...', where compiler is: +# GCC GNU g++ (e.g., on Linux) (default) +# MSVC Microsoft Visual C++ (e.g., on Cygwin) +CXX=GCC + +bin:=./bin +ifeq ($(CXX), GCC) + cpp_nodef:=g++ -Wall -I./include + def:=-D + out:=-o +endif +ifeq ($(CXX), MSVC) + # Don't use /Wall for MSVC has very verbose warnings (even in Boost?!). + cpp_nodef:=source $(bin)/env-MSVC8.sh && cl.exe /EHsc /I./include + def:=/D + out:=/Fe +endif +cpp:=$(cpp_nodef) $(def)DBC_ALL $(def)DBC_CONFIG_LOG_LEVEL=DBC_LOG_LEVEL_ALL + +src:=./example +build:=./build/example +codedoc:=./codedoc/example + +all: Str DBC_by_Example OO_SW_Construction CPP_Prog_Lang CPP_Std_Proposal doc + +clean: + rm -rf build + +force_: + +Str: str str_codeapi +str: force_ + mkdir -p $(build) + # Always compile with DBC_ALL and DBC_LOG_LEVEL_ALL as used in doc. + $(cpp_nodef) $(def)DBC_ALL $(def)DBC_CONFIG_LOG_LEVEL=DBC_LOG_LEVEL_ALL $(src)/str/str.cpp $(out)$(build)/str +str_codeapi: force_ + mkdir -p $(build) + # Always compile with DBC_ALL and DBC_LOG_LEVEL_ALL as used in doc. + $(cpp_nodef) $(def)DBC_ALL $(def)DBC_CONFIG_LOG_LEVEL=DBC_LOG_LEVEL_ALL $(src)/str/str-codeapi.cpp $(out)$(build)/str-codeapi + +DBC_by_Example: CustomerManager Stack Dictionary SimpleQueue Courier NameList Observer Counter +CustomerManager: force_ + mkdir -p $(build) + $(cpp) $(src)/DBC_by_Example/CustomerManager/CustomerManager.cpp $(src)/DBC_by_Example/CustomerManager/main.cpp $(out)$(build)/CustomerManager +Stack: force_ + mkdir -p $(build) + $(cpp) $(src)/DBC_by_Example/Stack/main.cpp $(out)$(build)/Stack +Dictionary: force_ + mkdir -p $(build) + $(cpp) $(src)/DBC_by_Example/Dictionary/main.cpp $(out)$(build)/Dictionary +SimpleQueue: force_ + mkdir -p $(build) + $(cpp) $(src)/DBC_by_Example/SimpleQueue/main.cpp $(out)$(build)/SimpleQueue +Courier: force_ + mkdir -p $(build) + $(cpp) $(src)/DBC_by_Example/Courier/couriers.cpp $(src)/DBC_by_Example/Courier/main.cpp $(out)$(build)/Courier +NameList: force_ + mkdir -p $(build) + $(cpp) $(src)/DBC_by_Example/NameList/names.cpp $(src)/DBC_by_Example/NameList/main.cpp $(out)$(build)/NameList +Observer: force_ + mkdir -p $(build) + $(cpp) $(src)/DBC_by_Example/Observer/main.cpp $(out)$(build)/Observer +Counter: force_ + mkdir -p $(build) + $(cpp) $(src)/DBC_by_Example/Counter/main.cpp $(out)$(build)/Counter + +OO_SW_Construction: Stack4 Stack3 Gcd +Stack4: force_ + mkdir -p $(build) + $(cpp) $(src)/OO_SW_Construction/Stack4/main.cpp $(out)$(build)/Stack4 +Stack3: force_ + mkdir -p $(build) + $(cpp) $(src)/OO_SW_Construction/Stack3/main.cpp $(out)$(build)/Stack3 +Gcd: force_ + mkdir -p $(build) + $(cpp) $(src)/OO_SW_Construction/Gcd/main.cpp $(out)$(build)/Gcd +Philosophers: force_ + mkdir -p $(build) + $(cpp) $(src)/OO_SW_Construction/Philosophers/Philosophers.cpp $(out)$(build)/Philosophers + +CPP_Prog_Lang: String +String: force_ + mkdir -p $(build) + $(cpp) $(src)/CPP_Prog_Lang/String/main.cpp $(out)$(build)/String + +Java_Conc_in_Practice: Sequence +Sequence: force_ + mkdir -p $(build) + $(cpp) $(src)/Java_Conc_in_Practice/Sequence.cpp $(out)$(build)/Sequence + +CPP_Std_Proposal: vector +vector: force_ + mkdir -p $(build) + $(cpp) $(src)/CPP_Std_Proposal/vector/main.cpp $(out)$(build)/vector +shape: force_ + mkdir -p $(build) + $(cpp) $(src)/CPP_Std_Proposal/shape/main.cpp $(out)$(build)/shape + +doc: force_ + mkdir -p $(codedoc) + doxygen codedoc/Doxyfile.example + diff --git a/build/Makefile.test b/build/Makefile.test new file mode 100755 index 00000000..3d429d3c --- /dev/null +++ b/build/Makefile.test @@ -0,0 +1,158 @@ +# $Id$ # + +# Supported C++ compilers `make CXX=compiler', where compiler is: +# GCC GNU g++ (e.g., on Linux) (default) +# MSVC Microsoft Visual C++ (e.g., on Cygwin) +CXX=GCC + +bin:=./bin +ifeq ($(CXX), GCC) + cpp_nodef:=g++ -Wall -I./include + cpp_nodef_mustfail:=$(bin)/must-fail g++ -Wall -I./include + def:=-D + out:=-o +endif +ifeq ($(CXX), MSVC) + # Don't use /Wall for MSVC has very verbose warnings (even in Boost?!). + cpp_nodef:=source $(bin)/env-MSVC8.sh && cl.exe /EHsc /I./include + cpp_nodef_mustfail:=source $(bin)/env-MSVC8.sh && $(bin)/must-fail cl.exe /EHsc /I./include + def:=/D + out:=/Fe +endif +cpp:=$(cpp_nodef) $(def)DBC_ALL $(def)DBC_CONFIG_LOG_LEVEL=DBC_LOG_LEVEL_ALL +cpp_mustfail:=$(cpp_nodef_mustfail) $(def)DBC_ALL $(def)DBC_CONFIG_LOG_LEVEL=DBC_LOG_LEVEL_ALL + +src:=./test +build:=./build/test +codedoc:=./codedoc/test + +all: Access Const Construction Subcontracting Operators Checking Copyable doc + +clean: + rm -rf $(build) + +force_: + +Access: force_ + mkdir -p $(build) + $(cpp) $(src)/Access/access.cpp $(out)$(build)/access + +Const: const_body const_precond_postcond_inv_ok const_precond_err const_postcond_err const_inv_err +const_body: force_ + mkdir -p $(build) + $(cpp) $(src)/Const/body-ok.cpp $(src)/Const/body-main.cpp $(out)$(build)/body-ok + $(cpp_mustfail) $(src)/Const/body-err_assign_var.cpp $(src)/Const/body-main.cpp $(out)$(build)/body-err_assign_var + $(cpp_mustfail) $(src)/Const/body-err_call_nonconst_fun.cpp $(src)/Const/body-main.cpp $(out)$(build)/body-err_call_nonconst_fun +const_precond_postcond_inv_ok: force_ + mkdir -p $(build) + $(cpp) $(src)/Const/precond_postcond_inv-ok.cpp $(out)$(build)/precond_postcond_inv-ok +const_precond_err: force_ + mkdir -p $(build) + $(cpp_mustfail) $(src)/Const/precond-err_assign_self_var.cpp $(out)$(build)/precond-err_assign_sef_var + $(cpp_mustfail) $(src)/Const/precond-err_call_self_nonconst_fun.cpp $(out)$(build)/precond-err_call_self_nonconst_fun + $(cpp_mustfail) $(src)/Const/precond-err_assign_arg.cpp $(out)$(build)/precond-err_assign_arg +const_postcond_err: force_ + mkdir -p $(build) + $(cpp_mustfail) $(src)/Const/postcond-err_assign_self_now_var.cpp $(out)$(build)/postcond-err_assign_sef_now_var + $(cpp_mustfail) $(src)/Const/postcond-err_assign_self_old_var.cpp $(out)$(build)/postcond-err_assign_sef_old_var + $(cpp_mustfail) $(src)/Const/postcond-err_call_self_now_nonconst_fun.cpp $(out)$(build)/postcond-err_call_self_now_nonconst_fun + $(cpp_mustfail) $(src)/Const/postcond-err_call_self_old_nonconst_fun.cpp $(out)$(build)/postcond-err_call_self_old_nonconst_fun + $(cpp_mustfail) $(src)/Const/postcond-err_assign_arg_now.cpp $(out)$(build)/postcond-err_assign_arg_now + $(cpp_mustfail) $(src)/Const/postcond-err_assign_arg_old.cpp $(out)$(build)/postcond-err_assign_arg_old +const_inv_err: force_ + mkdir -p $(build) + $(cpp_mustfail) $(src)/Const/inv-err_assign_self_var.cpp $(out)$(build)/inv-err_assign_sef_var + $(cpp_mustfail) $(src)/Const/inv-err_call_self_nonconst_fun.cpp $(out)$(build)/inv-err_call_self_nonconst_fun + +Construction: construction_ok construction_precond_err throwing_constructor throwing_constructor_init throwing_destructor throwing_mem_fun +construction_ok: force_ + mkdir -p $(build) + $(cpp) $(src)/Construction/construction.cpp $(out)$(build)/construction +construction_precond_err: force_ + mkdir -p $(build) + $(cpp_mustfail) $(src)/Construction/construction-err_precond_access_self.cpp $(out)$(build)/construction-err +throwing_constructor: force_ + mkdir -p $(build) + $(cpp) $(src)/Construction/throwing_constructor.cpp $(out)$(build)/throwing_constructor +throwing_constructor_init: force_ + mkdir -p $(build) + $(cpp) $(src)/Construction/throwing_constructor_init.cpp $(out)$(build)/throwing_constructor_init +throwing_destructor: force_ + mkdir -p $(build) + $(cpp) $(src)/Construction/throwing_destructor.cpp $(out)$(build)/throwing_destructor +throwing_mem_fun: force_ + mkdir -p $(build) + $(cpp) $(src)/Construction/throwing_mem_fun.cpp $(out)$(build)/throwing_mem_fun + +Subcontracting: base_class base_template class_subcontracts_template template_subcontracts_template deep_subcontracting +base_class: force_ + mkdir -p $(build) + $(cpp) $(src)/Subcontracting/base_class.cpp $(out)$(build)/base_class +class_subcontracts_class: force_ + mkdir -p $(build) + $(cpp) $(src)/Subcontracting/class_subcontracts_class.cpp $(out)$(build)/class_subcontracts_class +template_subcontracts_class: force_ + mkdir -p $(build) + $(cpp) $(src)/Subcontracting/template_subcontracts_class.cpp $(out)$(build)/template_subcontracts_class +base_template: force_ + mkdir -p $(build) + $(cpp) $(src)/Subcontracting/base_template.cpp $(out)$(build)/base_template +class_subcontracts_template: force_ + mkdir -p $(build) + $(cpp) $(src)/Subcontracting/class_subcontracts_template.cpp $(out)$(build)/class_subcontracts_template +template_subcontracts_template: force_ + mkdir -p $(build) + $(cpp) $(src)/Subcontracting/template_subcontracts_template.cpp $(out)$(build)/template_subcontracts_template +deep_subcontracting: force_ + mkdir -p $(build) + $(cpp) $(src)/Subcontracting/deep_subcontracting.cpp $(out)$(build)/deep_subcontracting + +Operators: force_ + mkdir -p $(build) + $(cpp) $(src)/Operators/operators.cpp $(out)$(build)/operators + +Checking: force_ + mkdir -p $(build) + # Compile this test with different DBC_CHECKING... levels. + # Verbose log DBC_CONFIG_LOG_LEVEL set by program code itself. + $(cpp_nodef) $(def)DBC_NO $(src)/Checking/checking.cpp $(out)$(build)/checking-no + $(cpp_nodef) $(def)DBC_ALL $(src)/Checking/checking.cpp $(out)$(build)/checking-all + # Only one at the time + $(cpp_nodef) $(def)DBC_CHECK_REQUIRE $(src)/Checking/checking.cpp $(out)$(build)/checking-require_only + $(cpp_nodef) $(def)DBC_CHECK_ENSURE $(src)/Checking/checking.cpp $(out)$(build)/checking-ensure_only + $(cpp_nodef) $(def)DBC_CHECK_INVARIANT $(src)/Checking/checking.cpp $(out)$(build)/checking-invariant_only + # Eiffel like combinations. + $(cpp_nodef) $(def)DBC_CHECK_REQUIRE $(src)/Checking/checking.cpp $(out)$(build)/checking-require + $(cpp_nodef) $(def)DBC_CHECK_REQUIRE $(def)DBC_CHECK_ENSURE $(src)/Checking/checking.cpp $(out)$(build)/checking-require_and_ensure + $(cpp_nodef) $(def)DBC_CHECK_REQUIRE $(def)DBC_CHECK_ENSURE $(def)DBC_CHECK_INVARIANT $(src)/Checking/checking.cpp $(out)$(build)/checking-require_ensure_and_invariant + # Code documentation. + $(cpp_nodef) $(def)DBC_DOC $(src)/Checking/checking.cpp $(out)$(build)/checking-doc + # Invalid define combinations -- compilationmust fail. + $(cpp_nodef_mustfail) $(def)DBC $(src)/Checking/checking.cpp $(out)$(build)/checking-dbc + $(cpp_nodef_mustfail) $(def)DBC_NO $(def)DBC_ALL $(src)/Checking/checking.cpp $(out)$(build)/checking-no_and_all + $(cpp_nodef_mustfail) $(def)DBC_DOC $(def)DBC_ALL $(src)/Checking/checking.cpp $(out)$(build)/checking-doc_and_all + +Copyable: copyable copyable_ptr +copyable: force_ + mkdir -p $(build) + $(cpp) $(src)/Copyable/copyable.cpp $(out)$(build)/copyable +copyable_ptr: force_ + mkdir -p $(build) + $(cpp) $(src)/Copyable/copyable_ptr.cpp $(out)$(build)/copyable_ptr + +Static: static +static: force_ + mkdir -p $(build) + $(cpp) $(src)/Static/static.cpp $(out)$(build)/static + +Separate: separated_access +separated_access: force_ + mkdir -p $(build) + $(cpp) $(src)/Separate/separated_access.cpp $(out)$(build)/separated_access + +doc: force_ + mkdir -p $(build) + $(cpp) $(src)/Doc/doc.cpp $(out)$(build)/doc + mkdir -p $(codedoc) + doxygen codedoc/Doxyfile.test + diff --git a/build/REAME.txt b/build/REAME.txt new file mode 100755 index 00000000..14c13150 --- /dev/null +++ b/build/REAME.txt @@ -0,0 +1 @@ +Build configuration and output files. diff --git a/build/svnignore b/build/svnignore new file mode 100755 index 00000000..082d47e7 --- /dev/null +++ b/build/svnignore @@ -0,0 +1,7 @@ +#!/bin/bash + +svn propset svn:ignore ' +doc +example +test +' . diff --git a/codedoc/Doxyfile.example b/codedoc/Doxyfile.example new file mode 100755 index 00000000..bbca2d7a --- /dev/null +++ b/codedoc/Doxyfile.example @@ -0,0 +1,1356 @@ +# Doxyfile 1.5.5 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./codedoc/example + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, +# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, +# and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = NO + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = NO + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./example + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = ./include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = DBC_DOC + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is enabled by default, which results in a transparent +# background. Warning: Depending on the platform used, enabling this option +# may lead to badly anti-aliased labels on the edges of a graph (i.e. they +# become hard to read). + +DOT_TRANSPARENT = YES + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/codedoc/Doxyfile.test b/codedoc/Doxyfile.test new file mode 100755 index 00000000..ddbff7f4 --- /dev/null +++ b/codedoc/Doxyfile.test @@ -0,0 +1,1356 @@ +# Doxyfile 1.5.5 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./codedoc/test + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, +# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, +# and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = NO + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = NO + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./test/Doc + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = ./include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = DBC_DOC + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is enabled by default, which results in a transparent +# background. Warning: Depending on the platform used, enabling this option +# may lead to badly anti-aliased labels on the edges of a graph (i.e. they +# become hard to read). + +DOT_TRANSPARENT = YES + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/codedoc/REAME.txt b/codedoc/REAME.txt new file mode 100755 index 00000000..5d354a15 --- /dev/null +++ b/codedoc/REAME.txt @@ -0,0 +1 @@ +Source code documentation (see "doc/" for user's manuals instead). diff --git a/codedoc/svnignore b/codedoc/svnignore new file mode 100755 index 00000000..52782bba --- /dev/null +++ b/codedoc/svnignore @@ -0,0 +1,6 @@ +#!/bin/bash + +svn propset svn:ignore ' +example +test +' . diff --git a/doc/README.txt b/doc/README.txt new file mode 100755 index 00000000..799a8246 --- /dev/null +++ b/doc/README.txt @@ -0,0 +1,3 @@ +User's manuals (see "codedoc/" for code documentation). + +Library documentation at "html/index.html". diff --git a/doc/howto/HOWTO_Create_New_Sourceforge_Release.txt b/doc/howto/HOWTO_Create_New_Sourceforge_Release.txt new file mode 100755 index 00000000..a78c168c --- /dev/null +++ b/doc/howto/HOWTO_Create_New_Sourceforge_Release.txt @@ -0,0 +1,23 @@ +HOWTO Create New Sourceforge Release +==================================== + +To create a new Sourceforge release with relative download package: +1. Update dbcpp/RELEASE.txt with a few comments on new release. +2. Commit all code to realse to SVN. +3. Note the SVN revision (svn info) and constructor a release number: + DNUM = Major.Minor.SvnRevision + UNUM = Major_Minor_SvnRevision +4. Upload tar ball for the release download. + $ cd /tmp + $ svn export https://dbcpp.svn.sourceforge.net/svnroot/dbcpp dbcpp_$UNUM + $ tar czf dbcpp_$UNUM.tar.gz dbcpp_$UNUM + $ scp dbcpp_$UNUM.tar.gz lcaminiti@frs.sourceforge.net:uploads +5. Loging into http://sourceforge.net/ and select the DBC++ project. +6. Select Project Admin > Feature Settings > File Release System > Manage. +7. For package name "dbcpp", select Add Release entering REV as the + "New Release Name". +8. Enter release notes as from RELEASE.txt. +9. Select dbcpp_$NUM.tar.gz. +10. Select Project Admin > Feature Settings > File Release System > Manage > + Create / Edit Download Page and enable uploaded tar.gz file for download. + diff --git a/doc/howto/HOWTO_Upload_Sourceforge_Website_HTML.txt b/doc/howto/HOWTO_Upload_Sourceforge_Website_HTML.txt new file mode 100755 index 00000000..f928b743 --- /dev/null +++ b/doc/howto/HOWTO_Upload_Sourceforge_Website_HTML.txt @@ -0,0 +1,18 @@ +HOWTO - Upload Sourceforce Website HTML +======================================= + +Explains how to upload HTML files to Soruceforce project website. + +1. Go to directory with HTML files to be uploaded. + $ cd doc/html +2. Secure FTP to website location. + [doc/html]$ sftp lcaminiti,dbcpp@web.sourceforge.net +3. Go to 'htdocs' directory and upload all HTML files (this is NOT recursive, + so you have to manually do + > cd htdocs + > put * +5. Do the same 'str' subdirectory (if you need to create the subdirectory, + use the FTP `mkdir' command). + > cd str + > put str/* + diff --git a/doc/howto/README.txt b/doc/howto/README.txt new file mode 100755 index 00000000..f5a76c0f --- /dev/null +++ b/doc/howto/README.txt @@ -0,0 +1 @@ +Document on how-to preform a few tasks (use short, step-by-step format). diff --git a/doc/html/Bibliography.html b/doc/html/Bibliography.html new file mode 100755 index 00000000..705bdca9 --- /dev/null +++ b/doc/html/Bibliography.html @@ -0,0 +1,72 @@ + + +Bibliography + + + + + +
+

Bibliography

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[Abr05] D. Abrahams, A. Gurtovoy. C++ Template Metaprogramming -- Concepts, Tools, and Techniques from Boost and Beyond. Addison-Wesley. 2005.

+

[Bri04a] W. Bright. D Programming Language. http://www.digitalmars.com/d/

+

[Bri04b] W. Bright. Digital Mars C and C++ Compilers. http://www.digitalmars.com/

+

Boost C++ Libraries. http://www.boost.org/

+

doxygen Source code documentation generator tool. http://www.doxygen.org/

+

[Mal99] D. Maley, I. Spence. Emulating Design by Contract in C++.Proceedings of TOOLS, IEEE Computer Society, 1999.

+

[Mey97] B. Meyer. Object Oriented Software Construction, 2nd Edition. Prentice-Hall, 1997.

+

[Mit02] R. Mitchell, J. McKim. Design by Contract, by Example. Addison-Wesley, 2002.

+

[Nel04] C. Nelson. Working draft changes for C99 preprocessor synchronization. C++ Standards Committee Paper N1653, 2004. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm

+

[Ens01] iContract: Design by Contract in Java. 2001. http://www.javaworld.com/javaworld/jw-02-2001/jw-0216-cooltools.html

+

[Ott04] [Ott04] T. Ottosen, Proposal to add Design by Contract to C++. C++ Standards Committee Paper N1613, 2004. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2004/n1613.pdf

+

[Str97] B. Stroustrup. The C++ Programming Language, 2nd Edition. Prentice-Hall, 1997.

+

[Sut05] H. Sutter, F. Glassborow. Delegating Constructors, revision 2. C++ Standards Committee Paper N1895, 2005. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1895.pdf

+

[Tan04] A. Tandin. Design by Contract macro for C++ and link to Doxygen. http://www.codeproject.com/KB/macros/DbC_and_Doxygen.aspx

+

Ubuntu Linux-based operating system. http://www.ubuntu.com/

+

+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/Design_By_Contract.html b/doc/html/Design_By_Contract.html new file mode 100755 index 00000000..94178f0a --- /dev/null +++ b/doc/html/Design_By_Contract.html @@ -0,0 +1,114 @@ + + +Design By Contract + + + + + +
+

Design By Contract

+This section gives some background on Design By Contract (DBC) and points to references that can be used to learn more on the topic.

+Benefits

+The main use of DBC is to improve software quality. [Mey97] discusses how DBC can be used as the basic tool to write "correct" software. The following is a short summary of benefits associated with using DBC mainly taken from [Ott04]. See also [Str97] for more discussion on the key importance of class invariants and on advantages and disadvantages of using preconditions and postconditions.

+

    +
  1. Using DBC preconditions and postconditions, the programmer can give a precise semantic description of what a function requires at its entry and what it ensures under its (normal) exit. In particular, using the "old" postfix in postconditions, DBC provides a mechanism that allows the programmer to compare values of an expression before and after the executions of the function's body. This mechanism is powerful enough to enable the programmer to express many constraints in the code -- constraints that would otherwise have to be captured at the best only informally by the code documentation.
    +
    +
  2. In addition, using DBC invariants, the programmer can describe what to expect from a class and logic dependencies between class's member functions and variables. It is the job of the constructor to ensure that the invariants are satisfied when the object is first created. Then the implementation of the member functions can be largely simplified as they can be written knowing that the invariants are satisfied as DBC checks them before and after the execution of every member function body. Finally, the destructor makes sure the invariants hold for the entire object life-cycle checking the invariants one last time before destroying the object.
    +
    +
  3. This library automatically extracts the contract assertions and makes them integral part of the class source documentation. Because contracts are embedded directly into the source code, they are executed and verified at run-time so they are always up to date and the related documentation can be trusted.
    +
    +
  4. DBC can provide a powerful debugging facility because, if contracts are well written, bugs will cause contract assertions to fail exactly where the problem first occurs instead that in some later stage of the program in an apparently unrelated manner. In general, a precondition failure points to a bug in the class user that called one of the member function with invalid parameters. A postcondition failure points instead to a bug in the class member function's implementation. Furthermore, in case of a contract assertion failure, this library provides a detailed log messages that greatly helps debugging.
    +
    +
    Remarks:
    Of course, if the contract is ill written then DBC is of little use. However, it is less likely to have a bug in both the contract and the body than in the body only. That is especially true if contracts are kept simple and they only spell out the semantics of the class design via a concise list of assertions. For example, consider the validation of a result in postconditions. Validating the return value might seem redundant, but in this case we actually want that redundancy. When programmers write a function, there is a certain probability that they make an error implementing the function body. When they specify the result of the function in the postconditions, there is also a certain probability that they make an error again in writing the contract. However, the probability that they make an error twice (in the body and the contract) is lower than the probability that the error is made once (only in the body).
    +
    +
    +
  5. DBC complements testing because a contract also specify specifies what a test should check. For example, preconditions of a function state which input causes the function to throw (or simply fail) and postconditions state which input causes it to exit normally.
    +
    +
  6. DBC can serve to reduce the gap between designer and programmer by providing a precise and unambiguous specification language. Moreover, contracts can make code reviews easier.
    +
    +
  7. DBC formalizes the overriding mechanism of virtual member functions via the concept of subcontracting. This keeps the base class programmer in control as any derived functions still has to fully satisfy the base class contract.
    + However, this library leaves it up to the programmer of the derived class whether to subcontract the base class or not. The derived class contract clearly states if it is bypassing the base class contract or not but this weakens the benefit listed above -- it is strongly recommend to always subcontract when overriding virtual member functions.
    +
    +
  8. DBC assertions replace checks commonly used for defensive programming making the code more readable.
+

+Costs

+The above DBC benefits come to the cost of performance as discussed in detail in both [Str97] and [Mey97].

+The run-time performances are impacted by DBC mainly because of the followings.

    +
  1. The extra processing required to check the assertions.
  2. The extra processing required by the additional function calls (additional functions are invoked to check preconditions, postconditions, and invariants).
  3. The extra processing required to copy the object and function arguments that were made copyable using DBC_COPYABLE() or dbc::copyable to support the "old" postfix in postconditions.
+

+The library implementation tries to minimize the performance impact using inline functions and not compiling at all the parts of the contracts that are disabled using DBC_CHECK_... .

+A reasonable approach is to:

    +
  1. Always write contracts to clarify the semantics of your design embedding them directly into the code and its documentation.
  2. Enable preconditions, postconditions, and invariants during early testing.
  3. Enable only preconditions (and possibly invariants) during release testing and in the final program release. (Postconditions are usually more expensive to check.)
+

+In reality, you will have to decide based on the performance trade-off required by your system.

+Compile-time performances are also impacted by this library because the library implementation extensively uses C++ preprocessor and template metaprogramming. The use of metapgramming turned out to be essential to support the "old" postfix for non-copyable types and a variable number of function arguments without code duplication. Testing showed that the increase in CPU time and memory required by the preprocessor is minimal. However, the increase in CPU time and memory used by the compiler might be very significant depending on your program structure. Improving the library implementation to reduce compilation-time is an ongoing activity so check future releases of this library for an hopefully faster compilation of your contracts (these future implementation optimization will introduce no change in the library public API).

+

Note:
At the moment, C++ compilers are usually not optimized for metaprogramming (see [Abr05]). However, the C++ standard committee is considering adding metaprogramming libraries to STL (e.g., type traits). This could serve as an incentive for future C++ compiler implementations to more efficiently compile metaprograms.
+ In general, DBC is an essential approach to improve software quality even if it comes at a performance cost. While performance trade offs should be carefully considered depending on the application domain, software quality cannot be sacrificed -- it is difficult to see the value of a system that quickly and efficiently provides the incorrect output.

+Other Approaches

+DBC is built into Eiffel [Mey97] and D [Bri04a] programming languages, and the Digital Mars C++ compiler has it as an extension [Bri04b]. There are tools for different languages that try to emulate DBC (e.g., see [Ens01] for the Java programming language). See [Ott04] for more information.

+At the point when this library was developed, there was no publicly available tool for C++ providing all DBC features supported by Effiel. Existing tools lacked of support for either the "old" postfix in postconditions, subcontracting, automatic contract documentation, or a combination of the above. Therefore this library was developed to provide all Eiffel DBC features for C++. In addition, this library does not require preprocessing from an external program increasing code portability.

+

Note:
Some DBC tools (like [Ens01]) relies on an external program that pre-processes the original source code with contract written in the language specified by this preprocessor, generates new source code with the actual contract code, and then compile this source code to generate the program. If possible the use of pre-processing tools external to the language itself should be avoided (see Boost.Preprocessor) because it reduces code portability, it require programmers to learn the pre-processing tool and its syntax, the executed code is different from the source code written by the programmer (this makes debugging difficult as most debugging tools will not understand the special syntax introduced by the external preprocessor). This library avoids the use of external preprocessors using the C++ preprocessor instead when preprocessing is needed.
+ The following table compares DBC features among different languages, libraries, and tools (similar to the comparison presented in [Ott04]). Some level of detail is provided on how this library implements the listed DBC features.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Design By Contract (DBC) Feature This DBC Library Eiffel [Mey97] D [Bri04a] Proposal to add DBC to C++ [Ott04]
SupportDetail
Keywords Not apply to a library. Code-based API (no keywords) follow Eiffel names: require(), ensure(), DBC_BODY(), .old (and .now), and DBC_INVARIANT(). require, ensure, do, require else, ensure then, old, invariant, and result. in, out, body, invariant, and assert. in, out, do, invariant, and return.
On condition violation Throw (by default), terminate, or exit. Programmer can select action on violation using DBC_ASSERT() and DBC_ASSERT_STREAM(). Throw exception. Throw exception. Terminate (by default), might throw or exit.
Return value evaluation Yes. result argument of ensure() (only if postconditions compiled in object code). Yes, result keyword. No. Yes, return keyword.
Expression copying in postconditions Yes. For object and function arguments declared DBC_COPYABLE() or dbc::copyable, accessed via .old (only if postconditions compiled in object code). Yes, old keyword. No. Yes, in keyword.
Subcontracting Yes. Use DBC_BASE() or B template parameter of dbc::fun::mem (but derived class programmer can decide to subcontract or not, recommended to always subcontract). Yes. Yes. Yes.
Assertion nameing Yes. A string passed to DBC_ASSERT() and DBC_ASSERT_STREAM(). Yes. No. No.
Arbitrary code in contracts Yes. But recommended to keep contract code simple, ideally limit it to a list of assertions. No. Yes. No.
Contracts access level Any. Preconditions, postconditions, and invariants can access any class member public, protected, or private. But recommended to write contracts using public members as much as possible. In particular, preconditions should only use public members otherwise the caller will not be able to make sure the contract holds before invoking the function. Preconditions cannot access public members (to avoid contracts that cannot be checked by the caller). Any. Any.
Contract for abstract functions Yes. When body is defined pure virtual by "= 0;". Yes. No. Yes.
Code ordering Order: Preconditions, postconditions, and body. For macro-based API only. Order: Preconditions, body, and postconditions. Order: Preconditions, postconditions, and body. Order: Preconditions, postconditions, and body.
Static assertions Yes. Use C++ metaprogramming (e.g., the Boost.MPL library). No. Yes. Yes.
Prevent contract side-effects Yes. Use constant (const) code block, object self, function arguments, and result to limit unintended contract side side-effects. Yes. No. No.
Contracts removable from object code Yes. Compilation and checking of preconditions, postconditions, invariants, and any of their combination can be enabled or disabled using the DBC_CHECK_... macros. Yes. Yes. Only default assertions.
Check invariants At end of constructors, at beginning and end of member functions, and at beginning of destructor (if programmer specifies contracts for those). E.g., programmer may omit contract for all private member functions so their calls will not check invariants. Furthermore, invariant checking in destructor is disabled during stack unwinding because of an unhandled exceptions (as contracts themselves can throw). At end of constructors, at beginning and end of public member functions. At end of constructors, at beginning and end of public member functions, and at beginning of destructor. At end of constructors, at beginning and end of public member functions, and at beginning of destructor.
Disabling assertion checking within assertions Yes. To prevent infinite recursion when checking contracts. Yes. No. Yes.
In nested function calls Disable invariants only. To prevent infinite recursion when checking contracts. Disable all assertions. Disable nothing. Disable invariants only.
Concurrency Not yet. On roadmap to implement this similarly to Eiffel (i.e., making this library thread-safe and supporting waiting conditions). Yes (implements waiting conditions). No. No.
Automatic contract documentation Yes. doxygen is used by default (see DBC_CONFIG_DOC_...). Yes (contracts are part of the class short form). No with existing documentation tools. No with existing documentation tools.
+

+The design of this library was somewhat inspired by:

    +
  • [Mal99] in how to implement optional contract compilation and subcontracting (however because this library uses preprocessor and template metaprogramming the actual implementation of these features now differs quite a bit from the approach proposed by [Mal99]).
  • [Tan04] in the use of doxygen for automatic contract documentation.
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/Errors.html b/doc/html/Errors.html new file mode 100755 index 00000000..26c435e9 --- /dev/null +++ b/doc/html/Errors.html @@ -0,0 +1,157 @@ + + +Annex: Compile-Time Errors + + + + + +
+

Annex: Compile-Time Errors

This section presents a (not complete) list of common compile-time errors that might be encountered when compiling contracts.

+Some incorrect uses of the library are checked at compile-time (using Boost.MPL static assertions) and they generate compiler error messages containing text of the form DBC_ERROR_... .

+This library heavily uses templates. Usually, compiler errors for C++ templates are somewhat difficult to understand because of the genericity of the template mechanism and related errors.

+This library uses code blocks passed as macro parameters (e.g., body, preconditions, postconditions, invariants). When a code block is passed as a single macro parameter, the compiler interprets it as being on a single line and error line numbers loose quite a bit of their usefulness. To limit this situation, it is strongly suggested to keep the contract code simple (so the errors can be found easily even if the line numbers are not exact) and to separate contract declarations from body definitions (so complex body implementation code is separate from the contract, it is not passed as a single macro parameter, and complier error line numbers will be exact).

+The error messages presented here refer to the format used by the g++ 4.2.4 C++ compiler. Other C++ compilers may generate different error messages but the cause of the error should still apply.

+

+
warning: ‘class dbc::fun<...>...’ is already a friend of ‘...’
+
This is the only warning generated by the library that should be ignored.
+ This is due to the macro-based API automatically specifying the same contract type as friend more than one time across different member functions.
+ If your complier selectively allows to turn this warning off, you can safely do so and then compile with warning threated as errors (-Werror option for g++). Unfortunately, g++ 4.2.4 does not yet support to turn this warning off (future g++ versions might support this via #pragma GCC diagnostic ignored "-W...") so the -Werror option cannot be used (but this is the only warning generated by this library that should be ignored).
+
+

+
+
error: ‘dbc_invariant_’ was not declared in this scope
+
Did you forget to add DBC_INVARIANT() at the end of the class?
+
+

+
+
error: ‘mem’ is not a template
+
Make sure class_type is specified to be a template using the template keyword: for the macro-based API use (template)(class_type), for the code-based API use dbc::fun<>::mem::template class_type.
+
+

+
+
error: invalid use of non-static data member ‘...’
+
Did you forget to use self?
+
+

+
+
error: no match for ‘...’ in ‘...’
+
Did you forget .now or .old in postconditions on either self or a function argument?
+
+

+
+
error: ‘...’ has no member named ‘old’
+
Are you using .old on either self or a function argument without specifying it DBC_COPYABLE() (or dbc::copyable) in the contract signature?
+
+

+
+
error: macro "DBC_..." passed ... arguments, but takes just ...
+
Does one or more passed macro parameter contain a comma "," not wrapped in parenthesis "()"? If so, use DBC_MPARAM().
+
+

+
+
.../post.hpp:... error: cannot allocate an object of abstract type ‘...’
+
Did you specified an abstract type copyable? (Abstract types, with one or more pure virtual function, cannot be allocated and therefore they cannot be copied.)
+
error: ...DBC_ERROR_class_must_privately_inherit_from_dbc_object_...
+
Did you forget to inherit (privately) from dbc::object? If so, use DBC_INHERIT_OBJECT() or DBC_MULTI_INHERIT_OBJECT().
+
+

+
+
error: ...DBC_ERROR_missing_function_name_...
+
Did you forget to specify the function_name in signature argument of DBC_MEM_FUN()?
+
+

+
+
error: ...DBC_ERROR_missing_function_arguments_...
+
Did you forget to specify the function arguments in signature argument of DBC_MEM_FUN() or similar macro?
+
+

+
+
error: ...DBC_ERROR_missing_class_type_...
+
Did you forget to specify the class_type in signature argument of DBC_MEM_FUN() or similar macro?
+
+

+
+
error: ...DBC_ERROR_class_type_cannot_be_specified_copyable_in_this_context_...
+
Did you specified DBC_COPYABLE() (or dbc::copyable) the class type for a constructor or destructor?
+
+

+
+
error: ...DBC_ERROR_missing_base_class_type_in_DBC_BASE_specifier_...
+
Did you forget to specify the class_type in DBC_BASE()?
+
+

+
+
error: ...DBC_ERROR_constructors_may_not_be_cv_qualified_...
+
Did you specify constructor function const?
+
+

+
+
error: ...DBC_ERROR_constructor_cannot_have_return_value_not_even_void_...
+
Did you attempt to specify void as return value for a constructor?
+
+

+
+
error: ...DBC_ERROR_return_type_specification_for_constructor_invalid_...
+
Did you attempt to specify a return value for a constructor?
+
+

+
+
error: ...DBC_ERROR_destructors_may_not_be_cv_qualified_...
+
Did you specify destructor function const?
+
+

+
+
error: ...DBC_ERROR_return_type_specification_for_destructor_invalid_...
+
Did you attempt to specify a return value for a destructor?
+
+

+
+
error: ...DBC_ERROR_class_type_C_must_be_a_class_...
+
Did you specified a non-class type (e.g., int, float, etc) as class type?
+
+

+
+
error: ...DBC_ERROR_base_contract_type_B_must_be_a_class_,...
+
Did you specified a non-class type (e.g., int, float, etc) as the base contract class type?
+
+

+
+
error: ...DBC_ERROR_class_type_cannot_be_specified_copyable_in_constructor_...
+
Did you specified DBC_COPYABLE() (or dbc::copyable) the class type for a constructor?
+
+

+
+
error: ...DBC_ERROR_class_type_cannot_be_specified_copyable_in_destructor_...
+
Did you specified DBC_COPYABLE() (or dbc::copyable) the class type for a destructor?
+
+

+
+
error: expected unqualified-id before '{' token
+
Do you have a ';' between the function signature and the DBC function contract macro?
+
+

+
+
error: redefinition of '...' error: '...' previously defined here
+
Did you forget to use DBC_BODY?
+
+

+
+

+error: '...' is not a type Is the class a template and if so, did you specify it as such using the "(template)" keyword in the macro API?

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/Quick_Start.html b/doc/html/Quick_Start.html new file mode 100755 index 00000000..f614586c --- /dev/null +++ b/doc/html/Quick_Start.html @@ -0,0 +1,337 @@ + + +Quick Start + + + + + +
+

Quick Start

+This section briefly shows how to use this library to write contracts.

+Conventions

+This library provides both a macro-based API and a code-based API to write contracts. The code-based API relies less on macros, allows to more easily understand how the library works, but requires the programmer to write much more "setup code" and does not support automatic contract documentation. The use of the macro-based API is recommended whenever possible because it makes the contracts more readable and it is less work for the programmer. This section illustrates the macro-based API while both APIs are explained in later sections.

+This library defines most of its symbols in the dbc namespace. Futhermore, all library macros are prefixed by DBC_ (C++ macros are not local to any namespace). Any library symbol (class, function, variable, macro, etc) ending with an underscore _ is implementation specific and must not be used directly so it is left out of this documentation. Some library symbols are defined into the global namespace and at the class scope when contracts are added to a user defined classes (this is because the user classes have to be "augmented" with symbols defining their contracts). All these symbols defined by this library outside the dbc namespace have names of the form dbc_..._ where the leading dbc_ attempts to avoid name clashes and the ending underscore indicates that these symbols are implementation specific and must not be used. Metapgrogramming constructs used by this library and listed by this documentation are indicated with implementation specific names ending with _ (as they should not be used directly).

+Platform

+This library is highly portable as it only requires the highly portable Boost C++ library.

+This library uses both preprocessor and template metaprogramming (via the Boost.Preprocessor and Boost.MPL libraries), as a consequence it is fairly demanding of C++ compiler compliance to ISO standards. At present, this library has been successfully compiled and tested on the following compilers/platform:

+

    +
  1. g++ 4.2.4 on Ubuntu Linux.
  2. Microsoft Visual C++ 8.0 on Windows XP.
  3. g++ 3.2.1 on Cygwin.
+

+This library has been developed under Ubuntu Linux and this documentation makes explicit references to Linux commands. However, if you are using an operating system different from Linux, it should be trivial to mirror the commands used by this documentation into the equivalent ones for your operating system.

+This library has been developed using the Boost C++ library version 1.34.1. Boost is a highly portable C++ library that is available for a variety of platforms. For example, on Ubuntu Linux, assuming your computer is properly connected to the Internet, you can install Boost simply using:

+

+$ sudo apt-get install libboost-dev
+

+

Note:
Boost is used by this library implementation for the followings:
    +
  • +Boost.Preprocessor for preprocessor metaprogramming (essentially to support an arbitrary number of function arguments as specified by DBC_CONFIG_MAX_ARGC).
  • +
  • +Boost.MPL for template metaprogramming (essentially for type traits, to support dbc::copyable, and to generate the DBC_ERROR_... compile-time errors for improper library use).
  • +
+Earlier versions of this library did not rely on Boost but the implementation required quite a bit of manual (and error prone) code duplication to deal with multiple function arguments, a good deal of type traits reimplementation, and provided no compile-time checking for improper library use.
+ This library has been developed using the g++ C++ compiler version 4.2.4. For example, on Ubuntu Linux you can install g++ using:

+

+$ sudo apt-get install g++-4.2
+

+Installation

+You can download the latest release of this library at http://sourceforge.net/projects/dbcpp/ . On Linux, you can unpack the compressed downloaded file using:

+

+$ tar -xzf dbcpp_<VERSION>.tar.gz
+

+This creates a directory "dbcpp_<VERSION>/" that contains the library source files, examples, documentation, etc.

+ + + + + + + + + + + + + + + + + +
dbcpp_<VERSTION>/ Library distribution root directly (referred as $DBC_ROOT).
include/ Library source files.
doc/ Library documentation. The HTML library documentation is in "doc/html/index.html".
example/ Library example files. Examples from [Mey97], [Mit02], [Str97], etc. See "example/OO_SW_Constduction/Stack4/" for a good general DBC example, "example/DBC_by_Example/NameList/" for simple example of subcontdacting, and "example/DBC_by_Example/Observer/" for a more complex example.
test/ Library test files. These files also show advanced use of the library API.
build/ Example and test built programs. Run `[$DBC_ROOT]$ make' to see how to build example and test programs (the library itself does not need to be built).
codedoc/ Example and test source code documentation. This is NOT the library documentation. This documentation is generated when examples and tests are built and it contains their contract documentation automatically generated.
bin/ Library support programs and scripts.
+

+

Remarks:
In the rest of this documentation, we will refer to this directory explicitly as "$DBC_ROOT" or implicitly when a file path is local (e.g., "inlucde/" implicitly indicates "$DBC_ROOT/include/"). Furthermore, command prompts that indicate the directory explicitly as in [$DBC_ROOT]$ command require the specified command to be executed from the indicated directory. Otherwise, if the prompt does not indicate any directory as in $ command then the command can be executed from the local directory or any directory.
+This library is composed of header files only (there is no pre-compiled object file). You can install the library simply by copying all contents of the "$DBC_ROOT/include/" directory into a directory that is part of your complier's include path. For example, on Linux you can copy the library header files to the "/usr/include/" directory (you might need to be root):

+

+[$DBC_ROOT]$ sudo cp -r include/ /usr/include/
+

+Or, you can install the library in some other directory and add that directory to the compiler include path (use the -I option for the g++ complier).

+Overview

+Design By Contract is characterized by at least four simple assertion mechanisms (see [Mey97]):
    +
  1. It is possible to describe the member function's preconditions. These are logical conditions that the programmer of the function excepts to be true when the function is called (e.g., to check constraints on function parameters).
    +
    + In preconditions, the variable self is a constant reference to the object and constant reference to function arguments can be accessed via thier names argument_name.
    +
    +
  2. It is possible to describe the member function's postconditions. These are logical conditions that the programmer expects to be true when the function has ended normally (e.g., to check the result and any side effect that a function has).
    +
    + In postconditions, constant references to the object and function arguments current value, after the body execution, can be accessed via self.now and argument_name.now respectively. If the object class or function argument types have been declared copyable (using DBC_COPYABLE() or dbc::copyable) then their values before the body was executed can also be accessed, in this case via self.old and argument_name.old. Furthermore, postconditions of non-void member function can access a constant reference to the function returned value via result.
    +
    +
  3. It is possible to describe class invariants. These are logical conditions that the programmer expects to be true after the constructor has been executed successfully, before and after the execution of each member function with a contract, and before the destructor is executed (e.g., invariants can define a valid state for all objects of a class).
    +
    + In invariants, the variable self is a constant reference to the object.
    +
    +
  4. It is possible to formalize the notion of overriding a virtual member function via subcontracting. Subcontracting can be justified by substitution principles and it consists of the following rules that the overriding function must obey:
      +
    1. +Preconditions cannot be stronger.
    2. +
    3. +Postconditions cannot be weaker.
    4. +
    5. +Invariants are inherited and can never be weaker in derived class.
    6. +
    +When subcontracting, this library automatically ORs preconditions and ANDs postconditions and invariants between the contracts of the base and derived classes to implement these rules.
    +
    + This library allows contracts in a derived class to be specificied as subcontracts of the related contract in the base class via the DBC_BASE() macro or the B template argument of dbc::fum::mem.
+

+

Remarks:
Contracts should use the class's public API as much as possible so they are implementation independent. However, postconditions and invariants are often used to check the correctness of the implementation and in come cases they must access the private or protected API. Preconditions should only access the public API, otherwise the caller cannot check them before invoking the function (see [Mey97]). However, this library does not enforce any access level rule in contracts - this is left up to the programmer.
+Based on the above definitions of preconditions, postconditions, and invariants, this library implements the following call semantics for every member function, constructor, and destructor for which the programmer provides a contract (as indicated in [Mey97], [Ott04], and [Str97]):
    +
  • Constructor Call Semantic
    + A constructor call executes the following steps:
      +
    1. Initialize member variables (via the constructor's member initialization block).
    2. Check preconditions but not invariants. Constructor preconditions have no access to self. Before constructor body execution, there is no object and invariants do not have to hold.
    3. Execute constructor body.
    4. Check invariants.
    5. Check postconditions.
    +
  • Destructor Call Semantic
    + A destructor call executes the following steps:
      +
    1. Check invariants (but only if destructor was not called during stack unwinding because of a previously thrown and not yet handled exception). In case of failure, broken_destructor_invariant() is be called instead of throwing an exception (this is to comply with C++ STL exception safety requirements, see [Ott04] and [Str97]).
    2. Execute destructor body. After destructor body execution, there is no object anymore so invariants are not checked.
    +
  • Member Function Call Semantics
    + A member function executes the following steps:
      +
    1. Check invariant and (when subcontracting) check base class function's invariants.
    2. Check preconditions or (when subcontracting) check base class function's preconditions.
    3. Execute function body.
    4. Check invariant and (when subcontracting) check base class function's invariants.
    5. Check postconditions and (when subcontracting) check base class function's postconditions.
    +
+

+In the above rules, "and" and "or" are evaluated in short-circuit (i.e., A and B evaluates B only if A is evaluated to be true, A or B evaluates B only if A is evaluated to be false).

+Once the programmer has specified contracts, the library provides a mechanism for checking whether the conditions hold at run-time. The DBC_CHECK_... macros can be used to turn this run-time checking on or off selectively for the sake of efficiency (e.g., only compile and check invariants and preconditions but no postconditions). If a condition fails, the library will throw an exception by default but a mechanism is provided for the programmer to specify conditions that throw user defined exceptions, terminate, or exit the program. Furthermore, the programmer can selectively chose which of these conditions should be checked using the DBC_CONFIG_ENABLE_... macros (e.g., only check conditions that terminate or the program but no the ones that throw exceptions).

+A Complete Example

+This is a fully working example that illustrates how to write contracts using the library macro-based API (from "example/str/str.cpp").

+

/**
+ * @file
+ * @author Copyright (C) 2009 Lorenzo Caminiti.
+ *  Distributed under DBC++ Software License (see file LICENSE_1_0.txt).
+ */
+
+#include <dbc.hpp>
+#include <cstring>
+#include <iostream>
+
+/** 
+ * Demonstrate the use of Design By Contract for C++ macro-based API
+ * implementing a simple string type. 
+ * @see "example/str/str-codeapi.cpp" for same example using code-based API.
+ */
+class str DBC_INHERIT_OBJECT(str) { // Derive from dbc::object.
+public:
+    /** Max limit on string length. */
+    static const size_t MAX_SIZE = 16000;
+
+    /**
+     * Construct from C-style null-terminated string.
+     * @param[in] chars C-style null-terminated string.
+     */
+    str(const char* chars): size_(), chars_()
+    DBC_CONSTRUCTOR( (public) (str)( (const char*)(chars) ), {
+        // Constructor preconditions.
+        size_t size = strlen(chars); // Code allowed but keep it simple.
+        // Use DBC_ASSERT() or DBC_ASSERT_STREAM() to assert conditions.
+        DBC_ASSERT(size >= 0 && size < str::MAX_SIZE, "size in range");
+    }, {
+        // Constructor postconditions.
+        DBC_ASSERT(self.now.size() == strlen(chars.now), "size set");
+        DBC_ASSERT(strncmp(self.now.chars_, chars.now,
+                self.now.size()) == 0, "chars set");
+    }, {
+        // Constructor body.
+        size_ = strlen(chars);
+        chars_ = new char[size_];
+        strncpy(chars_, chars, size_);
+    })
+
+    /**
+     * Copy constructor.
+     * Copy constructor is used by library to support "old" in postcond. User
+     * defined copy constr is needed for pointer deep copy.
+     * @note To avoid code duplication, this and the above constructor could 
+     *  be refactored delegating implementation and contract to an init() func.
+     * @param[in] other Other string object.
+     */
+    str(const str& other): size_(), chars_()
+    DBC_CONSTRUCTOR( (public) (str)( (const str&)(other) ), {
+        // Use other.size() not other.size_ as precond should use public member.
+        DBC_ASSERT(other.size() >= 0 && other.size() < str::MAX_SIZE,
+                "size in range");
+    }, {
+        DBC_ASSERT(self.now.size() == other.now.size(), "size set");
+        DBC_ASSERT(strncmp(self.now.chars_, other.now.chars_,
+                self.now.size()) == 0, "chars set");
+    }, {
+        delete[] chars_;
+        size_ = other.size_;
+        chars_ = new char[size_];
+        strncpy(chars_, other.chars_, size_);
+    })
+    
+    /** Destroy. */
+    virtual ~str(void)
+    DBC_DESTRUCTOR( (public) (virtual) (str)( (void) ), {
+        // Destructor body.
+        delete[] chars_; // Invariant already checked chars_ != 0.
+    })
+
+    /**
+     * Return character at specified index.
+     * @param[in] index Index position.
+     * @return str's character at specified position.
+     */
+    char& operator[](const size_t& index)
+    DBC_MEM_FUN( (public) (char&) DBC_COPYABLE(str)
+            (operator_at)( (const size_t&)(index) ), {
+        // Member function preconditions.
+        DBC_ASSERT(index >= 0 && index < self.size(), "index in range");
+    }, {
+        // Member function postconditions.
+        // Not a const mem fun, use 'self.old' for object before body and
+        // make class type DBC_COPYABLE().
+        DBC_ASSERT(result == self.old.chars_[index.now],
+                "returning char at index");
+    }, {
+        // Member function body.
+        return chars_[index];
+    })
+
+    /**
+     * Return size (total number of characters).
+     * @return str's size.
+     */
+    size_t size(void) const
+    DBC_MEM_FUN( (public) (size_t) (str) (size)( (void) ) (const), {
+    }, {
+        DBC_ASSERT(result == self.now.size_, "returning size");
+    }, { 
+        return size_;
+    })
+
+private:
+    /** Internal string size. */
+    size_t size_; // Unsgined so size_ >= 0 check could be removed...
+    /** Internal string representation. */
+    char* chars_;
+
+    DBC_INVARIANT(str, {
+        // Invariants.
+        DBC_ASSERT(self.chars_ != 0, "chars exist");
+        DBC_ASSERT(self.size_ >= 0 && self.size_ < str::MAX_SIZE,
+                "size in range");
+    })
+};
+
+/** Main program. */
+int main() {
+    std::cout << std::endl << "init()..." << std::endl;
+    str s("Galileo Galilei");
+
+    std::cout << std::endl << "operator[](0)..." << std::endl;
+    std::cout << s[0] << std::endl;
+
+    std::cout << std::endl << "del()..." << std::endl;
+    return 0;
+}
+
+

+On Linux, it can be compiled using:

+

+[$DBC_ROOT]$ g++ -Wall -I./include -DDBC_ALL -DDBC_CONFIG_LOG_LEVEL=DBC_LOG_LEVEL_ALL ./example/str/str.cpp -o ./build/example/str
+

+The DBC_ALL macro is defined (-D option) to indicate that all contracts (preconditions, postconditions, and invariants) should be compiled and checked. The DBC_CONFIG_LOG_LEVEL macro is defined to DBC_LOG_LEVEL_ALL so the library will output debug information on what conditions are being checked (this verbose output is enabled here for demonstration only, usually the DBC_CONFIG_LOG_LEVEL can be left undefined so the DBC library will only log informations in case of a condition failure).

+On Linux, the compiled example program can be executed using:

+

+[$DBC_ROOT]$ ./build/example/str
+

+Which produces the following output:

+

+init()...
+dbc: 3str::init(): entering
+dbc: 3str::init(): checking preconditions
+dbc: Assertion "size in range" passed as { size >= 0 && size < str::MAX_SIZE; } at ./example/str/str.cpp:41
+dbc: 3str::init(): executing body
+dbc: 3str::init(): checking invariant
+dbc: Assertion "chars exist" passed as { self.chars_ != 0; } at ./example/str/str.cpp:118
+dbc: Assertion "size in range" passed as { self.size_ >= 0 && self.size_ < str::MAX_SIZE; } at ./example/str/str.cpp:118
+dbc: 3str::init(): checking postconditions
+dbc: 3str::size(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: Assertion "size set" passed as { self.now.size() == strlen(chars.now); } at ./example/str/str.cpp:41
+dbc: 3str::size(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: Assertion "chars set" passed as { strncmp(self.now.chars_, chars.now, self.now.size()) == 0; } at ./example/str/str.cpp:41
+dbc: 3str::init(): returning
+
+operator[](0)...
+dbc: 3str::operator_at(): entering
+dbc: 3str::init(): entering
+dbc: 3str::init(): checking preconditions
+dbc: 3str::size(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: 3str::size(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: Assertion "size in range" passed as { other.size() >= 0 && other.size() < str::MAX_SIZE; } at ./example/str/str.cpp:65
+dbc: 3str::init(): executing body
+dbc: 3str::init(): checking invariant
+dbc: Assertion "chars exist" passed as { self.chars_ != 0; } at ./example/str/str.cpp:118
+dbc: Assertion "size in range" passed as { self.size_ >= 0 && self.size_ < str::MAX_SIZE; } at ./example/str/str.cpp:118
+dbc: 3str::init(): checking postconditions
+dbc: 3str::size(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: 3str::size(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: Assertion "size set" passed as { self.now.size() == other.now.size(); } at ./example/str/str.cpp:65
+dbc: 3str::size(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: Assertion "chars set" passed as { strncmp(self.now.chars_, other.now.chars_, self.now.size()) == 0; } at ./example/str/str.cpp:65
+dbc: 3str::init(): returning
+dbc: post<3str>: copied from original object
+dbc: 3str::operator_at(): checking invariant
+dbc: Assertion "chars exist" passed as { self.chars_ != 0; } at ./example/str/str.cpp:118
+dbc: Assertion "size in range" passed as { self.size_ >= 0 && self.size_ < str::MAX_SIZE; } at ./example/str/str.cpp:118
+dbc: 3str::operator_at(): checking preconditions
+dbc: 3str::size(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: Assertion "index in range" passed as { index >= 0 && index < self.size(); } at ./example/str/str.cpp:93
+dbc: 3str::operator_at(): executing body
+dbc: 3str::operator_at(): checking invariant
+dbc: Assertion "chars exist" passed as { self.chars_ != 0; } at ./example/str/str.cpp:118
+dbc: Assertion "size in range" passed as { self.size_ >= 0 && self.size_ < str::MAX_SIZE; } at ./example/str/str.cpp:118
+dbc: 3str::operator_at(): checking postconditions
+dbc: Assertion "returning char at index" passed as { result == self.old.chars_[index.now]; } at ./example/str/str.cpp:93
+dbc: 3str::init(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: 3str::del(): entering, executing body, and returning (assertions disabled within assertion checking)
+dbc: 3str::operator_at(): returning
+dbc: 3str::del(): entering
+dbc: 3str::del(): checking invariant
+dbc: Assertion "chars exist" passed as { self.chars_ != 0; } at ./example/str/str.cpp:118
+dbc: Assertion "size in range" passed as { self.size_ >= 0 && self.size_ < str::MAX_SIZE; } at ./example/str/str.cpp:118
+dbc: 3str::del(): executing body
+dbc: 3str::del(): returning
+G
+
+del()...
+dbc: 3str::del(): entering
+dbc: 3str::del(): checking invariant
+dbc: Assertion "chars exist" passed as { self.chars_ != 0; } at ./example/str/str.cpp:118
+dbc: Assertion "size in range" passed as { self.size_ >= 0 && self.size_ < str::MAX_SIZE; } at ./example/str/str.cpp:118
+dbc: 3str::del(): executing body
+dbc: 3str::del(): returning
+

+Note that the library's optional debug messages (prefixed by "dbc:") show how preconditions, postconditions, and invariants are checked when constructors, destructors, and member functions are called according to the DBC call semantics.

+Finally, this shows the source code documentation generated by doxygen for this example (see Automatic Contract Documentation for details). Note that preconditions, postconditions, and invariants have been automatically documented by this library.

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/README.txt b/doc/html/README.txt new file mode 100755 index 00000000..9278a696 --- /dev/null +++ b/doc/html/README.txt @@ -0,0 +1 @@ +Library documentation, HTML automatically generated from "doc/src". diff --git a/doc/html/Software_License.html b/doc/html/Software_License.html new file mode 100755 index 00000000..37b069bb --- /dev/null +++ b/doc/html/Software_License.html @@ -0,0 +1,52 @@ + + +Annex: Software License + + + + + +
+

Annex: Software License

(File: LICENSE_1_0.txt)
+
+Design By Contract for C++ (DBC++) Software License, Version 1.0
+April 19th, 2009
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/Writing_Contracts.html b/doc/html/Writing_Contracts.html new file mode 100755 index 00000000..ed46cdaa --- /dev/null +++ b/doc/html/Writing_Contracts.html @@ -0,0 +1,313 @@ + + +Writing Contracts + + + + + +
+

Writing Contracts

+This library provides both a macro-based API and a code-based API to write contracts. This section gives an overview of both types of API, the actual API function and macro documentation should studied as well in order to understand how to use this library to write contracts.

+In general, it is strongly recommended to use the macro-based API. The code-based API may occasionally be needed in special cases where the macro-based API does not suffice. The following is a summary of pro (+) and cons (-) of the two API.

+ + + + + + + + + + + + + + + +
Characteristic Macro-Based API (recommended) Code-Based API
Require extra code to "setup" the contract. + No extra code required (the "setup" code is generated automatically by the macros). - The programmer has to manually write quite a bit of extra "setup" code.
Enhance code readability. + After about 1 week of use, you will become familiar with the macro syntax and the code will be easy to read. - The extra "setup" code reduces the contract readability.
Automatically document contracts. + Yes. - No (unless programmers also manually program code to write the documentation using the DBC_CONFIG_DOC_... macros but this will require a significant extra effort).
Require extra syntax to become familiar with. - Programmers need to become familiar with the syntax used to specify the member function signature in DBC_MEM_FUN() and similar macros (this usually only requires about 1 week of using the library). + No special syntax is introduced (just common C++ code structures).
Allow to easily understand how the library works. - The mechanisms used by the library to check the contracts are hidden within the code automatically generated by the macros. + The code allows to have a better understanding of how the library checks contracts at least at high level.
Provide extra flexibility to handle special cases. - The code generated by the macros can handle most library uses but not necessarily all. + Programmers have full control of the contract code as they are writing it manually. This extra flexibility might occasionally be needed to handle special cases (e.g., special C++ program structures, workaround internal compiler errors, etc).
+ In these special and rare cases, it is appropriate to use the code-based API instead of the macro-based API.
+

+Macro-Based API

+The library macro-based API uses the DBC_CONSTRUCTOR(), DBC_DESTRUCTOR(), and DBC_MEM_FUN() macros to specify contracts for constructors, destructor, and member functions respectively.

+Invariants

+The DBC_INVARIANT() macro is used to specify the class invariants.

+It is also possible to write the function that checks the class invariants directly naming it using the DBC_INVARIANT_FUN macro. However, this approach is highly discourage and DBC_INVARIANT() should be used whenever possible.

+Base Object

+All classes for which a contract is specified must privately inherit from the dbc::object class. This is achieved using the DBC_INHERIT_OBJECT() macro, or the DBC_MULTI_INHERIT_OBJECT() macro in case of multiple inheritance.

+Macro Parameters with Commas

+The DBC_MPARAM() macro can be used to pass a macro parameter with one or more comma "," . (This is required because of a limitation of the C++ preprocessor that only recognizes the () parenthesis so a comma in a macro parameter not wrapped by these parenthesis will split the parameter into two different macro parameters.)

+Assertions

+The DBC_ASSERTION() macro can be used to specify contract assertions. The DBC_ASSERTION_STREAM() macro can also be used and it allows the programmers to specify a more verbose error message and an action (throw, terminate, or exit) different from DBC_CONFIG_DEFAULT_ON_ASSERTION_VIOLATION to take in case of an assertion failure.

+Run-time assertion checking can be selectively turned on or off depending on the action in case of assertion failure using DBC_CONFIG_ENABLE_THROWING_ASSERTIONS, DBC_CONFIG_ENABLE_EXITING_ASSERTIONS, or DBC_CONFIG_ENABLE_TERMINATING_ASSERTIONS.

+These macros are wrappers around dbc::assertion and dbc::oassertionstream. These assertion classes can be used directly but it is recommended to use the macros whenever possible to gain the benefits of automatic contract documentation, run-time assertion checking enabling and disabling using DBC_CONFIG_ENABLE_..._ASSERTIONS, etc.

+Default Exceptions

+By default, a precondition failure throws a dbc::precondition_violation exception, a postcondition failure throws a dbc::postcondition_violation exception, and an invariant violation throws a dbc::invariant_violation exception. All these exceptions inherit from dbc::condition_violation which in turns inherits from std::logic_exception.

+In case an invariant failure attempts to throw an exception when checked by the destructor, no exception is thrown and dbc::broken_destructor_invariant() is called instead (this is to comply with C++ STL exception safety requirements). The dbc::set_broken_destructor_invariant() can be used to specify a different function to be executed to handle this case.

+Separating Declartion and Definition

+Contracts are written together with the class declaration as they are part of the class specification. The member function definition (the body) can either be provided together with the contract in the class declaration or the DBC_BODY() macro can be used to separate the function definition from its declaration.

+Similarly, the DBC_DESTRUCTOR_BODY() and DBC_OPERATOR_BODY() macros can be used to separate body definitions from contract declarations for destructor and member operators respectively. For constructors, the special init() function should be used instead -- see DBC_CONSTRUCTOR() for more detail.

+In general, it is recommended to split body definitions from contract declarations when possible as this will make the class declaration simpler and easier to read plus the compile-time errors in the body code will be more readable because the code will not be passed as a single-lined macro parameter. In addition, this library will only modify the definition by adding the DBC_BODY() macro (or similar) to the function name so the majority of the C++ code (which is the implementation code contained in the declaration) is only slightly altered by the used of this library.

+The "old" Postfix

+In the signature argument of the macro-based API, the DBC_COPYABLE() macro is used to indicate either a copyable class or function argument type for which the value before the body execution needs to be accessed in the postconditions using the "old" postfix. For the code-based API, dbc::copyable should be used instead.

+In general, indicating a type copyable adds the extra requirement that the type must have a copy constructor and it has an impact on performances due the CPU time and memory required for the copy. Therefore, a type should be indicated copyable only if the "old" prefix for the variable of that type is needed to write the postconditions.

+Subcontracting

+In the signature argument of the code-based API, the DBC_BASE() macro is used to specify a base class from which the contract is subcontracted. For the code-based API, the B argument of dbc::fun::mem should be used instead.

+

Warning:
When invoking the base class member function from the overriding function, you must use the DBC_BODY() macro to refer to the base function in order to avoid infinite recursion. The library implementation might change in the future so to relax this requirement.
+

+Optional Contract Compilation

+The DBC_NO, DBC_CHECK_REQUIRE, DBC_CHECK_ENSURE, DBC_CHECK_INVARIANT, and DBC_ALL macro symbols can be used to respectively compile and check either nothing, preconditions, postcondition, invariants, or all the above. If on of these macro symbols is defined, the relative contract part (preconditions, postconditions, or invariants) are compiled and checked, otherwise the relative contract part is not compiled at all and it will not be part of the object code (therefore, it will not be checked).

+Any logically consistent combination of these macro symbols can be used as well. For example, defining both DBC_CHECK_REQUIRE and DBC_CHECK_INVARIANT will compile and check both preconditions and invariants. However, defining DBC_NO and DBC_CHECK_REQUIRE will cause a compile-time error as this is an logically inconsistent combination.

+Automatic Contract Documentation

+This library macro-based API automatically generates the contract documentation using doxygen. For example, to generate the source code documentation for A Complete Example as shown here, you can run doxygen as follows:

+

+[$DBC_ROOT]$ doxygen doc/src/Doxyfile.str
+

+Where "doc/src/Doxyfile.str" is the doxygen configuration file with some specific settings (see below) to work together with this library.

+

    +
  1. You can use `$ doxygen -g' to generate the default doxygen configuration file Doxyfile for your project.
  2. Edit the Doxyfile to make any modification needed by your project (e.g., specify OUTPUT_DIRECTORY, INPUT and RECURSIVE, enable JAVADOC_AUTOBRIEF, select QUIET, disable GENERATE_LATEX, ... see doxygen documentation for more information).
  3. Then edit the Doxyfile to make the following modifications that are necessary to make doxygen work with this library.
      +
    1. Specify MACRO_EXPANSION = YES.
    2. Add the path of dbc.hpp to INCLUDE_PATH (depending on where you installed this library, this path could be "/usr/include" or similar).
    3. Add the DBC_DOC symbol to PREDEFINED.
    +
+

+In short, the above configuration tells doxygen to expand macros, where this library source is, and to define the DBC_DOC symbol. Then, when doxgyen is executed, the DBC_DOC macro symbol is defined, and this library macro-based API automatically expand to the contract documentation using DBC_CONFIG_DOC_ASSERTION, DBC_CONFIG_DOC_REQUIRE, DBC_CONFIG_DOC_ENSURE, and DBC_CONFIG_DOC_INVARIANT.

+

Remarks:
By default, the DBC_CONFIG_DOC_... macros expand in code documentation comments that can be interpreted by doxygen as the are of the form /** ... and they use the doxygen documentation tags @pre, @post, and @invariant (see doxygen documentation for more details). In principle, it should be possible for the user to define these DBC_CONFIG_DOC_... macro differently to support a different documentation tool (doxygen is the documentation tool most commonly used for C++).
+

+Configuration

+The library can be configured at compile-time defining the DBC_CONFIG_... macro symbols. If defined by the user, these symbols must be defined either in the code before the first inclusion of the library or by the compiler (use the -D and -U options for g++). If the user does not define these symbols, the library uses default values.

+These configuration symbols allow to highly customize the library behaviour, indicating what type of assertion to check at run-time, where to log messages, the log verbosity level, how to automatically generate documentation (to use a documentation tool different from doxygen), what is the maximum number of function arguments for which contracts should be supported, etc.

+See the dbc/config.hpp documentation for details.

+Code-Based API

+The code-based API uses dbc::fun::constr, dbc::fun::destr, and dbc::fun::mem directly to write contracts (instead of using the DBC_CONSTRUCTOR(), DBC_DESTRUCTOR(), and DBC_MEM_FUN() of the macro-based API). However, the use of the macro-based API is preferred and the code-based API should only be used when the macro-based API does not suffice.

+When using the code-based API, it is recommended to use the DBC_CONTRACT() macro to name the contract class as this will allow to subcontract between contracts written with the code-based API and others written with the macro-based API.

+The following is the same example introduced in A Complete Example but rewritten to use the code-based API instead of the macro-based API (from "example/str/str-codeapi.cpp").

+

/**
+ * @file
+ * @author Copyright (C) 2009 Lorenzo Caminiti.
+ *  Distributed under DBC++ Software License (see file LICENSE_1_0.txt).
+ */
+
+#include <dbc.hpp>
+#include <cstring>
+#include <iostream>
+
+/** 
+ * Demonstrate the use of Design By Contract for C++ code-based API
+ * implementing a simple of string type. 
+ * Compared with the macro-based API, the code-based API gives much more
+ * control to programmer and allows to see how the library works, but it
+ * requires to write much more "setup" code reducing code readability and it
+ * does not provide automatic contract documentation. Therefore, the code-based
+ * API should be used only when the macro-based API does not suffice.
+ * @see "example/str/str.cpp" for same example using macro-based API.
+ */
+class str DBC_INHERIT_OBJECT(str) { // Derive from dbc::object (using macro).
+public:
+    /** Max limit on string length. */
+    static const size_t MAX_SIZE = 16000;
+
+    /**
+     * Construct from C-style null-terminated string.
+     * @param[in] chars C-style null-terminated string.
+     */
+    str(const char* chars): size_(), chars_()
+    // Instead of DBC_CONSTRUCTOR( (public) (str)( (const char*)(chars) ), ... .
+#ifdef DBC // Complely remove contract from object code if no DBC_CHECK_... .
+        // Using DBC_CONTRACT() macro to name contract classes ensures allows
+        // subcontracting between contracts specified with macro and code API.
+    {
+        DBC_CONTRACT( (init)(chars) ) contract;
+        contract.call(*this, &str::DBC_BODY(init), chars, "init");
+    }
+protected:
+    friend class DBC_CONTRACT( (init)(chars) ); // Not need on modern compilers.
+    class DBC_CONTRACT( (init)(chars) ): public dbc::fun<void, 
+            const char*>::constr<str> {
+        void require(/* no self */ const char* chars) {
+            // Constructor preconditions.
+            size_t size = strlen(chars); // Code allowed (but keep it simple).
+            // Use DBC_ASSERT() or DBC_ASSERT_STREAM() to assert conditions.
+            DBC_ASSERT(size >= 0 && size < str::MAX_SIZE, "size in range");
+        }
+        void ensure(const dbc::post<str>& self,
+                const dbc::post<char*>& chars) {
+            // Constructor postconditions.
+            DBC_ASSERT(self.now.size() == strlen(chars.now), "size set");
+            DBC_ASSERT(strncmp(self.now.chars_, chars.now,
+                    self.now.size()) == 0, "chars set");
+        }
+    };
+    // Body function named using DBC_BODY() macro.
+    void DBC_BODY(init)(const char* chars)
+#endif // DBC
+    { // Use ';' for body impl. when separating declaration from definition.
+        // Constructor body.
+        size_ = strlen(chars);
+        chars_ = new char[size_];
+        strncpy(chars_, chars, size_);
+    }
+public: // Restore original access level.
+    
+    /**
+     * Copy constructor. 
+     * @param[in] other Other string object.
+     */
+    str(const str& other): size_(), chars_()
+#ifdef DBC
+    {
+        DBC_CONTRACT( (init)(other) ) contract;
+        contract.call(*this, &str::DBC_BODY(init), other, "init");
+    }
+protected:
+    friend class DBC_CONTRACT( (init)(other) );
+    class DBC_CONTRACT( (init)(other) ): public dbc::fun<void, 
+            const str&>::constr<str> {
+        void require(const str& other) {
+            DBC_ASSERT(other.size() >= 0 && other.size() < str::MAX_SIZE,
+                    "size in range");
+        }
+        void ensure(const dbc::post<str>& self,
+                const dbc::post<str>& other) {
+            DBC_ASSERT(self.now.size() == other.now.size(), "size set");
+            DBC_ASSERT(strncmp(self.now.chars_, other.now.chars_,
+                    self.now.size()) == 0, "chars set");
+        }
+    };
+    void DBC_BODY(init)(const str& other)
+#endif // DBC
+    {
+        delete[] chars_;
+        size_ = other.size_;
+        chars_ = new char[size_];
+        strncpy(chars_, other.chars_, size_);
+    }
+public: // Restore original access level.
+    
+    /** Destroy. */
+    virtual ~str()
+    // Instead of DBC_DESTRUCTOR( (public) (virtual) (str)(), ...).
+#ifdef DBC
+    {
+        DBC_CONTRACT( (del) ) contract;
+        contract.call(*this, &str::DBC_BODY(del), "del");
+    }
+    friend class DBC_CONTRACT( (del) );
+    class DBC_CONTRACT( (del) ): public dbc::fun<void>::destr<str> {
+        // No preconditions and no postconditions.
+    };
+    void DBC_BODY(del)()
+#endif // DBC
+    { delete[] chars_; } // Invariant already checked chars_ != 0.
+public: // Restore original access level.
+
+    /**
+     * Return character at specified index.
+     * @param[in] index Index position.
+     * @return str's character at specified position.
+     */
+    char& operator[](const size_t& index)
+    // Instead of DBC_MEM_FUN( (public) (char&) DBC_COPYABLE(str) (operator_at)
+    // ( (const size_t&)(index) ), ...).
+#ifdef DBC
+    {
+        DBC_CONTRACT( (operator_at)(index) ) contract;
+        return contract.call(*this,  &str::DBC_BODY(operator_at), index,
+                "operator_at");
+    }
+protected:
+    friend class DBC_CONTRACT( (operator_at)(index) );
+    class DBC_CONTRACT( (operator_at)(index) ): public dbc::fun<char&, 
+            // dbc::copyable<> used instead of DBC_COPYABLE().
+            const size_t&>::mem<dbc::copyable<str> > {
+        void require(const str& self, const size_t& index) {
+            // Member function preconditions.
+            DBC_ASSERT(index >= 0 && index < self.size(), "index in range");
+        }
+        void ensure(const dbc::post<dbc::copyable<str> >& self, 
+                const dbc::post<size_t>& index, const char& result) {
+            // Member function postconditions.
+            // Not a const mem fun, use 'self.old' for object before body.
+            DBC_ASSERT(result == self.old.chars_[index.now],
+                    "returning char at index");
+        }
+    };
+    char& DBC_BODY(operator_at)(const size_t& index)
+#endif // DBC
+    {
+        // Member function body.
+        return chars_[index];
+    }
+public: // Restore original access level.
+
+    /**
+     * Return size (total number of characters).
+     * @return str's size.
+     */
+    size_t size() const
+    // Instead of DBC_MEM_FUN( (public) (size_t) (str) (size)() (const), ...).
+#ifdef DBC
+    {
+        DBC_CONTRACT( (size) ) contract;
+        return contract.call(*this, &str::DBC_BODY(size), "size");
+    }
+protected:
+    friend class DBC_CONTRACT( (size) ); // No need on moder compilers.
+    class DBC_CONTRACT( (size) ): public dbc::fun<size_t>::mem<
+            const str /* const class type because const mem fun */> {
+        void require(const str& self) {} // No preconditions.
+        void ensure(const dbc::post<str>& self, const size_t& result) {
+            DBC_ASSERT(result == self.now.size_, "returning size");
+        }
+    };
+    size_t DBC_BODY(size)() const
+#endif // DBC
+    { 
+        return size_; 
+    }
+public: // Restore original access level.
+
+private:
+    /** Internal string size. */
+    size_t size_; // Unsgined so size_ >= 0 check could be removed...
+    /** Internal string representation. */
+    char* chars_;
+
+    // Invariants are still specified using macro.
+    DBC_INVARIANT(str, {
+        // Invariants.
+        DBC_ASSERT(self.chars_ != 0, "chars exist");
+        DBC_ASSERT(self.size_ >= 0 && self.size_ < str::MAX_SIZE,
+                "size in range");
+    })
+};
+
+/** Main program. */
+int main() {
+    std::cout << std::endl << "init()..." << std::endl;
+    str s("Galileo Galilei");
+
+    std::cout << std::endl << "operator[](0)..." << std::endl;
+    std::cout << s[0] << std::endl;
+
+    std::cout << std::endl << "del()..." << std::endl;
+    return 0;
+}
+
+

+On Linux, it can be complied and executed similarly to A Complete Example.

+Comparing it with the same example written the macro-based API, note how the code-based API introduce much more code that reduce the contract readability, it requires much more work for the programmer, it does not automatically document the contract but it allows to better understand how the library checks the contracts.

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/annotated.html b/doc/html/annotated.html new file mode 100755 index 00000000..3f1bbd35 --- /dev/null +++ b/doc/html/annotated.html @@ -0,0 +1,54 @@ + + +Class List + + + + + +
+

Class List

Here are the classes, structs, unions and interfaces with brief descriptions: + + + + + + + + + + + + + + + + + + + + +
dbc::assertionClass to write assertions
dbc::condition_violationBase class for all contract violation exceptions
dbc::copyable< T >Indicate the specified type is copyable to support the "old" postfix in postconditions
dbc::exitModifier to cause an assertion-stream to exit the program with the specified code
dbc::fun< R, A0, A1, >Template used by the code-based API to specify contracts for functions with given return type and (optional) argument types
dbc::fun< R, A0, A1, >::constr< C >Template used by the code-based API to specify contracts for constructors of the given class
dbc::fun< R, A0, A1, >::destr< C >Template used by the code-based API to specify contracts for the destructor of the given class
dbc::fun< R, A0, A1, >::mem< C, B >Template used by the code-based API to specify contracts for functions members of the given class and eventually subcontracting from the given base contract class
dbc::invariat_violationException thrown by default on invariant failure
dbc::oassertionstreamClass to write assertions reporting verbose error messages
dbc::object< C >Any class with a contract must privately inherit from this base object class
dbc::post< T >Postcondition argument types to support the "old" postfix
dbc::dbc::post< copyable< T * > >Postcondition argument pointer types to support the "old" postfix
dbc::dbc::post< copyable< T > >Postcondition argument types to support the "old" postfix
dbc::dbc::post< T * >Postcondition argument pointer types to support the "old" postfix
dbc::postcondition_violationException thrown by default on postcondition failure
dbc::precondition_violationException thrown by default on precondition failure
dbc::raise< E >Modifier to cause an assertion-stream to throw the specified exception
dbc::terminateModifier to cause an assertion-stream to terminate the program
dbc::uraise< E >Modifier to cause an assertion-stream to throw the specified exception
+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/assertion_8hpp.html b/doc/html/assertion_8hpp.html new file mode 100755 index 00000000..ff32fcb6 --- /dev/null +++ b/doc/html/assertion_8hpp.html @@ -0,0 +1,220 @@ + + +dbc/assertion.hpp File Reference + + + + + +
+

dbc/assertion.hpp File Reference

Header file to only include facilities for assertions. More... +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Namespaces

namespace  dbc

Classes

class  dbc::assertion
 Class to write assertions. More...
class  dbc::oassertionstream
 Class to write assertions reporting verbose error messages. More...
class  dbc::raise< E >
 Modifier to cause an assertion-stream to throw the specified exception. More...
class  dbc::uraise< E >
 Modifier to cause an assertion-stream to throw the specified exception. More...
class  dbc::exit
 Modifier to cause an assertion-stream to exit the program with the specified code. More...
class  dbc::terminate
 Modifier to cause an assertion-stream to terminate the program. More...

Defines

#define DBC_ASSERT(condition, label)
 Assert the specified condition, intended to be used to assert preconditions, postconditions, and invariants.
#define DBC_ASSERT_STREAM(condition, label, stream_error)
 Assert the specified condition allowing to indicate the action to take in case the condition is false, intended to be used to assert preconditions, postconditions, and invariants.
+


Detailed Description

+Header file to only include facilities for assertions. +

+


Define Documentation

+ +
+
+ + + + + + + + + + + + +
#define DBC_ASSERT (condition,
label   ) 
+
+
+ +

+Assert the specified condition, intended to be used to assert preconditions, postconditions, and invariants. +

+This macro expands to code that uses dbc::assertion to assert the specified condition with the specified label. The macros __FILE__ and __LINE__ are automatically used to indicate the location of the assertion, and the condition's code is used for the description message. Furthermore, the assertion generated by this macro is automatically documented (see Automatic Contract Documentation).

+In case the asserted condition is false, this macro will either throw a dbc::condition_violation exception (default), call C++ exit(), or call C++ std::terminate() depending on the value of DBC_CONFIG_DEFAULT_ON_ASSERTION_VIOLATION.

+For an example (from A Complete Example):

  #include <dbc.hpp>
+  
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      char& operator[](const size_t& index)
+      DBC_MEM_FUN( (public) (char&) DBC_COPYABLE(str)
+              (operator_at)( (const size_t&)(index) ), {
+          // Member function preconditions.
+          DBC_ASSERT(index >= 0 && index < self.size(), "index in range");
+      }, {
+          // Member function postconditions.
+          // Not a const mem fun, use 'self.old' for object before body.
+          DBC_ASSERT(result == self.old.chars_[index.now],
+                  "returning char at index");
+      }, {
+          // Member function body.
+          return chars_[index];
+      })
+      
+  private:
+      char* chars_;
+      ...
+  };
+

+

Remarks:
This macro is mainly used for convenience to avoid repeating __FILE__ and __LINE__, avoid writing the #ifdef DBC guard by hand, and to support automatic contract documentation. It is recommended to use this macro instead of using dbc::assert directly. For example:
      #include <dbc.hpp>
+      ...
+      
+      DBC_ASSERT(1 < 2, "1 less than 2")
+
is essentially equivalent to
      #include <dbc.hpp>
+      ...
+ 
+      #ifdef DBC
+      dbc::assert(1 < 2, "1 less than 2", __FILE__, __LINE__,
+              "1 < 2").raise();
+              // or .exit(1), or .terminate() depending on
+              // DBC_CONFIG_DEFAULT_ON_ASSERTION_VIOLATION.
+      #endif // DBC
+
+
Parameters:
+ + + +
[in] condition A C++ expression that evaluates to a bool value.
[in] label A C++ std::string shortly describing the assertion in a human readable form.
+
+
Returns:
If preconditions, postconditions, or invariants are checked (DBC_CHECK_REQUIRE_, DBC_CHECK_ENSURE, or DBC_CHECK_INVARIANT symbols are defined at compile-time), this macro expands to code that assert the specified condition using from dbc::assertion. Otherwise, this macro expands to nothing.
+
See also:
To specify the action to take on condition violation, use DBC_ASSERT_STREAM().

+Use DBC_CONFIG_ENABLE_THROWING_ASSERTIONS, DBC_CONFIG_ENABLE_EXITION_ASSERTIONS, DBC_CONFIG_ENABLE_TERMINATING_ASSERTIONS to enable or disable run-time checking of assertions that throw, exit, or terminate respectively.

+ +
+

+ +

+
+ + + + + + + + + + + + + + + +
#define DBC_ASSERT_STREAM (condition,
label,
stream_error   ) 
+
+
+ +

+Assert the specified condition allowing to indicate the action to take in case the condition is false, intended to be used to assert preconditions, postconditions, and invariants. +

+This macro expands to code that uses dbc::assertionstream to assert the specified condition with the specified label. The macros __FILE__ and __LINE__ are automatically used to indicate the location of the assertion, and the condition's code is used for the description message. Furthermore, the assertion generated by this macro is automatically documented (see Automatic Contract Documentation).

+In case the asserted condition is false, this macro will execute the specified stream_error code expression. In this code expression, the dbc::assertionstream object can be accessed via the declared local variable err automatically declared by the macro. The stream_error can be used to specify a more descriptive error message (printing variable values, etc) and also to specify the action to take in case of assertion violation using dbc::raise, dbc::uraise, dbc::exit, or dbc::terminate. If no action is taken by stream_error, the default action specified by DBC_CONFIG_DEFAULT_ON_ASSERTION_VIOLATION is taken.

+For an example (adapted from A Complete Example):

  #include <dbc.hpp>
+  #include <stdexcept>
+  
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      char& operator[](const size_t& index)
+      DBC_MEM_FUN( (public) (char&) DBC_COPYABLE(str)
+              (operator_at)( (const size_t&)(index) ), {
+          // Member function preconditions.
+          // Log detailed error message and throw user defined exception.
+          DBC_ASSERT_STREAM(index >= 0 && index < self.size(),
+                  "index in range", err << "index " << index
+                  << " not in range [0, " << self.size() << ")"
+                  << dbc::uraise<std::out_of_range>(
+                  std::out_of_range(err.str()));
+      }, {
+          ... // Member function postconditions.
+      }, {
+          ... // Member function body.
+      })
+  
+      ...
+  };
+
Similarly:
  #include <dbc.hpp>    
+  ...
+  
+  const int count = -1;
+  // On violation do as from DBC_CONFIG_DEFAULT_ON_ASSERTION_VIOLATION.
+  DBC_ASSERT(count > 0, "count positive");
+  // Same action as above but prints count in error message.
+  DBC_ASSERT_STREAM(count > 0, "count positive",
+          err << "count " << count << " negative");
+  // Throws dbc::condition_violation and prints count in error message.
+  DBC_ASSERT_STREAM(count > 0, "count positive",
+          err << "count " << count << " negative" << dbc::raise());
+  // Throws user's defined int(-1) exception.
+  DBC_ASSERT_STREAM(count > 0, "count positive",
+          err << dbc::uraise<int>(int(count)));
+  // Exits with code 5.
+  DBC_ASSERT_STREAM(count > 0, "count positive", err << dbc::exit(5));
+  // Terminates.
+  DBC_ASSERT_STREAM(count > 0, "count positive", err << dbc::terminate());
+

+

Parameters:
+ + + + +
[in] condition A C++ expression that evaluates to a bool value.
[in] label A C++ std::string shortly describing the assertion in a human readable form.
[in] stream_error A code expression where the dbc::assertionstream object can be accessed via the local variable err.
+
+
Returns:
If preconditions, postconditions, or invariants are checked (DBC_CHECK_REQUIRE_, DBC_CHECK_ENSURE, or DBC_CHECK_INVARIANT symbols are defined at compile-time), this macro expands to code that assert the specified condition using from dbc::assertionstream. Otherwise, this macro expands to nothing.
+
See also:
If there is no need for a more descriptive error message or to specify the action to take on condition violation, use the simpler DBC_ASSERT().

+Use DBC_CONFIG_ENABLE_THROWING_ASSERTIONS, DBC_CONFIG_ENABLE_EXITIONG_ASSERTIONS, DBC_CONFIG_ENABLE_TERMINATING_ASSERTIONS to enable or disable run-time checking of assertions that throw, exit, or terminate respectively.

+ +
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/body_8hpp.html b/doc/html/body_8hpp.html new file mode 100755 index 00000000..0c715dd6 --- /dev/null +++ b/doc/html/body_8hpp.html @@ -0,0 +1,219 @@ + + +dbc/body.hpp File Reference + + + + + +
+

dbc/body.hpp File Reference

Header file to only include facilities to split body definition from contract declaration. More... +

+ + + + + + + + + + + + +

Defines

#define DBC_BODY(function_name)
 This macro expands to the body function name, it is used to separate the body implementation from its contract specification.
#define DBC_OPERATOR_BODY(operator_symbol, operator_name)
 This macro expands to the operator body function name, it is used to separate the body implementation from its contract specification for operators.
#define DBC_DESTRUCTOR_BODY(class_name)
 This macro expands to the destructor body function name, it is used to separate the body implementation from its contract specification for destructors.
+


Detailed Description

+Header file to only include facilities to split body definition from contract declaration. +

+


Define Documentation

+ +
+
+ + + + + + + + + +
#define DBC_BODY (function_name   ) 
+
+
+ +

+This macro expands to the body function name, it is used to separate the body implementation from its contract specification. +

+This library requires contracts to be listed together with the class declaration as they are part of the code specification (as proposed in [Ott04]). Specifically, class invariants are listed with the class declaration, preconditions and postconditions are listed with the constructor, destructor, and member function declaration. The function body instead is part of the implementation and it can be defined either together with the contract declaration or separately (this is to maintain the C++ ability to separate a function definition from its declaration).

+If you want to separate declaration and definition, you can specify ; as the function body in the contract declaration (as you would normally do in C++) and then define the body separately wrapping the function name with this macro.

+For example, in A Complete Example all bodies are defined together with their declarations. That example can be reworked as follow to separate body definitions from their declarations:

  #include <dbc.hpp>
+  
+  // Specification (could be in a header file .hpp).
+  
+  class str DBC_INHERIT_OBJECT(str) { // Class declaration.
+  public:
+      // Member function declaration (signature and contract specification).
+      size_t size() const
+      DBC_MEM_FUN( (public) (size_t) (str) (size)() (const), {
+          ... // Preconditions here (keep it simple).
+      }, {
+          ... // Postconditions here (keep it simple).
+      }, ;) // ';' indicates body not defined here. 
+  
+  private:
+      size_t size_;
+      ...
+  };
+  
+  ...
+  
+  // Implementation (could be in a separate code file .cpp).
+  
+  // Member function definition (body implementation).    
+  size_t std::DBC_BODY(size)() const {
+      // Body definition here.
+      return size_;
+  }
+

+

Note:
In C++ a function is declared when its signature is specified, and it is defined when its implementation is given (see [Str97]). A common reason for separating a function definition from its declaration is to avoid recompiling the function implementation every time. That is usually achieved by listing the declaration in an header file (.hpp) and the definition in a separate code file (.cpp), then the code file is compiled only if the function implementation changes. For example, the header file "add.hpp" would contain the specification:
      // File: "add.hpp".
+      
+      int add(const int& a, const int& b); // Declaration (specification).
+
While the code file "add.cpp" would contain the implementation:
      // File: "add.cpp".
+ 
+      #include "add.hpp"
+ 
+      int add(const int& a, const int& b) { // Definition (implementation).
+          return a + b;
+      }
+
Programs would include the header file and be linked with the object file separately compiled from the code file.
+
Parameters:
+ + +
[in] function_name The function name.
+
+
Returns:
If preconditions, postconditions, or invariants are checked (DBC_CHECK_REQUIRE_, DBC_CHECK_ENSURE, or DBC_CHECK_INVARIANT symbols are defined at compile-time), this macro expands to a special name for the body function (the actual name is implementation specific). Otherwise, this macro simply expands to the specified function name.
+
See also:
Operators and destructors require the special macros DBC_OPERATOR_BODY() and DBC_DESTRUCTOR_BODY() because their names contain special symbols.

+Constructor require the use of the special init() function because of member initializers as discussed in DBC_CONSTRUCTOR().

+ +
+

+ +

+
+ + + + + + + + + +
#define DBC_DESTRUCTOR_BODY (class_name   ) 
+
+
+ +

+This macro expands to the destructor body function name, it is used to separate the body implementation from its contract specification for destructors. +

+Functionally this macro is equivalent to DBC_BODY() (see related documentation) but it handles the special destructor name that is inferred from the class name.

+For example, reworking the A Complete Example to separate body definitions from their implementations:

  #include <dbc.hpp>
+  
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      virtual ~str() // Declaration.
+      DBC_DESTRUCTOR( (public) (virtual) (str)(), ;)  // ';' for body defined
+                                                      // later.
+  
+  private:
+      char* chars_;
+      ...
+  };
+  
+  char& str::DBC_DESTRUCTOR_BODY(str)() { // Definition.
+      // Body definition here.
+      delete[] chars_;
+  }
+
Parameters:
+ + +
[in] class_name The class name (the plain type name, no namespace prefix, no template parameters, etc).
+
+
Returns:
If preconditions, postconditions, or invariants are checked (DBC_CHECK_REQUIRE_, DBC_CHECK_ENSURE, or DBC_CHECK_INVARIANT symbols are defined at compile-time), this macro expands to a special name for the destructor body function (the actual name is implementation specific). Otherwise, this macro expands to the destructor name ~class_name.
+
See also:
DBC_BODY() for more information.
+ +
+

+ +

+
+ + + + + + + + + + + + +
#define DBC_OPERATOR_BODY (operator_symbol,
operator_name   ) 
+
+
+ +

+This macro expands to the operator body function name, it is used to separate the body implementation from its contract specification for operators. +

+Functionally this macro is equivalent to DBC_BODY() (see related documentation) but it handles the special operator symbols (==, <, etc) which cannot be treated as the regular function names that only contain letters and numbers.

+For example, reworking the A Complete Example to separate body definitions from their implementations:

  #include <dbc.hpp>
+  
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      char& operator[](const size_t& index) // Declaration.
+      DBC_MEM_FUN( (public) (char&) DBC_COPYABLE(str)
+              (operator_at)( (const size_t&)(index) ), {
+          ... // Member function preconditions.
+      }, {
+          ... // Member function postconditions.
+      }, ;) // ';' indicates body not defined here.
+  
+  private:
+      char* chars_;
+      ...
+  };
+  
+  // Definition (must use same 'operator_at' name as in contract declaration).
+  char& str::DBC_OPERATOR_BODY(operator[], operator_at)(const size_t& index) {
+      // Body definition here.
+      return chars_[index];
+  }
+
Parameters:
+ + + +
[in] operator_symbol The operator name with symbols (e.g., operator == , operator<, etc).
[in] operator_name The operator name without symbols. This name is arbitrary but it must match the one specified in the contract declaration and it is recommended to still use the operator word as prefix (e.g., operator_equal, operator_less, etc).
+
+
Returns:
If preconditions, postconditions, or invariants are checked (DBC_CHECK_REQUIRE_, DBC_CHECK_ENSURE, or DBC_CHECK_INVARIANT symbols are defined at compile-time), this macro expands to a special name for the specified operator body function operator_name (the actual name is implementation specific). Otherwise, this macro expands to the specified operator_symbol.
+
See also:
DBC_BODY() for more information.
+ +
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/bug.html b/doc/html/bug.html new file mode 100755 index 00000000..24e52030 --- /dev/null +++ b/doc/html/bug.html @@ -0,0 +1,80 @@ + + +Annex: Known Bugs + + + + + +
+

Annex: Known Bugs

List of library known bugs.

+

    +
  1. I have seen GCC internal segfaul error if DBC_CONFIG_MAX_ARGC is more than 3 some some of the DBC++ test programs... I wonder is the compiler gets confused by fun<...> instead of fun0, fun1, ... (maybe the template specialization with partial default argument is not properly supported...).
    +
    +
  2. When invoking parent's function directly from overriden function, must use DBC_BODY() to avoid infinite recursive checking of contract. See NameList example.
        struct B DBC_INHERIT_OBJECT(B) {
    +        virtual void f() DBC_MEM_FUN(..., {})
    +        ...
    +    };
    +    struct D: public B DBC_TRAILING_OJECT(D) {
    +        virtual void f() DBC_MEM_FUN(..., { B::DBC_BODY(f)(); })
    +        // This instead, will cause infinite contract checking recursion.
    +        virtual void f() DBC_MEM_FUN(..., { B::f(); })
    +        ...
    +    };
    +
    +Begin program:
    +#876 0x0804948c in main () at ./test/Subcontracting/class_subcontracts_class.cpp:7
    +
    +Call to f(x) on an instance of derived:
    +#875 0x08050386 in derived::f (this=0xffd3bb38, x=@0xffd3bb4c) at ./test/Subcontracting/class_subcontracts_class.hpp:12
    +
    +Check invariant
    +#874 0x0804ebca in dbc::fun<int, int const&, dbc::none_, dbc::none_>::mem<derived const, base::dbc_f_x>::operator() (this=0xffd3bae4, self=@0xffd3bb38,
    +    body=&virtual derived::dbc_body_f_(int const&) const, arg0=@0xffd3bb4c, the_fun_name=@0xffd3baf8) at ./include/dbc/fun.hpp:228
    +
    +Check requires contract:
    +#873 0x0804e93a in dbc::fun<int, int const&, dbc::none_, dbc::none_>::mem<derived const, base::dbc_f_x>::call (this=0xffd3bae4, self=@0xffd3bb38,
    +    body=&virtual derived::dbc_body_f_(int const&) const, arg0=@0xffd3bb4c, the_fun_name=@0xffd3baf8, pre_invariant_check=@0xffd3ba97,
    +    require_check=@0xffd3ba96, post_invariant_check=@0xffd3ba95, ensure_check=@0xffd3ba94) at ./include/dbc/fun.hpp:465
    +
    +Run actual body of DBC, which calls base's f(x):
    +#872 0x0804a1bc in derived::dbc_body_f_ (this=0xffd3bb38, x=@0xffd3bb4c) at ./test/Subcontracting/class_subcontracts_class.hpp:28
    +
    +Call to f(x) on base class:
    +#871 0x0804a126 in base::f (this=0xffd3bb38, x=@0xffd3bb4c) at ./test/Subcontracting/base_class.hpp:11	
    +
    +Check invariant (skips because it's nested):
    +#870 0x0804d5be in dbc::fun<int, int const&, dbc::none_, dbc::none_>::mem<base const, dbc::fun<int, int const&, dbc::none_, dbc::none_>::no_base<base const> >::operator() (this=0xffd3b844, self=@0xffd3bb38, body=&virtual base::dbc_body_f_(int const&) const, arg0=@0xffd3bb4c, the_fun_name=@0xffd3b858)
    +    at ./include/dbc/fun.hpp:228
    +
    +Check requires on base:
    +#869 0x0804d32e in dbc::fun<int, int const&, dbc::none_, dbc::none_>::mem<base const, dbc::fun<int, int const&, dbc::none_, dbc::none_>::no_base<base const> >::call (this=0xffd3b844, self=@0xffd3bb38, body=&virtual base::dbc_body_f_(int const&) const, arg0=@0xffd3bb4c, the_fun_name=@0xffd3b858,
    +    pre_invariant_check=@0xffd3b7f7, require_check=@0xffd3b7f6, post_invariant_check=@0xffd3b7f5, ensure_check=@0xffd3b7f4) at ./include/dbc/fun.hpp:465
    +
    +PROBLEM: base's f(x) is defined as: { return dbc_f_x()(*this, &base::DBC_BODY(f), x, "f"); } - but since dbc_f_x() is getting a reference to the function, it follows the
    +trail of virtual inheritance and actually calls derived's f(x):
    +#868 0x0804a1bc in derived::dbc_body_f_ (this=0xffd3bb38, x=@0xffd3bb4c) at ./test/Subcontracting/class_subcontracts_class.hpp:28	
    +
    +We ran derived's body, so now we're back at base and the recursion begins:
    +#867 0x0804a126 in base::f (this=0xffd3bb38, x=@0xffd3bb4c) at ./test/Subcontracting/base_class.hpp:11
    +
    This is quite annoying as a small developper error in omitting DBC_BODY() in this context will result in a infinite recursion a run-time!!! Can I avoid this somehow??? Can I check it a compile-time? Can I make it work even if calling w/out DBC_BODY()? Also, what happens if the body function is not declared virtual but only the actual function is declared virtual? More in general than above todo, how shall DbC handle recursion? Shall contract checking always be disabled when a function recursively invokes itself? Maybe not, since it might invoke itself w/ different arguments and w/ obj in a different state (is it is not a const mem fun)... What is Eiffel policy on DbC and recursion?
    +
    +
  3. When constrcutor contract is delegated to init() initializer, the contract does not show up in Doxygen... that is because constr (which are public) have no contract, while init() has the contract but it is private... is there a way around this? Since Doxygen reports the header files, the contract code (for init() also) is in the reported header but that's not ideal... It'd be nice if I could say in the Doxyfile to report init() (and del()) doc even if they are private...
    +
    +
  4. Investigate limitation when subcontracting with multiple inheritance from base templates with same variable name (as its type depends on template param). This currently requires either direct use of DBC_BODY() (which prevents further subcontracting) or use of code API... but macro APIs fail.
+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1assertion-members.html b/doc/html/classdbc_1_1assertion-members.html new file mode 100755 index 00000000..5d4135dd --- /dev/null +++ b/doc/html/classdbc_1_1assertion-members.html @@ -0,0 +1,49 @@ + + +Member List + + + + + +
+

dbc::assertion Member List

This is the complete list of members for dbc::assertion, including all inherited members.

+ + + + + + + + + + + + + + + + +
assertion(const bool &condition=true, const std::string &label="", const char *file="", const int &line=0, const std::string &code="")dbc::assertion [explicit]
at(const char *file, const int &line)dbc::assertion [virtual]
at(const std::string &file, const int &line)dbc::assertion [virtual]
code(const std::string &the_code)dbc::assertion [virtual]
code() const dbc::assertion [virtual]
condition(const bool &the_condition)dbc::assertion [virtual]
condition() const dbc::assertion [virtual]
exit(const int &code) const dbc::assertion
file() const dbc::assertion [virtual]
label(const std::string &the_label)dbc::assertion [virtual]
label()dbc::assertion [virtual]
line() const dbc::assertion [virtual]
raise() const dbc::assertion [inline]
raise(const E &exception) const dbc::assertion [inline]
terminate() const dbc::assertion
~assertion()dbc::assertion [virtual]

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1assertion.html b/doc/html/classdbc_1_1assertion.html new file mode 100755 index 00000000..8b4f7703 --- /dev/null +++ b/doc/html/classdbc_1_1assertion.html @@ -0,0 +1,548 @@ + + +dbc::assertion Class Reference + + + + + +
+

dbc::assertion Class Reference

Class to write assertions. +More... +

+#include <assertion.hpp> +

+

+Inheritance diagram for dbc::assertion:
+
+ +

+ +dbc::oassertionstream + +
+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 assertion (const bool &condition=true, const std::string &label="", const char *file="", const int &line=0, const std::string &code="")
 Construct this assertion.
virtual ~assertion ()
 Destroy this assertion.
virtual void condition (const bool &the_condition)
 Set the assertion condition.
virtual bool condition () const
 Return the assertion condition value.
virtual void label (const std::string &the_label)
 Set the assertion descriptive label.
virtual std::string label ()
 Return the assertion descriptive label.
virtual void at (const char *file, const int &line)
 Set the file and line containing the assertion.
virtual void at (const std::string &file, const int &line)
 Set the file and line containing the assertion.
virtual std::string file () const
 Return the file containing the assertion.
virtual int line () const
 Return the line containing the assertion.
virtual void code (const std::string &the_code)
 Set a textual description of the asserting code.
virtual std::string code () const
 Return a textual description of the asserted code.
template<typename E>
void raise () const
 If the assertion condition is false, throw the specified exception.
template<typename E>
void raise (const E &exception) const
 If the assertion condition is false, throw the specified execption.
void exit (const int &code) const
 If the assertion condition is false, exit the program with the specified exit code (calling exit()).
+void terminate () const
 If the assertion condition is false, terminate the program (calling std::terminate()).
+


Detailed Description

+Class to write assertions. +

+Usually, the DBC_ASSERT() macro wrapper should be used instead of using this assertion class directly.

  #include <dbc.hpp>
+
+  int main() {
+      int x = 10;
+      dbc::assertion(x < 0, "negative x", __FILE__, __LINE__,
+              "x < 0").exit(200); // Exit with code 200 as x is not negative.
+      return 0; // Otherwise, would have exited with code 0...
+  }
+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dbc::assertion::assertion (const bool &  condition = true,
const std::string &  label = "",
const char *  file = "",
const int &  line = 0,
const std::string &  code = "" 
) [explicit]
+
+
+ +

+Construct this assertion. +

+

Parameters:
+ + + + + + +
[in] condition The boolean condition to assert. The condition expression is evaluate to true or false when this argument is passed.
[in] label The assertion label (for log messages).
[in] file The file containing the assertion (for log messages).
[in] line The line containing the assertion (for log messages).
[in] code A string with the code generating the asserted condition (for log messages).
+
+ +
+

+ +

+
+ + + + + + + + +
virtual dbc::assertion::~assertion (  )  [virtual]
+
+
+ +

+Destroy this assertion. +

+ +

+

+


Member Function Documentation

+ +
+
+ + + + + + + + + +
virtual void dbc::assertion::condition (const bool &  the_condition  )  [virtual]
+
+
+ +

+Set the assertion condition. +

+

Parameters:
+ + +
[in] the_condition New condition boolean value. The condition expression is evaluate to true or false when this argument is passed.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual bool dbc::assertion::condition (  )  const [virtual]
+
+
+ +

+Return the assertion condition value. +

+ +

+

+ +

+
+ + + + + + + + + +
virtual void dbc::assertion::label (const std::string &  the_label  )  [virtual]
+
+
+ +

+Set the assertion descriptive label. +

+

Parameters:
+ + +
[in] the_label New assertion label.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual std::string dbc::assertion::label (  )  [virtual]
+
+
+ +

+Return the assertion descriptive label. +

+ +

+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual void dbc::assertion::at (const char *  file,
const int &  line 
) [virtual]
+
+
+ +

+Set the file and line containing the assertion. +

+The __FILE__ and __LINE__ macros can be used for these arguments.

Parameters:
+ + + +
[in] file The file containing the assertion.
[in] line The line containing the assertion.
+
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
virtual void dbc::assertion::at (const std::string &  file,
const int &  line 
) [virtual]
+
+
+ +

+Set the file and line containing the assertion. +

+

Parameters:
+ + + +
[in] file The file containing the assertion.
[in] line The line containing the assertion.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual std::string dbc::assertion::file (  )  const [virtual]
+
+
+ +

+Return the file containing the assertion. +

+ +

+

+ +

+
+ + + + + + + + +
virtual int dbc::assertion::line (  )  const [virtual]
+
+
+ +

+Return the line containing the assertion. +

+ +

+

+ +

+
+ + + + + + + + + +
virtual void dbc::assertion::code (const std::string &  the_code  )  [virtual]
+
+
+ +

+Set a textual description of the asserting code. +

+

Parameters:
+ + +
[in] the_code Text of asserting code.
+
+ +
+

+ +

+
+ + + + + + + + +
virtual std::string dbc::assertion::code (  )  const [virtual]
+
+
+ +

+Return a textual description of the asserted code. +

+ +

+

+ +

+
+
+template<typename E>
+ + + + + + + + +
void dbc::assertion::raise (  )  const [inline]
+
+
+ +

+If the assertion condition is false, throw the specified exception. +

+

Template Parameters:
+ + +
E Type of exception to throw. This exception must have a constructor taking one single string argument in input as the error description.
+
+ +
+

+ +

+
+
+template<typename E>
+ + + + + + + + + +
void dbc::assertion::raise (const E &  exception  )  const [inline]
+
+
+ +

+If the assertion condition is false, throw the specified execption. +

+

Template Parameters:
+ + +
E Type of exception to throw.
+
+
Parameters:
+ + +
[in] exception Exception object to throw. Because the object is constructed by the user and passed as an argument, this function does not require any specific constructor for the E type.
+
+ +
+

+ +

+
+ + + + + + + + + +
void dbc::assertion::exit (const int &  code  )  const
+
+
+ +

+If the assertion condition is false, exit the program with the specified exit code (calling exit()). +

+

Parameters:
+ + +
[in] code Exit code.
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1assertion.png b/doc/html/classdbc_1_1assertion.png new file mode 100755 index 0000000000000000000000000000000000000000..d2ec50c8ef5c9a3f7c0af990293da164b0a7d96a GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^Z9p8r!VDz!3}@s6O=n36RTJ666=m;PC858j$Vo>Eaj?(fW3(ci&+J9*4xsrr&ta+)2>-YP0#& z-+lu#v-xRi3prz5MESD*JidBkMX7gTe~DWM4fUm?Fg literal 0 HcmV?d00001 diff --git a/doc/html/classdbc_1_1condition__violation-members.html b/doc/html/classdbc_1_1condition__violation-members.html new file mode 100755 index 00000000..bc7c2d33 --- /dev/null +++ b/doc/html/classdbc_1_1condition__violation-members.html @@ -0,0 +1,34 @@ + + +Member List + + + + + +
+

dbc::condition_violation Member List

This is the complete list of members for dbc::condition_violation, including all inherited members.

+ +
condition_violation(const std::string &what)dbc::condition_violation [explicit]

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1condition__violation.html b/doc/html/classdbc_1_1condition__violation.html new file mode 100755 index 00000000..e1220d86 --- /dev/null +++ b/doc/html/classdbc_1_1condition__violation.html @@ -0,0 +1,91 @@ + + +dbc::condition_violation Class Reference + + + + + +
+

dbc::condition_violation Class Reference

Base class for all contract violation exceptions. +More... +

+#include <exception.hpp> +

+

+Inheritance diagram for dbc::condition_violation:
+
+ +

+ +dbc::postcondition_violation +dbc::precondition_violation + +
+ +

+List of all members. + + + + + +

Public Member Functions

 condition_violation (const std::string &what)
 Construct this exception with the specified description.
+


Detailed Description

+Base class for all contract violation exceptions. +

+If this exception is thrown while checking preconditions, postconditions, or invariants then it is automatically re-thrown by the library as either dbc::precondition_violation, dbc::postcondition_violation, or dbc::invariant_violation respectively.


Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + +
dbc::condition_violation::condition_violation (const std::string &  what  )  [explicit]
+
+
+ +

+Construct this exception with the specified description. +

+

Parameters:
+ + +
[in] what Exception description.
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1condition__violation.png b/doc/html/classdbc_1_1condition__violation.png new file mode 100755 index 0000000000000000000000000000000000000000..ad36d05f9847e1f7091d9ff3bc82509bb476a452 GIT binary patch literal 769 zcmV+c1OEJpP)4bocYoaTC!mV5)7cLTEwy$SYPTR!Kk!~fM6TMp=dzOyG;&T|&nS zy40t5w?57W7}2F*Z~kn80bL39<90h6pqKfzOANq&N-z>@p~Pk|-*{-(cs^{2b#PxAfI z-TbS&rTT?0SA>1N@29{D>@{H>+MVFC&N}+-w6G~!)WUAMti`T&U00JPGy=P>*b+Yn zi~CI~@e&pSEQC`WHs+jlz-K_`sA!!F?NX6_=n_Kv`8HsmL8=;b6b|MxC$M^I{N??Z3zJkzyjQdbu|RNu;{vB zn`zK + +dbc::copyable< T > Class Template Reference + + + + + +
+

dbc::copyable< T > Class Template Reference

Indicate the specified type is copyable to support the "old" postfix in postconditions. +More... +

+#include <post.hpp> +

+ + +
+


Detailed Description

+

template<typename T>
+ class dbc::copyable< T >

+ +Indicate the specified type is copyable to support the "old" postfix in postconditions. +

+This should only be used with the library code-based API. Use DBC_COPYABLE() with the macro-based API instead.

Template Parameters:
+ + +
T Type specified as copyable. The library compilation will require this type to have copy constructor. Specify a type copyable only if its value before body execution is needed in postcondition to avoid the extra requirement of the existence of the copy constructor and the performance impact of the copy operation to support the "old" postfix in postconditions.
+
+
Note:
The specified type T cannot be abstract (i.e., with one or more pure virtual functions) because abstract types cannot be instantiated and therefore they cannot be copied.
+

The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1exit-members.html b/doc/html/classdbc_1_1exit-members.html new file mode 100755 index 00000000..6e1e0719 --- /dev/null +++ b/doc/html/classdbc_1_1exit-members.html @@ -0,0 +1,34 @@ + + +Member List + + + + + +
+

dbc::exit Member List

This is the complete list of members for dbc::exit, including all inherited members.

+ +
exit(const int &code)dbc::exit [explicit]

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1exit.html b/doc/html/classdbc_1_1exit.html new file mode 100755 index 00000000..6b965aa8 --- /dev/null +++ b/doc/html/classdbc_1_1exit.html @@ -0,0 +1,90 @@ + + +dbc::exit Class Reference + + + + + +
+

dbc::exit Class Reference

Modifier to cause an assertion-stream to exit the program with the specified code. +More... +

+#include <assertion.hpp> +

+ +

+List of all members. + + + + + +

Public Member Functions

 exit (const int &code)
 Construct this modifier to exit with specified code.
+


Detailed Description

+Modifier to cause an assertion-stream to exit the program with the specified code. +

+

  #include <dbc.hpp>
+
+  int main() {
+      int x = 10;
+      dbc::oassertionstream a(x < 0, "negative x", __FILE__, __LINE__,
+              "x < 0");
+      a << "x value " << x << " is not negative" << dbc::exit(200);
+      return 0; // Otherwise, would have exited with code 0...
+  }
+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + +
dbc::exit::exit (const int &  code  )  [explicit]
+
+
+ +

+Construct this modifier to exit with specified code. +

+

Parameters:
+ + +
[in] code Exit code to be returned by the program.
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1fun-members.html b/doc/html/classdbc_1_1fun-members.html new file mode 100755 index 00000000..127e0f57 --- /dev/null +++ b/doc/html/classdbc_1_1fun-members.html @@ -0,0 +1,37 @@ + + +Member List + + + + + +
+

dbc::fun< R, A0, A1, > Member List

This is the complete list of members for dbc::fun< R, A0, A1, >, including all inherited members.

+ + + + +
basic_arg0_type typedefdbc::fun< R, A0, A1, >
basic_result_type typedefdbc::fun< R, A0, A1, >
copyable_arg0_type typedefdbc::fun< R, A0, A1, >
uncopyable_arg0_type typedefdbc::fun< R, A0, A1, >

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1fun.html b/doc/html/classdbc_1_1fun.html new file mode 100755 index 00000000..0c26c53c --- /dev/null +++ b/doc/html/classdbc_1_1fun.html @@ -0,0 +1,165 @@ + + +dbc::fun< R, A0, A1, > Class Template Reference + + + + + +
+

dbc::fun< R, A0, A1, > Class Template Reference

Template used by the code-based API to specify contracts for functions with given return type and (optional) argument types. +More... +

+#include <fun.hpp> +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

typedef remove_const_ref_< R > basic_result_type
 Return type without const and & qualifiers.
typedef
+remove_copyable_const_ref_< A0 > 
basic_arg0_type
 Argument type without const, &, and dbc::copyable qualifiers.
typedef remove_const_ref_< A0 > copyable_arg0_type
 Argument type without const and & qualifiers (but keeps dbc::copyable qualifier if specified).
typedef remove_copyable_< A0 > uncopyable_arg0_type
 Argument type without dbc::copyable qualifier (but keeps const and & qualifiers if specified).

Classes

class  constr
 Template used by the code-based API to specify contracts for constructors of the given class. More...
class  destr
 Template used by the code-based API to specify contracts for the destructor of the given class. More...
class  mem
 Template used by the code-based API to specify contracts for functions members of the given class and eventually subcontracting from the given base contract class. More...
+


Detailed Description

+

template<typename R, typename A0 = none_, typename A1 = none_, ...>
+ class dbc::fun< R, A0, A1, >

+ +Template used by the code-based API to specify contracts for functions with given return type and (optional) argument types. +

+

Template Parameters:
+ + + +
R The function return type. Use void for void functions.
A0,A1,... The function argument types (neither one of which can be void). These template parameters are all optional (indicated by their default none_ value), specify:
    +
  • No argument type dbc::fun<R> for a function with no argument.
  • Only A0 dbc::fun<R, A0> for a function with only one argument.
  • A0 and A1 dbc::fun<R, A0, A1> for a function with two arguments.
  • And so on. The maximum number of supported arguments is defined by DBC_CONFIG_MAX_ARGC.
+
+
+
Note:
Name abbreviations fun and mem follows the convention introduced by C++ STL to name member function binders std::mem_fun for member functions. Similarly, the abbreviations constr and destr were chosen for constructor and destructor respectively.
+

Member Typedef Documentation

+ +
+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+ + + + +
typedef remove_const_ref_<R> dbc::fun< R, A0, A1, >::basic_result_type
+
+
+ +

+Return type without const and & qualifiers. +

+For example, if R is const std::string& then basic_result_type is evaluated to std::string. +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+ + + + +
typedef remove_copyable_const_ref_<A0> dbc::fun< R, A0, A1, >::basic_arg0_type
+
+
+ +

+Argument type without const, &, and dbc::copyable qualifiers. +

+For example, if A0 is dbc::copyable<const std::string&> then basic_arg0_type is evaluated to std::string.

+These types basic_arg0_type, basic_arg1_type, ... are defined for each argument number in [0, DBC_CONFIG_MAX_ARGC - 1]. +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+ + + + +
typedef remove_const_ref_<A0> dbc::fun< R, A0, A1, >::copyable_arg0_type
+
+
+ +

+Argument type without const and & qualifiers (but keeps dbc::copyable qualifier if specified). +

+For example, if A0 is dbc::copyable<const std::string&> then copyable_arg0_type is evaluated to dbc::copyable<std::string>.

+These types copyable_arg0_type, copyable_arg1_type, ... are defined for every argument number in [0, DBC_CONFIG_MAX_ARGC - 1]. +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+ + + + +
typedef remove_copyable_<A0> dbc::fun< R, A0, A1, >::uncopyable_arg0_type
+
+
+ +

+Argument type without dbc::copyable qualifier (but keeps const and & qualifiers if specified). +

+For example, if A0 is dbc::copyable<const std::string>& then uncopyable_arg0_type is evaluated to const std::string&.

+These types uncopyable_arg0_type, uncopyable_arg1_type, ... are defined for every argument number in [0, DBC_CONFIG_MAX_ARGC - 1]. +

+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1fun_1_1constr-members.html b/doc/html/classdbc_1_1fun_1_1constr-members.html new file mode 100755 index 00000000..20e76769 --- /dev/null +++ b/doc/html/classdbc_1_1fun_1_1constr-members.html @@ -0,0 +1,41 @@ + + +Member List + + + + + +
+

dbc::fun< R, A0, A1, >::constr< C > Member List

This is the complete list of members for dbc::fun< R, A0, A1, >::constr< C >, including all inherited members.

+ + + + + + + + +
basic_class_type typedefdbc::fun< R, A0, A1, >::constr< C >
call(uncopyable_class_type &self, mem_fun_type body, uncopyable_arg0_type arg0, uncopyable_arg0_type arg1,..., const std::string &name="")dbc::fun< R, A0, A1, >::constr< C > [inline]
copyable_class_type typedefdbc::fun< R, A0, A1, >::constr< C >
ensure(const post< copyable_class_type > &self, const post< copyable_arg0_type > &arg0, const post< copyable_arg1_type > &arg1,...)=0dbc::fun< R, A0, A1, >::constr< C > [inline, protected, pure virtual]
mem_fun_type typedefdbc::fun< R, A0, A1, >::constr< C >
require(const basic_arg0_type &arg0, const basic_arg1_type &arg1,...)=0dbc::fun< R, A0, A1, >::constr< C > [inline, protected, pure virtual]
this_type typedefdbc::fun< R, A0, A1, >::constr< C >
uncopyable_class_type typedefdbc::fun< R, A0, A1, >::constr< C >

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1fun_1_1constr.html b/doc/html/classdbc_1_1fun_1_1constr.html new file mode 100755 index 00000000..14b1d814 --- /dev/null +++ b/doc/html/classdbc_1_1fun_1_1constr.html @@ -0,0 +1,366 @@ + + +dbc::fun< R, A0, A1, >::constr< C > Class Template Reference + + + + + +
+

dbc::fun< R, A0, A1, >::constr< C > Class Template Reference

Template used by the code-based API to specify contracts for constructors of the given class. +More... +

+#include <fun.hpp> +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

typedef constr< C > this_type
 Type resulting from this template instantiation.
typedef
+remove_copyable_const_ref_< C > 
basic_class_type
 Class ype without const, &, and dbc::copyable.
typedef remove_const_ref_< C > copyable_class_type
 Class type without const and & qualifiers.
typedef remove_copyable_ref_< C > uncopyable_class_type
 Class type without & and dbc::copyable qualifiers.
typedef void(uncopyable_class_type::* mem_fun_type )(uncopyable_arg1_type, uncopyable_arg1_type,...)
 Member function pointer type.

Public Member Functions

void call (uncopyable_class_type &self, mem_fun_type body, uncopyable_arg0_type arg0, uncopyable_arg0_type arg1,..., const std::string &name="")
 Check this contract and execute the specified body accordingly to the DBC Constructor Call Semantics.

Protected Member Functions

virtual void require (const basic_arg0_type &arg0, const basic_arg1_type &arg1,...)=0
 The user must implement this function specifying the preconditions required by the constructor contract.
virtual void ensure (const post< copyable_class_type > &self, const post< copyable_arg0_type > &arg0, const post< copyable_arg1_type > &arg1,...)=0
 The user must implement this function specifying the postconditions ensured by the constructor contract.
+


Detailed Description

+

template<typename R, typename A0 = none_, typename A1 = none_, ...>
+template<class C>
+ class dbc::fun< R, A0, A1, >::constr< C >

+ +Template used by the code-based API to specify contracts for constructors of the given class. +

+The contracted constructor must be for the class C, and argument types A0, A1, ... .

+This template is present only if R is void because constructors do not return a value.

+There is no base contract parameter B as constructor do not subcontract directly (the base class constructor contract is implicitly checked by C++ construction mechanism).

Template Parameters:
+ + +
C Class of which the contracted constructor is member of. This type cannot be specified copyable via dbc::copyable because there is no object before constructor body execution so the "old" postfix is never available in constructor postconditions. This class type C must privately inherit from dbc::object<C> (see DBC_INHERIT_OBJECT()) and it must specify invariants (see DBC_INVARIANT()).
+
+
See also:
See dbc::fun::mem for more detailed documentation for member function contracts.

+Code-Based API for an example.

+

Member Typedef Documentation

+ +
+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef constr<C> dbc::fun< R, A0, A1, >::constr< C >::this_type
+
+
+ +

+Type resulting from this template instantiation. +

+ +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef remove_copyable_const_ref_<C> dbc::fun< R, A0, A1, >::constr< C >::basic_class_type
+
+
+ +

+Class ype without const, &, and dbc::copyable. +

+ +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef remove_const_ref_<C> dbc::fun< R, A0, A1, >::constr< C >::copyable_class_type
+
+
+ +

+Class type without const and & qualifiers. +

+ +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef remove_copyable_ref_<C> dbc::fun< R, A0, A1, >::constr< C >::uncopyable_class_type
+
+
+ +

+Class type without & and dbc::copyable qualifiers. +

+ +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef void(uncopyable_class_type::* dbc::fun< R, A0, A1, >::constr< C >::mem_fun_type)(uncopyable_arg1_type, uncopyable_arg1_type,...)
+
+
+ +

+Member function pointer type. +

+ +

+

+


Member Function Documentation

+ +
+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void dbc::fun< R, A0, A1, >::constr< C >::call (uncopyable_class_type self,
mem_fun_type  body,
uncopyable_arg0_type  arg0,
uncopyable_arg0_type  arg1,
  ...,
const std::string &  name = "" 
) [inline]
+
+
+ +

+Check this contract and execute the specified body accordingly to the DBC Constructor Call Semantics. +

+

Parameters:
+ + + + + +
self A reference to the object (use *this from the contracted constructor).
[in] body A pointer to function implementing the body.
arg0,arg1,... The function arguments.
[in] name The function name (optional, used for log messages).
+
+
Remarks:
This call return type is void because constructors return no value.
+ +
+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual void dbc::fun< R, A0, A1, >::constr< C >::require (const basic_arg0_type arg0,
const basic_arg1_type &  arg1,
  ... 
) [inline, protected, pure virtual]
+
+
+ +

+The user must implement this function specifying the preconditions required by the constructor contract. +

+If the contract does not require any precondition, simply implement this pure virtual function as {}. All these arguments are constant references so the contract cannot modify the argument values by mistake.

Parameters:
+ + +
[in] arg0,arg1,... Constant references to the argument values (present only if A0, A1, ... have been specified).
+
+
Remarks:
There is no self argument as there is no object before constructor body execution so the preconditions cannot access any object value.
+ +
+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual void dbc::fun< R, A0, A1, >::constr< C >::ensure (const post< copyable_class_type > &  self,
const post< copyable_arg0_type > &  arg0,
const post< copyable_arg1_type > &  arg1,
  ... 
) [inline, protected, pure virtual]
+
+
+ +

+The user must implement this function specifying the postconditions ensured by the constructor contract. +

+If the contract does not ensure any postcondition, simply implement this pure virtual function as {}. All these arguments are constant references so the contract cannot modify the object, and argument values by mistake.

Parameters:
+ + + +
[in] self Constant reference to the object post-value. This post-value only allows to access the current object value (after the body execution) via self.now because C cannot be specified dbc::copyable for constructors.
[in] arg0,arg1,... Constant references to the argument post-values (present only if A0, A1, ... have been specified). As for self, arg0.now is used to access the argument value after body execution and arg0.old is used to assess the value before body execution if the argument type was specified dbc::copyable (and similarly for the other argument numbers).
+
+
Remarks:
There is no result argument because constructors return no value.
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1fun_1_1destr-members.html b/doc/html/classdbc_1_1fun_1_1destr-members.html new file mode 100755 index 00000000..42a61a22 --- /dev/null +++ b/doc/html/classdbc_1_1fun_1_1destr-members.html @@ -0,0 +1,39 @@ + + +Member List + + + + + +
+

dbc::fun< R, A0, A1, >::destr< C > Member List

This is the complete list of members for dbc::fun< R, A0, A1, >::destr< C >, including all inherited members.

+ + + + + + +
basic_class_type typedefdbc::fun< R, A0, A1, >::destr< C >
call(uncopyable_class_type &self, mem_fun_type body, const std::string &name="")dbc::fun< R, A0, A1, >::destr< C > [inline]
copyable_class_type typedefdbc::fun< R, A0, A1, >::destr< C >
mem_fun_type typedefdbc::fun< R, A0, A1, >::destr< C >
this_type typedefdbc::fun< R, A0, A1, >::destr< C >
uncopyable_class_type typedefdbc::fun< R, A0, A1, >::destr< C >

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1fun_1_1destr.html b/doc/html/classdbc_1_1fun_1_1destr.html new file mode 100755 index 00000000..a51eb1b9 --- /dev/null +++ b/doc/html/classdbc_1_1fun_1_1destr.html @@ -0,0 +1,241 @@ + + +dbc::fun< R, A0, A1, >::destr< C > Class Template Reference + + + + + +
+

dbc::fun< R, A0, A1, >::destr< C > Class Template Reference

Template used by the code-based API to specify contracts for the destructor of the given class. +More... +

+#include <fun.hpp> +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + +

Public Types

typedef destr< C > this_type
 Type resulting from this template instantiation.
typedef
+remove_copyable_const_ref_< C > 
basic_class_type
 Class ype without const, &, and dbc::copyable.
typedef remove_const_ref_< C > copyable_class_type
 Class type without const and & qualifiers.
typedef remove_copyable_ref_< C > uncopyable_class_type
 Class type without & and dbc::copyable qualifiers.
typedef void(uncopyable_class_type::* mem_fun_type )()
 Member function pointer type.

Public Member Functions

void call (uncopyable_class_type &self, mem_fun_type body, const std::string &name="")
 Check this contract and execute the specified body accordingly to the DBC Destructor Call Semantics.
+


Detailed Description

+

template<typename R, typename A0 = none_, typename A1 = none_, ...>
+template<class C>
+ class dbc::fun< R, A0, A1, >::destr< C >

+ +Template used by the code-based API to specify contracts for the destructor of the given class. +

+This template is present only if R is void and no argument type A0, A1, ... is specified because destructors have no return value and no argument.

+Destructor contracts have no preconditions or postconditions so this class does not declares the require() and ensure() pure virtual functions.

+There is no base contract parameter B as destructor do not subcontract directly (the base class destructor contract is implicitly checked by C++ destruction mechanism).

Template Parameters:
+ + +
C Class of which the contracted destructor is member of. This type cannot be specified copyable via dbc::copyable because destructors do not check postconditions. This class type C must privately inherit from dbc::object<C> (see DBC_INHERIT_OBJECT()) and it must specify invariants (see DBC_INVARIANT()).
+
+
See also:
See dbc::fun::mem for more detailed documentation for member function contracts.

+Code-Based API for an example.

+

Member Typedef Documentation

+ +
+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef destr<C> dbc::fun< R, A0, A1, >::destr< C >::this_type
+
+
+ +

+Type resulting from this template instantiation. +

+ +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef remove_copyable_const_ref_<C> dbc::fun< R, A0, A1, >::destr< C >::basic_class_type
+
+
+ +

+Class ype without const, &, and dbc::copyable. +

+ +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef remove_const_ref_<C> dbc::fun< R, A0, A1, >::destr< C >::copyable_class_type
+
+
+ +

+Class type without const and & qualifiers. +

+ +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef remove_copyable_ref_<C> dbc::fun< R, A0, A1, >::destr< C >::uncopyable_class_type
+
+
+ +

+Class type without & and dbc::copyable qualifiers. +

+ +

+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + +
typedef void(uncopyable_class_type::* dbc::fun< R, A0, A1, >::destr< C >::mem_fun_type)()
+
+
+ +

+Member function pointer type. +

+ +

+

+


Member Function Documentation

+ +
+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C>
+ + + + + + + + + + + + + + + + + + + + + + + + +
void dbc::fun< R, A0, A1, >::destr< C >::call (uncopyable_class_type self,
mem_fun_type  body,
const std::string &  name = "" 
) [inline]
+
+
+ +

+Check this contract and execute the specified body accordingly to the DBC Destructor Call Semantics. +

+This call will only throw if the body throws. The body is specified by the user and to comply with C++ STL it should not throw (but it is up to the user to full fill the STL requirement or not). However, if the contract fails during this call, no exception will be thrown and dbc::broken_destructor_invariant() will be called instead (or the user's defined handler for this condition, see dbc::set_broken_destructor_invariant()). Therefore, this libray comply with C++ STL exception safety requirements.

+In addition, if this function is called when calling the destructor during stack unwinding while there is an unhandled exception, this call will simply log a message in case of contract failure. (This is necessary because the class contract does not need to hold if the system is already in a failure status because of an unhandled exception.)

Parameters:
+ + + + +
self A reference to the object (use *this from the contracted destructor).
[in] body A pointer to function implementing the body.
[in] name The function name (optional, used for log messages).
+
+
Remarks:
There is no function argument type because destructors take no argument.

+This call returns void because destructors return no value.

+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1fun_1_1mem-members.html b/doc/html/classdbc_1_1fun_1_1mem-members.html new file mode 100755 index 00000000..6588d33b --- /dev/null +++ b/doc/html/classdbc_1_1fun_1_1mem-members.html @@ -0,0 +1,41 @@ + + +Member List + + + + + +
+

dbc::fun< R, A0, A1, >::mem< C, B > Member List

This is the complete list of members for dbc::fun< R, A0, A1, >::mem< C, B >, including all inherited members.

+ + + + + + + + +
basic_class_type typedefdbc::fun< R, A0, A1, >::mem< C, B >
call(uncopyable_class_type &self, mem_fun_type body, uncopyable_arg0_type arg0, uncopyable_arg0_type arg1,..., const std::string &name="")dbc::fun< R, A0, A1, >::mem< C, B > [inline, virtual]
copyable_class_type typedefdbc::fun< R, A0, A1, >::mem< C, B >
ensure(const post< copyable_class_type > &self, const post< copyable_arg0_type > &arg0, const post< copyable_arg1_type > &arg1,..., const basic_result_type &result)=0dbc::fun< R, A0, A1, >::mem< C, B > [inline, protected, pure virtual]
mem_fun_type typedefdbc::fun< R, A0, A1, >::mem< C, B >
require(const basic_class_type &self, const basic_arg0_type &arg0, const basic_arg1_type &arg1,...)=0dbc::fun< R, A0, A1, >::mem< C, B > [inline, protected, pure virtual]
this_type typedefdbc::fun< R, A0, A1, >::mem< C, B >
uncopyable_class_type typedefdbc::fun< R, A0, A1, >::mem< C, B >

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1fun_1_1mem.html b/doc/html/classdbc_1_1fun_1_1mem.html new file mode 100755 index 00000000..e171266e --- /dev/null +++ b/doc/html/classdbc_1_1fun_1_1mem.html @@ -0,0 +1,347 @@ + + +dbc::fun< R, A0, A1, >::mem< C, B > Class Template Reference + + + + + +
+

dbc::fun< R, A0, A1, >::mem< C, B > Class Template Reference

Template used by the code-based API to specify contracts for functions members of the given class and eventually subcontracting from the given base contract class. +More... +

+#include <fun.hpp> +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

typedef mem< C, B > this_type
 Type resulting from this template instantiation.
+typedef
+remove_copyable_const_ref_< C > 
basic_class_type
 Class type without const, &, and dbc::copyable qualifiers.
+typedef remove_const_ref_< C > copyable_class_type
 Class type without const and & qualifiers (but keeps eventual dbc::copyable qualifier).
+typedef remove_copyable_ref_< C > uncopyable_class_type
 Class type without & and dbc::copyable qualifiers (but keeps eventual const qualifier).
typedef R(uncopyable_class_type::* mem_fun_type )(uncopyable_arg0_type, uncopyable_arg1_type,...)
 Member function pointer type.

Public Member Functions

virtual R call (uncopyable_class_type &self, mem_fun_type body, uncopyable_arg0_type arg0, uncopyable_arg0_type arg1,..., const std::string &name="")
 Check this contract and execute the specified body accordingly to the DBC Member Function Call Semantics.

Protected Member Functions

virtual void require (const basic_class_type &self, const basic_arg0_type &arg0, const basic_arg1_type &arg1,...)=0
 The user must implement this function specifying the preconditions required by the member function contract.
virtual void ensure (const post< copyable_class_type > &self, const post< copyable_arg0_type > &arg0, const post< copyable_arg1_type > &arg1,..., const basic_result_type &result)=0
 The user must implement this function specifying the postconditions ensured by the member function contract.
+


Detailed Description

+

template<typename R, typename A0 = none_, typename A1 = none_, ...>
+template<class C, class B = no_base_>
+ class dbc::fun< R, A0, A1, >::mem< C, B >

+ +Template used by the code-based API to specify contracts for functions members of the given class and eventually subcontracting from the given base contract class. +

+The contracted function must be a member of the class C, with return type R, argument types A0, A1, ..., and optionally subcontracting from the base contract class B.

Template Parameters:
+ + + +
C Class of which the contracted function is member of. This class type C must privately inherit from dbc::object<C> (see DBC_INHERIT_OBJECT()) and it must specify invariants (see DBC_INVARIANT()).
B Base contract class from which the contract function is subcontracting. This must be of a type derived from dbc::fun::mem so to be a valid contract. If the contracted member function is not subcontracting, this parameter can be left unspecified).
+
+
Remarks:
In general, to allow subcontracting it is necessary to make dbc::fun::mem and dbc::post friends for the contracted class (e.g., when subcontracting from private base class). This is automatically done by the macro-based API (and causes the annoying multiple friend compiler warning) but it must be done manually when using the code-based API.
+
See also:
Code-Based API for an example.
+

Member Typedef Documentation

+ +
+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C, class B = no_base_>
+ + + + +
typedef mem<C, B> dbc::fun< R, A0, A1, >::mem< C, B >::this_type
+
+
+ +

+Type resulting from this template instantiation. +

+This is needed when writing contracts for functions member of a template class type C.

  #include <dbc.hpp>
+
+  teamplate<typename T>
+  class C DBC_MULTI_INHERIT_OBJECT(C<T>) {
+  public:
+      T f(const T& x) const
+  #ifdef DBC
+      { return DBC_CONTRACT(f, (x))().call(*this, &C::DBC_BODY(f),
+          x, "f"); }
+  protected:
+      class DBC_CONTRACT(f, (x)): public dbc::fun<T, const T&>::
+              template // Need to explicitly indicate template.
+              mem<const C>::this_type { // Need instantiated type.
+          void require(const C& self, const T& x) {
+              // Preconditions.
+          }
+          void ensure(const dbc::post<C>& self,
+                  const dbc::post<T>& x) {
+              // Postconditions.
+          }
+      };
+      T DBC_BODY(f)(const T& x) const
+  #endif // DBC
+      ; // Body definition split from contract declaration.
+  public:
+      
+      ...
+  };
+
+
+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C, class B = no_base_>
+ + + + +
typedef R(uncopyable_class_type::* dbc::fun< R, A0, A1, >::mem< C, B >::mem_fun_type)(uncopyable_arg0_type, uncopyable_arg1_type,...)
+
+
+ +

+Member function pointer type. +

+Note that the eventual dbc::copyable qualifier is removed from the function argument and class types as it does not appear in the actual member function signature. +

+

+


Member Function Documentation

+ +
+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C, class B = no_base_>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual R dbc::fun< R, A0, A1, >::mem< C, B >::call (uncopyable_class_type self,
mem_fun_type  body,
uncopyable_arg0_type  arg0,
uncopyable_arg0_type  arg1,
  ...,
const std::string &  name = "" 
) [inline, virtual]
+
+
+ +

+Check this contract and execute the specified body accordingly to the DBC Member Function Call Semantics. +

+

Parameters:
+ + + + + +
self A reference to the object (use *this from the contracted member function). The eventual const qualifier is kept for the class type to properly handle constant member functions.
[in] body A pointer to function implementing the body.
arg0,arg1,... The function arguments. The eventual const qualifiers are kept to properly handle constant arguments.
[in] name The function name (optional, used for log messages).
+
+
Returns:
The value returned by the body (could be void).
+ +
+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C, class B = no_base_>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual void dbc::fun< R, A0, A1, >::mem< C, B >::require (const basic_class_type self,
const basic_arg0_type arg0,
const basic_arg1_type &  arg1,
  ... 
) [inline, protected, pure virtual]
+
+
+ +

+The user must implement this function specifying the preconditions required by the member function contract. +

+If the contract does not require any precondition, simply implement this pure virtual function as {}. All these arguments are constant references so the contract cannot modify the object and argument values by mistake.

Parameters:
+ + + +
[in] self Constant reference to the object.
[in] arg0,arg1,... Constant references to the argument values (present only if A0, A1, ... have been specified).
+
+
Note:
Defining this function pure virtual instead of virtual {} allows to check at compile-time that the use is overriding the proper virtual function to specify the contract (otherwise an error in specifying the function signature would result in declaring a different virtual function and silently not checking the user defined contracts).
+
+
+

+ +

+
+
+template<typename R, typename A0 = none_, typename A1 = none_, ... >
+
+template<class C, class B = no_base_>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual void dbc::fun< R, A0, A1, >::mem< C, B >::ensure (const post< copyable_class_type > &  self,
const post< copyable_arg0_type > &  arg0,
const post< copyable_arg1_type > &  arg1,
  ...,
const basic_result_type result 
) [inline, protected, pure virtual]
+
+
+ +

+The user must implement this function specifying the postconditions ensured by the member function contract. +

+If the contract does not ensure any postcondition, simply implement this pure virtual function as {}. All these arguments are constant references so the contract cannot modify the object, argument, and returned values by mistake.

Parameters:
+ + + + +
[in] self Constant reference to the object post-value. The post-value allows to access the current object value (after the body execution) via self.now. Furthermore, if the object type C was specified copyable using dbc::copyable then also the old object value (before the body execution) can be accessed via self.old (this requires the type to have a copy constructor and will impact performances with an extra copy of the object, use it only when the old value is really needed in postconditions, see DBC_COPYABLE()).
[in] arg0,arg1,... Constant references to the argument post-values (present only if A0, A1, ... have been specified). As for self, arg0.now is used to access the argument value after body execution and arg0.old is used to assess the value before body execution if the argument type was specified dbc::copyable (and similarly for the other argument numbers).
[in] result Constant reference to the value being returned (present only if R is not void).
+
+
Note:
Defining this function pure virtual instead of virtual {} allows to check at compile-time that the use is overriding the proper virtual function to specify the contract (otherwise an error in specifying the function signature would result in declaring a different virtual function and silently not checking the user defined contracts).
+
+
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1invariat__violation-members.html b/doc/html/classdbc_1_1invariat__violation-members.html new file mode 100755 index 00000000..26b8ad00 --- /dev/null +++ b/doc/html/classdbc_1_1invariat__violation-members.html @@ -0,0 +1,34 @@ + + +Member List + + + + + +
+

dbc::invariat_violation Member List

This is the complete list of members for dbc::invariat_violation, including all inherited members.

+ +
invariant_violation(const std::string &what)dbc::invariat_violation [explicit]

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1invariat__violation.html b/doc/html/classdbc_1_1invariat__violation.html new file mode 100755 index 00000000..652bd40b --- /dev/null +++ b/doc/html/classdbc_1_1invariat__violation.html @@ -0,0 +1,81 @@ + + +dbc::invariat_violation Class Reference + + + + + +
+

dbc::invariat_violation Class Reference

Exception thrown by default on invariant failure. +More... +

+#include <exception.hpp> +

+ +

+List of all members. + + + + + +

Public Member Functions

 invariant_violation (const std::string &what)
 Construct this exception with the specified description.
+


Detailed Description

+Exception thrown by default on invariant failure. +

+


Member Function Documentation

+ +
+
+ + + + + + + + + +
dbc::invariat_violation::invariant_violation (const std::string &  what  )  [explicit]
+
+
+ +

+Construct this exception with the specified description. +

+

Parameters:
+ + +
[in] what Exception description.
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1oassertionstream-members.html b/doc/html/classdbc_1_1oassertionstream-members.html new file mode 100755 index 00000000..5279b9ad --- /dev/null +++ b/doc/html/classdbc_1_1oassertionstream-members.html @@ -0,0 +1,51 @@ + + +Member List + + + + + +
+

dbc::oassertionstream Member List

This is the complete list of members for dbc::oassertionstream, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
assertion(const bool &condition=true, const std::string &label="", const char *file="", const int &line=0, const std::string &code="")dbc::assertion [explicit]
at(const char *file, const int &line)dbc::assertion [virtual]
at(const std::string &file, const int &line)dbc::assertion [virtual]
code(const std::string &the_code)dbc::assertion [virtual]
code() const dbc::assertion [virtual]
condition(const bool &the_condition)dbc::assertion [virtual]
condition() const dbc::assertion [virtual]
exit(const int &code) const dbc::assertion
file() const dbc::assertion [virtual]
label(const std::string &the_label)dbc::assertion [virtual]
label()dbc::assertion [virtual]
line() const dbc::assertion [virtual]
oassertionstream(const bool &condition=true, const std::string &label="", const char *file="", const int &line=0, const std::string &code="")dbc::oassertionstream [explicit]
raise() const dbc::assertion [inline]
raise(const E &exception) const dbc::assertion [inline]
terminate() const dbc::assertion
~assertion()dbc::assertion [virtual]
~oassertionstream()dbc::oassertionstream [virtual]

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1oassertionstream.html b/doc/html/classdbc_1_1oassertionstream.html new file mode 100755 index 00000000..4eca82c6 --- /dev/null +++ b/doc/html/classdbc_1_1oassertionstream.html @@ -0,0 +1,158 @@ + + +dbc::oassertionstream Class Reference + + + + + +
+

dbc::oassertionstream Class Reference

Class to write assertions reporting verbose error messages. +More... +

+#include <assertion.hpp> +

+

+Inheritance diagram for dbc::oassertionstream:
+
+ +

+ +dbc::assertion + +
+ +

+List of all members. + + + + + + + + +

Public Member Functions

 oassertionstream (const bool &condition=true, const std::string &label="", const char *file="", const int &line=0, const std::string &code="")
 Construct this output-assertion-stream.
virtual ~oassertionstream ()
 Destroy this output-assertion-stream.
+


Detailed Description

+Class to write assertions reporting verbose error messages. +

+Usually, the DBC_ASSERT_STREAM() macro wrapper should be used instead of using this output-assertion-stream class directly.

  #include <dbc.hpp>
+
+  int main() {
+      int x = 10;
+      dbc::oassertionstream a(x < 0, "negative x", __FILE__, __LINE__,
+              "x < 0");
+      // Use as an output stream to report verbose error messages.
+      a << "x value " << x << " is not negative"; // Error message.
+      a.exit(200); // Exit with code 200 as x is not negative.
+      return 0; // Otherwise, would have exited with code 0...
+  }
+

+

Note:
The name of this class follows the STL convention for std::ostringstream and it stands for output-assertion-stream.
+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dbc::oassertionstream::oassertionstream (const bool &  condition = true,
const std::string &  label = "",
const char *  file = "",
const int &  line = 0,
const std::string &  code = "" 
) [explicit]
+
+
+ +

+Construct this output-assertion-stream. +

+

Parameters:
+ + + + + + +
[in] condition The boolean condition to assert. The condition expression is evaluate to true or false when this argument is passed.
[in] label The assertion label (for log messages).
[in] file The file containing the assertion (for log messages).
[in] line The line containing the assertion (for log messages).
[in] code A string with the code generating the asserted condition (for log messages).
+
+ +
+

+ +

+
+ + + + + + + + +
virtual dbc::oassertionstream::~oassertionstream (  )  [virtual]
+
+
+ +

+Destroy this output-assertion-stream. +

+ +

+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1oassertionstream.png b/doc/html/classdbc_1_1oassertionstream.png new file mode 100755 index 0000000000000000000000000000000000000000..c5524a7de87bc9525397791d958cf0af2cc7c177 GIT binary patch literal 427 zcmV;c0aX5pP)nk1#O!r`b|BaWzF1#H#u8R}7I7zUC!-F0=CCi~)m|w3oaS zI>>mg4rB)MmO&(%uCx$gN}@>o5rg;uE{UWZsVI>xeu{#dN`Eu#q={&xZsX?o0R~sE zcOk^HjGUdcnj?(b4`p=yc$U%4Me>olxo}r?E+fVXamG6{Uh!=h%59wTFO2p35{%or zUV?F%xj4fa&Txh^oNbaM$d7rl#g)N*>poH*m1887%Y`~d5M V^2PPG3R?gG002ovPDHLkV1o2ExQGA% literal 0 HcmV?d00001 diff --git a/doc/html/classdbc_1_1object.html b/doc/html/classdbc_1_1object.html new file mode 100755 index 00000000..51a16772 --- /dev/null +++ b/doc/html/classdbc_1_1object.html @@ -0,0 +1,65 @@ + + +dbc::object< C > Class Template Reference + + + + + +
+

dbc::object< C > Class Template Reference

Any class with a contract must privately inherit from this base object class. +More... +

+#include <object.hpp> +

+ + +
+


Detailed Description

+

template<class C>
+ class dbc::object< C >

+ +Any class with a contract must privately inherit from this base object class. +

+This class should not be used directly, the DBC_INHERIT_OBJECT() and DBC_MULTI_INHERIT_OBJECT() should be used instead.

+Because the inheritance is private, it does not alter the contracted class public API. Because this class class is a template on taking as parameter the contracted class type, there is a different base object for every specified contracted class type so this does not alter the inheritance tree by introducing a common ancestor to all classes.

  #include <dbc.hpp>
+
+  class C
+  #ifdef DBC
+          : dbc::object<C>
+  #endif // DBC
+          {
+      ... // Class and its contract here.
+  };
+
Template Parameters:
+ + +
C The contracted class that is inheriting from this object. This base object is used by the library implementation to store internal state, etc.
+
+
The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1post-members.html b/doc/html/classdbc_1_1post-members.html new file mode 100755 index 00000000..2ad549a3 --- /dev/null +++ b/doc/html/classdbc_1_1post-members.html @@ -0,0 +1,34 @@ + + +Member List + + + + + +
+

dbc::post< T > Member List

This is the complete list of members for dbc::post< T >, including all inherited members.

+ +
nowdbc::post< T >

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1post.html b/doc/html/classdbc_1_1post.html new file mode 100755 index 00000000..03cb9856 --- /dev/null +++ b/doc/html/classdbc_1_1post.html @@ -0,0 +1,81 @@ + + +dbc::post< T > Class Template Reference + + + + + +
+

dbc::post< T > Class Template Reference

Postcondition argument types to support the "old" postfix. +More... +

+#include <post.hpp> +

+ +

+List of all members. + + + + + +

Public Attributes

const remove_const_ref_< T > & now
 Current argument value.
+


Detailed Description

+

template<typename T>
+ class dbc::post< T >

+ +Postcondition argument types to support the "old" postfix. +

+This should only be used with the library code-based API.

Template Parameters:
+ + +
T Postcondition argument type. For non-copyable types, this class does not provide the old member variable, no copy is performed, and the "old" postfix is not available in postconditions.
+
+

Member Data Documentation

+ +
+
+
+template<typename T>
+ + + + +
const remove_const_ref_<T>& dbc::post< T >::now
+
+
+ +

+Current argument value. +

+ +

+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1post_3_01T_01_5_01_4-members.html b/doc/html/classdbc_1_1post_3_01T_01_5_01_4-members.html new file mode 100755 index 00000000..f0984a57 --- /dev/null +++ b/doc/html/classdbc_1_1post_3_01T_01_5_01_4-members.html @@ -0,0 +1,34 @@ + + +Member List + + + + + +
+

dbc::dbc::post< T * > Member List

This is the complete list of members for dbc::dbc::post< T * >, including all inherited members.

+ +
nowdbc::dbc::post< T * >

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1post_3_01T_01_5_01_4.html b/doc/html/classdbc_1_1post_3_01T_01_5_01_4.html new file mode 100755 index 00000000..d1ce7912 --- /dev/null +++ b/doc/html/classdbc_1_1post_3_01T_01_5_01_4.html @@ -0,0 +1,81 @@ + + +dbc::dbc::post< T * > Class Template Reference + + + + + +
+

dbc::dbc::post< T * > Class Template Reference

Postcondition argument pointer types to support the "old" postfix. +More... +

+#include <post.hpp> +

+ +

+List of all members. + + + + + +

Public Attributes

const remove_const_ref_< T > * now
 Current argument value.
+


Detailed Description

+

template<typename T>
+ class dbc::dbc::post< T * >

+ +Postcondition argument pointer types to support the "old" postfix. +

+This should only be used with the library code-based API.

Template Parameters:
+ + +
T Postcondition argument pointer type. For non-copyable types, this class does not provide the old member variable, no copy is performed, and the "old" postfix is not available in postconditions.
+
+

Member Data Documentation

+ +
+
+
+template<typename T>
+ + + + +
const remove_const_ref_<T>* dbc::dbc::post< T * >::now
+
+
+ +

+Current argument value. +

+ +

+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_4_01_4-members.html b/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_4_01_4-members.html new file mode 100755 index 00000000..676c6256 --- /dev/null +++ b/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_4_01_4-members.html @@ -0,0 +1,35 @@ + + +Member List + + + + + +
+

dbc::dbc::post< copyable< T > > Member List

This is the complete list of members for dbc::dbc::post< copyable< T > >, including all inherited members.

+ + +
nowdbc::dbc::post< copyable< T > >
olddbc::dbc::post< copyable< T > >

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_4_01_4.html b/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_4_01_4.html new file mode 100755 index 00000000..e7a961a4 --- /dev/null +++ b/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_4_01_4.html @@ -0,0 +1,103 @@ + + +dbc::dbc::post< copyable< T > > Class Template Reference + + + + + +
+

dbc::dbc::post< copyable< T > > Class Template Reference

Postcondition argument types to support the "old" postfix. +More... +

+#include <post.hpp> +

+ +

+List of all members. + + + + + + + + +

Public Attributes

const remove_const_ref_< T > & now
 Current argument value.
const remove_const_ref_< T > old
 Argument value copied before body execution.
+


Detailed Description

+

template<typename T>
+ class dbc::dbc::post< copyable< T > >

+ +Postcondition argument types to support the "old" postfix. +

+This should only be used with the library code-based API.

Template Parameters:
+ + +
T Postcondition argument type. For copyable types, this class provides the old member variable, a copy is performed before body execution, and the "old" postfix is available in postconditions.
+
+

Member Data Documentation

+ +
+
+
+template<typename T>
+ + + + +
const remove_const_ref_<T>& dbc::dbc::post< copyable< T > >::now
+
+
+ +

+Current argument value. +

+ +

+

+ +

+
+
+template<typename T>
+ + + + +
const remove_const_ref_<T> dbc::dbc::post< copyable< T > >::old
+
+
+ +

+Argument value copied before body execution. +

+ +

+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_5_01_4_01_4-members.html b/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_5_01_4_01_4-members.html new file mode 100755 index 00000000..e2babaa2 --- /dev/null +++ b/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_5_01_4_01_4-members.html @@ -0,0 +1,35 @@ + + +Member List + + + + + +
+

dbc::dbc::post< copyable< T * > > Member List

This is the complete list of members for dbc::dbc::post< copyable< T * > >, including all inherited members.

+ + +
nowdbc::dbc::post< copyable< T * > >
olddbc::dbc::post< copyable< T * > >

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_5_01_4_01_4.html b/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_5_01_4_01_4.html new file mode 100755 index 00000000..ae7c5c35 --- /dev/null +++ b/doc/html/classdbc_1_1post_3_01copyable_3_01T_01_5_01_4_01_4.html @@ -0,0 +1,103 @@ + + +dbc::dbc::post< copyable< T * > > Class Template Reference + + + + + +
+

dbc::dbc::post< copyable< T * > > Class Template Reference

Postcondition argument pointer types to support the "old" postfix. +More... +

+#include <post.hpp> +

+ +

+List of all members. + + + + + + + + +

Public Attributes

const remove_const_ref_< T > * now
 Current argument value.
const remove_const_ref_< T > * old
 Argument value copied before body execution.
+


Detailed Description

+

template<typename T>
+ class dbc::dbc::post< copyable< T * > >

+ +Postcondition argument pointer types to support the "old" postfix. +

+This should only be used with the library code-based API.

Template Parameters:
+ + +
T Postcondition argument pointer type. For copyable types, this class provides the old member variable, a copy is performed before body execution, and the "old" postfix is available in postconditions.
+
+

Member Data Documentation

+ +
+
+
+template<typename T>
+ + + + +
const remove_const_ref_<T>* dbc::dbc::post< copyable< T * > >::now
+
+
+ +

+Current argument value. +

+ +

+

+ +

+
+
+template<typename T>
+ + + + +
const remove_const_ref_<T>* dbc::dbc::post< copyable< T * > >::old
+
+
+ +

+Argument value copied before body execution. +

+ +

+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1postcondition__violation-members.html b/doc/html/classdbc_1_1postcondition__violation-members.html new file mode 100755 index 00000000..a0c34217 --- /dev/null +++ b/doc/html/classdbc_1_1postcondition__violation-members.html @@ -0,0 +1,35 @@ + + +Member List + + + + + +
+

dbc::postcondition_violation Member List

This is the complete list of members for dbc::postcondition_violation, including all inherited members.

+ + +
condition_violation(const std::string &what)dbc::condition_violation [explicit]
postcondition_violation(const std::string &what)dbc::postcondition_violation [explicit]

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1postcondition__violation.html b/doc/html/classdbc_1_1postcondition__violation.html new file mode 100755 index 00000000..c3cac473 --- /dev/null +++ b/doc/html/classdbc_1_1postcondition__violation.html @@ -0,0 +1,90 @@ + + +dbc::postcondition_violation Class Reference + + + + + +
+

dbc::postcondition_violation Class Reference

Exception thrown by default on postcondition failure. +More... +

+#include <exception.hpp> +

+

+Inheritance diagram for dbc::postcondition_violation:
+
+ +

+ +dbc::condition_violation + +
+ +

+List of all members. + + + + + +

Public Member Functions

 postcondition_violation (const std::string &what)
 Construct this exception with the specified description.
+


Detailed Description

+Exception thrown by default on postcondition failure. +

+


Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + +
dbc::postcondition_violation::postcondition_violation (const std::string &  what  )  [explicit]
+
+
+ +

+Construct this exception with the specified description. +

+

Parameters:
+ + +
[in] what Exception description.
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1postcondition__violation.png b/doc/html/classdbc_1_1postcondition__violation.png new file mode 100755 index 0000000000000000000000000000000000000000..7e6944553ec5fdce24131c36577dfc318a0e495c GIT binary patch literal 485 zcmV&8#sufD=^hg}Tc9k5FvhgwD{Es6xdVf$iUXB6yO($9#K(cRSrS^k%3w{UVn? zNjeXwRb$YwyeIUe0&282Mq5J?k$95eJee4BrMom&@K8%FR2#lrp}$-2iSH93jL>q( z(g_+-eqE8sP}@MQZKUf^tCK`DA8KCiG@WVcMObu#8aoQj-4DGL&q&^e78lUieO*fp zbe{bfYKUk$bi_7v8R#va=wW+|m;N#I_*?|~IF3c23w3`(H*`ZcbVE0ELzjord{dz2 z-_wTP2E{JB&MD+yr$Pnw60}X6$rY3wl-%TH@1a7HnE;VPh3M)+C>!Ce$e)r_B?%P4 zE$17M8_b@c-6XzGgfK$OAxQ!1Gimca0kI + +Member List + + + + + +
+

dbc::precondition_violation Member List

This is the complete list of members for dbc::precondition_violation, including all inherited members.

+ + +
condition_violation(const std::string &what)dbc::condition_violation [explicit]
precondition_violation(const std::string &what)dbc::precondition_violation [explicit]

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1precondition__violation.html b/doc/html/classdbc_1_1precondition__violation.html new file mode 100755 index 00000000..ad2168ed --- /dev/null +++ b/doc/html/classdbc_1_1precondition__violation.html @@ -0,0 +1,90 @@ + + +dbc::precondition_violation Class Reference + + + + + +
+

dbc::precondition_violation Class Reference

Exception thrown by default on precondition failure. +More... +

+#include <exception.hpp> +

+

+Inheritance diagram for dbc::precondition_violation:
+
+ +

+ +dbc::condition_violation + +
+ +

+List of all members. + + + + + +

Public Member Functions

 precondition_violation (const std::string &what)
 Construct this exception with the specified description.
+


Detailed Description

+Exception thrown by default on precondition failure. +

+


Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + +
dbc::precondition_violation::precondition_violation (const std::string &  what  )  [explicit]
+
+
+ +

+Construct this exception with the specified description. +

+

Parameters:
+ + +
[in] what Exception description.
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1precondition__violation.png b/doc/html/classdbc_1_1precondition__violation.png new file mode 100755 index 0000000000000000000000000000000000000000..6dccbb2971aaaa6e7d63aec0734307bd80474395 GIT binary patch literal 487 zcmVN5us_N7HM6m92WN(M>39%WGb?5 ziqs($6lYbAg7h8I`%Zcl>1~#XW+UB`RpztI8Awy^kj{@GOU6?^W#q)~Q(7yeX56-t zKgES~L^K&WP!{s!$Txg+N6T$E@-LCw_XUu*ZMy*SA{k%Eg^6b^u2uQx*}HArB#8BMA}= zaYcy=W0ZfixsyG|jVDu)b(5upjGnS^RJ$VUJkueKX{CoqzF3DyJ{y&Y#*pG3Lc;zk z^I3*mm5t}X`YaO?%n`E6IL48rS~DIhhP;8Aiqwo_E$!T%-(IJekic)n$;jh!sW;Jo dM9%-{{s5kmCT!rI2H*ey002ovPDHLkV1j(@+5i9m literal 0 HcmV?d00001 diff --git a/doc/html/classdbc_1_1raise.html b/doc/html/classdbc_1_1raise.html new file mode 100755 index 00000000..e1d60481 --- /dev/null +++ b/doc/html/classdbc_1_1raise.html @@ -0,0 +1,65 @@ + + +dbc::raise< E > Class Template Reference + + + + + +
+

dbc::raise< E > Class Template Reference

Modifier to cause an assertion-stream to throw the specified exception. +More... +

+#include <assertion.hpp> +

+ + +
+


Detailed Description

+

template<typename E = condition_violation>
+ class dbc::raise< E >

+ +Modifier to cause an assertion-stream to throw the specified exception. +

+

  #include <dbc.hpp>
+
+  int main() {
+      int x = 10;
+      dbc::oassertionstream a(x < 0, "negative x", __FILE__, __LINE__,
+              "x < 0");
+      // Throws dbc::condition_violation with specified error message.
+      a << "x value " << x << " is not negative" << dbc::raise();
+      return 0; // Otherwise, would have exited with code 0...
+  }
+
Template Parameters:
+ + +
E Type of exception to throw. This exception must have a constructor taking one single string argument in input as the error description.
+
+
The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1terminate.html b/doc/html/classdbc_1_1terminate.html new file mode 100755 index 00000000..20fe3eef --- /dev/null +++ b/doc/html/classdbc_1_1terminate.html @@ -0,0 +1,56 @@ + + +dbc::terminate Class Reference + + + + + +
+

dbc::terminate Class Reference

Modifier to cause an assertion-stream to terminate the program. +More... +

+#include <assertion.hpp> +

+ + +
+


Detailed Description

+Modifier to cause an assertion-stream to terminate the program. +

+

  #include <dbc.hpp>
+
+  int main() {
+      int x = 10;
+      dbc::oassertionstream a(x < 0, "negative x", __FILE__, __LINE__,
+              "x < 0");
+      a << "x value " << x << " is not negative" << dbc::terminate();
+      return 0; // Otherwise, would have exited with code 0...
+  }
+

The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1uraise-members.html b/doc/html/classdbc_1_1uraise-members.html new file mode 100755 index 00000000..a9ed023c --- /dev/null +++ b/doc/html/classdbc_1_1uraise-members.html @@ -0,0 +1,34 @@ + + +Member List + + + + + +
+

dbc::uraise< E > Member List

This is the complete list of members for dbc::uraise< E >, including all inherited members.

+ +
uraise(const E &exception)dbc::uraise< E > [explicit]

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/classdbc_1_1uraise.html b/doc/html/classdbc_1_1uraise.html new file mode 100755 index 00000000..715242a7 --- /dev/null +++ b/doc/html/classdbc_1_1uraise.html @@ -0,0 +1,102 @@ + + +dbc::uraise< E > Class Template Reference + + + + + +
+

dbc::uraise< E > Class Template Reference

Modifier to cause an assertion-stream to throw the specified exception. +More... +

+#include <assertion.hpp> +

+ +

+List of all members. + + + + + +

Public Member Functions

 uraise (const E &exception)
 Construct this modifier to throw specified exception object.
+


Detailed Description

+

template<typename E>
+ class dbc::uraise< E >

+ +Modifier to cause an assertion-stream to throw the specified exception. +

+

  #include <dbc.hpp>
+
+  int main() {
+      int x = 10;
+      dbc::oassertionstream a(x < 0, "negative x", __FILE__, __LINE__,
+              "x < 0");
+      // Throws an int object of value 10 as the exception.
+      a << "x value " << x << " is not negative" << dbc::raise(x);
+      return 0; // Otherwise, would have exited with code 0...
+  }
+
Template Parameters:
+ + +
E Type of exception to throw. Because the object to throw is constructed by the user and passed as an argument, this function does not require any specific constructor for the E type.
+
+
Note:
The name stands for "user raise" as a user constructed object is thrown as the exception.
+

Constructor & Destructor Documentation

+ +
+
+
+template<typename E>
+ + + + + + + + + +
dbc::uraise< E >::uraise (const E &  exception  )  [explicit]
+
+
+ +

+Construct this modifier to throw specified exception object. +

+

Parameters:
+ + +
[in] exception Exception object to throw.
+
+ +
+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/config_8hpp.html b/doc/html/config_8hpp.html new file mode 100755 index 00000000..8d16dc3e --- /dev/null +++ b/doc/html/config_8hpp.html @@ -0,0 +1,480 @@ + + +dbc/config.hpp File Reference + + + + + +
+

dbc/config.hpp File Reference

Header file to only include library configuration symbols. More... +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

#define DBC_CONFIG_ENABLE_THROWING_ASSERTIONS   true
 Whether assertions that throw are checked or not (default: true).
#define DBC_CONFIG_ENABLE_EXITING_ASSERTIONS   true
 Whether assertions that exit are checked or not (default: true).
#define DBC_CONFIG_ENABLE_TERMINATING_ASSERTIONS   true
 Whether assertions that terminate are checked or not (default: true).
#define DBC_DEFAULT_THROW_ON_ASSERTION_VIOLATION   0
 By default, throw exception on assertion violation.
#define DBC_DEFAULT_EXIT_ON_ASSERTION_VIOLATION   1
 By default, exit the program with code 1 on assertion violation.
#define DBC_DEFAULT_TERMINATE_ON_ASSERTION_VIOLATION   2
 By default, terminate the program on assertion violation.
#define DBC_CONFIG_DEFAULT_ON_ASSERTION_VIOLATION   DBC_DEFAULT_THROW_ON_ASSERTION_VIOLATION
 Default action to take on assertion violation.
#define DBC_LOG_LEVEL_NONE   0
 Never log.
#define DBC_LOG_LEVEL_VIOLATION   1
 Only log on assertion violation.
#define DBC_LOG_LEVEL_DEBUG   2
 Log on assertion violation and for debug.
#define DBC_LOG_LEVEL_ALL   3
 Log on assertion violation, debug, and trace information.
#define DBC_CONFIG_LOG_LEVEL   DBC_LOG_LEVEL_VIOLATION
 Log level to use.
#define DBC_CONFIG_LOG_DEBUG(message)   { std::clog << "dbc: " << message << std::endl; }
 Print to log specified debug message (default to std::clog).
#define DBC_CONFIG_LOG_VIOLATION(message)   { std::cerr << "dbc: " << message << std::endl; }
 Print to log specified assertion violation message (default to std::cerr).
#define DBC_CONFIG_DOC_ASSERTION(condition, label)   condition
 Documentation comment for assertion.
#define DBC_CONFIG_DOC_REQUIRE(preconditions)
 Documentation comment for precoditions code block.
#define DBC_CONFIG_DOC_ENSURE(postconditions)
 Documentation comment for postcondition code block.
#define DBC_CONFIG_DOC_INVARIANT(full_class_type, invariants)
 Documentation comment for class invariant code block.
#define DBC_CONFIG_MAX_ARGC   3
 Maximum number of argument supported for contract function in [0, 255].
+#define DBC_CONFIG_FUN_HPP_FILE_PATH   "dbc/fun.hpp"
 This files path must exist within your include path settings (use -I option for g++).
+


Detailed Description

+Header file to only include library configuration symbols. +

+Default values are listed here. If these macros are defined by the user before the first inclusion of this file (or of "dbc.hpp" in general), then the user defined values are retained. Otherwise, if no user defined symbol is present for these macros, they are defined to the default values listed here. Essentially, all these macro are defined as follow:

  #ifndef DBC_CONFIG_<NAME>
+  #define DBC_CONFIG_<NAME> <DEFAULT-MACRO-VALUE-FOR-NAME>
+  #endif
+

Define Documentation

+ +
+
+ + + + +
#define DBC_CONFIG_DEFAULT_ON_ASSERTION_VIOLATION   DBC_DEFAULT_THROW_ON_ASSERTION_VIOLATION
+
+
+ +

+Default action to take on assertion violation. +

+Must be defined to one of the DBC_DEFAULT_..._ON_ASSERTION_VIOLATION symbols. +

+

+ +

+
+ + + + + + + + + + + + +
#define DBC_CONFIG_DOC_ASSERTION (condition,
label   )    condition
+
+
+ +

+Documentation comment for assertion. +

+The DBC_CONFIG_DOC_... macros automatically document the code only if the code-based API is used and if the documentation tool can be instructed to define the DBC_DOC symbol and expand all library macros (for doxygen, specify "MACRO_EXPANSION = YES", add the "dbc.hpp" path to "INCLUDE_PATH", and add DBC_DOC to "PREDEFINED" in the Doxyfile).

See also:
Automatic_Contract_Documentation
+ +
+

+ +

+
+ + + + + + + + + +
#define DBC_CONFIG_DOC_ENSURE (postconditions   ) 
+
+
+ +

+Documentation comment for postcondition code block. +

+

Precondition:
 preconditions 
+
+ +
+

+ +

+
+ + + + + + + + + + + + +
#define DBC_CONFIG_DOC_INVARIANT (full_class_type,
invariants   ) 
+
+
+ +

+Value:

/** <table border="0" cellpadding="0" cellspacing="0"><tr><td><b>Precondition/Postcondition/Invariant Parameters:</b></td></tr><tr><td><table border="0" cellspacing="0"><tr><td></td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td><tt>[in]</tt></td><td><em>self</em></td><td>Constant reference to this object (similar to \c *this in \c const context).</td></tr><tr><td></td><td><tt>[in]</tt></td><td><em>entity.old</em></td><td>Value \e entity had when preconditions were evaluated (in postcondition and for copiable \e entity only).</td></tr><tr><td></td><td><tt>[in]</tt></td><td><em>entity.now</em></td><td>Value \e entity has when postconditions are evaluated (in postcondition only).</td></tr><tr><td></td><td><tt>[in]</tt></td><td><em>result</em></td><td>Value being returned (in postcondition of non-void functions only).</td></tr></table></td></tr></table> */ \
+    /** \invariant */ \
+    /** \code invariants \endcode */ \
+
Documentation comment for class invariant code block. +

+

Postcondition:
 postconditions 
+
+ +
+

+ +

+
+ + + + + + + + + +
#define DBC_CONFIG_DOC_REQUIRE (preconditions   ) 
+
+
+ +

+Documentation comment for precoditions code block. +

+ +

+

+ +

+
+ + + + +
#define DBC_CONFIG_ENABLE_EXITING_ASSERTIONS   true
+
+
+ +

+Whether assertions that exit are checked or not (default: true). +

+This only controls assertion checking at run-time but the assertions are compiled into the object code regardless of the definition of this symbol.

See also:
Use the DBC_CHECK_... symbols to control contract compilation.
+ +
+

+ +

+
+ + + + +
#define DBC_CONFIG_ENABLE_TERMINATING_ASSERTIONS   true
+
+
+ +

+Whether assertions that terminate are checked or not (default: true). +

+This only controls assertion checking at run-time but the assertions are compiled into the object code regardless of the definition of this symbol.

See also:
Use the DBC_CHECK_... symbols to control contract compilation.
+ +
+

+ +

+
+ + + + +
#define DBC_CONFIG_ENABLE_THROWING_ASSERTIONS   true
+
+
+ +

+Whether assertions that throw are checked or not (default: true). +

+This only controls assertion checking at run-time but the assertions are compiled into the object code regardless of the definition of this symbol.

See also:
Use the DBC_CHECK_... symbols to control contract compilation.
+ +
+

+ +

+
+ + + + + + + + + +
#define DBC_CONFIG_LOG_DEBUG (message   )    { std::clog << "dbc: " << message << std::endl; }
+
+
+ +

+Print to log specified debug message (default to std::clog). +

+

Parameters:
+ + +
[in] message C-style null-terminated message string.
+
+ +
+

+ +

+
+ + + + +
#define DBC_CONFIG_LOG_LEVEL   DBC_LOG_LEVEL_VIOLATION
+
+
+ +

+Log level to use. +

+Must be defined to one of the DBC_LOG_LEVEL_... symbols. +

+

+ +

+
+ + + + + + + + + +
#define DBC_CONFIG_LOG_VIOLATION (message   )    { std::cerr << "dbc: " << message << std::endl; }
+
+
+ +

+Print to log specified assertion violation message (default to std::cerr). +

+

Parameters:
+ + +
[in] message C-style null-terminated message string.
+
+ +
+

+ +

+
+ + + + +
#define DBC_CONFIG_MAX_ARGC   3
+
+
+ +

+Maximum number of argument supported for contract function in [0, 255]. +

+

Warning:
Increasing this number will significantly increase compilation time!
+ +
+

+ +

+
+ + + + +
#define DBC_DEFAULT_EXIT_ON_ASSERTION_VIOLATION   1
+
+
+ +

+By default, exit the program with code 1 on assertion violation. +

+ +

+

+ +

+
+ + + + +
#define DBC_DEFAULT_TERMINATE_ON_ASSERTION_VIOLATION   2
+
+
+ +

+By default, terminate the program on assertion violation. +

+ +

+

+ +

+
+ + + + +
#define DBC_DEFAULT_THROW_ON_ASSERTION_VIOLATION   0
+
+
+ +

+By default, throw exception on assertion violation. +

+ +

+

+ +

+
+ + + + +
#define DBC_LOG_LEVEL_ALL   3
+
+
+ +

+Log on assertion violation, debug, and trace information. +

+ +

+

+ +

+
+ + + + +
#define DBC_LOG_LEVEL_DEBUG   2
+
+
+ +

+Log on assertion violation and for debug. +

+ +

+

+ +

+
+ + + + +
#define DBC_LOG_LEVEL_NONE   0
+
+
+ +

+Never log. +

+ +

+

+ +

+
+ + + + +
#define DBC_LOG_LEVEL_VIOLATION   1
+
+
+ +

+Only log on assertion violation. +

+ +

+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/dbc_8hpp.html b/doc/html/dbc_8hpp.html new file mode 100755 index 00000000..3cae2d27 --- /dev/null +++ b/doc/html/dbc_8hpp.html @@ -0,0 +1,154 @@ + + +dbc.hpp File Reference + + + + + +
+

dbc.hpp File Reference

Header file to include the entire Design By Contract for C++ library. More... +

+#include "dbc/config.hpp"
+#include "dbc/exception.hpp"
+#include "dbc/assertion.hpp"
+#include "dbc/body.hpp"
+#include "dbc/post.hpp"
+#include "dbc/mparam.hpp"
+#include "dbc/object.hpp"
+#include "dbc/invariant.hpp"
+#include "dbc/fun.hpp"
+#include "dbc/mfun.hpp"
+ + + + + + + + + + + + + + + + + + + + + +

Namespaces

namespace  dbc

Defines

#define DBC_NO
 If defined by the user, no contract will be compiled and checked (defined by default).
#define DBC_CHECK_REQUIRE
 If defined by the user, preconditions will be compiled and checked (undefined by default).
#define DBC_CHECK_ENSURE
 If defined by the user, postconditions will be compiled and checked (undefined by default).
#define DBC_CHECK_INVARIANT
 If defined by the user, invariants will be compiled and checked (undefined by default).
#define DBC_ALL
 If defined by the user, preconditions, postconditions, and invariants will be compiled and checked (undefined by default).
+


Detailed Description

+Header file to include the entire Design By Contract for C++ library. +

+This is the only file you need to include to use this library. It is recommended to simply include this file instead of the separate header files under the "dbc/" directory. (All files under the "dbc/detail/" directory are implementation specific and must never be included directly.)

  #include <dbc.hpp> // Simply include this one file.
+ 
+  ... // Use the library.
+

+The DBC_NO, DBC_CHECK_REQUIRE, DBC_CHECK_ENSURE, DBC_CHECK_INVARIANT, and DBC_ALL macro symbols any their combinations can be used to selectively compile and check the relative contract components.

+

Note:
These macro symbols can be defined/undefined either from within the source code using the #define/#undef directives before the first #include <dbc.hpp> or, more conveniently, from the compiler command line options (use -D/-U for g++).
+

Define Documentation

+ +
+
+ + + + +
#define DBC_ALL
+
+
+ +

+If defined by the user, preconditions, postconditions, and invariants will be compiled and checked (undefined by default). +

+If this is defined, overrides eventual user definition of DBC_CHECK_REQUIRE, DBC_CHECK_ENSURE, DBC_CHECK_INVARIANT, and DBC_NO cannot be defined at the same time. +

+

+ +

+
+ + + + +
#define DBC_CHECK_ENSURE
+
+
+ +

+If defined by the user, postconditions will be compiled and checked (undefined by default). +

+If this is defined, DBC_NO cannot be defined by the user. +

+

+ +

+
+ + + + +
#define DBC_CHECK_INVARIANT
+
+
+ +

+If defined by the user, invariants will be compiled and checked (undefined by default). +

+If this is defined, DBC_NO cannot be defined by the user. +

+

+ +

+
+ + + + +
#define DBC_CHECK_REQUIRE
+
+
+ +

+If defined by the user, preconditions will be compiled and checked (undefined by default). +

+If this is defined, DBC_NO cannot be defined by the user. +

+

+ +

+
+ + + + +
#define DBC_NO
+
+
+ +

+If defined by the user, no contract will be compiled and checked (defined by default). +

+If this is defined, overrides eventual user definition of DBC_CHECK_REQUIRE, DBC_CHECK_ENSURE, DBC_CHECK_INVARIANT, and DBC_ALL cannot be defined at the same time. +

+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css new file mode 100755 index 00000000..74c22a2f --- /dev/null +++ b/doc/html/doxygen.css @@ -0,0 +1,433 @@ +BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +BODY,TD { + font-size: 90%; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 100%; +} +CAPTION { + font-weight: bold +} +DIV.qindex { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navpath { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navtab { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +TD.navtab { + font-size: 70%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; +} +A.qindexHL:visited { + text-decoration: none; + background-color: #6666cc; + color: #ffffff +} +A.el { + text-decoration: none; + font-weight: bold +} +A.elRef { + font-weight: bold +} +A.code:link { + text-decoration: none; + font-weight: normal; + color: #0000FF +} +A.code:visited { + text-decoration: none; + font-weight: normal; + color: #0000FF +} +A.codeRef:link { + font-weight: normal; + color: #0000FF +} +A.codeRef:visited { + font-weight: normal; + color: #0000FF +} +A:hover { + text-decoration: none; + background-color: #f2f2ff +} +DL.el { + margin-left: -1cm +} +.fragment { + font-family: monospace, fixed; + font-size: 95%; +} +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px +} + +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} +DIV.groupText { + margin-left: 16px; + font-style: italic; + font-size: 90% +} +BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} +TD.indexkey { + background-color: #e8eef2; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #e8eef2; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { + text-align: center; +} +IMG.formulaDsp { +} +IMG.formulaInl { + vertical-align: middle; +} +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +SPAN.vhdldigit { color: #ff00ff } +SPAN.vhdlchar { color: #000000 } +SPAN.vhdlkeyword { color: #700070 } +SPAN.vhdllogic { color: #ff0000 } + +.mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplParams { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + color: #606060; + background-color: #FAFAFA; + font-size: 80%; +} +.search { + color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +TD.tiny { + font-size: 75%; +} +a { + color: #1A41A8; +} +a:visited { + color: #2A3798; +} +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} +TH.dirtab { + background: #e8eef2; + font-weight: bold; +} +HR { + height: 1px; + border: none; + border-top: 1px solid black; +} + +/* Style for detailed member documentation */ +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; + margin-left: 3px; +} +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +.memitem { + padding: 4px; + background-color: #eef3f5; + border-width: 1px; + border-style: solid; + border-color: #dedeee; + -moz-border-radius: 8px 8px 8px 8px; +} +.memname { + white-space: nowrap; + font-weight: bold; +} +.memdoc{ + padding-left: 10px; +} +.memproto { + background-color: #d5e1e8; + width: 100%; + border-width: 1px; + border-style: solid; + border-color: #84b0c7; + font-weight: bold; + -moz-border-radius: 8px 8px 8px 8px; +} +.paramkey { + text-align: right; +} +.paramtype { + white-space: nowrap; +} +.paramname { + color: #602020; + font-style: italic; + white-space: nowrap; +} +/* End Styling for detailed member documentation */ + +/* for the tree view */ +.ftvtree { + font-family: sans-serif; + margin:0.5em; +} +.directory { + font-size: 9pt; + font-weight: bold; +} +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} +.directory > h3 { + margin-top: 0; +} +.directory p { + margin: 0px; + white-space: nowrap; +} +.directory div { + display: none; + margin: 0px; +} +.directory img { + vertical-align: -30%; +} + diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png new file mode 100755 index 0000000000000000000000000000000000000000..f0a274bbaffdd67f6d784c894d9cf28729db0e14 GIT binary patch literal 1281 zcmaJ>ZA?>F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tPF5Qt@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`J`5fAJ*eJbB;uNuKA& zdERDo*{Y<(If(#(B$Lr#;nB(8Y#ia=ZCeW?JfPLuQY`=@cW$k}Rivq|vbxGrRq1Tl9;+(gNt?}UtVKM2`T5t1jLzuL@0UIs`S#vlhl4)^ zLgSYrPj@$+`|j?eSbXTmiHGkWxV8V}BzNR?pl9k_s4pDu9vd5a_UzZEPk)}Ad{AV_ zzddrjrh4=Imr`E06;LY{)YYt?o}L~H@7C}F^WB!Ra=v`Q0bj{>5&$66CWF>mf6vjP z2N>RRY6ZYa=K`76>+|_)Xdwko+7wv}7cN|btOhWb(*{sta~6b?S8Omrxw}!4`NhGr zZVpNqpu1@BE`QGWNTpEpcJVW5izu~2B^GlM?1(OPg)zwW;QcP@Ltcclm>XbJL9C|j z=9!2?ua=uIlf0%AndzHsRC}IyTL$EhAee(fdKB`?27KeS^2M8M_7b~PiCFO&r5LC7 z7gl1*a<8;SjNaw#h=843_AV9iZbWQOAp5YOC^&_F*9K0> zB|6%IDb?aM#3viTxkLU4aXg&@+CkNTOnQ1iMP*^?b|^lJy$4C)Zk4isV!|RZ*XhXh zw8q3$=*0LeGC!XI_Wc?dkT~3+*Gu%%yIqP+Wr3H$=&ROMQU6q}Ag^P~>c5vAEO;a- z_dK-3PPeKar%)6$j~vI2#*-YH!1h6HYVtwCX5_wM`iF#UKz&&@9Oo5w3%XGYrX zW>dY~)SG-((Yim%`InwgTvyRC?e=Wh^8KCao!R6Eg&TpVWUY1sN~4G}V?nFnEGo-; zHZ_$eW9-GnC%^WS9b z@p;-$oH#MtC0v>Q$HX%4^JdFdO$0cbv-W)Q TtK}Eh@>>I#ipmV1>S*>q-hkC} literal 0 HcmV?d00001 diff --git a/doc/html/exception_8hpp.html b/doc/html/exception_8hpp.html new file mode 100755 index 00000000..ecf3dd64 --- /dev/null +++ b/doc/html/exception_8hpp.html @@ -0,0 +1,60 @@ + + +dbc/exception.hpp File Reference + + + + + +
+

dbc/exception.hpp File Reference

Header file to only include exception facilities. More... +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Namespaces

namespace  dbc

Classes

class  dbc::condition_violation
 Base class for all contract violation exceptions. More...
class  dbc::precondition_violation
 Exception thrown by default on precondition failure. More...
class  dbc::postcondition_violation
 Exception thrown by default on postcondition failure. More...
class  dbc::invariat_violation
 Exception thrown by default on invariant failure. More...

Typedefs

typedef void(* dbc::broken_destructor_invariant_handler )()
 Pointer type for the user function that can be registered to handle destructor contract failures that attempt to throw an exception.

Functions

broken_destructor_invariant_handler dbc::set_broken_destructor_invariant (broken_destructor_invariant_handler handler)
 Register user defined function to handle attempt to throw exception on destructor contract violation.
void dbc::broken_destructor_invariant ()
 The default handler called if destructor contract violation attempts to throw an exception and no user handler has been registered.
+


Detailed Description

+Header file to only include exception facilities. +

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/files.html b/doc/html/files.html new file mode 100755 index 00000000..253353d5 --- /dev/null +++ b/doc/html/files.html @@ -0,0 +1,44 @@ + + +File Index + + + + + +
+

File List

Here is a list of all documented files with brief descriptions: + + + + + + + + + + + +
dbc.hppHeader file to include the entire Design By Contract for C++ library
dbc/assertion.hppHeader file to only include facilities for assertions
dbc/body.hppHeader file to only include facilities to split body definition from contract declaration
dbc/config.hppHeader file to only include library configuration symbols
dbc/exception.hppHeader file to only include exception facilities
dbc/fun.hppHeader file to only include facilities to write contracts using the code-based API
dbc/invariant.hppHeader file to only include facilities to write class invariants
dbc/mfun.hppHeader file to only include facilities to write contracts using the macro-based API
dbc/mparam.hppHeader to only include facility to support commas in macro parameters
dbc/object.hppHeader file to only include the base object
dbc/post.hppHeader file to only include facilities to support "old" postfix in postconditions
+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/fun_8hpp.html b/doc/html/fun_8hpp.html new file mode 100755 index 00000000..e1c89d8f --- /dev/null +++ b/doc/html/fun_8hpp.html @@ -0,0 +1,86 @@ + + +dbc/fun.hpp File Reference + + + + + +
+

dbc/fun.hpp File Reference

Header file to only include facilities to write contracts using the code-based API. More... +

+ + + + + + + + + + + + + + + + + + + + + + +

Namespaces

namespace  dbc

Classes

class  dbc::fun< R, A0, A1, >
 Template used by the code-based API to specify contracts for functions with given return type and (optional) argument types. More...
class  dbc::fun< R, A0, A1, >::mem< C, B >
 Template used by the code-based API to specify contracts for functions members of the given class and eventually subcontracting from the given base contract class. More...
class  dbc::fun< R, A0, A1, >::constr< C >
 Template used by the code-based API to specify contracts for constructors of the given class. More...
class  dbc::fun< R, A0, A1, >::destr< C >
 Template used by the code-based API to specify contracts for the destructor of the given class. More...

Defines

#define DBC_CONTRACT(function_name, argument_names)
 This macro expands to the contract class name for code-based API.
+


Detailed Description

+Header file to only include facilities to write contracts using the code-based API. +

+The types defined in this file use some template metaprgramming constructs. Metaprogramming constructs are indicated in this documentation with names ending with an underscore _. Following this library naming conventions, these names are implementation specific, they should not be used directly, and they are not documented here. For example, remove_const_ref_<const T&> indicates a metagramming expression that is internally evaluated by this library to T (removing both the constant const and reference & type qualifiers). However, remove_const_ref_ is implementation specific (it might not even exist in the actual library implementation), should not be used directly, and it is not documented here.


Define Documentation

+ +
+
+ + + + + + + + + + + + +
#define DBC_CONTRACT (function_name,
argument_names   ) 
+
+
+ +

+This macro expands to the contract class name for code-based API. +

+When using the code-based API, this macro should always be used to name the class inheriting from dbc::fun::constr, dbc::fun::destr, or dbc::fun::mem used to specify the contract. If a different name is used, the contract specified using the code-based API cannot be subcontracted from the macro-based API.

Parameters:
+ + + +
[in] function_name The name of the member function for which the contract is being specified. Use init, del, and operator_... for constructors, destructor, and operators.
[in] argument_names A preprocessor sequence specifying the member function argument names (argument_name0)(argument_name1)... .
+
+
See also:
Code-Based API for an example.
+ +
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/functions.html b/doc/html/functions.html new file mode 100755 index 00000000..9641ebd7 --- /dev/null +++ b/doc/html/functions.html @@ -0,0 +1,176 @@ + + +Class Members + + + + + +
+Here is a list of all documented class members with links to the class documentation for each member: +

+

- a -

+

- b -

+

- c -

+

- e -

+

- f -

+

- i -

+

- l -

+

- m -

+

- n -

+

- o -

+

- p -

+

- r -

+

- t -

+

- u -

+

- ~ -

+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html new file mode 100755 index 00000000..a97cec27 --- /dev/null +++ b/doc/html/functions_func.html @@ -0,0 +1,131 @@ + + +Class Members - Functions + + + + + +
+  +

+

- a -

+

- c -

+

- e -

+

- f -

+

- i -

+

- l -

+

- o -

+

- p -

+

- r -

+

- t -

+

- u -

+

- ~ -

+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/functions_type.html b/doc/html/functions_type.html new file mode 100755 index 00000000..24cfda91 --- /dev/null +++ b/doc/html/functions_type.html @@ -0,0 +1,72 @@ + + +Class Members - Typedefs + + + + + + +
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html new file mode 100755 index 00000000..50c4727f --- /dev/null +++ b/doc/html/functions_vars.html @@ -0,0 +1,52 @@ + + +Class Members - Variables + + + + + + +
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/globals.html b/doc/html/globals.html new file mode 100755 index 00000000..d5c5c21d --- /dev/null +++ b/doc/html/globals.html @@ -0,0 +1,130 @@ + + +Class Members + + + + + +
+Here is a list of all documented file members with links to the documentation: +

+

- d -

+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/globals_defs.html b/doc/html/globals_defs.html new file mode 100755 index 00000000..82faedef --- /dev/null +++ b/doc/html/globals_defs.html @@ -0,0 +1,130 @@ + + +Class Members + + + + + +
+  +

+

- d -

+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html new file mode 100755 index 00000000..511c8f07 --- /dev/null +++ b/doc/html/hierarchy.html @@ -0,0 +1,58 @@ + + +Hierarchical Index + + + + + + +
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/index.html b/doc/html/index.html new file mode 100755 index 00000000..3583a20a --- /dev/null +++ b/doc/html/index.html @@ -0,0 +1,109 @@ + + +Design By Contract for C++ (DBC++) + + + + + +
+

Design By Contract for C++ (DBC++)

+

+

This library implements Design By Contract (DBC) for the C++ programming language [Str97]. All DBC features of the Eiffel programming language [Mey97] are supported, among others (see Other Approaches for details):
    +
  • Optional compilation and checking of preconditions, postconditions, and invariants.
  • Subcontracting for derived classes.
  • Use of "old" in postconditions.
  • Automatic contract documentation (using doxygen).
+

+A Complete Example quickly shows contracts written using this library.

+
+ -- Your feedback is welcome, leave a comment here.
+
+

+
Contents:
+
+
Quick Start
+
+
Conventions
+
+
Platform
+
+
Installation
+
+
Overview
+
+
A Complete Example
+
+
+
+
Design By Contract
+
+
Benefits
+
+
Costs
+
+
Other Approaches
+
+
+
+
Writing Contracts
+
+
Macro-Based API
+
+
Invariants
+
+
Base Object
+
+
Macro Parameters with Commas
+
+
Assertions
+
+
Default Exceptions
+
+
Separating Declartion and Definition
+
+
The "old" Postfix
+
+
Subcontracting
+
+
Optional Contract Compilation
+
+
Automatic Contract Documentation
+
+
Configuration
+
+
Code-Based API
+
+
+
+
Annex: Compile-Time Errors
+
+
Annex: Work In Progress
+
+
Annex: Known Bugs
+
+
Annex: Software License
+
+
Bibliography
+
+
+
+
+

+

Author:
Copyright (C) 2009 Lorenzo Caminiti. Distributed under the DBC++ Software License.
+
See also:
This library is hosted at http://sourceforge.net/projects/dbcpp/ .
+ Download it at http://sourceforge.net/project/platformdownload.php?group_id=253844 .
+ Submit questions and comments at http://sourceforge.net/forum/?group_id=253844 .
+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/invariant_8hpp.html b/doc/html/invariant_8hpp.html new file mode 100755 index 00000000..b4d10274 --- /dev/null +++ b/doc/html/invariant_8hpp.html @@ -0,0 +1,157 @@ + + +dbc/invariant.hpp File Reference + + + + + +
+

dbc/invariant.hpp File Reference

Header file to only include facilities to write class invariants. More... +

+ + + + + + + + + +

Defines

#define DBC_INVARIANT_FUN
 This symbol expands to the name of the class invariant function.
#define DBC_INVARIANT(full_class_type, invariants)
 This macro must be used within the class declaration and it specifies the invariants for the given class.
+


Detailed Description

+Header file to only include facilities to write class invariants. +

+


Define Documentation

+ +
+
+ + + + + + + + + + + + +
#define DBC_INVARIANT (full_class_type,
invariants   ) 
+
+
+ +

+This macro must be used within the class declaration and it specifies the invariants for the given class. +

+As a result of the code generated by this macro expansion, the specified class invariants are checked by calls to the class constructors, destructor, and member functions (if they have a contract) following the DBC call semantics. The invariants specified by this macro are automatically documented (see Automatic Contract Documentation).

+

Remarks:
It is recommended to use this macro at the very end of the class declaration and within a session with private access level. This is to make it clear that the code generated by this macro is not part of the public API of the class.
+For example (from A Complete Example):
  #include <dbc.hpp>
+  
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      static const size_t MAX_SIZE = 16000;
+      ...
+  private:
+      size_t size_;
+      char* chars_;
+      ...
+      
+      DBC_INVARIANT(str, {  // At the very end and in a private section.
+          // Invariants.
+          DBC_ASSERT(self.chars_ != 0, "chars exist");
+          DBC_ASSERT(self.size_ >= 0 && self.size_ < str::MAX_SIZE,
+                  "size in range");
+          // Assertions above passed, chars_[size_] can be accessed.
+          DBC_ASSERT(self.chars_[self.size_] == '\0', "null-terminated");
+      })
+  };
+
Parameters:
+ + + +
[in] full_class_type The fully qualified class type. This class is fully qualified as it must indicate the full namespace (if declared within a namespace) and all the template parameters (for template classes). Furthermore, the class type must inherit from dbc::object (see DBC_INHERIT_OBJECT()). For example:
      namespace n {
+          
+      template<typename T>
+      class C DBC_INHERIT_OBJECT(C<T>) { // Must inherit from dbc::object.
+      ...
+      private:
+          // Both namespace 'n' and template parameter 'T' are specified.
+          DBC_INVARIANT(n::C<T>, { // Fully qualified class type.
+              ... // Invariants here.
+          })
+      };
+          
+      } // namespace n
+
(This is different from the class_type parameter used by other macros which does not require full qualification.)
[in] invariants A code block {...} listing the class invariants. The following variables are available in this code block:
    +
  • self is a constant reference const& to the object (of type full_class_type).
  • +
+DBC_ASSERT() and DBC_ASSERT_STREAM() can be used to assert conditions in this code block. General code is allowed in this code block but it is strongly recommended to limit it to a simple list of assertions (otherwise it is likely that the contract will have more bugs than the code it is checking).
+
+
Remarks:
Invariants should use public members as much as possible so the contracts will be implementation independent. However, invariants are also used to check the correctness of the implementation and sometimes they must access the private or protected members.
+
Returns:
This macro expands to the class invariants. If the DBC_CHECK_INVARIANT symbol is not defined at compile-time, this macro trivially expands to nothing, and no invariant code is compiled and checked.
+
See also:
DBC_CONSTRUCTOR(), DBC_DESTRUCTOR(), and DBC_MEM_FUN() to specify member contracts.

+Use DBC_MPARAM() if full_class_type is a template with more than one parameter.

+Use DBC_INVARIANT_FUN to directly write the invariant code bypassing this macro (not recommended).

+ +
+

+ +

+
+ + + + +
#define DBC_INVARIANT_FUN
+
+
+ +

+This symbol expands to the name of the class invariant function. +

+This can be used to manually write the invariant function code therefore avoiding to use DBC_INVARIANT(). This library will internally call a function named DBC_INVARIANT_FUN with a single argument of the correct class type (the object) to check the class invariant.

+

Warning:
Explaining DBC_INVARIANT_FUN might be useful to better understand how the library internally works, but it is strongly recommended to use DBC_INVARIANT() instead of DBC_INVARIANT_FUN because:
    +
  1. DBC_INVARIANT_FUN reduces code readability.
  2. DBC_INVARIANT_FUN requires the programmer to write more code to handle the #ifdef DBC_... compilation guard increasing the possibility of errors.
  3. Only DBC_INVARIANT() automatically documents the invariants.
  4. Only DBC_INVARIANT() checks at compile time for incorrect use of the library (e.g., makes sure that the specified class type inherits from dbc::object).
+
+The DBC_INVARIANT() macro expands to an inline friend void function named by DBC_INVARIANT_FUN with the specified invariants code block as its definition and taking a constant reference to the object as single argument. For example:
  #include <dbc.hpp>
+  
+  class C DBC_INHERIT_OBJECT(C) { // Recommended form.
+      ...
+  private:
+      DBC_INVARIANT(C, {
+          ... // Assert C's invariants here.
+      })
+  };
+
is essentially equivalent to:
  #include <dbc.hpp>
+  
+  class C DBC_INHERIT_OBJECT(C) { // Equivalent code form (not recommended).
+      ...
+  private:
+  #ifdef DBC_CHECK_INVARIANT
+      friend inline void DBC_INVARIANT_FUN(const C& self) {
+          ... // Assert C's invariants here.
+      }
+  #endif // DBC_CHECK_INVARIANT
+  };
+
(The correct function is selected via function overloading resolution based on the class type function argument.)
Returns:
If the DBC_CHECK_INVARIANT symbol is not defined at compile-time, this macro expands to nothing. Otherwise, it expands to the name of the function internally invoked by the library to check class invariants. (The actual name of the invariant function is implementation specific it should be referred to via this macro.)
+ +
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/mfun_8hpp.html b/doc/html/mfun_8hpp.html new file mode 100755 index 00000000..103e3f96 --- /dev/null +++ b/doc/html/mfun_8hpp.html @@ -0,0 +1,482 @@ + + +dbc/mfun.hpp File Reference + + + + + +
+

dbc/mfun.hpp File Reference

Header file to only include facilities to write contracts using the macro-based API. More... +

+ + + + + + + + + + + + + + + + + + +

Namespaces

namespace  dbc

Defines

#define DBC_BASE(base_class_type)
 This macro specifies the base class from which an overriding member function is subcontracting.
#define DBC_CONSTRUCTOR(signature, preconditions, postconditions, body)
 This macro must follow the constructor declaration matching the specified signature and it expands to the contract with the given preconditions, postconditions, and body.
#define DBC_DESTRUCTOR(signature, body)
 This macro must follow the destructor declaration matching the specified signature and it expands to the contract with the body.
#define DBC_MEM_FUN(signature, preconditions, postconditions, body)
 This macro must follow the member function declaration matching the specified signature and it expands to the contract with the given preconditions, postconditions, and body.
+


Detailed Description

+Header file to only include facilities to write contracts using the macro-based API. +

+


Define Documentation

+ +
+
+ + + + + + + + + +
#define DBC_BASE (base_class_type   ) 
+
+
+ +

+This macro specifies the base class from which an overriding member function is subcontracting. +

+This macro should only be used with the signature argument of the DBC_MEM_FUN() contract macro API. When the contract code API dbc::fun::mem is used, the B template parameter is used instead of this macro.

+The given base class must specify a contract for a virtual (or pure virtual) member function matching the name of the overriding function. Then the overriding function contract will subcontract from the one of base class function following the DBC Member Function Call Semantics. (Of course, the overriding function class type must inherit from the specified base class type as it would normally do in C++.)

+In the following example (from "example/DBC_by_Example/NameList/names.hpp"), RelaxedNameList inherits from NameList, and RelaxedNameList::put() subcontracts NameList::put():

/**
+ * @file
+ * @author Copyright (C) 2009 Lorenzo Caminiti.
+ *  Distributed under DBC++ Software License (see file LICENSE_1_0.txt).
+ */
+/* $Id$ */
+
+#ifndef NAMES_HPP_
+#define NAMES_HPP_
+
+#include <dbc.hpp>
+#include <string>
+#include <list>
+
+/** List of names. */
+class NameList DBC_INHERIT_OBJECT(NameList) {
+public:
+    // Creation //
+
+    NameList(void)
+    DBC_CONSTRUCTOR( (public) (NameList)( (void) ), {
+    }, {
+    }, {})
+
+    virtual ~NameList(void)
+    DBC_DESTRUCTOR( (public) (virtual) (NameList)( (void) ), {})
+
+    // Queries //
+
+    /** If specified name is in list. */
+    bool has(const std::string& name) const
+    DBC_MEM_FUN( (public) (bool) (NameList) 
+            (has)( (const std::string&)(name) ) (const), {
+    }, {
+    }, ;)
+
+    /** Return number of names in list. */
+    unsigned int count(void) const
+    DBC_MEM_FUN( (public) (unsigned int) (NameList)
+            (count)( (void) ) (const), {
+    }, {
+    }, ;)
+
+    // Commands //
+
+    /** Add specified name to list. */
+    virtual void put(const std::string& name)
+    DBC_MEM_FUN( (public) (virtual) (void) DBC_COPYABLE(NameList) 
+            (put)( DBC_COPYABLE(const std::string&)(name) ), {
+        DBC_ASSERT_STREAM(!self.has(name), "not in list",
+                err << "name '" << name << "' already in list");
+    }, {
+        // required() is provided to facilitate writing post-condition guards
+        // for more flexible contracts of virtual functions.
+        if (required()) // Or "if (!self.old.has(name.old))".
+            DBC_ASSERT_STREAM(self.now.has(name.now), 
+                    "if require passed, in list",
+                    err << "name '" << name.now << "' not in list");
+        // Because name's type is const, name.now could be used here instead of
+        // name.old (saving to declare name's type as DBC_COPYABLE() and to 
+        // have to copy its value). However, technically "seld.old.has(
+        // name.old)" is the expression equivalent to required().
+        if (!self.old.has(name.old))
+            DBC_ASSERT(self.now.count() == (self.old.count() + 1),
+                    "if was not in list, count increased");
+    }, ;)
+
+private:
+    std::list<std::string> names_;
+    
+    DBC_INVARIANT(NameList, {})
+};
+
+/** List of names that allows for duplicates. */
+class RelaxedNameList: public NameList
+        DBC_MULTI_INHERIT_OBJECT(RelaxedNameList) {
+public:
+    // Creation //
+
+    RelaxedNameList(void)
+    DBC_CONSTRUCTOR( (public) (RelaxedNameList)( (void) ), {
+    }, {
+    }, {})
+
+    virtual ~RelaxedNameList(void)
+    DBC_DESTRUCTOR( (public) (virtual) (RelaxedNameList)( (void) ), {})
+
+    // Commands //
+
+    void put(const std::string& name)
+    DBC_MEM_FUN( (public) (void) 
+            DBC_COPYABLE(RelaxedNameList)DBC_BASE(NameList)
+            (put)( DBC_COPYABLE(const std::string&)(name) ), {
+        DBC_ASSERT_STREAM(self.has(name), "in list",
+                err << "name '" << name << "' not in list");
+    }, {
+        if (self.old.has(name.old))
+            DBC_ASSERT(self.now.count() == self.old.count(),
+                    "if in list, count unchanged");
+    }, ;)
+    
+private:
+    DBC_INVARIANT(RelaxedNameList, {})
+};
+
+#endif // NAMES_HPP_
+
+

+

Parameters:
+ + +
[in] base_class_type The base class type. This class must specify a contract for a virtual function with same name as the overriding function.
+
+
Returns:
Subcontract the overriding function from the function's contract in the specified base class. It is used in the signature argument of DBC_MEM_FUN().
+
See also:
B template parameter of dbc::fun::mem for same functionality for contract code API.

+"example/DBC_by_Example/Observer/" for an example of subcontracting a pure virtual member function.

+"example/DBC_by_Example/CustomerManager/" for another subcontracting example.

+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
#define DBC_CONSTRUCTOR (signature,
preconditions,
postconditions,
body   ) 
+
+
+ +

+This macro must follow the constructor declaration matching the specified signature and it expands to the contract with the given preconditions, postconditions, and body. +

+See the more extensive DBC_MEM_FUN() documentation as this documentation complements it for constructors.

+As a result of the code generated by this macro expansion, every call to the constructor follows the DBC Constructor Call Semantics checking the constructor's contract. The contract specified by this macro is automatically documented.

+This macro can also follow special initialization member functions named init(). Being able to call such init() functions with the DBC Constructor Call Semantics is necessary for the library when separating constructors declaration and definition to deal with member initializers (see Separating Declaration and Definition), and also to support emulation of delegating constructors.

+

Warning:
In order to avoid the issues associated with two stage initialization (see [Str97]), these init() functions should always be declared private and invoked only by constructors.
+
Note:
If delegating constructors were to be added to future C++ standard revisions (which seems to be the case [Sut05]), it may be possible to revisit this library to remove the reliance on the init() functions.
+
For example (from A Complete Example):
  #include <dbc.hpp>
+ 
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      static const size_t MAX_SIZE = 16000;
+  
+      str(const char* chars): size_(), chars_() // Constructor declaration.
+      DBC_CONSTRUCTOR( (public) (str)( (const char*)(chars) ), {
+          // Constructor preconditions.
+          size_t len = strlen(chars); // Code allowed (but keep it simple).
+          // Use DBC_ASSERT() or DBC_ASSERT_STREAM() to assert conditions.
+          DBC_ASSERT(len >= 0 && len < str::MAX_SIZE, "size in range");
+      }, {
+          // Constructor postconditions.
+          DBC_ASSERT(self.now.size() == strlen(chars.now), "size set");
+          DBC_ASSERT(strcmp(self.now.chars_, chars.now) == 0, "chars set");
+      }, {
+          // Constructor body.
+          size_ = strlen(chars);
+          chars_ = new char[size_];
+          strncpy(chars_, chars, size_);
+      })
+      
+  private:
+      size_t size_;
+      char* chars_;
+      ...
+  };
+
Or, equivalently but separating constructor declaration and definition using the init() function:
  #include <dbc.hpp>
+  
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      static const size_t MAX_SIZE = 16000;
+      
+      // Constructor deals with member initializers
+      str(const char* chars): size_(), chars_() { // Member initializers...
+          // ...then just call init (with DBC Constructor Call Semantics).
+          init(chars);
+      }
+      
+  private: // init() should be private and invoked by constructor only.
+      // DBC_CONSTRUCTOR can be used for special init functions.
+      void init(const char* chars) // Function declaration.
+      DBC_CONSTRUCTOR( (public) (str)( (const char*)(chars) ), {
+          // Constructor preconditions.
+          size_t len = strlen(chars); // Code allowed (but keep it simple).
+          // Use DBC_ASSERT() or DBC_ASSERT_STREAM() to assert conditions.
+          DBC_ASSERT(len >= 0 && len < str::MAX_SIZE, "size in range");
+      }, {
+          // Constructor postconditions.
+          DBC_ASSERT(self.now.size() == strlen(chars.now), "size set");
+          DBC_ASSERT(strcmp(self.now.chars_, chars.now) == 0, "chars set");
+      }, ;) // ';' separates declaration and definition.
+      
+      size_t size_;
+      char* chars_;
+      ...
+  };
+  
+  // But member initializers are handled by constructor declaration.
+  str::DBC_BODY(init)(const char* chars) { // Definition.
+      // Constructor body.
+      size_ = strlen(chars);
+      chars_ = new char[size_];
+      strncpy(chars_, chars, size_);
+  }
+

+

Parameters:
+ + + + + +
[in] signature C++ preprocessor sequence of tokens matching the constructor declaration with the following syntax:
+
+ {(public) || (protected) || (private)} [(template)] (class_type)( {(void) || {[DBC_COPYABLE](argument_type)(argument_name)}* } )
+
+ Comparing this signature syntax with the one of DBC_MEM_FUN() note:
    +
  • The absence of (virtual) as constructors cannot be virtual.
  • The absence of (result_type) as constructors do not return any type.
  • The absence of DBC_COPYABLE for class_type as before the body execution there is no object so self.old is never available in postconditions.
  • The absence of DBC_BASE(base_class_type) as C++ will automatically call the base class constructor contract (if there is one) as part of the object construction mechanism, with no need for explicit subcontracting.
  • The absence of function_name as the constructor name is inferred from class_type.
  • The absence of (const) as constructors can never be constant member functions since they construct the object.
+
[in] preconditions A code block {...} listing the constructor preconditions. The following variables are available in this code block (see dbc::fun::constr::require()): argument_name. (self is not available because there is no object before the constructor body is executed.)
+ Limit this code to a simple list of assertions using DBC_ASSERT() and DBC_ASSERT_STREAM().
[in] postconditions A code block {...} listing the constructor postconditions. The following variables are available in this code block (see dbc::fun::constr::ensure()): self.now, argument_name.now, argument_name.old (if relative argument_type was declared copyable). (self.old is not available because there was no object before the constructor body execution, result is not available because constructors do not return any value.)
+ Limit this code to a simple list of assertions using DBC_ASSERT() and DBC_ASSERT_STREAM().
[in] body A code block {...} listing the constructor body definition. Use ; (and init()) when the function definition is separate from its declaration.
+
+
Returns:
This macro expands to the constructor contract. Preconditions, postconditions, and invariants optional compilation is controlled by the DBC_CHECK_REQUIRE, DBC_CHECK_ENSURE, and DBC_CHECK_INVARIANT compile-time symbols.
+
See also:
Different macros DBC_DESTRUCTOR() and DBC_MEM_FUN() need to be used for destructor and member function contracts because of their different DBC call semantics.

+DBC_INVARIANT() to specify class invariants.

+ +
+

+ +

+
+ + + + + + + + + + + + +
#define DBC_DESTRUCTOR (signature,
body   ) 
+
+
+ +

+This macro must follow the destructor declaration matching the specified signature and it expands to the contract with the body. +

+See the more extensive DBC_MEM_FUN() documentation as this documentation complements it for destructors.

+As a result of the code generated by this macro expansion, every call to destructor follows the DBC Destructor Call Semantics checking the class invariant (destructors have no preconditions and postconditions). The contract specified by this macro is automatically documented.

+

Remarks:
The C++ Standard Template Library (STL) exception safety rules require destructors to never throw exceptions. To comply with this STL requirement, if the class invariant is violated while the destructor contract is checked, no exception will be thrown and dbc::broken_destructor_invariant() will be invoked instead (this function can be redefined by the user, it terminates by default). Furthermore, if the destructor is invoked during stack unwinding due to an unhandled exception then an invariant violation while checking the destructor contract will simply be ignored (no exception will be thrown, dbc::broken_destructor_invariant() will not be invoked, and only a warning message will be logged).
+For example (from A Complete Example):
  #include <dbc.hpp>
+  
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      virtual ~str(void) // Destructor declaration.
+      DBC_DESTRUCTOR( (public) (virtual) (str)( (void) ), { 
+            // No pre/post-conditions.
+          // Destructor body (only check invariant at entry).
+          delete[] chars_; // Invariant already checked chars_ != 0.
+      })
+      
+  private:
+      char* chars_;
+      ...
+  };
+

+

Parameters:
+ + + +
[in] signature C++ preprocessor sequence of tokens matching the destructor declaration with the following syntax:
+
+ {(public) || (protected) || (private)} [(virtual)] [(template)] (class_type)( (void) )
+
+ Comparing this signature syntax with the one of DBC_MEM_FUN() note:
    +
  • The absence of (result_type) as destructors do not return any type.
  • The absence of DBC_COPYABLE for class_type as destructors have no postconditions.
  • The absence of DBC_BASE(base_class_type) as C++ will automatically call the base class destructor contract (if there is one) as part of the object destruction mechanism, with no need for explicit subcontracting.
  • The absence of function_name as the destructor name is inferred from class_type.
  • The absence of argument_type and argument_name as destructors have no arguments.
  • The absence of (const) as destructors can never be constant member functions since they destroy the object.
+
[in] body A code block {...} listing the destructor body definition. Use ; (and DBC_DESTRUCTOR_BODY()) when function definition is separate from its declaration.
+
+
Returns:
This macro expands to the destructor contract. Invariants optional compilation is controlled by DBC_CHECK_INVARIANT compile-time symbol.
+
See also:
Different macros DBC_CONSTRUCTOR() and DBC_MEM_FUN() need to be used for constructor and member function contracts because of their different DBC call semantics.

+DBC_INVARIANT() to specify class invariants.

+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + +
#define DBC_MEM_FUN (signature,
preconditions,
postconditions,
body   ) 
+
+
+ +

+This macro must follow the member function declaration matching the specified signature and it expands to the contract with the given preconditions, postconditions, and body. +

+As a result of the code generated by this macro expansion, every call to the member function follows the DBC Member Function Call Semantics checking the function's contract. The contract specified by this macro is automatically documented (see Automatic Contract Documentation).

+For example (from A Complete Example):

  #include <dbc.hpp>
+  
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      // No (virtual), (template), DBC_COPYABLE, DBC_BASE(...), and no args.
+      size_t size(void) const // Member function declaration.
+      DBC_MEM_FUN( (public) (size_t) (str) (size)( (void) ) (const), {
+          // Preconditions here (keep it simple).
+          // No preconditions in this case.
+      }, {
+          // Postconditions here (keep it simple).
+          DBC_ASSERT(result == self.now.size_, "returning size");
+      }, {
+          // Body definition here.
+          return size_;
+      })
+  
+  private:
+      size_t size_;
+      ...
+  };
+

+

Parameters:
+ + +
[in] signature A C++ preprocessor sequence of tokens (see Boost.Preprocessor sequences) matching the member function declaration with the following syntax:
+
+ {(public) || (protected) || (private)} [(virtual)] (result_type) [(template)] [DBC_COPYABLE](class_type)[DBC_BASE(base_class_type)] (function_name)( {(void) || {[DBC_COPYABLE](argument_type)(argument_name)}* } ) [(const)]
+
+ Where all parenthesis () are mandatory, spaces are optional, and:
    +
  • expression1 || expression2 indicates that either expression1 or expression2 can be specified.
  • +
  • {expression} indicates the result of the enclosed expression. For example, {(public) || (protected) || (private)} indicates that either (public), (protected), or (private) can be specified.
  • +
  • [expression] indicates that expression is optional. For example, [DBC_COPYABLE] indicates that either DBC_COPYABLE or nothing (no token) can be specified.
  • +
  • {expression}* indicates that expression can be repeated an arbitrary number of times specifing different tokens or it can be omitted (i.e., it can be repeated 0, 1, 2, ... times). For example, ( {(argument_type) (argument_name)}* ) indicates that either () (repeated 0 times), or ( (argument0_type)(argument0_name) ) (repeated 1 time), or ( (argument0_type)(argument0_name) (argument1_type)(argument1_name) ) (repeated 2 times), etc can be specified.
  • +
  • result_type is the member function return type.
  • +
  • class_type is the member function class type. The class type must inherit (privately) from dbc::object (see DBC_INHERIT_OBJECT()) and must have an invariant (see DBC_INVARIANT()).
  • +
  • base_class_type is the base class from which the member function is being derived using DBC_BASE() (only required when subcontracting).
  • +
  • function_name is the member function name. This must be a valid C++ preprocessor token name so operator symbols cannot be used; spell the operator name instead. For example, operator== cannot be used because the == symbol is not a valid preprocessor token name but you can use an arbitrary name (with no symbols) like operator_equal instead (when separating definitions from declaration, this same name has to be passed to DBC_OPERATOR_BODY()).
  • +
  • void must be specified for the argument list if the function has no no arguments -- simply () cannot be used instead because () is NOT a valid preprocessor sequence token in standard C++.
  • +
+
+
+
Note:
This library supports omitting (void) for empty function argument lists but it will only compile successfully on C99. The C99 preprocessor supports () (see Boost.Preprocessor documentation) plus the use of void to specify empty function argument list is deprecated in C99. Therefore, if your code only has to compile on a C99 compiler, it is recommended to omit (void) for empty function argument lists and use the more intuitive () syntax.
+
    +
  • argument_type is the argument type (can be omitted or repeated up to DBC_CONFIG_MAX_ARGC - 1 times for multiple arguments).
  • +
  • argument_name is the argument name (can be omitted or repeated up to DBC_CONFIG_MAX_ARGC - 1 times for for multiple arguments). Eventual argument default parameter are NOT indicated in the contract signature (they are only indicated in the signature of the member function preceding this macro call).
  • +
+The syntax of signature is defined to follow the C++ member function declaration syntax as much as possible (e.g., you first indicate the access level, then virtual, class follow by function names, then argument, etc). This way of expressing function signatures using C++ preprocessor token sequences might seems unfamiliar at first but, in our experience, you will quickly get used to it with a just little practice. The numerous examples distributed with the library illustrate how to use this syntax for templates, operators, virtual functions, etc (see the code in the "example/" directory).
Parameters:
+ + +
[in] preconditions A code block {...} listing the member function preconditions. The following variables are available in this code block (see dbc::fun::mem::require()):
    +
  • self is a constant reference const& to the object (of type class_type).
  • +
  • argument_name is a constant reference to the named argument.
  • +
+DBC_ASSERT() and DBC_ASSERT_STREAM() can be used to assert conditions in this code block. General code is allowed in this code block but it is strongly recommended to limit it to a simple list of assertions (otherwise it is likely that the contract will have more bugs than the code it is checking).
+
+
Remarks:
Well written preconditions must not use private or protected members to check the contract (otherwise, the caller will not be able to verify the preconditions are satisfied before calling the function as they depend on some private of protected member that is unaccessible to the caller). Eiffel enforces this rule strictly generating a compile-time error (see [Mey97]).
+
Parameters:
+ + +
[in] postconditions A code block {...} listing the member function postconditions. The following variables are available in this code block (see dbc::fun::mem::ensure()):
    +
  • self.now is a constant reference to the current object value (after the body execution).
  • +
  • self.old is a constant reference to the object value before the body execution. This is available only if the class type was declared copyable in signature using DBC_COPYABLE(class_type).
  • +
  • argument_name.now is a constant reference to the named argument current value (after the body execution).
  • +
  • argument_name.old is a constant reference to the named argument value before the body execution. This is available only if the relative argument type was declared copyable in signature using DBC_COPYABLE(argument_type).
  • +
  • result is a constant reference to the value being returned. This is available only for non-void functions (i.e., if result_type was not declared void in signature).
  • +
+DBC_ASSERT() and DBC_ASSERT_STREAM() can be used to assert conditions in this code block. General code is allowed in this code block but it is strongly recommended to limit it to a simple list of assertions (otherwise it is likely that the contract will have more bugs than the code it is checking).
+
+
Remarks:
Postconditions should use public members as much as possible so the contracts will be implementation independent. However, postconditions are also used to check the correctness of the implementation and sometimes they must access the private or protected members.
+
Parameters:
+ + +
[in] body A code block {...} listing the member function body definition. Use ; (and DBC_BODY()) when the function definition is separate from its declaration (see Separating Declartion and Definition). Use = 0; for pure virtual functions (see Subcontracting).
+
+
Returns:
This macro expands to the member function contract. If preconditions/postconditions are not checked (DBC_CHECK_REQUIRE/DBC_CHECK_ENSURE symbols are not defined at compile-time), the preconditions/postconditions code block will not be part of the macro expansion so it will not be compiled and checked. If no preconditions, no postconditions, and no invariants are checked (DBC_CHECK_REQUIRE, DBC_CHECK_ENSURE, and DBC_CHECK_INVARIANT are all not defined), this macro trivially expands to just the body code block and no contract code is compiled and checked. See Optional Contract Compilation.
+
See also:
Different macros DBC_CONSTRUCTOR() and DBC_DESTRUCTOR() need to be used for constructor and destructor contracts because of their different DBC call semantics.

+ DBC_INVARIANT() to specify class invariants.

+ +
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/mparam_8hpp.html b/doc/html/mparam_8hpp.html new file mode 100755 index 00000000..1318731a --- /dev/null +++ b/doc/html/mparam_8hpp.html @@ -0,0 +1,103 @@ + + +dbc/mparam.hpp File Reference + + + + + +
+

dbc/mparam.hpp File Reference

Header to only include facility to support commas in macro parameters. More... +

+ + + + + + +

Defines

#define DBC_MPARAM(token_count, parenthesised_param)
 This macro is used to pass macro parameters containing commas.
+


Detailed Description

+Header to only include facility to support commas in macro parameters. +

+


Define Documentation

+ +
+
+ + + + + + + + + + + + +
#define DBC_MPARAM (token_count,
parenthesised_param   ) 
+
+
+ +

+This macro is used to pass macro parameters containing commas. +

+The C++ preprocessor only recognize the () parenthesis. Other parenthesis like <> for templates, {} for code blocks, [] for indexing, etc are not recognized by the preprocessor so they do not wrap their expressions when used within macro parameters. This macro can be used to overcome this limitation.

+For example, say that you have to pass to DBC_INHERIT_OBJECT() a class type which is a template with two arguments. The following will not work:

  #include <dbc.hpp>
+  
+  template<typename K, typename T>
+  class C DBC_INHERIT_OBJECT(C<K, T>) { ... }; // No, two macro parameters.
+
The issue is that the preprocessor does not recognize the <> parenthesis so the macro parameter C<K, T> is interpreted by the preprocessor as two separate tokens C<K and T> separated by the comma. In this case the compiler will generate an error saying that you passed two parameters to the DBC_INHERIT_OBJECT() macro that takes one parameter instead.
+ Because the preprocessor recognizes the () parenthesis, it might be tempted to overcome this issue simply by wrapping the macro parameter within () parenthesis:
  #include <dbc.hpp>
+  
+  template<typename K, typename T>
+  class C DBC_INHERIT_OBJECT( (C<K, T>) ) { ... }; // No type, only as value.
+
In this case one parameter (C<K, T>) (and not two) is passed to the macro. However, because of the extra parenthesis () around the parameter, this time the C++ compiler (and not the preprocessor) will error when evaluating this expression in a context where a type is expected (note that this is instead a sufficient approach is the macro parameter represents a value and not a type, but unfortunately that is not the case for DBC_INHERIT_OBJECT() for which the parameter represents a type).
+ We need a way to strip the extra parenthesis () after they have been used to pass the parameter as a single parameter. This is done by this macro using the extra information of how many preprocessor tokens are contained within the parenthesis (two in this example). The following will work:
  #include <dbc.hpp>
+  
+  template<typename K, typename T>
+  class C DBC_INHERIT_OBJECT( DBC_MPARAM(2, (C<K, T>) ) ) { ... }; // OK.
+

+Similar considerations apply if commas are used within code block parenthesis {}. Note that when calling functions from code blocks, commas separating the function arguments are always wrapped by () so there is no issue. However, is you are instantiating a template with more than one parameter in a code block you will need to use this macro. For example:

  #include <dbc.hpp>
+  ...
+      DBC_INVARIANT(C, {
+          f(1, 2); // OK, as the comma wrapped within () because of fun call.
+          std::map<int, float> m; // No, two macro parameters.
+          ...
+      })
+
will not work as the code block parameter is interpreted by the preprocessor are two separate tokens { f(1, 2); sts::map<int and float> m; ... } because of the comma in the std::map template instantiation. This will work:
  #include <dbc.hpp>
+  ...
+      DBC_INVARIANT(C, DBC_MPARAM(2, ({ // OK.
+          f(1, 2);
+          std::map<int, float> m;
+          ...
+      })))
+
Note, the extra parenthesis () wrapping the code block { ... } passed to DBC_MPARAM().

+Similar considerations apply when using any other parenthesis different from () within a macro parameter.

+

Note:
This limitation has to do simply with how the C++ preprocessor works and it is not introduced by this library. If new revisions of the C++ standard were to support variadic macros [Nel04], this limitation could be overcome in different ways and the need for the DBC_MPARAM() macro could be revisited.
+
Parameters:
+ + + +
[in] token_count The number of tokens contained in parenthesised_param as recognized by the preprocessor. This number cannot be negative and there is no need to use this macro with a count less than 2 (because the preprocessor can deal directly with no-token or a single-token macro parameters).
[in] parenthesised_param The tokens that should be threated as a single macro parameter wrapped within extra parenthesis ().
+
+
Returns:
Pass the specified tokens as a single macro parameter.
+ +
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/namespacedbc.html b/doc/html/namespacedbc.html new file mode 100755 index 00000000..8ef8eb66 --- /dev/null +++ b/doc/html/namespacedbc.html @@ -0,0 +1,173 @@ + + +dbc Namespace Reference + + + + + +
+

dbc Namespace Reference

Namespace containing the Design By Contract for C++ library symbols. +More... +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Classes

class  assertion
 Class to write assertions. More...
class  oassertionstream
 Class to write assertions reporting verbose error messages. More...
class  raise
 Modifier to cause an assertion-stream to throw the specified exception. More...
class  uraise
 Modifier to cause an assertion-stream to throw the specified exception. More...
class  exit
 Modifier to cause an assertion-stream to exit the program with the specified code. More...
class  terminate
 Modifier to cause an assertion-stream to terminate the program. More...
class  condition_violation
 Base class for all contract violation exceptions. More...
class  precondition_violation
 Exception thrown by default on precondition failure. More...
class  postcondition_violation
 Exception thrown by default on postcondition failure. More...
class  invariat_violation
 Exception thrown by default on invariant failure. More...
class  fun
 Template used by the code-based API to specify contracts for functions with given return type and (optional) argument types. More...
class  object
 Any class with a contract must privately inherit from this base object class. More...
class  copyable
 Indicate the specified type is copyable to support the "old" postfix in postconditions. More...
class  post
 Postcondition argument types to support the "old" postfix. More...
class  dbc::post< T * >
 Postcondition argument pointer types to support the "old" postfix. More...
class  dbc::post< copyable< T > >
 Postcondition argument types to support the "old" postfix. More...
class  dbc::post< copyable< T * > >
 Postcondition argument pointer types to support the "old" postfix. More...

Typedefs

typedef void(* broken_destructor_invariant_handler )()
 Pointer type for the user function that can be registered to handle destructor contract failures that attempt to throw an exception.

Functions

broken_destructor_invariant_handler set_broken_destructor_invariant (broken_destructor_invariant_handler handler)
 Register user defined function to handle attempt to throw exception on destructor contract violation.
void broken_destructor_invariant ()
 The default handler called if destructor contract violation attempts to throw an exception and no user handler has been registered.
+


Detailed Description

+Namespace containing the Design By Contract for C++ library symbols. +

+The library symbols ending with an underscore _ are implementation specific and must not be used directly. The library macros are prefixed by DBC_. The library symbols declared outside the dbc:: namespace are prefixed by dbc_ and always postfixed by _ as they are all implementation specific and should not be used directly.


Typedef Documentation

+ +
+
+ + + + +
typedef void(* dbc::broken_destructor_invariant_handler)()
+
+
+ +

+Pointer type for the user function that can be registered to handle destructor contract failures that attempt to throw an exception. +

+To comply with C++ STL requirements, exception should never be thrown from destructor. If a contract violation in a destructor attempt to throw, the library will call instead the user handler function registered with set_broken_destructor_invariant(). If the user has not registered any function, broken_destructor_invariant() will be called by default. +

+

+


Function Documentation

+ +
+
+ + + + + + + + +
void dbc::broken_destructor_invariant (  )  [inline]
+
+
+ +

+The default handler called if destructor contract violation attempts to throw an exception and no user handler has been registered. +

+This default handler will:

    +
  1. Log a message and terminate the program (std::terminate()) if DBC_CONFIG_ENABLE_TERMINATING_ASSERTIONS is defined.
  2. Or else, log a message and exit the program with code 1 (exit(1)) if DBC_CONFIG_ENABLE_EXITING_ASSERTIONS is defined.
  3. Or else, just log a message and continue the execution.
+

+But it never throws an exception. Use dbc::set_broken_destructor_invariant() to register a user defined handler. +

+

+ +

+
+ + + + + + + + + +
broken_destructor_invariant_handler dbc::set_broken_destructor_invariant (broken_destructor_invariant_handler  handler  )  [inline]
+
+
+ +

+Register user defined function to handle attempt to throw exception on destructor contract violation. +

+If no user define handler is registered, dbc::broken_destructor_invariant() is called by default.

Parameters:
+ + +
handler A function pointer to the user defined handler.
+
+ +
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html new file mode 100755 index 00000000..0ab36732 --- /dev/null +++ b/doc/html/namespacemembers.html @@ -0,0 +1,48 @@ + + +Class Members + + + + + +
+Here is a list of all documented namespace members with links to the namespaces they belong to: +

+

    +
  • broken_destructor_invariant() +: dbc +
  • broken_destructor_invariant_handler +: dbc +
  • set_broken_destructor_invariant() +: dbc +
+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/namespacemembers_func.html b/doc/html/namespacemembers_func.html new file mode 100755 index 00000000..f6b7738c --- /dev/null +++ b/doc/html/namespacemembers_func.html @@ -0,0 +1,46 @@ + + +Class Members + + + + + +
+  +

+

    +
  • broken_destructor_invariant() +: dbc +
  • set_broken_destructor_invariant() +: dbc +
+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/namespacemembers_type.html b/doc/html/namespacemembers_type.html new file mode 100755 index 00000000..d5963dd8 --- /dev/null +++ b/doc/html/namespacemembers_type.html @@ -0,0 +1,44 @@ + + +Class Members + + + + + +
+  +

+

    +
  • broken_destructor_invariant_handler +: dbc +
+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html new file mode 100755 index 00000000..cd437d9d --- /dev/null +++ b/doc/html/namespaces.html @@ -0,0 +1,34 @@ + + +Namespace Index + + + + + +
+

Namespace List

Here is a list of all documented namespaces with brief descriptions: + +
dbcNamespace containing the Design By Contract for C++ library symbols
+
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/object_8hpp.html b/doc/html/object_8hpp.html new file mode 100755 index 00000000..c1b5326a --- /dev/null +++ b/doc/html/object_8hpp.html @@ -0,0 +1,144 @@ + + +dbc/object.hpp File Reference + + + + + +
+

dbc/object.hpp File Reference

Header file to only include the base object. More... +

+ + + + + + + + + + + + + + + + +

Namespaces

namespace  dbc

Classes

class  dbc::object< C >
 Any class with a contract must privately inherit from this base object class. More...

Defines

#define DBC_INHERIT_OBJECT(class_type)
 This macro must follow the class type name and it privately derives the class from dbc::object.
#define DBC_MULTI_INHERIT_OBJECT(class_type)
 This macro must follow the last base class type name and if privately derives the class from dbc::object when multiple inheritance is used.
+


Detailed Description

+Header file to only include the base object. +

+


Define Documentation

+ +
+
+ + + + + + + + + +
#define DBC_INHERIT_OBJECT (class_type   ) 
+
+
+ +

+This macro must follow the class type name and it privately derives the class from dbc::object. +

+Any class with a contract specified by this library must inherit from dbc::object. The inheritance should be private so not to alter the public inheritance tree (part of the requirement for this library not to alter the class public API).

+This macro is used for convenience so the programmer does not have to manually write the private inheritance from dbc::object with the #ifdef DBC guard. For example (from A Complete Example):

  #include <dbc.hpp>
+  
+  class str DBC_INHERIT_OBJECT(str) { // Recommended form.
+      ...
+  };
+
which is essentially equivalent to:
  #include <dbc.hpp>
+  
+  class str // Equivalent code form (not recommended).
+  #ifdef DBC // When one or more DBC_CHECK_... defined.
+          : private dbc::object<str> // Privately inherit from dbc::object.
+  #endif // DBC
+          {
+      ...
+  };
+
The equivalent code form is less readable and requires the programmer to write more code increasing the opportunity for error. Therefore, it is recommended to use DBC_INHERIT_OBJECT() instead.
Parameters:
+ + +
[in] class_type The class type. For templates, the template parameters need to be specified.
+
+
Returns:
If preconditions, postconditions, or invariants are checked (DBC_CHECK_REQUIRE_, DBC_CHECK_ENSURE, or DBC_CHECK_INVARIANT symbols are defined at compile-time), this macro expands to code that privately derives the specified class type from dbc::object. Otherwise, this macro expands to nothing.
+
See also:
Use DBC_MULTI_INHERIT_OBJECT() if the class inherits also from other classes.

+Use DBC_MPARAM() if class_type is a template with more than one parameter.

+ +
+

+ +

+
+ + + + + + + + + +
#define DBC_MULTI_INHERIT_OBJECT (class_type   ) 
+
+
+ +

+This macro must follow the last base class type name and if privately derives the class from dbc::object when multiple inheritance is used. +

+This macro is similar to DBC_INHERIT_OBJECT() (see related documentation). It is used when the class type also inherits from other classes (multiple inheritance).

+This macro is used for convenience so the programmer does not have to manually write the private inheritance from dbc::object with the #ifdef DBC guard. For example:

  #include <dbc.hpp>
+  
+  class B { ... };
+  
+  // Inherits from both B (publically) and dbc::object<C> (privately).
+  class C: public B DBC_MULTI_INHERIT_OBJECT(C) { // Recommended form.
+      ...
+  };
+
which is essentially equivalent to:
  #include <dbc.hpp>
+  
+  class B { ... };
+  
+  class C: public B // Equivalent code form (not recommended).
+  #ifdef DBC // When one or more DBC_CHECK_... defined.
+          // Note the use of ',' instead of ':' used by DBC_INHERIT_OBJECT().
+          , private dbc::objec<C> // Privately inherit from dbc::object.
+  #endif // DBC
+          {
+      ...
+  };
+
The equivalent code form is less readable and requires the programmer to write more code increasing the opportunity for error. Therefore, it is recommended to use DBC_MULTI_INHERIT_OBJECT() instead.
Parameters:
+ + +
[in] class_type The class type. For templates, the template parameters need to be specified.
+
+
Returns:
If preconditions, postconditions, or invariants are checked (DBC_CHECK_REQUIRE_, DBC_CHECK_ENSURE, or DBC_CHECK_INVARIANT symbols are defined at compile-time), this macro expands to code that privately derives the specified class type from dbc::object. Otherwise, this macro expands to nothing.
+
See also:
Use DBC_INHERIT_OBJECT() if the class does not inherit from other classes.

+Use DBC_MPARAM() if class_type is a template with more than one parameter.

+ +
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/pages.html b/doc/html/pages.html new file mode 100755 index 00000000..c5cc424c --- /dev/null +++ b/doc/html/pages.html @@ -0,0 +1,43 @@ + + +Page Index + + + + + +
+

Related Pages

Here is a list of all related documentation pages: +
+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/post_8hpp.html b/doc/html/post_8hpp.html new file mode 100755 index 00000000..c202af12 --- /dev/null +++ b/doc/html/post_8hpp.html @@ -0,0 +1,137 @@ + + +dbc/post.hpp File Reference + + + + + +
+

dbc/post.hpp File Reference

Header file to only include facilities to support "old" postfix in postconditions. More... +

+ + + + + + + + + + + + + + + + + + + + + + + + + +

Namespaces

namespace  dbc

Classes

class  dbc::copyable< T >
 Indicate the specified type is copyable to support the "old" postfix in postconditions. More...
class  dbc::post< T >
 Postcondition argument types to support the "old" postfix. More...
class  dbc::dbc::post< T * >
 Postcondition argument pointer types to support the "old" postfix. More...
class  dbc::dbc::post< copyable< T > >
 Postcondition argument types to support the "old" postfix. More...
class  dbc::dbc::post< copyable< T * > >
 Postcondition argument pointer types to support the "old" postfix. More...

Defines

#define DBC_COPYABLE(type)
 This macro marks the specified type copyable so its value before the body execution is available in postconditions via the .old postfix.
+


Detailed Description

+Header file to only include facilities to support "old" postfix in postconditions. +

+


Define Documentation

+ +
+
+ + + + + + + + + +
#define DBC_COPYABLE (type   ) 
+
+
+ +

+This macro marks the specified type copyable so its value before the body execution is available in postconditions via the .old postfix. +

+This macro should only be used with the signature argument of the DBC_CONSTRUCTOR(), DBC_DESTRUCTOR(), and DBC_MEM_FUN() contract macro API. When the contract code API fun::constr, fun::destr, and fun::mem are used, dbc::copyable is used instead of this macro.

+For example (from A Complete Example):

  #include <dbc.hpp>
+  
+  class str DBC_INHERIT_OBJECT(str) {
+  public:
+      // Must have copy constructor.
+  
+      char& operator[](const size_t& index)
+      DBC_MEM_FUN( (public) (char&) DBC_COPYABLE(str) // Copyable class type.
+              (operator_at)( (const size_t&)(index) ), {
+          DBC_ASSERT(index >= 0 && index < self.size(), "index in range");
+      }, {
+          // Not a const mem fun, use 'self.old' for object before body.
+          DBC_ASSERT(result == self.old.chars_[index.now],
+                  "returning char at index");
+      }, {
+          return chars_[index];
+      })
+  
+  private:
+      char* chars_;
+  };
+

+

Warning:
A type should be declared copyable only and only if the value of the related variable before the body execution is strictly needed to assert postconditions. This is because of the followings:
    +
  1. A copyable type must have a copy constructor otherwise the code will not compile. If you are writing a template and declare one of the template parameters copyable, be aware that you are adding the extra requirement that the template parameter must have a copy constructor (and you might be doing so just to specify the contract while your template implementation would not require the copy constructor for that type).
  2. This library internally uses the type's copy constructor to copy the type's value before the body is executed. This obviously has an impact on performance.
  3. The copied value provided by the library via the .old in postconditions is only as good as the copy performed by the user defined copy constructor for the type. For example, if the copy constructor has a bug or it performs a shallow copy where a deep copy is semantically needed, the value returned by .old might violate one or more assertions in the postconditions not because of an issue in the function body but because of a problem in the copy constructor.
+
+For example, there is no need to declare copyable the type of a constant argument (the argument cannot be modified by the body because it is declared constant). Similarly, there is no need to declare copyable the class type for a constant member function (the object cannot be modified by the body because the function is declared constant).
      template<typename T>
+      class C {
+      public:
+          // No need to declare C or "const T&" copyable as const fun and arg.
+          T f(const T& x) const
+          DBC_MEM_FUN( (public) (T) (template)(C) (f)( (const T&)(x) ) 
+                  (const), {
+              ... // Preconditions.
+          }, {
+              // self.old is same as self.now because this is a const member
+              // function. Then use self.now and don't declare C copyable.
+              // x.old is same as x.now because the argument is a const&.
+              // Then use self.now and don't declare "const T&" copyable.
+              ... // Postconditions.
+          }, {
+              ... // Body.
+          })
+          
+          // Declaring the types copyable as done below is not needed, has a 
+          // performance impact, and requires C and T to have copy
+          // constructors.
+          //  T f(const T& x) const
+          //  DBC_MEM_FUN( (public) (T) (template)DBC_COPYABLE(C)
+          //          (f)( DBC_COPYABLE(const T&)(x) ) (const), ...)
+      };
+
Parameters:
+ + +
[in] type The type that must be specified copyable. This type must have a copy costructor, otherwise the library will generate compile-time errors.
+
+
Returns:
Mark the specified type copyable within the signature argument of contract macro API DBC_CONSTRUCTOR(), DBC_DESTRUCTOR(), and DBC_MEM_FUN().
+
See also:
dbc::copyable for same functionality for contract code API.
+ +
+

+

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/annotated.html b/doc/html/str/annotated.html new file mode 100755 index 00000000..27bc4609 --- /dev/null +++ b/doc/html/str/annotated.html @@ -0,0 +1,32 @@ + + +Class List + + + + + +
+

Class List

Here are the classes, structs, unions and interfaces with brief descriptions: + +
strDemonstrate the use of Design By Contract for C++ macro-based API implementing a simple string type
+
+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/classstr-members.html b/doc/html/str/classstr-members.html new file mode 100755 index 00000000..dd31c5cd --- /dev/null +++ b/doc/html/str/classstr-members.html @@ -0,0 +1,36 @@ + + +Member List + + + + + +
+

str Member List

This is the complete list of members for str, including all inherited members.

+ + + + + + +
MAX_SIZEstr [static]
operator[](const size_t &index)str [inline]
size(void) const str [inline]
str(const char *chars)str [inline]
str(const str &other)str [inline]
~str(void)str [inline, virtual]

+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/classstr.html b/doc/html/str/classstr.html new file mode 100755 index 00000000..245d2369 --- /dev/null +++ b/doc/html/str/classstr.html @@ -0,0 +1,245 @@ + + +str Class Reference + + + + + +
+

str Class Reference

Demonstrate the use of Design By Contract for C++ macro-based API implementing a simple string type. +More... +

+ +

+List of all members. + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 str (const char *chars)
 Construct from C-style null-terminated string.
 str (const str &other)
 Copy constructor.
virtual ~str (void)
 Destroy.
char & operator[] (const size_t &index)
 Return character at specified index.
size_t size (void) const
 Return size (total number of characters).

Static Public Attributes

static const size_t MAX_SIZE = 16000
 Max limit on string length.
+


Detailed Description

+Demonstrate the use of Design By Contract for C++ macro-based API implementing a simple string type. +

+

See also:
"example/str/str-codeapi.cpp" for same example using code-based API.
+ + + + + +
Precondition/Postcondition/Invariant Parameters:
+ + + + + + + + +
       [in]selfConstant reference to this object (similar to *this in const context).
[in]entity.oldValue entity had when preconditions were evaluated (in postcondition and for copiable entity only).
[in]entity.nowValue entity has when postconditions are evaluated (in postcondition only).
[in]resultValue being returned (in postcondition of non-void functions only).
+
+
Invariant:
 {                 self.chars_ != 0 /* "chars exist" */;         self.size_ >= 0 && self.size_ < str::MAX_SIZE /* "size in range" */;    }  
+
+

Constructor & Destructor Documentation

+ +
+
+ + + + + + + + + +
str::str (const char *  chars  )  [inline]
+
+
+ +

+Construct from C-style null-terminated string. +

+

Parameters:
+ + +
[in] chars C-style null-terminated string.
+
+
Precondition:
 {                size_t size = strlen(chars);                  size >= 0 && size < str::MAX_SIZE /* "size in range" */;    }  
+
+
Postcondition:
 {                 self.now.size() == strlen(chars.now) /* "size set" */;         strncmp(self.now.chars_, chars.now,                self.now.size()) == 0 /* "chars set" */;    }  
+
+ +
+

+ +

+
+ + + + + + + + + +
str::str (const str other  )  [inline]
+
+
+ +

+Copy constructor. +

+Copy constructor is used by library to support "old" in postcond. User defined copy constr is needed for pointer deep copy.

Note:
To avoid code duplication, this and the above constructor could be refactored delegating implementation and contract to an init() func.
+
Parameters:
+ + +
[in] other Other string object.
+
+
Precondition:
 {                 other.size() >= 0 && other.size() < str::MAX_SIZE /* "size in range" */;    }  
+
+
Postcondition:
 {         self.now.size() == other.now.size() /* "size set" */;         strncmp(self.now.chars_, other.now.chars_,                self.now.size()) == 0 /* "chars set" */;    }  
+
+ +
+

+ +

+
+ + + + + + + + + +
virtual str::~str (void   )  [inline, virtual]
+
+
+ +

+Destroy. +

+ +

+

+


Member Function Documentation

+ +
+
+ + + + + + + + + +
char& str::operator[] (const size_t &  index  )  [inline]
+
+
+ +

+Return character at specified index. +

+

Parameters:
+ + +
[in] index Index position.
+
+
Returns:
str's character at specified position.
+
Precondition:
 {                 index >= 0 && index < self.size() /* "index in range" */;    }  
+
+
Postcondition:
 {                                 result == self.old.chars_[index.now] /* "returning char at index" */;    }  
+
+ +
+

+ +

+
+ + + + + + + + + +
size_t str::size (void   )  const [inline]
+
+
+ +

+Return size (total number of characters). +

+

Returns:
str's size.
+
Precondition:
 {    }  
+
+
Postcondition:
 {         result == self.now.size_ /* "returning size" */;    }  
+
+ +
+

+


Member Data Documentation

+ +
+
+ + + + +
const size_t str::MAX_SIZE = 16000 [static]
+
+
+ +

+Max limit on string length. +

+ +

+

+


The documentation for this class was generated from the following file: +
+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/doxygen.css b/doc/html/str/doxygen.css new file mode 100755 index 00000000..74c22a2f --- /dev/null +++ b/doc/html/str/doxygen.css @@ -0,0 +1,433 @@ +BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +BODY,TD { + font-size: 90%; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 100%; +} +CAPTION { + font-weight: bold +} +DIV.qindex { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navpath { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navtab { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +TD.navtab { + font-size: 70%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; +} +A.qindexHL:visited { + text-decoration: none; + background-color: #6666cc; + color: #ffffff +} +A.el { + text-decoration: none; + font-weight: bold +} +A.elRef { + font-weight: bold +} +A.code:link { + text-decoration: none; + font-weight: normal; + color: #0000FF +} +A.code:visited { + text-decoration: none; + font-weight: normal; + color: #0000FF +} +A.codeRef:link { + font-weight: normal; + color: #0000FF +} +A.codeRef:visited { + font-weight: normal; + color: #0000FF +} +A:hover { + text-decoration: none; + background-color: #f2f2ff +} +DL.el { + margin-left: -1cm +} +.fragment { + font-family: monospace, fixed; + font-size: 95%; +} +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px +} + +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} +DIV.groupText { + margin-left: 16px; + font-style: italic; + font-size: 90% +} +BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} +TD.indexkey { + background-color: #e8eef2; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #e8eef2; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { + text-align: center; +} +IMG.formulaDsp { +} +IMG.formulaInl { + vertical-align: middle; +} +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +SPAN.vhdldigit { color: #ff00ff } +SPAN.vhdlchar { color: #000000 } +SPAN.vhdlkeyword { color: #700070 } +SPAN.vhdllogic { color: #ff0000 } + +.mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplParams { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + color: #606060; + background-color: #FAFAFA; + font-size: 80%; +} +.search { + color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +TD.tiny { + font-size: 75%; +} +a { + color: #1A41A8; +} +a:visited { + color: #2A3798; +} +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} +TH.dirtab { + background: #e8eef2; + font-weight: bold; +} +HR { + height: 1px; + border: none; + border-top: 1px solid black; +} + +/* Style for detailed member documentation */ +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; + margin-left: 3px; +} +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +.memitem { + padding: 4px; + background-color: #eef3f5; + border-width: 1px; + border-style: solid; + border-color: #dedeee; + -moz-border-radius: 8px 8px 8px 8px; +} +.memname { + white-space: nowrap; + font-weight: bold; +} +.memdoc{ + padding-left: 10px; +} +.memproto { + background-color: #d5e1e8; + width: 100%; + border-width: 1px; + border-style: solid; + border-color: #84b0c7; + font-weight: bold; + -moz-border-radius: 8px 8px 8px 8px; +} +.paramkey { + text-align: right; +} +.paramtype { + white-space: nowrap; +} +.paramname { + color: #602020; + font-style: italic; + white-space: nowrap; +} +/* End Styling for detailed member documentation */ + +/* for the tree view */ +.ftvtree { + font-family: sans-serif; + margin:0.5em; +} +.directory { + font-size: 9pt; + font-weight: bold; +} +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} +.directory > h3 { + margin-top: 0; +} +.directory p { + margin: 0px; + white-space: nowrap; +} +.directory div { + display: none; + margin: 0px; +} +.directory img { + vertical-align: -30%; +} + diff --git a/doc/html/str/doxygen.png b/doc/html/str/doxygen.png new file mode 100755 index 0000000000000000000000000000000000000000..f0a274bbaffdd67f6d784c894d9cf28729db0e14 GIT binary patch literal 1281 zcmaJ>ZA?>F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tPF5Qt@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`J`5fAJ*eJbB;uNuKA& zdERDo*{Y<(If(#(B$Lr#;nB(8Y#ia=ZCeW?JfPLuQY`=@cW$k}Rivq|vbxGrRq1Tl9;+(gNt?}UtVKM2`T5t1jLzuL@0UIs`S#vlhl4)^ zLgSYrPj@$+`|j?eSbXTmiHGkWxV8V}BzNR?pl9k_s4pDu9vd5a_UzZEPk)}Ad{AV_ zzddrjrh4=Imr`E06;LY{)YYt?o}L~H@7C}F^WB!Ra=v`Q0bj{>5&$66CWF>mf6vjP z2N>RRY6ZYa=K`76>+|_)Xdwko+7wv}7cN|btOhWb(*{sta~6b?S8Omrxw}!4`NhGr zZVpNqpu1@BE`QGWNTpEpcJVW5izu~2B^GlM?1(OPg)zwW;QcP@Ltcclm>XbJL9C|j z=9!2?ua=uIlf0%AndzHsRC}IyTL$EhAee(fdKB`?27KeS^2M8M_7b~PiCFO&r5LC7 z7gl1*a<8;SjNaw#h=843_AV9iZbWQOAp5YOC^&_F*9K0> zB|6%IDb?aM#3viTxkLU4aXg&@+CkNTOnQ1iMP*^?b|^lJy$4C)Zk4isV!|RZ*XhXh zw8q3$=*0LeGC!XI_Wc?dkT~3+*Gu%%yIqP+Wr3H$=&ROMQU6q}Ag^P~>c5vAEO;a- z_dK-3PPeKar%)6$j~vI2#*-YH!1h6HYVtwCX5_wM`iF#UKz&&@9Oo5w3%XGYrX zW>dY~)SG-((Yim%`InwgTvyRC?e=Wh^8KCao!R6Eg&TpVWUY1sN~4G}V?nFnEGo-; zHZ_$eW9-GnC%^WS9b z@p;-$oH#MtC0v>Q$HX%4^JdFdO$0cbv-W)Q TtK}Eh@>>I#ipmV1>S*>q-hkC} literal 0 HcmV?d00001 diff --git a/doc/html/str/files.html b/doc/html/str/files.html new file mode 100755 index 00000000..f811ee4b --- /dev/null +++ b/doc/html/str/files.html @@ -0,0 +1,32 @@ + + +File Index + + + + + +
+

File List

Here is a list of all documented files with brief descriptions: + +
example/str/str.cpp
+
+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/functions.html b/doc/html/str/functions.html new file mode 100755 index 00000000..7d5fa9c5 --- /dev/null +++ b/doc/html/str/functions.html @@ -0,0 +1,50 @@ + + +Class Members + + + + + +
+Here is a list of all documented class members with links to the class documentation for each member: +

+

    +
  • MAX_SIZE +: str +
  • operator[]() +: str +
  • size() +: str +
  • str() +: str +
  • ~str() +: str +
+
+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/functions_func.html b/doc/html/str/functions_func.html new file mode 100755 index 00000000..502bb81e --- /dev/null +++ b/doc/html/str/functions_func.html @@ -0,0 +1,48 @@ + + +Class Members - Functions + + + + + +
+  +

+

    +
  • operator[]() +: str +
  • size() +: str +
  • str() +: str +
  • ~str() +: str +
+
+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/functions_vars.html b/doc/html/str/functions_vars.html new file mode 100755 index 00000000..b17a72ba --- /dev/null +++ b/doc/html/str/functions_vars.html @@ -0,0 +1,42 @@ + + +Class Members - Variables + + + + + +
+  +

+

    +
  • MAX_SIZE +: str +
+
+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/globals.html b/doc/html/str/globals.html new file mode 100755 index 00000000..e044dd9f --- /dev/null +++ b/doc/html/str/globals.html @@ -0,0 +1,41 @@ + + +Class Members + + + + + +
+Here is a list of all documented file members with links to the documentation: +

+

+
+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/globals_func.html b/doc/html/str/globals_func.html new file mode 100755 index 00000000..ecc3af3f --- /dev/null +++ b/doc/html/str/globals_func.html @@ -0,0 +1,41 @@ + + +Class Members + + + + + +
+  +

+

+
+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/index.html b/doc/html/str/index.html new file mode 100755 index 00000000..c412cd22 --- /dev/null +++ b/doc/html/str/index.html @@ -0,0 +1,25 @@ + + +Main Page + + + + + +
+

+

+

+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/str_8cpp.html b/doc/html/str/str_8cpp.html new file mode 100755 index 00000000..ac4ead48 --- /dev/null +++ b/doc/html/str/str_8cpp.html @@ -0,0 +1,61 @@ + + +example/str/str.cpp File Reference + + + + + +
+

example/str/str.cpp File Reference

#include <dbc.hpp>
+#include <cstring>
+#include <iostream>
+ + + + + + + + + + +

Classes

class  str
 Demonstrate the use of Design By Contract for C++ macro-based API implementing a simple string type. More...

Functions

int main ()
 Main program.
+

Detailed Description

+
Author:
Copyright (C) 2009 Lorenzo Caminiti. Distributed under DBC++ Software License (see file LICENSE_1_0.txt).
+

Function Documentation

+ +
+
+ + + + + + + + +
int main (  ) 
+
+
+ +

+Main program. +

+ +

+

+

+
Generated on Sat Nov 21 11:16:01 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/html/str/tab_b.gif b/doc/html/str/tab_b.gif new file mode 100755 index 0000000000000000000000000000000000000000..0d623483ffdf5f9f96900108042a7ab0643fe2a3 GIT binary patch literal 35 ncmZ?wbhEHbWMp7uXkcJy*>IeJfk6j|fqX^=1|}vKMh0sDa2W*H literal 0 HcmV?d00001 diff --git a/doc/html/str/tab_l.gif b/doc/html/str/tab_l.gif new file mode 100755 index 0000000000000000000000000000000000000000..9b1e6337c9299a700401a2a78a2c6ffced475216 GIT binary patch literal 706 zcmZ?wbhEHbZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET99@1@a36+kb~?0UJ*yc&I3X_m z!ND^5$O7$#8OFRuDhG}!?8z?cdZK&!`PWjdR;Aj^wZ` zeK{IEYHBJ)6K8VIp1`BVt++swf6j+=L{p1*nO(VhE`pFexG@5$|>uaCcd z`0m=9m+yak{QmXN#Sc$^{$X9h9&q2jiKAI|&T)a;PPx2K9p`YIdw8HtR5k2Q$2-O2 z*;3y{MQ-RnJTgJfI&R5|O)AHxDf_00XbPvDZPy4t=hHd)nfLPvms&O`Ok(sD()5v$ z5U@&h;a=#xbxVbo2~X&Xj0Ie(f{v>vERH+qC+nTG=B8Nca=wU-O$?1&vUgV~9=!H; zx>3p9Yn%*<>t~sk+&0xfyS8RsPfYBd<~wWK%j-LmpU>O7yX^h#UCp1x-p#i7@bE;py8XI6 zmY<)m>~)W~yIWcMVoiPg{duuf<*)9qZ9l$m*Ph&W&$jlv*Vpa+{pH@n=IQ$L?0$ax ec60Ul|8o2P|NVbd{6P)#weSbE3}s?04AuZvx_~SI literal 0 HcmV?d00001 diff --git a/doc/html/str/tab_r.gif b/doc/html/str/tab_r.gif new file mode 100755 index 0000000000000000000000000000000000000000..ce9dd9f533cb5486d6941844f442b59d4a9e9175 GIT binary patch literal 2585 zcmbV}`9Bkk1ILFF--w5zJc=ZZT(zjE=;2|_S)Qm~rCWz1Pc)KPl;jv%A#&v2*x}yc zmf2~Jm~&=xjJY?PqwIN}f8qQ2{r$uH{c*nJbmr{cR5??*egHrs-B=MzCF`3%e{FAW z{oL5xTHn~5TM{jaB;@|_Ue5F&Zb@p(kMyG{*;gWDg zyeL|eZf7Qd8=#bXzSiR{yzRgLSj-fJS8>lBjVHN z^o-0eS=nE6a`W;LChBs=`+QAJP~{b93>H^eRb5kCSC1zUNezun%`L5M?RDzv#%jk7 zYVRX=vATPD`+oEfum^{RM@GjuP?-r=yh0!p;Vx^T9G7~`7%5ydH%70=jyJ;;`d;hv92x3R=z{xp+Lg2!*@OK*K15-t&okoPtSED)h&$RLxdbA zseWm^C3d%-yRNi-ryk^!ek+C`n&~cd$#ZWct_cUL{l~i+Nzx^5d!n94(>bW-iL~Rl z&8r)?q|1DIo=0=judQ{FaGcfLERz8gfn3-Qt<2lksh{mzpT}DXxUuR^z=^key&q4! z+wWI45vL0k$R^(F#{qfqhUsN@WA+w-V?LPH33!Q?WFSB3)WBojE@hK41Nb?KfS+Qo zXgrzfsP$wr4Qzy*{OD>uJBjdgGM@VMml5)2f~_}lD*YyOb}Hjeobhz#4c`w(l^>KK zr?Ud;W~Z}*w;%hZ|2^p^+f06gJDJQD zeIhGADbDmm&6arh(q>EZ<7mjzg7l|z$hRL8=1>)Nv=S7CY$B}iYJ&*T_-T_OG*L1q ztZ3Lana33?y3AKnyq^YCF|4x%Rb5WU&2qcl{TFKey%QJeMxn^SdT!hZ5+0i1zeusiYVp-phBl7b5+Px-X&LhByq z0F&<;K0l2+v>qiHlXb#$jXMv$uK-dEGE9L~qtdU(XeRXmvu*K2Q&6!fD**JxYP4b4BR7FdJ$Qx9G9`J%-_X!a#LGpp3g9)VWytGCa;7`S1_e8F~!R+aSJ zOF17p2`H?2kPs8Q`_;U}+D%3p zs2-0BTqFwpUoBk`?P;iPQ(IbEA|JmMx!P&YYG|R@S=5Mnw;-?A6rEEVyV%d7{iU4a zNk`i!%F(Ykpm`}#oH;BjY->@b8vQedv;pza2FL&*6ufjd+*3Ute&>kes~TU?^KkojsTh(o~(3tk1Y6>4(yn( z#U*ID9@eg-beKo1B;HXe+}{Z%n@7m0+yxivuqk9~;!1LGQlah)xYK4>wgL}l6dsaN zIxlRlq`*`j9PG4*0hD6YV_b_2w5b#)o7J?`q#{GjvvKlD`T*dWcZx<-s(ZvLB44E# z=!|sw!?)@%y$oRNL#25WS3lzdii}TuQ3?CLnvQ1_n};2sT_;Y;#d3=+-(O% zMN$>O!3;ke(UuLR%h_&)N zs^!-@A>QR}4yB1bPp`9S19ikTbZ~O{&FF-yHK{En;mmShDUIEw03`j(DBIsM}Rjki2J#SQa3gFZTKBPDeIiLt9Z z%bL3(B@Qw%(B`wSMS~dPh$=R`(}lBoFXKy(s|*{#ru$wjsBc_O#zxNk9w+UUHmx(U zmJ8+M+ndtnZ<7|VU9Mbt61zpo9T&3%Wx&XII=#QJxjR`CZf22ac3d51Z?GD%LEe_&*t46Qf;4`bZ7p2K(Ab5>GfT^}4! zBT&HZD`^PEgWoI&{~o-ID0F?O`75sm(87x%A{(}Ch1)QlzdJ)1B-eqe5a(weg0`4lQIf1evjvbBY50DVbzO7CLf|vP z2#0(U-|jZ`H{y5N^o7%iK6H>_HEGN->U6^!)1{XpJV!!4(Ig7wzZQ*9WYF4X1rG0x z=1uA@i`rIAciubDC{;~b(|&|A@xkjRP5aRcvRU9tvIm}jDB6J eQ0-6-y)mpwdT=ayS0tBxKDA*~;EWmo literal 0 HcmV?d00001 diff --git a/doc/html/str/tabs.css b/doc/html/str/tabs.css new file mode 100755 index 00000000..95f00a91 --- /dev/null +++ b/doc/html/str/tabs.css @@ -0,0 +1,102 @@ +/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ + +DIV.tabs +{ + float : left; + width : 100%; + background : url("tab_b.gif") repeat-x bottom; + margin-bottom : 4px; +} + +DIV.tabs UL +{ + margin : 0px; + padding-left : 10px; + list-style : none; +} + +DIV.tabs LI, DIV.tabs FORM +{ + display : inline; + margin : 0px; + padding : 0px; +} + +DIV.tabs FORM +{ + float : right; +} + +DIV.tabs A +{ + float : left; + background : url("tab_r.gif") no-repeat right top; + border-bottom : 1px solid #84B0C7; + font-size : x-small; + font-weight : bold; + text-decoration : none; +} + +DIV.tabs A:hover +{ + background-position: 100% -150px; +} + +DIV.tabs A:link, DIV.tabs A:visited, +DIV.tabs A:active, DIV.tabs A:hover +{ + color: #1A419D; +} + +DIV.tabs SPAN +{ + float : left; + display : block; + background : url("tab_l.gif") no-repeat left top; + padding : 5px 9px; + white-space : nowrap; +} + +DIV.tabs INPUT +{ + float : right; + display : inline; + font-size : 1em; +} + +DIV.tabs TD +{ + font-size : x-small; + font-weight : bold; + text-decoration : none; +} + + + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +DIV.tabs SPAN {float : none;} +/* End IE5-Mac hack */ + +DIV.tabs A:hover SPAN +{ + background-position: 0% -150px; +} + +DIV.tabs LI.current A +{ + background-position: 100% -150px; + border-width : 0px; +} + +DIV.tabs LI.current SPAN +{ + background-position: 0% -150px; + padding-bottom : 6px; +} + +DIV.navpath +{ + background : none; + border : none; + border-bottom : 1px solid #84B0C7; +} diff --git a/doc/html/tab_b.gif b/doc/html/tab_b.gif new file mode 100755 index 0000000000000000000000000000000000000000..0d623483ffdf5f9f96900108042a7ab0643fe2a3 GIT binary patch literal 35 ncmZ?wbhEHbWMp7uXkcJy*>IeJfk6j|fqX^=1|}vKMh0sDa2W*H literal 0 HcmV?d00001 diff --git a/doc/html/tab_l.gif b/doc/html/tab_l.gif new file mode 100755 index 0000000000000000000000000000000000000000..9b1e6337c9299a700401a2a78a2c6ffced475216 GIT binary patch literal 706 zcmZ?wbhEHbZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET99@1@a36+kb~?0UJ*yc&I3X_m z!ND^5$O7$#8OFRuDhG}!?8z?cdZK&!`PWjdR;Aj^wZ` zeK{IEYHBJ)6K8VIp1`BVt++swf6j+=L{p1*nO(VhE`pFexG@5$|>uaCcd z`0m=9m+yak{QmXN#Sc$^{$X9h9&q2jiKAI|&T)a;PPx2K9p`YIdw8HtR5k2Q$2-O2 z*;3y{MQ-RnJTgJfI&R5|O)AHxDf_00XbPvDZPy4t=hHd)nfLPvms&O`Ok(sD()5v$ z5U@&h;a=#xbxVbo2~X&Xj0Ie(f{v>vERH+qC+nTG=B8Nca=wU-O$?1&vUgV~9=!H; zx>3p9Yn%*<>t~sk+&0xfyS8RsPfYBd<~wWK%j-LmpU>O7yX^h#UCp1x-p#i7@bE;py8XI6 zmY<)m>~)W~yIWcMVoiPg{duuf<*)9qZ9l$m*Ph&W&$jlv*Vpa+{pH@n=IQ$L?0$ax ec60Ul|8o2P|NVbd{6P)#weSbE3}s?04AuZvx_~SI literal 0 HcmV?d00001 diff --git a/doc/html/tab_r.gif b/doc/html/tab_r.gif new file mode 100755 index 0000000000000000000000000000000000000000..ce9dd9f533cb5486d6941844f442b59d4a9e9175 GIT binary patch literal 2585 zcmbV}`9Bkk1ILFF--w5zJc=ZZT(zjE=;2|_S)Qm~rCWz1Pc)KPl;jv%A#&v2*x}yc zmf2~Jm~&=xjJY?PqwIN}f8qQ2{r$uH{c*nJbmr{cR5??*egHrs-B=MzCF`3%e{FAW z{oL5xTHn~5TM{jaB;@|_Ue5F&Zb@p(kMyG{*;gWDg zyeL|eZf7Qd8=#bXzSiR{yzRgLSj-fJS8>lBjVHN z^o-0eS=nE6a`W;LChBs=`+QAJP~{b93>H^eRb5kCSC1zUNezun%`L5M?RDzv#%jk7 zYVRX=vATPD`+oEfum^{RM@GjuP?-r=yh0!p;Vx^T9G7~`7%5ydH%70=jyJ;;`d;hv92x3R=z{xp+Lg2!*@OK*K15-t&okoPtSED)h&$RLxdbA zseWm^C3d%-yRNi-ryk^!ek+C`n&~cd$#ZWct_cUL{l~i+Nzx^5d!n94(>bW-iL~Rl z&8r)?q|1DIo=0=judQ{FaGcfLERz8gfn3-Qt<2lksh{mzpT}DXxUuR^z=^key&q4! z+wWI45vL0k$R^(F#{qfqhUsN@WA+w-V?LPH33!Q?WFSB3)WBojE@hK41Nb?KfS+Qo zXgrzfsP$wr4Qzy*{OD>uJBjdgGM@VMml5)2f~_}lD*YyOb}Hjeobhz#4c`w(l^>KK zr?Ud;W~Z}*w;%hZ|2^p^+f06gJDJQD zeIhGADbDmm&6arh(q>EZ<7mjzg7l|z$hRL8=1>)Nv=S7CY$B}iYJ&*T_-T_OG*L1q ztZ3Lana33?y3AKnyq^YCF|4x%Rb5WU&2qcl{TFKey%QJeMxn^SdT!hZ5+0i1zeusiYVp-phBl7b5+Px-X&LhByq z0F&<;K0l2+v>qiHlXb#$jXMv$uK-dEGE9L~qtdU(XeRXmvu*K2Q&6!fD**JxYP4b4BR7FdJ$Qx9G9`J%-_X!a#LGpp3g9)VWytGCa;7`S1_e8F~!R+aSJ zOF17p2`H?2kPs8Q`_;U}+D%3p zs2-0BTqFwpUoBk`?P;iPQ(IbEA|JmMx!P&YYG|R@S=5Mnw;-?A6rEEVyV%d7{iU4a zNk`i!%F(Ykpm`}#oH;BjY->@b8vQedv;pza2FL&*6ufjd+*3Ute&>kes~TU?^KkojsTh(o~(3tk1Y6>4(yn( z#U*ID9@eg-beKo1B;HXe+}{Z%n@7m0+yxivuqk9~;!1LGQlah)xYK4>wgL}l6dsaN zIxlRlq`*`j9PG4*0hD6YV_b_2w5b#)o7J?`q#{GjvvKlD`T*dWcZx<-s(ZvLB44E# z=!|sw!?)@%y$oRNL#25WS3lzdii}TuQ3?CLnvQ1_n};2sT_;Y;#d3=+-(O% zMN$>O!3;ke(UuLR%h_&)N zs^!-@A>QR}4yB1bPp`9S19ikTbZ~O{&FF-yHK{En;mmShDUIEw03`j(DBIsM}Rjki2J#SQa3gFZTKBPDeIiLt9Z z%bL3(B@Qw%(B`wSMS~dPh$=R`(}lBoFXKy(s|*{#ru$wjsBc_O#zxNk9w+UUHmx(U zmJ8+M+ndtnZ<7|VU9Mbt61zpo9T&3%Wx&XII=#QJxjR`CZf22ac3d51Z?GD%LEe_&*t46Qf;4`bZ7p2K(Ab5>GfT^}4! zBT&HZD`^PEgWoI&{~o-ID0F?O`75sm(87x%A{(}Ch1)QlzdJ)1B-eqe5a(weg0`4lQIf1evjvbBY50DVbzO7CLf|vP z2#0(U-|jZ`H{y5N^o7%iK6H>_HEGN->U6^!)1{XpJV!!4(Ig7wzZQ*9WYF4X1rG0x z=1uA@i`rIAciubDC{;~b(|&|A@xkjRP5aRcvRU9tvIm}jDB6J eQ0-6-y)mpwdT=ayS0tBxKDA*~;EWmo literal 0 HcmV?d00001 diff --git a/doc/html/tabs.css b/doc/html/tabs.css new file mode 100755 index 00000000..95f00a91 --- /dev/null +++ b/doc/html/tabs.css @@ -0,0 +1,102 @@ +/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ + +DIV.tabs +{ + float : left; + width : 100%; + background : url("tab_b.gif") repeat-x bottom; + margin-bottom : 4px; +} + +DIV.tabs UL +{ + margin : 0px; + padding-left : 10px; + list-style : none; +} + +DIV.tabs LI, DIV.tabs FORM +{ + display : inline; + margin : 0px; + padding : 0px; +} + +DIV.tabs FORM +{ + float : right; +} + +DIV.tabs A +{ + float : left; + background : url("tab_r.gif") no-repeat right top; + border-bottom : 1px solid #84B0C7; + font-size : x-small; + font-weight : bold; + text-decoration : none; +} + +DIV.tabs A:hover +{ + background-position: 100% -150px; +} + +DIV.tabs A:link, DIV.tabs A:visited, +DIV.tabs A:active, DIV.tabs A:hover +{ + color: #1A419D; +} + +DIV.tabs SPAN +{ + float : left; + display : block; + background : url("tab_l.gif") no-repeat left top; + padding : 5px 9px; + white-space : nowrap; +} + +DIV.tabs INPUT +{ + float : right; + display : inline; + font-size : 1em; +} + +DIV.tabs TD +{ + font-size : x-small; + font-weight : bold; + text-decoration : none; +} + + + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +DIV.tabs SPAN {float : none;} +/* End IE5-Mac hack */ + +DIV.tabs A:hover SPAN +{ + background-position: 0% -150px; +} + +DIV.tabs LI.current A +{ + background-position: 100% -150px; + border-width : 0px; +} + +DIV.tabs LI.current SPAN +{ + background-position: 0% -150px; + padding-bottom : 6px; +} + +DIV.navpath +{ + background : none; + border : none; + border-bottom : 1px solid #84B0C7; +} diff --git a/doc/html/todo.html b/doc/html/todo.html new file mode 100755 index 00000000..11c4b78b --- /dev/null +++ b/doc/html/todo.html @@ -0,0 +1,79 @@ + + +Annex: Work In Progress + + + + + +
+

Annex: Work In Progress

List of library to-dos.

+

    +
  1. Revisit the source to sync it with the doc (especially type traits).
    +
    +
  2. Make library thread-safe if DBC_THREADING is "#define". In this case: DbC++ will also require Boost.Threading. sync_<> must have mutex. dbc_global_checking_ must have a mutex. Executing inv+require+body+inv+ensure must be atomic (sync'd by a mutex) so that effectively only 1 operation at the time for class can be exec among the operations w/ contracts. Consider impl waiting pre/post conditions. What would this do to performances? This will add quite a bit on sync at the class level but also at a global level via dbc_global_checking_...
    +
    +
  3. Fix all Boost.MPL static assertions in dbc::fun<>. Do I need to add any more static assertions?
    +
    +
  4. Indicate vimrc config to avoid red curly brackets {} when passing code blocks as macro params.
    +
    +
  5. Read and refer DBC for C++ Std proposal rev 4 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1962.html
    +
    +
  6. Use boost::mpl::void_ (or dbc::void_ as it is done by Boost.Parameter -- why Boost.Parameter does not use boost::mpl::void_?) instead of dbc::none_.
    +
    +
  7. Decide how to handle contracts for non-member functions and static member functions. Shall these be handeled the same? Maybe, bacause for both it might only make sense to check pre and post conditions (no invariants), self is not available, and what about subcontracts for static mem-fun?? What does Eiffel do (does it allow static mem-fun?)? Does any of the C++ std proposal, D, etc say anything about this?
    +
    +
  8. Support contracts for template member functions. class F1 { public: template<typename X> void f(X x); }; and what about template<typename Y> class F2 { public: template<typename X> Y f(X x); }; This will probably require to allow (template) not just before class type but also before function name, and to allos to specify tparam names. Now: [(template)](class-type) ... (fun-name) Maybe fix: [(template)](class-type) ... [(template)(X)](fun-name) What about template variables? Can DBC handle them? template<typename Y, Y y0 = Y()> class F2 { public: template<typename X, X x0 = X()> Y f(X x); };
    +
    +
  9. Support contracts for non-member functions (via dbc::fun<> and DBC_FUN()) and for static member functions (probably still via dbc::fun<> but allowing (static) instead of (virtual) in DBC_MEM_FUN()). Can I handle static mem fun as non-mem fun via same dbc::fun<>? One difference is that static mem fun could still check a "static" invariant while no invariant can be checked for non-mem fun. However, this would require the introdution of a DBC_STATIC_INVARIANT() (without the self arg) that should be checked in and any time DBC_INVARIANT() is checked, it should be checked alone for static mem fun, it shoudl be "optional" but I cannot see how that could be... user will have to always say DBC_STATIC_INVARIANT(class-name, {}) even if there is no static mem-fun with a contract if the static inv is checked in and with the inv...
    +
    +
  10. Suggest code of script to ignore g++ "duplicate friend" warning (from bin).
    +
    +
  11. Renamed "include/ dir to src/ dir."
    +
    +
  12. DBC++ is currently using BOOST_PP_IS_UNARY() to recognize keywords (public, virtual, const, etc) when parsing macro-based API function signatures. BOOST_PP_IS_UNARY() is NOT part of Boost.Preprocessor public API (it is instead in boost/preprocessor/detail) because of compiler compatibility issues (I think just with an old version of the C++ Borland compiler...). Other Boost libraries that use BOOST_PP_IS_UNARY() are: boost/typeof/template_encoding.hpp boost/spirit/home/classic/utility/rule_parser.hpp boost/range/detail/microsoft.hpp How much complier compatibility issues does the use of BOOST_PP_IS_UNARY() really raise? Is there a work-around to implement BOOST_PP_IS_UNARY?
    +
    +
  13. Allow runtime pre/post/inv checking enable/disable based on class name. What for non-member functions? Use Case. I have a template library that is well tested so I want to disable postcondition checking. However, that is a template so it cannot be precompiled into a separate .so with postconditions off. I must compile it together witht the rest of the code. Therefore, if the rest of the code needs to check postconditions, I must check postconditions for the template library as well! I could do this a run time using a map<class-name, enable-or-diable> then providing macros ENABLE_PRE(class-name) that set the map. Can I do this a compile-time (better so I do not have to compile post if I do not check them)? Maybe I can using a ifdef CONFIG_ENABLE_PRE_class-name and the user will have to define CONFIG_ENABLE_PRE_class-name... look more into this. Does Eiffel allow enable/disable pre/post/inv per class? pre function? per compilation unit? (Current DBC++ allows this only pre compilation unit but that's not enough because template libraries need to be recompiled into every compilation unit as indicated by the use case above.)
    +
    +
  14. Consider value in addition contracts to all STL classes. For example a dbc::list<> class can wrap std::list<> and add contracts to it. Post/Inv checking here is likely not interesting given that STL code is well tested to work. Pre checking might be interesting instead.
    +
    +
  15. [Ottosen2006] suggests to OR pre / AND post from *all* base classes in case of multiple inheritance. DBC++ currently only allow subcontracting from one specific base mem fun but not from multiple ones... what does Eiffel do? I might be able to allow DBC_BASES(3, (baseA, baseB, baseC)) and then OR/AND *all* base pre/post (but what about invariants? AND all base inv?). Is this usefull?
    +
    +
  16. [Ottosen2006] indicates that "old" values should be copied *after* pre checking and *before* body execution so to avoid the copy in case of errors. This makes sense. DBC++ currently copies the "old" values, then checks Inv, checks Pre, exec Body, etc. This should be changed to: Check Inv, check Pre, copy "old" values, exec Body, etc (its trivial to change but test it!).
    +
    +
  17. [Ottosen2006] allows "old" only for types that have a copy constructor taking a const&. This makes sense as the copy operation must not alter self or the arg. DBC++ currently does not enforce this. For example, self for non mem-fun is not const& (but just &) in exec() and that is passed to the copy contructor that could eventually modify self (same if for arg that are not const). This is essentially a bug!! Fix it! (The fix should be trivial, either cast to const& or better declare a "const Class& const_ref_self" and copy const_ref_self instead of self, same for arg.)
    +
    +
  18. [Ottosen2006] requires Inv to be checked also by mem fun that exit abnormally via an exception (understand exactly why, ther is reference [5] that I need to study...). DBC++ currently does not do that but this should be easy to implement in exec() handling excetions (different from conditions_violation) and checking Inv in that case. However, if Inv is violated shall I throw invariant_violation or the originally exection raised by Body? I think the invariant_violation because if Inv terminates or exit that takes precendence over reporting Body exception (so Inv throw should also take precende over Body throw). However, I think it would be good to log the Body throw in this case so it is not lost because of the overriding Inv throw, terminate, or exit... think about this more...
    +
    +
  19. Understand the relationship between contracts and concepts ([Ottosen2006] cites all concepts C++ proposals as being affected by the contract proposal).
    +
    +
  20. Would it be easier to avoid to forget .now/.old in postconditions if also pre/inv required .now? Currently, I occasionally use self/arg without .now in postconditions and I get cryptic compiler errors "undefined operator for type ...". For consistency, I could require .now all the times also in pre and inv, then I could offer .old only in post for copyable types. Would that be better? (If so, also "result" should really be "result.now".)
    +
    +
  21. Consider the addition of a DBC_CONFIG_AUTO_SIGNATURE that if defined by the user requires the library to generate the function signaures automatically. I intentionally required the user to write the signature before the macro-based API because I think the code is more readable that way. However, that requires more effort for programmers and given the code duplication of the signature it allows for errors (most signature missmatches will generate compile-time errors but not necessarly all).
    +
    +
  22. Document MSVC error "warning ... not enough actual parameters for macro 'BOOST_PP_SEQ...'" repeated many, many times when using "(f)( )" instead of "(f)( (void) )" to specify empty argument list.
    +
    +
  23. Shall I try to compile on MSVC with /Wall?? It gives a LOT of warning also in Boost... (It compiles with no warnings but the "already friend" one on g++ with -Wall!)
    +
    +
  24. Adopt a more consistent macro syntax: 1) Change the macro syntax so token apper in the exact same order as they appear in the class declaration (NO EXCETION). This way I don't have to remember in which order the tokens come. 2) Adopt the use of '.now' every where (pre/post/inv). In post, .old is availabe for copyable<> types only. (In the code, I make all pre and inv args of type nowof<T> instead of T, for post I just rename post<> to oldof<>. oldof<T> for non copyable<T> is same as nowof<T>.) This way I do not have to remember when to use .now -- I should always use it! 3) Also change "err" stream variable in DBC_ASSERT_STREAM to "violation". For example:
+

+include <contract.hpp> include <iostream> include <string>

+Token Order Rule This way token in the macro syntax "simply" follow the order in which they appear in the class definition (no need to refer to the class delcaration).

+(inherit) Order Following the token order rule above, (inherit)(base-class-type) should came after the class-type (template) and before the access (public), (protected), or (private) because that is the order in which the base class appear in the class declaration. Note ':' is not a valid macro token so (inherit) is used instead.

+(template) for Class-Type If C++0x will allow to use 'typename' outside templates, the leading (template) referring to the class-type (which is already optional) will no longer be needed (but it may still be specified to ensure backward compatibility).

+template<typename D> class converter: public abstract_converter, public lengther_interface /* Removed need for _INHERIT_OBJECT

+
Generated on Sat Nov 21 11:16:02 2009 by  + +doxygen 1.5.5
+ + diff --git a/doc/reference/A++/A++-C++AtWork.pdf b/doc/reference/A++/A++-C++AtWork.pdf new file mode 100755 index 0000000000000000000000000000000000000000..12dbdc0dd1e9f606addb6b5739aae66d557e2554 GIT binary patch literal 33343 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 literal 0 HcmV?d00001 diff --git a/doc/reference/C#/article2.pdf b/doc/reference/C#/article2.pdf new file mode 100755 index 0000000000000000000000000000000000000000..f816e24e9c9617ade99104e115c062b33880a394 GIT binary patch literal 148915 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

a#X^WKZ*%e zqbWi8!TIK7rD6yA?*mF^!B-bQ|13}2UZBCa=T6Klp^^;CL$+u~;8=WX|@hFj7l z(x}fJ28*u)`{0(&^Gdqf1=KHhO z3xDN-Xka8B*BJe-(7-rKX!TC*nBfZ@6gK$b-eq4A3mK2e%RM1ss|LqJ9-E$@n4e$I z5UaKp9%0|>^x46SuB(w7$}WL83=o8kqBUq~<8OKXB&yg1g|mcKN}3Sm>gpATPzUxAIn3 z844Uk(@rbq4hIZQhdrb2*v7{{x4K+-VI{B!ut?Tpo zta-jV`IOxelmZe;f;D%EhFxbqwAxzH5(cmx-QwTK_`&MwmSFQ(FHN{h{%ur-@V*w; zC?oePZ}V@eRQ-<5kye*q%xF##QhBgC`25sAOwRgk$r=8>Ti)l?fO%#{&c_YPpBq^s<_ET`<_A|QkdjQc z)_$ZjA57QuLx$tXh!IC`f37;}&PeEoOhvj(V>dMC$|nm<Cc!Q9KdnQglZif-i++}RJV%^5&=_vOioa*FK zm-km~Y*Fw|OIxo7Ls$&zb;&07HJEz@Z}gknCX%ya-JUT+HX0uM(ECI=*=XxZtsqvK zpM8bA!!n8KqgT zN8iIoX}nt4qv-BrMOZS0+8mAa z%`sBS`wTZwhayNsUuidH08LG)59>w(GWHLT!rpK8xjP9S99XoVq6o=Y`J$I#&FE< zub*tNkBBzL&wf|7V0@4k_I~t@+kioxYne>y53NUM;a~x#boDe%F?&)PvPqN1EO{>WFY^dcl}TX-9IMub<-~%Rlx#KOD2YGSCXF33#gFMo4naOyOpKXt;X% zu*GtW+O&1NWUaan{LXbnPxqItJaTNeNXzSQi_NKW=t$Xbf9=E{*IjA|%`TEUgS;)y zB_U|9c!^g0A|@A8)94aLxyH=aX(SKg0qWNf8ab4o>%q8Jgn#=%)>+kie zahb;aTLpP4f7ShS(U!3ux?-l8-9Ntri31JgHkZCY=C*Uxgno_bT zTlK)L99Ebj(g~!c!PTjZp4L+-5M5L1E$SkPiAeDMxT0qPBM_Y@L)jvAKhur-CO@rv6HKjty zb0c71CuW4K-Yy1}))>wdCRMJORCrrbOp~tQsieM5^bzanRR1KtLn6mbwkdaEKI@J} z=$66Pp9v?xv93;!=gM?5UItyiM9kZ9qgi)A`Nmh4XCJ!Z79Z#4C=Va)*;nd};WCbl zNnPjE^h(gCbK~Fba3|c&y!vcD2x=p)8g{9~IdWdc?;1`w6X$DjS{(k{J^T;IJOaJI zdVO{eE#egQct}M=LPLlAd96|@^(wJ(6;03YMZN!US0RGkMLGJ2OG)8f(!APt3Z`qM z&T}5xOgpZt3AQIh8IoJw-39krUH8mY+4$p|*C9 z&YhDlLejeKst99zSMVmG#z>a-R)!g8IB^&Ed((`NDjsA@_0W#ki?$#=mi0QFU}Lf{ zhX=1d-=-VI(rGCgEUD5J7JKoN`^qOnsoVEzOIHguTHoUdP?QSo8p9^?;-bEg$*^@V z5?%l3ja_}c+vL`x_cG@paZzt8MXYclu6*oRDYg-PCQd(QNc@}<_TnmyH(l(Q!N!eZ zW!^{Cx&BIn`iPYL(nED?!@x&Rwcx+cx(?aY#{L=W;>;>CV`DK4r^sxu7yFUZ_Y5$=7>)v+4Xdmz? zv#sQFk<>uNtmC}yx%nM>F1`6QMgz`9tC-_z!_{tA z5h0XFvVC=8Bm$%$IIARcH6WZLfaaDH9WV^26@Ofl5Qvbk%$eRxu3p?L!a2>GxJzE= z-rQyQT&*5AZjvJg9uQG3OAa*Wl=b^6+6sF!?LA#*Ed>Uj>rZq|vt5Yqp5LoaQ}W53 zmc5@y*7Zt$t^K&$!fWn1>nzyir=r6Tez<fiCGTa_O!%pIv+ozO@p|R~ZGS_uZGJ zrgIOIUAcFA`8vaLBX7Q>PfVX*ikQlB(pc9m{P9)Q#PGG)qC4`=;?Rei-$=IaP}U{i zV|e>uVoR+zE}kfx9D345uI*{&FxuT5l~l+EzoUKKl5Lh%pD7t1m0EVEBjKlpgP86U zc-EuumHW)!FW(>a=e9L8**+pJWTotqwfHIHm8mq<)~__>ZzVG2=Jld_ckSCp8vH5o zTqb{dhjWXX&7=v@Fky=o)oz2DRqKL~HLJXS2EVXFzd-RIXOosjV>$f&^F$7CY7Rqm zo_Ukrb_05~kc$y|pvxq>IZ=s|hi7!;U$>dHgctr`KKlI=;}0egL5kXmY27I83Wl#g z8Jdg(_@4%#iAT$>+IN)%S=bvh1epnxRY{cjJvr(<62hT`AMv`Z^~QEKUcYy42iqzO zzh&%9Ts!z#AxUnY{#8{URv;9$@QM*Ti-EM*@>INKlJ~LGI4|< z%bes^nio7=g`XESB9q~5XO8w~rY~E(T zy|VI4`Z^DN$v_izD~9~rYraKy00I&^nQnU3^@)niUQ5`SIlQ-$qsQ*s86M|T*DLzz zDO_#1m;>}8jM&>C-?#J1Z~Cv(p?HO7D~>qiZ@6==h`w>0kWTPEvFFG`O``Qj1fNsx zBm#7s?=>v$P-*PMsd)Wl`mO!6*#-@BPEy}1Dc;J73Es9_QV7H2v&S8yR`BkwRi1)L z9u#>k?QeZk?{I=480~GGgck;u@bIE6Y@cdQa?_2d_%buZD}sTas&{%s@A?{){tz5Z z_U7I0XI77A<3*Kj2($4&Tr%9TK)AjEc$AgytG~mvBbk=9ts;}l9@(Y;q2`_M7~Ngp z3g0o|yS|lDJ1Q4|D$_3(*ujg}>DPYSEN9t@Xtd^lcL;_l`@t`o%Z9D_m4k;WHadW^ z<=*ZsvZCb7>AFOztFDFTaH2R@#e_W?&HWp1k@$LB*4l>cl-lkim2a7*aX-mLl`a%$ zY^%s+qcV3hl}$T+#~SwU?fT1>nv&(BSWpKpMY*V}5mc=7k>w1Ltuuh$dg|v~(!^%3 zkoYn)_Ip#|XVsU_uSPR8| za(&c1Rh=i4f=J5C`S$z!O6~{xga9z>t$EEb*<$*turm{I?8JFRe3bINT$-)M4WUy4 zHr`I!kcYU6SM$*I-Trex>fwj((Lq5{oy$=nv*WF_7J>_=_m4i!m*U|UGLLQbg&(lQ zvVK2*HJ?_J1`g-};$N5u^o>Kof)B;U(KqOmDOnB!6BBAwnJYIOb^W=YY6P8~jy&@s z7!m@6Y?{AF76Z()>wLC}SW0_dGQT}D-b&iH+-w_ZQck&j<2QDeIv!ixF4}`rHQ1tTgOoUAk&Rw;ytN@$T2+@(RdB}q7c)Pg-Y$Vag!_73QQk2-3?BBvGie>klQT? z)ND|>WaNRO!@a67SJq#nVJ>@|7%v#0uuXpYyDgb7vDH65*oE8N@R36eZZ3SYO1aVn zH%(8l%T$y3VrG1F+}(7FQukIIMDy6KX7Kx&); zvb^BtVjkYS3AA4{JZHKHnUJrm8M}>_#MLKcBRQtNGzG>5Rj!d=HnY1m9x*O5XFsSW z)19nHbI*)+=u01`uG|h*1xyHCgl9#3JkG)yQeUPveq9u+pVQaL!a3&8PScYlIyz=5 zmfF17vmvyMnk@Qu>hnyofWiOi(WkC0?8cf+rQ8^vq1xWng>gl#Rqf=o=*FD;x`u<# z-LHe`xEblWQtp>rkzVdA?{-VoF#E%-z7YKFaTP~$>-W4l@br|vZ|qLeK`g_w?ylDA zZw3Aw)(kWClUBVc(#5&Sn)~>-mvfP%uU+mGlEIhdbuJ(8rxkoJpS|7KXW{3j*SBlY zCU6Dp)fcgf4QY2K#3;zDK%ybTt@f}3sb!M%(`T7LM(B9cKmu2JgZEN<@i}crqA&9}2OB(%$j9ZPO zWiwvQA$z{WYQq2HhthZ zdeqMB9{qbE-$f*K3^5XRBwsl!{ToV^ya7`MloNbAqVwg+ArR!^*ixU!lH=7;6LBzn zM=*BW^kwn>1l{0qc-bb->$sPNE73Fo%ZNJ?$R6;X?{qQ1uF4n8eLLW!j0mcPRErbO zWmR)@(}HrkMUamK#sRv3&CI7vZ9*&^ADnKl%gtY1=1aHx$3pB1CG{Sa%hVn$_Xk16 zX?U(5rXAb>ma*zyy^Z1-`sUDaia4!>@0n)3c! zq`S^v=IMXH_P>>wyOV;3Xi9x`o6}&edLx`n+MM@x=$$GG*PqWW9Za*`*+E=ulYsZE z&JS&6#TApj>dWPVI5ZkfcWVUF9ti76Y6WW7S!>jUK>$W}sL{kEAT)K|H2CW4eu-pD zscapvU?F{>7-iW=>wM~04RW5fAL{N>)r;+g#Sw3KSe6^)Hqr2Td^6~PUh}}?=K~$5 z6Yy#Hdv)Joi0up_;pp=g(JwF!fV=l67)2neYyiyR-}PgFzhUXV+2xsjlaZ{7{!TN+ z!LhLHS3+4cf2Ga&Q9+eYIci>|i6UP<_h6Yw?(2F1AVX@iVDdFSeP@1@SMAs?GIwA$ zq1Za@SN!%_$q{KaH)AR4_;2o0;{A$HHATZ|`rdh7tMq15>()g*4|>rrH_D7G(*L0# zZ?oBd)|h`)0Z$UpgX7y&&9!QG##axS-4)GmQyk{GbvED@Hyj9Q%$kcKeuyTR(x(f6 zCzB|BTQhW~)c7FtDa0Pe|9Tbi&LJ?xwlBj22#-Md2s5?IQ&G#b5JOU%?XBeQ)YmmU zmUhf2R75k8`{A@V{W?kTK8c^sXgdKY5ZbIOl5CN?3IqX;-;?lE)?ae`>C~pSq~*SF zU)xKqdB#K375S3TQfI@XK~TI8Xe1KMv{D9&I3Td;w1ItlpYVYDhZT3g z$%|ucT!YzjVd~6e>2!XJyG`j8Ym1Gn)l&Z9GbM<+`c`n6IG0hq>FC>^&T+5N8(*i} zid`E{fm=UYrm72aPQoYLkc@UKf5I+`owdVdbUA7%ejez(k(L7MXQ*yF#l0-mP5~}0 zb}SH7@3&VxZ-_X}Pu+z3GH_bt(vnuR!9+J18Ngg^<#3OF6OTME!5IH9mf%{FX4+G# za;xsQ!G?2H06)8yzgjGgMNJmay*|_I8rJhWQVpqwBX6mH2%#2E^O_k2R4I7vK0WNE zecAV;<`3yoj;(BdREd|m7(E3IR&1-6PXf6fgYT*dfCN?3wrl7|t&6M2itc&)THw~4 zxzRFrmeQsG@v5O(m%zBDX~)9A;xzTk${fczhNcT9w@k(ZsUJ=14&rea7G_$8IJ`P< z@_=r2ua^r@mcsyMw9341npA!~Ln05tBHxQBt6w=yzR1UUs8#ESQbA{HU=#&jnJO-2IL>JM#6YEAPhn}<#UB*81sd3s~R=x=HWf^2b8eyFi4EW0Kd1u661O-5+6 zVOovK3cR&mF|q7A>1>u7YqH0=8Fo7)wEplW1i3=l>P%wW1Q^YIBn_uL5dKUGkUimH z>qtguJBj@nMz=U^W%wG_bx5}PfdSllSNX>Tn3`URJ8nrpwH&br&$pX+R2APy4=G7dxIg}Q_O{e4fc(3% z`)w=sgI1!i0>8qmh^mw+e)oPi zU7*XIq8BGed{aUq)TuaNK>2D5c4%Oed$-~!{yd{7x9lIoc1&~z6TL8=;!LLi1KLg} zS3MaGVgIsq;yn6OjaNx|)l7%lV!4h6CAroL4%FGYo1=&NE(& zK0dzZ+ooKPSXD6S&M8 z-fS736#N<1bC!#6NaLnB_tj&*8co-=Zt&>TAKeWPpl!*0C47CDt8+ULpA0d3G(*}v zX;V)yNdj;;(w(XTPPjffgX};jLPeJS2t(L^)1yP+BX7gw=8V!t)pfp&l2pB1#?8Y( z?PTB8pkRl2M%iu5QTj0W*2*Qe&ThYo`!9s6pY%uG8p~^OWBEHiru`#6o-W3W%}eRJ z-#zBbJuI8LE-IhYs}svoW~<_6X)@6B751eC&+-YTXNy1Vnp%&6WCXhw3}< z!Obwy-$3fHshMA(!94EqMyS=R*<~AysyRTfz;lT-b*e6 zvYz6fEf%fl!$$$IU4@%nEQg@y$t)BN!6SO_%6IYXPx-C`cMMdQj`*kCi+XkPmrA(M( zJ3uTfz}7LakhYA$Zuo%EtHckgJVbIlTx_)-E1~#f*%QyV?^<8y-D)*&cUOGrtZf`@ z1@csH${hI4kEs^i_{?|JK!!{t2kZ`ittg1K9>bW37K+~gc81Dx6LNLH6v*~QDREE+ zw@{s=BHe~I5B*X772O=mYS~F4kowQt-rKR&IKaMs#*c0|rN+?ye*5~PKiZYwob_;|ir@t*#rY}#5z!Oi?n zZV4}NX1w%~f4ix=)9r(D@+4Gkv3eY0yhhB=0~e|lgzM_MN4lA|Lj0gh075e{F{+~hkKbr9WcXQBb1IRD= zd((tE8>^_|EL{8Ic!%i@lwDGW5!;Sgxnsq6axh-bAY1`FVVvPbpjx0wy}*!>BBu~v zGl3A4Wu_v*JtC1!(`+ELOMypGZwh?g zS0P6$mos-oz(c-Cvy&EGSa}#2}{Rfd11>)Zyp2-HXpT~mH{D_h~_|3Y4aereWG>;&K8iG;l1uH z3HWu`f&I$jx`#x=_I`tT*8YlkaF6J_*{$g%->-U~*HziNlq}%ToLb$f@({1{U!8VX zu2p&Nyf|9abRT6xW%+bUtZ|SQ�XB_7Lp1dx4g!fFR-a{T719lbccMzT>P=Fl5h7 z3m5Yw*Uc`Y%+U(JJ;CGFo?z@-Pv`%7gBes!JM-)J^#w;OA;9L>vxQgq^yk@w-++}* zcrDPuoUL3vEh+I}$R}er^D7H2)N9!p$IEsFd`*HDg85I+@|<7+mbl(Iu~WF4@2?7B z+^EvI=d}|cFTrVH#my0Dd1Kdq{Mn0o%2?}VF*xnH0zMoJ>1s#fa+f~!nk)GKfdc#+ zwQJe=);N^4w;r@KRlTJ?n1@>cbdxoM6LN-`TriZ zhW#%(%>VE~`s?~XI`A)~*1WN7Sl{?Ge}CG)k!JJPX#FSO4lXX9f9Biqk2ISjjl@ZY^Z zJDYH+kdzY_YdqQIb{}istR~4hTYc=*d@`VTn&=echr!Oi?)=65nK^e>r#7YKu5UC@ z8MWGDRD;QY8RsoI<GH`^S)@@GV%|oTyo(Vh%0&t^=_NA_Tsyjn{Q0217Y%65&L-OnrPS5=M z;^}z-gY~DBU7&S4;D=3!N|Sg4kW8I#Ls1Z(kssky>y4$XS;@9mSI`RELfEQz2ao$f zcfim~LeJ6^W*AYgJhjbL#s!R0(`z3lX23a~Y^Rp_q6e0xtnB#NXo0Lc;?ZQHM(fkP zCW*T%HPfnqQ!5~HeD|rzbweSu@_g*`%l6XT`w;2~R#lYqSg4RG=up7E-#(<|=7a3Y zVMvJ7fQ)1#Dw6>!8l>)148d9Jro(`v;z~@HL~^_8S#VW8sG%@zO%Htm|;>+g; z6d5qiH&6T!SPs0NyMDHIZ&_{6Zy5N+^qkqvq}ewLfWNz`1OtqDKB3; zS2wRP0|i;CF;iU54QxYXRL`AW&+KhmghW`nyXLN64h^1B7(LY%*oy zu8g`w7&ovf%|bZHEQ2YDU%reM)o&HtU)~@Fd;#6K731seP-A*6ct8#P#J$M@z&U(#=j=Ll}k|J zaGSx{Of4cGiK;i2t1u4kK+giHx~os|7}X5;ew%@s^NPq-t>U=*X(kmg^-#zvn}{}y z=BoQ8`MWFL0#q1Xm*q2|f2+mZSR8S$#Zp(nTu{n4;Q$VYB~DrL+1$I{90vY=hgmSp z1R{23vsVg6bxrYd4(vT^QgvFHjItiSy_%9)rnC*DAOtXOzTA*|kJ{=J=!n`)aa5~Q zo1+IK+lX4zo?$dOG3^=8prf(MXa7bpved_^GJ~SI7jvcG$ay_W-UHVQ*9`xcws{TWC6kFdbqQ`4$+$2$S`=Ffh7!l2dG_sX7-4bF zr0JRPeyPAu7vS8IenRi84EQs&$<3zKGhK$S&1iRK4Wm{|W8&|6<9$R=l018=bZrcp z8RxxUOfwb=McpP*N1SiQjha<2r;hcGeUl+0tnLsAVMsk?o>|$wdPX5gycNDx(iS2S zVHrsW_dIHNr8-EFcFmWbU{GgbtUDZ^Oj(*%9(c9qxqLlyelB36C7R(y!kBunSm_30 zQn%*kFAXeif$X(E0yfA3%GN&mSH19WRnSF64MYWZTPaX}+1`94zN&Pg)(|WSZc9W# zNvqvP0N*N9R!Wf{z|V z_^?c6#(q<<9awFVX#$;df}*E-0MjQjzp<2@EFJ)4>0F~t#UM$ka{6iwO~|p1C6jWB z)XgQ@HBK!Mzl}@1owopGrfP;jn!3bGxmP#V4DDqfU^ z6{Q2sxih!OMn0YC4le&!c3FNE?UFWXS;|yqSa?&VSe~b{DWvJDW6aXg0YlwFR?ruV zYSR*kVyalS>p0GF&#-p0={vI>%`Y4D{@%Q;t0yx%{N&WCV53|hy2t>T9t1RB>3;5K!vriEx~dm94Y%tnw4V==QWy+cKV8{d z1Qp9QT2A;<_C1X9sF^{2K3Dg24;Fw#pToQ?Q#JdkyU?W;l3URG##POxVpTQVv+`d? z>8=5B4agpXCnTCw$)>=Iv92lIlyL9Evb8?{B@q$TpYTvFD@{YpDJ)*0cRnl0H5dIDZC#4= zywT3VSUw(Dgm|M?{s+k9YHHbk*9LaiooBBD`rnuYpAO4<^se6B06bZ(BJv8#C7 zlnki}TXrG_TI2o>p545J9oTkDPo&lz`2hq()%?y5#O@nY>mvG&-)3pZee%Y|;cyh! zp^pkS2NSLSeC$<2c=_mHM{2HDXXGpU4mr$0{5AI6q$zZh+Ubg|=iJe8MeJCWl83?0 zqRbpC-e&u8ZaA_ws#(x%w(RKfV_l3u2FyJ9B|>gua9yMZf}vmJXVj37z502N5Zcyq zT3#W)p<-(Xkd#v@#)75v83L5FJ!Ar{!h`8QRjy#{v5+$WQ32h^Icp_aH0g+6doB$I z+7$*^Vy+QKk*9Ei*D)!Nu2`5{S)=h`XMyEv$y zN)g~L>apIJmSI5fr#ug$Y8}i&#}=nnrC1g8guAU(&5BL!7Olf=xhgAYSw_=%f1*b4 z&O?wxuBdCF39blai&3_;I+}w9Egr*PE3~m)CehOwE=21Y2(?NqD!?a}ZkW+pq1GN@Jx2Lj>hfu{}8Di>{O! zE40m0mUM9V#nd{WWMDOHsv8_6*AWb=|7tc0}6fcH; z3IT_H`J&yLoxHCVmS$`&{S9uodMwTDz6g>s-7u0fBYRb+H2xL0Tv+b_HLZb%XgD+(Qq_@)aV6MNb-whQiyfqS z+QpEzC)VR@`?^WidqRN3$9d0$#U5gE&Yolft8n#`cB!KVgd*`xz+j4LpZU1Oj|1p} zJw(i!xe}}PS_eNA#gYz0)Kp~tj>h*gTACVuuxc(Vkj!Ze2s<)$qNU`+=~ZB@)$)u5 z$wddx1)wJMO=F0Gf$pzt*wMxzxcPg|Uu_HoT<_Qk2IDp95GMO6dFJ9wA}Y)8YO#C^ z14f%6I$howk%{2USso%4M< zjQW+TLn=(O(ecH#CDz)E=4vWK1PKNRVlBLZae2I<@nyV`@pZhh@vXdxlG(helKH%u zbVJB;esfRqehW|b0D^HRPEEhD8@IaCYPXEzN3+#emm9YYf0Fhuc_Bhd^#npIdwp#l zZmAX?)hQqxIuWrbF|H?Z1))>s6U`R>*2)_Nv`Z-dcX-)hJ!f8RZK2GV4Fpb^1)J7Q zpARO_P9sSK{F9e#DD*oZ zp!+m`2o^f6L-XCi6ra#0?XVUh@tvW&YwYf=?DO7kRe)fxKul*A`c*8qqt;g{u?D&_ zg48<^D5f8*x$tJ?#UCy71}WHZVxaOcN%;>nI}|H$AqjnPVZ;63cj!=V$zp})`}mx7 ziUqkzgYCmB4GCpwH`yTkK-7)eQ$oGeHt+ zXs-{BMTZijA)0E`XK&XQ?3eOfWk6f(f9I*CsmHe{we$Nq1vy$N_1-avh{%2d`s=>x zPMpwhTjNQHxsaIoT7c&O&>kwj`p02|qac6nX#0Q_Myg91M1qERdu;;VSu{T$lS68u zv`gy6;xwi6i$;LD`W)zJ%Y}$4qUw|v-6*6lsQp*7ue`=38R1iMxfBwKQ7^nUUuGzC zLeW;fD~3auc>*GdtP)-VTWtk)xYnqtHeR_sH7>t88o+4=Wm8cJ#!XFMJh6aH1)ocC z$yvU|!tk56W_4brQAr`k&qLm!9%niE+IUW?l3aw{rn=?}gK({yWOdwQ18OClY6AL{ zg{ZihqrpK72ZJgW5c@&_L2}VB!#8__yu3kTZqxX#9kW@(YN3?tg_1FYXHAP)YAQNJ z{8a`dx5Zw*2dpW%>?kCF6NH6o<)34sE z;*4tsZUpf-_C9{!0{W`z4RifC5N^JHcrM@w=v85i-o4HjjQFSzBR=(^+1d4pr@21h zGnB9ygQJM)1~O26wBv`;AnT|dIdFZGp=wZGf{ayG>=^=rob%+LNXK6f7n9^29v#VEV0 z6#<7hanXEto@FoY=L)$Y9r5&un^av@{rOUtgLQG-r>HAh8Ow}*5xS&>ebvV3522D7 z3wv+bO}SU|IHK`?kZf$6U=FcHJW_R$yajb!e=x9Wz8tw;WzsS!LtgbqLS2tBS3yA$ zKQ3ZnUiK?zbzz?9bXj$qXlYv()CnRSpKj~UdG0n7=Beaz@^Gwe#pIgFxF7RDwaaT; z=@$yl-URXpIjivNo4j^nIDCFj2btwLz~io_9)jE*HCAj*Hj1@>w>~!7B|FcuMwYl# z!k_-KKpQ6?b`fb+8c0wsQ#79O;$`E1&WuB_?S~{*6gAJs6>1y$e6~ZLm(-eM_3m!D z{LHR|m?>~*8cd>5YT4Zf;Y1$u^#o$$kOZCNQ(n3R%^Aj{!p<~9EMFv}olW->>Nrh_ z1>s4$dmPTw`3={n&-J(O(ICykJ)#3j^YrncJ|Z^P4xrGFC+yAeX2yMWu)Qp^PPFjI zMk%)7iCH~Me|oAWo4+zb9A0hPFSbs1aG&PL>Tqdp-PW?y_XwIg4@ru`ZeO2UADLZLkO-6p4r)LE1;ykX5^YsLz>OfGRwb!aCnn}=D0X-D`^i!5~ z3X-ij$H+4Yg^{%q;uqW3BKCd5n&-82TM0TFGdt{n=ux*cmy>Na*@q_NO+veNP7!hs z0bEWVT}AV-o8CfHVX4a46Z~yGOCxL55Y0w2gCWW)(PS8Ng7Jq@c21dNO|L~A6Zb&z zgZ0egd&_*G=NG54<*Zk*-_Q4uvFkz3%z6FAjLP`r^=S|DIsjZrG`C+Xg~9+TZ>wpA zneJ-!ht^ORG@al4rJw9=F3x@Hmh^TPe#hRgjS$LyhwzAOgDdZk=>LUYZA8|PNR6q; z!P-a7`qJ3o*y&s=`uvsv);{c}#Vt&j{UiQM=L6hjEw$-b}j z$m#@4`2Hvve;UNH&=u@aQYs*z^98hP_wmu&&! zvDp&LgUAJ{S`iwZ!~HPV*^!D%!Lh-Tdg`POi(cm6;`vrowU}B&Ds|ZL`i${tzvumU zUhaluPsw?8SSU zH}-9Yd$kTDJNSD}#B0h(#>kBWL~wS41RUt1Ryj@ZKw64lL>Hu(AmrH0M%7`!zM+XE zdBn{ya5f}MEi-$8yK8kN!`u(1il3w4!rz6U%D~g7Xnoj~cgYt5N^*Z2l1VBysK_y} z(>P;x!uW=@bZlWJgk=UltVWu%4u!w$Zt`Oc=1Kq3gHX_tg;n6G}l+d)o&e2Znqz@JVzg`TP*R6NsdTg)J(|HO@&; zZ>ARVa9j4J?SgP`r@Edu^{^s&hua(CITWDXRK^rW)bVGneYdS6cs6lzVeUHGK7I%E z-m#E1b}(Y%QA=_v1xF@4MA@jFgC*^d;q|`J9mf*!U86{PA?X^#e4SIpK{MM$i2h znexxJK0)bNFY+sMoZKJmN~>_391JRqc;h}1-pQXUO0TWW8lEJ-v>Nm&!%ZO98ndLc z#QTUr45yHEn6(30fBwLYvygp-B;L&K4H;chc&=2I<-`_cyR6t9E3S~E za9bnHdQKko$z4lBjlX|Xs6D4FFGt1QpS7&m>w_b==`Z##TkfA0RZ_*zE^S8FuaA#M zRygmCN|zVpTh%l)qwdR#QLB5#*Qa>|0u8RIZ_xl0eE0HvcbKHqj5cR-y&MWrY&ei! zETTEypPRynbp|^>Lv~i6Oy=mNCcAAxpGX-MA;0W+i6eaD@yd|%LuS{iK#3cG6e#R& zaDUytT-g@4c^&29lp$A+?zJ(}kL-F3l9w0Fo_coUu@q8cRF3KUoH}uJ6su+LF47%$ zzjg)DYyCR6W^(^>^0MhlMwWFu*Or)*mKK-ec|Gp^`ys=+MryAQg==7`EK^yWLLgU~ z7f0neWfax?$MM&?Uomd#M~nUn@So@zjq8)An|NdI`odHWPPs6HlVb#kzFP7~l&rsP zj8=^2jfM$E7U?tONLwzT0QZC%i)2wd>=6Rxrw{q`seQ?%U#i+!lkz^6# zKcrhV8r!2(sJ`BK%3xsW@34-MHh#-KUJ}2ob8TcvC&X7@;?Z*NWdiJRFVnl8Xnd`n zd!v?;{iLE~?pWM7@5upbD{Zlw2KWB7bEi)Zc8rbczaLSvn0qLkO|HS_wLluKC=T)G zSUUJ#HjrJXGG`h9|9d1Y0Y`VoJP#0peRsCDtiI8g*dFl!Vj`&GJ+gsD^j*11?{z&Y zr2m9NXIwf7D#o_!%$uHtxKlecGq(yhyU9$hvY$2hEG&F*t?Kj0JbD=WQTgfvIp1NK zay*mOMa9U0AXb5BRUyDWe5GnOR^;a;YapB7eR5H8SRR8 zGGwP>RoOlS*Gc&cU$?TIf7%x7J=`aiQZFXEY+xyH9tRH#0}IcUQ94e01jyubET5Un zeVR3|Pc;m=J1g2|7rHeq|5Y)d$LgwoN&fBAy>18Tc{YLWUixhPlb8;7<1`D{0C8PCUkcRC&Q6c9`%;@$OngvLu%f_^moR_Rx$A1}S5J#@tJ|S=^=}Gu8&a%G%yPIcdrv~~ z+m30i7s=-8tVrH5d$fk$phSx>$Q}jq{WyV>!MlnT@9F+PLHxcwD5QR#aUc@@EBbQX z7)dkl0=W zd@CVbc%!2+()ZJvGABmgO(uy~)h~Z;m0Lp0;f482--+g;zeWq-u9@@EF)P90W96*} z(Ma-rD)Wqo%RW_6R|v>cW?}-1OASLP9C=;9ExVd#S{)OXllh6@3j3HX>Uupkj`HpS zQ|Qk%qqp~Z12y^QgK!>Bz|ax8*-hwFyS$oOMB>bnuU9?X-Uh7_%Y9=N=I zW1@O|^+W2p&%t_BFzvT4OUWzRZy2PA)WY;pp;?E6zDLHdJipjGttSaf1nv2q1PN5_ zh{4kHr-Zl6D!Nx35JEWACzO-I}Qkb!mqs_Zfe8kP&Q)cfEdEQ&4I5rGK?6$E(0-lGxRR~C@2~A_s~Exjkt7qGHh!L9%%=`Q=1szY-2#;n3@Zv5 z%mU~~jZFHe=vqu1i5TX%*Mle z9Y)_|9PU+KNFAz^gA?H$Scl{R=W0f6Cf^()P~6&816%9Ejqwr92+#qmA!XkpTyiO` zqOjO-S!W80ut{i3DVx8pT0Cstg4B<21<%>q#3&pn$)Zd^H)Lx5aQ=+AxX9o2`pPl& zNQj>?vHhU{($4NPyJz$idpk}27Y$_^WYO8f)!<&E@egN`Sk1`dU00p8PF{!IWx4eUi_ZuQl;DbCZ%O0XAVKMc2uRXu zX=9pUHhZZcsmLgUdgRKa2AI|#7K|fo*cM5hdCUsT{S*wiG$9d@DjoPDvb;N+!qe#he!R$zUNZ~m0>Di>abMla$2e3_|b(Zg_ z$bilY_^H{o=}88#n(V$SqX|OE`aDn!$bt%}&BypKcH~6Iu-KRb$%D-CWx$Tu2y2-p zJbIhZ1=jOZxoj-Q++-1aLGA4Z)L8DEhP5S10GLN$xOGGSh`%+&eBk?h9dev`sd2@2 z62%8mfEsH~|Mh1mT5b$!-YSUcqPYM$gL@i#r39t+4WQY`M5$g)@>I%g8_tw7H5@(U zk^8c_QjN-l!Iu>5XAC8~+a2I-mlh3Kf~vjuMT9kWIH^QXxmIAZp2H-b!~CNw$_2Ip zHP=xVU-f-M-1`Bk6A1(-VT7`JmGxj}$TI8pLtlSrrCzW10^C|nvQ6?3rbJ%V>p7{2 zWr)=_kp}Z#+6tOys#s%dLU}eRL^>wYA>P0D^I^-mn>R|Zeyu|h>lV#Av>Vk3s3bu7 zoDi10dMW$y^25-2n-W?#e>=V}a-@Y$hgPY&l$%auK4)tN_(ug8Nuvm=&dcIeMfu+x zGN|mY858wagr7*ONCC+wCMhPo6L_#bs`ABW$($`#hEHxz{WR>*MSYh#mnANZ(Gq|t zh`X>Wm8vV85eZ&Ag$5j(OGF0=##2`A&g*`|c$}1%z;Gs#gOxGOCzqfLOjCf&AJvOi zh?OwJ=ehj|;h*&#At_$tYfsClFBsNS|5*LwFw^CxStr1j7~F$nz+h&L8i%Mw#e_B% zb3uku#AvhCMBx{k%Pu`r1;J#(jQZiUHk+cNCO%^>O{23lbB^+fv`4C0PjzO0u*uGK zY1z!SdSrx)`%&16Jq^M`=r&ieZz=IZJCC3BMT$wr6FF7eGmx1%KOzFPoFqf|7%b%B z{CXbn7S}i6(ZdQN^%EQ!T_ZrTx>8s> zuL3PrW_mbg5s{wML>4aYDo#mllCH=pjEc?GH*`Y^B^FrR0jz(q)i4at`*P_+!VSG!>I|zDj>HhSAW;=atNw`BL)EQ@`LxET3%S9GYVR^IG%G z12l7sAeIRM#i6)nXcFY8yr3Z)DFgxG{OvlY+wyQpU`Ls_%z) z*k2Vh?t905r8r{{JA0!Fwe%)sMXB>nGf3J5h=f}fhp$fV_GzG}E}aq+FyJ&ArTj&L z_9U!6rtro$%JdpG;>_=~s|55#+I^2x;io-Au&Kj9NIyRNow>NX45>@ftJE#87XM6^9zVnjX(!+5j`10Q7Bvw@0 z_`kB-*)&+=MLr^a@(Z@-Ee^1|_`VWe`rvK;*yW%gX0}596GRdJj$ABIlZrTEjaG95 z?eWmH_{gyrr$?(2el|V0%+GXedahH<=hQEZYK>()u*Ztn2xr;UlM&sZ6CW}l%l9Yd zIj9c<+SEr6PPZ)vOo~|R7GL|x;XP{gqaz+DhFSNL4VR1C=NdfsnFh%~Vj&WCFqq+o zgI-h>F$z^)?DpM$Lg#D zQiOkTK+hr$rmUY!h~eTaKK1WXK^cXm;MD#)4zI1cA5O4~zjv`Wpmt_V50jJ=ic{XV znLB{v-}79xjQ?s{F(4WPHWI7SFeTs=4Ha&$+n72v5fY#>&Gll|NCVV&!gT5(aoW{? z&-AJ1%#5k$#mz|hFttB+iY-a+d@#8&*vFNrH6A9RbLyR)Ehssm8i&0SFF4PcO5g-~>(zN0N7b?L3t9F6vIpE73% zKBr`_zGLscs>N0Ac4UXUr$;#2-`?DJBqsl~DWXriaOj1CZ#xM*M`T6}yVG*l8u7vj zhtOcNbNpe3jm@hkkm1&jeJ}FCyOa!OvrOlhd}E568KC4EXHKN|6{lfwp3$gd>OdVI z2jz2~-Jwp0XGaQQ1jT44ac3b?cLmBo!0K5JE14FZQ@aB6sMZA zdNw@@lZ!(RF?nxz77hRIny9vb2Mz|n1 zyaouFv_dqFl3vORwtZ=M2{?rcwD!PoKPZ_`WblNJ8iyxt5GA>R&#jRz8Rr6zk++qy z@B%$##C5!zxyXqT#lHJ;pGN%;LZlmSzEZ|X{4P|(fqLBjPK}tRpMzd89K<=tvixzJ zoD~=VsWFRQ{ypS=YJafYj%k^}th!>PlMCrlv$n!=#6CL6MiG61Wzlb3927cnV(F5` zLqed8H!ouol%I|m48>_>W zvFd5ud(tz?Mjx>su-_|#ejj@>%A~&QlF~_XBde8qzTZD+ZqZYjHqY6nZutl`?Z=?1 zJ0OK)X`^Cy)&2XtyLmpSW}fTogj)Jsf}W$odakC6MEcRB1ndRnYNBNT^l>GFg?_j5 zvOCu%OcZ%2Hh1QP-hNVW+?Gt}Wc2$=v1j$|h`?QR-Ouf;wudb|mZy;mffbHD;(-3gqKI3b;lgKU-a1m8w5ESq&K=qo7$48u>wvSmfBKIL8^N zKHa#gEf12|s0*(0RnmTYKC-y;h5F%nwV5xZh>u^HF%Vj|G@&7Y;F!aIx+ncl;_kBlS8;d$C416;-vj=SxV!9s zuK&9|>Hmd%EdNLv`SYEVl(hO8iZ4v;p+l_VLH5(?+1!``i4QO> z^{nDp&W0!-*6O5|p5pvpw7p}nY|)k_d~DmcZQHhO+qlQ(J+^Jzwr!t#Y=8H?uJ?6y zM^#irMOQ@r$i4n#=Gr@Q%{k@(4~&pu+L>wwsO1FGZ;-@le00Lj(Vxp--=7*DQ~Lg+ zPUFBeCIc&}VcP2^)?cUSiai#7}2YL<@*VA1(mWX5-wH+LT8o_~5@{e%MJ55rg zZ+B6nH8o%MmoKGA#ZZaL#L+Lanm`k0<}?YK@lzU!U{aRfkly}Of_rjAa!9lES|N692eAA8U`Xag?w9Lej1ip=kJaMC@1o zxY@uHcMKR{%*mMbauj9-4%Gn9_+5^|2qb;$$6|%Xs|dna9-`m>Ucjg(4n{8-F3kms z(&^*g`0nETaQz4oe;5)e%W zs6za*=3tM#vQwXLdx`hwA@Hg5s^tpI!6uZBJ~T%aR{M+6;BrNyu}P+!MJ$wY*2HMd zw)44sBbf$#bMwZOQAJ+d$}V5Wc~;H9UPZ($syuRKlSesWUs9_sGpuVqg_}kGSB`ldvV*2Xsnf56&1_WtAbnA{tQ}EkON5ba+8!XhY>abPHwfM8|dtw%f-P z-#cU4$~RK;(ucf0PaQqahnpbcSnFm7(DED?b^L>PgbypE>3mT(1FBsrc=O>L=Q zvaB7nd!{x_vdx(NkB55Q=7+AIKHX@1 zz)I|+d0Cz(cWMsFd7=(cGQYYS8hryTd$6$LxsbHcOO~Rr}e56kq z%mn`mt<4X+pd&cVz~@Ixi6Vg#nkZ5D z=t!RIYRq_s-4Y0&5`0IE1j#R=u9?$U=@x)^#}Wi^`9Z1Nli-Ch-~ok?Zfs|Mc5`iG zJSe6Kxhe&m@>PXi^0GblaRt;)Cr5XIJQJ+j$6Fqtt)t)|KF(1>DB$#1CXQ0Q+F8_h zPZ~0i_lw}Zh%{0LWdfqd#JK$&51Tii$NDBYzlV3T@vq|hHT4_VERylSiA&$eZgtct zpJ!9?v-95f-Zmw^2;1Zcmt0()44F(g$d+4rT-N&1oJel5M#ml`HdT6U2{Fpmb-PqL zcF(hXfz0XZkNvXOXSq{)(g`RA1n*WeXtz99Pv2v5yecQObm67*5j|WA*{KD*=N_QE zG8N1XKpe3Ug1r0Ggi_ariY2}msSF;ZMqM`Ws{LOH?Axsi*FJzZg?859_|b=428GJK z9wno{ds+|y)OUnC@7izuc;RA)3@F~lB^uzvkAkVm6e5{eOFD93x@S%C+aN~@G)lmUuik2RMr%ZZ{`M0S zVtn^lC|72Kd>gZV9P+_72BU>BkXc8_7UqR$Eit-Cz?ML{SAaQxUkRaL`{{wIC5SWI z#j$?Dg0Ig8&|v8|VvF`uVanK>yoUGcdkDtWZi7GNaI)gs-s2t?L_>D?kxqLuG|wXO zw=6k%&i5kQ-Y9D@j4FTh^XP?>D*<>;87r9Nh)V~{5CXYdF}9JSuwJ zi|d5`7Pl~S^MNCPx7 zi0EwRBgT2`=7nPuHmj*9oERrYgCl-TdSkeDd2dEx$+Plca9KcFXoE#dINBpaFdx(~ zbCUKB@x&@6D8~yUuNudtDAN6lEGzq~uc*kM(Kti&Tv>fxV_|xRhGrA0!g*G&`=y-O z$`0#S=n%ksbdcKNaXU^^0zKZuK`!bN$`G0bxOUeS%Ye}Kc{u6?Ctjyf;*`0P#xUgZ zD)gL!6;o^WxPd!gYM=AzLtFf-qPM{qBF6d8jK19iI%UeL*}Re&0ZsA@)TnUm>M`*# zNetW(eU~y@+O)NIKZz9!Sp|$T5Kto_1WG^K!A~T5I;sUrt#i4JYY}G~Ke}Q!CrLnlRnzL{gE8!3X3LDvE;l zjncT(4oa+)>hZyO(`CGW8y&dcs8d*)=E>8AAEu$J*j9t~aAIa8Ijg(8z%m$jG-nQttx z**xkBVWwzbN7lng`21>eo2`JiEv~R1Ep+R14V^9CEHQ5C${Lj?l&i2^m2(&_@N%|R z(sA7=^ODuP>WqVr26X&%X-qK|6d7?RIR<1I4L_mnpiYJ@PO1RiSDY5ZRySo^b)G?}BEUR?jf2VpTR3HIkktsTqM26e6Xwq^UCF z_i)0_LZVYAzAQE)X4bMVfc{a*=%O>ToVmh0Mr`Z{;lhsXbJ>}?mF+#dmbDGqmv2Y( z>5E&gd)j*7Vjk`6qgi!wpiCM4GC8IbaSu1%vpt;!=O+q6oIPHr)ni^U7?0AHaO$0G7^cisCMuM@ruOQ|jm(uIH{5#a?+qpEww= z%b;5rG%m0y_uX7fYx!o5oKmm&9F^ypXR6+r#Z}1U$M8um>O`fHxK+#fxE_dJ$?6j{ zIfJ2obl?0s(PbA^@*>4QZo&PDhlimVw3Ar7`&IQ|4V+&f6m9=*tzNfrFLn4sz(;`q z29G|wvA-t6b`{=0F0t|XXN`Kt?%qbb%t*6n^|6<-N;HSNp+5z9dE;%YEpv~TJ&J;* zEEPD}WfgCO**(>=?6YRukf)Y2c8En;klw_UO1rJ$G^2Q}{KP0isgE@M8foV>=*7fr zf7PmB#PyFlq$ICn7yWV)jk78?z*O%zf9SPg?9mLX`5XJj^uVE*Q@ZUD@@S%N(%|o` zMBYz0JxFUW zL0I^Y`VVSNWF!J1u)APaB`3q|OYyd%%Oq7+C8l#(j#E4S#C?qd5x+;_t8T3bdLd?M zLd({xIpf|{i+1JKx&(fW&?L0V0I6xD$pYp4h!d@&C;-Db;K&jv%;n*r2{z0nfYLaL zHKxb)YTZ78XkI7nM`B;@4aThY$7P~~&^b9eFW+^vNusbrFPY#iIj|VrieYxb9D`^( zEI(V=2;MQlzXNKc?i2SRyEPB1G9FNw>L6BFd^OuS6bD9c%TP)njG^Wjj4`mm9MbUc zBM)Z8=dI+DizWdYYj1`X<0X^Yi((Ri%x&$F$Lt#-F3vP#y2bKu{@pt?VbZ-iNDDLO zY{K*y=;)F=NATS?e6v2I1gI$vqLy2ca@x*4j|&feXa68L`oDS0cl!wy1Vlr<R=R9IzX)h!FtXIKM%-h#*QGN3%6-_bXL*< z0pGd1^MSA0#KFBrcZ-1cb2~|?m0_L2I%S?-0J-UlSR(!5-L(YbS=ZFF&r23e%{$|5zn{qLtA*H6SLYuJS_39jO8h7HyOLqg{ zuOngBWbnb8VP!_(Fm3DV!kO1fm^(7Oo=D^A-`9@J;+<4Id9)Y*5wPI92*&+5x7}*1 z@%wu|KIn@qg7h)AF-nUI%Z%@g~1q|}wmwYCVEBnQ|HQwGHo9hsXv=$v5?InQt zfzzvxYNPNQHzt|{gsK3(Fb{aZ<VZ=yxgNHupaj_KZ$;Bxb~r{1ZeC2XkrTswd~Gkb6E`kpTe=O`3YNA^hF+GDv)GHY>XtDY;k~E{^i^1L`0G zsJHis?lNB;L^5#PliG$~Fb?QyWndbko@NGL@3`K(wDH31xn6;Vj+`_HOYLr4gyt-n zZ*A!8n^VKnto8D6cxEr$ua3$`k=U`xSNsxTmLaDDv`<`+LDIVoWj`9ZU~~gcjs7}R z5L4e%_*&n#4(sn7m0N&jwZDv$9ijm$Ml%W~7-dJ&{@#5yPxbV*$sqwWZ#+&|FFM2~ z&odZn{{mKUF(za+^`~U$M?K#0Ml>j*nWAU$yF?6S0I8qYzsyg~5!Ch{Qd%S)y8!Jz zXN`bzXIu0wE4Bwm`ZniA$!XX(E>4ff%H4i=JE^BFMC!X0A>#CR5|n*b%Sg20?$lN1 zD8Dm!&)%^@tzsEjuAL?TS8o*L_hZE!t7oFF2wx;l$Un>8k?NJu6zg`NnbP{5*O6zx z``;%tb4FK=!xs0SL>j-({FTNJakx&w%s`RDK*h+WCLST1 z{_(7K)yXo#ed3q zbg4Y-<{1&8y+U{^aW&ILy8Z{qDC#uA`eH zfBbeqtWDzaS~x}E(Y}USB_1G1&2v9L!~-p|%v(8e+;)4~zS)Ia|b$xTuR zE6V9Pdee_fPKo05TK`K2Oz~QR-uh65L0GYGa++~4k9$FtGny0 zbTM6Oa(gfg6+QMt*}F#G)^z@H6(G-!7v?|04O#w?UG*>6?%&L2SpF>@`G3T0hUFjb zHh&|p{)HR<^ZH+3;6F2)`R{RA|K&CF?_tCLE8hA4EtmD58~1;3Sy`A^IsZ$jaMNjv z4aqmRR$#d&UK=wM1OjPlGKI$tr`>4WTDFDC^fVAl5h;nWJl@#*3EOkCcY6^w9^{nB zn!P64!BS`K^znS;rM4Eyah3jCha@7pDf})@%QEn%h#^5TasVUYoJUF)r&P&?kG6;Z zhh%ut?QV8B>gnL)i3>GCW0x+GBeHn=mv%{b9gF;fM8s36D9!clkC!mNK6)U;YA^i) zg{mh}iez#g;R-#vG);`D6dC@n%D-Neoj$#2{Gpo3AgP38jeFf5ZxRnZpac4*lrQJ!W6-tKnbt8L+532t28pvxZEIiZ;pnxch+| zfElj{%q-%IN6eJtfN}N{|i{ zGN64E;}<5m%(jm5i;-)RM0IEL?mQHzE2OICMlAm}2t!xGv(%}kLyPbT0(ip>YDd#| z4E3Pq`$UVvo?0>zlp+zOQ|>q@4FOv(`CgH==FM#0zB-tQ$numrYS==!6i<^c2Y8lT zLYVMOC^jKFB*H$_Tl5N*)VA5N-Sl&Y$7Sl*@78dAs)2ft0MiZsEx64FbWx&`lXTHM zU30jeNFooOiEGxlH&H`>wH36?&zbYe2@mwGCUPuWd=c~y93%#RjCp$aTbMSYw_f$7Q6isTW7*hNcS_Yq*AX;kal)d zAE{#Yh@_DH$pqdmMvbu0kr_R;0Ms|Pltoq8JT~p>?RLj-4Qw&G{^s_Am2bf_t&Zj_ zHjPD8MSXNzmsP_jJGxU^S{&x0Lr$-L;KyNkc;nbad@v7$`}EK4d%x+3(PI|?lxlpj z6u#IC1L+V#%8LV4<{2(6_NEtDd4a`)#se((FnOqpngfH)j1SU?v^owD326}*s9zbO zH)<*o4Eo_v#)C>Oyd7f^%x66+bVL-CETL(3WV}%?bMR=g?|P_kwvJ3E0jYrNfh)pi zzw37qJ(1wlAY87v;BDc}*y4spYA)Q_s0SIb%9(O54jCmSQb{`;Bmot|Zpl=7!TMPk z5s^T+P@j`iz(s!2zjf?w+)q;y7XofT8^z{LX>E~&Be=eHNrLl4gZT*wwMs!=AR+I} z;-tq+Zhav8zlcpsutxg1iHgSMgB8%G8H7;OWq;a(Vs}$XW-vSeGB-{}yeMKCNZ7QDImyF!Xf(36q?+=xkI7C`!7sQ6K5 z0C3ls=`fE+0**O2@#nA71bXWW5VdBs>r8Iz4NcDP2j^{0BT+HQW5|0#SMb;ZHUqVMxf_0c`?R5! zA!VJk$1;RqQcfzNF6MTkD%wr^KjFv2P8=)Vsx)E5SNm3bZo(O{7W+8i_I1tqNA%mZ zu&8(jWZpG(lLy$zG6^YRqas#ktEENk(sBMp@(nq5hAHq42_}qeP6)ezVw{+5@=$87;BY$`ZAjk88 zm;^-Q_E+GNKv778Ed)-2=vgzHb!LfJ$ptOZl{QN1FLB-R+aC;G>a4NwITx4kT^JJ}&lV1;%lBY$Aad|WBdo-1Eju7(Va!TT7#G&%3a9Aw)DsKaoVr4QC zY_x8u8$vW1@7)k-+ZE{`!5 zYJ@aXS5>NQ+xreblazkIucN5x&hhZH)Tge_rrV0h52G$}ut?hy!1c>4t%q8uTQx>9 zuRV_L0?jkI>5v@z#F1{}^0yVMH2A`}kl|r_4`_6&&-`Ol%hr(Xzl|h0ZNG>6^Dcy; z07|21NRctolUQVzT;)7lZ9k@YqfYod@E1xGfw>$B+m+eUiY{BZKj_}@x0i^OB{lk=E5a z$X|+ED@^C6?tMJ(+;cpE31B^v^RbJ|ppHzf+(fA$NXH>Icv3R2UWndC>b3RCwjvC7 z{$yu;%LWmCz%%w{4dsG+;KwnSvXPI{vP|H0NrCvuxP zUsQ@9_qVUUYvU?VFIXKsp6R)cFR%SMMO-5xyX-rYCj?T8MD`&jIdr@kni9!^H&!*& z-|QyJ1T`$uXcu@69mkn<#|6IGk+;Cc(i3@d&k!YoNjdVj#u-v~lB;~povkId>Q%xJ zpG|>BfH7Ou>-Yz7Dj!GAU8}T#{Brfpb(UG#<9nWcyJLIkVo8a(e3DjMa=SkcpbYtu z+S=iiUO08(e%0|IX!;iE%gzOm?k!uC+c`tnB9^Gz z>w1sbYb`a?er2ty@FAs-cF;qCS_^Ahi^%u(@yox z+?X&;oR+sd)q}%EH{G0EOa1TPSC|#1$y>K@mfCW0LYt)<6Mgy^)DW^*A2y^_)V41h z-{q}O*LP_-`Dc<$4?4WgD^=$0;=hbY`bjLF;NbOznjzkMz>43PmPok-+J zxO%jroH&s=5$`GP7o+sxO*hA)vOniG-a}VQ!1Xe@9Z9Zu#sodHy2KpTp%r5*plhLU zdABmHr%U%Ry|f2U)Zg2yXLZUIpG8z0X@hR5Lc$#%JUaTP79oQ(;-XZ%m^Kpzk`2Ga z@HR~MJb+No3HE0>J`;lZANFT)Jh#MN&=}pXDNVzj4+Thu>0LCqCvI+)3HEe-K17*m z9xzKNLo)+(dQih#brgog>E=14fIBPJkS$IPU2Vt1K?|nEH-ZC_ygY5C=q=1Ho(_`q z=B5q-1`jrM*{K%^pu!Hct6HC*be+mSIRduihYuM1d2 zx>}huMgBNnx>GH;p@)nWFrR^S2@<@KP1vO=i9K7qCro8;)L% z%7z43pTXC`!I#h$cl%NlP<_i{4MUMG^SR`@;g|020&MQ&fr3(@#OA5;zH@hs93GPqE@1lJ-HCSwb9MpRq#)4o9jtS- zl>ydxti1ev8wSj`w@xv~6hMsP-5{}ynn~|63fKfux1a=0+D_uxeOU%VQ5!6Em*Fjl`-)*U#YVv2!xQ#>a z356@?IU_UgmaZrafLL7uVq;CmYeP?rMB z_K=axt{ST$=Kc4R^gm4@l&oA5J2>@SiH%hgqw=2%88U+LRcC$RR zww&!Ps)8AvpXj3v9w}UI-hLbGE$0*qFIr4bMfYt91Ceb-2x_?^~@g$4nc99_|y+q5*`9jf1(yLd^gim zlV~fyFaagI%qCeFUBD~fl8JID_Qw2xlH%w}dU*o130-oc7!4i$ z^|2QI+RVxeguQ)#s6PNP9Dqp@?R)bR@5DqoV$C{UnQ%p;`tZPGoPJE2Gr-C5v2hn| zdG`}E%JMh#azlez(&D>icy2T)2_#m2-&AHO!KK2ZWKE;a8{|hW6pfDPhBsRDC_nr7 zGt(h+tzz-dno`?>v|E5hwmri~Ulv?zi@{WA|Jivf`vC)3!0h7s4^g9kFv$J|+WZSO z`ZwM1{|svMPtMoBLyi8u1p7Zjjs6>Kv;PYo`img_lPmXk`Tv2`ndN`Wwq;E1%>RZ; zGqJL>{ul62wEAY^<_Mzisk+Q>{k|ongFU!j$x7*>#O7F0Zpm>!fPO+qP!J0p3EOWH z|I9^RWFatSS34xGoQ$Mb9S8$RiJYjgjZqQ@--n!D7TUnu@Oh(&>!V=S;lh@knI zVw1(E5uXg+ci($at51LI8`Ue;je6cAM?+jp_ePDLyu6ZQW7YiMa#st-o_zR^8h6iV+!lkc_QF`41_fU0u}P&R zLum}Q7vRTGPS1(E9c!$owChhQ3vFdMh__G1m~ z&%wrHwxwG#bC7ZmUWXBLb58uL__nMbf!TXpg~Wey$lEZ#`Ey>&vHeGrhG2nG@T1^c zv3RgQOXIKOZmYbM^dCYE(SA4mvvct$hRNS zfGV{?ds1(ql|dH@KlHQM_ z<&r|k(?zuAtZIik^>?GXat?ch!K#;e9E8PD!aRTN#``K2#nFfRs@)Bm#ZGY)BfYED z^1BTqijRiM0(jFT0a7w0XpyEv!3F|*pYjoCP8phjXkGz}h{tNY;C?F2hO^?wtA6|` zdZo36+*TS3bWKr}^*zpmy(6Cfc|9+r){B%)%3jrsrLmKYvB=$&OTb2mG;mX)2y6@! zk4UN~)rtb)T<@yW@SN}KNdTHJGcMFpb=6b{Ae&1-yce8z`n(?Il3!HSj5J=^>joqU z>$z&PLeq;5^*GkE$TwAv@GvQ@qG)6d+&e9=>RKru2KKz*7H>o6>WgxN72g4I%0a|m zND9@dG%#49%%iJhb8yiHaydF8=(fkCBBK_&Sh`+yyd`+hq%mT|#UTJFq~Jv$o61(Ba1tJb2)pne* zhQpizvng|_uJVO5gRtxPZvIhW55CiNq^iiCbHC(t;g|-fp6dnUbKmHLfzNvAXkv>i zK(=fKENBeLiJ6dEaH8w@0yT=~6HO!B7AQe81g;t?FO#N|QAc<>_8l}W=sCU^3k2@9 zmAZ^{QHc#ID3%DG2|UZEbQ=!!xp^i4Zvh(IUt^_IR%UkB6=XC+1-y-Z&L;p{1A+ng ze&>245Wlk-oLBzOOp9wx9`}VYAA7Iv!&&{w;Ystg0biMs6OM z$3@Td3mN?74m=i~G5-|C17?8{4;FBo0a7+bHaiY2%FKf$SEC!J;nrd0rsaiS0v;qeA|b-DYs0XoLW3#15` zppErOxaKSaPsFi2`plRss?603fke@O)B~4vpUY;4mD|@w6M+Tc6#j0=8E8tr@@# z=GMDk7HEhEZxzbiR&Uss(q65kZ#|A;4((<*$l2m>FmY+Z%piqLPvLy%V%NN68f)o* zDh2>RR4gfKQu5dx3?4XUM12dKjLaPpkv8H48`R4fF8!{!pdGPI38|>z=xJTW#r?&_ zqy@#IO`f3QO(!9vHr~RPc;Gvpo9?`2d#tYkqopg?8fJu=f6pldSf~lrvU%1RXn%Dc zWMbLQoR4m<c=*7G!Xv@CvZO zk)fX8fJ>@Au~H=q#tm{ThE&GP_{MT9`WY3{yd3Eh0`$GF(XAi`6DVe?b((s%yV8%FAky!2gbu(jZzllh8PbM=0B9)I{zx~ja` zFcB7EEaZ*YA;^#IK}WpaMGLub#=J5S7hhMvbkh(Q`qL?x{)9+eM{VP6BfQc$DOn@t zv^hFt7tCEWIrA*z$r8oS6GHVJi_Knj*#>+u;_2j30tPBd94<+;TM{{I<*N+$ayd?6 z2|tPRSy~)GX1{~j1qRI)2^97XNME)q=iqQz-h#pa{$^3-?1&x1#)BnuVR8}AggDoK z86hO*8Ef9qKOtw?8P zVf(L&^epvBrvoXZ?FUp$UTj9dkP4}|M0bqE>t~Ex3?FVg4jgt9LIFHNN7DJ=4|Y5I z6Kr$-%W*G=p~3DnH+g-Cl*Dvvuf(-k06&ZfB69=?Ks>AD zv30g#f=zZ$JvEqHN7eojk2=M$Fy89Y}!v>b|4oIA)hAu+pFWQAeXS zrh?wjD^B5qzEHYS6ncGsN|uM!ZBNF;bE?l52M3QF!E!h8@>hyt*m*Az?Lrr8TWwQ0 zR@%0Q4QSiGalw-As$$$fYz5m`)4s5KVhv05J_~ZOD!3V5v3YppmM&Y(hS^4E{WABj z=Fcu)(XOAUjJqe5f7~FhQrC4WH(@vw0NESTzqWPOrlVtfps@4_opQwB?7isfLD8*5 zMf#pel~U@agII@xH+lqu?-*&4Znp$@!QJmUb3ugmYw0jvB4z>jc@32{0Yj>3RbX$W zUa20(7Z2O~;ge>m$`*;3_7PXDYZl7(j|OT2gLGJhgR?c-a*l#1IgZ8ojXL0~_UNED{(G#2~NwdIC zL*|cr+gSz%pd!V_u zfW>YSS^yT@3t~x%W)oe-#Q;&NE z(Tc5Kzf=6IH~ax;NW(_x_@w{?CH%1U@P~Kx&)pQlKG9^WD)=`dnk1UF%HTBBr##f6 zNwzueE41K3H?e3DqRX~P&S5$k@!`IVk?Q!=zBV_()Br+)?MhsoLR20DV{5&Hu3H>r z_t+=Y`$K#14;fvODOl|d8Rba0|F72R%gFao){pH+@ad6jM ze4{&HUfP8j`L^lBHYnB${YEOa-=DEMo8JWs zPOPz(?^S}T<)t3G79;oIy^^RJr(i(@$3KXYAL{B?;?>Tv*fJ1Nbm`oS<~0xd)XHb zqf})q{xlZ8MJC!aeBBl|*G$Vn6F6Vnr=84w&i-bDUeRwLGS z&;%%x$Umy^!n_m>Lj}@L=#?1*{HwnVc=sV003CPC>DQoOd7!jQjfR^W8CYmBTPv(| zF76cT_=)4Zpzd#5{M6qzgX5Jj72K4G7~F<%t~VYtqPC`iimB(`n!}e!os!SYR4hJG zlPrE=A3WMps1MZ&Ni52^fr9pIM|ss8Ms!6rQ4}`4*ak4@$Tp#eW9xLg9&Y-3wOTk* z_sDjMrb;1}yq&;ql-Oa*UOZ4y_fSV&ZGmAzvkR9^nBp_c@Hn0Pi3Pb=> zqtz_G#ZS_4ToTj+=co?b$U8hqpgOl>r(D&nO|KbEkdEKA&I9eIy&qP?tEj$A zwO(4!8Aj2Sj4T6?j=m}eIT}_3dqeg5xGxwdlY`ftx{+rfbs=jtAvKObdAii8aaj5H z?V^~&=kCHgr{>tkHYuoqRRVw62P}OdOXtyH*PpH>q_4W`=-AMVDBS zauia;)$Va1#a|adIC5h24ly9-Bph5;S`16Q`M81QgARx(!UEL?oqgE2IK$S2uoT5p zVy~*{QN!rcWB8m5VV>ZVT;OV&;Ks~DZz~ww_h0JV=u(4j(?HICpn;}IJ28RJRqb^eG9pIntSx_?Bgx}^;oOV;6*!s^%9{Z6s-vD7DYkZlC)_pcIdqGs6_f;!0fMe3HgZ}FZD`kJ6d8} z5rMuSvLxupa-9pa8yFD4oMir0*Dz7mEste{za*aO6F5JP zPJzYX62}nZ;30N~o5R$UAR3X<11DGQU_`i_uUd^%0{Lv1l82rhs);(_s?ilH`kK#H zFb0i07x)^Qtf(|hilvy?o&R}WSZ&f*59rlGG^kurDrPXP3J8o?(SV^h4_uq3uuYr^ zp-W^e^xhN~aeQ#3_7GoKh@4tBtb4$Pzs9`u{T__bHRddxhR&6vfWH@SS!j!RkS}(3 z*?S(h)Yj5r7M*i1NjLfA(=n-zse`^rbJJJanqlf0c#1?aN)+>?D8N{A4P2@@NH)k( zI- z%|41pwyh?_Ftfs_pZtz&!7Jjkjw!@)A(itn@+B4FCVOekDG*4p6Af%I0-F_=ECDqt zD`v?Y#oz;cdfdpkB;s&!@SSPoDy#_MJc)>pGDMS7Z5Q@hD`ooo9&gHsDd-5d)4X%i zg%-!YHxFV7*{LMA6!^QXKk@7MZ3!dD0_~Eip=>mI=B_=xA1=ao0Z7Qvz;J%6?64Om zm-q3hbX<~*>q`ASo-IV{%Tch>*UP` zEiOt8!GQO@&pTMA(iN&hTPMSNLfB6_H5#Roxk+lbO=B%=M{OK!*-&Ru<1amI97&!H*Vk1Uv zy@R@DOpC=KUrh)H!!GcZRaFTCSNfh#320wqnVXioN}nvaQt3)k40r7mlWVbO&z!{O z_+bvFiu2W|UFA^q`k5YU5G`FlEEgf}L}lspo^#6ll(QR65t*@ZEsW&ZM6;UbYszM7 ziFUfC4)8oqpPhsQ--LSxX%=B)5EM!}m8pd(db5>MavR9lJL8NinP182-UD=x-uFNB zao3k#?u+XaI5`RkbIgrB)wWR&qpk!rNp4KRP)8Z*=(29O2k&IM6xJVMmX^8P&bywZ z<2T`eZn~V`fQ3?$=fT)2jaSAIr3>N2fz9daAl$lCtRHpSWYz`QA$ z7W1fLh9MTR61a1={;VpnQTAz6L%Zv+yW?~D3lA&+V6ay2)-GMEn?i~-mO$!|gxsj(PZghX+4 z2>Q1O=N{JC#tv;-{qdt%9)mbX>(ptIJZZ+MxI|>P<;uGedBy z8g34xw9O@0`1=;soqH-56Z{(*C*G^wS$eqLvo;nE8X@-|4bs=*mtK_v5ti4y#Q2Vy zNc{MyL3Rfo*00aWc|}e^k*nKVQz}N9v|YM1Va6hW zIKT^S(cr4DY)z4gG~^ckO^^%&%~`74tm*KL0EkT=4@U0JYeuI)3Hdfmk0V&gL~18@ z`y|jFNlAG+HgZ6B(m>_QU^YQe2VwZ`~$WX_PuDFZ$$Uz`I~qI$nr0u z#BrIgJ#g~lFOG60wFN%1!`PH~;~cYxfS5_^S|sPj8AGm-X;fPZGs29CtFS`}fMF*{ z0bS7#rpWZ5o-|TSdP9$4m{ia%&_Yz3^u$}5`s7J`Yf~AInBR$-cN)FJ#WQ}3EDnx! zs-TPQ@CvqKkofUk3EhS(K@`WMPZ^08V~)cGbA@DY@nRA<=O23DDB8;f*jL+0l}E}t zW{z}VNB9S<)AKpbisyP%T$=<5&2hrqE&(p-Nn!3zYDcb^4}0M0 zwIDsZ5KhWy@~}f-S%Etf)qhz&hfP<|K;+MJh;cED4pjb(Wvr zO<26Vy$d1rny%q_EC0Z^7w?35Gv&`=o&QQZDv=e0!ctSJK5*jI3Ws{)=_0pfWvN-Y zlBx%A0omgsgoPLd2e&??E}#>=Q5^6Ec3M4zI;Qg*a2G+GO9Bjon``6!U6|Kl%oj?$ zBg#ooS|B3z_Url(D*3?1F`#;s>D-%w^NJY$@=no&+zJk?*joTNTYU3!07lVzitsd3 z>Buz$;+}Md39>G{HH4v>ibfd0sZn;Hw|)G(DseerE0RSYb=@eh zg_8BsVwP&fh$-ku}FjKItby$sSQtABuSq5f-J^UN;K4xJ%uW z)&|3nKnA{okxu5m*0jhcYK1q;8deutd7YXGMFoC0WF}>D?}NS-hk@25$hg@vN31hg zvabz{V!}H1m5qAnm83HjK(WWfjb`0+QoLnY+-``yBZ-$O1VYuimiUyQXdR0ur_4HHpS8a+4mz+uteAD4N*Lb#;{ z^H@Mh_b#O(i3>_qm&21}SKECRVlL2!Vw_=9-dwymiFeJ6i6pbDxOLPfk||g7loDpw zawG+;GQeX4S=c8_et9%ya|r$Kk;H+v(GdXDEj=RM#1f4?|;)~sIlin;Ds zYs&lsWfX^BL><0&>^CuelZs~{#?Uy#k$$IA7>Sd>`K~H1%S|{TuDJB3hf;ITe9cU^ z4AlZR+;>B?ai5NXZ1m=Bzm!p#x2-#vPu6m_4Cp*^w~%I=^$fl9UObKm|DjFC z0e-vbc7Nl-wBoG!8i)5TvTsaB_xgPiiV0Mf8wXf=>ny{wOl2MkhAAktjiR%i@7ZqH zxA_V94uvZ=&#Y|bh}4FCCQ;kqPPS%es#%N09yj(j!E0Z}Z`$ZEOrOA1GBK6rer6$n z?mh4{gXWboOV0=x#_#S zx4zhXFoR8+_NC1(Tz7Gyeu&I*8;jkjsFdL?tt#+0yA1q*%LDxozOvA4ySA9(RP;bw@fW3D94T#ix_ zLoTnzVhMa%D4l?`&&Z%~Cm812THl<}eNmJejt%t{t20W5*W=Nhtu#s5C_8kLIL#K@ zS)SjTh>1$L3zSkKIcF)+CVFVj$Mta~>3kFg3r6W>RRxD-eHnWE3IrmW2 z&3L7mEHLG zDG*+@A$1t%{emu9#ndo&WM+H6{7Hjee+qNY?9)3qUe7NYCoFkGWl&ubqJsWL2~1qMjvd3O`q)4LuAdXbWGS`Kxr z@y(mv*t+R_yRFLRroK36YOnPW4PN^+r1-;qgckPOr!LA=30AM(u=I`i$K`i^$Qg`N zP9H#!yJ1fFF+7(8>bl06AOJg3*=t;f!6Pc@zAr0 zNlDYfd%jPLdr&M&c|kUuzdp7jjC3OK^#kuYFC`9Y!25n8cHOZZ_NOJJR$P=ihtK6# z=!ZM3!|@l!Vhnp#w!vwbX39q}>QnM_>~7oMLS|nvz5QR>8a3ArtF?uQT~wBpaAf`$v2{8a%Q~Yn#?p59xA*&ei*lx z+ll45#$`r$$RB+-zdcK7eOqkB`kIbK0ngICxCt*O_l~<3g5u1Qg&}(F=6#{S^>37o z#3gCF=e}Z-hujY&3TC~)P~ZGpBikn%^qf?dj-3EcRc3ztr?FP>yBAoqnwho+Dc&ztf)JQ zQC@8!pvuSzGaD3gTo0~c(3n{h$kI5L(Iu|(=edv*k|ZXMd~JuVVfqOi!r;i*PC*}_ zrXV)=S>?!aMey@U>T_)_Mv;6v6j>UWnU55O{4u>-ftK$bI2ci&XGLBI}>CKhfY6^!TDRGw;<&!Tj!0^u_rcDlkIjzfHyd$SzpW| zhr5Y?pR6rmWJj+>#KLtZ$!Bi=b#N8U!h3GDi3{wsXJ|bBh)ZTv(?i=|Fg8$^tsMMmjxGMnc31Q>31JZ?gYNpG66WL0`?@#!EZtNEXpKW4~A)+?R_s{DKoXhit|TX=JQ zQ%e(bI>;k0uZis|8U}h04GS9>u=ZmE(SsT2RiI&F8b&&Fd?r@r`a0%fIyMs0qB3;P z4K?&EK#WXu(v~_#av&xKIzA247drZSuPs5$tZZ}&Kio_V^mIHHS~|v-AT~w@I!LJy zHw_~gOebWiVW_XgW2|SW0|GcCpccsV^NrV}$UH_|YK zddXjv#RLZbw1#BN%>Q7H34Q)MuJ*rE`d)A1{Rigte^==XCDw1uD?JMf z{ohz-TFOtFPqN(xm{)aOwY2zXYzpBN!dH()-|Md#=UHY>9=L`qM=J^lld{J+cV4W! z;f|ZHW!#NQela&U2NOK2OiM9k6P9>a_?{4`>8)<7#hC`kJIRjrW}49RN^g>$B*(bg zSu+L$wDJ9&{AtXl}kt@gYR@6hWt74VB~8GK^A!?(@mGe`K=Z@{ru1P;;93+XXu z54i|Ma;3|HBSUL0=Hj>Z3U#~F2MzR3C@m>K`yQ^v;w$QwLYC5B$(&ZawtodBX`3os|;DZ*CF%&N}a>nl; zZ{e1r@3v-|#%l87MyVMM1Ul-ln{$%Jlt%YGB+)XaORBiLZHoDkWcC)n zn1Z0^F>Ku2BLQW^&~r}(XX_^8gb?zcU9DSN@o<{*dSJCUZOY{E7N)0S{x2_m)bDhv znK?X(ewXp?Ya#XKV#iuK${KAct;hHs>Unmp$2gzI9eL-GQNF;kmflqDLr`w6Ai~Vs z^6~Up=D*GG3ALq7$W3$dQsuZ!$b4()Tv0T#zN3FEDhXX{$wc4tR*5^2gMm>pfkE#p zxVNi019x5t-REp7+xQ%iL-~?z0=tJ=IFziQsM~73(0$`slk{XBa55Ang6^z&mJFg(eGu5W79y2)3>hgRj5^s;(i;LSC0(i;8MIexZyg=*Y&!`%7AKHG_R(yo`p0fkI{ zO+jti#~r-I)NLy&i?-M-HY8b;RJt{bSov?3Sdn{%!wlEUWyvb;iQgzR665DSXt7D) z)a**53UHDgN`Erh@#-^A?Q0Ig%!fErnbvgnnKolWW4dLon~jEcHD`n=k+L;+MVL&t zXr2jBjYkr^FIDX@*SfP*R!_%)X~{9YDWlmHCxKLO$1n^>eKhYBmzo%Bs;(fyp#S6^ zlMQ;#TBfKUF~RX(&eYIE@@Mb4$F_W72^ER2)Nl(j$)%;E-9$?ba=xiPG|+ndI0o;% z#*B#Yx!**LBxfw5whr|@jv=LcQE<(2Pg5?QIhcj^%_8Vy;`4nCo+GY(WKo0$Pk>)q z=_VF2Ibuz#1><2eD=dwgmFE=EhO|pFAg6E#&#NYbN4@G^NsFoO_Nd~Hvcwan2^<1H zmIs>dY)?(v+3E2sR5;iq9_LLG`!f+0bA&$>tpz(hb*aiDx?NevFF8j}Z>P)IcVF$% zZKXBz#w4mY_BW%`r~EqhYBSeW(rW@3mRSk$^CW#?)df27N9+RxwzyuTY!crdu=d{e zYb?$g6O-L~l!%eUqtmMP(gAf=ux)(DtYj#C#@c*He0=Cl9`2)dior)+5|^>Iv$4ws z&P1^^_Boyt3?j!c`R~9}ay15#>vX}B&fcUt9P|>H4sQrX-}?p_C=IXP390IMDTxOec2xH6~sIw{?_I5^?Pwe9vWzWniXK^YqY z&K``Yvy2;-9-XGuW$viQpAX$^)QZMn3|vUfau%WpsGlx%dCxChjyFED1NqKy%^uYy zKMF?Qe!@6zTq`M_LB-WfSZ^LJnQ^MB;oJ>s&s!@=DtlwE>3#baa_`=~>}(5lb@i7oUshGwsj5o*`S~3k#qRF|t$r0A9zH$otDqo$dK$g5 z5>#2~)Y0Mk`t|FtUjyOb;6g$SE-o%kPfyRz&d$%zkB*K`PEIyAHxCaF4-O8NmzVeV z_qVpTc6WDoc6I=GFgiNAva)h~eB9I1Gd@1Pu&}VUwzj&uIx#U(RaN!v+qduEzi)4E zfBpKky}f;CXmDd=V}5?VwzjsfuP-}0yT8AGZ*OmUdU|AJq^723aBy&TcDAFVV`^$D zG&I!H)3dz1ytK5mxw+Zh-90!sI4mrzuCA`TyL)kQv9q&teSN*Dsj0WOcWG&bk$);v3F8XgWXG&D3b zd%d$0yS`qgudkMp55IOeq=e(1X?c7}d+1cE- zwzq+SCPhUdB_)Zyz3$(>m4E%ZI5$@vA8(bB;q3>QttPoPHpVtJMby^%ef;R*>T2Zg zualo2dvfwVG*oYAC$YIXu%jchr6s+qt895W^5aLx-QDH2wa}iP=8KEiwY4ujJu!84 zVV9RNmzS4-;ks1dCDR}0-#^(6GB7j!={tsW^7`7q)*py+&^9LZNiQuj%H6Z(Lxip~m~-cu)4JJHRA2ajL+3X20j+0(U}S-( zm*Q_cFtez_kGUxN5t`-r=%%s<|z9vY^Aq`%u*uvO4)nS zRZ)-n{ADHCTUi~*xx623&Mh-xF{o-+RMd8d6|*xVpDw+p7Q>QRdVDeMCn1)PG$!UP z(#V>U%=?r}h`sE#5bw0g&z*lNPSSA`$@#4Iv%g!kh6Y3KR7_VAq(N{L65dvuI5 zlmi_MIkXsjNM^Y_A=&lAgDU!@@ADpE(+_ij?}*ASs}aOohpwo5(A^>V^dUqxxm{+7 zYF|`4tkuOE^8l02Qa14nuT4KFT9L*Sg;*;6k=Tq!P~| zX}?5?nC(nsUl&k<(Av%sJJ-&gCeC2 zzt25hSV}Z`QfWLXcq)XfDot9VCzSb~>6fl%FDC5Pf(}X5v(@J-<1yYhuPKfN4%aV6h;-B9Z*T3;<;PvKgQ;&a#d?RuQ z*<-tQ>D4UoG+$Lx67MC^sxe~KJ2WE%`j+;?>0lm8n!NVWb@3{ts*<)xlsOgmrv`M; z%ic|WHHzpkBdxnH$J4r&D;*x&Dw|Ds_QJ^~D^wQYaG|jD+^xTibX({}E=`mQ*#UaL zRPs~Ax_2VAJ~_HM=B9-;$}tTX2Us_aI>>V_9D@f5YEfQ=R}^#S_mL8OdMuJ=sueB3 zV>p|dZBL!OFHBP$yi&TmM`sb&gsatb|0#%4y)Dx$T!@ z4trtH^?j(B*)peZv;5EwNiUgu{ahiH5@VIz<`$el@X88)GI@@37+Zf3wRqm-1Wp%e z+jn%==u%-_yFNyNaM{F=u3`AWRu2S9cTJ49UkTT7UoYxb!Kc42tDC9InF+z4^n5&G z>94KPWS->G7>v?d{0;oDG1L5mZ2DnYkXDqycqXp%NJ*awZC8+_gVwqPmh4jRE!}KN z>uo&}_-*vz{OJ=(Ij(`nqr`rCNC@SH$r|aDej+`Ml$(Se@J3QHlHoFV;vxDzR;NZN zIrr_pe3yG76Nx8_z%n+&I>K&JOf|Yx`O2d+Q&T4Cu`_W4`qJ?VVX6;TPvjS&YR;=2%2SOt`(y<>RwyyC5rRq`X7(z9MbAcuAOe`o?1&#HZQpAtNT-g z>CLh_sc+mv2+n~kp{}Y)qmHX#BaL?;yqPw@*S;WH#$s`SQlr-XdUMx$1va~{a=Ru< zPh-C6`(q0fyHr#bbxPHlGY<+$cJsrgk($k3VmG}rj&|`e|-Y`vqgHm zlrS@JsaEHmFFPTmq$!rAN&|dq`sl-cD|OVWXA!aK$zI4?B=&yg=GfmTBG}M`EN;fB zPIO`m3?EE29@H0$RYTl2j&Lkb^{H+T$xP1N9dnELwx2$sQv1~B6Srr|iY({2SM}Nl zBOZesge`3%B8$GrwQ!kUCxtlQL{_3Gz{bM`ueKA$|xx*g6--94b* zKtN!hWZeo_E5~gXQ7S!p7Cn7ekYb__ZatDUnp8FgA(@Qpt2~n$=D1hoPI3QnK1Z<3 z{?SNE9&GKqff^U>oCl->ar}{mF+F#Lb10{Mzdte2_3vQ}R^CSskZCuz>VK8jE>ma} zVTKY$5HIVwpEi-&_?g#9I^APNIVkUm)$PO_>%c*=Lm2^?_4kRCRMXPfLi=aZc2lXg za^qA>2|0*4Mz3C`Ew3dQ!$@QEl*KECM|8g59;k%))-)4MMm~W6tK&oIxxL#;^Za`N!mQ1XKwJxTN0{%R^sVpsTo;Tmcb%-6;t3>h!Aztj z3(cCuiQQUd`*IuxBI=USt0bpxM@4(L3Ql+_PxJE`6X08rnbLIyaUa`_s@vPctC4sc zJ=i=LVSiSrs?HQwm-zUFh=@-|G1 zA4^x|U_)kxhs$be0)nxcx`u}%o`JkuwE;HfN&H4z zP(I)QSRH_e3<<%kneHjMJlx-ZKt!~*FluviAl{LT46=6^y}KB^Ffh&F`)#th zvauPv$D9I^H+g~|Ddr9o%s?N^VZ1-KCfnr4J zYioyAtwLUW*|zQcYMw6D@zq=@pXGh`^Hj;O4y>Ry#u)$6Rnc^*kQdr|dTpDBPdPcK zW@l@ZX>*6G0Up)DV$r(BgLfWaHdj`1`d{CMcc+Y?j2D}onfatiU#w7DR(5N?UW5$A zs~K^<-*RiZ=IQ9jP59yOxUp$P6C|+q?L{exzG3R@`W8{B_B8m5M_Z|x zGcA$_6X#orT#9?&qQ9@R1x9?fPd4RwbmG3~JRAOG`c1s?y<~B+FcO?e9mU7*>^=Lx z?UMNpR8D8`lh|69Yqg`keT*Vw88>0CcF}@{CkxXGcy}R8^j7?0E590r4!39 zN+%h8BOMDs3nXP?q+u)}O~Y$qsQu5%CwfMfU$jpw%q)LtpTK|Vp4jPs>YfjC_(F^{o@{$J0$8WuVbr5D}5YNfup zg(cr>4Ra8nI1|zM;ihL|`HSV1F}KqB19d@A;!9mI*cPuCpthD^5HmpEfBpmJEg%~E zXa7I>ure@!SXfv=kUQjp#9?J+gI*O&=gQ{0VM8K#eOa2 z@7+KSDnC_=(DP4z6BRPhGyX|4_TPv#pc6~#%JTL<5Np^dJZ!^;*~0i-!ggzQA?(Xn zlKXrOMIbpT-=*+*fg`> zTpt*D$Yx$t8Y(yNf@2nUhUg^CrquD{`*^$E=NMRlD!rF<_`a#CWUf+5qybV2`{LQ7 znIDjAMe)a8U2*`>`dI{W%%ocd=`aPXb zLmt+`hfP+tkvR3>{6kjGZk?H=ZtR4+|AJIh4sVw2pwWViI64FJ83z|~Mb7vm)fLQ% z0RK)V*=Si+d)4rHs!t)3>T2*;X_)d{Dg$ z+TzDxPdJ#>7=NNhuZ4XZAL;nvCGb}4D_TsLwo)E7^(Q!r@g_{PM4JP#FW2m2`&TWG zWUTDXP)!HVy(yLw@8`%9MCImvBYf${*9-n2q^2P+`<|l)ZHit?fnaU7q`fM}f^GSH zL1r+r9GNZi<*asT4u~hS;&5%ln9EsSRELRSfM^Te4uthurA*HIO#@TdRH)-zyXdE# z6`Z^I^6T8wwj_5Bs@RHCByy+QM7*VyKF_h|PPg=(;8?twHb|uE_~sm9hp-@RWn_}e zHamW!?nB3nwsO3+aXkM)wtx(3AIg?Ro!Z=8*5M5+ut?#)Tjkpqk$rD`vsPS0W!`!% zGsQ)|rjt!6lid&~*Jh}^Z0FICY9%i-O(-VK`)t}IbCLzJ-CHtfM_bGS+0C~8Q$`U<|&xQqT# zbdN05hs;Y~*8I`iAZjd}h*%#aqzB4N#tv=OC8@Yo(uOxr{o!&ekGoN@bLrd@Rcr|L z)$KKlw24BxL&I|?rNxUtMXh|DVpYoM!8?vU9=pdmN#5H>^1 zlnQV{EzIF-OO-m$&Xa({JwcTl&bHPTMRF5O96oiw4Ctp@kja;%XS$aurt5V_p<-%) zR*+dJm$W3uFz3Y6V8!D|CMiXTBv=3Nh4!H5o1I%nGK+VpRPa6*$QWfc(Y0mZYn=2w zVpE7`7Dn_0J~|pBir|-~AI&Zt}5;OKf-FX=i$s6#QM@Mvk6M+HZyC?B(U(!iKib zB(}KO9#vFk9#b`J)Ssm$cIcfNoz)eGn0zn1gBE$QxvDV{Nhb_*(Q2b9(QT=E(lji^ zp6L8aCSjZkoMju)k8*SFfpxUpt{^FTQ;>!PQa#$svMT;eg5K1LGu`S$zL2Bc&*3W}~7_Y&jGu6&~||_Fqw!ql9ZYi>g1oHi`JNnk)pK%s%1TTw>0%#7 ztIy?v&RY?qVJX5rkq-L3#pm5RveQJDbE9;j$-=b9{kGZ)gQlHwGtEV4n@-IZ z5zl#WaQF7<;+VSdCJn!O#pX>+Pt*y&4~11IbfA~A&*-;ZDIX~ys6mgQqESLW!g0Fs zQ1E5%5ED~H#5h_w1?mJM%%Nu1Q)?D`UKQ!X&?AEZCDi zvwtJ>Zu_>8AU#n+1JnEDJlSP3pNaoIjM%-;l=)*m@zDR5QMMug+iVeb$Lxryn^1IP%KH26aL3>J^}c#D?I`Uvv50eO)#b#RBC+?vR>6{ehIfqS!0E zdz}Idg5p=8L`a-#1bo#BAeUb;>CbcY{%?Bef1`)4^m0&*-cN?(cZys+{p_884*kcl zpR~SWBp}aMJOd;qgrZlJgKzI+*iE>`Gw?t zodRi$_X?68&3FVr$G%d+1Y*= zVzScHvN8dzG}HeTM@&Nxob>Y39`k?56aQwD38lz?BnV()y%Gcft!DukL`H^x(|m{^ z;9rpdIQNH^jRj!L{}m0GSlIp}xxoJ&6@Hft{M3s7Pp0ZW8r}Z2gaSf($O`Xvg~G*###jHPtJU~qWvtD{Ox|jOe z7Oz;LU(NxsLJtj9`MIUk;+M2PWhFn-f`6oi3X(w3&8Q%#eJu#O{sTh-QY{cYG*i&k z;ZA_m2fpo<-d>8hSkn`5c}sK}qowWx_UzlNm_IsX%2sxpJw7+C0;nduqWslW`6!QjUf zbbRJI8kYJd#{U$Hi3!Z`S1cKQOG6!U;HYYI6AKevOOU*Yxi*Lfq+xEUuVtvipeDya zOHZq9qV*#`6LWG2X{gaRGp)9vAxKWg+yW>A#7xUT%RoWLV`cdoh{9*6VWq9FK><1G zRohBS$DEu8$X`>#62z}>VX1FusACRdp#_7K$pL|uwuy~}G6lsi-3p=D6Vkow}~FmCwe*}8k#zW79bWV73oBEEH$)&P!RnUS%1m!=kUDVxD1skNda~t zSLb@YV!!G$_N(q;zv>?LtF8mqRLG!V|1qebD>pEPz|bVW^x9wJ1Uho*q)aS<{sFAg zMRfpLKy2e7k^;2iRnLiO6gbtHu73Pn*j@YpwORffIeRjwrgV+;C;Yn z!Scg84R8X|ENIOE18>OE3wd40Fo4*g6$PA3AhxTj$;beSpiKpQfke=e3fbNa2C-kq z04T%`wR-ypYjJv@ES21TN@~ZYHQ{JTuf{kd+C*18k5g07C*w zXBJ>JVg=G%l@CnjUlvbjxBbtF#AB|nVfe3MGt1voi48jRuZeU8Wv&3z?_^>Inhptt zfGWrxazTZv5W(u-T-Ui?=XedHA#e!_$AH&A6t?|H>f@awh%aUnIi zhJ4rU`%mwXav*s^uAelAO1=Mm7Oae{zm6S9>i=@={G}}U3pD(uM)(i-E-2IU*DU+T zuKw8$NXYfz`Pl{6UGcB(Khr~85Mp2b{yG4ze6Bka5)aaOfG<$ubt>q2Dw9cy=#BS{R-(rQeLNk-rv{^~?v_Cno1h!1f?E@=4xp|8UrM86J$koM;a0qKJ45J>l4 zyCMEpE%?z6Xd8cJ<{&MAJVU~-Tk}_qfiQ?0LXYdP>-%-xpe_4B1xTsa;gCG91{X8* zqm5VYfBy@~6O!&KEhMKOYXLhH8~ppk|Nn>nZ1V4Q0UGk_4EOfi(*@;f0T$hg8 zk@g)%2@KC@WBFr=C%!|0LWoU4xYU=G!KP)}iOUna%Jz{C;))I8F*qT99 z)~{+@COKX9GMvk{4Ip_DtP$#moPAG020J^oIKh*6%|I@aa{V>hqK(+$4Z)+mlcTA; z?_p|Ncv!D5B87Ycn?bAnOTn;v2-^flA^XS^^}5=3)tD88%3o_R=Fmsi~+ zVLl}e49V?dCy(bRsPp^?Y|Q9JUob~S)-l$$05(l)7+vpmg7Sv{FoFI9k^a@9@KegfX-j|(HKV%B6Qa`;}+SPNYyK4Lm~L{n!a4?99w_p>757m;wx ziPHR`7zw;_rtOp1q~TH;ChXmDAM@&y>74jLO3iHv&q_Swf#X3R;eRkVG2#6#S4(|DDGU@isZ-`~I zI656qY0Va^BaPe`i0S=Q0^cON%GxbZO^+zKa*y1_N-Z!GVUS@FBPSwjh zNnLtYGp19G)fZt#`(vLD*t|vBdQzF$S85e)`{$l1Oda>Zz7Ks=az>aZm{NxxC$n6-e9Ui5m!XTM zQpssQ-fb7FC`X5~ZTA9?mBZ}i>4^fh65;A;EgF2kwk6g4DXk{Sz}i!%S&EOW1rAzU z>e}yaJGgcobg9;`iZPNmKLbVbtQZE07ToMUpAn-E4^tzJ?lf+_4Xf*Y!DTeWM^r}0 zqG4O5+@3x9rO$Jp>9|-*ddX{Pc)KfGI?M4u80Q3*8NC%%M0K&LbIo?IXD%{2?2%}W-Z%%!3z08IADIs(UnZo< zqtUnYI~G!1A=9JOFNnu zbbp!h@$5`sDXdrKS1_n36bzwyrKs~g>--z(nQu+A21Wt z0XSG-Y57HT2$g33zJ}2M-5L@eHfb;g#_-(S$GTBhOe|-qdQUicAE$F5Tq5@-zWIEm zYN4AvfuRZCOnvCuMsgZO>sTab>f8Eb()ZXWuQ9^zTfi%8=DSL|;oe?IHR;250=K^< zxd{815h4M17uL}=f()w*2lMs0kwN$~146eY9eQ$dVLE=q-g^!j5;$rY9@rALi2IK? z?VKvzCOP1qI<~+Ku#emhA7L9U5(w=Nvt#wbg?nl3FE)r40UPhrzOF_r@1BD7@0=_4?S=>i>(I!^T-_`fHch?aE4jtG_%N$1QWJaV+( zhA%i(nUtT*x1w<@P_8MQ(66G)(FNZ*i)HN#BG*#@2RFU48mkAz3dUxgmF2LCA|&E} zk6qJEOt4BWPIIKU!N*zIWibvzAs zSCeR=I52kWC7{tSZ#uX6)13dwN?qeg*1w(e(#3(3z??tFzOMu7R}3{Geb%2`m;Eei zWHQ;kNA5nZPeds;(GG#p)5^3ZWrrcM?UnDc1SV6$C*hWk3ar3eU9BVJ35mg4;J4_Oeb+h~CRH_9R zXvWx57YM4DM`6(#cu|f)d%S@Gug#P^i@i|X)>^_%urD0VCmeI7@z}LkCCapW30^Rl zPYCM-+!B%cIwO^BQ%YaHz)h=>!F^i;KbwE9u~x&N$#Ru=YwvkV#a+MmV>VhXNm{;U ztMOj7IB2x4^caCbXY+HDh*T`^S|4k52DBUvB7HOUE<{7e-uLIg0kGM&aBi zf2a5JPT%*dcTDO9{X^+LY|&SLA2i~V@Jlo{-73^p%Ls0=Pf=Nv>(yK7K)!!QagTO7 z=sY4|CUaJ#V|PC^?qxK|%ImshH-|>Fmr2@482COQ0imOM9D~hd#G?F=mbWwpq7L?j zJn5(vOVzDGY@Ih8n^2X^qGrNJbOZ#s?!l^^8`Yh7Fo<*!9jg=Cqj`KMc<}ZULhw7$ zn}o5?DV!aYItF58i+yg>E=<5v#0*NFOd4Cn zdO~f|!ra{e*3xG5???|xqe)^gh0QBW;4^!%B@c{45-fzvKaInmZ20v!{98z*9R}rV z1P)JpVXKK0MD85S@ag4~}OI^>=>@)dsNck!%I(ZIf~F9a-_PSd(XN>~s!a8^nt0OjP@0BeauI z-?YO&KF(1u9LR7zSL`LMO{Z(-lQSRrPQhi2}+`F42bk2RD6 zN4x@4%GCCOG>Gy6y)Ac8=1VJP#r)mZPvTvRxuaQKRuc>dR*i)9w8HmBmXFUh8Kn9t z%s==_#Tx}iQ%FwKY^h~dJ)7U92}NHtSzE?KJtF_8=j!c!3*in@B?$luy3O< z3bKNTZ^~K9sxpj5r*OSvL1EBzL>(Wme6ieQVOaRW`lg~u6SfbZj-Dl%lO{Im-P!`~ z%ACuP6MiKXjE#0GPszJZ60h3L0vw_r_DG6zi_0aFQ896v-CX5JGku|^(p!zj?_t}e z+hJ_;>c%3DagnDV;c1uf*mHM*vipUaq-idvZS$vt(?QdwmwSkoM-kI#dc`@1ATuV+oOrMp*OI$B zzNqzSn<1sV|W}o`6_;rdb4oG9D;#j ztY}Kw;Fe;}ImJ_Tc4i_=TRK|Sa_$|)tv=)<@&f-Nfm!VWbhCaLz z?nQ(E>blWxXxxLTa9PvR2?w3>xwfMFU(s&~rr*x0Pt3QO(^EHD-_;dtkDp8NS0K?n zbrk1!(sfXMjLY$`sk`o@&`l*~eY>Hs0~<88063%I&(^2!I=}MUrpenKCsisQr;yaw z7KO69($&znr!bdDNHL(xB`9_uB5mU*um)AyH_D1WuSC#zb(EsuD!AEsVVS3lQIq#g ze~s<)r8)9~cZN?%sJpp6*tE8J(6BZlUT^)dyQUl)?&gQ{jBhEb9xbKwV-9PDXU{yC zhtq3~3HRhyxynFw7}ZpFTCFJx?>y~!Y%7XJl&Ct6qnnFhlqUc9gUvQ$TakRi>rPMd zXoe*B#=HiqyARf=?lLw!>NbsVcN4GP9R6S*Y!(thf8b{RT``jG18!vMn-qILHMH3e z%UEKedvna&vT@X4;dn5uNM=wO@+M;B3h! zcn|Hy`)|-h+3TcGs0!qy2kll0m}^EYztxJ@>?KyUsZ-v%2h&4+wi5Yn`hfMqYQip{ zKAHQr6jp5~A%gKoH(y62i6@zPqqd>cDKmw|k}{V3-`8YYb8$AaQiIEG=!^AZ2civos08S*>9Ld$m1CCb5r4D6BcIU5j3>uX(bk{{XgazEs0xOAuHo4Xqwx z|6!#BKp22yltiGB&z=969xVLRG#ZAs_plL)Nx1XNbc6A!R9V|lNWYnJ|9pY8m{`-G}Okp zMsnx`DYF^LyoHT07M3C{)EC{+Uej@GZ|uMsf~k27XOcb_7NG&3Ti66UOMUd@z0*Es zcqs@&!?tkhR-C7}FrLwV|M`dI$fBF=-w#h)tDQg4lHd^Ov^ayO-s|{qzS)IyeBF%2 z5s=D)7C4b)#MC9^nT8-BTuM?B$AnK4s~zr1BxA}+WdpY^Hg6NNz_8QutoLDP=n8za z%GVXd`_(=+0|kxokJbi|nG>aa6T$e?$;Y|))$B%*VetDKi?qJ?-Y*_-GVmxa4g0O} z`5{nzFiBRrU5p^HjjMKpXzEFz1~!H7`npE34nIBJN}f`Sv1u_4^&(5EEq zH8MUn2{k*z^cP!^F_)?CeqTO?3dDxwp$#}|Tw;alU3|@S+yjT-XP;@s?{Usxtd371 zd-%bb(=Cp97ZVZbqcw4b>DJel?#hb*l_&WQ3T}~y92AAf#N=m~>M;IQI52-4SrDbx zZzGEdIKS`Tk1Xv_o}f4op6BL;FWvI3um^7BsRHh3=G{8F%|{{(E>_<%dOO|K@|bBGTG`0oqCWMzfg3Ilhlbs1b)*XJ#LLyd8-1)= z2A=Y>VTfgCV~0n#_Z&6Bni<0T5aa4z#V;k>Uw$L<9(M0-T9St%6Yde^oKj*k9p3Jx z2kA+u_slA63m4Fu(w@DII=?RtC%#4s+z6 z;4m>4r87eoA^(7oK%m-e0QS3D+=Tn;Hf8{bf2a z5F;HAWWh0pXkGYqto5~Yqy%|?U2@_g?PR2FaN6FQbR+~v6g6w1zH%vo4`w#h2zhW* z5>W^d_73lhv0FU+x3C2G-{nLwj2Kxy7Z-@9EzrtG8*y40xUmmjSz`NuGa49=%O)5v zrk63eNwj&$erU6~IXzo<7{3dX^f*1IY#7+47%-C5E9~EjgN>z`h6Hm183cz3!(f+B zOT$5oFcc+n?ZUydTMlz5pP&(hqrwlSKN_xn zUZ*5$+%WZ(Fq)i6#-Eg8H8&jI9n42o7`}`hou-r;rcVGH{c$&rEn`B{HpE>Zxv`P= zEm1#*$4TM)j}jR(J%eFgRS7(2C?-ZvzsqwWyV&9scAr#~575B)7v5~x`S$Al=TjK) zcKw6;qaLTD3_A)|JWGxGdf*@>ZiDoxHkm%wlSH(S&o*m&+bpNv@2Hz~GQ<>jy2PxI z6&B>MtQ0H7ixjlHd-`BO?ZMHmovj|l=WzRUoS^pROp$!q`SlUXA$Y4Y9O*Zg(s$qL zjEOTn9j&a?DugW@Lnxx%f!V1*f%!TBBlQ7w)^%o&CL$DpVT*Zoe&%ed7wP0sdY*eQ zRW3i)FHHNZx_N57v2*X9A{<;29N8Q!l{$KyD+dPLTMW1+9wu*u4$y-yE^tLy?L6## zFkD#(G)WIET?vZ_4dI&AIq+`OG&-AN_`3%+B5etp5;`IkxV}=qBjWC*4$pb35QIp= zbK4t5kq0f9>dUQTK27pFzFtzv)LAf;t}?+m47@ab$XN(0UY^Mh`iz$j`y`icTB23o zbh;(VgPydR6a|JG)F3oOsA;S(!V7ejp1W_0l;`$lj;!*oDgt_A>K6AA*b$B!UCsUR zyw?^r9LE1??=7IB?7GHp6A=*+1e8#aMi>}oU>H&a5s(t3LAtwJq?K-z6p$1UX-R1T z0ck1eF6oBv4BnyO^SuA(y}$3j*0_Sq-)zV?r>>H+apvfBa_g6xvd zL&@yl;LQl21wGQ_F~>yuDDhGSJ@|Af^tt&XOuU2k%7kUk zWfscEy??4%oqMq`sNb@mIPZhrrGEQ9?OxXYr>YK>*4-`NAZ=ngg|&;JgX9k7PI*oq z`_J}MHm(pCVFh97d!6=bB|h+er2&=0V|9Z zOJ?_pX^OrOEzaIr#8&j?LtfFm)rT2jGrW@U5@Tzwxt-6V!{JK>jYb0t(JY_wXE>=|B&A$6V)v$69Jq2C9#{YSP zAbk$S%KoPYAcOLqx}Au&mNxI{n6^!IPIWrqM3r3 z;utdfDqWl_94&=1#Ym*2?2A>r^@uIIU_`QsNJR+Qr__cmJ}M}T+=612Q9dCfJR`Sv zV19I-t5@7Y-D1bwc%pcU&_a9?y6U}RJ;l`&(6rPVr!-!o+nca@zWe;FE4jy;s?w?$ zk6fQI0uu#J)t$6d{GQIS zYolvge|`1^%V~px474Sv&cRJZqUQg_n2n_BUcy%8XWf>0gtC$WItkPB`&-HUn`O&t9qdNW2draks$AA~}8lmq1EVO36y2 z%J9kp$}!5_%MUB;E7m`new?q=sT`|Psp_wmtM06MRMS%Xu=Z1(KwWh`Z+*olu1}>6 z> zF*Y}DF}^q9K6!aEeCpOz+BEZY>5Rb4ms!Qxi8<4`-FeT2s|(SKG>dslcb7hYm-{}k zY`%QB;=6idHDwLHR<$m%{%yl(V|UYg>&8~jn5ILxD@`&vVQH*^7^*WC_dVUHA*ArhWO= z&m>_`jGRBGmFtQ99T}*Kb6a8VrTc{!+T=^8B_9huK36D7pp=%HnX0So-Lxh`!pRPK zOk<2kQW#{GZk5)Zi7`EJA@Ox4Z0a)-rqfbtvuL+;xU_k=S+aR}xW@?A%slDa=A?p5{tTv)NPF$`5RHI}~3yq(weB<(|0yDvl%CT_btv z^f=GgGp8;spYmOddU}SJz#fBllhXG2hx407PevvZn{GM4IA7))S4zJruF+(A!!5^? zrPGQTQhoZXCWO(oNfkCw{R-1Mld!3V-wEzAcOmS&Yt5qKdCX_$tW{5+d;R6Q(9m_q zu3P;kX8QvM&801rFQ(dO<0u=kx{95Kss}y`z^h)~JJ)Sv5{|xQ>d2Ys2 zx1aa>;-sNpT6%>(lMh$Cm>Rz(YO7381s?hPPZULz4FgL^ChU?LEt??hUA#&83#kEvZ2}G?Z19I%tPg_6F(r zUqa?;R45fEk!gJP%X?hi&cd zyI0jW>{bNiA2hsbzEXg1W6mByIpJmKf8E~B)qkJqX;eaRUJ7Wb&XHXB^xBj!76+h$U%n!Y&@$m95>Zl=;4x~x)sjRR^^Kr)y02L?`zcv`W(bGO!J^bE zL5eW(RnI_PTGRQBz-Q#wRxcim1-jrChELVo3UKaBw}%aO^-T5b7sPO~_r2Aw-`<`& zi;sApW#=(lG(^iIx;tM})Y(C9dBrXAN_iA1mY=@7(|SN+d$~z>sw|8rH4w{Lli* z&lyfR^h$(Rzptf!->4-)Y4xzYFB(}cmNL6v#m+v2TJu65p`TB+7sJwwu! zU1seB_wK{0v$4~NAERwb) zmrWA9)7+EIL4u=8l7cXpoE5%b`(8IAgiFWOXdJSm#?AF$ zB%aDV!&=eb5*uI8K(6Z9lTGuQw#9ktUG>;QPdm$x-`DBPVWp?r9he6((R5SUw-=M6 zD+V#ywgwb#OD)HKtzK26sAxCz^)55-TZ?!J*~=`L6&oe;!(P<6wflVp>SZ;PIi_NG zrC#Q~miSPvoxbk3#=5unhb*%8zdYHuB|7XO;t`KtDB1~eO3?Qll+AoeU>aT&cnY~7 zG)Lbw=Cl>>+Rv*}ec$XBp|+X72j=|a9>Ywbcid5_pT*2029~|s7Fb!R?sQWNA}sS5 z=036C?#mldeVIN{8C;T4Nx6Au6mghGX@Os_U&Nsz0UcFxczwn08OLl>`~?$M#ulC& z9-AI^qwj@#r87Lu3|Rw_P5sOpdJ(YH+&#DID|K4~jon_Fd5gZSA8v1Hwzna>*ADta zI3>tTOf4Yl#w{Nfr%M@BVbEvGGqNhIQMKcp>RA{H>e+!= z|AN~{Te7h=y5yCt%Xf&>6KF2nxOHQj5kn&;D!+9?n?+Yt8;9^BwN?uY(fYO1&4cIp zsEK&nrN=1DFH)<)aBim-PTYmvuR4QMDJUo@mK&6FZS~Wc>T6Ykyp0go&==3jyuPx~(sIO^wp<8nO3F_hoF+U^GF>>k4lqObVti<3~2U{br9iwf>lMNt8(R zwfvnLnQ^ocQU%_5ij_;~!M7ijdFOK2q3@j8(igeUL`MZ7^mr7&{w5>vt~cRU`Y0N{QPXtI{{|YlCW4q^(+qUnh{>RL#S?Dp8Gf)AlvL|45*efCRs? zF~7^BtY^<|U@PC9_%4EdpEE-BTJUS#1ax^`StVs?2ATeCx}uDopqhTB7zF8XPRUTA z^FrZ%vQBdPoOIdH5{dMJ&)h}pav!Bq$1nKu0YQy7&$+(!DlC~(jKX_Z>U2#w>5CVJ z(05DIO{>n9_MSU@C0y6Iu^?aPd1ofb**-v4I@38uoH;7{v5YLgTNSQeEp>7#EerLg zRraB`wz47MEW>Y@$5W>GaHsehaVck*w@0~d>D!pyYmb*LmB(i{Wm4+p82Q1a`s}_U z?}UcCO2!B3ndxs{S|IkvAfCwLPbPW%au+(yENy!z=lk5ZItLq{t|nDIPYv(p4gBo#VAW79ojf>}xo|*!?js zBk5nKv!a72txXVYXUL@uT;9ec&A-mK-*FC^? z6OqL?P2)&C<6djcZjpXi#X+!|dRV1jJs~Grd=u`$h28oJBqmnqv}MRWyPF#+w?YDD zwe(Kq+S_Q1eD`hZY0sZ6T=-PKL2E9vGk|??#Y~Ebv+*sYkcS6fif8)Gz;4XQ+06Ng z)y;s%S1wRe@WIcyVIKI-ADWh?ncSe2ZRu} zkL~tuJJLoDxo%H6VUuQ0KV;;5`nvJx1z7%n&n_PDArjM~FKlhH3w74|7I2C6X}NLd zi#Tup_dN$w-U&;!Dh7JiTeO{}>@#6K=?mmyc9_NHJk+*xv#p-`EH+!p9^mfGr#bnp)?Cs4=FwQO&xV04Jd*=+g>)k}I1cgJhduDh5r z5n58DJ-}WTzQGan@JtF`ahnAs?x`bR?dNZ3=Bf9{xbtd|ZDpbW`$M z8-4QxjP^?MV6@?rVBV~ew5<460-U#)=J+LI25$6avxf)!VT4t^@gB`s0rh2O3c;`T zby6}MJE*JA?4D1ra2zi&OYiRw#KG+NMqL^fyU|rG?7u{4{`N*kGUI*(lM&;mTb5(b zGSv62mpv-QxC#$=!?I-FWCUP6k5!8c-Wqg^GI(+W%j(W|6MezASIJ8a$6}MdVZ@Os zlO$hf{d%1nMUu4c&Aw{-@^;nlZ?vY5DWdC?8vuQ+&@ol zq{*LdurcwjOX9#VgqfcaDIDb963H@A$$45TJ9#QXrB!a}{q|0WKx;RHmRVndK+zqF zTehdl1LHhJI~G+6ZdIin+^t)6$4PTvk({=%OI3f&RKYimz0E*K%`EyLqBGqgZl$Tx z+s5m?ZGbk%$Ln`XcQ?x4Efd^YeOt+&D_p9T?B!PB=wPG5tBP^w;~D(B43-~}%oj^X zN^LLSQ@yy4{jL6hlkNP}2o~Et8VRP`X{68ZXP>94Li>6p7fJpeXJ91W|0br_MJBJ* zyJtMHPw#$WFg=fmu11R{BT`>>Als-Q&HaAy^bPv@E}M@x*)BM{+)};PqI*$vdWT?C zcK8_{v70*uz!KmX+89f}7&t%1Je zOSpH&ZEl(g$a_B(rby!#H5VdVQR1b0)DoijT+$7FKb1$B7gvvNP}rt}YYomN9`yzH zcF1dL0cM@aI{e&I1+KNZ%JUi<7yIkIGQr# zsu#lhDokm}8kLynmB}}MGcv8SjeOxd(O4H@Kfkp{Ys`&Sk@<7PAzm8Q_R*DC4K;Sl zrZ#c3C=h(fnw|!%M6CQsh&^lh2_KpI7ZzSc4KBZiKSaJFn>!{4Wxl?y^@{_iE zcm`Dj^`v*shCkR%4DIqxnhhV0jtU=g{=xrnq_EVIy&+@mgXUL5{LIQ*?v zr|Rqq!Hm{t$k?=y)L-21k;asxr^6D*)|=id;vaAZ#ND=tkvHdOXZM6(CzfS) zRXFu`hfgNgp{bO~$d)A4&Glx;l;HI|jACUck=|(ZUdg#!AUU^VMOlk)5k&uj>hzF8 zJa_sA1>UTvWaZn%z6lK{77y1>I^JM9npt@RzOXlH$r<^W2@^q#@@NtCZg;|K($A3& zzm-i$zsKXBD(p`@El%nTO_;@S(*3@R`Q$rc498r?%F5XW8itw-H+)prc?uZqDW4^%O&B0r`-DjEg0lNnYJP%4@rb2 zxRY|PClS{9eQ8|!mdmp=I$U5nx~HERBK}|@1Y<6_V+wCa%vn9ZyIDcG9{MF>b&aBf z>-x^+40S_^O5Fh@7jFX+GcB7#%_iT{c}zc4DEI-M!W-+ixHE}D(L@g-t3HN0bdR97 zOqjTlr@!&SNsqEdN^{}$zGQG)``Fo){#r6$X6$XN!ovuRDCNTPkJlnHwCiLo(R5zI zAgtMv@>R@|He=qe8&h3hQ9Le9k?Hm=yl0<>*ZjTxqJ0}QI!H+2npkq?f=J6=T7!mk z*xJ;yJ9nM7HuHlY^WL`4h&!v%%Puc(kg777mfTj%Ucmo`sfBj(tKM4S?yUG^QK0=m zI%(w!@2zguq(X%H_MkCqC4o8b^-3(RjySp5J4~a|9;%7SQjiAtYE$G2TSv5fcSaGl zv{FOQ_q{VTDLFP172g!zld-pn3Dq7-1TfBMxansc-o5uCImDx{&a-h{kH$wgS`TPDX`z$kfDRv@q-_760pPk9G%g2&y(`?EWGu-5HIMj37OMg_?)pL17 zgHyV9{rvD-5_Po2S6RHmr@o_Wd|_<)DE9s`z#PPrSn;9Xn*GKfb77%E`8B{MZgVzn zl5*egBuBf7p?)r&eB*Yx*Ys51uF>dkR*|C1v!h3$Q9M>u{ zSz#Lgidt!jgv;38y}dg~Z_5B$SLRPVIL{7Y{#@>MB4qYk_1O1^23^rOwz+Jb5ta4( z#8rZcsf-Wcmw0L&+Ep*D&^z<2u(u24&D>YHyw34Hmh5wWz#%5qZKE2qD=W_KQRDTd z=V#9Jnc&8LL|gH=inwc9@I~iBHwORJN&X->**^8?i_%;ANxRt9%U2ksp57r=%df_L znj_IcyT;>cc5m<9h;DoxW|TbrjbRtl5Q7jh=c`M~R~bj5>hQU7`zV<-CVp;*?93O6x}CCKTjQiel(lQAsD zM-oAY<-BbXN-lo!=GkT}TdU?z*aYZIZ5*3*RapBViAI_XJ#78c<`YGpy*Ag=;szi4 zXj*(RuOHFRdjH`JONPpg`7Q0txebx9IjqtBNc^5T7yKT1e)3U@jaSOeBAIh?&F@V} zc1PZ?y56FrGYvONGG}_Q_!OJ*4&9v<9rJOUN>D@ zS6@}X<0y6sFneEV+?QT!F8TD?PX6_<9W1IGcab@oq=7l)8NL_94X`#OHAnu`v%tL% zJ}qaufV<>sA~w;Z=@4F)2cNfIGp7x@_o-tO%@*+0Hb5LAGIR4XsaIU7B9s-K zYIl;k&k!IhxywJjm8I-a#0kMlfNKcCL?WSYHbmDX4Vid#SZDG)pxdJC9|((Ya@Kx3 z8?0|h9Q1}jOzi8-tE=}L(B2U|!7gnGYP%>PHMUmFelwnzB|(!f<;iRA+DWFGQ^rh$;hCUMm(a?~c%z|P^xehH#0gUii3b7)4mHF#)cCsJKQHTGe9qR~Sw=q! z_hDv~-JlU79fapuLU9x@`*7gv5B)pykSW(j}Mk zt)uFW@9yw2g)xp_g5p80Co9xH*~XyTH6Ssb@)|F5ZS)?M%qPmj?Tg5g{d#_5TGRbB z>{U~%g^spS7QU#?6lT3Y>E2GYk#9)%RY##vfk)an0(MM3$&X^Ei0=n83BMN3GRik7 z>#lck@^N`G7xIyNPW@Ez8K2XhlTy~Fb#b!T}v4-U?`Wl8M}Vka>3#20DmKYeqV`GzkenJ-aw{DlL;ezsgs?{ zC5E>11&T%7%V#^Dq}J$EjSSy{*Bg5+4om0i>(OU1q-CwJ5k_BTxvUr}U{z9_n3O*F zp+v}J$J3%w?+(cZLH*k#wF=5Cy6OYJW&NS-3aTfA(D}{!w`Z%BpE@|^I(%L7d&^LL zKw_33eJK7x8n=W0n)?)&@TG7;Ma6JqmvYaq`i;i@nW1ooqY8KgNR&_lIK(wYuszfj`u;oGQ26h#jx6IWc1mr-3GeS~!*Z zyM}aHw71<>`mX0F8tUtBTHiWMj%n_j6w8<4vQZE-LS`1|zJ^Kl=hQfdh=!&od2=M< z=CeJOkbT>&+u3;kV)BTM&>G|5(+?EZ-C?%^-_3`dWt9(Vi0rydDbRdaK%eXs&1+Lg(Yxo_kx`+P%RioaEX zjjOkNZFBu=)vQ#djUc+-|5m5ps_%?9rw<~+`d?x&`aQ1SJf2vf95u4!pe zeL_Qc8G}ve_Cq=hqL|odx`?l-O2Iz4E9;NxxZv>lTTvy*SXt&?o~S?%B+WBS1nC9b z)Eo3;pQ=JVVS!#Zh_$%9D{1q*pU+ufZR;_(k|nB^Kc`7r{%|(y+SfVX%Io&mit-7h z?k&>K3Y1~AG^Raqb| zfDpfwoduv>3mI#hfaqM}=9*gOAg({npYH+EGD>RcfDmcsb~L=2ChA(W;O#$CQ$sBy zRQx$WsXnUCzv~-RFAkdjhg`~qg&+Vn1O^}g&;U3}K%NB9 z!Xp-6s6B|17fzPgtp`p^~s2`w-0Ggt;wY9LYFhCjt4&=Lc?*NDr z;3xrqq^Zdbz%7l9jRD*euqfr_#1prh4<`Gag0qHR>FAv}%0qqm;CjsLzIXM|1B>^`wDJcoiCIJ=_04D*35`ZEB z`4iAS0csL}TvSz605=kFK>-BP+FBV9G6AAfTU&c&B^2Ny0bz1`J0c;$WNIq->sK#; z$_xn5TU?B2YjgMU(F_VQ?&^y1@iACl4({*wPENLHZuW6;(Jn4_($J9W>hhYNeras1 zQCuAU?VI=K&msBwcD1$sIXSj~(rIg}TUGTGATGng^xWOm0d+Gw+q%8|d0Sg(RFviW z_W=b3Znd@ffa+OZo|c^Kn2}-a;P7O2Hqg~ot)|A!%S*GU$X-fHtfnR-GSYW-^<`

Z-0Yf!ncsMLI)w{JdCnm-OuqaDQ?GF#*+}(|Qd>rfRYX%2XmX|@z$Hv3} zZl_mUTiRb-%FW_+rQd76zh8m;SK9AL*D-(~NDRy%!W21IT8BLK`Xt;h6lwB8?g`483J->=sF59NcR0CzX^A9EU@a)P5;Bfo_JvkhGhL6y7vzp2Z(I- zCuJ0M`0pvBM?s4IPjMXM5qc6tQ#b1U++Vjtn9$V7HQfQ98GrbG?bqeDFl-#0GZ)FQ zZuk~m;q!&6GI>=(hj(uFtoz28MT;0Btme0TNT`ig;%^1BWp>Q08K-Q%5?gvY?UYfB z^VPNXwarjhcIo_~+uCB{plqwjH=Q`QgsSOx70^hb_KJgRSkVbjSI8@d1XmVx#_?jK zcOr&Nl)a`;joXxuzRS+!u{>oyyIUbne1~;;LGR7^dt&<*$&1fC#{0X_FFoHYah_Qy zcqLTscX6qa?o3J1Wx34eSripN%8FWn~oP@K|y* zmTogNm>v;F!HM}0@t*dczXd+c_C#R-u}0LmuP3LcM@=yK1e=aau$1f-EML5kjE!(z zdd!D7YCbQgl+KGBR60nTamxr9`%bIL`FeJu7q>k6INsT%pmRQokNUp6NQhF2CmlJP zU6sRr23S?A7M=|A!R9btQKi9i$}Mm&tz0R;-f{ZrGzJN* z?DAEAbdFXb`cG+Z{f51aDHX2c=d#j`ezUkrw9-V6#dSqPq20$f$T~LUYoJs`;uRA5 zGI4BN%!duZq|bc?zwC+#_;fv5u(jv8vqHoZa9U)kF-D~66}`kQa_Y$LxtYb7P@}V z*LPA7b4h6E>VGtOF-h5aTxD0yIl7g&`#g+FCvr6Gsv1n;;lM^s`L~y8)4jbTkM4)Q zNxln-h-+xV77F`dFY=a_PSPO%8!I1|Ay_5?d z0t7WL2@#eV@7^`E?C_Uae#Q9+zu80Y?1R*f)ONdDK)<<1wYLk0E zPp_Ue!@FsaR%>{>n!O=-k5?*V5P$JYbEI~%UW)F0;gDXr*;Pw%%=N-g?S8+!9PAIpyU*+9txPmWMM@+i1WpoQ$Q}~OHPtPfl>-Eb{THRs$v{e2u(T;|A z7Wn}Z7+s4*`%C@HRD&_NL%p0Y%2KP!naY_mnBdEHYV2UmZQ=l4-@420~qCFx>^>h%6n9kU> z5=)oQDju?EnEg=YL;cZg>~q@_ajYBCoE!ron79YREc+p6FIgLD56s+V##Z(zs!ODq;VPmfJ#x^IbQgElEh#*8D zgqN?gT}Z1L-E(i$gl{A^^)uIo=DUjn$U@So%i7h+T}f)>*Ue|uNJ~Q2I%+{*h%XDZ z`#jj+AbnPifo7%OOKF1A60IUd%-X#m@;2w5SvJA7ZG@yjj0V1mr@elqn1GurBRUOl zkQ5JxV~w*?ZgYug3gJ5QU^5{e@iyNp**8AQc|jLcq87GuT*)gIIw$1u3(XP+Ij?@i z@K+Luc)Ou)UdcW6;%YfI>G|q~2y8w#X=|bzeRUcBqnA%hVh<-bN6vb=q}3Al3B)^W zpyztl-W+(Dl>ex3rg$=&bFkJ$XXVo=>h9r5r819%@(!l*ckF8kDH93OZD-UkLz(PS7Q!b=LP1BM&>?w3hI9{PK&c=P`}jNR%vNz7O$Pdh@Y% z%Lm#_GB565i5X3}cxUL;mow)#vBNN%#wPJOMn?OcZC!#NhEi0oq{iQnT3+D3aN3oq z3z9rj%%4&4*~&~1BXF;@uLkZ!Q;9nlirFlhugd++kM!awm{sT6LV3V~Qa8G3V?I ztiqSQ_+7?JlQVKIK~jxt!x5J{*1dd}1S8c;$|#1=1J6*Tw42{=kk_~BtXkP<77JCp zAz_|Q&aPGP&N65w^X?rD@@;`<*O<0pYtwn3yGHo(!$$5Mj77H5T1K%!#(NB`$Ek1k z*O-wxOAoO0PV(lz7`t~6&&FbZs&^yo(std}q(Ta517jl|1E0n{iXl>2_y!qAjwu;W z)L@{zJQ@FryJ4so3uK%iCo$N*-$U@J9uHTtOd@--Iax(+h4kz3&V%l1E-hCI*^6O& z{=(*4&%xEwC`79$DoEv4&Q%7-;n8oSRcaUcxMu1To$qf@!ZqBqSINe0!mkudQ)x67 zw2!~{eEgjzLQ_UYZVMEJU}dQR&(F!2EVzPPHV@P92C94nD~PcugBUEbV3n&W0$0$3 z_e@5!8dw9c8u>_pRR40URqOwIP-=r&?J?I!NO|moZwR<6BqjA z7J(JNQ?yv)ielEuk9#vwwL5zEz+1TeTK@ti>LwRfY|irO-$>`91Gfvh*;N!+A$WzJ z?-Lfi(x)YFDT7wB{!(+&q3;XIpa%sSjj#nePl}98uTB@35`P*>y#i+@rx-ey?Mm$| zYlSf(;CXiY-DcrUZb=!D6;ZH*zY=kFqLif997{ab6juJB7U^mD$c?(9KpxdFS4p>t z);+3e2v}@a#G~im_(b}R6P;4{G9D)_Bvx~iuQ0VTWT@Hr`jD*Oyf21$xml#x0=l^V z_i>d^Y4KBd?ou4^?T70rS3rlKPPW!vA#hXXs7fOV-=$@aMm51%HL-}SV1b)%^Gt``Q>hrj8C3l9%wH|9Oxe6tS4C8pS(i>gJbADW8E zz;W40fyb~RFb%r4)f+{3anuQuVmmy>!i}(@a8v2r{R7Ei78`bnMGevhmE?N7P8AE9 zl~&P?F5>kbV(-1x{=?R%z58#hyv&sDz9)0(#UR5WBlB~K(ona&@rvH-44oWyUa76W z1n(Wet^}*Do$h#6Nh7I_>&iR9&B~U|!AY}&!Q~kXUDogClM%aDtVQvmylkZ87 zb}I^5HRX1$Ty0q0D{ozu>gj@DI7AWXJS8Am=t1)+YxZFtaw-d!_*Cu6-S;Ztb43AM zkSfb^BiOO$Dcqaskh!o!yI-)}fQN9P)<&g6R4?v}jRJI%(J#p5VD>!kp#*fGc}ZXE z{WPV?g$A3M2kyCB)kgMKvzG#-hB-3PSGnNx54(&bKH4Z;om4q}!@6ZMs=GDvyUG3U z)h)eyS1jv>H3{~zEm)joLO3*vJ$UAons3RsH7^pKVFHIX+%lWWN#~q%HHu#J;953O zPrK2rMUhlD??DwNL%16C;)mw1i;Zp;E;DaBEKm$-MVu0wocrJyy)SQJeoQNVA$Ip!Z7Mz}V}rx(o4gl7!blepm?`0jVXRr4R}v?PKX0O2 zNDvgC(@266e~#1g3rhFpoX-n#>`@|=i;5%t95&N~t*RpzDa%PY9j=*r=`*B0o7wqG zamM1@(xcc5o#rx=QB-5X9i3k%XJx5IN+SLH3zWNZayD z{~YNyWJQkc^%&rh-IVaPI)BP|g>$!Jc__%1PrA6B2NO2Pw41ymBj!j2AN91YDpk9+ z%+dOO%kLHTgthfY5yWQz3hZ^PA0r5({Wy9nl81RFQ`_pvz*EohlJc>!eF+ukq{6H; zw01I#qAiEXp?N_?zdVtIRALv%fy(NV2w{~vI;&3I9@~ImxetfTx8^m5v~THt@Y_QkUhp4^bz^Pv(ASb3*z`^?1(g_i<6-G z-{$n)VvX#c9^{MPXEeB+&M$J6q#{3%&PS+zYpmE^nBie3t-jNNsm%vCF_bOxg%Abw z{sPU!MYe^Bc2oW>bzSwG!@L0YF1xHj8P>}WY^TyM+}nTZ(!1DFkf2?4SGAuu*35N@3m21P(%EHGBE^gF^qdFZ{L?jCvLp zR$3N6zEn`;6BV!v_9w06H)Z@AnDW~)vNA*1nAqR|Hp7Bsg0Ldkjw1WR*&v{ZtbqRk za2*ghl9i1OgaH2Ewf^xY+_}}s9|EPtp%_*fJMS+X<}k%p<-pB#t14Liu%dYTusAL#YWFw&0G^=s;T{( zivN2n@plyug~LF_GqC}3GYbM7LXj{~+b|d_1Pa9Ks5yW~4+{*5LZ$rgEB+5q$)5pi zq0qng{QmD&$5FffYpnueV?)^Bz&-|g7y=Gqg|osy9JpkG#{K;p%4&J zn-z#CoCOY=8j1jb6cFYX!o~~(oeY#1)zolSRsbveUpF=Lk-70F?RJ##+p^iH*=d`Y z+n_|(Sj&>p)b3A#X8cXr{?3Sn03qVxTQ#)!j{(F1^Cg#Fw)@uK%<^Iq^U|jlL z>45bD0$4>XfKvlx69V)kXhu??`#~z`uuwp=0s;z$18wzBTJE@ZJR)%Yw&niA(*1iC z#LNZ-Vh4qxhHuc(Siq!N2KzY@lRF7#z+*3S&Y7x&Z?8Gg2^9fq-D}AW$p} zb|jz3e>95!0G|ES_l^=yw4kY$2{2_tG%O%i8oFS-(J_H&X<9Kp1!ORFyT3*i1`u%^ zRbB=|UDlqqJg0s3?=}Q0@N@R4q<`AP;~)p z?GOMafwKIg3OKHxfDZi4tOKQ=%(V>l)YJ{N7%YzbAbt!kNAru5y7y=<^KY6KXjwKU zBx*{88a|P576i~!P}E?90ERq3_X8YD;7P#xPgL&@df(5Y{o4uE-_z_rC#a-H6IIj< zm05*}?avu1{5Pfi_gV_diiEI$X%gsCtjuhnF~KYVa9~)#A_J&qAi}Jy09t}Xf-&eH zi0}_O;m^hVLrW=wsznVxz>v!>11Xrj~`Cj9K|3}O|5$YWUK&XM6bI;U%K7gXWl*q60pl$w5Dd-= z0YeirSQ!B7E0~2af!Q34l?4JM9`uTTQp%&X#81L-1S>kxq#72Qs8s~;3kNF)1BjKe z9s?k%Y8k6rnd?9_wHTl3t65ku0(2y!9#G*X|6=?)5~F|Du23*zM8Lp|k(mt+VTOT; z2$*Yu*)SU%{2l3XCIo`%AFa=R&^UiC@Za;IW6i2z0oG1NCdO(Ox~Rbmq6WqKg7 zOGa}OFh((o9{nVVItFmWBT@hTr1_}Z{F`$Bt+nxy>Ij zaA7cj!#UdT_!H0h*ItL5sL0;|S~z)ZP1Q6Ev@A*0fdiZ|7xhv}1vROjCKt6Vizt(* zDW8_Eo}j(CmXy8NV-0%)4WuSD4>txUj~dELj=@&VltKF_s;LF3mW2k_Z9Yj6f!jRX zmoYeP*=>zXjQ|>y)Yiz**n-`bi~8ssc5sYJW~3%P%3^82MJ*>PL5doS4D>8XnIT9B zlmQB(C)GArGt#m#F*hIu^F?aZHO)1(*(Lb}{5ulBNXUlMnIEd zW@Z36z<6hDsbYymlXs3WzgC&vhdFfsmhr$62OP?%NJoz>LA z`kaf}%1Td@T?3(^3FdZC1|(8jjRDTatjVCx4A%nxfQ5)A*r!p~hW>d!uuT8`4Z#oK zjxbOY;E4TCWGff-@0qQCB3o&xxj7k8&-2ss{aHCbCHo(x;{QXU0NG0& z$*O^5&;TPl1DqME!GL7ZVqt)@Xd~4%Sk+h%YA|ZX|F;`jQ{%5EHnlQ0JnBH28jM;$ zJYOw9TSLJkYih9n7;Zox241m$Y*{e^sRgnKegq^9LoM#3?g=7}{x~qyLv=THLp5U^ zE^1o_O)YITD?>|a?*Ey1{6o48_5NtGqboB0eHU<~fg&uMnE$wul$P0_cjW$qe|+o; zM>$Ye`0Kpi^`E0Opj}W^%=nk~0{;Upv;Uue{(F=EsEYqvUH`4F|ELE3qs;%6uK!lo ze^dkiQRe?j*Z;q&3oLg2Tq0>1gLRP&SOEPdGP|w0miA=~@SYV56Zrb$g8=Mv78bB8 zhx+M{56T9K`j8s`l?Fv^XB!q~Aiu*-5h4eZ68xE_K9wV(9sxd>Ji z`}tTJ8w=Q9`Xvn*?@(0dU(=X@3GqZ43aEH2AF!N(jg?=|1+O6-e?BNHSVJAl2Nnr{ zcKhqOzzYDyUHj#F%uFZ~=CL$jUI1(2U-H4g2Hx@O!B`N08GJn7$?^hs17ITjH6IJG zsvUo3U`<0DZ#Nb=8`$tYb}k!`lM`voh!gh!Ch`;cfLY;qow6cWQ6OQ|=P$VeMs<{R z``0u!CX`3RFKHm8E9>#+L%_l2{qcM(Oem<{FXyr`ovZ^krjvC5Z2fGR2cbTHwk1e|q4sxwO@lEVmo@P6CkViM zA|LYPv#_EJz{jqKU_p6-{CW?tk$>V@5NxP-On=SCcB1bChZz)~{?~j^CM4<&onOuc z#YORDkEH>t^ocZJ5Hwr2*9SmJf~}$x*Mp%vK7M`{)bSsB2>PcU z2j>Fo>u>V?D96wFSWoodA6G~H`*S`}`M+Kd+yi;MFMxM=p(pDF222yj&jq{EC+ZYz zSe?kng4)Oa@kD=&N1*bUSx-C*3+%YugM46*@x-~TCu9Reghm-lQJ=r$8Te_PkUuDp z$rEjkU_yD={CX||$3nO0g4{{%YA{koG2R%3}(mW8SFNnXd@Ui{J4GrqZ`=jD#oCfMN94_5h&x6Kw zWfFKifFKHhG6)=Vr1b2yP_ubPNfQ%GQdCQVs0yg~0i>u>qK^3$In|iqz!4P+*FvhP zA=KEkfwPsi7TCK5BMY+z3leOKBAJkyOq!@4)HSuW;Mz!p77}PWE#O_I&Zen};8q6q dFANJy;7a*p2>}eeV9>pcK}mUET;MXs{{sUm;35D3 literal 0 HcmV?d00001 diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum.htm b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum.htm new file mode 100755 index 00000000..84adf621 --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum.htm @@ -0,0 +1,3413 @@ + + + + + + + + + + + + + + + + + + + + + + + + Design by Contract tool for C++ - Mombu the Programming Forum + + + + + + + + + + +
Mombu the Programming Forum + + + + + + + + +
+ + + + + +

+
+
+ + + + + + + + + + +
+ + + +
+
+ + + + + + + + + +
+ + + + + + + + +
Go Back Mombu the Programming Forum + > Programming + + + > Design by Contract tool for C++ + +
+ +
+ + +
+ + + + + + + + + + + + +
User Name
Password
+ + + + +
+ + +
+ + + + + + + + + + + + + + + + + +
REGISTER NOW!Mark Forums Read
+
+ + +
+ + + + + + + + +
+ + + + + + +
+ + + +

+ + + +
+ + + + + + +
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + +
Reply
+ + + + + + + + + +
+ +
+ + + + + + +
+
+
+ + + + + + + +
+ + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +1 +28th September 18:22 + +
+ + lukasz.dobrek + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + + + + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + +
+ + + +
+
+ + + + + + + + + + +
Dear C++ users,
+
+We are proud to present C^2 - a Design by Contract [DBC] extension for C++. DBC
+is an idea which helps you to reduce the number of bugs. This works as follows:
+Classes and their clients make contracts between each other. These contracts
+
+
+It parses comments of your class definitions and generates the corresponding
+code. You can use C^2 with any C++ project, eaven with those you've already
+started.
+
+We have prepared the following list of frequently asked questions about C^2.
+
+1. What does C^2 do?
+
+C^2 parses your C++ sources, including the comments. Only a few simple keywords
+are needed for the formulation of contracts.
+
+2. What are those contracts?
+
+C^2 supports three basic types of contracts: preconditions, postconditions and
+class invariants. Preconditions must be fulfilled before you call the method,
+postconditions before returning from a method and invariants should always be
+met. Contracts are specified by giving a condition which has to evaluate to
+true. Conditions are formulated in regular C++.
+
+3. What happens when the contract is violated?
+
+This is entirely up to you. In case of a contract violation the function
+"_dbc::failure" is called. We provide a default implementation of this function
+reporting a message, but you are free to modify the content of this function to
+suit your own needs.
+
+4. How to use preconditions?
+ class Math { public:
+ // @pre( a >= 0 )
+ float sqrt( float a ) const;
+};
+
+If you compile this code using C^2, every time you call this function the
+condition "a >= 0" is going to be checked.
+
+5. How to use postconditions?
+
+class ElectricalDevice
+{
+public:
+ bool isOperational() const;
+ // @post( ! isOperational() )
+ void unplug();
+};
+
+From now on, every time you call unplug() you are guaranteed that your
+ElectricalDevice is not operational.
+
+6. How to use invariants?
+
+class RationalNumber
+{
+public:
+....
+private:
+ int mNominator;
+ int mDenominator; // @invariant( mDenominator != 0 )
+};
+
+From now on whatever you do with the object of class RationalNumber, you can be
+sure that it is well defined.
+
+7. What about inheritance?
+
+This is where C^2 really starts to show its strengths. All contracts are
+inherited, according to the rules of behavioral subtyping [Bhvr Sbt]. For more
+information please look into the C^2 handbook.
+
+8. Aren't contracts a great support for testing?
+
+Yes, they are. For example check out the "Testing Strategies" chapter 10 of the
+"C++ FAQ Book" [FAQ Book].
+
+9. Aren't contracts a wonderful new way of enhancing class documentation?
+
+Indeed. The best possible way to document something is source code itself. C^2
+transforms your contracts into sourcecode. Thus, you avoid synchronization
+problems between documentation and code.
+
+10. How does C^2 help during debugging?
+
+Contracts help a lot during the debugging session.
+- they help to pinpoint an error. The runtime checking will report an error
+already when it occurs, not when it has erroneous and visible consequences. DBC
+makes the implications clear: Violated preconditions imply errors at the call
+of the method, violated postconditions or invariants imply errors inside the
+methods body.
+- most debuggers will respect conditions in C^2 - generated code while stepping
+through the code.
+
+11. In which way are contracts better than asserts?
+
+There are a number of reasons: First, contracts are written inside of class
+definitions, hence they enhance class documentation. Second, contracts support
+inheritance. Third, there is no easy way to express class invariants using
+asserts. You have to insert them by hand at each place you want them to be
+verified. This can be tedious and prone to errors.
+
+12. What about performance?
+
+Usually, this is not a problem, though validation of conditions might take
+time. For this exact reason you might decide to use them only during
+development and testing phase of your production cycle. You are given an
+opportunity to switch the contracts off in your release version.
+
+13. Where can I get C^2?
+
+Please download a Windows and Linux trial version of C^2 at
+http://www.aechmea.de/html/german/Downloads01_e.htm
+
+14. Where can I read more?
+
+Download C^2. The installation also contains a handbook fully documenting the
+usage of C^2.
+
+15. Which platforms are supported?
+
+At the mment, we support Microsoft Visual Studio 6.0 environment. We also have
+a Linux version of dbc. We are going to support Microsoft Visual Studio .NET
+environment very soon.
+
+16. I have an unanswered question about C^2, what am I suppose to do?
+
+Write us at feedback@aechmea.de, we will be happy to answer your questions. If
+you have any comments, questions or ideas about Design by Contract for C++ we
+are happy to hear from you.
+
+ 1. [DBC] http://archive.eiffel.com/doc/manual...logy/contract/
+ 2. [Bhvr Sbt] http://www-2.cs.cmu.edu/afs/cs/proje.../www/fmdp.html
+ 3. [FAQ Book] C++ FAQ / Marshall Cline, Greg Lomow, Mike Girou. - 2nd ed.
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + + +   + + + + + + + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + +
+ + + + + + + + + + +
+ + + + + + + +
+
+ + + +
  + + + + + +
+ +
+
+
+ +
+ +
+
+
+ + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +2 +2nd October 12:37 + +
+ + + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + +
+ + + +
+
+ + + + + + + + + + +
What happens when the code exits the function because of an
+exception? Can I specify a separate set of post-conditions?
+
+Can I use "old" (i.e. the previous value of the object) in my
+post-conditions? Does this also work with an object which doesn't support copy?
+
+
+Are their some provisions for weakened invariants after an
+exception is thrown?
+
+
+For the rest, what are the advantages compared to the current
+solution of using an inline public function with the contract
+checks, which forwards to a virtual private function?
+
+And does your system support the (IMHO mistaken) Eiffel
+position, that the checks are only invoked when the function is
+called from outside the class.
+
+--
+James Kanze GABI Software http://www.gabi-soft.fr
+Conseils en informatique orientée objet/
+Beratung in objektorientierter Datenverarbeitung
+9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
+
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + +   + + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +3 +2nd October 12:37 + +
+ + lukasz dobrek + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + + + + + + + + + + +
Thanks a lot for a hint. I won't comment on the differences between
+your and our proposal yet. I need more time to think about your solutions.
+
+This I can tell you.
+- We concentrated on the contracts as a way of enhancing OO programing.
+- We would have to parse the functions bodies much more carefully
+ than we do.
+- They are not much better than asserts from our point of view.
+
+My personal experience is that it creates problems, in cases which are
+anyway bad design. But perhaps you have a counterexamples of
+well design OO - hierarchy were this approach to DBC results in
+problems. I will be happy to look at it.
+
+Thanks for hints
+Lukasz Dobrek
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + +   + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +4 +2nd October 12:38 + +
+ + + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + + + + + + + + + + +
Could you expand on your concern, please. It works fairly well in
+Eiffel, in my opinion.
+
+Steve
+
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + +   + + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +5 +2nd October 12:39 + +
+ + + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + + + + + + + + + + +
I'm glad to see you've included @result, the ability to make assertions
+about a function's result.
+
+Why didn't you include the `old' semantics, the ability to use a
+variable's value before entering a routine in a postcondition? I would
+guess that it's possible in C++ because there is a copy constructor.
+Why doesn't any language implement this very important feature but
+Eiffel (not even D)?
+
+A well-established example is in a stack count, which is suspiciously
+missing from the stack example in your manual. From your manual:
+
+// @pre( ! isEmpty() )
+int pop();
+
+And I would add this:
+
+// @post( count() = @old( count() ) - 1 )
+
+Other than this ommision, and the one already pointed out about loop
+invariants, it seems good. I was hoping you would be the first C++
+pre-processor to implement the old semantics. I wouldn't consider
+purchasing this product without the old semantics as I believe it is an
+incomplete implementation. I'm seriously trying to be constructive
+here, and I hope you read it that way.
+
+Brian Heilig
+
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + +   + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +6 +2nd October 12:39 + +
+ + john g harris + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + + + + + + + + + + +
In message <54836886.0501130724.7cc01a9@posting.google.com> , Lukasz
+Dobrek <Lukasz.Dobrek@aechmea.de> writes
+
+But note that some contracts can't be tested by C++ code. E.g. That a
+pointer is pointing to allocated storage.
+
+Also, some contracts are impractical to test. E.g. That a sort hasn't
+lost any of its values.
+
+Significant comments are a menace. Isn't it time that the Standard
+defined ways to make certain kinds of comment reserved to implementations ?
+ <snip>
+
+
+ <snip>
+
+But note that invariants can be temporarily false inside functions whose
+job is to change the state of an object.
+
+
+ John
+--
+John Harris
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + +   + + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +7 +9th October 16:49 + +
+ + lukasz dobrek + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + + + + + + + + + + +
Nothing happens, the postconditions nor invariants are not checked.
+It is not trivial how to solve in general this sort of code generation.
+
+No we don't have old keyword yet. We are planing to add it
+in one of the forthcoming releases, but it is not yet there,
+
+
+- You can easily switch contract checking on and off.
+- You have contracts text close to the function declaration. This
+ help reading class interface.
+- You have contract inheritance for granted.
+- You have a possibility to have invariants written close
+ to members. This helps reading the class interface.
+- I guess some more.
+
+No. The checks are always invoked. This must be handled with care
+in order not to get into infinite recursion.
+
+Sincerely Yours
+Lukasz Dobrek
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + +   + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +8 +9th October 16:49 + +
+ + lukasz dobrek + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + + + + + + + + + + +
1. We will do it.
+2. We just didn't find it in our own examples as necessary
+as you claim it to be, hence we decided to postpone the "old"
+keyword into the one of the forthcoming releases.
+3. This is not trivial how to do it. In the example of yours
+
+One have to somehow infer the type of count(). This is a
+hard problem, it most likely can be done, with some kind of
+Hindley Milner algorithm but it is not simple.
+Perhaps we should use:
+// @old( int, count() )
+It will be easier, but a bit more clumsy.
+What do you think about it?
+
+This omission in striking if you are used to use "old".
+But the real reason for it, is that we have no @old keyword.
+But I agree this is an additional contract which
+should be checked. We will add an "@old" keyword to C^2.
+
+Thank you for your comments. I am happy you liked C^2.
+
+Lukasz Dobrek
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + +   + + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +9 +9th October 16:50 + +
+ + lukasz dobrek + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + + + + + + + + + + +
In principle I guess this could be solve. It will not be fast certainly
+but In principle could be done.
+
+
+True. But already testing whether qsort really sorted the array for
+arrays bigger than 1000 elements adds ~3% to the time of sorting.
+
+
+I am not sure I understand the question. Could you elaborate on it?
+
+Thats true. We propose to do it in the following way:
+The functions which return leaving your class in the state
+with violated invariant make private. There should anyway not
+be public. And using
+// @off( inv, private )
+
+Switch off checking the invariant for private function.
+
+using:
+
+// @off( inv )
+void noInvCheck()
+// @on ( inv )
+
+You can switch invariants checks for one particular function.
+
+Hope this helps, and thank you very much for comments.
+Sincerely Yours
+Lukasz Dobrek
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + +   + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +10 +9th October 16:50 + +
+ + thorsten ottosen + +
+ +
External User
+ + + + +
+  
+ + + +
+ Posts: 1 +
+ +
+
+ +
+ + + + + + + +
+ Default + Design by Contract tool for C++ +
+
+ + +
+ + + + + + + + + + + + + + + + + +
| In article <41e6f0a3$0$48316$14726298@news.sunsite.dk>, Thorsten Ottosen wrote:
+| >| 7. What about inheritance?
+| >|
+| >| This is where C^2 really starts to show its strengths. All contracts are
+| >| inherited, according to the rules of behavioral subtyping [Bhvr Sbt]. For
+| > more
+| >| information please look into the C^2 handbook.
+| >
+| > this behavior is really cute on the surface, but the question is
+| > if it doesn't create more problems than it solves.
+| My personal experience is that it creates problems, in cases which are
+| anyway bad design. But perhaps you have a counterexamples of
+| well design OO - hierarchy were this approach to DBC results in
+| problems. I will be happy to look at it.
+
+I have studied this subject quite some time and I haven't seen one
+good, realistic example of a weakened precondition. If got an example, then
+please post it.
+
+-Thorsten
+
+ [ See http://www.gotw.ca/resources/clcm.htm for info about ]
+ [ comp.lang.c++.moderated. First time posters: Do this! ]
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + +   + + + + + + + + + + + + Reply With Quote + + + + +
+ + + + + + +
+ +
+
+
+ + + + + + + + + + +
+ + + + +
+
+
+ + + + + + + + + + + +
Reply
+ + + + + +
+ +
+ « + Previous Thread + | + Next Thread + » +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Thread Tools
+ + + + + +
Display Modes
+ + + + + + + +
+
+ + + + + + + + + + +
+ + + + + +
+ +
+
+ + +
+ + + + +
+
+
+ + + + + + +
+ + + + + +
+ + + + + + + + + + +
+
+ + + + + + + + +
+
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + +666 + + +
+ + + + + +
+ + +
\ No newline at end of file diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/1.html b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/1.html new file mode 100755 index 00000000..124c00dc --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/1.html @@ -0,0 +1,10 @@ + + +document.write ('') + diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/2.html b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/2.html new file mode 100755 index 00000000..b161e590 --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/2.html @@ -0,0 +1,10 @@ + + +document.write ('') + diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/abg-en-100c-000000.png b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/abg-en-100c-000000.png new file mode 100755 index 0000000000000000000000000000000000000000..a99752ea33ce5b60b053a70e35c24aadc0334ad6 GIT binary patch literal 1006 zcmVQ_VV924tIBNWVX=2uy^L1J9FlnbI#0Nf*>FtYKBq` zYy!${XBPdXD6PN@5CEq#YULrga^NN~40HlLz-wSu?b5#t4qyzJ&#IAU;Oc-mpe4f8 zP64b4^>YEt;mz5~b6_g2aso)^kb5!5iKFL&D^ZA?%b@N7WfoYjkdK)TqRJc9SmPX4 zTsLJHEUECxRpRQo#x!ewFV1^F0niIP0>-t_Mx#~$^Z|EePan`=yhzgF_;$tBfv4B zR`s?PycJjp3~4h$`FSng6Vy*Yo5pL?+^uR)s{#xH?Pl%~;HwRT!1+Zx6bMB4n*h>! z_9MJ2DS29QUl7w~$9sWZ2iz^qQ5^%^S>>Qw(^sMQuK``a4@bTV_$K*9>6RPWJn%s6 zkMg)8=^Y1-0{zOhYp@H^^F8xCY-o3>?U|7F6yh$pK(G+7CTET`kaWPE)O&3apmxi9 zniYAeMR2=Jn?Nt-wi)K17-8X|I6 zyJUetyWo7&9v0lB@j5>u$JNM7=74qP{i;+d6{J$B(6&RyW88fBOgZnWjX4j{pbIA^lNc zqhnLOWG#Xm0FM=p>y_IUq*nuc2PS}>z;@uYHf4ti&m-n=sB*k-R?pWZ?-uaz;8_I6 zhOTeI(s%NiZ|Zo49Os){i1E~4pfeotdliOhU4+}@W&K)sqx82ZFTPOHpLA{nn-yM@ zz&m-(o`^JXMm7xz$O_H909-K#O`s4S1ukJuzD#$zgwgSwdsQ;aJud1#*KR>(xf>Pf zQ!C7C_4d%nc8`nsbyB5G8Ps7hATT3QA!%${Es)DvdSzV0Qhc@iK`BrU>o$G0zy;Y? zNuCwY^}v4wu1waf|pQwXaViDgG;Q#;t07*qoM6N<$f}Ur|!vFvP literal 0 HcmV?d00001 diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(1).htm b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(1).htm new file mode 100755 index 00000000..720a5b73 --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(1).htm @@ -0,0 +1,3 @@ + + +
  • Free CAM Software
    Learn to use CAMWorks 2009 for free Take a class, get a free legal copy
    www.cimsurf.com
  • The Home Depot eCircular
    See What's On Sale This Week at The Home Depot and Sign Up Today!
    www.HomeDepot.com
  • Flex Developers
    Unique RIA solutions for your industry
    curiousm.com/flex
  • Agile Training CSM
    Become certified as a ScrumMaster 2 Day Classes from $1195
    www.bigvisible.com/training
Ads by Google
\ No newline at end of file diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(2).htm b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(2).htm new file mode 100755 index 00000000..8c13a3f4 --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(2).htm @@ -0,0 +1,3 @@ + + +
  • Agile Training CSM
    Become certified as a ScrumMaster 2 Day Classes from $1195
    www.bigvisible.com/training
  • Love to Code?
    Compete against other coders 24x7 C, Java, PHP, Perl, Ruby and more!
    www.CodeChef.com
  • Online Programming Degree
    Directory of online degree programs Bachelors, Masters, Associates.
    www.DirectoryofOnlineSchools.com
  • .NET and Java Training
    Programming Classes in Michigan C#, ASP & VB.NET, J2SE, J2EE
    www.MichiganComputerTraining.com
Ads by Google
\ No newline at end of file diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(3).htm b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(3).htm new file mode 100755 index 00000000..2b674557 --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(3).htm @@ -0,0 +1,3 @@ + + +
Ads by Google
  Programming Keyless Entry
  Sample Programming
  Visual Basic Programming
  Jobs Computer Programming
\ No newline at end of file diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(4).htm b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(4).htm new file mode 100755 index 00000000..b7ba38e9 --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads(4).htm @@ -0,0 +1,3 @@ + + +
  • Programming Degree
    We Have Programming Degree Learn From The Professionals!
    WorldWideLearner.net
  • Crestron Authorized
    Expert Programming & Graphics Great Quality & Pricing: PepperDash
    www.pepperdash.com
  • Cut Debug Time in Half
    Automate Tedious Debug Processes, Unify Diverse Design Environments.
    www.SpringSoft.com
Ads by Google
\ No newline at end of file diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads.htm b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads.htm new file mode 100755 index 00000000..ad4ab0cb --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/ads.htm @@ -0,0 +1,3 @@ + + +
Ads by Google
Visual C++ Code
C++ Programming Forum
In C++
Television Programming
\ No newline at end of file diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/brand b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/brand new file mode 100755 index 00000000..2f637692 --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/brand @@ -0,0 +1,31 @@ + +(function() { +var f = document.getElementById('cse-search-box'); +if (!f) { +f = document.getElementById('searchbox_demo'); +} +if (f && f.q) { +var q = f.q; +var n = navigator; +var l = location; +if (n.platform == 'Win32') { +q.style.cssText = 'border: 1px solid #7e9db9; padding: 2px;'; +} +if (window.history.navigationMode) { +window.history.navigationMode('compatible'); +} +var b = function() { +if (q.value == '') { +q.style.background = '#FFFFFF url(http:\x2F\x2Fwww.google.com\x2Fcse\x2Fintl\x2Fen\x2Fimages\x2Fgoogle_custom_search_watermark.gif) left no-repeat'; +} +}; +var f = function() { +q.style.background = '#ffffff'; +}; +q.onfocus = f; +q.onblur = b; +if (!/[&?]q=[^&]/.test(l.search)) { +b(); +} +} +})(); diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/expansion_embed.js b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/expansion_embed.js new file mode 100755 index 00000000..d5fb7951 --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/expansion_embed.js @@ -0,0 +1,87 @@ +(function(){ +function h(a){throw a;} +var j=true,k=null,m=false,p=this,aa=function(a,b,c){var d=a.split("."),e=c||p;!(d[0]in e)&&e.execScript&&e.execScript("var "+d[0]);for(var f;d.length&&(f=d.shift());)if(!d.length&&b!==undefined)e[f]=b;else e=e[f]?e[f]:(e[f]={})},ba=function(a,b){for(var c=a.split("."),d=b||p,e;e=c.shift();)if(d[e])d=d[e];else return k;return d},ca=function(){},da=function(a){var b=typeof a;if(b=="object")if(a){if(a instanceof Array||!(a instanceof Object)&&Object.prototype.toString.call(a)=="[object Array]"||typeof a.length== +"number"&&typeof a.splice!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("splice"))return"array";if(!(a instanceof Object)&&(Object.prototype.toString.call(a)=="[object Function]"||typeof a.call!="undefined"&&typeof a.propertyIsEnumerable!="undefined"&&!a.propertyIsEnumerable("call")))return"function"}else return"null";else if(b=="function"&&typeof a.call=="undefined")return"object";return b},r=function(a){return da(a)=="array"},ea=function(a){var b=da(a);return b== +"array"||b=="object"&&typeof a.length=="number"},s=function(a){return typeof a=="string"},fa=function(a){return da(a)=="function"},ga=function(a){var b=da(a);return b=="object"||b=="array"||b=="function"},ja=function(a){if(a.hasOwnProperty&&a.hasOwnProperty(ha))return a[ha];a[ha]||(a[ha]=++ia);return a[ha]},ha="closure_hashCode_"+Math.floor(Math.random()*2147483648).toString(36),ia=0,t=function(a,b){var c=a.Pc;if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);c&&d.unshift.apply(d, +c);c=d}b=a.Rc||b;a=a.Qc||a;var e,f=b||p;e=c?function(){var g=Array.prototype.slice.call(arguments);g.unshift.apply(g,c);return a.apply(f,g)}:function(){return a.apply(f,arguments)};e.Pc=c;e.Rc=b;e.Qc=a;return e},ka=Date.now||function(){return(new Date).getTime()},u=function(a,b,c){aa(a,b,c)},v=function(a,b){function c(){}c.prototype=b.prototype;a.P=b.prototype;a.prototype=new c};var la=function(a,b,c){if(a.indexOf)return a.indexOf(b,c);if(Array.indexOf)return Array.indexOf(a,b,c);for(var d=c==k?0:c<0?Math.max(0,a.length+c):c,e=d;eb)return 1;return 0};ka();var za,Aa,Ba,Ca,Da,Ea,Fa,Ga,Ha,Ia,Ja=function(){return p.navigator?p.navigator.userAgent:k},Ka=function(){return p.navigator},La=function(){Ea=Da=Ca=Ba=Aa=za=m;var a;if(a=Ja()){var b=Ka();za=a.indexOf("Opera")==0;Aa=!za&&a.indexOf("MSIE")!=-1;Ca=(Ba=!za&&a.indexOf("WebKit")!=-1)&&a.indexOf("Mobile")!=-1;Ea=(Da=!za&&!Ba&&b.product=="Gecko")&&b.vendor=="Camino"}};La(); +var Ma=za,A=Aa,Na=Da,B=Ba,Oa=Ca,Pa=function(){var a=Ka();return a&&a.platform||""},Qa=Pa(),Ra=function(){Fa=wa(Qa,"Mac");Ga=wa(Qa,"Win");Ha=wa(Qa,"Linux");Ia=!!Ka()&&wa(Ka().appVersion||"","X11")};Ra(); +var Sa=function(){var a="",b;if(Ma&&p.opera){var c=p.opera.version;a=typeof c=="function"?c():c}else{if(Na)b=/rv\:([^\);]+)(\)|;)/;else if(A)b=/MSIE\s+([^\);]+)(\)|;)/;else if(B)b=/WebKit\/(\S+)/;if(b){var d=b.exec(Ja());a=d?d[1]:""}}return a},Ta=Sa(),Ua={},Va=function(a){return Ua[a]||(Ua[a]=ya(Ta,a)>=0)};var Wa;var Ya=function(a){return a?new C(Xa(a)):Wa||(Wa=new C)},Za=function(a){var b=a.document;if(B&&!Va("500")&&!Oa){if(typeof a.innerHeight=="undefined")a=window;var c=a.innerHeight,d=a.document.documentElement.scrollHeight;if(a==a.top)if(d1){if(b%2)h(Error("Uneven number of arguments"));for(var c=0;c2*this.c&&this.ea();return j}return m};F.prototype.ea=function(){if(this.c!=this.g.length){for(var a=0,b=0;a=c.length)h(ib);var i=c[b++];return a?i:d[i]}};return g};var nb=function(a,b){return Object.prototype.hasOwnProperty.call(a,b)};var ob=/^(?:([^:\/?#]+):)?(?:\/\/(?:([^\/?#]*)@)?([^\/?#:@]*)(?::([0-9]+))?)?([^?#]+)?(?:\?([^#]*))?(?:#(.*))?$/,pb=function(a){return a.match(ob)};var G=function(a,b){var c;if(a instanceof G){this.O(b==k?a.o:b);this.ua(a.l);this.va(a.Q);this.qa(a.w);this.ta(a.t);this.sa(a.s);this.La(a.k.clone());this.ra(a.J)}else if(a&&(c=pb(String(a)))){this.O(!!b);this.ua(c[1]||"",j);this.va(c[2]||"",j);this.qa(c[3]||"",j);this.ta(c[4]);this.sa(c[5]||"",j);this.Db(c[6]||"",j);this.ra(c[7]||"",j)}else{this.O(!!b);this.k=new H(k,this,this.o)}};G.prototype.l="";G.prototype.Q="";G.prototype.w="";G.prototype.t=k;G.prototype.s="";G.prototype.J=""; +G.prototype.oc=m;G.prototype.o=m;G.prototype.toString=function(){if(this.q)return this.q;var a=[];this.l&&a.push(qb(this.l,rb),":");if(this.w){a.push("//");this.Q&&a.push(qb(this.Q,rb),"@");a.push(sb(this.w));this.t!=k&&a.push(":",String(this.t))}this.s&&a.push(qb(this.s,tb));var b=String(this.k);b&&a.push("?",b);this.J&&a.push("#",qb(this.J,ub));return this.q=a.join("")}; +G.prototype.resolve=function(a){var b=this.clone(),c=a.gc();if(c)b.ua(a.l);else c=a.hc();if(c)b.va(a.Q);else c=a.kb();if(c)b.qa(a.w);else c=a.mb();var d=a.s;if(c)b.ta(a.t);else if(c=a.lb()){if(d.charAt(0)!="/")if(this.kb()&&!this.lb())d="/"+d;else{var e=b.s.lastIndexOf("/");if(e!=-1)d=b.s.substr(0,e+1)+d}d=vb(d)}if(c)b.sa(d);else c=a.fc();if(c)b.Db(a.$b());else c=a.ec();c&&b.ra(a.J);return b};G.prototype.clone=function(){return wb(this.l,this.Q,this.w,this.t,this.s,this.k.clone(),this.J,this.o)}; +G.prototype.ua=function(a,b){this.H();delete this.q;if(this.l=b?xb(a):a)this.l=this.l.replace(/:$/,"");return this};G.prototype.gc=function(){return!!this.l};G.prototype.va=function(a,b){this.H();delete this.q;this.Q=b?xb(a):a;return this};G.prototype.hc=function(){return!!this.Q};G.prototype.qa=function(a,b){this.H();delete this.q;this.w=b?xb(a):a;return this};G.prototype.kb=function(){return!!this.w}; +G.prototype.ta=function(a){this.H();delete this.q;if(a){a=Number(a);if(isNaN(a)||a<0)h(Error("Bad port number "+a));this.t=a}else this.t=k;return this};G.prototype.mb=function(){return this.t!=k};G.prototype.sa=function(a,b){this.H();delete this.q;this.s=b?xb(a):a;return this};G.prototype.lb=function(){return!!this.s};G.prototype.fc=function(){return this.k.toString()!==""}; +G.prototype.La=function(a,b){this.H();delete this.q;if(a instanceof H){this.k=a;this.k.Fb=this;this.k.O(this.o)}else{b||(a=qb(a,yb));this.k=new H(a,this,this.o)}return this};G.prototype.Db=function(a,b){return this.La(a,b)};G.prototype.$b=function(){return this.k.Kc()};G.prototype.jb=function(a){return this.k.get(a)};G.prototype.ra=function(a,b){this.H();delete this.q;this.J=b?xb(a):a;return this};G.prototype.ec=function(){return!!this.J};G.prototype.H=function(){if(this.oc)h(Error("Tried to modify a read-only Uri"))}; +G.prototype.O=function(a){this.o=a;this.k&&this.k.O(a)}; +var wb=function(a,b,c,d,e,f,g,i){var n=new G(k,i);a&&n.ua(a);b&&n.va(b);c&&n.qa(c);d&&n.ta(d);e&&n.sa(e);f&&n.La(f);g&&n.ra(g);return n},zb=function(a,b){a instanceof G||(a=a instanceof G?a.clone():new G(a,undefined));b instanceof G||(b=b instanceof G?b.clone():new G(b,undefined));return a.resolve(b)},vb=function(a){if(a==".."||a==".")return"";else if(!wa(a,"./")&&!wa(a,"/."))return a;else{for(var b=a.indexOf("/")==0,c=a.split("/"),d=[],e=0;e1||d.length==1&&d[0]!="")d.pop();b&&e==c.length&&d.push("")}else{d.push(f);b=j}}return d.join("/")}},xb=function(a){return a?decodeURIComponent(a):""},sb=function(a){if(s(a))return encodeURIComponent(a);return k},Ab=/^[a-zA-Z0-9\-_.!~*'():\/;?]*$/,qb=function(a,b){var c=k;if(s(a)){c=a;Ab.test(c)||(c=encodeURI(a));if(c.search(b)>=0)c=c.replace(b,Bb)}return c},Bb=function(a){var b=a.charCodeAt(0);return"%"+(b>>4&15).toString(16)+(b&15).toString(16)},rb=/[#\/\?@]/g,tb=/[\#\?]/g, +yb=/[\#\?@]/g,ub=/#/g,H=function(a,b,c){this.z=a||k;this.Fb=b||k;this.o=!!c};H.prototype.A=function(){if(!this.d){this.d=new F;if(this.z)for(var a=this.z.split("&"),b=0;b=0){d=a[b].substring(0,c);e=a[b].substring(c+1)}else d=a[b];d=decodeURIComponent(d.replace(/\+/g," "));d=this.K(d);this.add(d,e?decodeURIComponent(e.replace(/\+/g," ")):"")}}};H.prototype.d=k;H.prototype.c=k; +H.prototype.add=function(a,b){this.A();this.la();a=this.K(a);if(this.u(a)){var c=this.d.get(a);r(c)?c.push(b):this.d.set(a,[c,b])}else this.d.set(a,b);this.c++;return this};H.prototype.remove=function(a){this.A();a=this.K(a);if(this.d.u(a)){this.la();var b=this.d.get(a);if(r(b))this.c-=b.length;else this.c--;return this.d.remove(a)}return m};H.prototype.u=function(a){this.A();a=this.K(a);return this.d.u(a)}; +H.prototype.L=function(){this.A();for(var a=this.d.C(),b=this.d.L(),c=[],d=0;d0&&a.push("&");a.push(f,"=",va(g[i]));b++}else{b>0&&a.push("&");a.push(f,"=",va(g));b++}}return this.z=a.join("")};H.prototype.Kc=function(){if(!this.Y)this.Y=xb(this.toString());return this.Y};H.prototype.la=function(){delete this.Y;delete this.z;this.Fb&&delete this.Fb.q}; +H.prototype.clone=function(){var a=new H;if(this.Y)a.Y=this.Y;if(this.z)a.z=this.z;if(this.d)a.d=this.d.clone();return a};H.prototype.K=function(a){var b=String(a);if(this.o)b=b.toLowerCase();return b};H.prototype.O=function(a){var b=a&&!this.o;if(b){this.A();this.la();mb(this.d,function(c,d){var e=d.toLowerCase();if(d!=e){this.remove(d);this.add(e,c)}},this)}this.o=a};var I={},Db=function(a,b){for(var c=b||Cb,d=c.length,e="";a-- >0;)e+=c.charAt(Math.floor(Math.random()*d));return e},Cb="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";var J=function(){};v(J,D);J.prototype.i=0;var K=function(a){this.a=a;this.oa=[];this.Wc=t(this.Vb,this)};v(K,J);K.prototype.i=2;K.prototype.Ha=m;K.prototype.Jc=0;K.prototype.connect=function(){if(this.a.S()==0){this.D=this.a.T;this.D.XPC_toOuter=t(this.nb,this)}else this.Qa()}; +K.prototype.Qa=function(){var a=j;try{if(!this.D)this.D=window.frameElement;if(this.D&&this.D.XPC_toOuter){this.tb=this.D.XPC_toOuter;this.D.XPC_toOuter.XPC_toInner=t(this.nb,this);a=m;this.send("tp","SETUP_ACK");this.a.G()}}catch(b){}if(a){if(!this.Ib)this.Ib=t(this.Qa,this);window.setTimeout(this.Ib,100)}};K.prototype.ca=function(a){if(this.a.S()==0&&!this.a.h()&&a=="SETUP_ACK"){this.tb=this.D.XPC_toOuter.XPC_toInner;this.a.G()}else h(Error("Got unexpected transport message."))}; +K.prototype.nb=function(a,b){if(!this.Ha&&this.oa.length==0)this.a.v(a,b);else{this.oa.push({serviceName:a,payload:b});if(this.oa.length==1)this.Jc=window.setTimeout(this.Wc,1)}};K.prototype.Vb=function(){for(;this.oa.length;){var a=this.oa.shift();this.a.v(a.serviceName,a.payload)}};K.prototype.send=function(a,b){this.Ha=j;this.tb(a,b);this.Ha=m};K.prototype.b=function(){K.P.b.call(this);this.D=this.tb=k};var L=function(a){this.a=a;this.pa=this.a.f.ppu;this.Yc=this.a.f.lpu;this.Ia=[]},Eb,Fb;v(L,J);L.prototype.i=4;L.prototype.Ja=0;L.prototype.W=m;L.prototype.F=m;L.prototype.ja=function(){return"googlexpc_"+this.a.name+"_msg"};L.prototype.ga=function(){return"googlexpc_"+this.a.name+"_ack"};L.prototype.connect=function(){if(!this.F){this.Pb();this.F=j}this.Kb()};L.prototype.Pb=function(){var a=this.ja();this.$=this.za(a);this.rb=window.frames[a];a=this.ga();this.X=this.za(a);this.Na=window.frames[a]}; +L.prototype.za=function(a){var b=document.createElement("iframe"),c=b.style;c.position="absolute";c.top="-10px";c.left="10px";c.width="1px";c.height="1px";b.id=b.name=a;b.src=this.pa+"#INITIAL";document.body.appendChild(b);return b};L.prototype.mc=function(){this.a.name=Db(10);this.Ya();this.F=m;this.$c=this.za("googlexpc_reconnect_"+this.a.name)}; +L.prototype.tc=function(){for(var a=this.a.j.frames,b=a.length,c=0;cthis.pc)h(Error("[goog.structs.SimplePool] Initial cannot be greater than max"));for(var b=0;b=0&&g.aa;z--){o.currentTarget=q[z];f&=gc(g,q[z],d,j,o)}if(l){g=e[m];g.aa=g.c;for(z=0;!o.Ga&&z=c;){var d=jc.shift().iframeElement;bb(d)}kc=window.setTimeout(mc,1000)},mc=function(){lc()};S.prototype.i=3;S.prototype.connect=function(){this.send("tp","SETUP")}; +S.prototype.ca=function(a){if(a=="SETUP"){this.send("tp","SETUP_ACK");this.a.G()}else a=="SETUP_ACK"&&this.a.G()}; +S.prototype.send=function(a,b){if(A){var c=document.createElement("div");c.innerHTML='';var d=c.childNodes[0];d.xpcOnload=nc}else{d=document.createElement("iframe");B?jc.push({timestamp:ka(),iframeElement:d}):$b(d,"load",nc)}var e=d.style;e.visibility="hidden";e.width=d.style.height="0px";e.position="absolute";var f=this.Xc;f+="#"+this.a.name;if(this.uc)f+=","+this.uc;f+="|"+a+":"+encodeURIComponent(b);d.src=f;document.body.appendChild(d)}; +var nc=function(){bb(this);this.xpcOnload=k};window.xpcRelay=function(a,b){var c=b.indexOf(":"),d=b.substring(0,c),e=b.substring(c+1);I[a].v(d,decodeURIComponent(e))};S.prototype.b=function(){S.P.b.call(this);B&&lc(0)};var T=function(a,b){this.a=a;this.Fa=b||"*"};v(T,J);T.prototype.F=m;T.prototype.i=1;var oc=0,qc=function(){if(oc==0)$b(window.postMessage?window:document,"message",pc,m,T);oc++},pc=function(a){var b=a.Ca.data,c=b.indexOf("|"),d=b.indexOf(":");if(c==-1||d==-1)return m;var e=b.substring(0,c),f=b.substring(c+1,d),g=b.substring(d+1),i=I[e];if(i){i.v(f,g);return j}for(var n in I){var l=I[n];if(l.S()==1&&!l.h()&&f=="tp"&&g=="SETUP"){l.name=e;delete I[n];I[e]=l;l.v(f,g);return j}}return m}; +T.prototype.ca=function(a){switch(a){case "SETUP":if(!this.ad){this.ad=j;this.send("tp","SETUP_ACK")}break;case "SETUP_ACK":this.a.G();break}};T.prototype.connect=function(){qc();this.F=j;this.ya()};T.prototype.ya=function(){if(!this.a.h()){this.send("tp","SETUP");window.setTimeout(t(this.ya,this),100)}};T.prototype.send=function(a,b){var c=this.a.j;if(c){var d=c.postMessage?c:c.document;this.send=function(e,f){d.postMessage(this.a.name+"|"+e+":"+f,this.Fa)};this.send(a,b)}}; +T.prototype.b=function(){T.P.b.call(this);if(this.F){oc--;if(oc==0)bc(window.postMessage?window:document,"message",pc,m,T)}};var U=function(a){this.a=a;this.Jb=a.at||"";this.yc=a.rat||"";rc();this.GCXPC____NIXJS_handle_message=this.M;this.GCXPC____NIXJS_create_channel=this.Qb};v(U,J); +var rc=function(){if(!window.nix_setup_complete){var a="Class GCXPC____NIXVBS_wrapper\n Private m_Transport\nPrivate m_Auth\nPublic Sub SetTransport(transport)\nIf isEmpty(m_Transport) Then\nSet m_Transport = transport\nEnd If\nEnd Sub\nPublic Sub SetAuth(auth)\nIf isEmpty(m_Auth) Then\nm_Auth = auth\nEnd If\nEnd Sub\nPublic Function GetAuthToken()\n GetAuthToken = m_Auth\nEnd Function\nPublic Sub SendMessage(service, payload)\n Call m_Transport.GCXPC____NIXJS_handle_message(service, payload)\nEnd Sub\nPublic Sub CreateChannel(channel)\n Call m_Transport.GCXPC____NIXJS_create_channel(channel)\nEnd Sub\nPublic Sub GCXPC____NIXVBS_container()\n End Sub\nEnd Class\n Function GCXPC____NIXVBS_get_wrapper(transport, auth)\nDim wrap\nSet wrap = New GCXPC____NIXVBS_wrapper\nwrap.SetTransport transport\nwrap.SetAuth auth\nSet GCXPC____NIXVBS_get_wrapper = wrap\nEnd Function";try{window.execScript(a, +"vbscript");window.nix_setup_complete=j}catch(b){}}};U.prototype.i=6;U.prototype.U=m;U.prototype.N=k;U.prototype.connect=function(){this.a.S()==0?this.Pa():this.Oa()};U.prototype.Pa=function(){if(!this.U){var a=this.a.T;try{a.contentWindow.opener=window.GCXPC____NIXVBS_get_wrapper(this,this.Jb);this.U=j}catch(b){}this.U||window.setTimeout(t(this.Pa,this),100)}}; +U.prototype.Oa=function(){if(!this.U){try{var a=window.opener;if(a&&"GCXPC____NIXVBS_container"in a){this.N=a;var b=this.N.GetAuthToken();if(b!=this.yc)return;this.N.CreateChannel(window.GCXPC____NIXVBS_get_wrapper(this,this.Jb));this.U=j;this.a.G()}}catch(c){return}this.U||window.setTimeout(t(this.Oa,this),100)}};U.prototype.Qb=function(a){this.N=a;var b=this.N.GetAuthToken();b!=this.yc||this.a.G()};U.prototype.M=function(a,b){function c(){this.a.v(a,b)}window.setTimeout(t(c,this),1)}; +U.prototype.send=function(a,b){this.N.SendMessage(a,b)};U.prototype.b=function(){U.P.b.call(this);this.N=k};var V=function(a){D.call(this);this.f=a;this.name=this.f.cn||Db(10);this.Ab={};I[this.name]=this;$b(window,"unload",sc)};v(V,D);V.prototype.e=k;V.prototype.Ma=1;V.prototype.h=function(){return this.Ma==2};V.prototype.j=k;V.prototype.T=k;V.prototype.Cb=function(a){this.j=a};V.prototype.Xb=function(){var a;if(fa(document.postMessage)||fa(window.postMessage)||A&&window.postMessage)a=1;else if(Na)a=2;else if(A&&this.f.pru)a=3;else if(A)a=6;else if(this.f.lpu&&this.f.ppu)a=4;return a}; +V.prototype.Sb=function(){if(!this.e){this.f.tp||(this.f.tp=this.Xb());switch(this.f.tp){case 1:this.e=new T(this,this.f.ph);break;case 6:this.e=new U(this);break;case 2:this.e=new K(this);break;case 3:this.e=new S(this);break;case 4:this.e=new L(this);break}if(!this.e)h(Error("CrossPageChannel: No suitable transport found!"))}};V.prototype.Ub=m;V.prototype.Nb=m; +V.prototype.connect=function(a){this.Uc=a||ca;if(this.Ub)this.Nb=j;else{if(this.f.ifrid)this.T=s(this.f.ifrid)?document.getElementById(this.f.ifrid):this.f.ifrid;if(this.T){var b=this.T.contentWindow;b||(b=window.frames[this.f.ifrid]);this.Cb(b)}if(!this.j)if(window==top)h(Error("CrossPageChannel: Can't connect, peer window-object not set."));else this.Cb(window.parent);this.Sb();this.e.connect()}};V.prototype.close=function(){if(this.h()){this.Ma=3;this.e.dispose();this.e=k}}; +V.prototype.G=function(){if(!this.h()){this.Ma=2;this.Uc()}};V.prototype.sc=function(){this.close()};V.prototype.vb=function(a,b,c){this.Ab[a]={name:a,callback:b,jsonEncoded:!!c}};V.prototype.send=function(a,b){if(this.h())if(this.j.closed)this.close();else{if(ga(b))b=(new E).serialize(b);this.e.send(a,b)}};V.prototype.v=function(a,b){if(!a||a=="tp")this.e.ca(b);else if(this.h()){var c=this.Ab[a];if(c){if(c.jsonEncoded)try{b=fb(b)}catch(d){return}c.callback(b)}}}; +V.prototype.S=function(){return window.parent==this.j?1:0};V.prototype.b=function(){V.P.b.call(this);this.close();this.T=this.j=k;delete this.Ab;I[this.name]=k};var sc=function(){for(var a in I){var b=I[a];b&&b.dispose()}};function tc(a,b){if(a=="true")return j;if(a=="false")return m;return b};var W=document;tc("",m);tc("",m);tc("",m);tc("",m);var uc=window;var vc=function(a){var b=a||W.location.protocol+"//"+W.location.host;return b+"/robots.txt"};var X=function(){this.p=this.Z=m;this.qb=j;this.n=this.m=this.fb=this.eb=0};X.prototype.Yb=function(a){if(a&&typeof a.width=="number"&&typeof a.height=="number"&&typeof a.expansionCallback=="function"&&typeof a.collapseCallback=="function"){this.eb=a.height;this.fb=a.width;this.Zb=a.expansionCallback;this.Mb=a.collapseCallback;this.Z=j}else this.Z=m;return this.Z};X.prototype.ha=function(){return this.m};X.prototype.ia=function(){return this.n};X.prototype.hb=function(){return this.eb}; +X.prototype.ib=function(){return this.fb};X.prototype.ma=function(){return this.p};X.prototype.ob=function(){return this.Z};X.prototype.Eb=function(a){this.qb=a};X.prototype.Ic=function(){if(!this.Z)return m;if(this.p)return m;return j};X.prototype.Hc=function(){if(!this.Z)return m;if(!this.p)return m;return j};X.prototype.Oc=function(a,b,c){this.p=j;this.qb&&this.Lc(a,b,c);typeof this.Zb=="function"&&this.Zb(a,b,c)}; +X.prototype.Nc=function(a,b){this.p=m;this.qb&&this.zc();typeof this.Mb=="function"&&this.Mb(a,b)};X.prototype.Lc=function(a,b,c){if(c==0||c==3){var d=a-this.n;if(d>0)W.body.style.marginLeft=d+"px"}if(c==0||c==1){var e=b-this.m;if(e>0)W.body.style.marginTop=e+"px"}};X.prototype.zc=function(){W.body.style.marginLeft="0";W.body.style.marginTop="0"}; +var wc=function(a){u("CreativeToolset",a);u("CreativeToolset.prototype.collapseWindow",a.prototype.Ua);u("CreativeToolset.prototype.enableExpansion",a.prototype.cb);u("CreativeToolset.prototype.expandWindow",a.prototype.db);u("CreativeToolset.prototype.getCollapsedHeight",a.prototype.ha);u("CreativeToolset.prototype.getCollapsedWidth",a.prototype.ia);u("CreativeToolset.prototype.getExpandedHeight",a.prototype.hb);u("CreativeToolset.prototype.getExpandedWidth",a.prototype.ib);u("CreativeToolset.prototype.isExpanded", +a.prototype.ma);u("CreativeToolset.prototype.isExpansionEnabled",a.prototype.ob);u("CreativeToolset.prototype.shouldMaintainCoordinates",a.prototype.Eb)};var Y=function(){X.call(this)};v(Y,X);Y.prototype.cb=function(a){if(this.Yb(a)){this.lc(W.URL);return j}else return m};Y.prototype.Gc=function(a){a=new G(a);var b=a.jb("xpc"),c=a.jb("p"),d={};d.cn=b;d.ph=c;d.ppu=vc(c);d.lpu=vc();return d};Y.prototype.lc=function(a){var b=Za(uc||window);this.n=b.width;this.m=b.height;var c=this.Gc(a);this.a=new V(c);this.a.vb("expandable_ad",t(this.M,this));this.Ob()};Y.prototype.Ob=function(){this.a.connect(function(){});window.setTimeout(t(this.ka,this),30000)}; +Y.prototype.ka=function(){if(this.a&&!this.a.h())this.a=k};Y.prototype.db=function(){this.Ic()&&this.wb("expand_w"+this.fb+"_h"+this.eb)};Y.prototype.Ua=function(){this.Hc()&&this.wb("collapse")};Y.prototype.wb=function(a){this.a&&this.a.h()&&this.a.send("expandable_ad",a)}; +Y.prototype.M=function(a){var b=a.split("_");if(!(b[0]!="ok")){for(var c,d,e,f=2;f0&&d>0&&e>=0)this.Oc(c,d,e);else b[1]=="collapse"&&typeof c=="number"&&typeof d=="number"&&c>0&&d>0&&this.Nc(c,d)}};wc(Y);var xc,yc,zc,Ac,Bc,Cc,Dc=function(){Cc=Bc=Ac=zc=yc=xc=m;var a=Ja();if(a)if(a.indexOf("Firefox")!=-1)xc=j;else if(a.indexOf("Camino")!=-1)yc=j;else if(a.indexOf("iPhone")!=-1||a.indexOf("iPod")!=-1)zc=j;else if(a.indexOf("Android")!=-1)Ac=j;else if(a.indexOf("Chrome")!=-1)Bc=j;else if(a.indexOf("Safari")!=-1)Cc=j};Dc();var Ec=function(a,b){var c=Xa(a);if(c.defaultView&&c.defaultView.getComputedStyle){var d=c.defaultView.getComputedStyle(a,"");if(d)return d[b]}return k},Fc=function(a,b){return Ec(a,b)||(a.currentStyle?a.currentStyle[b]:k)||a.style[b]},Gc=function(a){var b;b=a?a.nodeType==9?a:Xa(a):document;if(A&&!Ya(b).nc())return b.body;return b.documentElement},Hc=function(a){var b=a.getBoundingClientRect();if(A){var c=a.ownerDocument;b.left-=c.documentElement.clientLeft+c.body.clientLeft;b.top-=c.documentElement.clientTop+ +c.body.clientTop}return b},Ic=function(a){if(A)return a.offsetParent;for(var b=Xa(a),c=Fc(a,"position"),d=c=="fixed"||c=="absolute",e=a.parentNode;e&&e!=b;e=e.parentNode){c=Fc(e,"position");d=d&&c=="static"&&e!=b.documentElement&&e!=b.body;if(!d&&(e.scrollWidth>e.clientWidth||e.scrollHeight>e.clientHeight||c=="fixed"||c=="absolute"))return e}return k},Jc=function(a){var b,c=Xa(a),d=Fc(a,"position"),e=Na&&c.getBoxObjectFor&&!a.getBoundingClientRect&&d=="absolute"&&(b=c.getBoxObjectFor(a))&&(b.screenX< +0||b.screenY<0),f=new x(0,0),g=Gc(c);if(a==g)return f;if(a.getBoundingClientRect){b=Hc(a);var i=Ya(c).gb();f.x=b.left+i.x;f.y=b.top+i.y}else if(c.getBoxObjectFor&&!e){b=c.getBoxObjectFor(a);var n=c.getBoxObjectFor(g);f.x=b.screenX-n.screenX;f.y=b.screenY-n.screenY}else{var l=a;do{f.x+=l.offsetLeft;f.y+=l.offsetTop;if(l!=a){f.x+=l.clientLeft||0;f.y+=l.clientTop||0}if(B&&Fc(l,"position")=="fixed"){f.x+=c.body.scrollLeft;f.y+=c.body.scrollTop;break}l=l.offsetParent}while(l&&l!=a);if(Ma||B&&d=="absolute")f.y-= +c.body.offsetTop;for(l=a;(l=Ic(l))&&l!=c.body&&l!=g;){f.x-=l.scrollLeft;if(!Ma||l.tagName!="TR")f.y-=l.scrollTop}}return f},Kc=function(a){var b=new x;if(a.nodeType==1)if(a.getBoundingClientRect){var c=Hc(a);b.x=c.left;b.y=c.top}else{var d=Ya(a).gb(),e=Jc(a);b.x=e.x-d.x;b.y=e.y-d.y}else{b.x=a.clientX;b.y=a.clientY}return b};Na&&Va("1.9");var Z=function(a,b,c,d){this.p=m;this.ic=a;this.Mc=b;this.n=c;this.m=d};Z.prototype.ma=function(){return this.p};Z.prototype.ia=function(){return this.n};Z.prototype.ha=function(){return this.m};Z.prototype.collapse=function(){var a=this.Da();if(a){a.style.width=this.n+"px";a.style.height=this.m+"px";a.style.left="0";a.style.top="0";a.style.zIndex="";if(a.parentNode.nodeName.toLowerCase()=="ins"){a.parentNode.style.zIndex="";a.parentNode.parentNode.style.zIndex=""}this.p=m}}; +Z.prototype.expand=function(a,b,c){var d=this.Da();if(d){d.style.width=a+"px";d.style.height=b+"px";d.style.zIndex=999999;if(d.parentNode.nodeName.toLowerCase()=="ins"){d.parentNode.style.zIndex=999999;d.parentNode.parentNode.style.zIndex=999999}if(a>this.n&&(c==0||c==3))d.style.left="-"+(a-this.n)+"px";if(b>this.m&&(c==1||c==0))d.style.top="-"+(b-this.m)+"px";this.p=j}}; +Z.prototype.Wb=function(a,b){var c=Kc(this.Da()),d=Za(window||window),e=a-this.n,f=b-this.m,g=c.y,i=f>g,n=d.height-(c.y+this.m),l=i||n>=g,o=c.x,q=e>o,w=d.width-(c.x+this.n),z=q||w>=o,Q=2;if(l&&!z)Q=3;else if(!l&&z)Q=1;else if(!l&&!z)Q=0;return Q};Z.prototype.Da=function(){if(!this.jc)this.jc=W.getElementById(this.ic);return this.jc};var $=function(a,b){this.I=a;this.Tc=b;this.Fa=this.ac(a.Mc);this.kc(this.bc(this.I))};$.prototype.bc=function(a){var b={};b.ifrid=a.ic;b.pu=a.Mc;b.ph=this.Fa;b.cn=this.Tc;b.ppu=vc(this.Fa);b.lpu=vc();return b};$.prototype.kc=function(a){this.a=new V(a);this.a.vb("expandable_ad",t(this.M,this));this.Va();window.setTimeout(t(this.ka,this),30000)};$.prototype.Va=function(){if(this.a)try{this.a.connect()}catch(a){window.setTimeout(t(this.Va,this),10)}}; +$.prototype.ka=function(){if(this.a&&!this.a.h()){this.a.e.connect=function(){};if(this.a.e.i==1)this.a.e.ya=function(){};if(this.a.e.i==4)this.a.e.bd=function(){};this.a.e.dispose();this.a.dispose()}};$.prototype.ac=function(a){var b=zb(W.URL,a),c=b.l+"://"+b.w;if(b.mb())c+=":"+b.t;return c};$.prototype.M=function(a){var b=a.split("_"),c=b[0];if(c=="expand")this.dc(b);else c=="collapse"&&this.cc()};$.prototype.xb=function(a){this.a.send("expandable_ad",a)}; +$.prototype.dc=function(a){if(!this.I.p){for(var b=0,c=0,d=0;d';a.google_container_id?Ec(a.google_container_id,b,e):b.write(e)}return c}function Fc(a){Mb(a)}function Gc(a){if(!Hc())return j;var b=zc();a=Ic(a);b=Xb(window)+Jc(a.google_ad_format,b);window.google_ad_url=wc(a,b);return g} +var Mc=function(a){a.dt=aa;var b=window.google_prev_ad_formats_by_region,c=window.google_ad_section,d=window.google_ad_format,e=window.google_ad_slot;if(b[c])if(!O(d)){a.prev_fmts=b[c];if(window.google_num_slots_by_client.length>1)a.slot=window.google_num_slots_by_client[R]}var f=window.google_prev_ad_slotnames_by_region;if(f[c])a.prev_slotnames=f[c].toLowerCase();if(d){if(!O(d))if(b[c])b[c]+=","+d;else b[c]=d}else if(e)if(f[c])f[c]+=","+e;else f[c]=e;a.correlator=window.google_correlator;if(window.google_new_domain_checked== +1&&window.google_new_domain_enabled==0)a.dblk=1;if(window.google_ad_channel){b=window.google_num_slots_by_channel;c="";d=window.google_ad_channel.split(Kc);for(e=0;e-1){for(e=0;e1?window.decodeURIComponent?decodeURIComponent(d[1].replace(/\+/g," ")):unescape(d[1]):""}catch(e){}}return b}function Vc(){var a=window,b=Uc(document.URL);if(b.google_ad_override){a.google_ad_override=b.google_ad_override;a.google_adtest="on"}} +function Ec(a,b,c){if(a)if((a=b.getElementById(a))&&c&&c.length!=""){a.style.visibility="visible";a.innerHTML=c}} +var Jc=function(a,b){return a=O(a)?"/pagead/sdo?":b?"/pagead/render_iframe_ads.html#":"/pagead/ads?"},Wc=function(a,b){b.dff=jc(a);b.dfs=oc(a)},Xc=function(a){a.ref=window.google_referrer_url;a.loc=window.google_page_location},Hc=function(){var a=window.google_prev_ad_formats_by_region,b=window.google_prev_ad_slotnames_by_region,c=window.google_ad_section;if(O(window.google_ad_format)){window.google_num_sdo_slots+=1;if(window.google_num_sdo_slots>4)return j}else if(N(window)){window.google_num_0ad_slots+= +1;if(window.google_num_0ad_slots>3)return j}else{window.google_num_ad_slots+=1;if(window.google_num_slots_to_rotate){Ib(1);a[c]=h;b[c]=h;if(window.google_num_slot_to_show==h)window.google_num_slot_to_show=(new Date).getTime()%window.google_num_slots_to_rotate+1;if(window.google_num_slot_to_show!=window.google_num_ad_slots)return j}else if(window.google_num_ad_slots>6&&c=="")return j}a=window.google_num_slots_by_client;if(a[R])a[R]+=1;else{a[R]=1;a.length+=1}return g},Ic=function(a){var b={};Qc(b); +Mc(b);ib(b);a&&Wc(a,b);Nc(b);Rc(b);Xc(b);b.fu=Hb;return b},Pc=function(a){var b=window.google_container_id&&Pa(window.google_container_id)||Pa(a);if(!b&&!window.google_container_id&&a){document.write("");b=Pa(a)}return b},Kc=/[+, ]/;window.google_render_ad=Oc;var Yc=["30143070","30143071","30143075"],Zc=typeof window.postMessage=="function"||typeof window.postMessage=="object"||typeof document.postMessage=="function",ad=function(a,b){typeof A1_googleCreateSlot=="function"?A1_googleCreateSlot(a.google_ad_client):$c(a,b)},cd=function(){if(!bd())return j;return g},dd=function(a){if(O(a.google_ad_format))return j;var b=a.google_ad_output;if(b&&b!="html")return j;a=a.google_ad_client;if(typeof a!="string"||a.substring(0,4)!="pub-"&&a.substring(0,7)!="ca-pub-")return j; +return g},fd=function(a){if(typeof a.google_a1_eid=="string")return a.google_a1_eid;var b=H("0",0);a.google_a1_eid=ed(Yc,b);return a.google_a1_eid},$c=function(a,b){if(!a.google_included_a1_script){var c="script",d="/pagead/show_ads_sra3.js?v\x3d1";b.write("<"+c+' src="http://'+K+d+'">");a.google_included_a1_script=g}},bd=function(){if(E&&G("8"))return j;return Zc||!F},ed=function(a,b){var c=Math.random();if(c0?a.token:null;for(var b=0;b0)this.aa();else if(a==1&&(this.j||this.c0||a==1&&(this.j||this.c0){h(this.b,this.b.k);this.o[2][o].display=="none"&&this.L(0)}else{h(this.b,null);this.M(0)}if(this.j||this.c + + \ No newline at end of file diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/urchin.js b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/urchin.js new file mode 100755 index 00000000..44803e9f --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/urchin.js @@ -0,0 +1,695 @@ +//-- Google Analytics Urchin Module +//-- Copyright 2007 Google, All Rights Reserved. + +//-- Urchin On Demand Settings ONLY +var _uacct=""; // set up the Urchin Account +var _userv=1; // service mode (0=local,1=remote,2=both) + +//-- UTM User Settings +var _ufsc=1; // set client info flag (1=on|0=off) +var _udn="auto"; // (auto|none|domain) set the domain name for cookies +var _uhash="on"; // (on|off) unique domain hash for cookies +var _utimeout="1800"; // set the inactive session timeout in seconds +var _ugifpath="/__utm.gif"; // set the web path to the __utm.gif file +var _utsp="|"; // transaction field separator +var _uflash=1; // set flash version detect option (1=on|0=off) +var _utitle=1; // set the document title detect option (1=on|0=off) +var _ulink=0; // enable linker functionality (1=on|0=off) +var _uanchor=0; // enable use of anchors for campaign (1=on|0=off) +var _utcp="/"; // the cookie path for tracking +var _usample=100; // The sampling % of visitors to track (1-100). + +//-- UTM Campaign Tracking Settings +var _uctm=1; // set campaign tracking module (1=on|0=off) +var _ucto="15768000"; // set timeout in seconds (6 month default) +var _uccn="utm_campaign"; // name +var _ucmd="utm_medium"; // medium (cpc|cpm|link|email|organic) +var _ucsr="utm_source"; // source +var _uctr="utm_term"; // term/keyword +var _ucct="utm_content"; // content +var _ucid="utm_id"; // id number +var _ucno="utm_nooverride"; // don't override + +//-- Auto/Organic Sources and Keywords +var _uOsr=new Array(); +var _uOkw=new Array(); +_uOsr[0]="google"; _uOkw[0]="q"; +_uOsr[1]="yahoo"; _uOkw[1]="p"; +_uOsr[2]="msn"; _uOkw[2]="q"; +_uOsr[3]="aol"; _uOkw[3]="query"; +_uOsr[4]="aol"; _uOkw[4]="encquery"; +_uOsr[5]="lycos"; _uOkw[5]="query"; +_uOsr[6]="ask"; _uOkw[6]="q"; +_uOsr[7]="altavista"; _uOkw[7]="q"; +_uOsr[8]="netscape"; _uOkw[8]="query"; +_uOsr[9]="cnn"; _uOkw[9]="query"; +_uOsr[10]="looksmart"; _uOkw[10]="qt"; +_uOsr[11]="about"; _uOkw[11]="terms"; +_uOsr[12]="mamma"; _uOkw[12]="query"; +_uOsr[13]="alltheweb"; _uOkw[13]="q"; +_uOsr[14]="gigablast"; _uOkw[14]="q"; +_uOsr[15]="voila"; _uOkw[15]="rdata"; +_uOsr[16]="virgilio"; _uOkw[16]="qs"; +_uOsr[17]="live"; _uOkw[17]="q"; +_uOsr[18]="baidu"; _uOkw[18]="wd"; +_uOsr[19]="alice"; _uOkw[19]="qs"; +_uOsr[20]="yandex"; _uOkw[20]="text"; +_uOsr[21]="najdi"; _uOkw[21]="q"; +_uOsr[22]="aol"; _uOkw[22]="q"; +_uOsr[23]="club-internet"; _uOkw[23]="query"; +_uOsr[24]="mama"; _uOkw[24]="query"; +_uOsr[25]="seznam"; _uOkw[25]="q"; +_uOsr[26]="search"; _uOkw[26]="q"; +_uOsr[27]="wp"; _uOkw[27]="szukaj"; +_uOsr[28]="onet"; _uOkw[28]="qt"; +_uOsr[29]="netsprint"; _uOkw[29]="q"; +_uOsr[30]="google.interia"; _uOkw[30]="q"; +_uOsr[31]="szukacz"; _uOkw[31]="q"; +_uOsr[32]="yam"; _uOkw[32]="k"; +_uOsr[33]="pchome"; _uOkw[33]="q"; +_uOsr[34]="kvasir"; _uOkw[34]="searchExpr"; +_uOsr[35]="sesam"; _uOkw[35]="q"; +_uOsr[36]="ozu"; _uOkw[36]="q"; +_uOsr[37]="terra"; _uOkw[37]="query"; +_uOsr[38]="nostrum"; _uOkw[38]="query"; +_uOsr[39]="mynet"; _uOkw[39]="q"; +_uOsr[40]="ekolay"; _uOkw[40]="q"; +_uOsr[41]="search.ilse"; _uOkw[41]="search_for"; +_uOsr[42]="bing"; _uOkw[42]="q"; + +//-- Auto/Organic Keywords to Ignore +var _uOno=new Array(); +//_uOno[0]="urchin"; +//_uOno[1]="urchin.com"; +//_uOno[2]="www.urchin.com"; + +//-- Referral domains to Ignore +var _uRno=new Array(); +//_uRno[0]=".urchin.com"; + +//-- **** Don't modify below this point *** +var _uff,_udh,_udt,_ubl=0,_udo="",_uu,_ufns=0,_uns=0,_ur="-",_ufno=0,_ust=0,_ubd=document,_udl=_ubd.location,_udlh="",_uwv="1.3"; +var _ugifpath2="http://www.google-analytics.com/__utm.gif"; +if (_udl.hash) _udlh=_udl.href.substring(_udl.href.indexOf('#')); +if (_udl.protocol=="https:") _ugifpath2="https://ssl.google-analytics.com/__utm.gif"; +if (!_utcp || _utcp=="") _utcp="/"; +function urchinTracker(page) { + if (_udl.protocol=="file:") return; + if (_uff && (!page || page=="")) return; + var a,b,c,xx,v,z,k,x="",s="",f=0,nv=0; + var nx=" expires="+_uNx()+";"; + var dc=_ubd.cookie; + _udh=_uDomain(); + if (!_uVG()) return; + _uu=Math.round(Math.random()*2147483647); + _udt=new Date(); + _ust=Math.round(_udt.getTime()/1000); + a=dc.indexOf("__utma="+_udh+"."); + b=dc.indexOf("__utmb="+_udh); + c=dc.indexOf("__utmc="+_udh); + if (_udn && _udn!="") { _udo=" domain="+_udn+";"; } + if (_utimeout && _utimeout!="") { + x=new Date(_udt.getTime()+(_utimeout*1000)); + x=" expires="+x.toGMTString()+";"; + } + if (_ulink) { + if (_uanchor && _udlh && _udlh!="") s=_udlh+"&"; + s+=_udl.search; + if(s && s!="" && s.indexOf("__utma=")>=0) { + if (!(_uIN(a=_uGC(s,"__utma=","&")))) a="-"; + if (!(_uIN(b=_uGC(s,"__utmb=","&")))) b="-"; + if (!(_uIN(c=_uGC(s,"__utmc=","&")))) c="-"; + v=_uGC(s,"__utmv=","&"); + z=_uGC(s,"__utmz=","&"); + k=_uGC(s,"__utmk=","&"); + xx=_uGC(s,"__utmx=","&"); + if ((k*1) != ((_uHash(a+b+c+xx+z+v)*1)+(_udh*1))) {_ubl=1;a="-";b="-";c="-";xx="-";z="-";v="-";} + if (a!="-" && b!="-" && c!="-") f=1; + else if(a!="-") f=2; + } + } + if(f==1) { + _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo; + _ubd.cookie="__utmb="+b+"; path="+_utcp+";"+x+_udo; + _ubd.cookie="__utmc="+c+"; path="+_utcp+";"+_udo; + } else if (f==2) { + a=_uFixA(s,"&",_ust); + _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo; + _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo; + _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo; + _ufns=1; + } else if (a>=0 && b>=0 && c>=0) { + b = _uGC(dc,"__utmb="+_udh,";"); + b = ("-" == b) ? _udh : b; + _ubd.cookie="__utmb="+b+"; path="+_utcp+";"+x+_udo; + } else { + if (a>=0) a=_uFixA(_ubd.cookie,";",_ust); + else { + a=_udh+"."+_uu+"."+_ust+"."+_ust+"."+_ust+".1"; + nv=1; + } + _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo; + _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo; + _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo; + _ufns=1; + } + if (_ulink && xx && xx!="" && xx!="-") { + xx=_uUES(xx); + if (xx.indexOf(";")==-1) _ubd.cookie="__utmx="+xx+"; path="+_utcp+";"+nx+_udo; + } + if (_ulink && v && v!="" && v!="-") { + v=_uUES(v); + if (v.indexOf(";")==-1) _ubd.cookie="__utmv="+v+"; path="+_utcp+";"+nx+_udo; + } + var wc=window; + var c=_ubd.cookie; + if(wc && wc.gaGlobal && wc.gaGlobal.dh==_udh){ + var g=wc.gaGlobal; + var ua=c.split("__utma="+_udh+".")[1].split(";")[0].split("."); + if(g.sid)ua[3]=g.sid; + if(nv>0){ + ua[2]=ua[3]; + if(g.vid){ + var v=g.vid.split("."); + ua[0]=v[0]; + ua[1]=v[1]; + } + } + _ubd.cookie="__utma="+_udh+"."+ua.join(".")+"; path="+_utcp+";"+nx+_udo; + } + _uInfo(page); + _ufns=0; + _ufno=0; + if (!page || page=="") _uff=1; +} +function _uGH() { + var hid; + var wc=window; + if (wc && wc.gaGlobal && wc.gaGlobal.hid) { + hid=wc.gaGlobal.hid; + } else { + hid=Math.round(Math.random()*0x7fffffff); + if (!wc.gaGlobal) wc.gaGlobal={}; + wc.gaGlobal.hid=hid; + } + return hid; +} +function _uInfo(page) { + var p,s="",dm="",pg=_udl.pathname+_udl.search; + if (page && page!="") pg=_uES(page,1); + _ur=_ubd.referrer; + if (!_ur || _ur=="") { _ur="-"; } + else { + dm=_ubd.domain; + if(_utcp && _utcp!="/") dm+=_utcp; + p=_ur.indexOf(dm); + if ((p>=0) && (p<=8)) { _ur="0"; } + if (_ur.indexOf("[")==0 && _ur.lastIndexOf("]")==(_ur.length-1)) { _ur="-"; } + } + s+="&utmn="+_uu; + if (_ufsc) s+=_uBInfo(); + if (_uctm) s+=_uCInfo(); + if (_utitle && _ubd.title && _ubd.title!="") s+="&utmdt="+_uES(_ubd.title); + if (_udl.hostname && _udl.hostname!="") s+="&utmhn="+_uES(_udl.hostname); + if (_usample && _usample != 100) s+="&utmsp="+_uES(_usample); + s+="&utmhid="+_uGH(); + s+="&utmr="+_ur; + s+="&utmp="+pg; + if ((_userv==0 || _userv==2) && _uSP()) { + var i=new Image(1,1); + i.src=_ugifpath+"?"+"utmwv="+_uwv+s; + i.onload=function() { _uVoid(); } + } + if ((_userv==1 || _userv==2) && _uSP()) { + var i2=new Image(1,1); + i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS(); + i2.onload=function() { _uVoid(); } + } + return; +} +function _uVoid() { return; } +function _uCInfo() { + if (!_ucto || _ucto=="") { _ucto="15768000"; } + if (!_uVG()) return; + var c="",t="-",t2="-",t3="-",o=0,cs=0,cn=0,i=0,z="-",s=""; + if (_uanchor && _udlh && _udlh!="") s=_udlh+"&"; + s+=_udl.search; + var x=new Date(_udt.getTime()+(_ucto*1000)); + var dc=_ubd.cookie; + x=" expires="+x.toGMTString()+";"; + if (_ulink && !_ubl) { + z=_uUES(_uGC(s,"__utmz=","&")); + if (z!="-" && z.indexOf(";")==-1) { _ubd.cookie="__utmz="+z+"; path="+_utcp+";"+x+_udo; return ""; } + } + z=dc.indexOf("__utmz="+_udh+"."); + if (z>-1) { z=_uGC(dc,"__utmz="+_udh+".",";"); } + else { z="-"; } + t=_uGC(s,_ucid+"=","&"); + t2=_uGC(s,_ucsr+"=","&"); + t3=_uGC(s,"gclid=","&"); + if ((t!="-" && t!="") || (t2!="-" && t2!="") || (t3!="-" && t3!="")) { + if (t!="-" && t!="") c+="utmcid="+_uEC(t); + if (t2!="-" && t2!="") { if (c != "") c+="|"; c+="utmcsr="+_uEC(t2); } + if (t3!="-" && t3!="") { if (c != "") c+="|"; c+="utmgclid="+_uEC(t3); } + t=_uGC(s,_uccn+"=","&"); + if (t!="-" && t!="") c+="|utmccn="+_uEC(t); + else c+="|utmccn=(not+set)"; + t=_uGC(s,_ucmd+"=","&"); + if (t!="-" && t!="") c+="|utmcmd="+_uEC(t); + else c+="|utmcmd=(not+set)"; + t=_uGC(s,_uctr+"=","&"); + if (t!="-" && t!="") c+="|utmctr="+_uEC(t); + else { t=_uOrg(1); if (t!="-" && t!="") c+="|utmctr="+_uEC(t); } + t=_uGC(s,_ucct+"=","&"); + if (t!="-" && t!="") c+="|utmcct="+_uEC(t); + t=_uGC(s,_ucno+"=","&"); + if (t=="1") o=1; + if (z!="-" && o==1) return ""; + } + if (c=="-" || c=="") { c=_uOrg(); if (z!="-" && _ufno==1) return ""; } + if (c=="-" || c=="") { if (_ufns==1) c=_uRef(); if (z!="-" && _ufno==1) return ""; } + if (c=="-" || c=="") { + if (z=="-" && _ufns==1) { c="utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"; } + if (c=="-" || c=="") return ""; + } + if (z!="-") { + i=z.indexOf("."); + if (i>-1) i=z.indexOf(".",i+1); + if (i>-1) i=z.indexOf(".",i+1); + if (i>-1) i=z.indexOf(".",i+1); + t=z.substring(i+1,z.length); + if (t.toLowerCase()==c.toLowerCase()) cs=1; + t=z.substring(0,i); + if ((i=t.lastIndexOf(".")) > -1) { + t=t.substring(i+1,t.length); + cn=(t*1); + } + } + if (cs==0 || _ufns==1) { + t=_uGC(dc,"__utma="+_udh+".",";"); + if ((i=t.lastIndexOf(".")) > 9) { + _uns=t.substring(i+1,t.length); + _uns=(_uns*1); + } + cn++; + if (_uns==0) _uns=1; + _ubd.cookie="__utmz="+_udh+"."+_ust+"."+_uns+"."+cn+"."+c+"; path="+_utcp+"; "+x+_udo; + } + if (cs==0 || _ufns==1) return "&utmcn=1"; + else return "&utmcr=1"; +} +function _uRef() { + if (_ur=="0" || _ur=="" || _ur=="-") return ""; + var i=0,h,k,n; + if ((i=_ur.indexOf("://"))<0 || _uGCse()) return ""; + h=_ur.substring(i+3,_ur.length); + if (h.indexOf("/") > -1) { + k=h.substring(h.indexOf("/"),h.length); + if (k.indexOf("?") > -1) k=k.substring(0,k.indexOf("?")); + h=h.substring(0,h.indexOf("/")); + } + h=h.toLowerCase(); + n=h; + if ((i=n.indexOf(":")) > -1) n=n.substring(0,i); + for (var ii=0;ii<_uRno.length;ii++) { + if ((i=n.indexOf(_uRno[ii].toLowerCase())) > -1 && n.length==(i+_uRno[ii].length)) { _ufno=1; break; } + } + if (h.indexOf("www.")==0) h=h.substring(4,h.length); + return "utmccn=(referral)|utmcsr="+_uEC(h)+"|"+"utmcct="+_uEC(k)+"|utmcmd=referral"; +} +function _uOrg(t) { + if (_ur=="0" || _ur=="" || _ur=="-") return ""; + var i=0,h,k; + if ((i=_ur.indexOf("://"))<0 || _uGCse()) return ""; + h=_ur.substring(i+3,_ur.length); + if (h.indexOf("/") > -1) { + h=h.substring(0,h.indexOf("/")); + } + for (var ii=0;ii<_uOsr.length;ii++) { + if (h.toLowerCase().indexOf(_uOsr[ii].toLowerCase()) > -1) { + if ((i=_ur.indexOf("?"+_uOkw[ii]+"=")) > -1 || (i=_ur.indexOf("&"+_uOkw[ii]+"=")) > -1) { + k=_ur.substring(i+_uOkw[ii].length+2,_ur.length); + if ((i=k.indexOf("&")) > -1) k=k.substring(0,i); + for (var yy=0;yy<_uOno.length;yy++) { + if (_uOno[yy].toLowerCase()==k.toLowerCase()) { _ufno=1; break; } + } + if (t) return _uEC(k); + else return "utmccn=(organic)|utmcsr="+_uEC(_uOsr[ii])+"|"+"utmctr="+_uEC(k)+"|utmcmd=organic"; + } + } + } + return ""; +} +function _uGCse() { + var h,p; + h=p=_ur.split("://")[1]; + if(h.indexOf("/")>-1) { + h=h.split("/")[0]; + p=p.substring(p.indexOf("/")+1,p.length); + } + if(p.indexOf("?")>-1) { + p=p.split("?")[0]; + } + if(h.toLowerCase().indexOf("google")>-1) { + if(_ur.indexOf("?q=")>-1 || _ur.indexOf("&q=")>-1) { + if (p.toLowerCase().indexOf("cse")>-1) { + return true; + } + } + } +} +function _uBInfo() { + var sr="-",sc="-",ul="-",fl="-",cs="-",je=1; + var n=navigator; + if (self.screen) { + sr=screen.width+"x"+screen.height; + sc=screen.colorDepth+"-bit"; + } else if (self.java) { + var j=java.awt.Toolkit.getDefaultToolkit(); + var s=j.getScreenSize(); + sr=s.width+"x"+s.height; + } + if (n.language) { ul=n.language.toLowerCase(); } + else if (n.browserLanguage) { ul=n.browserLanguage.toLowerCase(); } + je=n.javaEnabled()?1:0; + if (_uflash) fl=_uFlash(); + if (_ubd.characterSet) cs=_uES(_ubd.characterSet); + else if (_ubd.charset) cs=_uES(_ubd.charset); + return "&utmcs="+cs+"&utmsr="+sr+"&utmsc="+sc+"&utmul="+ul+"&utmje="+je+"&utmfl="+fl; +} +function __utmSetTrans() { + var e; + if (_ubd.getElementById) e=_ubd.getElementById("utmtrans"); + else if (_ubd.utmform && _ubd.utmform.utmtrans) e=_ubd.utmform.utmtrans; + if (!e) return; + var l=e.value.split("UTM:"); + var i,i2,c; + if (_userv==0 || _userv==2) i=new Array(); + if (_userv==1 || _userv==2) { i2=new Array(); c=_uGCS(); } + + for (var ii=0;ii -1) { + i2=l.indexOf(s,i); if (i2 < 0) { i2=l.length; } + c=l.substring((i+i3),i2); + } + return c; +} +function _uDomain() { + if (!_udn || _udn=="" || _udn=="none") { _udn=""; return 1; } + if (_udn=="auto") { + var d=_ubd.domain; + if (d.substring(0,4)=="www.") { + d=d.substring(4,d.length); + } + _udn=d; + } + _udn = _udn.toLowerCase(); + if (_uhash=="off") return 1; + return _uHash(_udn); +} +function _uHash(d) { + if (!d || d=="") return 1; + var h=0,g=0; + for (var i=d.length-1;i>=0;i--) { + var c=parseInt(d.charCodeAt(i)); + h=((h << 6) & 0xfffffff) + c + (c << 14); + if ((g=h & 0xfe00000)!=0) h=(h ^ (g >> 21)); + } + return h; +} +function _uFixA(c,s,t) { + if (!c || c=="" || !s || s=="" || !t || t=="") return "-"; + var a=_uGC(c,"__utma="+_udh+".",s); + var lt=0,i=0; + if ((i=a.lastIndexOf(".")) > 9) { + _uns=a.substring(i+1,a.length); + _uns=(_uns*1)+1; + a=a.substring(0,i); + if ((i=a.lastIndexOf(".")) > 7) { + lt=a.substring(i+1,a.length); + a=a.substring(0,i); + } + if ((i=a.lastIndexOf(".")) > 5) { + a=a.substring(0,i); + } + a+="."+lt+"."+t+"."+_uns; + } + return a; +} +function _uTrim(s) { + if (!s || s=="") return ""; + while ((s.charAt(0)==' ') || (s.charAt(0)=='\n') || (s.charAt(0,1)=='\r')) s=s.substring(1,s.length); + while ((s.charAt(s.length-1)==' ') || (s.charAt(s.length-1)=='\n') || (s.charAt(s.length-1)=='\r')) s=s.substring(0,s.length-1); + return s; +} +function _uEC(s) { + var n=""; + if (!s || s=="") return ""; + for (var i=0;i0) r=a.substring(i+1,i2); else return ""; + if ((i=a.indexOf(".",i2+1))>0) t=a.substring(i2+1,i); else return ""; + if (f) { + return r; + } else { + var c=new Array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9'); + return c[r>>28&m]+c[r>>23&m]+c[r>>18&m]+c[r>>13&m]+"-"+c[r>>8&m]+c[r>>3&m]+c[((r&7)<<2)+(t>>30&3)]+c[t>>25&m]+c[t>>20&m]+"-"+c[t>>15&m]+c[t>>10&m]+c[t>>5&m]+c[t&m]; + } +} +function _uIN(n) { + if (!n) return false; + for (var i=0;i"9") && (c!=".")) return false; + } + return true; +} +function _uES(s,u) { + if (typeof(encodeURIComponent) == 'function') { + if (u) return encodeURI(s); + else return encodeURIComponent(s); + } else { + return escape(s); + } +} +function _uUES(s) { + if (typeof(decodeURIComponent) == 'function') { + return decodeURIComponent(s); + } else { + return unescape(s); + } +} +function _uVG() { + if((_udn.indexOf("www.google.") == 0 || _udn.indexOf(".google.") == 0 || _udn.indexOf("google.") == 0) && _utcp=='/' && _udn.indexOf("google.org")==-1) { + return false; + } + return true; +} +function _uSP() { + var s=100; + if (_usample) s=_usample; + if(s>=100 || s<=0) return true; + return ((__utmVisitorCode(1)%10000)<(s*100)); +} +function urchinPathCopy(p){ + var d=document,nx,tx,sx,i,c,cs,t,h,o; + cs=new Array("a","b","c","v","x","z"); + h=_uDomain(); if (_udn && _udn!="") o=" domain="+_udn+";"; + nx=_uNx()+";"; + tx=new Date(); tx.setTime(tx.getTime()+(_utimeout*1000)); + tx=tx.toGMTString()+";"; + sx=new Date(); sx.setTime(sx.getTime()+(_ucto*1000)); + sx=sx.toGMTString()+";"; + for (i=0;i<6;i++){ + t=" expires="; + if (i==1) t+=tx; else if (i==2) t=""; else if (i==5) t+=sx; else t+=nx; + c=_uGC(d.cookie,"__utm"+cs[i]+"="+h,";"); + if (c!="-") d.cookie="__utm"+cs[i]+"="+c+"; path="+p+";"+t+o; + } +} +function _uCO() { + if (!_utk || _utk=="" || _utk.length<10) return; + var d='www.google.com'; + if (_utk.charAt(0)=='!') d='analytics.corp.google.com'; + _ubd.cookie="GASO="+_utk+"; path="+_utcp+";"+_udo; + var sc=document.createElement('script'); + sc.type='text/javascript'; + sc.id="_gasojs"; + sc.src='https://'+d+'/analytics/reporting/overlay_js?gaso='+_utk+'&'+Math.random(); + document.getElementsByTagName('head')[0].appendChild(sc); +} +function _uGT() { + var h=location.hash, a; + if (h && h!="" && h.indexOf("#gaso=")==0) { + a=_uGC(h,"gaso=","&"); + } else { + a=_uGC(_ubd.cookie,"GASO=",";"); + } + return a; +} +var _utk=_uGT(); +if (_utk && _utk!="" && _utk.length>10 && _utk.indexOf("=")==-1) { + if (window.addEventListener) { + window.addEventListener('load', _uCO, false); + } else if (window.attachEvent) { + window.attachEvent('onload', _uCO); + } +} + +function _uNx() { + return (new Date((new Date()).getTime()+63072000000)).toGMTString(); +} diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/vbulletin_global.js b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/vbulletin_global.js new file mode 100755 index 00000000..cc04c9cf --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/vbulletin_global.js @@ -0,0 +1,1539 @@ +/*======================================================================*\ +|| #################################################################### || +|| # vBulletin 3.5.3 +|| # ---------------------------------------------------------------- # || +|| # Copyright ©2000-2006 Jelsoft Enterprises Ltd. All Rights Reserved. || +|| # This file may not be redistributed in whole or significant part. # || +|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # || +|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # || +|| #################################################################### || +\*======================================================================*/ + +// ############################################################################# +// Initial setup + +// ensure SESSIONURL exists +if (typeof SESSIONURL == 'undefined') +{ + SESSIONURL = ''; +} + +// ensure vbphrase exists +if (typeof vbphrase == 'undefined') +{ + vbphrase = new Array(); +} + +// Array of message editor objects +var vB_Editor = new Array(); + +// Ignore characters within [quote] tags in messages for length check +var ignorequotechars = false; + +// Number of pagenav items dealt with so far +var pagenavcounter = 0; + +// ############################################################################# +// Browser detection and limitation workarounds + +// Define the browser we have instead of multiple calls throughout the file +var userAgent = navigator.userAgent.toLowerCase(); +var is_opera = (userAgent.indexOf('opera') != -1); +var is_saf = ((userAgent.indexOf('applewebkit') != -1) || (navigator.vendor == 'Apple Computer, Inc.')); +var is_webtv = (userAgent.indexOf('webtv') != -1); +var is_ie = ((userAgent.indexOf('msie') != -1) && (!is_opera) && (!is_saf) && (!is_webtv)); +var is_ie4 = ((is_ie) && (userAgent.indexOf('msie 4.') != -1)); +var is_moz = ((navigator.product == 'Gecko') && (!is_saf)); +var is_kon = (userAgent.indexOf('konqueror') != -1); +var is_ns = ((userAgent.indexOf('compatible') == -1) && (userAgent.indexOf('mozilla') != -1) && (!is_opera) && (!is_webtv) && (!is_saf)); +var is_ns4 = ((is_ns) && (parseInt(navigator.appVersion) == 4)); +var is_mac = (userAgent.indexOf('mac') != -1); + +// Catch possible bugs with WebTV and other older browsers +var is_regexp = (window.RegExp) ? true : false; + +// Is the visiting browser compatible with AJAX? +var AJAX_Compatible = false; + +// Help out old versions of IE that don't understand element.style.cursor = 'pointer' +var pointer_cursor = (is_ie ? 'hand' : 'pointer'); + +/** +* Workaround for heinous IE bug - add special vBlength property to all strings +* This method is applied to ALL string objects automatically +* +* @return integer +*/ +String.prototype.vBlength = function() +{ + return (is_ie && this.indexOf('\n') != -1) ? this.replace(/\r?\n/g, '_').length : this.length; +} + +/** +* Pop function for browsers that don't have it built in +* +* @param array Array from which to pop +* +* @return mixed null on empty, value on success +*/ +function array_pop(a) +{ + if (typeof a != 'object' || !a.length) + { + return null; + } + else + { + var response = a[a.length - 1]; + a.length--; + return response; + } +} + +/** +* Push function for browsers that don't have it built in +* +* @param array Array onto which to push +* @param mixed Value to push onto array +* +* @return integer Length of array +*/ +function array_push(a, value) +{ + a[a.length] = value; + return a.length; +} + +/** +* Function to emulate document.getElementById +* +* @param string Object ID +* +* @return mixed null if not found, object if found +*/ +function fetch_object(idname) +{ + if (document.getElementById) + { + return document.getElementById(idname); + } + else if (document.all) + { + return document.all[idname]; + } + else if (document.layers) + { + return document.layers[idname]; + } + else + { + return null; + } +} + +/** +* Function to emulate document.getElementsByTagName +* +* @param object Parent tag (eg: document) +* @param string Tag type (eg: 'td') +* +* @return array +*/ +function fetch_tags(parentobj, tag) +{ + if (typeof parentobj.getElementsByTagName != 'undefined') + { + return parentobj.getElementsByTagName(tag); + } + else if (parentobj.all && parentobj.all.tags) + { + return parentobj.all.tags(tag); + } + else + { + return null; + } +} + +// ############################################################################# +// Event handlers + +/** +* Handles the different event models of different browsers and prevents event bubbling +* +* @param event Event object +* +* @return event +*/ +function do_an_e(eventobj) +{ + if (!eventobj || is_ie) + { + window.event.returnValue = false; + window.event.cancelBubble = true; + return window.event; + } + else + { + eventobj.stopPropagation(); + eventobj.preventDefault(); + return eventobj; + } +} + +/** +* Handles the different event models of different browsers and prevents event bubbling in a lesser way than do_an_e() +* +* @param event Event object +* +* @return event +*/ +function e_by_gum(eventobj) +{ + if (!eventobj || is_ie) + { + window.event.cancelBubble = true; + return window.event; + } + else + { + if (eventobj.target.type == 'submit') + { + // naughty safari + eventobj.target.form.submit(); + } + eventobj.stopPropagation(); + return eventobj; + } +} + +// ############################################################################# +// Message manipulation and validation + +/** +* Checks that a message is valid for submission to PHP +* +* @param string Message text +* @param mixed Either subject text (if you want to make sure it exists) or 0 if you don't care +* @param integer Minimum acceptable character limit for the message +* +* @return boolean +*/ +function validatemessage(messagetext, subjecttext, minchars) +{ + if (is_kon || is_saf || is_webtv) + { + // ignore less-than-capable browsers + return true; + } + else if (subjecttext.length < 1) + { + // subject not specified + alert(vbphrase['must_enter_subject']); + return false; + } + else + { + var stripped = PHP.trim(stripcode(messagetext, false, ignorequotechars)); + + if (stripped.length < minchars) + { + // minimum message length not met + alert(construct_phrase(vbphrase['message_too_short'], minchars)); + return false; + } + else + { + // everything seems ok + return true; + } + } +} + +/** +* Strips quotes and bbcode tags from text +* +* @param string Text to manipulate +* @param boolean If true, strip otherwise strip [x] +* @param boolean If true, strip all [quote]...contents...[/quote] +* +* @return string +*/ +function stripcode(str, ishtml, stripquotes) +{ + if (!is_regexp) + { + return str; + } + + if (stripquotes) + { + var start_time = new Date().getTime(); + + while ((startindex = PHP.stripos(str, '[quote')) !== false) + { + if (new Date().getTime() - start_time > 2000) + { + // while loop has been running for over 2 seconds and has probably gone infinite + break; + } + + if ((stopindex = PHP.stripos(str, '[/quote]')) !== false) + { + fragment = str.substr(startindex, stopindex - startindex + 8); + str = str.replace(fragment, ''); + } + else + { + break; + } + str = PHP.trim(str); + } + } + + if (ishtml) + { + // exempt image tags -- they need to count as characters in the string + // as the do as BB codes + str = str.replace(/]+src="([^"]+)"[^>]*>/gi, '$1'); + + var html1 = new RegExp("<(\\w+)[^>]*>", 'gi'); + var html2 = new RegExp("<\\/\\w+>", 'gi'); + + str = str.replace(html1, ''); + str = str.replace(html2, ''); + + var html3 = new RegExp('( )', 'gi'); + str = str.replace(html3, ' '); + } + else + { + var bbcode1 = new RegExp("\\[(\\w+)[^\\]]*\\]", 'gi'); + var bbcode2 = new RegExp("\\[\\/(\\w+)\\]", 'gi'); + + str = str.replace(bbcode1, ''); + str = str.replace(bbcode2, ''); + } + + return str; +} + +// ############################################################################# +// vB_PHP_Emulator class +// ############################################################################# + +/** +* PHP Function Emulator Class +*/ +function vB_PHP_Emulator() +{ +} + +// ============================================================================= +// vB_PHP_Emulator Methods + +/** +* Find a string within a string (case insensitive) +* +* @param string Haystack +* @param string Needle +* @param integer Offset +* +* @return mixed Not found: false / Found: integer position +*/ +vB_PHP_Emulator.prototype.stripos = function(haystack, needle, offset) +{ + if (typeof offset == 'undefined') + { + offset = 0; + } + + index = haystack.toLowerCase().indexOf(needle.toLowerCase(), offset); + + return (index == -1 ? false : index); +} + +/** +* Trims leading whitespace +* +* @param string String to trim +* +* @return string +*/ +vB_PHP_Emulator.prototype.ltrim = function(str) +{ + return str.replace(/^\s+/g, ''); +} + +/** +* Trims trailing whitespace +* +* @param string String to trim +* +* @return string +*/ +vB_PHP_Emulator.prototype.rtrim = function(str) +{ + return str.replace(/(\s+)$/g, ''); +} + +/** +* Trims leading and trailing whitespace +* +* @param string String to trim +* +* @return string +*/ +vB_PHP_Emulator.prototype.trim = function(str) +{ + return this.ltrim(this.rtrim(str)); +} + +/** +* Emulation of PHP's preg_quote() +* +* @param string String to process +* +* @return string +*/ +vB_PHP_Emulator.prototype.preg_quote = function(str) +{ + // replace + { } ( ) [ ] | / ? ^ $ \ . = ! < > : * with backslash+character + return str.replace(/(\+|\{|\}|\(|\)|\[|\]|\||\/|\?|\^|\$|\\|\.|\=|\!|\<|\>|\:|\*)/g, "\\$1"); +} + +/** +* Emulates unhtmlspecialchars in vBulletin +* +* @param string String to process +* +* @return string +*/ +vB_PHP_Emulator.prototype.unhtmlspecialchars = function(str) +{ + f = new Array(/</g, />/g, /"/g, /&/g); + r = new Array('<', '>', '"', '&'); + + for (var i in f) + { + str = str.replace(f[i], r[i]); + } + + return str; +} + +/** +* Emulates PHP's htmlspecialchars() +* +* @param string String to process +* +* @return string +*/ +vB_PHP_Emulator.prototype.htmlspecialchars = function(str) +{ + //var f = new Array(/&(?!#[0-9]+;)/g, //g, /"/g); + var f = new Array( + (is_mac && is_ie ? new RegExp('&', 'g') : new RegExp('&(?!#[0-9]+;)', 'g')), + new RegExp('<', 'g'), + new RegExp('>', 'g'), + new RegExp('"', 'g') + ); + var r = new Array( + '&', + '<', + '>', + '"' + ); + + for (var i = 0; i < f.length; i++) + { + str = str.replace(f[i], r[i]); + } + + return str; +} + +/** +* Searches an array for a value +* +* @param string Needle +* @param array Haystack +* @param boolean Case insensitive +* +* @return integer Not found: -1 / Found: integer index +*/ +vB_PHP_Emulator.prototype.in_array = function(ineedle, haystack, caseinsensitive) +{ + var needle = new String(ineedle); + + if (caseinsensitive) + { + needle = needle.toLowerCase(); + for (var i in haystack) + { + if (haystack[i].toLowerCase() == needle) + { + return i; + } + } + } + else + { + for (var i in haystack) + { + if (haystack[i] == needle) + { + return i; + } + } + } + return -1; +} + +/** +* Emulates PHP's strpad() +* +* @param string Text to pad +* @param integer Length to pad +* @param string String with which to pad +* +* @return string +*/ +vB_PHP_Emulator.prototype.str_pad = function(text, length, padstring) +{ + text = new String(text); + padstring = new String(padstring); + + if (text.length < length) + { + padtext = new String(padstring); + + while (padtext.length < (length - text.length)) + { + padtext += padstring; + } + + text = padtext.substr(0, (length - text.length)) + text; + } + + return text; +} + +/** +* A sort of emulation of PHP's urlencode - not 100% the same, but accomplishes the same thing +* +* @param string String to encode +* +* @return string +*/ +vB_PHP_Emulator.prototype.urlencode = function(text) +{ + text = text.toString(); + + // this escapes 128 - 255, as JS uses the unicode code points for them. + // This causes problems with submitting text via AJAX with the UTF-8 charset. + var matches = text.match(/[\x90-\xFF]/g); + if (matches) + { + for (var matchid = 0; matchid < matches.length; matchid++) + { + var char_code = matches[matchid].charCodeAt(0); + text = text.replace(matches[matchid], '%u00' + (char_code & 0xFF).toString(16).toUpperCase()); + } + } + + return escape(text).replace(/\+/g, "%2B"); +} + +/** +* Works a bit like ucfirst, but with some extra options +* +* @param string String with which to work +* @param string Cut off string before first occurence of this string +* +* @return string +*/ +vB_PHP_Emulator.prototype.ucfirst = function(str, cutoff) +{ + if (typeof cutoff != 'undefined') + { + var cutpos = str.indexOf(cutoff); + if (cutpos > 0) + { + str = str.substr(0, cutpos); + } + } + + str = str.split(' '); + for (var i = 0; i < str.length; i++) + { + str[i] = str[i].substr(0, 1).toUpperCase() + str[i].substr(1); + } + return str.join(' '); +} + +// initialize the PHP emulator +var PHP = new vB_PHP_Emulator(); + +// ############################################################################# +// vB_AJAX_Handler +// ############################################################################# + +/** +* XML Sender Class +* +* @param boolean Should connections be asyncronous? +*/ +function vB_AJAX_Handler(async) +{ + /** + * Should connections be asynchronous? + * + * @var boolean + */ + this.async = async ? true : false; +} + +// ============================================================================= +// vB_AJAX_Handler methods + +/** +* Initializes the XML handler +* +* @return boolean True if handler created OK +*/ +vB_AJAX_Handler.prototype.init = function() +{ + if (typeof vb_disable_ajax != 'undefined' && vb_disable_ajax == 2) + { + // disable all ajax features + return false; + } + + try + { + this.handler = new XMLHttpRequest(); + return (this.handler.setRequestHeader ? true : false); + } + catch(e) + { + try + { + this.handler = eval("new A" + "ctiv" + "eX" + "Ob" + "ject('Micr" + "osoft.XM" + "LHTTP');"); + return true; + } + catch(e) + { + return false; + } + } +} + +/** +* Detects if the browser is fully compatible +* +* @return boolean +*/ +vB_AJAX_Handler.prototype.is_compatible = function() +{ + if (typeof vb_disable_ajax != 'undefined' && vb_disable_ajax == 2) + { + // disable all ajax features + return false; + } + + if (is_ie && !is_ie4) { return true; } + else if (XMLHttpRequest) + { + try { return XMLHttpRequest.prototype.setRequestHeader ? true : false; } + catch(e) + { + try { var tester = new XMLHttpRequest(); return tester.setRequestHeader ? true : false; } + catch(e) { return false; } + } + } + else { return false; } +} + +/** +* Checks if the system is ready +* +* @return boolean False if ready +*/ +vB_AJAX_Handler.prototype.not_ready = function() +{ + return (this.handler.readyState && (this.handler.readyState < 4)); +} + +/** +* OnReadyStateChange event handler +* +* @param function +*/ +vB_AJAX_Handler.prototype.onreadystatechange = function(event) +{ + if (!this.handler) + { + if (!this.init()) + { + return false; + } + } + if (typeof event == 'function') + { + this.handler.onreadystatechange = event; + } + else + { + alert('XML Sender OnReadyState event is not a function'); + } +} + +/** +* Sends data +* +* @param string Destination URL +* @param string Request Data +* +* @return mixed Return message +*/ +vB_AJAX_Handler.prototype.send = function(desturl, datastream) +{ + if (!this.handler) + { + if (!this.init()) + { + return false; + } + } + if (!this.not_ready()) + { + this.handler.open('POST', desturl, this.async); + this.handler.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + this.handler.send(datastream + '&s=' + fetch_sessionhash()); + + if (!this.async && this.handler.readyState == 4 && this.handler.status == 200) + { + return true; + } + } + return false; +} + +// we can check this variable to see if browser is AJAX compatible +var AJAX_Compatible = vB_AJAX_Handler.prototype.is_compatible(); + +// ############################################################################# +// vB_Hidden_Form +// ############################################################################# + +/** +* Form Generator Class +* +* Builds a form filled with hidden fields for invisible submit via POST +* +* @param string Script (my_target_script.php) +*/ +function vB_Hidden_Form(script) +{ + this.form = document.createElement('form'); + this.form.method = 'post'; + this.form.action = script; +} + +// ============================================================================= +// vB_Hidden_Form methods + +/** +* Adds a hidden input field to the form object +* +* @param string Name attribute +* @param string Value attribute +*/ +vB_Hidden_Form.prototype.add_input = function(name, value) +{ + var inputobj = document.createElement('input'); + + inputobj.type = 'hidden'; + inputobj.name = name; + inputobj.value = value; + + this.form.appendChild(inputobj); +}; + +/** +* Fetches all form elements inside an HTML element and performs 'add_input()' on them +* +* @param object HTML element to search +*/ +vB_Hidden_Form.prototype.add_inputs_from_object = function(obj) +{ + var inputs = fetch_tags(obj, 'input'); + for (var i = 0; i < inputs.length; i++) + { + switch (inputs[i].type) + { + case 'checkbox': + case 'radio': + if (inputs[i].checked) + { + this.add_input(inputs[i].name, inputs[i].value); + } + break; + case 'text': + case 'hidden': + case 'password': + this.add_input(inputs[i].name, inputs[i].value); + break; + default: + continue; + } + } + + var textareas = fetch_tags(obj, 'textarea'); + for (var i = 0; i < textareas.length; i++) + { + this.add_input(textareas[i].name, textareas[i].value); + } + + var selects = fetch_tags(obj, 'select'); + for (var i = 0; i < selects.length; i++) + { + if (selects[i].multiple) + { + for (var j = 0; j < selects[i].options.length; j++) + { + if (selects[i].options[j].selected) + { + this.add_input(selects[i].name, selects[i].options[j].value); + } + } + } + else + { + this.add_input(selects[i].name, selects[i].options[selects[i].selectedIndex].value); + } + } +} + +/** +* Submits the hidden form object +*/ +vB_Hidden_Form.prototype.submit_form = function() +{ + document.body.appendChild(this.form).submit(); +}; + +// ############################################################################# +// Window openers and instant messenger wrappers + +/** +* Opens a generic browser window +* +* @param string URL +* @param integer Width +* @param integer Height +* @param string Optional Window ID +*/ +function openWindow(url, width, height, windowid) +{ + return window.open( + url, + (typeof windowid == 'undefined' ? 'vBPopup' : windowid), + 'statusbar=no,menubar=no,toolbar=no,scrollbars=yes,resizable=yes' + + (typeof width != 'undefined' ? (',width=' + width) : '') + (typeof height != 'undefined' ? (',height=' + height) : '') + ); +} + +/** +* Opens control panel help window +* +* @param string Script name +* @param string Action type +* @param string Option value +* +* @return window +*/ +function js_open_help(scriptname, actiontype, optionval) +{ + return openWindow( + 'help.php?s=' + SESSIONHASH + '&do=answer&page=' + scriptname + '&pageaction=' + actiontype + '&option=' + optionval, + 600, 450, 'helpwindow' + ); +} + +/** +* Opens a window to show a list of posters in a thread (misc.php?do=whoposted) +* +* @param integer Thread ID +* +* @return window +*/ +function who(threadid) +{ + return openWindow( + 'misc.php?' + SESSIONURL + 'do=whoposted&t=' + threadid, + 230, 300 + ); +} + +/** +* Opens an IM Window +* +* @param string IM type +* @param integer User ID +* @param integer Width of window +* @param integer Height of window +* +* @return window +*/ +function imwindow(imtype, userid, width, height) +{ + return openWindow( + 'sendmessage.php?' + SESSIONURL + 'do=im&type=' + imtype + '&u=' + userid, + width, height + ); +} + +/** +* Sends an MSN message +* +* @param string Target MSN handle +* +* @return boolean false +*/ +function SendMSNMessage(name) +{ + if (!is_ie) + { + alert(vbphrase['msn_functions_only_work_in_ie']); + return false; + } + else + { + MsgrObj.InstantMessage(name); + return false; + } +} + +/** +* Adds an MSN Contact (requires MSN) +* +* @param string MSN handle +* +* @return boolean false +*/ +function AddMSNContact(name) +{ + if (!is_ie) + { + alert(vbphrase['msn_functions_only_work_in_ie']); + return false; + } + else + { + MsgrObj.AddContact(0, name); + return false; + } +} + +// ############################################################################# +// Cookie handlers + +/** +* Sets a cookie +* +* @param string Cookie name +* @param string Cookie value +* @param date Cookie expiry date +*/ +function set_cookie(name, value, expires) +{ + document.cookie = name + '=' + escape(value) + '; path=/' + (typeof expires != 'undefined' ? '; expires=' + expires.toGMTString() : ''); +} + +/** +* Deletes a cookie +* +* @param string Cookie name +*/ +function delete_cookie(name) +{ + document.cookie = name + '=' + '; expires=Thu, 01-Jan-70 00:00:01 GMT' + '; path=/'; +} + +/** +* Fetches the value of a cookie +* +* @param string Cookie name +* +* @return string +*/ +function fetch_cookie(name) +{ + cookie_name = name + '='; + cookie_length = document.cookie.length; + cookie_begin = 0; + while (cookie_begin < cookie_length) + { + value_begin = cookie_begin + cookie_name.length; + if (document.cookie.substring(cookie_begin, value_begin) == cookie_name) + { + var value_end = document.cookie.indexOf (';', value_begin); + if (value_end == -1) + { + value_end = cookie_length; + } + return unescape(document.cookie.substring(value_begin, value_end)); + } + cookie_begin = document.cookie.indexOf(' ', cookie_begin) + 1; + if (cookie_begin == 0) + { + break; + } + } + return null; +} + +// ############################################################################# +// Form element managers (used for 'check all' type systems + +/** +* Sets all checkboxes, radio buttons or selects in a given form to a given state, with exceptions +* +* @param object Form object +* @param string Target element type (one of 'radio', 'select-one', 'checkbox') +* @param string Selected option in case of 'radio' +* @param array Array of element names to be excluded +* @param mixed Value to give to found elements +*/ +function js_toggle_all(formobj, formtype, option, exclude, setto) +{ + for (var i =0; i < formobj.elements.length; i++) + { + var elm = formobj.elements[i]; + if (elm.type == formtype && PHP.in_array(elm.name, exclude, false) == -1) + { + switch (formtype) + { + case 'radio': + if (elm.value == option) // option == '' evaluates true when option = 0 + { + elm.checked = setto; + } + break; + case 'select-one': + elm.selectedIndex = setto; + break; + default: + elm.checked = setto; + break; + } + } + } +} + +/** +* Sets all elements to have the same checked status as 'allbox' +* +* @param object Form object +*/ +function js_check_all(formobj) +{ + exclude = new Array(); + exclude[0] = 'keepattachments'; + exclude[1] = 'allbox'; + exclude[2] = 'removeall'; + js_toggle_all(formobj, 'checkbox', '', exclude, formobj.allbox.checked); +} + +/** +* Sets all groups to have a particular option checked +* +* @param object Form object +* @param mixed Selected option +*/ +function js_check_all_option(formobj, option) +{ + exclude = new Array(); + exclude[0] = 'useusergroup'; + js_toggle_all(formobj, 'radio', option, exclude, true); +} + +/** +* Alias to js_check_all +*/ +function checkall(formobj) { js_check_all(formobj); } + +/** +* Alias to js_check_all_option +*/ +function checkall_option(formobj, option) { js_check_all_option(formobj, option); } + +/** +* Resize function for CP textareas +* +* @param integer If positive, size up, otherwise size down +* @param string ID of the textarea +* +* @return boolean false +*/ +function resize_textarea(to, id) +{ + if (to < 0) + { + var rows = -5; + var cols = -10; + } + else + { + var rows = 5; + var cols = 10; + } + + var textarea = fetch_object(id); + if (typeof textarea.orig_rows == 'undefined') + { + textarea.orig_rows = textarea.rows; + textarea.orig_cols = textarea.cols; + } + + var newrows = textarea.rows + rows; + var newcols = textarea.cols + cols; + + if (newrows >= textarea.orig_rows && newcols >= textarea.orig_cols) + { + textarea.rows = newrows; + textarea.cols = newcols; + } + + return false; +} + +// ############################################################################# +// Collapsible element handlers + +/** +* Toggles the collapse state of an object, and saves state to 'vbulletin_collapse' cookie +* +* @param string Unique ID for the collapse group +* +* @return boolean false +*/ +function toggle_collapse(objid) +{ + if (!is_regexp) + { + return false; + } + + obj = fetch_object('collapseobj_' + objid); + img = fetch_object('collapseimg_' + objid); + cel = fetch_object('collapsecel_' + objid); + + if (!obj) + { + // nothing to collapse! + if (img) + { + // hide the clicky image if there is one + img.style.display = 'none'; + } + return false; + } + + if (obj.style.display == 'none') + { + obj.style.display = ''; + save_collapsed(objid, false); + if (img) + { + img_re = new RegExp("_collapsed\\.gif$"); + img.src = img.src.replace(img_re, '.gif'); + } + if (cel) + { + cel_re = new RegExp("^(thead|tcat)(_collapsed)$"); + cel.className = cel.className.replace(cel_re, '$1'); + } + } + else + { + obj.style.display = 'none'; + save_collapsed(objid, true); + if (img) + { + img_re = new RegExp("\\.gif$"); + img.src = img.src.replace(img_re, '_collapsed.gif'); + } + if (cel) + { + cel_re = new RegExp("^(thead|tcat)$"); + cel.className = cel.className.replace(cel_re, '$1_collapsed'); + } + } + return false; +} + +/** +* Updates vbulletin_collapse cookie with collapse preferences +* +* @param string Unique ID for the collapse group +* @param boolean Add a cookie +*/ +function save_collapsed(objid, addcollapsed) +{ + var collapsed = fetch_cookie('vbulletin_collapse'); + var tmp = new Array(); + + if (collapsed != null) + { + collapsed = collapsed.split('\n'); + + for (var i in collapsed) + { + if (collapsed[i] != objid && collapsed[i] != '') + { + tmp[tmp.length] = collapsed[i]; + } + } + } + + if (addcollapsed) + { + tmp[tmp.length] = objid; + } + + expires = new Date(); + expires.setTime(expires.getTime() + (1000 * 86400 * 365)); + set_cookie('vbulletin_collapse', tmp.join('\n'), expires); +} + +// ############################################################################# +// Event Handlers for PageNav menus + +/** +* Class to handle pagenav events +*/ +function vBpagenav() +{ +} + +/** +* Handles clicks on pagenav menu control objects +*/ +vBpagenav.prototype.controlobj_onclick = function(e) +{ + this._onclick(e); + var inputs = fetch_tags(this.menu.menuobj, 'input'); + for (var i = 0; i < inputs.length; i++) + { + if (inputs[i].type == 'text') + { + inputs[i].focus(); + break; + } + } +}; + +/** +* Submits the pagenav form... sort of +*/ +vBpagenav.prototype.form_gotopage = function(e) +{ + if ((pagenum = parseInt(fetch_object('pagenav_itxt').value, 10)) > 0) + { + window.location = this.addr + '&page=' + pagenum; + } + return false; +}; + +/** +* Handles clicks on the 'Go' button in pagenav popups +*/ +vBpagenav.prototype.ibtn_onclick = function(e) +{ + return this.form.gotopage(); +}; + +/** +* Handles keypresses in the text input of pagenav popups +*/ +vBpagenav.prototype.itxt_onkeypress = function(e) +{ + return ((e ? e : window.event).keyCode == 13 ? this.form.gotopage() : true); +}; + +// ############################################################################# +// DHTML Popup Menu Handling (complements vbulletin_menu.js) + +/** +* Wrapper for vBmenu.register +* +* @param string Control ID +* @param boolean No image (true) +* @param boolean Does nothing any more +*/ +function vbmenu_register(controlid, noimage, datefield) +{ + if (typeof vBmenu == 'object') + { + vBmenu.register(controlid, noimage); + } +} + +// ############################################################################# +// Stuff that really doesn't fit anywhere else + +/** +* Sets an element and all its children to be 'unselectable' +* +* @param object Object to be made unselectable +*/ +function set_unselectable(obj) +{ + if (!is_ie4 && typeof obj.tagName != 'undefined') + { + if (obj.hasChildNodes()) + { + for (var i = 0; i < obj.childNodes.length; i++) + { + set_unselectable(obj.childNodes[i]); + } + } + obj.unselectable = 'on'; + } +} + +/** +* Fetches the sessionhash from the SESSIONURL variable +* +* @return string +*/ +function fetch_sessionhash() +{ + return (SESSIONURL == '' ? '' : SESSIONURL.substr(2, 32)); +} + +/** +* Emulates the PHP version of vBulletin's construct_phrase() sprintf wrapper +* +* @param string String containing %1$s type replacement markers +* @param string First replacement +* @param string Nth replacement +* +* @return string +*/ +function construct_phrase() +{ + if (!arguments || arguments.length < 1 || !is_regexp) + { + return false; + } + + var args = arguments; + var str = args[0]; + var re; + + for (var i = 1; i < args.length; i++) + { + re = new RegExp("%" + i + "\\$s", 'gi'); + str = str.replace(re, args[i]); + } + return str; +} + +/** +* Handles the quick style/language options in the footer +* +* @param object Select object +* @param string Type (style or language) +*/ +function switch_id(selectobj, type) +{ + var id = selectobj.options[selectobj.selectedIndex].value; + + if (id == '') + { + return; + } + + var url = new String(window.location); + var fragment = new String(''); + + // get rid of fragment + url = url.split('#'); + + // deal with the fragment first + if (url[1]) + { + fragment = '#' + url[1]; + } + + // deal with the main url + url = url[0]; + + // remove id=x& from main bit + if (url.indexOf(type + 'id=') != -1 && is_regexp) + { + re = new RegExp(type + "id=\\d+&?"); + url = url.replace(re, ''); + } + + // add the ? to the url if needed + if (url.indexOf('?') == -1) + { + url += '?'; + } + else + { + // make sure that we have a valid character to join our id bit + lastchar = url.substr(url.length - 1); + if (lastchar != '&' && lastchar != '?') + { + url += '&'; + } + } + + window.location = url + type + 'id=' + id + fragment; +} + +// ############################################################################# +// Initialize a PostBit + +/** +* This function runs all the necessary Javascript code on a PostBit +* after it has been loaded via AJAX. Don't use this method before a +* complete page load or you'll have problems. +* +* @param object Object containing postbits +*/ +function PostBit_Init(obj) +{ + if (typeof vBmenu != 'undefined') + { + // init profile menu(s) + var divs = fetch_tags(obj, 'div'); + for (var i = 0; i < divs.length; i++) + { + if (divs[i].id && divs[i].id.substr(0, 9) == 'postmenu_') + { + vBmenu.register(divs[i].id, true); + } + } + } + + if (typeof vB_QuickEditor != 'undefined') + { + // init quick edit controls + vB_AJAX_QuickEdit_Init(obj); + } + + if (typeof vB_QuickReply != 'undefined') + { + // init quick reply button + qr_init_buttons(obj); + } +} + +// ############################################################################# +// Main vBulletin Javascript Initialization + +/** +* This function runs (almost) at the end of script loading on most vBulletin pages +* +* It sets up things like image alt->title tags, turns on the popup menu system etc. +* +* @return boolean +*/ +function vBulletin_init() +{ + // don't bother doing any exciting stuff for WebTV + if (is_webtv) + { + return false; + } + + // set 'title' tags for image elements + var imgs = fetch_tags(document, 'img'); + for (var i = 0; i < imgs.length; i++) + { + if (!imgs[i].title && imgs[i].alt != '') + { + imgs[i].title = imgs[i].alt; + } + } + + // finalize popup menus + if (typeof vBmenu == 'object') + { + // close all menus on document click + if (window.attachEvent && !is_saf) + { + document.attachEvent('onclick', vbmenu_hide); + window.attachEvent('onresize', vbmenu_hide); + } + else if (document.addEventListener && !is_saf) + { + document.addEventListener('click', vbmenu_hide, false); + window.addEventListener('resize', vbmenu_hide, false); + } + else + { + window.onclick = vbmenu_hide; + window.onresize = vbmenu_hide; + } + + // add popups to pagenav elements + var pagenavs = fetch_tags(document, 'td'); + for (var n = 0; n < pagenavs.length; n++) + { + if (pagenavs[n].hasChildNodes() && pagenavs[n].firstChild.name && pagenavs[n].firstChild.name.indexOf('PageNav') != -1) + { + var addr = pagenavs[n].title; + pagenavs[n].title = ''; + pagenavs[n].innerHTML = ''; + pagenavs[n].id = 'pagenav.' + n; + var pn = vBmenu.register(pagenavs[n].id); + if (is_saf) + { + pn.controlobj._onclick = pn.controlobj.onclick; + pn.controlobj.onclick = vBpagenav.prototype.controlobj_onclick; + } + } + } + + // process the pagenavs popup form + if (typeof addr != 'undefined') + { + fetch_object('pagenav_form').addr = addr; + fetch_object('pagenav_form').gotopage = vBpagenav.prototype.form_gotopage; + fetch_object('pagenav_ibtn').onclick = vBpagenav.prototype.ibtn_onclick; + fetch_object('pagenav_itxt').onkeypress = vBpagenav.prototype.itxt_onkeypress; + } + + // activate the menu system + vBmenu.activate(true); + } + + return true; +} + +/*======================================================================*\ +|| #################################################################### +|| # Downloaded: 21:44, Mon Feb 13th 2006 +|| # CVS: $RCSfile: vbulletin_global.js,v $ - $Revision: 1.151 $ +|| #################################################################### +\*======================================================================*/ diff --git a/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/vbulletin_md5.js b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/vbulletin_md5.js new file mode 100755 index 00000000..05da64c2 --- /dev/null +++ b/doc/reference/C2-External_Preprocessor/Design by Contract tool for C++ - Mombu the Programming Forum_files/vbulletin_md5.js @@ -0,0 +1,324 @@ +/* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + + * vBulletin Usage: md5hash(input,output) + * Recommend: input = password input field; output = hidden field + + */ + +/* + * Configurable variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + */ +var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ +var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ +var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ + +/* + * These are the functions you'll usually want to call + * They take string arguments and return either hex or base-64 encoded strings + */ +function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} +function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} +function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));} +function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } +function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } +function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); } + +/* + * Calculate the MD5 of an array of little-endian words, and a bit length + */ +function core_md5(x, len) +{ + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for(var i = 0; i < x.length; i += 16) + { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); + d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); + d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); + d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i+10], 17, -42063); + b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); + d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); + d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); + c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); + d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); + c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); + d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); + c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); + d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); + c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); + d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); + d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); + d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); + d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); + d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); + d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); + d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); + d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); + +} + +/* + * These functions implement the four basic operations the algorithm uses. + */ +function md5_cmn(q, a, b, x, s, t) +{ + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); +} +function md5_ff(a, b, c, d, x, s, t) +{ + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5_gg(a, b, c, d, x, s, t) +{ + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5_hh(a, b, c, d, x, s, t) +{ + return md5_cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5_ii(a, b, c, d, x, s, t) +{ + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +/* + * Calculate the HMAC-MD5, of a key and some data + */ +function core_hmac_md5(key, data) +{ + var bkey = str2binl(key); + if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); + + var ipad = Array(16), opad = Array(16); + for(var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); + return core_md5(opad.concat(hash), 512 + 128); +} + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) +{ + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function bit_rol(num, cnt) +{ + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* + * Convert a string to an array of little-endian words + * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. + */ +function str2binl(str) +{ + var bin = new Array(); + var mask = (1 << chrsz) - 1; + for(var i = 0; i < str.length * chrsz; i += chrsz) + bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); + return bin; +} + +/* + * Convert an array of little-endian words to a string + */ +function binl2str(bin) +{ + var str = ""; + var mask = (1 << chrsz) - 1; + for(var i = 0; i < bin.length * 32; i += chrsz) + str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); + return str; +} + +/* + * Convert an array of little-endian words to a hex string. + */ +function binl2hex(binarray) +{ + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i++) + { + str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); + } + return str; +} + +/* + * Convert an array of little-endian words to a base-64 string + */ +function binl2b64(binarray) +{ + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i += 3) + { + var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) + | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) + | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); + for(var j = 0; j < 4; j++) + { + if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; + else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); + } + } + return str; +} + +function str_to_ent(str) +{ + var result = ''; + var i; + + for (i = 0; i < str.length; i++) + { + var c = str.charCodeAt(i); + var tmp = ''; + + if (c > 255) + { + + while (c >= 1) + { + tmp = "0123456789" . charAt(c % 10) + tmp; + c = c / 10; + } + + if (tmp == '') + { + tmp = "0"; + } + tmp = "#" + tmp; + tmp = "&" + tmp; + tmp = tmp + ";"; + + result += tmp; + } + else + { + result += str.charAt(i); + } + } + return result; +} + +function trim(s) +{ + while (s.substring(0, 1) == ' ') + { + s = s.substring(1, s.length); + } + while (s.substring(s.length-1, s.length) == ' ') + { + s = s.substring(0, s.length-1); + } + return s; +} + +function md5hash(input, output_html, output_utf, skip_empty) +{ + + if (navigator.userAgent.indexOf("Mozilla/") == 0 && parseInt(navigator.appVersion) >= 4) + { + var md5string = hex_md5(str_to_ent(trim(input.value))); + output_html.value = md5string; + if (output_utf) + { + md5string = hex_md5(trim(input.value)); + output_utf.value = md5string; + } + if (!skip_empty) + { + // implemented like this to make sure un-updated templates behave as before + input.value = ''; + } + } + + return true; +} \ No newline at end of file diff --git a/doc/reference/DBC_and_Unit_Testing/madsen.pdf b/doc/reference/DBC_and_Unit_Testing/madsen.pdf new file mode 100755 index 0000000000000000000000000000000000000000..d1c3397d3898d34df187ffeb5a9bff90e4633dc2 GIT binary patch literal 54994 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 + +Design by Contract in C++ - The Code Project - C++ / MFC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
4,541,546 members and + growing!   20,502 now online. My + Profile | My + Settings | My + Bookmarks | My + Articles | Sign + out
+ + + + + + + + + + + + + + + + + + + + +
+ + + + +
All Topics, MFC/C++ >> C++ / MFC >> General

+
Design by Contract + in C++
By Jarl + Lindrud.

+
An article decribing how to implement + Design by Contact in C++, using lambda expressions.
C++ (VC7.1)
Windows + (NT4, Win95, Win98)
Win32, VS (VS.NET2003)
Dev
Posted: 15 Sep + 2004
Views: + 35,740
+ + + + + + +
+
Announcements
+ +
+ +


+ + + + +
+
Search   +  
Advanced + Search
Sitemap +
+ + + + +
+ + + + + + + +
PrintBroken + Article?Bookmark Discuss Send + to a friend
+ + + + + + +
11 votes for this + article. + + + + + + + +
Popularity: + 3.83. Rating: 3.68 out of + 5.
+
    +
  • You + are signed up for one or more newsletters + but unfortunately we are unable to send you emails. Please click + here + to have an email sent that will allow us to confirm your email + address.
+
+ +

Introduction

+

Every now and then I see attempts at introducing the Design by + Contract (DbC) concept into C++, usually using some kind of + assertions. There are limits on how well that can work, but I + thought that it should be possible to do it better than what I've + seen to date.

+

DbC is usually used to describe three kinds of assertions:

+
    +
  • Precondition - a condition that must hold upon invocation of a + function. +
  • Postcondition - a condition that must hold upon exit from a + function. +
  • Class invariant - a condition that must always hold for + objects of the class, except while a public member function is + executing.
+

DbC was introduced to the programming community in the book + Object-Oriented Software Construction [1], and is an integrated part + of the Eiffel programming language. Few (any?) mainstream languages + support it out of the box though, certainly neither C++, C#, nor + Java does. Of those three, C++ lends itself the best to the task of + implementing DbC, thanks to scope-based object destruction and + templates, two features which are lacking in both C# and Java.

+

The problem

+

Basically, for a given function, we want to specify a + precondition, that needs to hold at the entry into the function, and + a postcondition, that needs to hold at the exit of a function, + whether by explicit return or by stack unwinding from an uncaught + exception. Also, we want to be able to specify a class invariant + condition that is checked both at entry and exit from any public + member function.

+

There are limits to what can be done. In particular, it won't be + possible to hinder users from overriding virtual functions with + implementations that don't fulfill the pre- or postconditions stated + in the base function. And the invariant condition cannot be checked + automatically; some kind of trigger must be provided by the + programmer. None the less, there are a lot of facilities in C++ at + our disposal, and we can go quite a distance with them.

+

The main problem is to specify a postcondition at the beginning + of a function, while delaying the actual check until the function is + exiting. Destructors of local stack-allocated objects are the key to + that problem, together with lambda expressions. We'll also borrow + some ideas from [2] to provide useful debugging information for + failed conditions. Using the preprocessor, we can put a nice veneer + on top of all the machinery. The following example shows what we end + up with.

+

Example

// The Rectangle class represents a rectangular
+// viewing area that can be zoomed or translated.
+// The rectangle is specified by two corners,
+// of which the first must have smaller
+// coordinates than the second.
+
+#include "PrePostCondition.h"
+
+namespace Demo {
+
+    class Rectangle
+    {
+    public:
+        Rectangle(double x1, double y1, double x2, double y2) :
+            x1(x1), 
+            y1(y1), 
+            x2(x2), 
+            y2(y2)
+        {
+            PRECONDITION(1);
+            POSTCONDITION(1);
+        }
+
+        double width()
+        {
+            return x2-x1;
+        }
+
+        double height()
+        {
+            return y2-y1;
+        }
+
+        void zoom(double factor)
+        {
+            PRECONDITION( factor > 0 )(factor);
+            POSTCONDITION( POST(width) == 
+                width()*factor )(width())(factor)(POST(width));
+            POSTCONDITION( POST(height) == 
+                height()*factor )(height())(factor)(POST(height));
+
+            // Implementation
+            // ...
+        }
+
+        void translate(double dx, double dy)
+        {
+            PRECONDITION(1);
+            POSTCONDITION( POST(x1) == x1+dx )(x1)(POST(x1))(dx);
+            POSTCONDITION( POST(y1) == y1+dy )(y1)(POST(y1))(dy);
+            POSTCONDITION( POST(x2) == x2+dx )(x2)(POST(x2))(dx);
+            POSTCONDITION( POST(y2) == y2+dy )(y2)(POST(y2))(dy);
+
+            // Implementation
+            // ...
+
+        }
+
+    private:
+        double x1;
+        double y1;
+        double x2;
+        double y2;
+
+        BEGIN_INVARIANT(Rectangle)
+            DEFINE_INVARIANT( x2 > x1 && y2 > y1 )(x1)(x2)(y1)(y2)
+        END_INVARIANT()
+    };
+
+} // namespace Demo
+
+int main()
+{
+    Demo::Rectangle badRectangle(0,0,-1,-1);
+    Demo::Rectangle rectangle(0,0,1,1);
+    rectangle.zoom(-1);
+    rectangle.translate(1,1);
+    rectangle.zoom(2);
+    rectangle.translate(-5,-5);
+    rectangle.zoom(.5);
+    return 0;
+}
+

The POST() macro indicates that the argument should + not be evaluated until the condition itself is evaluated; without + the POST() the argument will be evaluated immediately. + The argument can be a variable, free function, or member + function.

+

Both the PRECONDITION and POSTCONDITION + macros will check the class invariant, one at entry and the other at + exit. When a precondition, postcondition, or invariant fails, the + relevant information is printed to the debug output. To see this, + compile and run the example code. Since we've neglected to supply + implementations for the zoom and translate functions, and on top of + that we've had the temerity to create a Rectangle with bad corners, + we'll be hit by a slew of failed preconditions, postconditions, and + invariants. I would have liked to put a screenshot here of the + output window in Visual Studio, showing all the failures, but this + article is limited to 600 pixel wide images, and you wouldn't really + see anything. In any case, the full text of one of the lines in the + output window is:

e:\development\codeproject\designbycontract\demo.cpp(34): FAILURE: 
+Postcondition: POST(height) == height()*factor in Demo::Rectangle::zoom: 
+Thread-id=2572 : Timestamp(ms)= 35866: height()=1, factor= -1, POST(height)=1,
+

Here's another one:

e:\development\codeproject\designbycontract\demo.cpp(16): FAILURE: Class 
+invariant (on exit): x2 > x1 && y2 > y1 in 
+Demo::Rectangle::Rectangle: Thread-id=2572 : 
+      Timestamp(ms)=37800: x1=0, x2=-1, y1=0, y2=-1,
+

Double-clicking these lines will bring you straight to the source + code line of the failed condition. Note how easy it is to write out + extra variables and values to aid in diagnosing the situation.

+

The actions to be taken after a failed condition is easily + customizable. The default action is to do nothing, i.e. continue + with normal execution. A more noticeable action that springs to mind + is to trigger an assertion in debug builds, and to throw an + exception in release builds. To enable this failure action, redefine + the PRECONDITION and POSTCONDITION + macros:

#include "PrePostCondition.h" 
+
+#undef PRECONDITION
+#undef POSTCONDITION
+
+#ifdef NDEBUG 
+#define PRECONDITION(condition) 
+        UTIL_PRECONDITION( util::PrePostCondition::Print_ODS, 
+        util::PrePostCondition::Fail_Throw, condition ) 
+#define POSTCONDITION(condition) 
+        UTIL_POSTCONDITION( util::PrePostCondition::Print_ODS, 
+        util::PrePostCondition::Fail_Throw, condition ) 
+#else 
+#define PRECONDITION(condition) 
+        UTIL_PRECONDITION( util::PrePostCondition::Print_ODS, 
+        util::PrePostCondition::Fail_Assert, condition ) 
+#define POSTCONDITION(condition) 
+        UTIL_POSTCONDITION( util::PrePostCondition::Print_ODS, 
+        util::PrePostCondition::Fail_Assert, condition ) 
+#endif
+

If a condition failure is detected during a stack unwind from an + uncaught exception, then no action is taken; throwing another + exception in such cases would unceremoniously terminate the whole + program.

+

Implementation details

+

We use destructors of local variables to delay the checking of + postconditions and invariants. In order to store the expressions + constituting the condition, we make use of the Boost Lambda Library + [3], which allows us to build complex expressions that can be stored + and evaluated at some latter point in time. To allow users to output + extra information when a condition fails, we apply some preprocessor + magic from [2], creating what in effect is a variable argument + macro.

+

Because of the heavy use of lambda expressions, there is a + noticeable increase in compilation time when using these macros. I + haven't tried to optimize the framework with respect to + compile-time; currently there is an abundance of functors and + compile-time lambda expressions, obviating a number of these would + definitely help the compilation time. Using precompiled headers and + instantiating common templates there also helps.

+

The runtime penalty is also significant, especially in debug + builds since no inlining is performed. This is generally less of an + issue though. While testing a program, we can put up with a + performance loss to help localize DbC violations, and once a program + is determined to be running correctly, the checking can be + disabled.

+

The included sample program has been compiled and tested with + Visual C++ 7.1. It almost surely won't work with earlier versions of + Visual C++, due to compiler idiosyncrasies (a.k.a. bugs). The Boost + Function and Lambda libraries are required, and may be downloaded as + part of the Boost library [4]. I've tested against versions 1.30 and + 1.31 of Boost.

+

Summary

+

I've presented a C++ framework for implementing DbC, which allows + class invariants, preconditions, and postconditions to be stated up + front and enforced at the correct times, with extensive diagnostic + information when a failure is encountered.

+

Comments are gratefully received. If you come across some bugs, + please tell me!

+

Bibliography

+

[1] - Bertrand Meyer: Object-Oriented Software Construction, + Second Edition, Prentice Hall, 1997.

+

[2] - Andrei Alexandrescu, John Torjo: Enhancing Assertions, C++ Users Journal, August + 2003.

+

[3] - Jaakko Järvi, Gary Powell: Boost + Lambda Library.

+

[4] - http://www.boost.org/

+ + +

About Jarl Lindrud

+
+ + + + +

Software developer, ex-resident of Sweden + and now living in Canberra, Australia, working on distributed + C++ applications. Jarl enjoys programming, but prefers skiing + and playing table tennis. He derives immense satisfaction from + referring to himself in third person.
+

Click here + to view Jarl Lindrud's online + profile.


+ + + + +
+

Other popular C++ / MFC articles:

+
+ +
+
+ + + +
+ + + + +
[Top]Rate this + Article for us!     + PoorExcellent   +
+
+
+ +
+ + + + +
+ + + +
+ + + + + + + + + + +
+ + + + + + + + + + + +
+ FAQ Message score threshold    Search comments  
 View   Per page +  
+ + + + + +
New MessageMsgs 1 to 21 of 21 (Total: + 21) (Refresh)First Prev Next      +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
Subject Author Date 
+ + + + + + + +
 Nice, but I prefer + ModAssert JasonReese 5:55 18 + May + '06 
+ + + + + + + +
 Preconditions dilas 8:11 26 + Sep + '04 
+ + + + + + + +
 Re: Preconditions Jarl +Lindrud 7:32 28 Sep + '04 
+ + + + + + + +
 Re: Preconditions dilas 10:22 30 Sep + '04 
+ + + + + + + +
 Re: Preconditions dosler 8:54 23 Aug + '05 
+ + + + + + + +
 My C++ DbC Framework Kevin + McFarlane 15:41 24 + Sep + '04 
+ + + + + + + +
 Re: My C++ DbC Framework Jarl +Lindrud 17:14 24 Sep + '04 
+ + + + + + + +
 Re: My C++ DbC Framework Kevin + McFarlane 18:24 24 Sep + '04 
+ + + + + + + +
 Great waiting_for_you 22:12 15 + Sep + '04 
+ + + + + + + +
 Have you looked at Digital Mars + C++? Don + Clugston 19:43 15 + Sep + '04 
+ + + + + + + +
 Re: Have you looked at Digital Mars + C++? Jarl +Lindrud 13:09 16 Sep + '04 
+ + + + + + + +
 Re: Have you looked at Digital Mars + C++? Don +Clugston 19:42 16 Sep + '04 
+ + + + + + + +
 Confused and + ConfusingUnconfirmed/Anonymous posting Code + Inspector 15:23 15 + Sep + '04 
+ + + + + + + +
 Re: Confused and Confusing Jarl + Lindrud 16:34 15 Sep + '04 
+ + + + + + + +
 Re: Confused and Confusing Neville + Franks 4:40 18 Sep + '04 
+ + + + + + + +
 use, but don't abuse + ! emilio_grv 9:51 15 + Sep + '04 
+ + + + + + + +
 Re: use, but don't abuse ! Jarl +Lindrud 7:41 18 Sep + '04 
+ + + + + + + +
 Great! Nemanja + Trifunovic 8:06 15 + Sep + '04 
+ + + + + + + +
 Re: Great! Jarl +Lindrud 9:53 15 Sep + '04 
+ + + + + + + +
 Re: Great! Craig Kelly 15:13 24 Sep + '04 
+ + + + + + + +
 Re: Great! Jarl +Lindrud 0:57 25 Sep + '04 
+ + + + +
Last Visit: 13:42 Friday + 21st September, 2007First Prev Next      +
+

General comment    News / Info    Question    Answer    Joke / Game    Admin message


+ + + + +
Updated: 15 Sep 2004 Article content copyright Jarl + Lindrud, 2004
everything else Copyright © CodeProject, + 1999-2007.
Web20 | Advertise on + The Code Project | Privacy +
+ +
+
+ + + + + +
The Ultimate Toolbox • + ASP AllianceDeveloper FusionDevelopersdexDevGuruProgrammers HeavenPlanet Source Code • + Tek-Tips Forums • +
diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/codeproject225x90.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/codeproject225x90.gif new file mode 100755 index 0000000000000000000000000000000000000000..d42aa0851014ac9d068df8ab6eded3c849af758a GIT binary patch literal 7001 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 F=06RFwD|x4 literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/forum_search.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/forum_search.gif new file mode 100755 index 0000000000000000000000000000000000000000..9e35258a2cf923acc70a78590a10fc523ce8027d GIT binary patch literal 974 zcmb_bZAep57=Ev9vQ_9n4Ap4*}O8rqO{Wz`Es>!%Z};sCgnsqU=kOlRInQ&R_dN&RLq`tA z$DNUY1m+RQxMF;uW121-Y#Hb8l-%mEefVDU?)z=WcxFz+rEKfa@PwDg3g^7;(Tw@U ze8VJXuIszm`FfPchCyFmkN3ul*_Mfgo*8by&uMe+>k67}<9@^Ana0sM=ORCZIEeTG z@j?H`O#OXBSx5C4p0iF@5Bi)O{|?cG_zAK9>o2{r$xzyU+r=9m{p|HF`Vc*cPe!M8 zd5u+r{yrc77I6-dLp0s&%4Z#|)0`9W4dNK0pJW-D%(zgEEqlHVSaYvG)D<;#ycr)Q zf(5R&)5$l)VG%vED|+RjJQL;1UX1u ztT1_vfzARs%?b%6NC2SO<<1O|0mq>K*$$WNcAv~q5L!AS2XI?J0aDuHWmOJDx|am2 zqTW|RBCHN*ToPd17RQoCc!ltQNElX-;8xLka<_05*@kKWgUEX@fvglu*`@ACP!Tc! zsXO5J5383-v``cWw7uZZ5)}mPr22IrkEkOjfsjW42tA)6oo0v&v+mfJFZ5yBLKlVr zWp|swLjGCm1`sKK3&cbZ+XGXeCqQHeN)#Tyi(x3inw6WA91cn#mPX3#sZ>#L$Oe@; zBH3yZ%eHB{8D&v$@%s2|`}o8Pvt-jj%VAC5GqG&ziPltQeQ~*IXX-Nxb*;Z*?e2>s zNeiCf%J8V{A0toCriE_Y$4rSfrHfcoVnz7=s`TQjEo#~3OwW{92FW(HwZ6UVR+Oew n9j-}y6}IE_+)Cf9P_2l*CahE*f3Efvo_o7DOd$a!4}1Os8Odcj literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/front.asp b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/front.asp new file mode 100755 index 00000000..8b7f04e1 --- /dev/null +++ b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/front.asp @@ -0,0 +1,12 @@ +if(!document.itxtInProg){ +document.itxtInProg=1;var itxtIas='a105df8f070542fe86599d31d994fead', +bvie=navigator.appVersion.indexOf('MSIE')>=0&&navigator.appVersion.indexOf('Opera')<0; +function gIT(o){if(o.nodeType==3)return o.nodeValue;if(o.tagName&&('script'==o.tagName.toLowerCase()))return '';var t='';var cn=o.childNodes;for(var i=0;i=0 && ('complete'!=document.readyState)){document.write('');}else itxtLES(u);}catch(e){}} +function itxtHurraCookie(u){try{if(navigator.appVersion.indexOf('MSIE')>=0 && ('complete'!=document.readyState)){document.write('');}else{var hurraImg=document.createElement('img');hurraImg.src='http://ads.hurra.de/cgi-local/view.cgi?sid=a105df8f070542fe86599d31d994fead';document.getElementsByTagName( "body" )[0].appendChild( hurraImg );}}catch(e){}} +var itxturl='http://codeproject.us.intellitxt.com/v3/door.jsp?ts='+(new Date()).getTime()+'&pagecl='+itxtbtl()+'&ias='+itxtIas+'&ipid=5102&refurl='+document.location.href.replace(/\&/g,'%26').replace(/\'/g, '%27').replace(/\"/g, '%22').replace(/\#(.)*/,''); +itxtDSB(itxturl); +} diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/global.css b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/global.css new file mode 100755 index 00000000..58b07758 --- /dev/null +++ b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/global.css @@ -0,0 +1,615 @@ +BODY { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +P { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +H1 { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +H2 { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +H3 { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +H4 { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +H5 { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +H6 { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +LI { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +TD { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +TH { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +DD { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +DT { + FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +BODY { + COLOR: #000000; BACKGROUND-COLOR: #ffffff +} +LI { + LIST-STYLE-IMAGE: none +} +UL { + LIST-STYLE-IMAGE: none +} +OL { + LIST-STYLE-IMAGE: none +} +H1 { + FONT-WEIGHT: bold +} +H2 { + FONT-WEIGHT: bold +} +H3 { + FONT-WEIGHT: bold +} +H4 { + FONT-WEIGHT: bold +} +H5 { + FONT-WEIGHT: bold +} +TH { + FONT-WEIGHT: bold +} +H2 { + COLOR: #ff9900 +} +H3 { + COLOR: #ff9900 +} +H5 { + COLOR: #ff9900 +} +H1 { + FONT-SIZE: 16pt +} +H2 { + FONT-SIZE: 13pt +} +H3 { + FONT-SIZE: 11pt; FONT-FAMILY: Arial, sans-serif +} +H4 { + FONT-SIZE: 10pt; MARGIN-BOTTOM: 2px +} +H5 { + FONT-SIZE: 9pt; MARGIN-BOTTOM: 2px +} +H6 { + FONT-WEIGHT: normal; FONT-SIZE: 65%; COLOR: #626262 +} +DD { + MARGIN-LEFT: 20px +} +PRE { + PADDING-RIGHT: 7pt; PADDING-LEFT: 7pt; PADDING-BOTTOM: 7pt; FONT: 9pt "Courier New", Courier, mono; OVERFLOW: auto; PADDING-TOP: 7pt; WHITE-SPACE: pre; BACKGROUND-COLOR: #fbedbb +} +CODE { + FONT-SIZE: 11pt; COLOR: #990000; FONT-FAMILY: "Courier New", Courier, mono +} +A:link { + TEXT-DECORATION: none +} +A:visited { + TEXT-DECORATION: none +} +A:active { + TEXT-DECORATION: underline +} +A:hover { + TEXT-DECORATION: underline +} +TT.equation { + FONT-SIZE: 10pt; FONT-STYLE: italic; FONT-FAMILY: 'Times New Roman', serif; WHITE-SPACE: pre +} +.MenuCat { + BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 5px; FONT-WEIGHT: bold; BORDER-LEFT-WIDTH: 0px; FONT-SIZE: 12px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 2px; MARGIN: 0px; TEXT-TRANSFORM: uppercase; COLOR: #ffffff; PADDING-TOP: 2px; FONT-FAMILY: Arial,Verdana; BACKGROUND-COLOR: #333; BORDER-RIGHT-WIDTH: 0px +} +.MenuGroup { + BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; WIDTH: 160px; PADDING-TOP: 0px; FONT-FAMILY: Tahoma, Arial, sans-serif; POSITION: relative; TOP: 0px; BACKGROUND-COLOR: #ffcc99; BORDER-RIGHT-WIDTH: 0px +} +.MenuSubCat { + BORDER-RIGHT: #fb3 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #fb3 0px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 8pt; PADDING-BOTTOM: 1px; MARGIN: 0px; BORDER-LEFT: #fb3 1px solid; COLOR: #000000; PADDING-TOP: 1px; BORDER-BOTTOM: #fb3 1px solid; FONT-FAMILY: Arial; BACKGROUND-COLOR: #ffcc66 +} +.MenuSubCat A { + COLOR: #000000 +} +.MenuSubCat:hover { + COLOR: #000000; BACKGROUND-COLOR: #ffe0b3 +} +.MI { + PADDING-RIGHT: 0px; PADDING-LEFT: 3px; FONT-WEIGHT: normal; FONT-SIZE: 8pt; PADDING-BOTTOM: 1px; WIDTH: 155px! important; COLOR: black; PADDING-TOP: 1px; FONT-FAMILY: Verdana, Arial, sans-serif; BACKGROUND-COLOR: #ffe0b3 +} +.MI A { + PADDING-RIGHT: 0px; PADDING-LEFT: 3px; FONT-WEIGHT: normal; FONT-SIZE: 8pt; PADDING-BOTTOM: 1px; WIDTH: 155px! important; COLOR: black; PADDING-TOP: 1px; FONT-FAMILY: Verdana, Arial, sans-serif; BACKGROUND-COLOR: #ffe0b3 +} +.MIS { + PADDING-RIGHT: 0px; PADDING-LEFT: 3px; FONT-WEIGHT: normal; FONT-SIZE: 8pt; PADDING-BOTTOM: 1px; WIDTH: 155px! important; COLOR: black; PADDING-TOP: 1px; FONT-FAMILY: Verdana, Arial, sans-serif; BACKGROUND-COLOR: #ffe0b3 +} +.MIS A { + PADDING-RIGHT: 0px; PADDING-LEFT: 3px; FONT-WEIGHT: normal; FONT-SIZE: 8pt; PADDING-BOTTOM: 1px; WIDTH: 155px! important; COLOR: black; PADDING-TOP: 1px; FONT-FAMILY: Verdana, Arial, sans-serif; BACKGROUND-COLOR: #ffe0b3 +} +.MI A:hover { + BACKGROUND-COLOR: #fffaf2; TEXT-DECORATION: none +} +.userNavText { + FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: verdana,Sans-Serif; LETTER-SPACING: -1px +} +.userNavText A { + FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: verdana,Sans-Serif; LETTER-SPACING: -1px +} +.HeaderLogo { + BACKGROUND-COLOR: #ff9900 +} +.HeaderBanner { + VERTICAL-ALIGN: middle; WIDTH: 100%; BACKGROUND-COLOR: #ff9900; TEXT-ALIGN: right +} +.PageBlockHeader { + BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 15px; PADDING-BOTTOM: 2px; BORDER-LEFT: #cccccc 1px solid; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #cccccc 1px; FONT-FAMILY: Arial,Verdana; WHITE-SPACE: nowrap +} +.MainBlockHeader { + BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 13px; PADDING-BOTTOM: 2px; TEXT-TRANSFORM: uppercase; BORDER-LEFT: #cccccc 1px solid; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Arial,Verdana; WHITE-SPACE: nowrap; BACKGROUND-COLOR: #efefef +} +.MainBlockContent { + BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px; PADDING-LEFT: 5px; FONT-SIZE: 11px; MARGIN-BOTTOM: 10px; PADDING-BOTTOM: 5px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid +} +.FeatureBlockHeader { + BORDER-RIGHT: #ff9900 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #ff9900 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 13px; PADDING-BOTTOM: 2px; TEXT-TRANSFORM: uppercase; BORDER-LEFT: #ff9900 1px solid; COLOR: #990000; PADDING-TOP: 2px; BORDER-BOTTOM: #ff9900 1px solid; FONT-FAMILY: Arial,Verdana; WHITE-SPACE: nowrap; BACKGROUND-COLOR: #ffe0b3 +} +.FeatureBlockHeader A { + COLOR: #990000 +} +.FeatureBlockContent { + BORDER-RIGHT: #ff9900 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #ff9900 1px; PADDING-LEFT: 5px; FONT-SIZE: 11px; MARGIN-BOTTOM: 10px; PADDING-BOTTOM: 5px; OVERFLOW: hidden; BORDER-LEFT: #ff9900 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #ff9900 1px solid; TEXT-OVERFLOW: ellipsis; BACKGROUND-COLOR: #fffaf2 +} +.ZoneBlockHeader { + FONT-WEIGHT: bold; FONT-SIZE: 16px; MARGIN-LEFT: 0px; BORDER-BOTTOM: #efefef 5px dotted; FONT-FAMILY: Arial,Verdana; WHITE-SPACE: nowrap +} +.ZoneSponsor { + FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #666666 +} +.ZoneSponsor A { + FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #666666 +} +.ZoneList { + MARGIN-TOP: 7px +} +.ZoneBlockHeader A { + COLOR: #000 +} +.ZoneBlockContent { + PADDING-RIGHT: 5px; PADDING-LEFT: 5px; FONT-SIZE: 11px; MARGIN-BOTTOM: 10px; PADDING-BOTTOM: 5px; OVERFLOW: hidden; PADDING-TOP: 5px; TEXT-OVERFLOW: ellipsis +} +.BlockExtraText { + PADDING-LEFT: 20px; FONT-SIZE: 11px; TEXT-TRANSFORM: none +} +.TitleBar { + MARGIN-TOP: 10px; FONT-WEIGHT: bold; FONT-SIZE: 135%; COLOR: #ff9900; TEXT-ALIGN: left +} +.JoinHeader { + BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 13pt; PADDING-BOTTOM: 5px; MARGIN: 5pt; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; WHITE-SPACE: nowrap; BACKGROUND-COLOR: #ffb443 +} +.JoinHeader A { + COLOR: #990000; HEIGHT: 20px +} +.ShopHeader { + BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; FONT-SIZE: 13pt; PADDING-BOTTOM: 5px; MARGIN: 5pt; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; WHITE-SPACE: nowrap; BACKGROUND-COLOR: #76ab40 +} +.ShopHeader A { + FILTER: Shadow(color=#000000,strength=1,direction=135); COLOR: white; HEIGHT: 20px +} +.MemberNavBar { + BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ffcc66 +} +.SiteNavBar TD { + BORDER-RIGHT: #488e00 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #488e00 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: #488e00 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #488e00 1px solid; POSITION: relative; BACKGROUND-COLOR: #488e00 +} +.SiteNavBar A { + BORDER-RIGHT: #488e00 1px solid; PADDING-RIGHT: 1px; BORDER-TOP: #488e00 1px solid; PADDING-LEFT: 1px; FONT-WEIGHT: bold; FONT-SIZE: 12px; PADDING-BOTTOM: 1px; BORDER-LEFT: #488e00 1px solid; COLOR: white; PADDING-TOP: 1px; BORDER-BOTTOM: #488e00 1px solid; HEIGHT: 16px +} +.SiteNavBar A:hover { + PADDING-RIGHT: 1px; PADDING-LEFT: 1px; PADDING-BOTTOM: 1px; COLOR: black; PADDING-TOP: 1px; BACKGROUND-COLOR: #c3de6c; TEXT-DECORATION: none +} +TD.SelCat { + BORDER-LEFT-COLOR: #488e00; BORDER-BOTTOM-COLOR: #488e00; BORDER-TOP-COLOR: #488e00; BACKGROUND-COLOR: #c3de6c; BORDER-RIGHT-COLOR: #488e00 +} +TD.SelCat A { + BORDER-LEFT-COLOR: #c3de6c; BORDER-BOTTOM-COLOR: #c3de6c; COLOR: black; BORDER-TOP-COLOR: #c3de6c; BACKGROUND-COLOR: #c3de6c; BORDER-RIGHT-COLOR: #c3de6c +} +.SearchHeaderBar { + PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; MARGIN: 0px; PADDING-TOP: 3px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #efefef +} +.LHNavBar { + PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; VERTICAL-ALIGN: top; WIDTH: 160px; PADDING-TOP: 3px; BACKGROUND-COLOR: #ff9900 +} +.ContentPane { + PADDING-RIGHT: 5px; PADDING-LEFT: 5px; MIN-HEIGHT: 300px; VERTICAL-ALIGN: top; ; WIDTH: expression(document.body.clientWidth < 973? "813" : document.body.clientWidth-160); POSITION: relative; ; HEIGHT: expression(this.height < 300? "300" : "auto") +} +.ArticlePane { + PADDING-RIGHT: 5px; PADDING-LEFT: 5px; VERTICAL-ALIGN: top; WIDTH: 100%; POSITION: relative +} +.RHFeatureBar { + VERTICAL-ALIGN: top; OVERFLOW: hidden; WIDTH: 160px; max-width: 160 +} +.ArticleHeader { + BORDER-BOTTOM: #cccccc 1px solid +} +.ArticleUneditedHeader { + BORDER-BOTTOM: #cccccc 1px solid +} +.ArticlePurgatoryHeader { + BORDER-BOTTOM: #cccccc 1px solid +} +.ArticleHeader { + BACKGROUND-COLOR: #fbedbb +} +.ArticleUneditedHeader { + BACKGROUND-COLOR: #dce2f5 +} +.ArticlePurgatoryHeader { + BACKGROUND-COLOR: #e2e2e2 +} +.precollapse { + DISPLAY: inline; FONT-WEIGHT: bold; FONT-SIZE: 7pt; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #fbedbb +} +.formButton { + FONT-WEIGHT: 700; FONT-SIZE: 90%; BORDER-LEFT-COLOR: #fbedbb; BORDER-BOTTOM-COLOR: #fbedbb; COLOR: white; BORDER-TOP-COLOR: #fbedbb; BACKGROUND-COLOR: #e08900; BORDER-RIGHT-COLOR: #fbedbb +} +.SmallText { + FONT-SIZE: 8pt +} +.tinyText { + FONT-SIZE: 7pt +} +CAPTION { + FONT-WEIGHT: bold; FONT-SIZE: 8pt; FONT-STYLE: italic +} +.Caption { + FONT-WEIGHT: bold; FONT-SIZE: 8pt; FONT-STYLE: italic +} +.Filename { + FONT-STYLE: italic +} +.Command { + FONT-WEIGHT: bold +} +.Warning { + BORDER-RIGHT: red 2px solid; PADDING-RIGHT: 5px; BORDER-TOP: red 2px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN-LEFT: 20px; BORDER-LEFT: red 2px solid; COLOR: red; MARGIN-RIGHT: 20px; PADDING-TOP: 5px; BORDER-BOTTOM: red 2px solid +} +.Warning P { + COLOR: red +} +.Warning DIV { + COLOR: red +} +.Callout { + BORDER-RIGHT: black thin solid; PADDING-RIGHT: 5px; BORDER-TOP: black thin solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN-LEFT: 20px; BORDER-LEFT: black thin solid; MARGIN-RIGHT: 20px; PADDING-TOP: 5px; BORDER-BOTTOM: black thin solid; BACKGROUND-COLOR: #ffffcc +} +.highlight { + BACKGROUND-COLOR: yellow +} +.emphasis { + COLOR: red +} +.subdue { + COLOR: #666 +} +.ArticleTable { + BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid; BORDER-COLLAPSE: collapse +} +.ArticleTableNoBorder { + BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid; BORDER-COLLAPSE: collapse +} +.ArticleTableNoBorder { + BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none +} +.ArticleTable TH { + PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px +} +.ArticleTableNoBorder TH { + PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px +} +.ArticleTable TH { + BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid +} +.ArticleTable THEAD { + FONT-WEIGHT: bold; BACKGROUND-COLOR: #fbedbb +} +.ArticleTableNoBorder THEAD { + FONT-WEIGHT: bold; BACKGROUND-COLOR: #fbedbb +} +.ArticleTable TFOOT { + FONT-WEIGHT: bold +} +.ArticleTableNoBorder TFOOT { + FONT-WEIGHT: bold +} +.ArticleTable TR.ArticleTableRow { + BACKGROUND-COLOR: #ebf6ff +} +.ArticleTableNoBorder TR.ArticleTableRow { + BACKGROUND-COLOR: #ebf6ff +} +.ArticleTable TR.ArticleTableAltRow { + BACKGROUND-COLOR: #ddf0fe +} +.ArticleTableNoBorder TR.ArticleTableAltRow { + BACKGROUND-COLOR: #ddf0fe +} +.ArticleTable TD { + PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px +} +.ArticleTableNoBorder TD { + PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px +} +.ArticleTable TD { + BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid +} +UL.InfoList { + MARGIN-TOP: 5px; PADDING-LEFT: 15px; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 0px +} +UL.InfoList LI { + PADDING-BOTTOM: 5px +} +UL.download { + MARGIN-LEFT: 1.5em +} +UL.download LI { + PADDING-LEFT: 0.5em; FONT-SIZE: 9pt; LIST-STYLE-IMAGE: url(/images/download.gif); FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif +} +LI.download { + PADDING-LEFT: 0.5em; FONT-SIZE: 9pt; LIST-STYLE-IMAGE: url(/images/download.gif); FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif +} +UL.delegate LI { + LIST-STYLE-IMAGE: url(/images/symbols/delegate.gif) +} +LI.delegate { + LIST-STYLE-IMAGE: url(/images/symbols/delegate.gif) +} +UL.enum LI { + LIST-STYLE-IMAGE: url(/images/symbols/Enum.GIF) +} +LI.enum { + LIST-STYLE-IMAGE: url(/images/symbols/Enum.GIF) +} +UL.event LI { + LIST-STYLE-IMAGE: url(/images/symbols/event.GIF) +} +LI.event { + LIST-STYLE-IMAGE: url(/images/symbols/event.GIF) +} +UL.interface LI { + LIST-STYLE-IMAGE: url(/images/symbols/interface.GIF) +} +LI.interface { + LIST-STYLE-IMAGE: url(/images/symbols/interface.GIF) +} +UL.literal LI { + LIST-STYLE-IMAGE: url(/images/symbols/literal.GIF) +} +LI.literal { + LIST-STYLE-IMAGE: url(/images/symbols/literal.GIF) +} +UL.method LI { + LIST-STYLE-IMAGE: url(/images/symbols/method.GIF) +} +LI.method { + LIST-STYLE-IMAGE: url(/images/symbols/method.GIF) +} +UL.namespace LI { + LIST-STYLE-IMAGE: url(/images/symbols/namespace.GIF) +} +LI.namespace { + LIST-STYLE-IMAGE: url(/images/symbols/namespace.GIF) +} +UL.property LI { + LIST-STYLE-IMAGE: url(/images/symbols/property.GIF) +} +LI.property { + LIST-STYLE-IMAGE: url(/images/symbols/property.GIF) +} +UL.struct LI { + LIST-STYLE-IMAGE: url(/images/symbols/struct.GIF) +} +LI.struct { + LIST-STYLE-IMAGE: url(/images/symbols/struct.GIF) +} +UL.compactlist LI { + FONT-SIZE: 8pt; LIST-STYLE-IMAGE: url(/images/smallarrow.gif); MARGIN-BOTTOM: 0pt; MARGIN-LEFT: -1em; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif +} +LI.compactlist { + FONT-SIZE: 8pt; LIST-STYLE-IMAGE: url(/images/smallarrow.gif); MARGIN-BOTTOM: 0pt; MARGIN-LEFT: -1em; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif +} +UL.compactlist { + MARGIN-TOP: 5pt; MARGIN-BOTTOM: 5pt +} +.ForumSig { + BORDER-TOP: #d0e0f0 1px solid; MARGIN-TOP: 0px; PADDING-TOP: 0px +} +TEXTAREA#ContentText { + BEHAVIOR: url(/styles/lnkutils.htc) +} +.messagecontent { + FONT: 9.5pt Verdana, "Courier New", Courier, mono +} +.Default { + FONT-FAMILY: Verdana, Helvetica, Arial, sans-serif +} +.forum_link:link { + COLOR: #e08900; TEXT-DECORATION: none +} +.forum_link:visited { + COLOR: #e08900; TEXT-DECORATION: none +} +.forum_link:active { + COLOR: #e08900; TEXT-DECORATION: none +} +.forum_link:hover { + COLOR: #e08900; TEXT-DECORATION: underline +} +.forum_hilite { + BACKGROUND-COLOR: yellow +} +.FQ { + PADDING-LEFT: 0.6em; MARGIN-BOTTOM: -1em; MARGIN-LEFT: 0.25em; BORDER-LEFT: gray 0.2em solid; COLOR: #556655; MARGIN-RIGHT: 1em +} +.FQA { + FONT-WEIGHT: bold; FONT-SIZE: 10px; MARGIN-LEFT: -0.25em +} +.cpp-comment { + COLOR: green; FONT-STYLE: italic +} +.cs-comment { + COLOR: green; FONT-STYLE: italic +} +.vb-comment { + COLOR: green; FONT-STYLE: italic +} +.cpp-keyword { + COLOR: blue +} +.cs-keyword { + COLOR: blue +} +.vb-function { + COLOR: blue +} +.cpp-preprocessor { + COLOR: navy +} +.cs-preprocessor { + COLOR: navy +} +.cpp-string { + COLOR: purple +} +.cs-string { + COLOR: purple +} +.vb-string { + COLOR: purple +} +.cpp-literal { + COLOR: midnightblue +} +.cs-literal { + COLOR: midnightblue +} +.vb-literal { + COLOR: midnightblue +} +.cs-clrtype { + COLOR: #339999 +} +.vb-keyword { + FONT-WEIGHT: normal; COLOR: blue +} +.vb-statement { + FONT-WEIGHT: normal; COLOR: blue +} +TABLE#tblButtonBar { + MARGIN-TOP: 1px +} +.clsButton { + BORDER-RIGHT: #ff9900 1px solid; BORDER-TOP: #ff9900 1px solid; FONT-WEIGHT: bold; FONT-SIZE: 8pt; BORDER-LEFT: #ff9900 1px solid; COLOR: #333300; BORDER-BOTTOM: #ff9900 1px solid; BACKGROUND-COLOR: #ff9900; TEXT-DECORATION: none +} +TD.clsButtonBar TABLE.clsButton TD { + PADDING-RIGHT: 1px; PADDING-LEFT: 1px; PADDING-BOTTOM: 1px; PADDING-TOP: 1px +} +.clsButtonLnk { + PADDING-RIGHT: 1px; PADDING-LEFT: 1px; FONT-WEIGHT: bold; FONT-SIZE: 8pt; PADDING-BOTTOM: 1px; COLOR: #333300; PADDING-TOP: 1px; TEXT-DECORATION: none +} +.clsButtonLnk:hover { + COLOR: blue +} +.Headline { + FONT-WEIGHT: bold; FONT-SIZE: 13px; MARGIN-BOTTOM: 5px! important; COLOR: black +} +.sidebar { + FONT-WEIGHT: bold; FONT-SIZE: 9pt; COLOR: #ffffff; TEXT-DECORATION: none +} +.navbar { + FONT-WEIGHT: bold; FONT-SIZE: 8pt; COLOR: white; TEXT-DECORATION: none +} +BUTTON.toolbar { + BORDER-RIGHT: white 1px solid; BORDER-TOP: white 1px solid; FONT-SIZE: 9pt; BORDER-LEFT: white 1px solid; BORDER-BOTTOM: white 1px solid; FONT-FAMILY: Verdana, Arial, Tahoma, "MS Sans Serif", sans-serif; BACKGROUND-COLOR: white +} +DIV.toolbar { + PADDING-RIGHT: 2px; PADDING-LEFT: 2px; BORDER-LEFT-COLOR: #ff9900; BORDER-BOTTOM-COLOR: #ff9900; PADDING-BOTTOM: 2px; BORDER-TOP-COLOR: #ff9900; PADDING-TOP: 1px; BACKGROUND-COLOR: white; BORDER-RIGHT-COLOR: #ff9900 +} +.navbar:hover { + COLOR: blue +} +.navbar:active { + COLOR: red +} +.NavMenuItem:hover { + COLOR: blue +} +.NavMenuItem:active { + COLOR: red +} +.AdLink { + FONT-SIZE: 8pt; COLOR: black +} +A .AdLink { + FONT-SIZE: 8pt; COLOR: black +} +.infobar { + FONT-SIZE: 8pt; MARGIN-LEFT: 0pt; TEXT-INDENT: 0pt +} +.infobarList { + FONT-SIZE: 8pt; MARGIN-LEFT: 1.5em; TEXT-INDENT: -1.5em +} +.InfobarHeader { + FONT-WEIGHT: bold; FONT-SIZE: 9pt; MARGIN-BOTTOM: -10px; COLOR: #ab2600 +} +.HoverLink { + BORDER-RIGHT: #fbedbb 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #fbedbb 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 8pt; PADDING-BOTTOM: 1px; BORDER-LEFT: #fbedbb 1px solid; PADDING-TOP: 1px; BORDER-BOTTOM: #fbedbb 1px solid; BACKGROUND-COLOR: #fbedbb; TEXT-DECORATION: none +} +A.HoverLink { + COLOR: blue; TEXT-DECORATION: none +} +A.HoverLink:hover { + BORDER-LEFT-COLOR: #ff9900; BORDER-BOTTOM-COLOR: #ff9900; BORDER-TOP-COLOR: #ff9900; BACKGROUND-COLOR: #ffcc99; BORDER-RIGHT-COLOR: #ff9900 +} +A.HoverLink:active { + BORDER-LEFT-COLOR: #ff9900; BORDER-BOTTOM-COLOR: #ff9900; BORDER-TOP-COLOR: #ff9900; BACKGROUND-COLOR: #ffc082; BORDER-RIGHT-COLOR: #ff9900 +} +.links { + FONT-SIZE: 8pt +} +.messagetitle { + FONT-SIZE: 8pt +} +.SiteNewsHeading { + FONT-SIZE: 8pt +} +.FeatureBox { + BORDER-RIGHT: #6699cc 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #6699cc 1px solid; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; BORDER-LEFT: #6699cc 1px solid; PADDING-TOP: 2px; BORDER-BOTTOM: #6699cc 1px solid; BACKGROUND-COLOR: #a5c9ef +} +.FeatureBoxHeader { + PADDING-LEFT: 2pt; FONT-WEIGHT: bold; FONT-SIZE: 13pt; PADDING-BOTTOM: 2pt; COLOR: #993300; FONT-FAMILY: Verdana +} +.FeatureBoxHeader A { + PADDING-LEFT: 2pt; FONT-WEIGHT: bold; FONT-SIZE: 13pt; PADDING-BOTTOM: 2pt; COLOR: #993300; FONT-FAMILY: Verdana +} +.FeatureBoxHeaderArrow { + BACKGROUND-COLOR: #6699cc +} diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/ind.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/ind.gif new file mode 100755 index 0000000000000000000000000000000000000000..043366b156d5b2880555e95762e717b93e18c4ac GIT binary patch literal 824 zcmZ?wbhEHbotcS=!5RQoWD-08 literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/link.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/link.gif new file mode 100755 index 0000000000000000000000000000000000000000..51bd9ff0c0ef514a4cfc4c34a3bf9c976555da5e GIT binary patch literal 83 zcmZ?wbhEHb6krfwn8?8JZ;itLnG6u1_>+ZI1jy6@aY6D7Oe!t?E7kUD`ql6p*}3kn e|Lc9VktcfPN|U_0CTWFCP4t$wTum%8M;}^mJ literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/mail.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/mail.gif new file mode 100755 index 0000000000000000000000000000000000000000..49d3bfbf189c8a18f2dca5e2b88d72a54e5cedde GIT binary patch literal 88 zcmZ?wbhEHb6krfwn8?8J9|&eLK!D;;7FH1kMg|=a7bMTXq}kKI@^mfJ;yI2D-Ns^~ j9=w%vr?t*;os@2wn;f<8-t$ETwofM>{{AnJfx#L8DN`Ke literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/mail_small.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/mail_small.gif new file mode 100755 index 0000000000000000000000000000000000000000..42a431e1c0acefe2999b48a13f57fc87d1777c57 GIT binary patch literal 161 zcmZ?wbhEHbb=`uoaNSa*Jxw=(8^Gd;o>>9QK03>L%&rD46XuO)Hn|;2)>$S?z!>#Z`JPh lWRVqj*3Poax~QO9v2vy3K?l9*hYwAul0CBHelrJyH2^Q`H5~u| literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/menu10_com.js b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/menu10_com.js new file mode 100755 index 00000000..87dfbc51 --- /dev/null +++ b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/menu10_com.js @@ -0,0 +1,386 @@ +/*********************************************** +* (c) Ger Versluis 2000 version 13.11 April 13, 2005 * +* You may use this script on non commercial sites. * +* www.burmees.nl/menu * +************************************************/ + +if(document.getElementById){ + var AgntUsr=navigator.userAgent.toLowerCase(),AppVer=navigator.appVersion.toLowerCase(), + Opr7=AgntUsr.indexOf("opera")!=-1&&parseInt(AgntUsr.substring(AgntUsr.indexOf("opera")+6))>6?true:false; + if((AgntUsr.indexOf("opera")==-1||Opr7)){ + var NavYes=((AgntUsr.indexOf("mozilla")!=-1&&AgntUsr.indexOf("compatible")==-1)||Opr7)?true:false,ExpYes=(AgntUsr.indexOf("msie")!=-1&&!Opr7)? true:false; + if(MenuUsesFrames&&!parent.frames[0])MenuUsesFrames=0; + var Exp6Plus=((AppVer.indexOf("msie 6")!=-1||AppVer.indexOf("msie 7")!=-1)&&!Opr7)?true:false,MacExp5=(AppVer.indexOf("mac")!=-1&&AppVer.indexOf("msie 5")!=-1)?true:false, + FLoc,ScLoc,DcLoc,SLdAgnWin,FWinH,FColW,SColW,DColW,SWinW,SWinH,FWinW,RLvl=0,FntFc=1,StaticPos=0,Ztop=100,FrstCreat=true,Ldd=false, + Crtd=false,FCmplnt=false,SCmplnt=false,M_Clckd=false,IniFlg=false,ShwFlg=false,AcrssFrms=true,FrstCntnr=null,CurOvr=null,FHtml=null,ScHtml=null, + CloseTmr=null,OpnTmr=null,RmbrNow=null,FStr="",M_Hide="hidden",M_Show="visible",P_X="px",M_StrtTp=StartTop,M_StrtLft=StartLeft, + Par=MenuUsesFrames?parent:window,Doc=Par.document,Bod=Doc.body,Trigger=NavYes?Par:Bod, + Nav_Op=NavYes&&AgntUsr.indexOf("gecko/")!=-1&&AgntUsr.indexOf("mac")==-1&&parseInt(AgntUsr.substring(AgntUsr.indexOf("gecko/")+6,AgntUsr.indexOf("gecko/")+12))>=200303?true:false, + InitLdd,MstSz=0;LdTmr=setInterval("ChckInitLd()",100)}} + +function ChckInitLd(){ + InitLdd=ExpYes? + MenuUsesFrames?Par.frames[FirstLineFrame].document.readyState=="complete"&&Par.frames[SecLineFrame].document.readyState=="complete"? + 1:0:Par.document.readyState=="complete"? + 1:0:MenuUsesFrames?Par.frames[FirstLineFrame].document.body&&Par.frames[SecLineFrame].document.body?1:0:Par.document.body?1:0; + if(InitLdd) {clearInterval(LdTmr);Go()}} + +function CnclSlct(){return false} + +function RePos(){ + FWinW=ExpYes?FCmplnt?FHtml.clientWidth:FLoc.document.body.clientWidth:FLoc.innerWidth; + FWinH=ExpYes?FCmplnt?FHtml.clientHeight:FLoc.document.body.clientHeight:FLoc.innerHeight; + SWinW=ExpYes?SCmplnt?ScHtml.clientWidth:ScLoc.document.body.clientWidth:ScLoc.innerWidth; + SWinH=ExpYes?SCmplnt?ScHtml.clientHeight:ScLoc.document.body.clientHeight:ScLoc.innerHeight; + if(MstSz)SizeMenu(FrstCntnr); + StaticPos=-1; + ClcRl();if(TargetLoc)ClcTrgt();ClcLft();ClcTp(); + PosMenu(FrstCntnr,StartTop,StartLeft); + if(RememberStatus)StMnu()} + +function UnLdd(){ + Ldd=Crtd=false; + SetMenu="0"; + var M=FrstCntnr?FrstCntnr.FrstMbr:null; + if(ExpYes){while(M!=null){if(M.CCn){MakeNull(M.CCn);M.CCn=null}M=M.PrvMbr}} + LdTmr=setInterval("ChckLdd()",100)} + +function UnLddTotal(){ + MakeNull(FrstCntnr); + FrstCntnr=RmbrNow=FLoc=ScLoc=DcLoc=SLdAgnWin=CurOvr=CloseTmr=Doc=Bod=Trigger=null} + +function MakeNull(P){ + var M=P.FrstMbr,Mi; + while(M!=null){Mi=M;if(M.CCn){MakeNull(M.CCn);M.CCn.mif=null;M.CCn=null}M=M.PrvMbr;Mi.PrvMbr=null;Mi=null} + P.FrstMbr=null} + +function ChckLdd(){if(!ExpYes){ + if(ScLoc.document.body){clearInterval(LdTmr);Go()}} + else if(ScLoc.document.readyState=="complete"){if(LdTmr)clearInterval(LdTmr);Go()}} + +function Go(){ + if(!Ldd){ Crtd=false;Ldd=true; + BeforeStart(); + if(ScaleMenu){ + if(document.defaultView&&document.defaultView.getComputedStyle)FntFc=parseInt(document.defaultView.getComputedStyle(document.body,'').getPropertyValue("font-size"))/16; + else if(ExpYes&&document.body.currentStyle)FntFc=parseInt(document.body.currentStyle.fontSize)/12} + status="Building menu"; + FLoc=MenuUsesFrames?parent.frames[FirstLineFrame]:window; + ScLoc=MenuUsesFrames?parent.frames[SecLineFrame]:window; + DcLoc=MenuUsesFrames?parent.frames[DocTargetFrame]:window; + if(MenuUsesFrames){if(!FLoc)FLoc=window;if(!ScLoc)ScLoc=window;if(!DcLoc)DcLoc=window} + if(FLoc==ScLoc)AcrssFrms=false; + if(AcrssFrms)FirstLineHorizontal=MenuFramesVertical?0:FirstLineHorizontal?FirstLineHorizontal:1; + if(Exp6Plus||Opr7){ + FHtml=FLoc.document.getElementsByTagName("HTML")[0];ScHtml=ScLoc.document.getElementsByTagName("HTML")[0]; + FCmplnt=FLoc.document.compatMode.indexOf("CSS")==-1?false:true;SCmplnt=ScLoc.document.compatMode.indexOf("CSS")==-1?false:true} + FWinW=ExpYes?FCmplnt?FHtml.clientWidth:FLoc.document.body.clientWidth:FLoc.innerWidth; + FWinH=ExpYes?FCmplnt?FHtml.clientHeight:FLoc.document.body.clientHeight:FLoc.innerHeight; + SWinW=ExpYes?SCmplnt?ScHtml.clientWidth:ScLoc.document.body.clientWidth:ScLoc.innerWidth; + SWinH=ExpYes?SCmplnt?ScHtml.clientHeight:ScLoc.document.body.clientHeight:ScLoc.innerHeight; + FColW=FLoc.document.body;SColW=ScLoc.document.body;DColW=ScLoc.document.body; + if(TakeOverBgColor)FColW.style.backgroundColor=AcrssFrms?SColW.bgColor:DColW.bgColor; + if(FrstCreat||FLoc==ScLoc)FrstCntnr=CreateMenuStructure("Menu",NoOffFirstLineMenus,null); + else CreateMenuStructureAgain("Menu",NoOffFirstLineMenus); + SizeMenu(FrstCntnr); + ClcRl();if(TargetLoc)ClcTrgt();ClcLft();ClcTp(); + PosMenu(FrstCntnr,StartTop,StartLeft); + Crtd=true; + SLdAgnWin=ExpYes?ScLoc.document.body:ScLoc;SLdAgnWin.onunload=UnLdd; + if(ExpYes)Trigger.onunload=UnLddTotal; + Trigger.onresize=RePos; + AfterBuild(); + if(RememberStatus)StMnu(); + FrstCreat=false; + if(MenuVerticalCentered=="static"&&!AcrssFrms)setInterval("KeepPos()",50); + if(!ExpYes){FWinW=-1;RePos()} + IniFlg=true;Initiate(); + status="Menu ready for use"}} + +function KeepPos(){ + var TS=ExpYes?SCmplnt?ScHtml.scrollTop:ScLoc.document.body.scrollTop:ScLoc.pageYOffset; + if(TS!=StaticPos){ + StaticPos+=(TS-StaticPos)*.2; + if(Math.abs(StaticPos-TS)<=1)StaticPos=TS; + FrstCntnr.OrgTop=StartTop+StaticPos; + FrstCntnr.style.top=FrstCntnr.mif.style.top=FrstCntnr.OrgTop+P_X}} + +function ClcRl(){StartTop=M_StrtTp<1&&M_StrtTp>0?M_StrtTp*FWinH:M_StrtTp;StartLeft=M_StrtLft<1&&M_StrtLft>0?M_StrtLft*FWinW:M_StrtLft} + +function ClcTrgt(){ + var TLoc=FLoc.document.getElementById(TargetLoc); + while(TLoc){StartTop+=TLoc.offsetTop;StartLeft+=TLoc.offsetLeft;TLoc=TLoc.offsetParent}} + +function ClcLft(){ + if(MenuCentered.indexOf("left")==-1){ + var Sz=FWinW-parseInt(FrstCntnr.style.width); + StartLeft+=MenuCentered.indexOf("right")!=-1?Sz:Sz/2;if(StartLeft<0)StartLeft=0}} + +function ClcTp(){ + if(MenuVerticalCentered!="top"&&MenuVerticalCentered!="static"){ + var Sz=FWinH-parseInt(FrstCntnr.style.height); + StartTop+=MenuVerticalCentered=="bottom"?Sz:Sz/2;if(StartTop<0)StartTop=0}} + +function SizeMenu(C){ + var Cmplnt=C.Lvl==1?FCmplnt:SCmplnt,M=C.FrstMbr,Mi,i,W=0,H=0,Wd,Ht,RI,BRW=C.Lvl==1?BorderWidthMain:BorderWidthSub,BTWn=C.Lvl==1?BorderBtwnMain:BorderBtwnSub; + if(C.Lvl<=FirstLineHorizontal){ + while(M!=null){W+=Math.round((M.Arr[5]<1?(M.Arr[5]*(M.Lvl==1?FWinW:SWinW)):(M.Arr[5]*FntFc)));Mi=M;M=M.PrvMbr} + W+=((C.NrItms-1)*BTWn+2*BRW); + Ht=H=Math.round((Mi.Arr[4]<1?(Mi.Arr[4]*(Mi.Lvl==1?FWinH:SWinH)):(Mi.Arr[4]*FntFc)));H+=(2*BRW)} + else { while(M!=null){H+=Math.round((M.Arr[4]<1?(M.Arr[4]*(M.Lvl==1?FWinH:SWinH)):(M.Arr[4]*FntFc)));Mi=M;M=M.PrvMbr} + H+=((C.NrItms-1)*BTWn+2*BRW); + Wd=W=Math.round((Mi.Arr[5]<1?(Mi.Arr[5]*(Mi.Lvl==1?FWinW:SWinW)):(Mi.Arr[5]*FntFc)));W+=(2*BRW)} + C.style.width=C.mif.style.width=W+P_X;C.style.height=C.mif.style.height=H+P_X; + M=C.FrstMbr; + while(M!=null){ + if(M.Arr[5]<1){W=C.Lvl<=FirstLineHorizontal?(M.Arr[5]*(M.Lvl==1?FWinW:SWinW)):Wd;MstSz=1} + else W=(C.Lvl<=FirstLineHorizontal?M.Arr[5]:Wd)*FntFc; + if(M.Arr[4]<1){H=C.Lvl<=FirstLineHorizontal?Ht:(M.Arr[4]*(M.Lvl==1?FWinH:SWinH));MstSz=1} + else H=(C.Lvl<=FirstLineHorizontal?Ht:M.Arr[4])*FntFc; + W=Math.round(W);H=Math.round(H); + if(M.value.indexOf("<")==-1){ + M.tpd=TopPaddng<0?(Math.round(H*.5-M.Arr[12]*FntFc)):TopPaddng;if(M.tpd<0||M.tpd>H)M.tpd=0; + M.ltp=LeftPaddng;if(M.ltp<0||M.ltp>W)M.ltp=0; + if((NavYes&&!Opr7)||MacExp5||Cmplnt){M.lx=M.ltp;M.tx=M.tpd}} + M.style.width=W-M.lx+P_X;M.style.height=H-M.tx+P_X; + M.style.paddingLeft=M.ltp+P_X;M.style.paddingTop=M.tpd+P_X; + if(M.ro){RI=(M.Lvl==1?FLoc:ScLoc).document.images[M.rid];RI.style.width=W+P_X;RI.style.height=H+P_X} + if(M.CCn)SizeMenu(M.CCn); + M=M.PrvMbr}} + +function PosMenu(Ct,Tp,Lt){ + RLvl++; + var a,Mb=Ct.FrstMbr,MWt=parseInt(Mb.style.width)+Mb.lx, + MHt=parseInt(Mb.style.height)+Mb.tx,CWt=parseInt(Ct.style.width),CHt=parseInt(Ct.style.height),CCw,CCh,STp,SLt,Ti,Li,Hi, + BRW=RLvl==1?BorderWidthMain:BorderWidthSub,BTWn=RLvl==1?BorderBtwnMain:BorderBtwnSub; + if(RLvl==1&&AcrssFrms)!MenuFramesVertical?Tp=BottomUp?DistFrmFrameBrdr:FWinH-CHt-DistFrmFrameBrdr:Lt=RightToLeft?DistFrmFrameBrdr:FWinW-CWt-DistFrmFrameBrdr; + if(RLvl==2&&AcrssFrms)!MenuFramesVertical?Tp=BottomUp?SWinH-CHt:0:Lt=RightToLeft?SWinW-CWt:0; + if(RLvl==2){Tp+=VerCorrect;Lt+=HorCorrect} + Ct.style.top=Ct.mif.style.top=RLvl==1?Tp+P_X:0;Ct.OrgTop=Tp; + Ct.style.left=Ct.mif.style.left=RLvl==1?Lt+P_X:0;Ct.OrgLeft=Lt; + if(RLvl<=FirstLineHorizontal){Hi=1;Li=CWt-MWt-2*BRW;Ti=0} + else{Hi=Li=0;Ti=CHt-MHt-2*BRW} + while(Mb!=null){ + Mb.style.left=Li+BRW+P_X;Mb.style.top=Ti+BRW+P_X; + if(Mb.CCn){ + if(RightToLeft)CCw=parseInt(Mb.CCn.style.width); + if(BottomUp)CCh=parseInt(Mb.CCn.style.height); + if(Hi){STp=BottomUp?Ti-CCh:Ti+MHt+2*BRW;SLt=RightToLeft?Li+MWt-CCw:Li} + else{ SLt=RightToLeft?Li-CCw+ChildOverlap*MWt+BRW:Li+(1-ChildOverlap)*MWt+BRW; + STp=RLvl==1&&AcrssFrms?BottomUp?Ti-CCh+MHt:Ti:BottomUp?Ti-CCh+(1-ChildVerticalOverlap)*MHt+2*BRW:Ti+ChildVerticalOverlap*MHt} + PosMenu(Mb.CCn,STp,SLt)} + a=RLvl<=FirstLineHorizontal?BottomUp?9:3:RightToLeft?6:0; + if(Mb.ai){ Mb.ai.style.top=(RLvl<=FirstLineHorizontal?BottomUp?2:MHt-Arrws[a+2]-2:(MHt-Arrws[a+2])/2)+P_X;Mb.ai.style.left=(RightToLeft?2:MWt-Arrws[a+1]-2)+P_X} + Mb=Mb.PrvMbr; + if(Mb){MWt=parseInt(Mb.style.width)+Mb.lx;MHt=parseInt(Mb.style.height)+Mb.tx;Hi?Li-=MWt+BTWn:Ti-=MHt+BTWn}} + RLvl--} + +function StMnu(){ + if(Crtd){ var i,Pntr=FrstCntnr,Str=ScLoc.SetMenu?ScLoc.SetMenu:"0"; + while(Str.indexOf("_")!=-1&&RememberStatus==1){ + i=Pntr.NrItms-parseInt(Str.substring(0,Str.indexOf("_")));Str=Str.slice(Str.indexOf("_")+1); + Pntr=Pntr.FrstMbr;for(i;i;i--)Pntr=Pntr.PrvMbr;Pntr.OM();Pntr=Pntr.CCn} + i=Pntr.NrItms-parseInt(Str);Pntr=Pntr.FrstMbr; + for(i;i;i--) Pntr=Pntr.PrvMbr; + if(RmbrNow!=null){SetItem(RmbrNow,0);RmbrNow.Clckd=0} + if(Pntr!=null){SetItem(Pntr,1);Pntr.Clckd=1;if(RememberStatus==1)Pntr.OM()} + RmbrNow=Pntr; + ClrAllChlds(FrstCntnr.FrstMbr); + Rmbr(FrstCntnr)}} + +function Initiate(){ + if(IniFlg&&Ldd){ + Init(FrstCntnr);IniFlg=false;if(RememberStatus)Rmbr(FrstCntnr); + if(ShwFlg)AfterCloseAll();ShwFlg=M_Clckd=false}} + +function Rmbr(CntPtr){ + var Mbr=CntPtr.FrstMbr,St; + while(Mbr!=null){ + if(Mbr.DoRmbr){ + HiliteItem(Mbr);if(Mbr.CCn&&RememberStatus==1){St=Mbr.CCn.style;St.visibility=M_Show;Rmbr(Mbr.CCn)}break} + else Mbr=Mbr.PrvMbr}} + +function Init(CPt){ + var Mb=CPt.FrstMbr; + RLvl++; + CPt.style.visibility=CPt.mif.style.visibility=RLvl==1?M_Show:M_Hide; + CPt.Shw=RLvl==1?1:0; + while(Mb!=null){if(Mb.Hilite)LowItem(Mb);if(Mb.CCn)Init(Mb.CCn);Mb=Mb.PrvMbr} + RLvl--} + +function ClrAllChlds(Pt){ + var PSt,Pc; + while(Pt){ + if(Pt.Hilite){ + Pc=Pt;if(Pc!=CurOvr)LowItem(Pt); + if(Pt.CCn) {PSt=Pt.CCn.style;if(Pc!=CurOvr){PSt.visibility=Pt.CCn.mif.style.visibility=M_Hide;Pt.CCn.Shw=0}ClrAllChlds(Pt.CCn.FrstMbr)} + break} + Pt=Pt.PrvMbr}} + +function SetItem(Pntr,x){while(Pntr!=null){Pntr.DoRmbr=x;Pntr=Pntr.Ctnr.Cllr}} + +function GoTo(){ + if(UnfoldsOnClick&&!M_Clckd&&this.Arr[3]){M_Clckd=true;OpenMenuII(this)} + else if(this.Arr[1]){ + status="";LowItem(this);IniFlg=true;Initiate(); + if(this.Arr[1].indexOf("javascript:")!=-1)eval(this.Arr[1]); + else if(DcLoc.location.href!=BaseHref+this.Arr[1])DcLoc.location.href=BaseHref+this.Arr[1]}} + +function HiliteItem(P){ + if(P.rob)P.style.backgroundImage="url(\""+P.rib2+"\")"; + if(P.ro){var Lc=P.Lvl==1?FLoc:ScLoc;Lc.document.images[P.rid].src=P.ri2} + else{ if(P.Arr[7])P.style.backgroundColor=P.Arr[7];if(P.Arr[9])P.style.color=P.Arr[9]; + if(HoverBold)P.style.fontWeight="bold";if(HoverItalic)P.style.fontStyle="italic"; + if(HoverUnderLine)P.style.textDecoration="underline"; + if(HoverTextSize)P.style.fontSize=parseInt(P.style.fontSize)+HoverTextSize+P_X; + if(HoverVariant)P.style.fontVariant="small-caps"} + if(HoverBorder){P.style.borderColor=HoverBorderColor;P.style.borderWidth=BorderWidthHover;P.style.borderStyle='solid';} + P.Hilite=1} + +function LowItem(P){ + P.Hilite=0; + if(P.rob)P.style.backgroundImage="url(\""+P.rib1+"\")"; + if(P.ro){var Lc=P.Lvl==1?FLoc:ScLoc;Lc.document.images[P.rid].src=P.ri1} + else{ if(P.Arr[6])P.style.backgroundColor=P.Arr[6];if(P.Arr[8])P.style.color=P.Arr[8]; + if(HoverBold)P.style.fontWeight="normal";if(HoverItalic)P.style.fontStyle="normal"; + if(HoverUnderLine)P.style.textDecoration="none"; + if(HoverTextSize)P.style.fontSize=parseInt(P.style.fontSize)-HoverTextSize+P_X; + if(HoverVariant)P.style.fontVariant="normal"} + if(HoverBorder){P.style.borderColor=P.style.backgroundColor;P.style.borderWidth=0;P.style.borderStyle='none';} + } + +function OpenMenu(){ + if(Ldd&&Crtd){ + if(UnfoldsOnClick&&!M_Clckd){CurOvr=this;IniFlg=false;ClrAllChlds(this.Ctnr.FrstMbr);HiliteItem(this);status=this.Arr[16]} + else OpenMenuII(this)}} + +function OpenMenuII(Ptr){ + if(OpnTmr)clearTimeout(OpnTmr); + if(Ptr.Arr[3]&&!Ptr.CCn){ + RLvl=Ptr.Lvl; + Ptr.CCn=CreateMenuStructure(Ptr.MN+"_",Ptr.Arr[3],Ptr); + SizeMenu(Ptr.CCn); + var Ti,Li,Hi,CCw,CCh,STp,SLt, + MWt=parseInt(Ptr.style.width)+Ptr.lx,MHt=parseInt(Ptr.style.height)+Ptr.tx,BRW=RLvl==1?BorderWidthMain:BorderWidthSub; + if(RightToLeft)CCw=parseInt(Ptr.CCn.style.width); + if(BottomUp)CCh=parseInt(Ptr.CCn.style.height); + if(RLvl<=FirstLineHorizontal){Hi=1;Li=parseInt(Ptr.style.left)-BRW;Ti=0} + else{Hi=Li=0;Ti=parseInt(Ptr.style.top)-BRW} + if(Hi){STp=BottomUp?Ti-CCh:Ti+MHt+2*BRW;SLt=RightToLeft?Li+MWt-CCw:Li} + else{ SLt=RightToLeft?Li-CCw+ChildOverlap*MWt+BRW:Li+(1-ChildOverlap)*MWt; + STp=RLvl==1&&AcrssFrms?BottomUp?Ti-CCh+MHt:Ti:BottomUp?Ti-CCh+(1-ChildVerticalOverlap)*MHt+2*BRW:Ti+ChildVerticalOverlap*MHt+BRW} + PosMenu(Ptr.CCn,STp,SLt); + RLvl=0} + CurOvr=Ptr; + IniFlg=false;ClrAllChlds(Ptr.Ctnr.FrstMbr); + if(!Ptr.Hilite)HiliteItem(Ptr); + //if(Exp6Plus){FStr="";if(MenuShadow)FStr+=MenuShadow;if(FStr!="")Ptr.filter=FStr} + if(Ptr.CCn!=null&&!Ptr.CCn.Shw)RememberStatus?Unfld():OpnTmr=setTimeout("Unfld()",UnfoldDelay); + status=Ptr.Arr[16]} + +function Unfld(){ + var P=CurOvr,CSt=P.Ctnr.style,CCnt=P.CCn,CCSt=CCnt.style,CCmSt=CCnt.mif.style, + THt=parseInt(P.style.height),TWt=parseInt(P.style.width),TLt=AcrssFrms&&P.Lvl==1&&!FirstLineHorizontal?0:parseInt(CSt.left), + TTp=AcrssFrms&&P.Lvl==1&&FirstLineHorizontal?0:parseInt(CSt.top),CCW=parseInt(CCSt.width),CCH=parseInt(CCSt.height), + TS=ExpYes?SCmplnt?ScHtml.scrollTop:ScLoc.document.body.scrollTop:ScLoc.pageYOffset, + LS=ExpYes?SCmplnt?ScHtml.scrollLeft:ScLoc.document.body.scrollLeft:ScLoc.pageXOffset, + SLt=AcrssFrms&&P.Lvl==1?CCnt.OrgLeft+TLt+LS:CCnt.OrgLeft+TLt, STp=AcrssFrms&&P.Lvl==1? CCnt.OrgTop+TTp+TS:CCnt.OrgTop+TTp; + if(!ShwFlg){ShwFlg=true;BeforeFirstOpen()} + if(MenuWrap){ + if(RightToLeft){if(SLtSWinW+LS)SLt=SWinW+LS-CCW} + else{if(SLt+CCW>SWinW+LS)SLt=P.Lvl==1?SWinW+LS-CCW:SLt-(CCW+(1-2*ChildOverlap)*TWt);if(SLtSWinH+TS)STp=SWinH+TS-CCH+0} + else{if(STp+CCH>TS+SWinH)STp=P.Lvl==1?STp=TS+SWinH-CCH:STp-CCH+(1-2*ChildVerticalOverlap)*THt;if(STp"} + this.value=Tfld; + if(!this.Arr[6])this.Arr[6]=LowBgColor;if(this.Arr[6]&&!this.ro)this.style.backgroundColor=this.Arr[6]; + if(!this.Arr[7])this.Arr[7]=HighBgColor; + if(!this.Arr[8])this.Arr[8]=FontLowColor;this.style.color=this.Arr[8]; + if(!this.Arr[9])this.Arr[9]=FontHighColor; + if(!this.Arr[11])this.Arr[11]=FontFamily;this.style.fontFamily=this.Arr[11]; + if(this.Arr[12]==-1)this.Arr[12]=FontSize;this.style.fontSize=this.Arr[12]*(NavYes?1:FntFc)+"px"; + if(this.Arr[13]==-1)this.Arr[13]=FontBold;this.style.fontWeight=this.Arr[13]?"bold":"normal"; + if(this.Arr[14]==-1)this.Arr[14]=FontItalic;this.style.fontStyle=this.Arr[14]?"italic":"normal"; + if(!this.Arr[15])this.Arr[15]=MenuTextCentered;this.style.textAlign=this.Arr[15]; + if(!this.Arr[16])this.Arr[16]=this.Arr[1]; + if(ta2){ if(ta2.indexOf("rollover")==-1)this.style.backgroundImage="url(\""+ta2+"\")"; + else{ this.rob=1;this.rib1=ta2.substring(ta2.indexOf("?")+1,ta2.lastIndexOf("?"));this.rib2=ta2.substring(ta2.lastIndexOf("?")+1,ta2.length); + this.style.backgroundImage="url(\""+this.rib1+"\")"; + this.style.backgroundRepeat="no-repeat"; + this.style.backgroundPosition=BgImgLeftOffset+"px"}} + if(Tfld.indexOf("<")==-1){t=Lctn.document.createTextNode(Tfld);this.appendChild(t)} + else this.innerHTML=Tfld; + if(this.Arr[3]){ + a=RLvl<=FirstLineHorizontal?BottomUp?9:3:RightToLeft?6:0; + if(Arrws[a]){ + t=Lctn.document.createElement("img");this.appendChild(t); + t.style.position="absolute";t.src=Arrws[a];t.style.width=Arrws[a+1]*FntFc+P_X;t.style.height=Arrws[a+2]*FntFc+P_X;this.ai=t}} + if(ExpYes){this.onselectstart=CnclSlct;this.onmouseover=OpenMenu;this.onmouseout=CloseMenu;this.onclick=GoTo} + else{this.addEventListener("mouseover",OpenMenu,false); this.addEventListener("mouseout",CloseMenu,false); + this.addEventListener("click",GoTo,false)} +} + +function CreateMenuStructure(MNm,No,Mcllr){ + RLvl++; + var i,Mbr,PMb=null,WMnu=MNm+"1",MWd=eval(WMnu+"[5]")*FntFc,MHt=eval(WMnu+"[4]")*FntFc, + Lctn=RLvl==1?FLoc:ScLoc,MbC=Lctn.document.createElement("div"),MIF=!ExpYes||MacExp5||!OverFormElements?MbC:Lctn.document.createElement("iframe"); + Lctn.document.body.appendChild(MbC); + if(ExpYes&&!MacExp5&&OverFormElements){MIF.src="http://www.codeproject.com/script/HVMenu/blank.html";Lctn.document.body.appendChild(MIF)} + MbC.style.position=MIF.style.position="absolute"; + MbC.style.visibility=MIF.style.visibility=M_Hide; + MbC.mif=MIF; + MbC.SetUp=CntnrSetUp;MbC.SetUp(No,MNm+"1",Mcllr,(MNm=="Menu")); + for(i=1;i0;i--){WMnu=MNm+eval(i);if(Mbr.Arr[3])Mbr.CCn=CreateMenuStructure(WMnu+"_",Mbr.Arr[3],Mbr);Mbr=Mbr.PrvMbr}RLvl--} + else{while(Mbr){Mbr.CCn=null;Mbr=Mbr.PrvMbr}}} \ No newline at end of file diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_answer.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_answer.gif new file mode 100755 index 0000000000000000000000000000000000000000..67eabf18703bfc6fa79fea787532a8a0c0457556 GIT binary patch literal 955 zcmZ?wbhEHb6krfw_|5>L~%oSd9oTwL7T+&nxy zyu7@8e0==;`~m_3f`WoVLPEmA!XhFfqN1W=Vq)Ur;t~=Pl9G~AQc}{=(lRnKva+&r za&q$W@(KzHii(O#N=nMg$|@=KYmvnwpwgT3XuL+B!Nqy1Kf0dV2c$ z`UVCDhK7blMn=ZQ#wI2vrlzK5W@hH*<`xzfmX?-QR#w*5);2aawzjr*c6Rpm_6`mX zj*gB_PEO9w&Mq!4uCA_bZf@@G?j9Zm-2oPTZUz%4q9HX^S!9}wz%()5=|Wu7`8cL?v(4aSox#pBgN=Cx z3lj)2GtOXQoWaOEgNuEJIL{0X;TevyGn18PR%y+gq(5`9@yyL;GY?wLJY_TUyxq*p z4l{2!&b;M3>xSFxD_*lN_|H8RGVe&l{QWTtcE&B(mbh?J%EEPNi&mvCT$!<8dDgsT z*>jiX&RUi?V|n3}l_e9`l=ZEv=viOcwXv#m6Buo-?$})22}WI8s=K$<^zN*iysvKZ zp}J|u>t~*Bn0>Bc&V|N#mm23^29iy4FSg9S&_36-=`WivecpKO^X40$w%+=@?e^y# zcR%mC_j%9#FZ&*RIr#9)k;h+8KK**;*|&4gzg>9o{nE?tS6~0Q@#e>!cRwF~`1SPD z?-yTwzyA9B-M2p+j{qL`*r`!4OuW1ud_FEJ2e$j#We+Hd0mXqck&phzQb&AKvINK^U_IFX9 zg7dv+y!Sh&a`N)slQF{4hkCxBlifXEH-DS=l#aW*CU4hLo21S!e!2AZ1;^5vC;aBP z6mME&TwZj|yV6Iv(=`0u5}hiSyDMGW*Uh;*dEFzcrKi8Wa|qwe#4RUN5#_*O4FIag BoPz)W literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_blank.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..efac5773d6ac4910325f2335fa1ec5b3c25dfb02 GIT binary patch literal 55 zcmZ?wbhEHb6krfwXkcLY4+e@qSy)9F7#VaJfB+=Jz{J5{)-0I$J$I4(0 E0OF|;>i_@% literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_game.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_game.gif new file mode 100755 index 0000000000000000000000000000000000000000..980f040cbb3cb8ba3828fd3aac8a096e7b59b7ee GIT binary patch literal 659 zcmV;E0&M+9Nk%w1VGsZi0OkMy|NsB?`1$ep{p$4o_wwN8@BHBG`{wHH|Kzdv|L(m?y}!iWxq0QgQPRD6^|v^! zyxRSs-;V*Nly=pS08gU-Uz^~7jlR`{0L_L0 zh>Mm$oBxrBdc}bOtAaR-hJQ1e|5c6Rj)QS?fV881IA?*wp?NWGdzyTBabSC=fOTf8 zaR@Df^`~wFpllA3Y9f_q6OCslnPvcWXHs})Mu}x3Rb-ZQVLNhOLu+13d0Z!bSs#Q} z0dQ6@ZdWpKQ6Fzk7kEwp2Uy=)OF3vo31B+_R5u7hECv7n{{R30A^8La6aanzEC2ui z01yBW000N@fPMuS78W8REiE%N4FCXskOqzb0s;dA4_99mkB|(Nmj5fLU>TpWN%G2%p!CrHpp@k8Ol2P{;Q zyvfkPMU6Xh!YpiPf=HPVdCu$rf~LzOq+o9DDMkz@ zOe)Hr3<5K>z-yojilSb$htU;b0|gN$A{V`i>-OKh_1beE{QvpRcmD63{~S28mo83C zFB)J#=M-ef$z-xzE@!jZLZMKpR63nbwOTEeO0`-o9*@`S^-Lzi^L#p;ZZsPCe7@Oi zwpuMw6x;2#BuTwquix+E2F~Fu4-_fUcT9yXZ|%$OEf6m(F5B~c4ad}}*}cTz6F3I0fGvs(wz!XzIZ2jfF){z{3&&6oJf1! zV)*p~0kAm(xg85OxHyrM!esY$W$Kt}L{BB+=D;cb*hET}nG_jg6M%`7<6Q;17V)nX zEb+gg+);tZFm-VJ@wv)eg-?`5Vb;54SrG`tF$fDWwpf0;G8yEo)K57CCS06>gZgKS zfX3QYpHRwAD@pki(A)>3Q5&Ms-Sq(@JDl4(fQlK`>YUM=pP3=coX!`$HM==vm~oga zYu~oD^W&!Jm9_6XI+M+p3+)G=O#wx?d_Ul>E<*M;r%pE2jdtC6|) e%a>2OlFNtwS8w*-Udui{^e67_24MY-^M3&S4BjRH literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_info.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_info.gif new file mode 100755 index 0000000000000000000000000000000000000000..d9e2c8561e3c4d0905f5273b0ac98d862f972cd0 GIT binary patch literal 958 zcmds0{Yz6}6h2pHOzmS`k;J|<1xE>)2^opZu(TK<{t#tS(}7zdG5fj_kuyyZwIq!; zHA@^}S?2nnUnb1_z)(Uooo;D5CsA7Byl!{bZExrHTmM22oO928IM2Dyd3kTfiQ~zK z^CTbvcRCOtSDQXnwtpprDAn~)Fmy#XplSGc`F?k*{u@t7VburF!+Sef_xaa&|FYZX z^!R_RlZ$0WG7O+6%Wm)Vs=wg&3%hgO_M0F3$xSSIJ}-Ke#Rfki%bfQI>$N+1>oPyK z$PImW_u5_k4tMtgpI6kv67qV6J71`uUs>;)cbR6_-c7TwrdHc0oX;)Jw#l_zRsHx1 zY5KzEDC_zhE|Y_QJI8lSyW6bpCl*)pgsXAf)nen%Dr&A38{mHdZPnr`j{q38P+?VA z9l{eM902DZEAe4X=_FIbpat42LA5+53C=Jq!!@8>I&>L%IgitaR z8fyU}koh~+3V<98V$fLs3t>kAEJZB=WBB`B;XMFeVv2;Q(F8&S0)aII30t8XM`O{! zGA0`RI355sVoL`(`loFG;%JX3SZI$IlJHM}SO=7NM`qWo84qM{u2iegQj(aHv9lUk zX?4W@%}~QV@zz+AD4}Q1-H@R8F1aQz zZo|W%MD?V(wfEGP-Li7YfjjBJVR2bY^49!zi)i1CH)>;RdG)r0{6SrsQnhLOh02-9 es+h`qJ5z3Q93{%EdwjG)yi2ZA${^YgNB#inR6_Is literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_question.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_question.gif new file mode 100755 index 0000000000000000000000000000000000000000..919939b5d2a7fbe97d99edc170d8fc6619a1b5e6 GIT binary patch literal 1062 zcmY+DdraC_6vr==O>~+fn--tdcDgpYRj13^nHb%M6^hTgb(+q&)ahum%(Aw>Jrawv z)wX7?b7n=SldaZGXRBBggODE(kcvd1Ex{+@B^@Y8fC)v$Z$JERCpqVS?>F~z?@4aX zNlMZ26Q2+O0eHCp0m$_1hFEEZ=dFCXMQ?Gt+`ipFFc3s`cLOfBU#oXn?Op^y7ENBZ ze7i?t|7ph7HEokEdrVdjM{Kk?d@PB*OSHLc^|`!(?VZ4)euwd^;o4s&<1@G7sZFbQ z4#*teO<3LDK;Mjw#kab40$zWR`t6geY@JAH_4@;Qhrg_Iji+`65d^wx$hxqQRx4-p ztlt_oCYFd6mL1zp_mtGwC)zA**3eqDRqac8jK%E6`ScoD&!pw+-nGa)-j$!Vh~KT$ zIxgQeoVcXQW2kcI^KYD+J9>7uZ_1+4dopXJ#6o`gS4yAT&X*Y$w2sg3ti9f#$Zk+% z)XEQ6i3fPkcypT>)si@h;J`^i$z_GzVwjSwOBQVHe;5y+kshs)C6~d+KA!dXf*YH@ zv?_6I(agazIF>BDaC3frNi!x`n-H4? zq`^ZRg;Y8>%wJzNIKSy#i7wZ!?n z&;%in5B+-2cqL~R!ayDX0CA;m#T;7Ei~(Q^0P@v;QH@~{mX&}Bh#~??(`s_TN00~d zb)$IWa|G=z15DbcA`ZWNMP-pMf6#xoQ{RmAWs{bF60J~>+FenJI z_TCK{SinY0JV?q+L6E%@Af&+yAO+nKSIxZ_b6TNPv>$U9z(`l$2Q;*Q;wk|6)aSVH z5Rn-wp_u^qAi&^XA*C>x7#u$GES_0_*%wAgEN0h}U!jkmlPwm&MLNg(~+aw9sbxI612mK+fi)$pKBEs?!M%C1+k)$F$K6OJ=RKVzQ@ z`yn~M8H7JBctkivW{~JjI0`ZC6f2jmH-~p0sT?Y&m&+6}nbq9fCCR;xJICrIH|SYy zw78r`)nLWLwvvRmztBs6%xN!8%7dI{^~3i4zvMRu0eG5nn_YM1wR0{xSFF>DS5z3a%61x|KRyIaK-^_1^iI41FYq%lIea!^|!0 LJ`5J520`9`|2`SH literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_sticky.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/news_sticky.gif new file mode 100755 index 0000000000000000000000000000000000000000..9b3309b35472e7875e6f0e2a9ab166c0b4901de9 GIT binary patch literal 1020 zcmY*YVN6q36h5y7EevQ=WP=7~nTTvD8=Y9DnC0O>7%>YnmKZV?<`_8QvTjbFWK$|M zw4(%36iSD$#TvVGRN93xMpqP0 zdJIrqLkiXOHp7gA;EbISg{nAa>lxKB%>6ybHnplycejmF0~IYQ;!1eCfAH_b-)!WzU-%#o=y3mW>k$e+@M)@%jNyI)9iBk)_$2; zFKG6@d*1oc5ALG6snoKO#6o+$&c$v8#wPt9I%s;ZmV3@A{c7Uychk3Lg8HE+Nd<%a z9BWjj`AhX*3p6z_JlSq?K9~#1&P>1c#dt=Ae=BkaNgX){KAh(~t&&rqe zjk|-RGl96hmRM;oFVlj5V(r!%l^{M}I3h1^}G^1oM50B(a8u zvjhVP@l4Go;ugYuH4>cch8E0#WkdrUrDA{sLPSOb?^YXdhz*3hLAL^My8bzKIzmWw zBSwT02~p@^7*(N5ID0}Oh73qSywGLkO5g~@fN+*6&%PxmSYiV`3C3D#a}XGs0Xe8j zYCgQ8OaMUr3+kUEjA;d)aZrG8M1b5!%Cq4Z!4Ml)kiBM;MH3?pQ@xA|8O3x)~7_mP^7V{3n3-H(Jt3WU1fa6j-M)NPE(9XCSS~wD^#4FxKbc($d8KO zQ<5Lkc3sh&ASoX_i|uM^Ny@Hu3rhUkT9Xf)2`ti&NBQDBWlT@;jr(!C3ft0-20x2x zPyc|7P?UdU|wnXDeqrM5mn)RJoPWNe9xTVo2SB-2VU*0KF*y literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/oncopy.js b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/oncopy.js new file mode 100755 index 00000000..72fc74a8 --- /dev/null +++ b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/oncopy.js @@ -0,0 +1,51 @@ +// Hook-up to the document.body.oncopy event, +// or in the 's "oncopy" attribute. +// Author: Heath Stewart +function copyCode() +{ + try + { + var range = document.selection.createRange(); + if (document.selection.type != "none") + { + var parent = range.parentElement(); + var parentName = parent.tagName; + if (parentName != null) + { + if (parentName.toLowerCase() == "pre") + { + // Replace superfluous
tags in a
 block.
+					var re = /
/gi; + var code = range.htmlText.replace(re, "\r\n"); + + // Replace non-breaking spaces. + re = / /gi; + code = code.replace(re, " "); + + // Replace & characters. + re = /&/gi; + code = code.replace(re, "&"); + + // Replace < characters. + re = /</gi; + code = code.replace(re, "<"); + + // Replace > characters. + re = />/gi; + code = code.replace(re, ">"); + + // CJM: Remove colorization + re = /<\/?span([^>])*>/gi; + code = code.replace(re, ""); + + if (code != null) + { + window.event.returnValue = false; + window.clipboardData.setData("Text", code); + } + } + } + } + } + catch(e) {} +} diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/print.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/print.gif new file mode 100755 index 0000000000000000000000000000000000000000..e10cd769ff6d16a4eaa7e8d587fd32f286dbaf2b GIT binary patch literal 118 zcmZ?wbhEHb6krfwSj52a9|RbV96IuEjne;_3~-?MlZ91;ftf)EBmz>)z-(=?>rR}( zG4@q!TTd|+J)Zv5@Xj?~E{QUyi+s1QZJUsAf5+kAHEouj9duo z7$svb#u~X+M1+WqA!Cdh$JDWgtRWFYa9tAPh?1i~zC`nn=v~hr@I24wf#>=_|Aq5+ z4ij49H$l){Mlo!W$~;`tN{f`uL95}IoEKra5zqMLI4z8#kdIL+ipR@xqqHYjR5RL= z6G0yN9aJc8!A@H)A;|e86d39AM zgDeRd9@2CyOcxhf?Bql%f=baJQ6P&H2U7ARJApm(IT+HxreBTg#A=gyi{KT+h!RU! zu*;%aF(eRVEU+uXrjG8>g@S^#$f=PkLR1VEA&rVDk6M=0Neq909mR}^#PcOcOOR!- zi&dtPx@m-z76x^^i-S0lQuWhAeT5vM(y#!gU;zUY;ekt2~;-+zgKQP4{X}!C0``qK5Tu^hgbML)VTCY8HPydeCwwiBr7zpF` zLfdLxmp!Dnzimbbn}$N@($AO7gWAF8)_SUcc=(0AtgDpWv)*F^x7rOq`Uu16`%0>hnWJu|$kdH(jHiuuGjZ`R{qRKk literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/red.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/red.gif new file mode 100755 index 0000000000000000000000000000000000000000..bdb3f3c9d5b007ee2d74a86db350727c76933bc1 GIT binary patch literal 77 lcmZ?wbhEHbWMp7u*v!E2-f zve2cT-k^J#vC99MGoqrR-i1+_nVEf>wvdjF-lGqf&p zDMy286ATUz(L6j7jOX$33?~Xe;a30zRzuO?cgwZ}49mjXN*FdAG7I9^WYi+I8xD}a U;dXi+-@dE&Y7`Y6ek>sXJ2s49tN;K2 literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/smiley_doh.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/smiley_doh.gif new file mode 100755 index 0000000000000000000000000000000000000000..4a7df6a30a67b1b895659bcbe0ae407556e9064e GIT binary patch literal 646 zcmV;10(t#MNk%w1VGsZi0OkMy`SR=b?&SIH-tO-1`Rm#F=+pS-&-moYCW*p`6p1 zPWhJ^_>>Xamp{&xO7x8e&XGaxiweG$VW63TnVFfHnVG7UdySo+u$FVsjW(u|c$}1k zo|k@#mzj^1ma2+i)`J+=ffAaCaE6G8n}=(lhGdq5Y@B>io_b4q;ZY_mxQ+9WDh;2xOYf_46Jbh?OiDEB%Wl4W!L}q4YW@ct_Voh^f zJ8oDzVNyR=Ra0D0KvGLWOGrcj0000000000000000000000000A^8La6aXIpEC2ui z01yBW000N$fFFW_F;HGwJUwAjG=qXAWO#IIZy6Z_CRa;?ICo|i0tGuJ2pK&CEm0pO zcS->Q1_~iP4`%~!2vQ$nW&p4X3=%p@Ry}buQYCm01hEVb5f~gUMm}|CM|1=S3t!$& zOkiD8EOtj(YupVK8XGlOCn+p2a$a6-3=Iww7#$w*FJRb^Qzl!32o?HyAd%vQj2l19 z#lVB&Lcb9tRye!?gbJP#AJDh~(E;NMAw-%0DKdu*p*v$n$a}G63zs2s?tm23Nlp-f gIe=8jiNnz2H)p9LM*WnPoap>ptD5&+f8??M0yn?Fvgd3(t<6X*9%C1kpx=i6)Bj!uW!q zAu!XO-R{+U%hndkQkyolv;skl21%1PD73VcLrrW<@JcjF;tOJe*5_$4sg3`D^ACJ} z-)nYN?cA{OK&BeEH}8OT*_sx^V8?kIBB_lc~Y(o_iuO^xmnij*j7QBGr`W4>t@S z5!0`;`e?N0sQB=3?d4Ywv!h2p+jlU0=&gnW2j70<(D2R|-+AS=w!JU6S3Q^7T79H? z|C{@s?_K*;Lf?I)s=Bvy`@ymeH5HXlR_gB-Rxo$jp&akt72Yl7-gRDI&61*R?t+q> zf+CRS1d9j&#{HK6^UI$}-@RkcGuxhcdWX-u3QC5S{6CP@ZK0MjQJ_A_?m%R*qJaM@LtrlDm;aH18hcfvc=v&g#H-C4ER*b~NCFR{CjVv>|z|QPed| zh$c_0DSr35I6fZ;9s&26_E@Y$8e(I_MNzUp^LWJ*sA9#3jv+$Itmh*0j{*Vof!^?%4Nq=2Xm@x zS2$X!vUF9s;&iL!s~m))6fMZ$UAZCoV?Gkf6m5~~W6Z-B7&s4u<_ru$Kll4#5ECYG zxz(k~h9FKvH?rGb(9dWTg)WM}yYJ$i(ENXQ6R( zecxlE{;8kv$ATI|h{n0my+&$u?}S9n?j>Dj_j*jKQ9fZ*Zy+Ua>JXUFY+$UpDG^L?buGb)wdX_P^s+Ki5t(sMK zs*U4zFVnqAOo#f+j!m+q@S&_d%xD`%pA9yD}zq0Dtopm?$b7}Py3Qy z9jW_tDDT^;${AC7mM)yLe$C2l+cxdnx9irfrdx-m-8!}E+oegr?yWm@>e#Pmhkkv$ z`|sPk|Ns939nUZdMniyt5K#Qd!pOj2$Dji;1C%EiIBqf2a>%S`X5*D*7Ut_=T*%18 z!mDs1Ktq6;iA_9U!G;42jBKqELJbcNCcE>==vk@!&=6>A61Mf4S937Qm7Udq#cG1X zCkA#IeKQdQN2excd84>#M$!#b>RbJqhqJ2I17gaL&Cuh zK^_H;ITsz6ICoFi_s%d#PHg6ob?Sd1u+WjG)kr30io(Lh&7C3>vnoC~Fu!YLWMr@g E05;;OnE(I) literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/space.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/space.gif new file mode 100755 index 0000000000000000000000000000000000000000..902e227cdf5fa11cb887d7952bc17af497091c8a GIT binary patch literal 43 scmZ?wbhEHbWMW`qX!y@?;J^U}1_s5SEQ~;kK?g*DWE_~7S^^oY0oN@E4*&oF literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/staff_sm.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/staff_sm.gif new file mode 100755 index 0000000000000000000000000000000000000000..4fc5aec5f0a53f87ac2b2b3d5eebddf98469b83b GIT binary patch literal 561 zcmZ?wbhEHbDUx)2Gj$zPNMuZ|U8K7w_G> zd--GG?VAs;UcGweMZx8ZH_u(!edhAcGiS~mJa}Z!p52=-25mVXw`7!zoH=E+=j1tMeRJb_ zXJ&TJbMNV%(B3ksVWMw!M^JH(Q)OjkS+j3>U3_z4c2P}8VS__%c|~5GeNldOQ9)%^ zVNgz1L28jhT3T9iuJc-d!I+rH@K~1ucMIPLt!gJ(f8Q{#2sv+WFBd0odwY8u4-sp3 zNoz|-Ya>Hrb9G~5<0v&Q19KTYLls>^r9wegbzR|fK6W(?ITbZoWi?4ZP8M!XAqIK@ z#h)y!B0$S@Ko)}Hgn_-UfuX5M#jCl!Nhs1lsH2G`Mw>&Ewa?Q>j89amLpoN^#@1M$ zx!u=W!^%q6l(Rj+T}#)|(uloXEmqN5QC*d(!zN5wQkJVvJT}P1t&i6xijUh~t(n(D zgfUWHNrBPM(45h*S2)CJs-0h8GaHYN8b6zJxI<@@S+KuFgh{At6Hh^h!$T$(ezk20 I94rjh0LG%TVgLXD literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/t.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/t.gif new file mode 100755 index 0000000000000000000000000000000000000000..b2f5d60f9f1b84e8cf2f5169000e0454abf7a017 GIT binary patch literal 43 tcmZ?wbhEHbWMp7uXkcLY4+3Wtf3mQOFfcIa05MRUk%57U$%T=@8UPbi3EKbw literal 0 HcmV?d00001 diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/togglePre.js b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/togglePre.js new file mode 100755 index 00000000..4e9d44ec --- /dev/null +++ b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/togglePre.js @@ -0,0 +1,100 @@ +var MinPreHeight = 450; +var MinPreChars = 750; + +var PreOpen = new Image(); +var PreClose = new Image(); +PreOpen.src="/images/plus.gif"; +PreClose.src="/images/minus.gif"; + +function togglePre() +{ + var id = this.getAttribute("preid"); + var preelm = document.getElementById("pre" + id); + var imgelm = document.getElementById("preimg" + id); + var togelm = document.getElementById("precollapse" + id); + + if (preelm.style.display != 'none') + { + if (document.all) togelm.innerText = " Expand code snippet"; + else + { + document.getElementById("premain" + id).className = "precollapse"; + togelm.firstChild.nodeValue = " Expand code snippet"; + } + preelm.style.display = 'none'; + imgelm.setAttribute("src", PreOpen.src); + } + else + { + if (document.all) togelm.innerText = " Collapse"; + else + { + document.getElementById("premain" + id).className = "smallText"; + togelm.firstChild.nodeValue = " Collapse"; + } + preelm.style.display = 'block'; + imgelm.setAttribute("src", PreClose.src); + } +} + +function InitTogglePre() +{ + var articleText = document.getElementById("contentdiv"); + var pres = articleText.getElementsByTagName("pre"); + + for (var i=0; i=0 && b>=0 && c>=0) { + _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo; + } else { + if (a>=0) a=_uFixA(_ubd.cookie,";",_ust); + else a=_udh+"."+_uu+"."+_ust+"."+_ust+"."+_ust+".1"; + _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo; + _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo; + _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo; + _ufns=1; + } + if (_ulink && xx && xx!="" && xx!="-") { + xx=_uUES(xx); + if (xx.indexOf(";")==-1) _ubd.cookie="__utmx="+xx+"; path="+_utcp+";"+nx+_udo; + } + if (_ulink && v && v!="" && v!="-") { + v=_uUES(v); + if (v.indexOf(";")==-1) _ubd.cookie="__utmv="+v+"; path="+_utcp+";"+nx+_udo; + } + _uInfo(page); + _ufns=0; + _ufno=0; + if (!page || page=="") _uff=1; +} +function _uInfo(page) { + var p,s="",dm="",pg=_udl.pathname+_udl.search; + if (page && page!="") pg=_uES(page,1); + _ur=_ubd.referrer; + if (!_ur || _ur=="") { _ur="-"; } + else { + dm=_ubd.domain; + if(_utcp && _utcp!="/") dm+=_utcp; + p=_ur.indexOf(dm); + if ((p>=0) && (p<=8)) { _ur="0"; } + if (_ur.indexOf("[")==0 && _ur.lastIndexOf("]")==(_ur.length-1)) { _ur="-"; } + } + s+="&utmn="+_uu; + if (_ufsc) s+=_uBInfo(); + if (_uctm) s+=_uCInfo(); + if (_utitle && _ubd.title && _ubd.title!="") s+="&utmdt="+_uES(_ubd.title); + if (_udl.hostname && _udl.hostname!="") s+="&utmhn="+_uES(_udl.hostname); + s+="&utmr="+_ur; + s+="&utmp="+pg; + if ((_userv==0 || _userv==2) && _uSP()) { + var i=new Image(1,1); + i.src=_ugifpath+"?"+"utmwv="+_uwv+s; + i.onload=function() {_uVoid();} + } + if ((_userv==1 || _userv==2) && _uSP()) { + var i2=new Image(1,1); + i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS(); + i2.onload=function() { _uVoid(); } + } + return; +} +function _uVoid() { return; } +function _uCInfo() { + if (!_ucto || _ucto=="") { _ucto="15768000"; } + if (!_uVG()) return; + var c="",t="-",t2="-",t3="-",o=0,cs=0,cn=0,i=0,z="-",s=""; + if (_uanchor && _udlh && _udlh!="") s=_udlh+"&"; + s+=_udl.search; + var x=new Date(_udt.getTime()+(_ucto*1000)); + var dc=_ubd.cookie; + x=" expires="+x.toGMTString()+";"; + if (_ulink && !_ubl) { + z=_uUES(_uGC(s,"__utmz=","&")); + if (z!="-" && z.indexOf(";")==-1) { _ubd.cookie="__utmz="+z+"; path="+_utcp+";"+x+_udo; return ""; } + } + z=dc.indexOf("__utmz="+_udh); + if (z>-1) { z=_uGC(dc,"__utmz="+_udh,";"); } + else { z="-"; } + t=_uGC(s,_ucid+"=","&"); + t2=_uGC(s,_ucsr+"=","&"); + t3=_uGC(s,"gclid=","&"); + if ((t!="-" && t!="") || (t2!="-" && t2!="") || (t3!="-" && t3!="")) { + if (t!="-" && t!="") c+="utmcid="+_uEC(t); + if (t2!="-" && t2!="") { if (c != "") c+="|"; c+="utmcsr="+_uEC(t2); } + if (t3!="-" && t3!="") { if (c != "") c+="|"; c+="utmgclid="+_uEC(t3); } + t=_uGC(s,_uccn+"=","&"); + if (t!="-" && t!="") c+="|utmccn="+_uEC(t); + else c+="|utmccn=(not+set)"; + t=_uGC(s,_ucmd+"=","&"); + if (t!="-" && t!="") c+="|utmcmd="+_uEC(t); + else c+="|utmcmd=(not+set)"; + t=_uGC(s,_uctr+"=","&"); + if (t!="-" && t!="") c+="|utmctr="+_uEC(t); + else { t=_uOrg(1); if (t!="-" && t!="") c+="|utmctr="+_uEC(t); } + t=_uGC(s,_ucct+"=","&"); + if (t!="-" && t!="") c+="|utmcct="+_uEC(t); + t=_uGC(s,_ucno+"=","&"); + if (t=="1") o=1; + if (z!="-" && o==1) return ""; + } + if (c=="-" || c=="") { c=_uOrg(); if (z!="-" && _ufno==1) return ""; } + if (c=="-" || c=="") { if (_ufns==1) c=_uRef(); if (z!="-" && _ufno==1) return ""; } + if (c=="-" || c=="") { + if (z=="-" && _ufns==1) { c="utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"; } + if (c=="-" || c=="") return ""; + } + if (z!="-") { + i=z.indexOf("."); + if (i>-1) i=z.indexOf(".",i+1); + if (i>-1) i=z.indexOf(".",i+1); + if (i>-1) i=z.indexOf(".",i+1); + t=z.substring(i+1,z.length); + if (t.toLowerCase()==c.toLowerCase()) cs=1; + t=z.substring(0,i); + if ((i=t.lastIndexOf(".")) > -1) { + t=t.substring(i+1,t.length); + cn=(t*1); + } + } + if (cs==0 || _ufns==1) { + t=_uGC(dc,"__utma="+_udh,";"); + if ((i=t.lastIndexOf(".")) > 9) { + _uns=t.substring(i+1,t.length); + _uns=(_uns*1); + } + cn++; + if (_uns==0) _uns=1; + _ubd.cookie="__utmz="+_udh+"."+_ust+"."+_uns+"."+cn+"."+c+"; path="+_utcp+"; "+x+_udo; + } + if (cs==0 || _ufns==1) return "&utmcn=1"; + else return "&utmcr=1"; +} +function _uRef() { + if (_ur=="0" || _ur=="" || _ur=="-") return ""; + var i=0,h,k,n; + if ((i=_ur.indexOf("://"))<0) return ""; + h=_ur.substring(i+3,_ur.length); + if (h.indexOf("/") > -1) { + k=h.substring(h.indexOf("/"),h.length); + if (k.indexOf("?") > -1) k=k.substring(0,k.indexOf("?")); + h=h.substring(0,h.indexOf("/")); + } + h=h.toLowerCase(); + n=h; + if ((i=n.indexOf(":")) > -1) n=n.substring(0,i); + for (var ii=0;ii<_uRno.length;ii++) { + if ((i=n.indexOf(_uRno[ii].toLowerCase())) > -1 && n.length==(i+_uRno[ii].length)) { _ufno=1; break; } + } + if (h.indexOf("www.")==0) h=h.substring(4,h.length); + return "utmccn=(referral)|utmcsr="+_uEC(h)+"|"+"utmcct="+_uEC(k)+"|utmcmd=referral"; +} +function _uOrg(t) { + if (_ur=="0" || _ur=="" || _ur=="-") return ""; + var i=0,h,k; + if ((i=_ur.indexOf("://")) < 0) return ""; + h=_ur.substring(i+3,_ur.length); + if (h.indexOf("/") > -1) { + h=h.substring(0,h.indexOf("/")); + } + for (var ii=0;ii<_uOsr.length;ii++) { + if (h.toLowerCase().indexOf(_uOsr[ii].toLowerCase()) > -1) { + if ((i=_ur.indexOf("?"+_uOkw[ii]+"=")) > -1 || (i=_ur.indexOf("&"+_uOkw[ii]+"=")) > -1) { + k=_ur.substring(i+_uOkw[ii].length+2,_ur.length); + if ((i=k.indexOf("&")) > -1) k=k.substring(0,i); + for (var yy=0;yy<_uOno.length;yy++) { + if (_uOno[yy].toLowerCase()==k.toLowerCase()) { _ufno=1; break; } + } + if (t) return _uEC(k); + else return "utmccn=(organic)|utmcsr="+_uEC(_uOsr[ii])+"|"+"utmctr="+_uEC(k)+"|utmcmd=organic"; + } + } + } + return ""; +} +function _uBInfo() { + var sr="-",sc="-",ul="-",fl="-",cs="-",je=1; + var n=navigator; + if (self.screen) { + sr=screen.width+"x"+screen.height; + sc=screen.colorDepth+"-bit"; + } else if (self.java) { + var j=java.awt.Toolkit.getDefaultToolkit(); + var s=j.getScreenSize(); + sr=s.width+"x"+s.height; + } + if (n.language) { ul=n.language.toLowerCase(); } + else if (n.browserLanguage) { ul=n.browserLanguage.toLowerCase(); } + je=n.javaEnabled()?1:0; + if (_uflash) fl=_uFlash(); + if (_ubd.characterSet) cs=_uES(_ubd.characterSet); + else if (_ubd.charset) cs=_uES(_ubd.charset); + return "&utmcs="+cs+"&utmsr="+sr+"&utmsc="+sc+"&utmul="+ul+"&utmje="+je+"&utmfl="+fl; +} +function __utmSetTrans() { + var e; + if (_ubd.getElementById) e=_ubd.getElementById("utmtrans"); + else if (_ubd.utmform && _ubd.utmform.utmtrans) e=_ubd.utmform.utmtrans; + if (!e) return; + var l=e.value.split("UTM:"); + var i,i2,c; + if (_userv==0 || _userv==2) i=new Array(); + if (_userv==1 || _userv==2) { i2=new Array(); c=_uGCS(); } + + for (var ii=0;ii=2;ii--) { + try { + var fl=eval("new ActiveXObject('ShockwaveFlash.ShockwaveFlash."+ii+"');"); + if (fl) { f=ii + '.0'; break; } + } + catch(e) {} + } + } + return f; +} +function __utmLinker(l,h) { + if (!_ulink) return; + var p,k,a="-",b="-",c="-",x="-",z="-",v="-"; + var dc=_ubd.cookie; + if (!l || l=="") return; + var iq = l.indexOf("?"); + var ih = l.indexOf("#"); + if (dc) { + a=_uES(_uGC(dc,"__utma="+_udh,";")); + b=_uES(_uGC(dc,"__utmb="+_udh,";")); + c=_uES(_uGC(dc,"__utmc="+_udh,";")); + x=_uES(_uGC(dc,"__utmx="+_udh,";")); + z=_uES(_uGC(dc,"__utmz="+_udh,";")); + v=_uES(_uGC(dc,"__utmv="+_udh,";")); + k=(_uHash(a+b+c+x+z+v)*1)+(_udh*1); + p="__utma="+a+"&__utmb="+b+"&__utmc="+c+"&__utmx="+x+"&__utmz="+z+"&__utmv="+v+"&__utmk="+k; + } + if (p) { + if (h && ih>-1) return; + if (h) { _udl.href=l+"#"+p; } + else { + if (iq==-1 && ih==-1) _udl.href=l+"?"+p; + else if (ih==-1) _udl.href=l+"&"+p; + else if (iq==-1) _udl.href=l.substring(0,ih-1)+"?"+p+l.substring(ih); + else _udl.href=l.substring(0,ih-1)+"&"+p+l.substring(ih); + } + } else { _udl.href=l; } +} +function __utmLinkPost(f,h) { + if (!_ulink) return; + var p,k,a="-",b="-",c="-",x="-",z="-",v="-"; + var dc=_ubd.cookie; + if (!f || !f.action) return; + var iq = f.action.indexOf("?"); + var ih = f.action.indexOf("#"); + if (dc) { + a=_uES(_uGC(dc,"__utma="+_udh,";")); + b=_uES(_uGC(dc,"__utmb="+_udh,";")); + c=_uES(_uGC(dc,"__utmc="+_udh,";")); + x=_uES(_uGC(dc,"__utmx="+_udh,";")); + z=_uES(_uGC(dc,"__utmz="+_udh,";")); + v=_uES(_uGC(dc,"__utmv="+_udh,";")); + k=(_uHash(a+b+c+x+z+v)*1)+(_udh*1); + p="__utma="+a+"&__utmb="+b+"&__utmc="+c+"&__utmx="+x+"&__utmz="+z+"&__utmv="+v+"&__utmk="+k; + } + if (p) { + if (h && ih>-1) return; + if (h) { f.action+="#"+p; } + else { + if (iq==-1 && ih==-1) f.action+="?"+p; + else if (ih==-1) f.action+="&"+p; + else if (iq==-1) f.action=f.action.substring(0,ih-1)+"?"+p+f.action.substring(ih); + else f.action=f.action.substring(0,ih-1)+"&"+p+f.action.substring(ih); + } + } + return; +} +function __utmSetVar(v) { + if (!v || v=="") return; + if (!_udo || _udo == "") { + _udh=_uDomain(); + if (_udn && _udn!="") { _udo=" domain="+_udn+";"; } + } + if (!_uVG()) return; + var r=Math.round(Math.random() * 2147483647); + _ubd.cookie="__utmv="+_udh+"."+_uES(v)+"; path="+_utcp+"; expires="+_uNx()+";"+_udo; + var s="&utmt=var&utmn="+r; + if ((_userv==0 || _userv==2) && _uSP()) { + var i=new Image(1,1); + i.src=_ugifpath+"?"+"utmwv="+_uwv+s; + i.onload=function() { _uVoid(); } + } + if ((_userv==1 || _userv==2) && _uSP()) { + var i2=new Image(1,1); + i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS(); + i2.onload=function() { _uVoid(); } + } +} +function _uGCS() { + var t,c="",dc=_ubd.cookie; + if ((t=_uGC(dc,"__utma="+_udh,";"))!="-") c+=_uES("__utma="+t+";+"); + if ((t=_uGC(dc,"__utmb="+_udh,";"))!="-") c+=_uES("__utmb="+t+";+"); + if ((t=_uGC(dc,"__utmc="+_udh,";"))!="-") c+=_uES("__utmc="+t+";+"); + if ((t=_uGC(dc,"__utmx="+_udh,";"))!="-") c+=_uES("__utmx="+t+";+"); + if ((t=_uGC(dc,"__utmz="+_udh,";"))!="-") c+=_uES("__utmz="+t+";+"); + if ((t=_uGC(dc,"__utmv="+_udh,";"))!="-") c+=_uES("__utmv="+t+";"); + if (c.charAt(c.length-1)=="+") c=c.substring(0,c.length-1); + return c; +} +function _uGC(l,n,s) { + if (!l || l=="" || !n || n=="" || !s || s=="") return "-"; + var i,i2,i3,c="-"; + i=l.indexOf(n); + i3=n.indexOf("=")+1; + if (i > -1) { + i2=l.indexOf(s,i); if (i2 < 0) { i2=l.length; } + c=l.substring((i+i3),i2); + } + return c; +} +function _uDomain() { + if (!_udn || _udn=="" || _udn=="none") { _udn=""; return 1; } + if (_udn=="auto") { + var d=_ubd.domain; + if (d.substring(0,4)=="www.") { + d=d.substring(4,d.length); + } + _udn=d; + } + _udn = _udn.toLowerCase(); + if (_uhash=="off") return 1; + return _uHash(_udn); +} +function _uHash(d) { + if (!d || d=="") return 1; + var h=0,g=0; + for (var i=d.length-1;i>=0;i--) { + var c=parseInt(d.charCodeAt(i)); + h=((h << 6) & 0xfffffff) + c + (c << 14); + if ((g=h & 0xfe00000)!=0) h=(h ^ (g >> 21)); + } + return h; +} +function _uFixA(c,s,t) { + if (!c || c=="" || !s || s=="" || !t || t=="") return "-"; + var a=_uGC(c,"__utma="+_udh,s); + var lt=0,i=0; + if ((i=a.lastIndexOf(".")) > 9) { + _uns=a.substring(i+1,a.length); + _uns=(_uns*1)+1; + a=a.substring(0,i); + if ((i=a.lastIndexOf(".")) > 7) { + lt=a.substring(i+1,a.length); + a=a.substring(0,i); + } + if ((i=a.lastIndexOf(".")) > 5) { + a=a.substring(0,i); + } + a+="."+lt+"."+t+"."+_uns; + } + return a; +} +function _uTrim(s) { + if (!s || s=="") return ""; + while ((s.charAt(0)==' ') || (s.charAt(0)=='\n') || (s.charAt(0,1)=='\r')) s=s.substring(1,s.length); + while ((s.charAt(s.length-1)==' ') || (s.charAt(s.length-1)=='\n') || (s.charAt(s.length-1)=='\r')) s=s.substring(0,s.length-1); + return s; +} +function _uEC(s) { + var n=""; + if (!s || s=="") return ""; + for (var i=0;i0) r=a.substring(i+1,i2); else return ""; + if ((i=a.indexOf(".",i2+1))>0) t=a.substring(i2+1,i); else return ""; + if (f) { + return r; + } else { + var c=new Array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9'); + return c[r>>28&m]+c[r>>23&m]+c[r>>18&m]+c[r>>13&m]+"-"+c[r>>8&m]+c[r>>3&m]+c[((r&7)<<2)+(t>>30&3)]+c[t>>25&m]+c[t>>20&m]+"-"+c[t>>15&m]+c[t>>10&m]+c[t>>5&m]+c[t&m]; + } +} +function _uIN(n) { + if (!n) return false; + for (var i=0;i"9") && (c!=".")) return false; + } + return true; +} +function _uES(s,u) { + if (typeof(encodeURIComponent) == 'function') { + if (u) return encodeURI(s); + else return encodeURIComponent(s); + } else { + return escape(s); + } +} +function _uUES(s) { + if (typeof(decodeURIComponent) == 'function') { + return decodeURIComponent(s); + } else { + return unescape(s); + } +} +function _uVG() { + if((_udn.indexOf("www.google.") == 0 || _udn.indexOf(".google.") == 0 || _udn.indexOf("google.") == 0) && _utcp=='/' && _udn.indexOf("google.org")==-1) { + return false; + } + return true; +} +function _uSP() { + var s=100; + if (_usample) s=_usample; + if(s>=100 || s<=0) return true; + return ((__utmVisitorCode(1)%10000)<(s*100)); +} +function urchinPathCopy(p){ + var d=document,nx,tx,sx,i,c,cs,t,h,o; + cs=new Array("a","b","c","v","x","z"); + h=_uDomain(); if (_udn && _udn!="") o=" domain="+_udn+";"; + nx=_uNx()+";"; + tx=new Date(); tx.setTime(tx.getTime()+(_utimeout*1000)); + tx=tx.toGMTString()+";"; + sx=new Date(); sx.setTime(sx.getTime()+(_ucto*1000)); + sx=sx.toGMTString()+";"; + for (i=0;i<6;i++){ + t=" expires="; + if (i==1) t+=tx; else if (i==2) t=""; else if (i==5) t+=sx; else t+=nx; + c=_uGC(d.cookie,"__utm"+cs[i]+"="+h,";"); + if (c!="-") d.cookie="__utm"+cs[i]+"="+c+"; path="+p+";"+t+o; + } +} +function _uCO() { + if (!_utk || _utk=="" || _utk.length<10) return; + var d='www.google.com'; + if (_utk.charAt(0)=='!') d='analytics.corp.google.com'; + _ubd.cookie="GASO="+_utk+"; path="+_utcp+";"+_udo; + var sc=document.createElement('script'); + sc.type='text/javascript'; + sc.id="_gasojs"; + sc.src='https://'+d+'/analytics/reporting/overlay_js?gaso='+_utk+'&'+Math.random(); + document.getElementsByTagName('head')[0].appendChild(sc); +} +function _uGT() { + var h=location.hash, a; + if (h && h!="" && h.indexOf("#gaso=")==0) { + a=_uGC(h,"gaso=","&"); + } else { + a=_uGC(_ubd.cookie,"GASO=",";"); + } + return a; +} +var _utk=_uGT(); +if (_utk && _utk!="" && _utk.length>10) { + if (window.addEventListener) { + window.addEventListener('load', _uCO, false); + } else if (window.attachEvent) { + window.attachEvent('onload', _uCO); + } +} + +function _uNx() { + return (new Date((new Date()).getTime()+63072000000)).toGMTString(); +} diff --git a/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/userinfo.gif b/doc/reference/Lindrud-Lambda_for_POST/Design by Contract in C++ - The Code Project - C++ - MFC_files/userinfo.gif new file mode 100755 index 0000000000000000000000000000000000000000..0a985f67a327a09f900b43fa2633c7ebd11dd71e GIT binary patch literal 166 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 Xiagw31_J=V|9xEkV*Dl2|9t%)RU_H4 literal 0 HcmV?d00001 diff --git a/doc/reference/Maley-old_and_Subcontracting/Emulating Design by Contract in C++.pdf b/doc/reference/Maley-old_and_Subcontracting/Emulating Design by Contract in C++.pdf new file mode 100755 index 0000000000000000000000000000000000000000..0cfb6788c93c6ab74bc4bf2e2e0f74e5f993d097 GIT binary patch literal 61453 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 literal 0 HcmV?d00001 diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/II.txt b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/II.txt new file mode 100755 index 00000000..f25a714f --- /dev/null +++ b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/II.txt @@ -0,0 +1,33 @@ + +The page cannot be found + + +
+ +

The page cannot be found

+The page you are looking for might have been removed, had its name changed, or is temporarily unavailable. +
+

Please try the following:

+
    +
  • Make sure that the Web site address displayed in the address bar of your browser is spelled and formatted correctly.
  • +
  • If you reached this page by clicking a link, contact + the Web site administrator to alert them that the link is incorrectly formatted. +
  • +
  • Click the Back button to try another link.
  • +
+

HTTP Error 404 - File or directory not found.
Internet Information Services (IIS)

+
+

Technical Information (for support personnel)

+
    +
  • Go to Microsoft Product Support Services and perform a title search for the words HTTP and 404.
  • +
  • Open IIS Help, which is accessible in IIS Manager (inetmgr), + and search for topics titled Web Site Setup, Common Administrative Tasks, and About Custom Error Messages.
  • +
+ +
diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/app2.pdf b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/app2.pdf new file mode 100755 index 0000000000000000000000000000000000000000..f25a714f68139c284c6b7aa816eab37ec45c6777 GIT binary patch literal 1635 zcmaJ>U2p0}5Pgr7|1jk#kpc_(kRoba5ugoHxZz%W8|87mUhtOnuC+UcqN@MBGlp>Q zRjWS4!Je}-XU?42g2Jan*6VdW!1;tT3W=j%| zpQxL?DX<(p^!t$eQ0Oq~gVNTgUau8aYLU9Fc`tfil$jgx8bjJ!bCt_)jr5z>;W1lchXpy zTis(if!nInrPVTOz;FO0PprMQeosY*iKrRTSbkcQF6352Y={^NH&2b zYFnz3Fj!K1t%36cC~H(Jlms604P|gB6_Rij_>M-@zsLt;o}4!vBe?bYDAlRnXpM938K29X>_ z1Xy-S`&W`4T=?9vIO<;Bro4eL3xOEl_wS(#zZ$D~zJ+0xr~>c;x7*uG@{rDHOM}x0 zb9dC#P_2~?JEL@jtNDC&od`-yt$dgu)2ehvN&CZ@EB0M%YO)YQtwZ$AX-kKHG{$e# zhKI8Pr(0>`dzDeaN596N@|9Tcxk2#@KTR=u96a_r>EZ(d%ixPfA*@dIJ_xshu|J3a zw*wN;ASn>F465YOv=i9V4n|1wR^g+SVMufqiKx zA5C5=5-J*66t*#g7IYVFXhc_rbgeew`i88)@5j+MsdRD(WG zd{xmv#>Lr-hITrWaT||3I4|MGxo;3A4VkDq&3{3(h)0V%_j7a#`;u-NdeD_4+6#*Q NAFnIXUjLUD{{SSh5{m!; literal 0 HcmV?d00001 diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/appendices.html b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/appendices.html new file mode 100755 index 00000000..7f37869c --- /dev/null +++ b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/appendices.html @@ -0,0 +1,31 @@ + + +Apppendices + + + + +

+Appendices to the paper submitted to Scientific Programming
+

+
+ + +
Appendix I (maybe published in Scientific Programming)
+Appendix II (")
+Appendix III (")
+Appendix IV (")
+Appendix V (")
+ + +

+


+
+Back +
+Modified 15 Oct 1999
+Comments to dave(AT)smucb.ac.uk
+ + + + \ No newline at end of file diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article.aspx b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article.aspx new file mode 100755 index 00000000..e0a880c2 --- /dev/null +++ b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article.aspx @@ -0,0 +1,1546 @@ + +Application Development Trends - Supporting Design by Contract in C++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + +
+ + +
+ Curl +&lt;A +HREF="http://ad101com.adbureau.net/accipiter/adclick/CID=0000367460246e6600000000/acc_random=76799364/site=adt/area=article/aID=4593/TOPIC=/aamsz=728x90/pos=m01/pageid=76799364"&gt;&lt;IMG +SRC="http://ad101com-images.adbureau.net/ad101com/adt/Curl/hero_banner_728x90.gif" +ALT="Curl" WIDTH="728" HEIGHT="90" BORDER="0"&gt;&lt;/A&gt; + + +
+ + + +
+
+

Application Development Trends Articles

+ + +
+

Supporting Design by Contract in C++

+

8/1/2001

+

By David Maley, Ivor Spence

+ +Most object-oriented (OO) practitioners recognize the value of +Design by Contract as a methodology for improving software quality. It +is at the heart of the Eiffel language and of the Object Constraint +Language (OCL) of UML. However, there are precious few languages that +provide such intrinsic support for Design by Contract, and C++ is one +language that does not. This article presents two new mechanisms for +emulating Design by Contract in C++ that take advantage of language +features defined in the recent standard, and for which widespread +compiler support is now becoming available. One mechanism has been used +in the development of software components in Computational Physics and +is based on the Standard Template Library (STL); the other provides +Design by Contract support across an inheritance hierarchy in C++ in +accordance with the Liskov Substitutability Principle(LSP).1

+ +Click here to download the Appendix to this article.

+Contracts document the benefits and obligations of an agreement +involving two parties. The document protects both parties. It protects +the client by specifying the minimum that should be done and states +that the client is entitled to receive a certain result. It protects +the supplier by specifying how little is acceptable and that the +contractor must not be liable for failing to carry out tasks outside of +the specified scope. When things go wrong, the contract indicates where +the blame lies.

+Design by Contract relies on the programmer making assertions about the behavior of software, +both at the level of individual function execution and object state, +and also at higher levels. These assertions may be considered to form a +contract between the software supplier and the software client.

+There are three principal types of assertion in a software contract: +postconditions, preconditions, and invariants. Functions must have +desirable properties in order to attract clients, and these are +documented in the function's postcondition. Functions are also able to +state the conditions under which those desirable properties will be +delivered; these are documented in the function's precondition. +Properties that remain unaltered after function execution (although +they may not be satisfied at some intermediate stage) are captured by +invariants.

+The notion of assertions was developed by Hoare,2,3 Floyd,4 and Dijkstra,5 +after initial work (according to Hoare) by Alan Turing. Unfortunately, +many programming languages are very limited in the support they provide +for assertion checking, and C++ is one of them. However, C++ is a rich +and diverse language supporting a multi-paradigm approach to design. +The more recent features of the language provide new opportunities to +add Design by Contract support. In this article, following a survey of +previous suggestions, two techniques for supporting Design by Contract +in C++ are outlined.

+The first technique deals with the need to observe the Liskov +Substitutability Principle when applying Design by Contract across an +inheritance hierarchy. Out of necessity, it makes some rudimentary +requirements on the declaration of the classes involved. The second +technique, while being less general (it is intended for classes whose +internal data +structure is based on the containers of the STL), makes no requirements +on the client. It can be extended to automatically generate (simply by +instantiation) an object hierarchy that parallels the data +sub-structure of an existing object, and can provide a platform from +which to administer tasks such as constraint monitoring, object update, +and object display.6

+There is no consideration given to the issue of what is to be done once +constraint violation is detected: an exception is thrown as a default +action, and the opportunity to define what action should be taken is +provided. This is not because the issue is insignificant, but because +it is beyond the scope of the discussion.

+Previous work on supporting Design by Contract in C++
+There have been a number of different approaches to supporting Design +by Contract in C++: use the existing language constructs to provide a +support mechanism; use macros to support the inclusion and monitoring +of constraints; effectively extend the syntax of the language by +writing a PreProcessor that converts non-C++ constraint expressions +into C++ before compilation; and proposing language extensions.

+The Percolation pattern7 +uses existing language constructs in a straightforward structure that +yields the same checking as built-in assertion inheritance. The pattern +relies on the redefinitions observing a protocol in which they +incorporate calls to base class +functions and observe the Liskov Substitutability Principle in doing +so. The Liskov Substitutability Principle states the conditions under +which the constraints on a class method of a derived class may be +redefined. If the derived class is to be considered a subtype of the +base class (and an instance of it can therefore be substituted wherever +an instance of the base class occurs), the following must apply: +preconditions get no stronger, invariants and postconditions get no +weaker. The Percolation pattern requires discipline on the part of the +programmer that can have implications for maintenance.

+A simulation of the Eiffel mechanism using macros has been put forward by Welch and Strong.8 Macros are defined that serve the purpose of the corresponding Eiffel language constructs.

+App.9 +is an Annotation PreProcessor for C/C++ programs developed in Unix +environments. It recognizes assertions that appear as annotations of +the source text, written using extended comment indicators. It +recognizes three assertion constructs: assume (preconditions), promise (postconditions), return (specifies a constraint on the return value of a function), and a fourth construct, assert, +that specifies a constraint on an intermediate state of a function +body. It also provides three constructs additional to C/C++ syntax to +enhance the expressivity of constraints: all, some, and in +provide universal quantification, existential quantification, and +reference to the value of a variable prior to function execution +respectively.

+Gnu's Nana10 +is a library that provides support for assertion checking and logging +in a space- and time-efficient manner. The aim is to put common good +practice into a library that can be reused. It was inspired by App. +Assertion checking and logging code can be implemented using a +debugger, rather than inline code with a large saving in code space. +There is some STL support in that there is a special version of the +macros involved that uses the iteration protocol to process containers.

+Annotated C++11 +was a research project undertaken by Marshall Cline and Doug Lea. A++ +was intended to provide designers with a means to express a variety of +semantic constraints and properties of C++ classes. It extends the base +type system +to support several forms each of preconditions, postconditions, +assertions, and invariants, along with a richer set of "primitive" +types and constructs that are useful for expressing such constraints.

+Although exlC++12 +is a language extension that bears a lot of similarity to much of the +work discussed so far, the work of Porat and Fertig includes a number +of new and interesting observations. Some of these are a result of +taking the freedom to work outside of the existing language. Subsequent +to the agreement of the ISO/ANSI C++ Standard, this decision means +exlC++ is unlikely to make further contributions to the debate.

+None of the approaches outlined save the user from having to explicitly +deal with handling the consequences of inheritance on assertions. The +approach outlined in this article overcomes this by using constrained +genericity, utilizing new language features such as partial +specialization and inner template classes.

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Characteristics of the different approaches to design by contract.
 Percolation (Binder)App (Rosenblum)A++ (Cline & Lea)exlC++ (Porat & Fertig)Nana (GNU)Macros (Welch & Strong)
UNDESIRABLE      
Requires explicit coding to support the Liskov Substitutability Principle.YesYes  YesYes
Clutters the class namespace with additional names for precondition and +postcondition functions.Yes     
Can affect program execution (potentially has side-effects-"letting the +imperative fox into the applicative chicken coop").YesYesYesYesYesYes
Does not offer granularity of control over which assertions are executed.YesYes    
DEBATABLE      
Recognizes and supports the distinction between legality and coherence.NoNo NoNoNo
Groups semantic informationNo   NoNo
DESIRABLE      
Implementation readily available. NoNoNo  
Provides postconditions with access to the return value of the function.No   NoNo
Provides postconditions with access to the state of the object at the +commencement of the function (the old value) without explicit coding.No   NoNo
Checking of the invariant is carried out in the precondition and +postcondition.NoNo  NoNo
Accommodates functions other than regular class member functions +(static members, friends, global functions).No No   
Supports arbitrary numbers of parameters to member functions without +requiring extension.No   NoNo
Takes advantage of non-strictness in the evaluation of preconditions +and postconditions.NoNoNoNoNoNo

+Table 1 summarizes the characteristics of the different approaches. +Consideration of Table 1 permits general observations to be made, such +as:

+

    +
  • Automatically providing postconditions with access to the return +value of the function (or the old value of a data item) has only been +possible with language extensions.
  • +
  • It is not possible to provide full expressivity in the +assertion-checking mechanism without using functions that may have +side-effects on program execution ("letting the imperative fox into the +applicative chicken coop").
  • +
  • Automatically checking the invariant in conjunction with +precondition and postcondition evaluation only makes sense in the OO +schemes (i.e., those that were not originally C-based).
  • +
+The contents of Table 1 as a whole serve as a wish list for any new attempt to provide support for Design by Contract in C++.

+Supporting DBC across an inheritance hierarchy
+This section develops generic classes that can be provided in library +form, and that minimize the amount of effort required by a programmer +to enjoy Design by Contract support across an inheritance hierarchy of +arbitrary depth in C++. The effort involved when there is no intrinsic +language support for Design by Contract is twofold: first, the same +skeleton code structure must be rewritten every time a function needs +to be predicated (see Figure 1).

+ + +Figure 1
+Figure 1. Structure of a predicated function.

+Figure 1 shows the execution of the body of the function must be +preceded by code that checks the precondition and invariant, and must +be followed by code that checks the postcondition and invariant. In +addition, the current object value must be stored prior to execution of +the body, and this value—along with the return value of the +function—must be made available to the postcondition.

+Secondly, repetitive effort is required in maintaining the discipline +of checking effective rather than local constraints. Thus, for a +function precondition, adherence to the LSP can only be assured by +defining the effective precondition to be the disjunction of the local +preconditions at each level of the hierarchy (see Figure 2).

+ +Figure 2
+Figure 2. Precondition disjunction.

+This process becomes tedious and potentially error-prone for a large +number of methods across various hierarchies. It can be made much more +straightforward and shorter by using templates that rely on two ideas:

+

    +
  • The functionality required to provide precondition and +postcondition monitoring can be encapsulated into a generic function +object;
  • +
  • A single primary template can be used to generate classes that parallel an inheritance hierarchy of arbitrary depth.
  • +
+Defining a Function Object
+To support assertion checking, the execution of a function needs to be +preceded and followed by particular actions, and all three stages are +interconnected. This interconnection is most apparent in that values +that are available in the first two stages (the value of the object +prior to function execution and the return value of the function) are +required by the third stage. Hence, it is clear that some encapsulating +of functionality is required, and this suggests the use of function +objects.

+To construct a suitable function object, the standard approach is to +compare two or more examples of specific cases of functions that deal +with all the stages of precondition and postcondition handling, and to +create an abstraction by identifying similarities and differences. The +template code captures the common features of predicated methods, while +the differences are recognized in the template's type parameters.

+Therefore, consider the two code examples in Listing 1. Clearly, the +similarity lies in the steps that are performed and in the order in +which they take place. The differences are in the types of the objects +involved: first, the return type of the function; and second, the +function's formal parameters. In addition, the class of which this +function is a member constitutes a type parameter, because it +determines the type of old. +Since the number of formal parameters is variable, the total number of +type parameters on which the function depends is variable. There is no +mechanism in C++ to handle an arbitrary number of parameters in one +template, so different templates will be required for each possible +number of function parameters (within reason). The definition of the +function object and associated operator() (..) +for the case of a function with a single parameter is shown in Listings +2, 3, 4, and 5, along with an example of its use (the definition of the +class Assertion is given in Appendix I).

+In order to use the function object in the examples shown above, it is +necessary to rename the original function. This function is called +during the course of the execution of the function object if the +precondition has been found to be satisfied; the code remains +unaltered. This arrangement can easily be delimited by conditional +preprocessing directives so that the checking can be turned off if +desired and the original code executed in its original form.

+The body of the method Complex::operator/(..) +must declare an instance of the function object, passing pointers to +the current object and the renamed function to the constructor, and the +function object must then be called passing the function parameters. If +brevity is paramount, it is possible to combine these two steps by +providing additional function templates that take the parameters to the +function object constructor and the parameters to the call of the +function object. (This can be seen in the sample code in Maley.13)

+A convention of naming the object the same as the function except for +capitalizing the first letter is suggested (This of course assumes that +the convention of using lower case for function names has been adopted +in the first place). In addition, names of user-redefined, built-in +operators cannot use the operator symbols, hence, the name OperatorDivide.

+An alternative to renaming the original function is to define a member body(..) in the function object, and move the code of the body of the existing function to the body of the function body(..). However, referring to the example, since this function would not be a method of class Complex, it must be given access to the Complex object through a pointer, and the code must be adjusted accordingly (i.e., method calls must be prefixed by _object->). It may therefore be necessary to declare the function object class to be a friend of Complex if access to non-public members in the body of the function is required.

+There is only one constraint on the instantiating types: the enclosing class must define the function invariant(..).

+Specific predicates are defined by the client by providing an encoding of the pre(..), post(..) +functions; the compiler automatically selects these specializations +over the general definitions given in the primary template that are +universally satisfied. These functions are provided with a means of +accessing the object and the parameters of the method being called, and +the postcondition is provided with the "old" object (the state of the +object before function execution) and the return value of the function. +The integrity of the conditions themselves may be subjected to improved +integrity assurance.14 There is no way to ensure that the checking of constraints is side-effect free. The functions to be specialized are declared const +(and therefore so must the specializations provided by the client), but +it is the function object that cannot be changed, the actual object is +referenced through the _object pointer, +which could be const_casted by the client. Not all languages with +Design by Contract support a built-in guarantee of freedom from side +effects. For example, the Object Constraint Language of UML does, but +Eiffel does not.

+Using Genericity to Span an Inheritance Hierarchy
+A single primary template can be used to generate classes that parallel +a single inheritance hierarchy of arbitrary depth; for example, +consider the generic class:

+


+template 
+class DBC : public
+     DBC { /* .. */ };
+
+It displays constrained genericity, in that the instantiating class Derived must declare a name (Base) in order for instantiation to succeed at compile time. If the name Base is defined to be the name of the class Derived is derived from, which can be done by using a typedef, +then the template defines a generic class that inherits from that +instantiation of itself which is instantiated using the base class of +the class that instantiates it.

+Clearly, the construction requires a mechanism by which it can be +"terminated" in the case of the root class. The root class is not +derived from any other class, and the chain of inheritance comes to an +end. This can be accomplished by introducing an additional type +parameter Terminator into the definition:

+


+template 
+class DBC : public DBC { /* .. */ };
+
+and then defining a partial specialization of the primary template that will be used in the root case:

+


+template 
+     class DBC { /* .. */ };
+
+The Terminator +parameter need only be included explicitly in one instantiation, where +it is used to identify the root of the hierarchy: the default suffices +in derived classes.

+The generic class DBC<..> +will be used as the basis for an inner template class of the function +object template. It brings the name of the base class into the scope of +the derived class, which facilitates the template definition, +eliminates the need for much explicit coding, and shifts the work from +the client to the template supplier.

+The specific precondition and postcondition functions pre(..) and post(..) used in the definition of operator()(..) are replaced by effectivePre(..) and effectivePost(..), +respectively. These functions evaluate the necessary disjunction and +conjunction of local preconditions and postconditions, respectively. +Likewise for invariants. Inspection of these functions in the templates +in Appendix I shows that great care must be taken with scoping at +intermediate levels in the inheritance hierarchy. The complete function +object for any method may have an arbitrarily long chain of ancestors. +In the primary template (denoted here as PT), a call to method pre(..) in the definition of effectivePre(..) might appear, for a method Bar(..) and an intermediate class Foo, to be a call to PT::Bar::pre(..). However, polymorphism dictates that if the class at the top of the hierarchy (the one that has no derivative) is Fum, then it is PT::Bar::pre(..) that is called. Hence, a scoping operator must be introduced into the definition.

+The additional template parameter Top is included. Its default value is false, and the top of the hierarchy is indicated by including the value true +for this parameter. Identifying the top of the hierarchy is necessary +to handle the "old" object efficiently. The "old" object is referenced +through a pointer in the base class of the function object, but this +points to an object of the most derived type in the class hierarchy. +Therefore, at each level in the hierarchy, an "old" object of the right +type for that level can be accessed.

+For a given method, the template client optionally provides definitions for the methods pre() and post() +for each class in the hierarchy. When a function is called for a given +object in the hierarchy, the body defined for objects of that class is +executed; in addition, the full precondition and postcondition across +the whole of the hierarchy from that class to the root is checked. +(Obviously, if the precondition is not satisfied then the body may not, +in fact, be executed).

+In the combined template scheme, it is no longer necessary for the type +of the current object to be a template parameter of the function object +template (the outer class), because it is provided by the inner class.

+In order to support class invariant, method precondition, and method +postcondition monitoring across an inheritance hierarchy, it is +necessary to provide a typedef in each class in the hierarchy to define the name "Base." +This step brings the name of the base class into the scope of the +derived class, making it accessible within the template. For all +classes except the root of the hierarchy, the name "Base" +is defined to be the class from which the class is derived. For the +root class, it is defined to be the class itself. This distinction is +vital when utilizing partial specialization to identify the root of the +hierarchy.

+Optionally, the following typedefs can be added to make function names shorter and clearer:

+

    +
  • A global typedef for each predicated +method, which instantiates the outer template class with the types of +the return value and the parameters of the predicated method.
  • +
  • A typedef per class, per predicated method that instantiates the inner template class with the types in the inheritance hierarchy.
  • +
+

+Distinguishing between methods with identical signatures
+If two methods in the same hierarchy have the same signature, clients +of the templates must be aware that they must differentiate between +them. Consider, for example, a definition:

+


+bool Derived2::MethodA::pre(..) { /* ... */ }
+
+The use of the global typedef

+


+typedef ::DBC1 MethodA;
+
+and the local

+


+typedef ::MethodA::DBC MethodA;
+
+in class Derived213 mask the fact that this definition is actually

+


+bool ::DBC1::DBC::pre(..) { /* ... */ }
+
+which would be indistinguishable from the definition of another method +in the same hierarchy with the same signature. Therefore, in such a +case, it would be necessary to include an integer value in the type +parameters of one instantiation of DBC1<..> in order to make the distinction apparent, for example:

+


+typedef ::DBC1 MethodC;
+
+The MethodNumber type parameter, which defaults to zero, is provided for this purpose.

+Void functions
+The current state of compiler technology means different solutions to +the problem caused by functions with no return value must be +considered, and the appropriate templates for the capabilities of the +compiler chosen. In the standard template definitions, the type +parameter ReturnType is used to declare the type of the parameter used to pass the return value of the function to the postcondition, in the form const ReturnType&. However, if ReturnType is instantiated to void, this declaration when instantiated is illegal.

+There are a number of ways around this. Ideally, a specialization of +the templates is written that the compiler can automatically select +whenever a function with no return value is declared as a function +object. The return value parameter can be eliminated from the +declaration of post(..) +in this specialization. However, not all compilers will recognize the +specialization as valid. The alternatives involve defining the +templates in terms of a pointer to the return value instead of to the +value itself.

+Point of declaration
+It is possible to declare the supporting function objects in the class, +rather than in the class method (and not declare the class methods at +all). This can reduce considerably the amount of housekeeping code that +needs to be written. However, it does have drawbacks. First, +polymorphic behavior is lost unless wrapper methods are also declared, +since function objects cannot be declared virtual. Second, all class +constructor definitions must be amended to ensure that the object +pointer is passed to each of the declared function objects.

+Multiple inheritance
+It is possible to extend this scheme to multiple inheritance +hierarchies, and the best way to accomplish this is still being +investigated. The definition of the name "Base" +in each class is no longer useful, since methods no longer share a +common heritage. As a result, some of the declarations are lengthier, +as function objects must be instantiated with essentially their entire +ancestry. In each case, this is a chain of single inheritance, but the +chain is not common to all methods. As with the practical limit on the +number of formal parameters, the template writer must impose a +practical limit on the depth of the inheritance lattice.

+Supporting the STL
+Many data types are now based on hierarchies of containers, and the containers are provided by the STL.15 +In such cases, there need be no requirements on the client for DBC +support to be provided. Monitoring constraints on these types can be +handled by extending the capabilities of the STL containers. In brief, +this is done by creating new containers that inherit from the originals +in a new namespace. Support for verifying preconditions and +postconditions on the operation of functions is provided by redefining +the operations so that in the new operation, the precondition is +checked prior to a call to the original operation, and similarly the +postcondition is checked afterwards. Invariants can be handled in a +straightforward manner, as each generic container definition can +include code that calculates the conjunction of the invariants of the +elements it contains, together with its own invariant (ordering in a vector, for example).

+There are really two separate cases to consider for preconditions and +postconditions. First, there is the case of preconditions and +postconditions that are inherent to a container operation because of +the properties of the container. For example, it is an error to try to +erase an element from an empty vector, so there should be a +precondition on erasing from a vector that states the iterator +parameter lies in the range of iterators of the vector. Second, there +are the preconditions and postconditions that are specific to the +instantiation of an operation for a particular type. Both can be +accommodated.

+Each container operation for which a client may wish to define a +precondition or postcondition (i.e., those that modify the container; +no client is likely to want to stipulate a specific precondition for a +query operation such as size()) is redefined within the namespace 'stdpp' to check conditions that can be redefined for specific type instantiations by the client. For example, methods pre_erase(..) and post_erase(..) are declared in the redeclaration of vector (see Listing 6). This leads to the definition of stdpp::vector::erase(iterator) as shown in Listing 7.

+The client then has the option of supplying specific definitions of stdpp::vector::pre_erase() const or stdpp::vector::post_erase() const as necessary. Clearly, granularity of control over which checks are employed can be introduced.

+One potential issue concerns versions of the STL. There is no +recognized canonical STL implementation, and even if there were, there +is no guarantee it could not be superseded. The library adaptation +described above works with both the HP and the SGI implementations of +the STL.

+Conclusion
+This work has been the result of endeavoring to apply modern software +engineering techniques to problems in Computational Physics. Formal +specifications of the problems were written in order to state precisely +and unambiguously the functionality of the components.

+While it was desired to make maximum use of existing code and libraries +in the implementation of the component, it was recognized that +libraries such as the STL only provided support for the statement of +data structure given in the specification, not for the monitoring of +the stated constraints on that data. Similarly, the generic algorithms +of the STL provide an immediate implementation of some of the +operations defined in the specification, but no mechanism for verifying +their behavior is that which is required.

+It was therefore necessary to provide Design by Contract support for +the chosen implementation language, C++, which has been done by taking +advantage of new language features that reduce the effort required by +the programmer to a minimum. These new features constitute part of the +multiparadigm design capability of C++.

+The genericity paradigm was employed in tandem with one of the most +basic techniques of analysis—identifying similarities and differences, +and creating abstractions—to develop templates that capture the common +features of predicated methods, while the differences are recognized in +the template's type parameters; constraints on which types can +instantiate a given template indicate that some of the commonality that +has been identified is not embedded in the code of the algorithm, but +in the type requirements. This approach results in a significant amount +of implementation simply by declaration.

+Referring back to the table of desirable and not-so-desirable +characteristics of Design by Contract support mechanisms (Table 1), the +templates shown provide most of the significant players in the wish +list and, with minor adaptations could provide more if required. The +one desirable characteristic that cannot be ensured is that checking of +constraints is side-effect free.

+References
+

    +
  1. Liskov, Barbara H. and Jeannette M. Wing. "A Behavioral Notion of Subtyping," ACM Transactions on Programming Languages and Systems, 16(6):1811–1841, Nov. 1994.
  2. +
  3. Hoare, C.A.R. "An Axiomatic Basis for Computer Programming," Communications of the ACM, 12(10):576–583, Oct. 1969.
  4. +
  5. Hoare, C.A.R. "Proof of Correctness of Data Representations," Acta Informatica, 1(4):271–281, 1972.
  6. +
  7. Floyd, Robert F. "Assigning Meanings to Programs," Proceedings of the American Mathematical Society Symposium in Applied Mathematics, Volume XIX, 19–31, 1967.
  8. +
  9. Dijkstra, Edsger W. A Discipline of Programming, Prentice Hall, Englewood Cliffs, New Jersey, 1976.
  10. +
  11. Maley, David and Ivor Spence. "Emulating Design by Contract in C++," TOOLS 29, IEEE.
  12. +
  13. Binder, Robert V. Testing Object-Oriented Systems: Models, Patterns and Tools, Addison–Wesley, Reading, MA, 1999.
  14. +
  15. Welch, David and Scott Strong. "An Exception-Based Assertion Mechanism for C++," JOOP, July/Aug 1998.
  16. +
  17. Rosenblum, David. "A Practical Approach to Programming with Assertions," IEEE Transactions on Software Engineering, 21(1), Jan. 1995.
  18. +
  19. See http://www.gnu.org/software/nana/manual/nana.html.
  20. +
  21. Cline, Maurice and Doug Lea. "Using Annotated C++," Proceedings of C++ at Work, Sept. 1990.
  22. +
  23. Porat, Sara and Paul Fertig. "Class Assertions in C++," Journal of Object-Oriented Programming, 8(2):30–37, May 1995.
  24. +
  25. See www.stmarys-belfast.ac.uk/~d.maley/dbc.cpp.
  26. +
  27. Maley, David and Ivor Spence. "But Who Will Guard the Guardians?," TOOLS USA 2000, IEEE.
  28. +
  29. Plauger, P. J., Ed., et al. C++ Standard Template Library, Prentice Hall, Englewood Cliffs, NJ, 1995.
  30. +

+ + +

David Maley is with St. Mary's University College, Belfast. He can be contacted at d.maley@stmarys-belfast.ac.uk.Ivor Spence is with Queen's University of Belfast. He can be contacted at i.spence@qub.ac.uk.

+ +
+ + + + + + + + + +
+
+ + + +
+ +
+ + + + + + + + + +
+
+ + + +
+ + +
+ + + +
+ + + + + +
+ + \ No newline at end of file diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/1105logo_website.gif b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/1105logo_website.gif new file mode 100755 index 0000000000000000000000000000000000000000..a4435526cff65b9adce54f22a7fc6191d91ec2f3 GIT binary patch literal 1577 zcmV+^2G;pUNk%w1VTb@40OkMyFdrQ3>*}qhrE6bYf+ic*)6$cQh?7J*Iw~ioWnI3x zxcm3_p_!PAfq!06PenE}yo!b8%$Qjms)u5xRcnVGz{wP;*g z`SkPHyttiKP2JkrGa?^RLqWxxm5MYfiGO~!fqTrRqCYS#bZBOSd3UmTbH>8K)X>k{ z*w@O%#WyD;Og=m7>FMYJ01!j6dQ+Szk$YkOG0^WY>PH5TTe{Gmy)Y$WB>pE;N9Kl<>ifpg0ypM?BCsHW@f#*y2-`FRY*nC zv#-gaoVB&JLjf>dT)nQap_V4bQnVGqUfM!`&41ejE#Lub@tXEkJR&rU!$2Rm0NLgv9_TgA8s~%mmSb z7&O%5!`2#uR5#qrHG?DH^4i$hh@(P6> z41x-!AV>q0pimTKF|>lHApt!MnJh!~hoNEt1jYEo1P?A}f`ph7F$hWsV?M!v`Y^~v zn^z(KXbGxd4FFq07XVx^85~%a$aAv;a6;@5+qXgD+pf@&bT^Ay5`0vF8E+j2Tp^ zcD@auLZOQ<01Gyd$Okq-PJS$QE(nDWLrfm{kWz>NO9m-)C_;l_#||qhw%|DArpSZ| zR0EUe}e>&+Z8bk#sVQw0MJJN zPDAA51QwkQasdokFepd>0F<#Kh8iMbogonbFhh4D5>f^TIU&HrC`$Brh$%}5vcMF~ zsBwi_bpa3+AwPadaKePUeZs~S3=sAS2y3)p$OTAT(c}tO@bG}7e+Bl!4J>rp zX#sQ7E;7_AeJdelJ;-_!kB{G zkirZGXyFne1k54h9o>{LNDLah^~$e;1p65P-oTcJ%ATkp=hq3BgwwtksaiawmuY z0QewdAqH4U?I0RBP*$dbb$Lj+DFWbTh=VK$F1P?xbcGf`MBsuHIO7WkN8La`2LR(H z3kuIZ|4FR1z768UVya%Tf}4V@k!2x}B7*UB8yZ5zhgb^|0uL^H;ke^#TLMLj~qfCNC8 z5C^o-0Ec0R2>`$rWwhXzBG7ISUXWTLDnJ5REuai3xPb~+s0BgvAcZQNfujmBgfS68 b3Bn@;3vLi4iTLn`Kn$V~he*Un1Ofm%H&m$T literal 0 HcmV?d00001 diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/AE0.gif b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/AE0.gif new file mode 100755 index 0000000000000000000000000000000000000000..7485fb40485cfeb3ab6630313eab9445fdf32689 GIT binary patch literal 44 tcmZ?wbhEHbWM*JyX!y@?;J^U}1_s5SEQ~;kK?g*DWE_~7Tk2UEtO4LI2uA<_ literal 0 HcmV?d00001 diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/B2100571.21 b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/B2100571.21 new file mode 100755 index 0000000000000000000000000000000000000000..1d9a4f524c97fa9d148cc15d7e114acce53520a7 GIT binary patch literal 42 rcmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEdD3jTo!}%isql literal 0 HcmV?d00001 diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/adt_btn_go2.gif b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/adt_btn_go2.gif new file mode 100755 index 0000000000000000000000000000000000000000..d687c3a6fefcce65b09a4115273ad30c06da74f0 GIT binary patch literal 337 zcmV-X0j~Z>Nk%w1VHW@p0K^{vrn9}Uyv0dlc*@e)dX1c5cZr;kojF?A9SaB) z4h{hl7XuWT7oV*Y3=5|k4iEwrz!nM%zzf5`6$BFwySr8$R literal 0 HcmV?d00001 diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/aug01maleyfig1.gif b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/aug01maleyfig1.gif new file mode 100755 index 0000000000000000000000000000000000000000..b1cae8676df7cc7c1e2ddd7f574d52d7d7654946 GIT binary patch literal 5490 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 literal 0 HcmV?d00001 diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/aug01maleyfig2a.gif b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/aug01maleyfig2a.gif new file mode 100755 index 0000000000000000000000000000000000000000..0adb6800d02d73cea1903c9c029f2a5674d6ead8 GIT binary patch literal 6652 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 literal 0 HcmV?d00001 diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/door.jsp b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/door.jsp new file mode 100755 index 00000000..ae3e53df --- /dev/null +++ b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/door.jsp @@ -0,0 +1,245 @@ + + +var gBVType='firefox',gBVVersion='15',gOSType='linux'; + +/* This source code is Copyright (c) Vibrant Media 2001-2007 and forms part of the +patent-pending Vibrant Media product "IntelliTXT" (sm). */ +function cpl(s){ +var p=s.indexOf(' '),c=1; +while(p>=0){ +p=s.indexOf(' ',p+1); +c++;} +return c; +} + +function iG(){ +gHN=new Array('container'); +gAN=new Array(); + +gSN=new Array('','

','

','

','

','

','','','','!header','!mainNav','adBox','newsLetter','sponsor','!footer','!copyright','titleLink','author','splitBox','left','right'); +gUPN=new Array('','',''); +gBPN=new Array(); +} + +function kwM(){ +var ad=fABDID(aAD,gDI); +if(null==ad)return; +window.status=ad.t.replace(/\£\;/, '?'); +} +var gCLM=1, +gK=new Array(), +gKL=new Array(), +gOHk=new Array(); +gITXTNIdx=0; +for(var i=0;i=(gLCL * 1.1)) || (gDTo==false && gIRB==1 && bCF==0 && Math.abs(gCL-gLCL)>=(gLCL * 10) / 100)))) { + +// this only needs to be done if we're SPITing and we're running IntelliEdit +var tTXT='',aIEE,dDate=''; + +if(tTXT.length==0)tTXT=document.title; + +gINt=' zxz '; +for(var i=0;i-1) p.ttxt=p.ttxt.replace('\'', '%27'); +p.auat=0; +p.lpgv=0; +p.ddate=dDate; +p.pvu=gPVU; +p.pvm=gPVM; +p.ias=itxtIas; +p.ru=encodeURIComponent(sRU); +cAs(server,p); +} else if (gCL) + + { + +if((gITXTN==null)||(gITXTN!=null && gITXTN.length==0)) +gITXTN=gIA(gdB,gCM,0); +if(gITXTN!=null && gITXTN.length) +if(gCL>0) rKWL(250); + +} +} +var ndbST, +iRCLM=1, +iDFC=0, +iTTl=1, +iTTp=0, +iSo=0, +iNBc=0, +iADi=0, +sRU='http://www.adtmag.com/joop/article.aspx?id=4593', +gMR=1000, +bWAC=0, +bYCR=0, +gMNC=255, +gTTD=50, +iIEK=0, +sIEFH='', +ieslu='', +iessu='', +iesbu='', +iesfid='', +iesfin='', +iesfig='', +iett='Adtmag.com', +iDAH=0, +gFES=0, +gFAo=1, +gPmoe=0, +gTlpC=new Object(); +gTlpC.tttc='#000099';gTlpC.ttht='#0000DE'; +gTlpC.ttdc='#000000';gTlpC.tthdc='#000000'; +gTlpC.ttac='#008000';gTlpC.ttha='#008000'; +gTlpC.ttbg='#F0F0F0';gTlpC.tthv='#FFFFFF'; +var sspl='Advertisement', +swti='What\'s this?', +slm='LEARN MORE', +ssch='Searching...', +sbn='Buy now', +scls='Close', +sCC='$', +sEet='End time', +sEcb='Place bid', +sEsn='Seller', +iert='Related Articles'; +var gNeedProtos=1; + +var prevOnload=(window.onload?window.onload:new Function()), +itxtInited=0, +itxtPrevOnloadCalled=0; +function itxtOnloader() { + +startIntelliTXT(0); +} +function itxtStateChange() { + +startIntelliTXT(1); +} +function startIntelliTXT(v) { + +if (!v) { +if( itxtPrevOnloadCalled ) +return; +itxtPrevOnloadCalled=1; +prevOnload(); +} +if (itxtInited) return; + +itxtInited=1; +itxtLES('http://images.intellitxt.com/ast/js/vm/func_200709182130.js'); +} +window.onload=itxtOnloader; +window.setTimeout('startIntelliTXT(1);',3000); + diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/front.asp b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/front.asp new file mode 100755 index 00000000..5d98ea40 --- /dev/null +++ b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/front.asp @@ -0,0 +1,12 @@ +if(!document.itxtInProg){ +document.itxtInProg=1;var itxtIas='5781eca02623477e8fcead890e5acb36', +bvie=navigator.appVersion.indexOf('MSIE')>=0&&navigator.appVersion.indexOf('Opera')<0; +function gIT(o){if(o.nodeType==3)return o.nodeValue;if(o.tagName&&('script'==o.tagName.toLowerCase()))return '';var t='';var cn=o.childNodes;for(var i=0;i=0 && ('complete'!=document.readyState)){document.write('');}else itxtLES(u);}catch(e){}} +function itxtHurraCookie(u){try{if(navigator.appVersion.indexOf('MSIE')>=0 && ('complete'!=document.readyState)){document.write('');}else{var hurraImg=document.createElement('img');hurraImg.src='http://ads.hurra.de/cgi-local/view.cgi?sid=5781eca02623477e8fcead890e5acb36';document.getElementsByTagName( "body" )[0].appendChild( hurraImg );}}catch(e){}} +var itxturl='http://adtmag.us.intellitxt.com/v3/door.jsp?ts='+(new Date()).getTime()+'&pagecl='+itxtbtl()+'&ias='+itxtIas+'&ipid=5260&sn=header,footer,sideBar,module,mainNav,footerNav,moreLinks,copyright,sponsor,wpLibrary,webinar,relatedLinks,splitBox&refurl='+document.location.href.replace(/\&/g,'%26').replace(/\'/g, '%27').replace(/\"/g, '%22').replace(/\#(.)*/,''); +itxtDSB(itxturl); +} diff --git a/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/func_200709182130.js b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/func_200709182130.js new file mode 100755 index 00000000..4cee9586 --- /dev/null +++ b/doc/reference/Maley-old_and_Subcontracting/Supporting Design by Contract in C++/article_files/func_200709182130.js @@ -0,0 +1,2 @@ +/* This source code is Copyright (c) Vibrant Media 2001-2007 and forms part of the patent-pending Vibrant Media product "IntelliTXT" (sm). */ +var iTT=0,iTTC=1,gdB,cc='',rcc='',itxtreg='',itxtdma=0,server='',sWTU='',sIEWTU='',ipartid=0,ibid=0,ipid=0,mk=0,t_s='',iCF=0,aKW=null,aAD=null,aDIDN=new Array(),ulS='',hS='',gWO='',gTU='',gDBL=0,gHLN=1,gMM=null,gBSS=0,gTI='',gDI=0,gSYI=0,gADI=0,gSI=1,gSID='',gSpitTimer=0,gSpitCheck=0,mTL=50,kwpn=-1,kwpp=-1,ppp=0,gSN=new Array(),gAN=new Array(),gHN=new Array(),gUPN=new Array(),gBPN=new Array(),gLC=false,gNS={},gLD=false,gDTo=false,gDST,gCM="v2",gNC=0,gINt="",gITXTN=new Array(),gSEVer=(typeof(ScriptEngineMajorVersion)=="function"?Number(ScriptEngineMajorVersion()+'.'+ScriptEngineMinorVersion()):5.5),gIRB=0,gENC="",gMEKWT=0,gLCL=0,gCL=0,gDM=0,gTTt=1500,gTTid=0,goT=null,gMFW=0,gMFH=0,gAC=0,gBM=0,gDAT='',gEAT='',gUHT=null,gUHIR=0,gUHCR=0,gAUAT=0,gFO=0,larE=/\/g,gATIg=null,gATIr=null,gATIs=null,gEATI=0,gFTTm=null,gFTTr=null,gFOJBG='',gGSK='',gFar=new Array(),gFInt=null,gFCnt=1,gSVURL='',gSVIMG='',gFdCk=0,gFdBck='',gaOv=null,gImC=null,gKWPF=0,gPVU='',gMTTc=0,gMInt=null,gFAint=0,gFAcnt=0,gPVM='',gFFMF=0,gIPL=0,gSkp=0,gMiFo=0,giPh=(gOSType=="iphone"),gCSc='',gHSc='';var dbST,dbET;if(gNeedProtos){if((gBVType=='netscape')&&(navigator.appVersion.indexOf("MSIE")>=0)){gNeedProtos=false;}} if(gBVType=="safari")gSEVer=0;function gIT(o) {if(o.nodeType==3) return o.nodeValue;if(!o.childNodes) return'';var t='';var cn=o.childNodes;for(var i=0;i1) {mid=(left+right)>>>1;if(arr[mid]1) {dbST=new Date().getTime();iDW();var iTxt=new Array();if(gCM=='v1') iTxt=gIA2();else iTxt=gIA(gdB,gCM,0);dbET=new Date().getTime();dbM('gIA Elapsed time: '+(dbET-dbST)+' ms.',1);dbST=new Date().getTime();iDW();gAA(gdB,new Array(),gCM,0);dbET=new Date().getTime();dbM('gAA Elapsed time: '+(dbET-dbST)+' ms.',1);} dbM('server='+server+'\ncc='+cc+'\nipid='+ipid+'\niCF='+iCF,0);if(gCLM==1) {if(gTc('ITXT_TTV')!='') gBSS=1;} else if(gCLM==2) gBSS=1;dbM("Using SEVer:"+gSEVer,1);dbM('Compatibility Mode: '+gCM+'',1);} function dCM() {var gE=document.getElementsByName('intelliTxt');if(gE==null) gE=document.getElementsByName('intelliTXT');var gL;if(gE!=null) gL=gE.length;else gL=0;if(gL>0||gHN.length>0) {mTL=0;return"v1";} return"v2";} function checkSpit() {dbM('checkSpit()',0);if(++gSpitCheck>4) {window.clearInterval(gSpitTimer);gSpitTimer=0;dbM('checkSpit() fail',0);var s='http://'+server+'/al.asp?ipid='+ipid+'&ts='+t_s+'&mt=13&mv=1&cf='+iCF+'&so='+iSo+'&ias='+itxtIas;itxtLES(s);}} function spitHere() {dbM('spitHere',0);if(gSpitTimer>=0) {window.clearInterval(gSpitTimer);gSpitTimer=0;}} function fHFN(i,oNode,aHk){var a=new Array();for(var j=0,n=aHk.length;j0&&gHLN) hlN(gITXTN[i].parentNode,"#FCB514");gITXTN[i]=null;}else seTg(gITXTN[i],nt);}} var cNTg=1;var nTgs=new Array();nTgs[1]=0;function gIA(oNode,ver,mode){var a=new Array();if(cFL(oNode)) return a;if(ver=="v1"&&mode!=1) {mode=cFIA(oNode);} if(iAA(oNode,ver,mode)) return a;if(iSA(oNode,ver,mode)) return a;if(iIA(oNode,ver,mode)) {if(gDBL>0&&gHLN) hlN(oNode.parentNode,"green");a[a.length]=oNode;gNC++;var tgCNd=geTg(oNode);if(!tgCNd){if(iCNL(oNode.parentNode,gUPN)){if(gDBL>0&&gHLN) oNode.parentNode.style.borderStyle="dotted";var tgPar=geTg(oNode.parentNode);if(!tgPar){var exCyc=0;var cps=oNode.parentNode.previousSibling;while(!exCyc){if(cps){if(iCNL(cps,gBPN)){seTg(oNode.parentNode,cNTg);seTg(oNode,cNTg);cNTg++;exCyc=1;}else{var pstg=geTg(cps);if(pstg){seTg(oNode.parentNode,pstg);seTg(oNode,pstg);exCyc=1;}else{cps=cps.previousSibling;exCyc=0;}}}else{seTg(oNode.parentNode,cNTg);seTg(oNode,cNTg);cNTg++;exCyc=1;}}}else{seTg(oNode,tgPar);}}else{if(!oNode.previousSibling){seTg(oNode,cNTg);cNTg++;}else{if(iCNL(oNode.previousSibling,gBPN)){seTg(oNode,cNTg);cNTg++;}else{if(iCNL(oNode.previousSibling,gUPN)){var tgpr=gePT(oNode);if(tgpr) {seTg(oNode,tgpr);} else {seTg(oNode,cNTg);cNTg++;}}else{seTg(oNode,cNTg);cNTg++;}}}}} if((gDBL>0)&&gHLN&&(gOHk.length>0)&&(binarySearch(gOHk,geTg(oNode))<0)) oNode.parentNode.style.borderColor="#660033";return a;} for(var i=0,n=oNode.childNodes.length;i") tN=tN.substring(0,tN.length-1);var a=document.getElementsByTagName(tN);for(var j=0;j0&&oNode.nodeType==1) {for(var i=0;i")tg=tg.substring(0,tg.length-1);var nms="",stg="";if(tg.indexOf(":")>=0) {var items=tg.split(":");nms=items[0];stg=items[1];} if(""!=nms) {if(oNode.prefix&&oNode.localName) {if(((oNode.localName.toLowerCase()==stg)||(oNode.tagName.toLowerCase()==stg))&&(oNode.prefix.toLowerCase()==nms)) return 1;} else {if(oNode.tagName.toLowerCase()==tg||oNode.tagName.toLowerCase()==stg) return 1;}} else {if(oNode.tagName.toLowerCase()==tg) return 1;}} else if(c.substring(0,1)=="!") {var tN=c.substring(1,c.length);if(oNode.className==tN) return 1;} if(gID(oNode)==c.toLowerCase()||oNode.className==c.toLowerCase()) return 1;}} return 0;} function gID(oNode) {var id=""+oNode.id;return id.toLowerCase();} function gDA(c) {var a=document.getElementsByName(c);if(a==null) return new Array();if(typeof(a.length)=="undefined") {var b=new Array();b[b.length]=a;return b;} return a;} function cFIA(oNode) {if(oNode.nodeType==1&&oNode.id.toLowerCase()=="intellitxt") return 1;return 0;} function iIAry(a,obj) {for(var i=0,n=a.length;i0&&gHLN) for(var i=0;igMR) {dbM('Max run time exceeded: '+(dET-gDST),1);gDTo=true;gLD=true;ret=true;} if(gMNC) if(gNC>=gMNC) {dbM('Max nodes exceeded',1);gLD=true;ret=true;} return ret;} function iSA(oNode,ver,mode) {var id=0;try {id=(!oNode.id)?0:(oNode.id=="nointelliTXT");} catch(ex) {id=oNode.getAttribute("id")=="nointelliTXT";} if(oNode.nodeType==1&&(oNode.tagName=="SELECT"||oNode.tagName=="TEXTAREA"||oNode.tagName=="IFRAME"||oNode.tagName=="A"||oNode.tagName=="NOSCRIPT"||oNode.tagName=="NOEMBED"||(id)||iCNL(oNode,gSN))) {if(gDBL>0&&gHLN) hlN(oNode,"blue");return 1;} return 0;} function iAA(oNode,ver,mode){var id=0;try {id=(!oNode.id)?0:(oNode.id=="iAd");} catch(ex) {id=oNode.getAttribute("id")=="iAd";} if(oNode.nodeType==1&&(oNode.tagName=="SCRIPT"||oNode.tagName=="OBJECT"||oNode.tagName=="EMBED"||oNode.tagName=="IFRAME"||(id)||iCNL(oNode,gAN))) {return 1;} return 0;} function iIA(oNode,ver,mode){if(ver=="v1") {if(mode==1&&oNode.nodeType==3&&oNode.length>=mTL&&tmA(oNode.nodeValue).length>=mTL) {if(tmA(oNode.nodeValue).length>0) return true;}} else {if(oNode.nodeType==3&&((oNode.length>=mTL&&tmA(oNode.nodeValue).length>=mTL)||iCNL(oNode.parentNode,gUPN))) if(tmA(oNode.nodeValue).length>0) return true;} return false;} function gT(oNode) {try {return oNode.nodeValue;} catch(ex) {return'';}} function gES(evt) {if(evt.target) return(evt.target.nodeType==3)?evt.target.parentNode:evt.target;else return evt.srcElement;} function bx(x,y,w,h) {this.l=x;this.r=x+w;this.t=y;this.b=y+h;this.tp='';this.sw=0;} function cBB(o) {var b=new bx(0,0,0,0);if(!o)return b;var x=0,y=0,p=o;while(p.offsetParent) {x+=p.offsetLeft;y+=p.offsetTop;p=p.offsetParent;} b.l=x;b.t=y;b.r=x+o.offsetWidth;b.b=y+o.offsetHeight;b.tp=o.tagName;return b;} function ttV(evt) {if(!gSI) return false;var src=gES(evt);if(src.id=='iTt') if(evt.propertyName=='style.display') lAV(1,1);return true;} function lHk(dis,syis,adis,soid,kp) {var s='http://'+server+'/al.asp?ipid='+ipid+'&di='+dis+'&syid='+syis+'&adid='+adis+'&cc='+cc+'&rcc='+rcc+'&hk=1&ts='+t_s+'&so='+soid+'&mh='+gSID+'&pvu='+gPVU+'&pvm='+gPVM+'&ias='+itxtIas;if(''!=kp) s+='&kp='+kp;itxtLES(s);if(soid==9) dbM('IntelliTXT Edit Hook '+s,1);else dbM('IntelliTXT Hook '+s,1);itxtDSS(dis.length);} function itxtDSS(b) {dbM('gCSc= '+gCSc,1);dbM('gHSc= '+gHSc,1);if(b&&gHSc) {gCSc='';itxtLES(gHSc);gHSc='';} else {if(gCSc) {itxtLES(gCSc);gCSc='';}}} function lAV(av,on) {if(!gSI)return;var dLog=0;var a=fABDID(aAD,gDI);if(a!=null) {if(a.cav&&a.le&&a.lx) {a.le=0;a.lx=0;a.li=0;} if(document.getElementById("ttFM")||document.getElementById("ttFOM")) goT.f=1;if(goT.f&&((on&&(!a.le)&&(!a.lx)&&av==1&&(!a.llv))||(on&&(!a.le)&&(!a.lx)&&av==2&&a.llv)||((!on)&&a.le&&(!a.lx)))) {dLog=1;if(on) {goT.sFvt();} else {av=goT.gFvt();if(av<1000) dLog=0;}} else if((!goT.f)&&on&&((!a.le)&&(!a.lx)&&av==1)||((!a.li)&&av==2)) {dLog=1;} if(dLog) {var soid=(a.at==0?9:iSo);var s='';s='http://'+server+'/al.asp?ipid='+ipid+'&di='+a.ldid+'&syid='+a.syid+'&adid='+a.adid+'&cc='+cc+'&rcc='+rcc+'&av='+av+'&ts='+t_s+'&so='+soid+'&dmet='+gDM+'&mh='+gSID+'&ll='+a.ll+'&hbll='+a.hbll+'&id='+a.id+'&pvu='+gPVU+'&pvm='+gPVM+'&ias='+itxtIas;if(gDM) {if(a.idh.length)s+='&idh='+a.idh;} if(gKWPF) {var anchor=aDIDN[a.did];var bb=cBB(anchor);if(bb!=null) s+='&kp='+bb.l+','+bb.t;} itxtLES(s);if(on) {if(av==2) {a.li=1;dbM("LOG INTERACTION "+s,0);} else {a.le=1;dbM("LOG VIEW "+s,0);if(iTTV()) {if(gCLM==1) {sTc('ITXT_TTV',1,gED(365));gBSS=1;}}}} else {a.lx=1;dbM("LOG LEAVE "+s,0);}}}} function clFdbk(def,mw,al) {var re=/_IPID_/g;if(gFdCk==1||gFdBck==''||gTc("ITT_FEEDBCK")==1) return new Array(def,mw,al);else {gFdBck=gFdBck.replace(re,ipid);var imgLoc=RimC('logo_feedback.gif',"");var stI=' style="padding:0px 0px;margin:0px 0px;background:inherit;border:none;display:inline;height:18px;" ';var d=(gFdBck.indexOf('?')==-1)?'?':'&';var lgv='http://'+server+'/al.asp?ipid='+ipid+'&ts='+t_s+'&mv=***&cf='+iCF+'&so='+iSo+"&mt=";var href=lgv.replace('***',encodeURIComponent(gFdBck))+48;var anc='feedback';return new Array(anc,(mw-50),(al+60));}} function fdCL(url) {var win=window.open(url,'_blank');try {win.focus();} catch(ex) {document.location=url;} sTc('ITT_FEEDBCK',1,gED(30));ttH(1);} function clsSV(url) {var sv=document.getElementById("itTSuv");if(sv) {sv.style.display="none";if(url!="") {itxtLES(url+"42");dbM("LOG SURVEY CLOSE "+url+"42",0);} sTc("ITT_SURVEY",1);}} function dSu(at) {if(gTc("ITT_SURVEY")==1||gSVURL==""||gSVIMG=="") return;var arURL=gSVURL.split("|"),arIMG=gSVIMG.split("|");if((!arURL[at-1])||(!arIMG[at-1])) return;if((arURL[at-1]!="")&&(arIMG[at-1]!="")&&(!document.getElementById("itTSuv"))) {var dw=250,dh=215,win=getWin(),w=(win.r-win.l)/2,h=(win.b-win.t)/2,cw=68,ch=33,url=arURL[at-1],img=arIMG[at-1];var lgv='http://'+server+'/al.asp?ipid='+ipid+'&ts='+t_s+'&mv='+encodeURIComponent(url)+'&cf='+iCF+'&so='+iSo+'&ias='+itxtIas+"&mt=";s='';var div=document.createElement("div");var close='';div.innerHTML=s+close;div.id="itTSuv";h=h-(dh/2);w=w-(dw/2);var arAv,st=0,ar=new Array(),ol,olw,olh;ar[0]=new bx(w,h,dw,dh);for(var k=0;kLOG SURVEY LOAD "+lgv+"40",0);}} function kwC2(e,s) {var a=gES(e);a.href=s;a.target=gDI;} var gLLtid;function kwC(cm,so,evt,sc,ti) {var isVis=iTTV();var ttd=(gTTD>=1000?gTTD:750);if(!gSI) return false;if(evt!=null) {var nn=gES(evt);if((nn.nodeName.toLowerCase()=="embed")||(nn.nodeName.toLowerCase()=="object")) {return;} if(!sc) {evt.cancelBubble=true;if(evt.stopPropagation)evt.stopPropagation();}} dbM('cm:'+cm+' so:'+so,1);if(giPh&&so==10) return;var now=(new Date()).getTime();if(1!=cm) {if((iTTV())||(gBSS)) {if(2==cm||cm>=1000) {var minT=(cm>=1000?cm:ttd);if(now-gMEKWT0) {var s=gTU;var a=fABDID(aAD,gDI);s+="&ttv="+isVis;if(!sc) {if(now-a.ct<10000) {dbM('Too soon 2');return false;} a.ct=now;} if(a.ll&&(!a.hbll||now-gMEKWT<100)) {s+="&llip=1";if((ti+=250)<5000) {dbM('LL:Too soon, retry in 250ms');gLLtid=window.setTimeout("kwC("+cm+","+so+",null,1,"+ti+");",250);return false;}} else s+="&llip=0";ti=0;if(a.ll&&a.hbll&&a.llcr&&a.at==4) {dbM('Blocked',1);return false;} if(a.at==0) s+='&so=9';else s+='&so='+so;s+='&hbll='+a.hbll;s+='&pvu='+gPVU+'&pvm='+gPVM;if(a.at==0&&(13==so||10==so)) {if(10==so&&'2'!=a.adx&&a.adx.length) {if('1'==a.adx) {var itt=document.getElementById("iTt");if(null!=itt) {var aa=itt.getElementsByTagName('A');var vmc=/\&redir=/;for(var blah=0;blah-1) s+='&vt='+fpr;var bBl=0;try{dSu(a.at);var swName='swnd_'+Math.floor(Math.random()*50);oCh=window.open(s,swName,gWO);oChU=s;ttH(1);if(a.at==0&&13==so&&iesfid.length>0) {if(kv=="") eval('document.'+iesfid+'.'+iesfin+'.value="'+a.c+'"');else eval('document.'+iesfid+'.'+iesfin+'.value="'+kv+'"');eval('document.'+iesfid+'.target="'+swName+'"');eval('document.getElementById("'+iesfig+'").click()');}} catch(e){bBl=1;} if(oCh) {window.setTimeout(chO,50);bBl=0;} else bBl=1;if(bBl) document.location=s;} else dbM('no gTU');return false;}} return false;} var oCh;var oChU;function chO() {var bBl=0;if(oCh&&!oCh.closed) bBl=0;else bBl=1;if(bBl) document.location=oChU;} function gCW(oNode) {return(gBVType=="msie")?oNode.clientWidth:oNode.offsetWidth;} function gCH(oNode) {return(gBVType=="msie")?oNode.clientHeight:oNode.offsetHeight;} function trims(str,br,sz,nbr){var rtnStr="";var subStr="";var cbr=0;if(str.length>sz){var wdAr=str.split(" ");for(var i=0;((i75?75:true);max-width:75px;height:expression(this.height>75?75:true);max-height:75px;';a[10]='width:expression(this.width>100?100:true);max-width:100px;height:expression(this.height>100?100:true);max-height:100px;';a[11]=m+':0px 0px;';a[12]='float:none !IMPORTANT;';a[13]=m+':-1px -1px 0px -1px;';a[14]=m+'-top:-1px;';a[15]=p+':0px 0px;'+bc+':transparent;line-height:normal;border-top:solid 1px black;';a[16]=fs+':1px;display:block;height:1px;';a[17]='border-left:1px solid #000000;border-right:1px solid #000000;';a[18]='overflow:hidden;';a[19]='line-height:normal;display:block;border-bottom:none;'+ta+':left;';a[20]=p+':7px 7px;';a[21]=p+':0px 0px;';a[22]='border:none;'+bc+':transparent;';a[23]='line-height:normal;';a[24]='vertical-align:top;'+ta+':left;';a[25]=p+':7px 7px 2px 7px;';a[26]='vertical-align:top;';a[27]='table-layout:auto;';a[28]=bc+':transparent;';a[29]=p+':7px 0px 0px 0px;';a[30]=b+':inherit;border:none;display:inline;';a[31]='border-style:none;cursor:pointer;';a[32]='position:relative;width:100%;';a[33]=p+':7px 0px;';a[34]='z-index:9999;cursor:pointer;font-family:Verdana,Arial,Helvetica;margin:0px 0px;';a[35]='vertical-align:top;'+ta+':left;';a[36]='vertical-align:middle;'+ta+':left;';a[37]='background:#eeeeee;';a[38]='width:auto;';a[39]='';a[40]=p+':0px 0px 10px 0px;';a[41]=p+':10px 0px 0px 0px;';a[42]=p+':7px 7px 3px 0px;';a[43]=p+':9px 0px 3px 0px;';a[44]='vertical-align:bottom;';a[45]=ta+':left;'+p+':5px 5px 5px 0px;';a[46]=fs+':1px;display:block;height:1px;overflow:hidden;';a[47]=ta+':left;line-height:15px;color:#000000;padding-bottom:0px;';a[48]='color:#3300bb;text-decoration:none;';a[49]=fs+':11px;font-family:Arial,Verdana,Helvetica;';a[50]='vertical-align:center;'+ta+':left;';a[51]=ta+':left;vertical-align:bottom;';a[52]=ta+':right;';a[53]='line-height:15px;color:#000000;';a[54]=ta+':left;'+p+':0px 5px 5px 0px;';a[55]='border-bottom:1px dotted #ff6600;';a[56]='border-bottom:1px dotted #000099;';a[57]=p+':7px 2px 7px 0px;';a[58]=p+':7px 2px 7px 7px;';a[59]=ta+':center;'+p+':7px 5px 0px 5px;';a[60]='float:right;';a[61]=m+':0px 6px;';a[62]=m+':0px 4px;';a[63]=m+':0px 2px;';a[64]=m+':0px 1px;';a[65]='border-width:0px 2px;';a[66]=b+':#000000;';a[67]='';a[68]='';a[69]='';a[70]='';a[71]='';a[72]='';a[73]='';a[74]='';a[75]='';a[76]='';a[77]='';a[78]='';a[79]='';a[80]='';a[81]='';a[82]='';a[83]='';a[84]='';a[85]='';a[86]='';a[87]=a[86]+a[17]+a[18];a[88]='';a[89]='';a[90]='';a[91]='';a[92]='width:100%;';a[93]=a[0]+a[3]+a[2];a[94]=a[0]+a[6]+a[7];a[95]=a[0]+a[4]+a[5];a[96]=a[22]+a[11]+a[27]+'height:auto;';a[97]=a[21]+a[22]+a[23];a[98]=a[28]+a[21];a[99]=a[21]+a[11]+a[30];a[100]='width:***px;';a[101]='';a[102]='';a[103]='';a[104]='';a[105]='cursor:move;';a[106]=p+':0px 0px 0px 0px;';a[107]='background:#dae8f0;';a[108]=p+':0px 7px 0px 7px;';a[109]=a[33]+a[22]+a[23];a[110]='width:expression(sigw(this));max-width:100px;height:expression(sigh(this));max-height:100px;';a[111]=m+':0px 0px 0px 0px;';return a;} function sigw(i){if(i.width<100&&i.height<100){return"";} if(i.width>i.height) return"100";return"true";} function sigh(i){if(i.width<100&&i.height<100){return"";} if(i.height>=i.width) return 100;return"true";} function evA(tlc) {var a=new Array();a[0]='onMouseOver="this.style.textDecoration=\'underline\';this.style.color=\''+tlc.ttht+'\';" onMouseOut="this.style.textDecoration=\'none\';this.style.color=\''+tlc.tttc+'\';"';a[1]='onMouseOver="this.style.textDecoration=\'underline\';this.style.color=\''+tlc.ttha+'\';" onMouseOut="this.style.textDecoration=\'none\';this.style.color=\''+tlc.ttac+'\';"';a[2]='onclick="return false;"';a[3]='onclick="kwC(0,11,event,0,0);" oncontextmenu="return false;" onmouseover="kwM();" onmousemove="kwM();"';a[4]='onmousedown="MDn(event);" onmouseup="MUp(event);"';a[5]='onMouseOver="TMmov(event,1,***);" onMouseOut="TMmov(event,0,***);"';a[6]='oncontextmenu="return false;"';a[7]='onclick="kwC(0,***,event,0,0);"';a[8]='onclick="ttH(1);"';a[9]='onMouseOver="this.style.textDecoration=\'underline\';" onMouseOut="this.style.textDecoration=\'none\';"';a[10]='onError="src=\'http://***/images/1x1.gif\';" onLoad="rPs(this);"';a[11]='onMouseOver="TMmov(event,1,1);" onMouseOut="TMmov(event,0,1);"';a[12]='onclick="kwC(0,***,event,0,0);return false;" oncontextmenu="return false;" onmouseover="kwM();" onmousemove="kwM();"';a[13]='onMouseOver="this.style.color=\''+tlc.tthdc+'\';" onMouseOut="this.style.color=\''+tlc.ttdc+'\';"';return a;} function atO(t,ast,tlc) {if(t==0) this.a=inS(tlc);else if(t==1) this.a=evA(tlc);else this.a=new Array();this.v=function(i) {var va,st="";var mk=/\*\*\*/g;var ad=i.split(",");var rtn="";for(var c=0;(c0&&t!=0)?rtn+" "+st:rtn+st;} return((ast)?' style="'+rtn+'" ':rtn);};} function TMmov(ev,on,cbg) {if(gFAint!=0) {window.clearInterval(gFAint);gFAint=0;} goT.sMO(ev,on);var n=goT.gMO();if(n==1) {cAT();if(cbg) cBG('itt_table',1);lAV(2,1);} else if(n==0) {if(cbg) cBG('itt_table',0);ttL(goT.a.tthd);}} function oFL(id,w,h,nd,url) {this.id=id;this.w=w;this.h=h;this.nd=nd;this.url=url;} function oTTH(evt) {var df=null;var fvt=null;var mo=0;var cmo=0;this.sAd=function(a,gCols) {if(a&&gCols) a.sCol(gCols);this.fl=null;this.f=0;this.sbg=0;this.a=a;this.fi='';this.d1=0;this.d2=1;this.w=300;this.fa=0;this.mt=-1;this.fr='';this.lmbt=1;this.bx=null;gAC=0;if(a==null) this.bg=new Array('','');else this.bg=new Array(a.ttbg,a.tthv);if(df!=null) this.rDF();mo=0;cmo=0;};this.sEv=function(ev) {this.win=getWin();if(ev) {this.el=gES(ev);this.mpos=getMPos(ev,this.win);} this.mpos2=null;};this.sMP=function(i,ev) {if(i==1) {this.mpos=getMPos(ev,this.win);} else this.mpos2=getMPos(ev,this.win);};this.sDF=function() {df=new Array(document.onmousemove,document.onmouseup,document.onselectstart);};this.rDF=function() {if(df!=null) {document.onmousemove=df[0];document.onmouseup=df[1];document.onselectstart=df[2];df=null;}};this.sFvt=function() {fvt=new Date().getTime();};this.gFvt=function() {if(this.f&&fvt!=null) {var n=new Date().getTime();return(n-fvt);} else {return 0;} fvt=null;};this.sMO=function(ev,on) {if((goT!=null&&goT.fl!=null&&goT.fl.id=='ttFOM')||(gBVType=="opera"&&gBVVersion<90)) {mo=on;return;} if(ev==null) {dbM("NO EV",0);mo=on;} else if(on||!this.d2) {mo=1;} else if(this.bx!=null) {var mp=getMPos(ev,this.win) ; var bxmoe=new bx(this.bx.l+5,this.bx.t+5,(this.bx.r-this.bx.l)-20,(this.bx.b-this.bx.t)-20);if(gBVType=="netscape") var bxmoe=new bx(this.bx.l,this.bx.t,(this.bx.r-this.bx.l)-7,(this.bx.b-this.bx.t)-7);if((inBox(mp,bxmoe,0))||((mp[0]==-1)&&(mp[1]==-1))) {mo=1;} else {mo=0;}} if(mo) cmo++;else cmo=0;};this.gMO=function() {if(goT!=null&&goT.fl!=null&&goT.fl.id=='ttFOM'||(gBVType=="opera"&&gBVVersion<90))return mo;if((mo==1&&cmo==1)) {return 1;} else if(mo==0&&cmo==0) {return 0;} else {return-1;}};this.sAd(null,null);this.sEv(evt);} function giTt(evt,id) {var iTt=document.getElementById("iTt");var cont='';if(iTt==null) {iTt=document.createElement("span");iTt.id="iTt";iTt.style.zIndex=9999;iTt.style.display="none";iTt.style.position="absolute";iTt.style.border="none";iTt.style.background="transparent";iTt.style.textAlign="left";iTt.onpropertychange=(gBVType=="msie")?new Function("ttV(event);"):new Function("event","ttV(event);");if(!id) document.body.appendChild(iTt);goT=new oTTH(evt);} if(id) {cont=document.getElementById(id);if(cont) {cont.innerHTML='';cont.appendChild(iTt);}} return iTt;} function ttS(evt,d) {if(!gSI) return;var a=fABDID(aAD,d);if(a==null)return;if(a.llip)return;var iTt=giTt(evt);if(a.did!=gDI) {ttH(1);} else if(iTt.style.display=="block") return;var rn=new Date().getTime();var fcM='',fE='';if(a.ll) {if(!a.hbll||(rn-a.lldt)>=a.pxe) {gDI=a.did;a.llip=1;a.hbll=0;dbM(fcM+'LL:'+d+fE,1);prepiTt(evt,d);var rfrurl=document.location.href.replace(/\&/g,'%26').replace(/\'/g,'%27').replace(/\"/g,'%22');var llurl='http:/'+'/'+server+'/v3/look.jsp?ipid='+ipid+'&did='+d+'&syid='+a.syid+'&cc='+cc+'&rcc='+rcc+'®='+itxtreg+'&dma='+itxtdma+'&sid='+gSID+'&auat='+gAUAT+'&fo='+gFO+'&pvu='+gPVU+'&pvm='+gPVM;itxtLES(llurl);dbM(fcM+'Called:'+llurl+fE,1);} else {prepiTt(evt,d);dbM(fcM+'Not expired'+fE,1);}}else{prepiTt(evt,d);dbM('LL=0',1);if(gAUAT>0){try {audit('Keyword: '+a.k+'',1);audit('NOT A Yahoo AD!


',1);}catch(e){}}} var z=(a.ttd>0?a.ttd:gTTD>=1000?50:gTTD);window.setTimeout("mTTV();",z);} function mTTV() {if(iTTV()) return;if(iTT||!iTTC) {document.getElementById('iTt').style.display='block';sFFF();lAV(1,1);}} function iTTV() {var o=document.getElementById('iTt');if(null!=o) if('block'==o.style.display) return 1;return 0;} function rPs(nd) {if(nd.height>0||nd.style.height>0) {if(typeof(_ITTdemo)!="undefined") {fR(1,-1,1);} else {nd.onload=("return false;");fR(1,gDI,1);}}} function fClick(v) {dbM("fClick Called",0);dSu(goT.a.at);ttH(1);} function prepiTt(evt,d,ad){var a=fABDID(aAD,d);var ll=0;var iTt=null;if(ad) {a=ad[0];iTt=giTt(evt,ad[1]);} else iTt=giTt(evt);if(a==null)return;if(typeof(gTlpC)=="undefined") gTlpC=null;goT.sAd(a,gTlpC);if(evt!=null) goT.sEv(evt);else ll=1;dbM('prepiTt d='+d,1);var ht=badHT(a,d,ll);if(ht!=null) {var sHTML=ht[0];iTt.innerHTML=impR(sHTML,a.rat);var w=(a.w>0)?(a.w+10):goT.w;iTt.style.width=w+"px";var ttbx=document.getElementById("tooltipbox");if(ttbx) ttbx.style.width=(w-10)+"px";if(gDBL>0) dbST=new Date().getTime();fshH(ht[1],ht[2],ht[3],ht[4],a);gFO=ht[4];if(a.multi) {rPad();var mtbl=document.getElementById('cZn1'),tb=mtbl.childNodes[0];if('TABLE'==tb.nodeName) {tb.id='xzTTTB';tb.onmouseover=(gBVType=="msie")?new Function("cBG2(\'xzTTTB\',1,event);"):new Function("event","cBG2(\'xzTTTB\',1,event);");tb.onmouseout=(gBVType=="msie")?new Function("cBG2(\'xzTTTB\',0,event);"):new Function("event","cBG2(\'xzTTTB\',0,event);");var tds=tb.getElementsByTagName('TD');if(tds.length>0) tds[0].style.paddingTop="7px";}} cBG('itt_table',0);if(iDAH>0) {var s=iTt.innerHTML;dbM("
"+s.replace(larE,'<').replace(garE,'>')+"
",1);} fR(ll,a.did,0,a);if(gDBL>0) {dbET=new Date().getTime();dbM('fR Elapsed time: '+(dbET-dbST)+' ms.');} lIF();} gDI=a.did;gSYI=a.syid;gADI=a.adid;gDM=a.dmet;} function gWTU(at) {var log='?ipid='+ipid+'&cc='+cc+'&server='+server,u;if(at==0) {if(''==sIEWTU) u='http://www.vibrantmedia.com/whatisIntelliTXT/siteResults_english.asp'+log;else u=sIEWTU;} else {if(''==sWTU) u='http://www.vibrantmedia.com/whatisIntelliTXT.asp'+log;else u=sWTU;} return u;} function gFLTK(a) {return('http://'+server+'/al.asp?ipid='+ipid+'&di='+a.ldid+'&syid='+a.syid+'&adid='+a.adid+'&ts='+t_s+'&dmet='+gDM+'&mh='+gSID+'&pvu='+gPVU+'&pvm='+gPVM+'&ias='+itxtIas);} function _tpHdr(a) {var b='',hdr='',s1=new Array(),wtu=gWTU(a.rat),std='padding:0px 0px;border:none;background-color:transparent;line-height:normal;margin:0px 0px;',st88='font-size:1px;display:block;height:1px;border-left:1px solid #545454;border-right:1px solid #545454;overflow:hidden;background:';s1[0]='#545454;margin:0px 6px;';s1[1]='#CACACA;margin:0px 4px;border-width:0px 2px;';s1[2]='#F6F6F6;margin:0px 2px;border-width:0px 2px;';s1[3]='#E8E8E8;margin:0px 2px;';s1[4]='#E0E0E0;margin:0px 1px;';s1[5]='#DBDBDB;margin:0px 1px;';s1[6]='#D9D9D9;margin:0px 0px;';s1[7]='#D7D7D7;margin:0px 0px;';s1[8]='#D7D7D7;margin:0px 0px;';s1[9]='#D8D8D8;margin:0px 0px;';s1[10]='#CFCFCF;margin:0px 0px;';s1[11]='#B2B2B2;margin:0px 0px;';s1[12]='#B5B5B5;margin:0px 0px;';s1[13]='#B9B9B8;margin:0px 0px;';s1[14]='#BFBFBB;margin:0px 0px;';s1[15]='#C5C5BF;margin:0px 0px;';s1[16]='#CBCBC2;margin:0px 0px;';s1[17]='#D2D2C4;margin:0px 0px;';s1[18]='#D8D8C7;margin:0px 0px;';s1[19]='#DBDBC8;margin:0px 0px;';s1[20]='#AAAAA8;margin:0px 0px;';if(giPh) b+='
Vibrant AdVibrant AdVibrant Ad
';else for(var i=0;i
';} var d1txt='',d1st=' style="line-height:normal;border:none;z-index:5001;color:#5E5E5E;font-size:9px;font-family:verdana,arial,helvetica;font-weight:bold;" ',bd='';if(giPh) bd='Vibrant Ad';else bd='Vibrant Ad';mw=120,al=50;if(0==a.rat) {d1txt=iett;bd='Vibrant Ad';} else if(9!=a.rat&&35!=a.rat) {d1txt=sspl;if(gFdBck!='') {var ar=clFdbk(bd,mw,al);bd=ar[0];mw=ar[1];al=ar[2];}} if(giPh) {hdr+='
' ; hdr+='';hdr+='';hdr+='';hdr+='
'+d1txt+'
' ; hdr+='
'} else {hdr+='
';hdr+='';hdr+='';hdr+='';hdr+='
'+d1txt+'
';hdr+='
';} hdr+='
';hdr+='
';hdr+=bd;if(giPh) {hdr+=''+swti+'';hdr+=''+scls+'';} else {hdr+=''+swti+'';hdr+=''+scls+'';} hdr+='
';return b+hdr;} function btHLT(o,on) {var s=o.src;o.src=(on)?s.replace('_off','_on'):s.replace('_on','_off');} function sSWH(w,h) {var shdw=document.getElementById("ttShadow");if(shdw) {shdw.style.width=w+"px";shdw.style.height=h+"px";shdw.childNodes[0].style.width=w+"px";shdw.childNodes[0].style.height=h+"px";}} function RimC(img,cc) {var imgCk=img;if(gImC==null) gImC=new Array();var spc='http://images.intellitxt.com/ast/spacer.gif';var imgLoc='http://images.intellitxt.com/ast/ttips/1/';if(typeof(cc)!="string") cc='';if(img=="") img=spc;else if(cc!='') img=imgLoc+cc+'/'+img;else img=imgLoc+img;for(var i=0;i=0) return img;} var imgO=new Image();imgO.src=img;gImC[gImC.length]=imgO;return img;} function olW(w,o) {var i=0;var w2=w;var ar=new Array();var chk=o.getElementsByTagName("OBJECT");for(i=0;iw2) w2=gCW(ar[i]);} w2=(w2>w)?w2:w;return w2+10;} function rTT(a) {var spc=document.getElementById('itspc'),sch=document.getElementById('itspcsch'),divI=document.getElementById('ttlm');if(spc) spc.style.height="0px";if(divI) divI.style.display="none";var iTt=document.getElementById('iTt'),ttbx=document.getElementById('tooltipbox'),w=gCW(iTt),h=gCH(iTt),ht=200,wt=300,dIh=50,adH=(a.rat==1||a.rat==2||a.rat==3||a.rat==36||a.rat==37||a.rat==49);if(a.rat!=23&&a.rat!=45&&!(a.ll==1&&a.llip==1)) wt=olW(a.w,ttbx);if(a.w>0&&!(a.ll==1&&a.llip==1)) {ht=h;if(adH) {ht=150;dIh=35;}} if(hdIh&&spc&&a.tl.length==0&&(goT!=null&&goT.lmbt==1)) {if(!divI) {divI=document.createElement('div');divI.innerHTML='';divI.id='ttlm';var cLM='position:absolute;right:25px;bottom:30px;margin:0px 0px;padding:0px 0px;width:auto;background:inherit;';sSTY(divI,cLM);divI.style.zIndex=5003;iTt.appendChild(divI);} else {divI.style.display="block";}}} if(iTt&&ttbx) {if(w0) {iTt.style.width=wt+"px";ttbx.style.width=(wt-10)+"px";} else if(w==wt&&goT.mt!=-1) {iTt.style.width=(wt+10)+"px";ttbx.style.width=wt+"px";}} sSWH(gCW(ttbx),gCH(ttbx));} function _tpShad(x,y,w,h) {var st='
';return st;} function fPlyRt() {if(goT.fa==0)return;var f=document.getElementById("ttFM");var pr=-1;try {if(f) {pr=f.GetVariable("jsPlayRate");return(pr?pr:-1);} else return-1;} catch(ex) {return-1;}} function badHT(a,d,ll) {var st=new atO(0,0,a);var stt=new atO(0,1,a);var ev=new atO(1,0,a);var flash="";var flV="6";var fes="";var fO=0;var ofg=null;var sHREF='http://'+server+'/al.asp?ipid='+ipid+'&cc='+cc+'&rcc='+rcc+'&ias='+itxtIas;if(a.cv.length)sHREF+='&cv='+a.cv;if(iCF)sHREF+=('&cf='+iCF);sHREF+='&di='+a.ldid;sHREF+='&ts='+t_s+'&dmet='+a.dmet;if(gSID.length)sHREF+='&mh='+gSID;if(a.syid)sHREF+='&syid='+a.syid;if(a.adid)sHREF+='&adid='+a.adid;if(a.id.length)sHREF+='&id='+a.id;if(a.idh.length)sHREF+='&idh='+a.idh;sHREF+='&ll='+a.ll;gTU=sHREF;dbM(a.dt+':'+a.at+':'+a.rat+':'+d+'='+a.k+'->'+sHREF+'',1);var vmcrE=/_VM_CLICK_/g;var vmTS=/_TIMESTAMP_/g;var vmcrA=/ href=/gi;var w75s=stt.v("9")+'border="0"';var w100s=stt.v("10")+'border="0"';if(a.dt==4) {a.t=sRPC(a.t);a.tt=sRPC(a.tt);} var latt=trims(a.a,'
',25,-1);if(13==a.rat) latt=a.a;if((5==a.at||12==a.at)&&a.tt.length==0) a.tt=a.t;if(a.ll==1&&a.llip==1) a.t=ssch;var spcI='',f4='',f5='',a1='

'+trims(a.t,'...',60,1)+'

',a2=''+a.a+'',a3=''+spcI+latt+'',a4=''+latt+'',tt1=a.tt.length>0?'

'+trims(a.tt,'...',150,1)+'

':'',tt2='

'+a.tt+'

',st1=''+a.a+'',st2=''+sbn+'',att1=''+a.tt.replace(vmcrE,gTU+'&redir=').replace(vmcrA,' target="_blank" href=')+'

',cc_co=(a.rat==6)?(a.co+sCC):(sCC+a.co),scc1=''+cc_co+'',sPD1=stt.v("97"),sPD2=stt.v("109"),sPD5=stt.v("15"),sVAt=' valign="top"',sTR1='',sTD1='',sTD2='',sTB1=''+cc_co+'';else if(5==a.rat) scc1='
'+sCC+a.co+'
';else if(21==a.rat) scc1='
'+sCC+a.co+'
';else if((12==a.rat)&&('fr'==cc)) {if("1"==a.adx) scc1='
'+sCC+a.co+'
';else scc1='
'+sCC+a.co+'
';} var sHTML2='';sHTML2+='
';if(0==a.rat) {sHTML2+='';sHTML2+=_tpHdr(a);sHTML2+=sTDR;sHTML2+='';sHTML2+=f4;sHTML2+='';if(iert.length>0) sHTML2+=''+sTDR;sHTML2+='';sHTML2+=sTB1+' '+sCP0+'>';var vmieRE=/_KEYWORD_/g;sHTML2+=a.tt.replace(vmcrE,gTU+'&redir=');sHTML2+=sTBL+spcI;sHTML2+=sTDR;if(sIEFH.length>0) {sHTML2+='';sHTML2+=sTB1+' '+sCP0+'>';sHTML2+=sIEFH.replace(vmcrE,gTU+'&redir=').replace(vmieRE,a.k);sHTML2+=sTBL+sTDR;} if(iessu.length>0) {var vmieRE2=/IMG/g;sHTML2+='';sHTML2+='';} else if(11==a.rat) {sHTML2+='';sHTML2+=f5;sHTML2+='';sHTML2+=sTR1+sTD1+a1+sTDR;sHTML2+='';sHTML2+=sTB1+sCP0+'>';sHTML2+=sTR1+sTD2;if(a.tl) sHTML2+='' ; if(a.adx) sHTML2+='';sHTML2+=tt1+sTDR;sHTML2+=sTBL;sHTML2+=sTR1+sTD1+a3+sTDR;sHTML2+=sTBL;sHTML2+='';sHTML2+='';} else if(13==a.rat) {var sTL=a.adx;sHTML2+='';sHTML2+=f4;sHTML2+='';if(a.tl.length==0) if('uk'==cc) a.tl='http://images.intellitxt.com/ast/vmimages/logo_ebay_uk_100.gif';else a.tl='http://images.intellitxt.com/ast/vmimages/logoEbay_120x65.gif';var sImgURI='';if(a.tt.length>0) {sHTML2+=sTR1+''+a1+sTDR;sHTML2+=sTR1+'';sHTML2+=sImgURI;sHTML2+=tt1+sTDR;} else {sHTML2+=sTR1+'';sHTML2+=sImgURI;sHTML2+=a1+sTDR;} sHTML2+='';var cost=a.co,pmsg='Price',emsg=sEet;if('de'==cc) {var blah=/\./g;cost=a.co.replace(blah,',');pmsg='Aktuell';emsg='Endet';var days=/days/g;sTL=sTL.replace(days,'Tage');var day=/day/g;sTL=sTL.replace(days,'Tag');var h=/h/g;sTL=sTL.replace(h,'Std');var m=/m/g;sTL=sTL.replace(m,'Min');} sHTML2+=sTB2+'>'+spcI+pmsg+': '+sCC+' '+cost+'';sHTML2+=''+latt+'';sHTML2+='
'+iert+':
';flash=a.tl;fes=a.c;ofg=oFG(flash,'hspace="0" vspace="0" valign="absmiddle"',fes,a.rat);sHTML2+=ofg[0];sHTML2+='';sHTML2+=sTBL;sHTML2+=sTDR;} else {sHTML2+='';sHTML2+=_tpHdr(a);sHTML2+=sTDR;if(8==a.rat||32==a.rat||46==a.rat||34==a.rat||38==a.rat||39==a.rat) {sHTML2+='';sHTML2+=f5;sHTML2+='';sHTML2+='';sHTML2+=sTB1+' '+sCP0+'>';sHTML2+='';flash=a.tl;fes=a.c;ofg=oFG(flash,'hspace="0" vspace="0" valign="absmiddle"',fes,a.rat);sHTML2+=ofg[0];sHTML2+='';sHTML2+=sTBL+sTDR;sHTML2+=sTBL+sTDR;} else {if(a.ll==1&&a.hbll==0&&a.t=="Searching...") {var mht=(gBVType=="firefox")?58:68;sHTML2+='';sHTML2+=f5;sHTML2+='';sHTML2+='' ; sHTML2+='';sHTML2+='
 ';sHTML2+=sTB1+' '+sCP0+'>';sHTML2+='
';sHTML2+=a1;sHTML2+='
';sHTML2+='
';sHTML2+='
'+emsg+': '+sTL+''+sTDR+sTBL;sHTML2+=sTDR;sHTML2+='';sHTML2+='';sHTML2+='';sHTML2+=sTDR;sHTML2+='';sHTML2+=sTB1+'>';sHTML2+='
';sHTML2+=sTDR;sHTML2+=sTBL+sTDR;} else if(16==a.rat) {var sAdX=a.adx.split("$$$");var sNTcu=sAdX[0];sHTML2+='';sHTML2+=f4;sHTML2+='';if(a.tt.length>0) sHTML2+=sTR1+''+a1+sTDR;sHTML2+=sTR1+'';sHTML2+=sTB1+'>';if(a.tt.length>0) sHTML2+=''+tt1+'';else sHTML2+=''+a1+'';var imgURI=a.tl;var noimg=/no_image_/i;if(imgURI.length==0||imgURI.match(noimg)) {imgURI=a.ml;} else sHTML2+='';sHTML2+=''+a3+sTDR;sHTML2+=''+sTDR;sHTML2+='';sHTML2+=sTB1+'>';if(a.co.length>0) {sHTML2+='';sHTML2+=''+sCC+a.co+'';} sHTML2+=''+sTDR;sHTML2+=sTBL+sTDR;} else if((6==a.rat)&&("1"==a.adx)) {sHTML2+='';sHTML2+=f4;sHTML2+='';if(a.tt.length>0) sHTML2+=sTR1+''+a1+sTDR;sHTML2+=sTR1+'';sHTML2+=sTB1+'>';if(a.tt.length>0) sHTML2+=''+tt1+'';else sHTML2+=''+a1+'';var imgURI=a.tl;var noimg=/no_image_/i;if(imgURI.length==0||imgURI.match(noimg)) {imgURI=a.ml;sHTML2+='';} else sHTML2+='';sHTML2+='';if(a.co.length>0) {sHTML2+=''+a3+'';sHTML2+=''+cc_co+'';} sHTML2+=''+sTDR;sHTML2+=sTBL+sTDR;} else if(0!=a.co.length&&iTTp==0) {sHTML2+='';sHTML2+=f4;sHTML2+='';if(0==a.tt.length) {if(a.tl.length>0) {sHTML2+='';sHTML2+=''+a1+'';sHTML2+='';sHTML2+='';sHTML2+=''+spcI+'';sHTML2+='';if(a.a.length>0) sHTML2+=''+st1+'';else sHTML2+=''+st2+'';if(a.rat!=28) {sHTML2+=''+scc1+'';} sHTML2+='';} else {sHTML2+='';sHTML2+='';sHTML2+=a1+'';sHTML2+='';sHTML2+='';if(a.a.length>0) sHTML2+=''+st1+'';else sHTML2+=''+st2+'';if(a.rat!=28) {sHTML2+=''+scc1+'';} sHTML2+='';}}else{if(a.tl.length>0){sHTML2+=sTR1;sHTML2+=''+a1+'';sHTML2+='';sHTML2+=sTR1+''+tt1+''+sTDR;sHTML2+=sTR1+''+spcI+sTDR;} else{sHTML2+=sTR1;sHTML2+=''+a1+'';sHTML2+='';sHTML2+=sTR1+''+tt1+sTDR+''+spcI+'';} sHTML2+=sTR1;if((a.rat==12)&&("1"==a.adx)) sHTML2+=''+scc1+'';else {if(a.a.length>0) sHTML2+=''+st1+'';else sHTML2+=''+st2+'';} if(49==a.rat||50==a.rat||((a.rat!=28)&&(a.rat!=12)&&(""!=a.adx))||((a.rat==12)&&("1"!=a.adx))||(a.rat==6)) {sHTML2+=''+scc1;} sHTML2+=sTDR;} if(a.multi) {var ma=a.adx.split('$$');if(ma.length>0) {sHTML2+=''+sTB1+' '+sCP0+'id="xzTT" width="100%">';var evts='';for(var i=0;i';if(21!=a.rat) sHTML2+=''+trims(fields[0],'...',35,1)+'';else sHTML2+=' ';sHTML2+='';sHTML2+=''+fields[1]+'';var prc=(a.rat==6)?(fields[2]+sCC):(sCC+fields[2]);sHTML2+='
'+prc+'';if(5==a.rat) sHTML2+='';if(21==a.rat) sHTML2+='';sHTML2+='
';sHTML2+='';if(i';sHTML2+='';sHTML2+='';sHTML2+=sTDR;}} goT.lmbt=0;}} sHTML2+=sTBL;sHTML2+='';sHTML2+='';if(a.rat==28) {var i1='',i2=''+cc_co+'';sHTML2+=_tpSrch(st,i1,i2,'#eeeeee');}} else if(iTTp>0&&a.ml.length>0) {sHTML2+='';sHTML2+=f4;sHTML2+='';sHTML2+='';sHTML2+='' ; sHTML2+='' ; if(tt1.length>0) {sHTML2+='';sHTML2+=''+a1+'';sHTML2+=sTDR;sHTML2+='';sHTML2+=''+tt1+'';} else {sHTML2+='';sHTML2+=''+a1+'';} sHTML2+='';sHTML2+='';sHTML2+=sTDR;sHTML2+='';sHTML2+=''+a2+'';sHTML2+=''+scc1+'';sHTML2+='';sHTML2+=sTBL;sHTML2+=sTDR;sHTML2+=sTBL;sHTML2+=sTDR;} else {if((a.rat==48)&&!gFTTm.get(a.rat)) at48Tdy(a);var imgURI=gDLgImg(a.did,a.adid,a.syid,1);var pURI;if(a.rat==7||a.rat==23||a.rat==40||a.rat==41||a.rat==42||a.rat==45||a.rat==48||a.rat==52||a.rat==53||a.rat==54) pURI=a.tl;else pURI=gDLgImg(a.did,a.adid,a.syid,0);if(a.rat==7||a.rat==23||a.rat==40||a.rat==41||a.rat==42||a.rat==45||a.rat==48||a.rat==52||a.rat==53||a.rat==54||(pURI!='0'&&(iTTl&2)&&iTTp==1&&a.dt==4)) {sHTML2+='';sHTML2+=f4;sHTML2+='';sHTML2+=sTR1;sHTML2+=''+a1+'
';if(a.dt==4) sHTML2+=tt1+'';else sHTML2+=tt2+'';sHTML2+='';flash=pURI;fes=a.c;ofg=oFG(flash,'hspace="5" vspace="0" valign="absmiddle"',fes,a.rat);sHTML2+=ofg[0];sHTML2+='';sHTML2+='';sHTML2+=sTR1+''+((a.rat==23||a.rat==45)?a4:a3)+sTDR;sHTML2+=sTBL;sHTML2+='';sHTML2+='';goT.w=320;} else {sHTML2+='';sHTML2+=f5;sHTML2+='';if(a.tl.length>0) imgURI=a.tl;if(a.rat==15||a.rat==43||a.rat==44||a.rat==96) {sHTML2+=sTR1+'';flash=imgURI;fes=a.c;ofg=oFG(flash,((a.rat==96)?'height="70" width="260"':'height="60" width="234"')+sHVS0+sVAt+'',fes,a.rat);sHTML2+=ofg[0];sHTML2+=sTDR;} sHTML2+=sTR1+sTD1+a1+sTDR;sHTML2+='';sHTML2+=sTB1+sCP0+'>';if(((iTTl&1)&&1==a.di)||((iTTl&1)&&a.tl.length>0)||((iTTl&2)&&4==a.dt)) {if(a.rat==15||a.rat==43||a.rat==44||a.rat==96) sHTML2+=sTR1+sTD2+tt2+sTDR;else {sHTML2+=sTR1+sTD2+''+a.tt+'<\/p><\/td>';}} else sHTML2+=sTR1+sTD2+tt2+'';sHTML2+='
';sHTML2+=sTDR;sHTML2+=sTR1+sTD1+a3+sTDR;sHTML2+=sTBL;sHTML2+='';sHTML2+='';} if((a.rat==17&&!(gDASB&1))||(a.rat==25&&!(gDASB&2))) {i1='',i2=' ';sHTML2+=_tpSrch(st,i1,i2,'#dae8f0');}}}} if(a.rat==24||a.rat==21) {var sIMG=(a.rat==24?"SZ_poweredby_logo_RGB.jpg":"pg.jpg"),i1='',i2='';sHTML2+=_tpSrch(st,i1,i2,'#dae8f0');goT.w=310;} else if((96==a.rat)&&(''!=a.adx)) {var s=a.adx.split("$$"),ibw=190-(s.length>1?parseInt(s[2]):10),i2=' ';i1=((s.length>1)?(''):(''));sHTML2+=_tpSrch(st,i1,i2,s[0]);sHTML2+='';} sHTML2+='';if(giPh) {if(goT.w<310) goT.w=310;if(9!=a.rat&&35!=a.rat&&(96!=a.rat||''==a.adx)) sHTML2+='
Vibrant AdVibrant AdVibrant Ad
';} else {if((a.rat==17&&!(gDASB&1))||(a.rat==25&&!(gDASB&2))||a.rat==24||a.rat==21) sHTML2+='
';else if(a.rat==28||a.rat==24||a.rat==21) sHTML2+='';else if(9!=a.rat&&35!=a.rat&&(96!=a.rat||''==a.adx)) sHTML2+='';} sHTML2+=sTBL;if(a.rat==23||a.rat==45) sHTML2+='
'+goT.fi+'
';sHTML2+='';var sHTML3='';if(9==a.rat||35==a.rat) sHTML3='