examples.html 655 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Examples</title>
  5. <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.Contract 1.0.0">
  8. <link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.Contract 1.0.0">
  9. <link rel="prev" href="extras.html" title="Extras">
  10. <link rel="next" href="../reference.html" title="Reference">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="extras.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h2 class="title" style="clear: both">
  27. <a name="boost_contract.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a>
  28. </h2></div></div></div>
  29. <div class="toc"><dl class="toc">
  30. <dt><span class="section"><a href="examples.html#boost_contract.examples.__n1962___vector__contracts_for_stl_vector_and_comparison_with___n1962___proposed_syntax">[N1962] Vector: Contracts for STL
  31. vector and comparison with [N1962] proposed
  32. syntax</a></span></dt>
  33. <dt><span class="section"><a href="examples.html#boost_contract.examples.__n1962___circle__subcontracting">[N1962]
  34. Circle: Subcontracting</a></span></dt>
  35. <dt><span class="section"><a href="examples.html#boost_contract.examples.__n1962___factorial__recursion">[N1962]
  36. Factorial: Recursion</a></span></dt>
  37. <dt><span class="section"><a href="examples.html#boost_contract.examples.__n1962___equal__operators">[N1962]
  38. Equal: Operators</a></span></dt>
  39. <dt><span class="section"><a href="examples.html#boost_contract.examples.__n1962___sum__array_parameter">[N1962]
  40. Sum: Array parameter</a></span></dt>
  41. <dt><span class="section"><a href="examples.html#boost_contract.examples.__n1962___square_root__default_parameters_and_comparison_with_d_syntax">[N1962]
  42. Square Root: Default parameters and comparison with D syntax</a></span></dt>
  43. <dt><span class="section"><a href="examples.html#boost_contract.examples.__meyer97___stack4__comparison_with_eiffel_syntax">[Meyer97]
  44. Stack4: Comparison with Eiffel syntax</a></span></dt>
  45. <dt><span class="section"><a href="examples.html#boost_contract.examples.__meyer97___stack3__error_codes_instead_of_preconditions">[Meyer97]
  46. Stack3: Error codes instead of preconditions</a></span></dt>
  47. <dt><span class="section"><a href="examples.html#boost_contract.examples.__mitchell02___name_list__relaxed_subcontracts">[Mitchell02]
  48. Name List: Relaxed subcontracts</a></span></dt>
  49. <dt><span class="section"><a href="examples.html#boost_contract.examples.__mitchell02___dictionary__key_value_map">[Mitchell02]
  50. Dictionary: Key-value map</a></span></dt>
  51. <dt><span class="section"><a href="examples.html#boost_contract.examples.__mitchell02___courier__subcontracting_and_static_class_invariants">[Mitchell02]
  52. Courier: Subcontracting and static class invariants</a></span></dt>
  53. <dt><span class="section"><a href="examples.html#boost_contract.examples.__mitchell02___stack__stack_like_container">[Mitchell02]
  54. Stack: Stack-like container</a></span></dt>
  55. <dt><span class="section"><a href="examples.html#boost_contract.examples.__mitchell02___simple_queue__queue_like_container_and_disable_old_value_copies_for_audit_assertions">[Mitchell02]
  56. Simple Queue: Queue-like container and disable old value copies for audit assertions</a></span></dt>
  57. <dt><span class="section"><a href="examples.html#boost_contract.examples.__mitchell02___customer_manager__contracts_instead_of_defensive_programming">[Mitchell02]
  58. Customer Manager: Contracts instead of defensive programming</a></span></dt>
  59. <dt><span class="section"><a href="examples.html#boost_contract.examples.__mitchell02___observer__pure_virtual_functions">[Mitchell02]
  60. Observer: Pure virtual functions</a></span></dt>
  61. <dt><span class="section"><a href="examples.html#boost_contract.examples.__mitchell02___counter__subcontracting">[Mitchell02]
  62. Counter: Subcontracting</a></span></dt>
  63. <dt><span class="section"><a href="examples.html#boost_contract.examples.__cline90___vector__comparison_with_a___proposal_syntax">[Cline90]
  64. Vector: Comparison with A++ proposal syntax</a></span></dt>
  65. <dt><span class="section"><a href="examples.html#boost_contract.examples.__cline90___stack__stack_like_container">[Cline90]
  66. Stack: Stack-like container</a></span></dt>
  67. <dt><span class="section"><a href="examples.html#boost_contract.examples.__cline90___vector_stack__subcontracting">[Cline90]
  68. Vector-Stack: Subcontracting</a></span></dt>
  69. <dt><span class="section"><a href="examples.html#boost_contract.examples.__cline90___calendar__a_very_simple_calendar">[Cline90]
  70. Calendar: A very simple calendar</a></span></dt>
  71. </dl></div>
  72. <p>
  73. This section lists some examples taken from different sources discussing contract
  74. programming and implemented here using this library.
  75. </p>
  76. <div class="note"><table border="0" summary="Note">
  77. <tr>
  78. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
  79. <th align="left">Note</th>
  80. </tr>
  81. <tr><td align="left" valign="top"><p>
  82. Some of these examples might be from old code, containing obsolete coding
  83. practices, not optimized for execution speed, not complete, and they might
  84. be more relevant in the context of programming languages different from C++.
  85. Nevertheless, programmers are encouraged to review these examples to see
  86. a few diverse uses of this library that might be relevant to their needs.
  87. </p></td></tr>
  88. </table></div>
  89. <p>
  90. The examples in this sections are taken from the following sources:
  91. </p>
  92. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  93. <li class="listitem">
  94. <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>: Examples from a detailed and
  95. complete proposal to add contract programming to C++11 (unfortunately,
  96. this proposal was never accepted into the standard).
  97. </li>
  98. <li class="listitem">
  99. <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a>: Examples from the Eiffel
  100. programming language (reprogrammed here in C++ using this library).
  101. </li>
  102. <li class="listitem">
  103. <a class="link" href="bibliography.html#Mitchell02_anchor">[Mitchell02]</a>: Additional examples
  104. from the Eiffel programming language (reprogrammed here in C++ using this
  105. library).
  106. </li>
  107. <li class="listitem">
  108. <a class="link" href="bibliography.html#Cline90_anchor">[Cline90]</a>: Examples from a very early
  109. proposal called Annotated C++ (A++) to add contract programming to C++
  110. (A++ was never implemented or proposed for addition to the standard).
  111. </li>
  112. </ul></div>
  113. <p>
  114. The following are some examples of particular interest:
  115. </p>
  116. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  117. <li class="listitem">
  118. <a class="link" href="examples.html#N1962_vector_anchor">[N1962] Vector</a>: Complete set
  119. of contracts for <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>, plus a comparison with <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a> syntax.
  120. </li>
  121. <li class="listitem">
  122. <a class="link" href="examples.html#N1962_square_root_anchor">[N1962] Square Root</a>: Comparison
  123. with D syntax.
  124. </li>
  125. <li class="listitem">
  126. <a class="link" href="examples.html#Mitchell02_counter_anchor">[Mitchell02] Counter</a>:
  127. Subcontracting.
  128. </li>
  129. <li class="listitem">
  130. <a class="link" href="examples.html#Meyer97_stack4_anchor">[Meyer97] Stack4</a>: Comparison
  131. with Eiffel syntax.
  132. </li>
  133. <li class="listitem">
  134. <a class="link" href="examples.html#Cline90_vector_anchor">[Cline90] Vector</a>: Comparison
  135. with A++ syntax.
  136. </li>
  137. </ul></div>
  138. <p>
  139. Most of the examples listed here use old values and class invariants which
  140. are instead not supported by <a class="link" href="bibliography.html#P0380_anchor">[P0380]</a>. Therefore,
  141. there is not meaningful example here that can be directly implemented and compared
  142. using <a class="link" href="bibliography.html#P0380_anchor">[P0380]</a> syntax.
  143. </p>
  144. <div class="section">
  145. <div class="titlepage"><div><div><h3 class="title">
  146. <a name="boost_contract.examples.__n1962___vector__contracts_for_stl_vector_and_comparison_with___n1962___proposed_syntax"></a><a name="N1962_vector_anchor"></a>[N1962] Vector: Contracts for STL
  147. vector and comparison with <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a> proposed
  148. syntax</h3></div></div></div>
  149. <p>
  150. On compilers that support C++17 <code class="computeroutput"><span class="keyword">if</span>
  151. <span class="keyword">constexpr</span></code>, the following example using
  152. this library can be simplified removing <code class="computeroutput"><a class="link" href="../boost/contract/condition_if.html" title="Function template condition_if">boost::contract::condition_if</a></code>
  153. and related functor templates such as <code class="computeroutput"><span class="identifier">all_of_equal_to</span></code>,
  154. etc., making it more similar to the pseudo-code on the right-hand side (see
  155. <a class="link" href="extras.html#boost_contract.extras.assertion_requirements__templates_" title="Assertion Requirements (Templates)">Assertion
  156. Requirements</a>).
  157. </p>
  158. <div class="informaltable"><table class="table">
  159. <colgroup>
  160. <col>
  161. <col>
  162. </colgroup>
  163. <thead><tr>
  164. <th>
  165. <p>
  166. This library
  167. </p>
  168. </th>
  169. <th>
  170. <p>
  171. [N1962] proposal (not accepted in C++) plus C++17 <code class="literal">if constexpr</code>
  172. </p>
  173. </th>
  174. </tr></thead>
  175. <tbody><tr>
  176. <td>
  177. <p>
  178. </p>
  179. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  180. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  181. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  182. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">/</span><span class="identifier">cxx11</span><span class="special">/</span><span class="identifier">all_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  183. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  184. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">next_prior</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  185. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
  186. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">functional</span><span class="special">&gt;</span>
  187. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iterator</span><span class="special">&gt;</span>
  188. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">memory</span><span class="special">&gt;</span>
  189. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  190. <span class="comment">// Could be programmed at call site with C++14 generic lambdas.</span>
  191. <span class="keyword">struct</span> <span class="identifier">all_of_equal_to</span> <span class="special">{</span>
  192. <span class="keyword">typedef</span> <span class="keyword">bool</span> <span class="identifier">result_type</span><span class="special">;</span>
  193. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  194. <span class="identifier">result_type</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">InputIter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  195. <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  196. <span class="special">}</span>
  197. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">&gt;</span>
  198. <span class="identifier">result_type</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">InputIter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">where</span><span class="special">)</span> <span class="special">{</span>
  199. <span class="keyword">for</span><span class="special">(</span><span class="identifier">InputIter</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">j</span> <span class="special">=</span> <span class="identifier">where</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">last</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">,</span> <span class="special">++</span><span class="identifier">j</span><span class="special">)</span> <span class="special">{</span>
  200. <span class="keyword">if</span><span class="special">(*</span><span class="identifier">i</span> <span class="special">!=</span> <span class="special">*</span><span class="identifier">j</span><span class="special">)</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  201. <span class="special">}</span>
  202. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  203. <span class="special">}</span>
  204. <span class="special">};</span>
  205. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iter</span><span class="special">&gt;</span>
  206. <span class="keyword">bool</span> <span class="identifier">valid</span><span class="special">(</span><span class="identifier">Iter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iter</span> <span class="identifier">last</span><span class="special">);</span> <span class="comment">// Cannot implement in C++ (for axiom only).</span>
  207. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iter</span><span class="special">&gt;</span>
  208. <span class="keyword">bool</span> <span class="identifier">contained</span><span class="special">(</span><span class="identifier">Iter</span> <span class="identifier">first1</span><span class="special">,</span> <span class="identifier">Iter</span> <span class="identifier">last1</span><span class="special">,</span> <span class="identifier">Iter</span> <span class="identifier">first2</span><span class="special">,</span> <span class="identifier">Iter</span> <span class="identifier">last2</span><span class="special">);</span> <span class="comment">// For axiom.</span>
  209. <span class="comment">// STL vector requires T copyable but not equality comparable.</span>
  210. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  211. <span class="keyword">class</span> <span class="identifier">vector</span> <span class="special">{</span>
  212. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  213. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  214. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span>
  215. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">()));</span>
  216. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">rbegin</span><span class="special">(),</span> <span class="identifier">rend</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">()));</span>
  217. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">capacity</span><span class="special">());</span>
  218. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">max_size</span><span class="special">());</span>
  219. <span class="special">}</span>
  220. <span class="keyword">public</span><span class="special">:</span>
  221. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">allocator_type</span> <span class="identifier">allocator_type</span><span class="special">;</span>
  222. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">pointer</span> <span class="identifier">pointer</span><span class="special">;</span>
  223. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">const_pointer</span> <span class="identifier">const_pointer</span><span class="special">;</span>
  224. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">reference</span> <span class="identifier">reference</span><span class="special">;</span>
  225. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
  226. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
  227. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">iterator</span><span class="special">;</span>
  228. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">const_iterator</span><span class="special">;</span>
  229. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
  230. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">difference_type</span> <span class="identifier">difference_type</span><span class="special">;</span>
  231. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">reverse_iterator</span>
  232. <span class="identifier">reverse_iterator</span><span class="special">;</span>
  233. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">const_reverse_iterator</span>
  234. <span class="identifier">const_reverse_iterator</span><span class="special">;</span>
  235. <span class="identifier">vector</span><span class="special">()</span> <span class="special">:</span> <span class="identifier">vect_</span><span class="special">()</span> <span class="special">{</span>
  236. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  237. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  238. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">());</span>
  239. <span class="special">})</span>
  240. <span class="special">;</span>
  241. <span class="special">}</span>
  242. <span class="keyword">explicit</span> <span class="identifier">vector</span><span class="special">(</span><span class="identifier">Allocator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">alloc</span><span class="special">)</span> <span class="special">{</span>
  243. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  244. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  245. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">());</span>
  246. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">get_allocator</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">alloc</span><span class="special">);</span>
  247. <span class="special">})</span>
  248. <span class="special">;</span>
  249. <span class="special">}</span>
  250. <span class="keyword">explicit</span> <span class="identifier">vector</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">{</span>
  251. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  252. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  253. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">);</span>
  254. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  255. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  256. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">all_of_equal_to</span><span class="special">(),</span> <span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">T</span><span class="special">())</span>
  257. <span class="special">)</span>
  258. <span class="special">);</span>
  259. <span class="special">})</span>
  260. <span class="special">;</span>
  261. <span class="special">}</span>
  262. <span class="identifier">vector</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  263. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  264. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  265. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">);</span>
  266. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  267. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  268. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">all_of_equal_to</span><span class="special">(),</span> <span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span>
  269. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span>
  270. <span class="special">)</span>
  271. <span class="special">);</span>
  272. <span class="special">})</span>
  273. <span class="special">;</span>
  274. <span class="special">}</span>
  275. <span class="identifier">vector</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span><span class="special">)</span> <span class="special">:</span>
  276. <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">alloc</span><span class="special">)</span> <span class="special">{</span>
  277. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  278. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  279. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">);</span>
  280. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  281. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  282. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">all_of_equal_to</span><span class="special">(),</span> <span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span>
  283. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span>
  284. <span class="special">)</span>
  285. <span class="special">);</span>
  286. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">get_allocator</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">alloc</span><span class="special">);</span>
  287. <span class="special">})</span>
  288. <span class="special">;</span>
  289. <span class="special">}</span>
  290. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">&gt;</span>
  291. <span class="identifier">vector</span><span class="special">(</span><span class="identifier">InputIter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">{</span>
  292. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  293. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  294. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span>
  295. <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">()));</span>
  296. <span class="special">})</span>
  297. <span class="special">;</span>
  298. <span class="special">}</span>
  299. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">&gt;</span>
  300. <span class="identifier">vector</span><span class="special">(</span><span class="identifier">InputIter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span><span class="special">)</span> <span class="special">:</span>
  301. <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">alloc</span><span class="special">)</span> <span class="special">{</span>
  302. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  303. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  304. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span>
  305. <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">()));</span>
  306. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">get_allocator</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">alloc</span><span class="special">);</span>
  307. <span class="special">})</span>
  308. <span class="special">;</span>
  309. <span class="special">}</span>
  310. <span class="comment">/* implicit */</span> <span class="identifier">vector</span><span class="special">(</span><span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">vect_</span><span class="special">)</span> <span class="special">{</span>
  311. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  312. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  313. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  314. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  315. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(),</span>
  316. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(*</span><span class="keyword">this</span><span class="special">),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">other</span><span class="special">))</span>
  317. <span class="special">)</span>
  318. <span class="special">);</span>
  319. <span class="special">})</span>
  320. <span class="special">;</span>
  321. <span class="special">}</span>
  322. <span class="identifier">vector</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">{</span>
  323. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&amp;&gt;</span> <span class="identifier">result</span><span class="special">;</span>
  324. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  325. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  326. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  327. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  328. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(),</span>
  329. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(*</span><span class="keyword">this</span><span class="special">),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">other</span><span class="special">))</span>
  330. <span class="special">)</span>
  331. <span class="special">);</span>
  332. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  333. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  334. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(),</span>
  335. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(*</span><span class="identifier">result</span><span class="special">),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(*</span><span class="keyword">this</span><span class="special">))</span>
  336. <span class="special">)</span>
  337. <span class="special">);</span>
  338. <span class="special">})</span>
  339. <span class="special">;</span>
  340. <span class="keyword">if</span><span class="special">(</span><span class="keyword">this</span> <span class="special">!=</span> <span class="special">&amp;</span><span class="identifier">other</span><span class="special">)</span> <span class="identifier">vect_</span> <span class="special">=</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">vect_</span><span class="special">;</span>
  341. <span class="keyword">return</span> <span class="special">*(</span><span class="identifier">result</span> <span class="special">=</span> <span class="special">*</span><span class="keyword">this</span><span class="special">);</span>
  342. <span class="special">}</span>
  343. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">vector</span><span class="special">()</span> <span class="special">{</span>
  344. <span class="comment">// Check invariants.</span>
  345. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  346. <span class="special">}</span>
  347. <span class="keyword">void</span> <span class="identifier">reserve</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">)</span> <span class="special">{</span>
  348. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  349. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  350. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">());</span>
  351. <span class="special">})</span>
  352. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  353. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">count</span><span class="special">);</span>
  354. <span class="special">})</span>
  355. <span class="special">;</span>
  356. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">reserve</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
  357. <span class="special">}</span>
  358. <span class="identifier">size_type</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  359. <span class="identifier">size_type</span> <span class="identifier">result</span><span class="special">;</span>
  360. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  361. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  362. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">&gt;=</span> <span class="identifier">size</span><span class="special">());</span>
  363. <span class="special">})</span>
  364. <span class="special">;</span>
  365. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
  366. <span class="special">}</span>
  367. <span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="special">{</span>
  368. <span class="identifier">iterator</span> <span class="identifier">result</span><span class="special">;</span>
  369. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  370. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  371. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">());</span>
  372. <span class="special">})</span>
  373. <span class="special">;</span>
  374. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  375. <span class="special">}</span>
  376. <span class="identifier">const_iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  377. <span class="identifier">const_iterator</span> <span class="identifier">result</span><span class="special">;</span>
  378. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  379. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  380. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">());</span>
  381. <span class="special">})</span>
  382. <span class="special">;</span>
  383. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  384. <span class="special">}</span>
  385. <span class="identifier">iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="special">{</span>
  386. <span class="comment">// Check invariants.</span>
  387. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  388. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
  389. <span class="special">}</span>
  390. <span class="identifier">const_iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  391. <span class="comment">// Check invariants.</span>
  392. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  393. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
  394. <span class="special">}</span>
  395. <span class="identifier">reverse_iterator</span> <span class="identifier">rbegin</span><span class="special">()</span> <span class="special">{</span>
  396. <span class="identifier">iterator</span> <span class="identifier">result</span><span class="special">;</span>
  397. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  398. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  399. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">rend</span><span class="special">());</span>
  400. <span class="special">})</span>
  401. <span class="special">;</span>
  402. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">();</span>
  403. <span class="special">}</span>
  404. <span class="identifier">const_reverse_iterator</span> <span class="identifier">rbegin</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  405. <span class="identifier">const_reverse_iterator</span> <span class="identifier">result</span><span class="special">;</span>
  406. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  407. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  408. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">rend</span><span class="special">());</span>
  409. <span class="special">})</span>
  410. <span class="special">;</span>
  411. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">();</span>
  412. <span class="special">}</span>
  413. <span class="identifier">reverse_iterator</span> <span class="identifier">rend</span><span class="special">()</span> <span class="special">{</span>
  414. <span class="comment">// Check invariants.</span>
  415. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  416. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">rend</span><span class="special">();</span>
  417. <span class="special">}</span>
  418. <span class="identifier">const_reverse_iterator</span> <span class="identifier">rend</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  419. <span class="comment">// Check invariants.</span>
  420. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  421. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">rend</span><span class="special">();</span>
  422. <span class="special">}</span>
  423. <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">())</span> <span class="special">{</span>
  424. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  425. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  426. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  427. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  428. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">);</span>
  429. <span class="keyword">if</span><span class="special">(</span><span class="identifier">count</span> <span class="special">&gt;</span> <span class="special">*</span><span class="identifier">old_size</span><span class="special">)</span> <span class="special">{</span>
  430. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  431. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  432. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">all_of_equal_to</span><span class="special">(),</span> <span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="special">*</span><span class="identifier">old_size</span><span class="special">,</span>
  433. <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span>
  434. <span class="special">)</span>
  435. <span class="special">);</span>
  436. <span class="special">}</span>
  437. <span class="special">})</span>
  438. <span class="special">;</span>
  439. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  440. <span class="special">}</span>
  441. <span class="identifier">size_type</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  442. <span class="identifier">size_type</span> <span class="identifier">result</span><span class="special">;</span>
  443. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  444. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  445. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">&lt;=</span> <span class="identifier">capacity</span><span class="special">());</span>
  446. <span class="special">})</span>
  447. <span class="special">;</span>
  448. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
  449. <span class="special">}</span>
  450. <span class="identifier">size_type</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  451. <span class="identifier">size_type</span> <span class="identifier">result</span><span class="special">;</span>
  452. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  453. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  454. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">&gt;=</span> <span class="identifier">capacity</span><span class="special">());</span>
  455. <span class="special">})</span>
  456. <span class="special">;</span>
  457. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">();</span>
  458. <span class="special">}</span>
  459. <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  460. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  461. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  462. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  463. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span>
  464. <span class="special">})</span>
  465. <span class="special">;</span>
  466. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();</span>
  467. <span class="special">}</span>
  468. <span class="identifier">Allocator</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  469. <span class="comment">// Check invariants.</span>
  470. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  471. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">get_allocator</span><span class="special">();</span>
  472. <span class="special">}</span>
  473. <span class="identifier">reference</span> <span class="identifier">at</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">index</span><span class="special">)</span> <span class="special">{</span>
  474. <span class="comment">// Check invariants, no pre (throw out_of_range for invalid index).</span>
  475. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  476. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">index</span><span class="special">);</span>
  477. <span class="special">}</span>
  478. <span class="identifier">const_reference</span> <span class="identifier">at</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">index</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  479. <span class="comment">// Check invariants, no pre (throw out_of_range for invalid index).</span>
  480. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  481. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">index</span><span class="special">);</span>
  482. <span class="special">}</span>
  483. <span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">size_type</span> <span class="identifier">index</span><span class="special">)</span> <span class="special">{</span>
  484. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  485. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  486. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">index</span> <span class="special">&lt;</span> <span class="identifier">size</span><span class="special">());</span>
  487. <span class="special">})</span>
  488. <span class="special">;</span>
  489. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
  490. <span class="special">}</span>
  491. <span class="identifier">const_reference</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">size_type</span> <span class="identifier">index</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  492. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  493. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  494. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">index</span> <span class="special">&lt;</span> <span class="identifier">size</span><span class="special">());</span>
  495. <span class="special">})</span>
  496. <span class="special">;</span>
  497. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
  498. <span class="special">}</span>
  499. <span class="identifier">reference</span> <span class="identifier">front</span><span class="special">()</span> <span class="special">{</span>
  500. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  501. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  502. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  503. <span class="special">})</span>
  504. <span class="special">;</span>
  505. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">front</span><span class="special">();</span>
  506. <span class="special">}</span>
  507. <span class="identifier">const_reference</span> <span class="identifier">front</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  508. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  509. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  510. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  511. <span class="special">})</span>
  512. <span class="special">;</span>
  513. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">front</span><span class="special">();</span>
  514. <span class="special">}</span>
  515. <span class="identifier">reference</span> <span class="identifier">back</span><span class="special">()</span> <span class="special">{</span>
  516. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  517. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  518. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  519. <span class="special">})</span>
  520. <span class="special">;</span>
  521. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
  522. <span class="special">}</span>
  523. <span class="identifier">const_reference</span> <span class="identifier">back</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  524. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  525. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  526. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  527. <span class="special">})</span>
  528. <span class="special">;</span>
  529. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
  530. <span class="special">}</span>
  531. <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  532. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  533. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  534. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_capacity</span> <span class="special">=</span>
  535. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">());</span>
  536. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  537. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  538. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">());</span>
  539. <span class="special">})</span>
  540. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  541. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
  542. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="special">*</span><span class="identifier">old_capacity</span><span class="special">);</span>
  543. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  544. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  545. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">back</span><span class="special">()),</span>
  546. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span>
  547. <span class="special">)</span>
  548. <span class="special">);</span>
  549. <span class="special">})</span>
  550. <span class="special">;</span>
  551. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
  552. <span class="special">}</span>
  553. <span class="keyword">void</span> <span class="identifier">pop_back</span><span class="special">()</span> <span class="special">{</span>
  554. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  555. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  556. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  557. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  558. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  559. <span class="special">})</span>
  560. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  561. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
  562. <span class="special">})</span>
  563. <span class="special">;</span>
  564. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span>
  565. <span class="special">}</span>
  566. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">&gt;</span>
  567. <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="identifier">InputIter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">{</span>
  568. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  569. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  570. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(</span>
  571. <span class="special">!</span><span class="identifier">contained</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">));</span>
  572. <span class="special">})</span>
  573. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  574. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span>
  575. <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">()));</span>
  576. <span class="special">})</span>
  577. <span class="special">;</span>
  578. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
  579. <span class="special">}</span>
  580. <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  581. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  582. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  583. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span> <span class="special">&lt;=</span> <span class="identifier">max_size</span><span class="special">());</span>
  584. <span class="special">})</span>
  585. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  586. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  587. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  588. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">all_of_equal_to</span><span class="special">(),</span> <span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span>
  589. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span>
  590. <span class="special">)</span>
  591. <span class="special">);</span>
  592. <span class="special">})</span>
  593. <span class="special">;</span>
  594. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  595. <span class="special">}</span>
  596. <span class="identifier">iterator</span> <span class="identifier">insert</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  597. <span class="identifier">iterator</span> <span class="identifier">result</span><span class="special">;</span>
  598. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  599. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  600. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_capacity</span> <span class="special">=</span>
  601. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">());</span>
  602. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  603. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  604. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">());</span>
  605. <span class="special">})</span>
  606. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  607. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
  608. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="special">*</span><span class="identifier">old_capacity</span><span class="special">);</span>
  609. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  610. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  611. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(*</span><span class="identifier">result</span><span class="special">),</span>
  612. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span>
  613. <span class="special">)</span>
  614. <span class="special">);</span>
  615. <span class="keyword">if</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;</span> <span class="special">*</span><span class="identifier">old_capacity</span><span class="special">)</span> <span class="special">{</span>
  616. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(!</span><span class="identifier">valid</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">()));</span>
  617. <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
  618. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(!</span><span class="identifier">valid</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">end</span><span class="special">()));</span>
  619. <span class="special">}</span>
  620. <span class="special">})</span>
  621. <span class="special">;</span>
  622. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  623. <span class="special">}</span>
  624. <span class="keyword">void</span> <span class="identifier">insert</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">,</span> <span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  625. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  626. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  627. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_capacity</span> <span class="special">=</span>
  628. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">());</span>
  629. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">iterator</span><span class="special">&gt;</span> <span class="identifier">old_where</span> <span class="special">=</span>
  630. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">where</span><span class="special">);</span>
  631. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  632. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  633. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">count</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">());</span>
  634. <span class="special">})</span>
  635. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  636. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span> <span class="special">+</span> <span class="identifier">count</span><span class="special">);</span>
  637. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="special">*</span><span class="identifier">old_capacity</span><span class="special">);</span>
  638. <span class="keyword">if</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_capacity</span><span class="special">)</span> <span class="special">{</span>
  639. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  640. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  641. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">all_of_equal_to</span><span class="special">(),</span>
  642. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">prior</span><span class="special">(*</span><span class="identifier">old_where</span><span class="special">),</span>
  643. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">prior</span><span class="special">(*</span><span class="identifier">old_where</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">count</span><span class="special">,</span>
  644. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">value</span><span class="special">)</span>
  645. <span class="special">)</span>
  646. <span class="special">)</span>
  647. <span class="special">);</span>
  648. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(!</span><span class="identifier">valid</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">end</span><span class="special">()));</span>
  649. <span class="special">}</span> <span class="keyword">else</span> <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(!</span><span class="identifier">valid</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">()));</span>
  650. <span class="special">})</span>
  651. <span class="special">;</span>
  652. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  653. <span class="special">}</span>
  654. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">&gt;</span>
  655. <span class="keyword">void</span> <span class="identifier">insert</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">{</span>
  656. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  657. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  658. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_capacity</span> <span class="special">=</span>
  659. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">());</span>
  660. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">iterator</span><span class="special">&gt;</span> <span class="identifier">old_where</span> <span class="special">=</span>
  661. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">where</span><span class="special">);</span>
  662. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  663. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  664. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">&lt;</span>
  665. <span class="identifier">max_size</span><span class="special">());</span>
  666. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(</span>
  667. <span class="special">!</span><span class="identifier">contained</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">()));</span>
  668. <span class="special">})</span>
  669. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  670. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span><span class="special">()</span> <span class="special">+</span>
  671. <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">));</span>
  672. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="special">*</span><span class="identifier">old_capacity</span><span class="special">);</span>
  673. <span class="keyword">if</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_capacity</span><span class="special">)</span> <span class="special">{</span>
  674. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span>
  675. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(</span>
  676. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">all_of_equal_to</span><span class="special">(),</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span>
  677. <span class="special">*</span><span class="identifier">old_where</span><span class="special">)</span>
  678. <span class="special">)</span>
  679. <span class="special">);</span>
  680. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(!</span><span class="identifier">valid</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">end</span><span class="special">()));</span>
  681. <span class="special">}</span> <span class="keyword">else</span> <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(!</span><span class="identifier">valid</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">()));</span>
  682. <span class="special">})</span>
  683. <span class="special">;</span>
  684. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
  685. <span class="special">}</span>
  686. <span class="identifier">iterator</span> <span class="identifier">erase</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">)</span> <span class="special">{</span>
  687. <span class="identifier">iterator</span> <span class="identifier">result</span><span class="special">;</span>
  688. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  689. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  690. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  691. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  692. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  693. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">where</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">());</span>
  694. <span class="special">})</span>
  695. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  696. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
  697. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">());</span>
  698. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(!</span><span class="identifier">valid</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">end</span><span class="special">()));</span>
  699. <span class="special">})</span>
  700. <span class="special">;</span>
  701. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">where</span><span class="special">);</span>
  702. <span class="special">}</span>
  703. <span class="identifier">iterator</span> <span class="identifier">erase</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">iterator</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">{</span>
  704. <span class="identifier">iterator</span> <span class="identifier">result</span><span class="special">;</span>
  705. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">size_type</span><span class="special">&gt;</span> <span class="identifier">old_size</span> <span class="special">=</span>
  706. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  707. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  708. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  709. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">));</span>
  710. <span class="special">})</span>
  711. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  712. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_size</span> <span class="special">-</span>
  713. <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">));</span>
  714. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">());</span>
  715. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(!</span><span class="identifier">valid</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">));</span>
  716. <span class="special">})</span>
  717. <span class="special">;</span>
  718. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
  719. <span class="special">}</span>
  720. <span class="keyword">void</span> <span class="identifier">clear</span><span class="special">()</span> <span class="special">{</span>
  721. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  722. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  723. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">());</span>
  724. <span class="special">})</span>
  725. <span class="special">;</span>
  726. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">clear</span><span class="special">();</span>
  727. <span class="special">}</span>
  728. <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">{</span>
  729. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span> <span class="identifier">old_me</span><span class="special">,</span> <span class="identifier">old_other</span><span class="special">;</span>
  730. <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_CONTRACT_AUDITS</span>
  731. <span class="identifier">old_me</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
  732. <span class="identifier">old_other</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">other</span><span class="special">);</span>
  733. <span class="preprocessor">#endif</span>
  734. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  735. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  736. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">get_allocator</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">get_allocator</span><span class="special">());</span>
  737. <span class="special">})</span>
  738. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  739. <span class="identifier">BOOST_CONTRACT_ASSERT_AUDIT</span><span class="special">(</span>
  740. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span>
  741. <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;(</span>
  742. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(),</span>
  743. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(*</span><span class="keyword">this</span><span class="special">),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(*</span><span class="identifier">old_other</span><span class="special">))</span>
  744. <span class="special">)</span>
  745. <span class="special">);</span>
  746. <span class="identifier">BOOST_CONTRACT_ASSERT_AUDIT</span><span class="special">(</span>
  747. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">condition_if</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span>
  748. <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;(</span>
  749. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal_to</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;(),</span>
  750. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(</span><span class="identifier">other</span><span class="special">),</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">cref</span><span class="special">(*</span><span class="identifier">old_me</span><span class="special">))</span>
  751. <span class="special">)</span>
  752. <span class="special">);</span>
  753. <span class="special">})</span>
  754. <span class="special">;</span>
  755. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">other</span><span class="special">);</span>
  756. <span class="special">}</span>
  757. <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">{</span>
  758. <span class="comment">// Check class invariants for left and right objects.</span>
  759. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">left_inv</span> <span class="special">=</span>
  760. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(&amp;</span><span class="identifier">left</span><span class="special">);</span>
  761. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">right_inv</span> <span class="special">=</span>
  762. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(&amp;</span><span class="identifier">right</span><span class="special">);</span>
  763. <span class="keyword">return</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">vect_</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">vect_</span><span class="special">;</span>
  764. <span class="special">}</span>
  765. <span class="keyword">private</span><span class="special">:</span>
  766. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span> <span class="identifier">vect_</span><span class="special">;</span>
  767. <span class="special">};</span>
  768. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  769. <span class="comment">// char type has operator==.</span>
  770. <span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">v</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
  771. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
  772. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="char">'\0'</span><span class="special">));</span>
  773. <span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">cv</span> <span class="special">=</span> <span class="identifier">v</span><span class="special">;</span>
  774. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">cv</span> <span class="special">==</span> <span class="identifier">v</span><span class="special">);</span>
  775. <span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
  776. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">w</span> <span class="special">==</span> <span class="identifier">v</span><span class="special">);</span>
  777. <span class="keyword">typename</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  778. <span class="identifier">assert</span><span class="special">(*</span><span class="identifier">i</span> <span class="special">==</span> <span class="char">'\0'</span><span class="special">);</span>
  779. <span class="keyword">typename</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">ci</span> <span class="special">=</span> <span class="identifier">cv</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  780. <span class="identifier">assert</span><span class="special">(*</span><span class="identifier">ci</span> <span class="special">==</span> <span class="char">'\0'</span><span class="special">);</span>
  781. <span class="identifier">v</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="char">'a'</span><span class="special">);</span>
  782. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="char">'a'</span><span class="special">);</span>
  783. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="char">'a'</span><span class="special">);</span>
  784. <span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="char">'b'</span><span class="special">);</span>
  785. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="char">'b'</span><span class="special">);</span>
  786. <span class="keyword">struct</span> <span class="identifier">x</span> <span class="special">{};</span> <span class="comment">// x type doest not have operator==.</span>
  787. <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">x</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
  788. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">y</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
  789. <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">x</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">cy</span> <span class="special">=</span> <span class="identifier">y</span><span class="special">;</span>
  790. <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">x</span><span class="special">&gt;</span> <span class="identifier">z</span><span class="special">(</span><span class="identifier">y</span><span class="special">);</span>
  791. <span class="keyword">typename</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">x</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">j</span> <span class="special">=</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  792. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">j</span> <span class="special">!=</span> <span class="identifier">y</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
  793. <span class="keyword">typename</span> <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">x</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">cj</span> <span class="special">=</span> <span class="identifier">cy</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  794. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">cj</span> <span class="special">!=</span> <span class="identifier">cy</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
  795. <span class="identifier">y</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">j</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">x</span><span class="special">());</span>
  796. <span class="identifier">y</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">x</span><span class="special">());</span>
  797. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  798. <span class="special">}</span>
  799. </pre>
  800. <p>
  801. </p>
  802. </td>
  803. <td>
  804. <p>
  805. </p>
  806. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// Extra spaces, newlines, etc. for visual alignment with this library code.</span>
  807. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">/</span><span class="identifier">cxx11</span><span class="special">/</span><span class="identifier">all_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  808. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  809. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">next_prior</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  810. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
  811. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iterator</span><span class="special">&gt;</span>
  812. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">memory</span><span class="special">&gt;</span>
  813. <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  814. <span class="keyword">class</span> <span class="identifier">vector</span> <span class="special">{</span>
  815. <span class="identifier">invariant</span> <span class="special">{</span>
  816. <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  817. <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  818. <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">rbegin</span><span class="special">(),</span> <span class="identifier">rend</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  819. <span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">capacity</span><span class="special">();</span>
  820. <span class="identifier">capacity</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">max_size</span><span class="special">();</span>
  821. <span class="special">}</span>
  822. <span class="keyword">public</span><span class="special">:</span>
  823. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">allocator_type</span> <span class="identifier">allocator_type</span><span class="special">;</span>
  824. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">pointer</span> <span class="identifier">pointer</span><span class="special">;</span>
  825. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">const_pointer</span> <span class="identifier">const_pointer</span><span class="special">;</span>
  826. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">reference</span> <span class="identifier">reference</span><span class="special">;</span>
  827. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
  828. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
  829. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">iterator</span><span class="special">;</span>
  830. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">const_iterator</span><span class="special">;</span>
  831. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
  832. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">difference_type</span> <span class="identifier">difference_type</span><span class="special">;</span>
  833. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">reverse_iterator</span>
  834. <span class="identifier">reverse_iterator</span><span class="special">;</span>
  835. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;::</span><span class="identifier">const_reverse_iterator</span>
  836. <span class="identifier">const_reverse_iterator</span><span class="special">;</span>
  837. <span class="identifier">vector</span><span class="special">()</span>
  838. <span class="identifier">postcondition</span> <span class="special">{</span>
  839. <span class="identifier">empty</span><span class="special">();</span>
  840. <span class="special">}</span>
  841. <span class="special">:</span> <span class="identifier">vect_</span><span class="special">()</span>
  842. <span class="special">{}</span>
  843. <span class="keyword">explicit</span> <span class="identifier">vector</span><span class="special">(</span><span class="identifier">Allocator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span><span class="special">)</span>
  844. <span class="identifier">postcondition</span> <span class="special">{</span>
  845. <span class="identifier">empty</span><span class="special">();</span>
  846. <span class="identifier">get_allocator</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">alloc</span><span class="special">;</span>
  847. <span class="special">}</span>
  848. <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">alloc</span><span class="special">)</span>
  849. <span class="special">{}</span>
  850. <span class="keyword">explicit</span> <span class="identifier">vector</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">)</span>
  851. <span class="identifier">postcondition</span> <span class="special">{</span>
  852. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">;</span>
  853. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  854. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">T</span><span class="special">());</span>
  855. <span class="special">}</span>
  856. <span class="special">}</span>
  857. <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span>
  858. <span class="special">{}</span>
  859. <span class="identifier">vector</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span>
  860. <span class="identifier">postcondition</span> <span class="special">{</span>
  861. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">;</span>
  862. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  863. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">);</span>
  864. <span class="special">}</span>
  865. <span class="special">}</span>
  866. <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">)</span>
  867. <span class="special">{}</span>
  868. <span class="identifier">vector</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span><span class="special">)</span>
  869. <span class="identifier">postcondition</span> <span class="special">{</span>
  870. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">;</span>
  871. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  872. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">);</span>
  873. <span class="special">}</span>
  874. <span class="identifier">get_allocator</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">alloc</span><span class="special">;</span>
  875. <span class="special">}</span>
  876. <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">alloc</span><span class="special">)</span>
  877. <span class="special">{}</span>
  878. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">&gt;</span>
  879. <span class="identifier">vector</span><span class="special">(</span><span class="identifier">InputIter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">last</span><span class="special">)</span>
  880. <span class="identifier">postcondition</span> <span class="special">{</span>
  881. <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  882. <span class="special">}</span>
  883. <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span>
  884. <span class="special">{}</span>
  885. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">&gt;</span>
  886. <span class="identifier">vector</span><span class="special">(</span><span class="identifier">InputIter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span><span class="special">)</span>
  887. <span class="identifier">postcondition</span> <span class="special">{</span>
  888. <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  889. <span class="identifier">get_allocator</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">alloc</span><span class="special">;</span>
  890. <span class="special">}</span>
  891. <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">alloc</span><span class="special">)</span>
  892. <span class="special">{}</span>
  893. <span class="comment">/* implicit */</span> <span class="identifier">vector</span><span class="special">(</span><span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span>
  894. <span class="identifier">postcondition</span> <span class="special">{</span>
  895. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  896. <span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">;</span>
  897. <span class="special">}</span>
  898. <span class="special">}</span>
  899. <span class="special">:</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">vect_</span><span class="special">)</span>
  900. <span class="special">{}</span>
  901. <span class="identifier">vector</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span>
  902. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  903. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  904. <span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">;</span>
  905. <span class="identifier">result</span> <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
  906. <span class="special">}</span>
  907. <span class="special">}</span>
  908. <span class="special">{</span>
  909. <span class="keyword">if</span><span class="special">(</span><span class="keyword">this</span> <span class="special">!=</span> <span class="special">&amp;</span><span class="identifier">other</span><span class="special">)</span> <span class="identifier">vect_</span> <span class="special">=</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">vect_</span><span class="special">;</span>
  910. <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
  911. <span class="special">}</span>
  912. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">vector</span><span class="special">()</span> <span class="special">{}</span>
  913. <span class="keyword">void</span> <span class="identifier">reserve</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">)</span>
  914. <span class="identifier">precondition</span> <span class="special">{</span>
  915. <span class="identifier">count</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">();</span>
  916. <span class="special">}</span>
  917. <span class="identifier">postcondition</span> <span class="special">{</span>
  918. <span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">count</span><span class="special">;</span>
  919. <span class="special">}</span>
  920. <span class="special">{</span>
  921. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">reserve</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
  922. <span class="special">}</span>
  923. <span class="identifier">size_type</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span>
  924. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  925. <span class="identifier">result</span> <span class="special">&gt;=</span> <span class="identifier">size</span><span class="special">();</span>
  926. <span class="special">}</span>
  927. <span class="special">{</span>
  928. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
  929. <span class="special">}</span>
  930. <span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">()</span>
  931. <span class="identifier">postcondition</span> <span class="special">{</span>
  932. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">();</span>
  933. <span class="special">}</span>
  934. <span class="special">{</span>
  935. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  936. <span class="special">}</span>
  937. <span class="identifier">const_iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span>
  938. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  939. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">();</span>
  940. <span class="special">}</span>
  941. <span class="special">{</span>
  942. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  943. <span class="special">}</span>
  944. <span class="identifier">iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="special">{</span>
  945. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
  946. <span class="special">}</span>
  947. <span class="identifier">const_iterator</span> <span class="identifier">end</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  948. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
  949. <span class="special">}</span>
  950. <span class="identifier">reverse_iterator</span> <span class="identifier">rbegin</span><span class="special">()</span>
  951. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  952. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">rend</span><span class="special">();</span>
  953. <span class="special">}</span>
  954. <span class="special">{</span>
  955. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">();</span>
  956. <span class="special">}</span>
  957. <span class="identifier">const_reverse_iterator</span> <span class="identifier">rbegin</span><span class="special">()</span> <span class="keyword">const</span>
  958. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  959. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">rend</span><span class="special">();</span>
  960. <span class="special">}</span>
  961. <span class="special">{</span>
  962. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">();</span>
  963. <span class="special">}</span>
  964. <span class="identifier">reverse_iterator</span> <span class="identifier">rend</span><span class="special">()</span> <span class="special">{</span>
  965. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">rend</span><span class="special">();</span>
  966. <span class="special">}</span>
  967. <span class="identifier">const_reverse_iterator</span> <span class="identifier">rend</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  968. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">rend</span><span class="special">();</span>
  969. <span class="special">}</span>
  970. <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">())</span>
  971. <span class="identifier">postcondition</span> <span class="special">{</span>
  972. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">;</span>
  973. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  974. <span class="keyword">if</span><span class="special">(</span><span class="identifier">count</span> <span class="special">&gt;</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">size</span><span class="special">()))</span> <span class="special">{</span>
  975. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">size</span><span class="special">()),</span>
  976. <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">);</span>
  977. <span class="special">}</span>
  978. <span class="special">}</span>
  979. <span class="special">}</span>
  980. <span class="special">{</span>
  981. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  982. <span class="special">}</span>
  983. <span class="identifier">size_type</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span>
  984. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  985. <span class="identifier">result</span> <span class="special">&lt;=</span> <span class="identifier">capacity</span><span class="special">();</span>
  986. <span class="special">}</span>
  987. <span class="special">{</span>
  988. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
  989. <span class="special">}</span>
  990. <span class="identifier">size_type</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="keyword">const</span>
  991. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  992. <span class="identifier">result</span> <span class="special">&gt;=</span> <span class="identifier">capacity</span><span class="special">();</span>
  993. <span class="special">}</span>
  994. <span class="special">{</span>
  995. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">();</span>
  996. <span class="special">}</span>
  997. <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span>
  998. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  999. <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  1000. <span class="special">}</span>
  1001. <span class="special">{</span>
  1002. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();</span>
  1003. <span class="special">}</span>
  1004. <span class="identifier">Alloctor</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1005. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">get_allocator</span><span class="special">();</span>
  1006. <span class="special">}</span>
  1007. <span class="identifier">reference</span> <span class="identifier">at</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">index</span><span class="special">)</span> <span class="special">{</span>
  1008. <span class="comment">// No precondition (throw out_of_range for invalid index).</span>
  1009. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">index</span><span class="special">);</span>
  1010. <span class="special">}</span>
  1011. <span class="identifier">const_reference</span> <span class="identifier">at</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">index</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  1012. <span class="comment">// No precondition (throw out_of_range for invalid index).</span>
  1013. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">index</span><span class="special">);</span>
  1014. <span class="special">}</span>
  1015. <span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">size_type</span> <span class="identifier">index</span><span class="special">)</span>
  1016. <span class="identifier">precondition</span> <span class="special">{</span>
  1017. <span class="identifier">index</span> <span class="special">&lt;</span> <span class="identifier">size</span><span class="special">();</span>
  1018. <span class="special">}</span>
  1019. <span class="special">{</span>
  1020. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
  1021. <span class="special">}</span>
  1022. <span class="identifier">const_reference</span> <span class="keyword">operator</span><span class="special">[](</span><span class="identifier">size_type</span> <span class="identifier">index</span><span class="special">)</span> <span class="keyword">const</span>
  1023. <span class="identifier">precondition</span> <span class="special">{</span>
  1024. <span class="identifier">index</span> <span class="special">&lt;</span> <span class="identifier">size</span><span class="special">();</span>
  1025. <span class="special">}</span>
  1026. <span class="special">{</span>
  1027. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
  1028. <span class="special">}</span>
  1029. <span class="identifier">reference</span> <span class="identifier">front</span><span class="special">()</span>
  1030. <span class="identifier">precondition</span> <span class="special">{</span>
  1031. <span class="special">!</span><span class="identifier">empty</span><span class="special">();</span>
  1032. <span class="special">}</span>
  1033. <span class="special">{</span>
  1034. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">front</span><span class="special">();</span>
  1035. <span class="special">}</span>
  1036. <span class="identifier">const_reference</span> <span class="identifier">front</span><span class="special">()</span> <span class="keyword">const</span>
  1037. <span class="identifier">precondition</span> <span class="special">{</span>
  1038. <span class="special">!</span><span class="identifier">empty</span><span class="special">();</span>
  1039. <span class="special">}</span>
  1040. <span class="special">{</span>
  1041. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">front</span><span class="special">();</span>
  1042. <span class="special">}</span>
  1043. <span class="identifier">reference</span> <span class="identifier">back</span><span class="special">()</span>
  1044. <span class="identifier">precondition</span> <span class="special">{</span>
  1045. <span class="special">!</span><span class="identifier">empty</span><span class="special">();</span>
  1046. <span class="special">}</span>
  1047. <span class="special">{</span>
  1048. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
  1049. <span class="special">}</span>
  1050. <span class="identifier">const_reference</span> <span class="identifier">back</span><span class="special">()</span> <span class="keyword">const</span>
  1051. <span class="identifier">precondition</span> <span class="special">{</span>
  1052. <span class="special">!</span><span class="identifier">empty</span><span class="special">();</span>
  1053. <span class="special">}</span>
  1054. <span class="special">{</span>
  1055. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
  1056. <span class="special">}</span>
  1057. <span class="keyword">void</span> <span class="identifier">push_back</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span>
  1058. <span class="identifier">precondition</span> <span class="special">{</span>
  1059. <span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">();</span>
  1060. <span class="special">}</span>
  1061. <span class="identifier">postcondition</span> <span class="special">{</span>
  1062. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="special">+</span> <span class="number">1</span><span class="special">;</span>
  1063. <span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">())</span>
  1064. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  1065. <span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">;</span>
  1066. <span class="special">}</span>
  1067. <span class="special">}</span>
  1068. <span class="special">{</span>
  1069. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
  1070. <span class="special">}</span>
  1071. <span class="keyword">void</span> <span class="identifier">pop_back</span><span class="special">()</span>
  1072. <span class="identifier">precondition</span> <span class="special">{</span>
  1073. <span class="special">!</span><span class="identifier">empty</span><span class="special">();</span>
  1074. <span class="special">}</span>
  1075. <span class="identifier">postcondition</span> <span class="special">{</span>
  1076. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="special">-</span> <span class="number">1</span><span class="special">;</span>
  1077. <span class="special">}</span>
  1078. <span class="special">{</span>
  1079. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span>
  1080. <span class="special">}</span>
  1081. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">&gt;</span>
  1082. <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="identifier">InputIter</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">InputIter</span> <span class="identifier">last</span><span class="special">)</span>
  1083. <span class="comment">// Precondition: [begin(), end()) does not contain [first, last).</span>
  1084. <span class="identifier">postcondition</span> <span class="special">{</span>
  1085. <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
  1086. <span class="special">}</span>
  1087. <span class="special">{</span>
  1088. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
  1089. <span class="special">}</span>
  1090. <span class="keyword">void</span> <span class="identifier">assign</span><span class="special">(</span><span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">vallue</span><span class="special">)</span>
  1091. <span class="identifier">precondition</span> <span class="special">{</span>
  1092. <span class="identifier">count</span> <span class="special">&lt;=</span> <span class="identifier">max_size</span><span class="special">();</span>
  1093. <span class="special">}</span>
  1094. <span class="identifier">postcondition</span> <span class="special">{</span>
  1095. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  1096. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">);</span>
  1097. <span class="special">}</span>
  1098. <span class="special">}</span>
  1099. <span class="special">{</span>
  1100. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  1101. <span class="special">}</span>
  1102. <span class="identifier">iterator</span> <span class="identifier">insert</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span>
  1103. <span class="identifier">precondition</span> <span class="special">{</span>
  1104. <span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">();</span>
  1105. <span class="special">}</span>
  1106. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  1107. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="special">+</span> <span class="number">1</span><span class="special">;</span>
  1108. <span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">());</span>
  1109. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  1110. <span class="special">*</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">;</span>
  1111. <span class="special">}</span>
  1112. <span class="comment">// if(capacity() &gt; oldof(capacity()))</span>
  1113. <span class="comment">// [begin(), end()) is invalid</span>
  1114. <span class="comment">// else</span>
  1115. <span class="comment">// [where, end()) is invalid</span>
  1116. <span class="special">}</span>
  1117. <span class="special">{</span>
  1118. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  1119. <span class="special">}</span>
  1120. <span class="keyword">void</span> <span class="identifier">insert</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">,</span> <span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span>
  1121. <span class="identifier">precondition</span> <span class="special">{</span>
  1122. <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">count</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">();</span>
  1123. <span class="special">}</span>
  1124. <span class="identifier">postcondition</span> <span class="special">{</span>
  1125. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="special">+</span> <span class="identifier">count</span><span class="special">;</span>
  1126. <span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">());</span>
  1127. <span class="keyword">if</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()))</span> <span class="special">{</span>
  1128. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  1129. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">prior</span><span class="special">(</span><span class="identifier">oldof</span><span class="special">(</span><span class="identifier">where</span><span class="special">)),</span>
  1130. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">prior</span><span class="special">(</span><span class="identifier">oldof</span><span class="special">(</span><span class="identifier">where</span><span class="special">))</span> <span class="special">+</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  1131. <span class="special">}</span>
  1132. <span class="comment">// [where, end()) is invalid</span>
  1133. <span class="special">}</span>
  1134. <span class="comment">// else [begin(), end()) is invalid</span>
  1135. <span class="special">}</span>
  1136. <span class="special">{</span>
  1137. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  1138. <span class="special">}</span>
  1139. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">InputIter</span><span class="special">&gt;</span>
  1140. <span class="keyword">void</span> <span class="identifier">insert</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">last</span><span class="special">)</span>
  1141. <span class="identifier">precondition</span> <span class="special">{</span>
  1142. <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">&lt;</span> <span class="identifier">max_size</span><span class="special">();</span>
  1143. <span class="comment">// [first, last) is not contained in [begin(), end())</span>
  1144. <span class="special">}</span>
  1145. <span class="identifier">postcondition</span> <span class="special">{</span>
  1146. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
  1147. <span class="identifier">capacity</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">());</span>
  1148. <span class="keyword">if</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()))</span> <span class="special">{</span>
  1149. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  1150. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">where</span><span class="special">));</span>
  1151. <span class="special">}</span>
  1152. <span class="comment">// [where, end()) is invalid</span>
  1153. <span class="special">}</span>
  1154. <span class="comment">// else [begin(), end()) is invalid</span>
  1155. <span class="special">}</span>
  1156. <span class="special">{</span>
  1157. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
  1158. <span class="special">}</span>
  1159. <span class="identifier">iterator</span> <span class="identifier">erase</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">)</span>
  1160. <span class="identifier">precondition</span> <span class="special">{</span>
  1161. <span class="special">!</span><span class="identifier">empty</span><span class="special">();</span>
  1162. <span class="identifier">where</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">();</span>
  1163. <span class="special">}</span>
  1164. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  1165. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldod</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">-</span> <span class="number">1</span><span class="special">;</span>
  1166. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">();</span>
  1167. <span class="comment">// [where, end()) is invalid</span>
  1168. <span class="special">}</span>
  1169. <span class="special">{</span>
  1170. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">where</span><span class="special">);</span>
  1171. <span class="special">}</span>
  1172. <span class="identifier">iterator</span> <span class="identifier">erase</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">iterator</span> <span class="identifier">last</span><span class="special">)</span>
  1173. <span class="identifier">precondition</span> <span class="special">{</span>
  1174. <span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">lasst</span><span class="special">);</span>
  1175. <span class="special">}</span>
  1176. <span class="identifier">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  1177. <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="special">-</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
  1178. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">();</span>
  1179. <span class="comment">// [first, last) is invalid</span>
  1180. <span class="special">}</span>
  1181. <span class="special">{</span>
  1182. <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
  1183. <span class="special">}</span>
  1184. <span class="keyword">void</span> <span class="identifier">clear</span><span class="special">()</span>
  1185. <span class="identifier">postcondition</span> <span class="special">{</span>
  1186. <span class="identifier">empty</span><span class="special">();</span>
  1187. <span class="special">}</span>
  1188. <span class="special">{</span>
  1189. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">clear</span><span class="special">();</span>
  1190. <span class="special">}</span>
  1191. <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">vector</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span>
  1192. <span class="identifier">precondition</span> <span class="special">{</span>
  1193. <span class="identifier">get_allocator</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">get_allocator</span><span class="special">();</span>
  1194. <span class="special">}</span>
  1195. <span class="identifier">postcondition</span> <span class="special">{</span>
  1196. <span class="keyword">if</span> <span class="keyword">constexpr</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  1197. <span class="special">*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(</span><span class="identifier">other</span><span class="special">);</span>
  1198. <span class="identifier">other</span> <span class="special">==</span> <span class="identifier">oldof</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
  1199. <span class="special">}</span>
  1200. <span class="special">}</span>
  1201. <span class="special">{</span>
  1202. <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">other</span><span class="special">);</span>
  1203. <span class="special">}</span>
  1204. <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">{</span>
  1205. <span class="comment">// Cannot check class invariants for left and right objects.</span>
  1206. <span class="keyword">return</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">vect_</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">vect_</span><span class="special">;</span>
  1207. <span class="special">}</span>
  1208. <span class="keyword">private</span><span class="special">:</span>
  1209. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span> <span class="identifier">vect_</span><span class="special">;</span>
  1210. <span class="special">};</span>
  1211. <span class="comment">// End.</span>
  1212. </pre>
  1213. <p>
  1214. </p>
  1215. </td>
  1216. </tr></tbody>
  1217. </table></div>
  1218. </div>
  1219. <div class="section">
  1220. <div class="titlepage"><div><div><h3 class="title">
  1221. <a name="boost_contract.examples.__n1962___circle__subcontracting"></a><a class="link" href="examples.html#boost_contract.examples.__n1962___circle__subcontracting" title="[N1962] Circle: Subcontracting">[N1962]
  1222. Circle: Subcontracting</a>
  1223. </h3></div></div></div>
  1224. <p>
  1225. </p>
  1226. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1227. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  1228. <span class="keyword">class</span> <span class="identifier">shape</span> <span class="special">{</span>
  1229. <span class="keyword">public</span><span class="special">:</span>
  1230. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">shape</span><span class="special">()</span> <span class="special">{}</span>
  1231. <span class="keyword">virtual</span> <span class="keyword">unsigned</span> <span class="identifier">compute_area</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  1232. <span class="special">};</span>
  1233. <span class="keyword">unsigned</span> <span class="identifier">shape</span><span class="special">::</span><span class="identifier">compute_area</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  1234. <span class="keyword">unsigned</span> <span class="identifier">result</span><span class="special">;</span>
  1235. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  1236. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">(</span><span class="keyword">int</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  1237. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">&gt;</span> <span class="number">0</span><span class="special">);</span>
  1238. <span class="special">})</span>
  1239. <span class="special">;</span>
  1240. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  1241. <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span>
  1242. <span class="special">}</span>
  1243. <span class="keyword">class</span> <span class="identifier">circle</span>
  1244. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">public</span> <span class="identifier">shape</span>
  1245. <span class="special">:</span> <span class="identifier">BASES</span>
  1246. <span class="special">{</span>
  1247. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  1248. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  1249. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  1250. <span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">compute_area</span><span class="special">);</span>
  1251. <span class="keyword">public</span><span class="special">:</span>
  1252. <span class="keyword">static</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">pi</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span> <span class="comment">// Truncated to int from 3.14...</span>
  1253. <span class="keyword">explicit</span> <span class="identifier">circle</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">a_radius</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">radius_</span><span class="special">(</span><span class="identifier">a_radius</span><span class="special">)</span> <span class="special">{</span>
  1254. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1255. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1256. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">radius</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">a_radius</span><span class="special">);</span>
  1257. <span class="special">})</span>
  1258. <span class="special">;</span>
  1259. <span class="special">}</span>
  1260. <span class="keyword">virtual</span> <span class="keyword">unsigned</span> <span class="identifier">compute_area</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">const</span>
  1261. <span class="comment">/* override */</span> <span class="special">{</span>
  1262. <span class="keyword">unsigned</span> <span class="identifier">result</span><span class="special">;</span>
  1263. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  1264. <span class="identifier">override_compute_area</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">circle</span><span class="special">::</span><span class="identifier">compute_area</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  1265. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  1266. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">pi</span> <span class="special">*</span> <span class="identifier">radius</span><span class="special">()</span> <span class="special">*</span> <span class="identifier">radius</span><span class="special">());</span>
  1267. <span class="special">})</span>
  1268. <span class="special">;</span>
  1269. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">pi</span> <span class="special">*</span> <span class="identifier">radius</span><span class="special">()</span> <span class="special">*</span> <span class="identifier">radius</span><span class="special">();</span>
  1270. <span class="special">}</span>
  1271. <span class="keyword">unsigned</span> <span class="identifier">radius</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1272. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1273. <span class="keyword">return</span> <span class="identifier">radius_</span><span class="special">;</span>
  1274. <span class="special">}</span>
  1275. <span class="keyword">private</span><span class="special">:</span>
  1276. <span class="keyword">unsigned</span> <span class="identifier">radius_</span><span class="special">;</span>
  1277. <span class="special">};</span>
  1278. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  1279. <span class="identifier">circle</span> <span class="identifier">c</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
  1280. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">radius</span><span class="special">()</span> <span class="special">==</span> <span class="number">2</span><span class="special">);</span>
  1281. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">compute_area</span><span class="special">()</span> <span class="special">==</span> <span class="number">12</span><span class="special">);</span>
  1282. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  1283. <span class="special">}</span>
  1284. </pre>
  1285. <p>
  1286. </p>
  1287. </div>
  1288. <div class="section">
  1289. <div class="titlepage"><div><div><h3 class="title">
  1290. <a name="boost_contract.examples.__n1962___factorial__recursion"></a><a name="N1962_factorial_anchor"></a><a class="link" href="examples.html#boost_contract.examples.__n1962___factorial__recursion" title="[N1962] Factorial: Recursion">[N1962]
  1291. Factorial: Recursion</a>
  1292. </h3></div></div></div>
  1293. <p>
  1294. </p>
  1295. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1296. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  1297. <span class="keyword">int</span> <span class="identifier">factorial</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">{</span>
  1298. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  1299. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  1300. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1301. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">n</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Non-negative natural number.</span>
  1302. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">n</span> <span class="special">&lt;=</span> <span class="number">12</span><span class="special">);</span> <span class="comment">// Max function input.</span>
  1303. <span class="special">})</span>
  1304. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1305. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">&gt;=</span> <span class="number">1</span><span class="special">);</span>
  1306. <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special">&lt;</span> <span class="number">2</span><span class="special">)</span> <span class="special">{</span> <span class="comment">// Select assertion.</span>
  1307. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
  1308. <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
  1309. <span class="comment">// Assertions automatically disabled in other assertions.</span>
  1310. <span class="comment">// Therefore, this postcondition can recursively call the</span>
  1311. <span class="comment">// function without causing infinite recursion.</span>
  1312. <span class="identifier">BOOST_CONTRACT_ASSERT_AUDIT</span><span class="special">(</span><span class="identifier">n</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">n</span> <span class="special">-</span> <span class="number">1</span><span class="special">));</span>
  1313. <span class="special">}</span>
  1314. <span class="special">})</span>
  1315. <span class="special">;</span>
  1316. <span class="keyword">return</span> <span class="identifier">n</span> <span class="special">&lt;</span> <span class="number">2</span> <span class="special">?</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">=</span> <span class="number">1</span><span class="special">)</span> <span class="special">:</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">=</span> <span class="identifier">n</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">n</span> <span class="special">-</span> <span class="number">1</span><span class="special">));</span>
  1317. <span class="special">}</span>
  1318. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  1319. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">factorial</span><span class="special">(</span><span class="number">4</span><span class="special">)</span> <span class="special">==</span> <span class="number">24</span><span class="special">);</span>
  1320. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  1321. <span class="special">}</span>
  1322. </pre>
  1323. <p>
  1324. </p>
  1325. </div>
  1326. <div class="section">
  1327. <div class="titlepage"><div><div><h3 class="title">
  1328. <a name="boost_contract.examples.__n1962___equal__operators"></a><a class="link" href="examples.html#boost_contract.examples.__n1962___equal__operators" title="[N1962] Equal: Operators">[N1962]
  1329. Equal: Operators</a>
  1330. </h3></div></div></div>
  1331. <p>
  1332. </p>
  1333. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1334. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  1335. <span class="comment">// Forward declaration because == and != contracts use one another's function.</span>
  1336. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  1337. <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">right</span><span class="special">);</span>
  1338. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  1339. <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">{</span>
  1340. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  1341. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  1342. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1343. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">!(</span><span class="identifier">left</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">));</span>
  1344. <span class="special">})</span>
  1345. <span class="special">;</span>
  1346. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span> <span class="special">!=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">value</span><span class="special">);</span>
  1347. <span class="special">}</span>
  1348. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  1349. <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">{</span>
  1350. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  1351. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  1352. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1353. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">!(</span><span class="identifier">left</span> <span class="special">!=</span> <span class="identifier">right</span><span class="special">));</span>
  1354. <span class="special">})</span>
  1355. <span class="special">;</span>
  1356. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">value</span><span class="special">);</span>
  1357. <span class="special">}</span>
  1358. <span class="keyword">struct</span> <span class="identifier">number</span> <span class="special">{</span> <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span> <span class="special">};</span>
  1359. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  1360. <span class="identifier">number</span> <span class="identifier">n</span><span class="special">;</span>
  1361. <span class="identifier">n</span><span class="special">.</span><span class="identifier">value</span> <span class="special">=</span> <span class="number">123</span><span class="special">;</span>
  1362. <span class="identifier">assert</span><span class="special">((</span><span class="identifier">n</span> <span class="special">==</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">true</span><span class="special">);</span> <span class="comment">// Explicitly call operator==.</span>
  1363. <span class="identifier">assert</span><span class="special">((</span><span class="identifier">n</span> <span class="special">!=</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">false</span><span class="special">);</span> <span class="comment">// Explicitly call operator!=.</span>
  1364. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  1365. <span class="special">}</span>
  1366. </pre>
  1367. <p>
  1368. </p>
  1369. </div>
  1370. <div class="section">
  1371. <div class="titlepage"><div><div><h3 class="title">
  1372. <a name="boost_contract.examples.__n1962___sum__array_parameter"></a><a class="link" href="examples.html#boost_contract.examples.__n1962___sum__array_parameter" title="[N1962] Sum: Array parameter">[N1962]
  1373. Sum: Array parameter</a>
  1374. </h3></div></div></div>
  1375. <p>
  1376. </p>
  1377. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1378. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  1379. <span class="keyword">int</span> <span class="identifier">sum</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="keyword">int</span><span class="special">*</span> <span class="identifier">array</span><span class="special">)</span> <span class="special">{</span>
  1380. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  1381. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  1382. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1383. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span> <span class="special">%</span> <span class="number">4</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  1384. <span class="special">})</span>
  1385. <span class="special">;</span>
  1386. <span class="identifier">result</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  1387. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">count</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">result</span> <span class="special">+=</span> <span class="identifier">array</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
  1388. <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span>
  1389. <span class="special">}</span>
  1390. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  1391. <span class="keyword">int</span> <span class="identifier">a</span><span class="special">[</span><span class="number">4</span><span class="special">]</span> <span class="special">=</span> <span class="special">{</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">};</span>
  1392. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">sum</span><span class="special">(</span><span class="number">4</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span> <span class="special">==</span> <span class="number">10</span><span class="special">);</span>
  1393. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  1394. <span class="special">}</span>
  1395. </pre>
  1396. <p>
  1397. </p>
  1398. </div>
  1399. <div class="section">
  1400. <div class="titlepage"><div><div><h3 class="title">
  1401. <a name="boost_contract.examples.__n1962___square_root__default_parameters_and_comparison_with_d_syntax"></a><a name="N1962_square_root_anchor"></a><a class="link" href="examples.html#boost_contract.examples.__n1962___square_root__default_parameters_and_comparison_with_d_syntax" title="[N1962] Square Root: Default parameters and comparison with D syntax">[N1962]
  1402. Square Root: Default parameters and comparison with D syntax</a>
  1403. </h3></div></div></div>
  1404. <div class="informaltable"><table class="table">
  1405. <colgroup>
  1406. <col>
  1407. <col>
  1408. </colgroup>
  1409. <thead><tr>
  1410. <th>
  1411. <p>
  1412. This Library
  1413. </p>
  1414. </th>
  1415. <th>
  1416. <p>
  1417. The D Programming Language
  1418. </p>
  1419. </th>
  1420. </tr></thead>
  1421. <tbody><tr>
  1422. <td>
  1423. <p>
  1424. </p>
  1425. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1426. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cmath</span><span class="special">&gt;</span>
  1427. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  1428. <span class="keyword">long</span> <span class="identifier">lsqrt</span><span class="special">(</span><span class="keyword">long</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
  1429. <span class="keyword">long</span> <span class="identifier">result</span><span class="special">;</span>
  1430. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  1431. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1432. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">x</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  1433. <span class="special">})</span>
  1434. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1435. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">*</span> <span class="identifier">result</span> <span class="special">&lt;=</span> <span class="identifier">x</span><span class="special">);</span>
  1436. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">((</span><span class="identifier">result</span> <span class="special">+</span> <span class="number">1</span><span class="special">)</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">+</span> <span class="number">1</span><span class="special">)</span> <span class="special">&gt;</span> <span class="identifier">x</span><span class="special">);</span>
  1437. <span class="special">})</span>
  1438. <span class="special">;</span>
  1439. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">long</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">sqrt</span><span class="special">(</span><span class="keyword">double</span><span class="special">(</span><span class="identifier">x</span><span class="special">)));</span>
  1440. <span class="special">}</span>
  1441. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  1442. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">lsqrt</span><span class="special">(</span><span class="number">4</span><span class="special">)</span> <span class="special">==</span> <span class="number">2</span><span class="special">);</span>
  1443. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  1444. <span class="special">}</span>
  1445. </pre>
  1446. <p>
  1447. </p>
  1448. </td>
  1449. <td>
  1450. <p>
  1451. </p>
  1452. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// Extra spaces, newlines, etc. for visual alignment with this library code.</span>
  1453. <span class="keyword">long</span> <span class="identifier">lsqrt</span><span class="special">(</span><span class="keyword">long</span> <span class="identifier">x</span><span class="special">)</span>
  1454. <span class="identifier">in</span> <span class="special">{</span>
  1455. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">x</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  1456. <span class="special">}</span>
  1457. <span class="identifier">out</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  1458. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">result</span> <span class="special">*</span> <span class="identifier">result</span> <span class="special">&lt;=</span> <span class="identifier">x</span><span class="special">);</span>
  1459. <span class="identifier">assert</span><span class="special">((</span><span class="identifier">result</span> <span class="special">+</span> <span class="number">1</span><span class="special">)</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">result</span> <span class="special">+</span> <span class="number">1</span><span class="special">)</span> <span class="special">&gt;</span> <span class="identifier">x</span><span class="special">);</span>
  1460. <span class="special">}</span>
  1461. <span class="keyword">do</span> <span class="special">{</span>
  1462. <span class="keyword">return</span> <span class="identifier">cast</span><span class="special">(</span><span class="keyword">long</span><span class="special">)</span><span class="identifier">std</span><span class="special">.</span><span class="identifier">math</span><span class="special">.</span><span class="identifier">sqrt</span><span class="special">(</span><span class="identifier">cast</span><span class="special">(</span><span class="identifier">real</span><span class="special">)</span><span class="identifier">x</span><span class="special">);</span>
  1463. <span class="special">}</span>
  1464. <span class="comment">// End.</span>
  1465. </pre>
  1466. <p>
  1467. </p>
  1468. </td>
  1469. </tr></tbody>
  1470. </table></div>
  1471. </div>
  1472. <div class="section">
  1473. <div class="titlepage"><div><div><h3 class="title">
  1474. <a name="boost_contract.examples.__meyer97___stack4__comparison_with_eiffel_syntax"></a><a name="Meyer97_stack4_anchor"></a><a class="link" href="examples.html#boost_contract.examples.__meyer97___stack4__comparison_with_eiffel_syntax" title="[Meyer97] Stack4: Comparison with Eiffel syntax">[Meyer97]
  1475. Stack4: Comparison with Eiffel syntax</a>
  1476. </h3></div></div></div>
  1477. <div class="informaltable"><table class="table">
  1478. <colgroup>
  1479. <col>
  1480. <col>
  1481. </colgroup>
  1482. <thead><tr>
  1483. <th>
  1484. <p>
  1485. This Library
  1486. </p>
  1487. </th>
  1488. <th>
  1489. <p>
  1490. The Eiffel Programming Language
  1491. </p>
  1492. </th>
  1493. </tr></thead>
  1494. <tbody>
  1495. <tr>
  1496. <td>
  1497. <p>
  1498. </p>
  1499. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: stack4.hpp</span>
  1500. <span class="preprocessor">#ifndef</span> <span class="identifier">STACK4_HPP_</span>
  1501. <span class="preprocessor">#define</span> <span class="identifier">STACK4_HPP_</span>
  1502. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1503. <span class="comment">// Dispenser with LIFO access policy and fixed max capacity.</span>
  1504. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  1505. <span class="keyword">class</span> <span class="identifier">stack4</span>
  1506. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">stack4</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  1507. <span class="special">:</span> <span class="identifier">BASES</span>
  1508. <span class="special">{</span>
  1509. <span class="keyword">friend</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  1510. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  1511. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  1512. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1513. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Count non-negative.</span>
  1514. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">capacity</span><span class="special">());</span> <span class="comment">// Count bounded.</span>
  1515. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span> <span class="comment">// Empty if no elem.</span>
  1516. <span class="special">}</span>
  1517. <span class="keyword">public</span><span class="special">:</span>
  1518. <span class="comment">/* Initialization */</span>
  1519. <span class="comment">// Allocate static from a maximum of n elements.</span>
  1520. <span class="keyword">explicit</span> <span class="identifier">stack4</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">:</span>
  1521. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">stack4</span><span class="special">&gt;([&amp;]</span> <span class="special">{</span>
  1522. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">n</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Non-negative capacity.</span>
  1523. <span class="special">})</span>
  1524. <span class="special">{</span>
  1525. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1526. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1527. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">n</span><span class="special">);</span> <span class="comment">// Capacity set.</span>
  1528. <span class="special">})</span>
  1529. <span class="special">;</span>
  1530. <span class="identifier">capacity_</span> <span class="special">=</span> <span class="identifier">n</span><span class="special">;</span>
  1531. <span class="identifier">count_</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  1532. <span class="identifier">array_</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">n</span><span class="special">];</span>
  1533. <span class="special">}</span>
  1534. <span class="comment">// Deep copy via constructor.</span>
  1535. <span class="comment">/* implicit */</span> <span class="identifier">stack4</span><span class="special">(</span><span class="identifier">stack4</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">{</span>
  1536. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1537. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1538. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">());</span>
  1539. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">count</span><span class="special">());</span>
  1540. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">);</span>
  1541. <span class="special">})</span>
  1542. <span class="special">;</span>
  1543. <span class="identifier">capacity_</span> <span class="special">=</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">capacity_</span><span class="special">;</span>
  1544. <span class="identifier">count_</span> <span class="special">=</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">count_</span><span class="special">;</span>
  1545. <span class="identifier">array_</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">capacity_</span><span class="special">];</span>
  1546. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">count_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">array_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">array_</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
  1547. <span class="special">}</span>
  1548. <span class="comment">// Deep copy via assignment.</span>
  1549. <span class="identifier">stack4</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span><span class="identifier">stack4</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">{</span>
  1550. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1551. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1552. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">());</span>
  1553. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">count</span><span class="special">());</span>
  1554. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(*</span><span class="keyword">this</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">);</span>
  1555. <span class="special">})</span>
  1556. <span class="special">;</span>
  1557. <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">array_</span><span class="special">;</span>
  1558. <span class="identifier">capacity_</span> <span class="special">=</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">capacity_</span><span class="special">;</span>
  1559. <span class="identifier">count_</span> <span class="special">=</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">count_</span><span class="special">;</span>
  1560. <span class="identifier">array_</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">capacity_</span><span class="special">];</span>
  1561. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">count_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">array_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">array_</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
  1562. <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
  1563. <span class="special">}</span>
  1564. <span class="comment">// Destroy this stack.</span>
  1565. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">stack4</span><span class="special">()</span> <span class="special">{</span>
  1566. <span class="comment">// Check invariants.</span>
  1567. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1568. <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">array_</span><span class="special">;</span>
  1569. <span class="special">}</span>
  1570. <span class="comment">/* Access */</span>
  1571. <span class="comment">// Max number of stack elements.</span>
  1572. <span class="keyword">int</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1573. <span class="comment">// Check invariants.</span>
  1574. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1575. <span class="keyword">return</span> <span class="identifier">capacity_</span><span class="special">;</span>
  1576. <span class="special">}</span>
  1577. <span class="comment">// Number of stack elements.</span>
  1578. <span class="keyword">int</span> <span class="identifier">count</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1579. <span class="comment">// Check invariants.</span>
  1580. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1581. <span class="keyword">return</span> <span class="identifier">count_</span><span class="special">;</span>
  1582. <span class="special">}</span>
  1583. <span class="comment">// Top element.</span>
  1584. <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">item</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1585. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1586. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1587. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span> <span class="comment">// Not empty (i.e., count &gt; 0).</span>
  1588. <span class="special">})</span>
  1589. <span class="special">;</span>
  1590. <span class="keyword">return</span> <span class="identifier">array_</span><span class="special">[</span><span class="identifier">count_</span> <span class="special">-</span> <span class="number">1</span><span class="special">];</span>
  1591. <span class="special">}</span>
  1592. <span class="comment">/* Status Report */</span>
  1593. <span class="comment">// Is stack empty?</span>
  1594. <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1595. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  1596. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1597. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1598. <span class="comment">// Empty definition.</span>
  1599. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span>
  1600. <span class="special">})</span>
  1601. <span class="special">;</span>
  1602. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">count_</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  1603. <span class="special">}</span>
  1604. <span class="comment">// Is stack full?</span>
  1605. <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1606. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  1607. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1608. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1609. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span> <span class="comment">// Full definition.</span>
  1610. <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">capacity</span><span class="special">()));</span>
  1611. <span class="special">})</span>
  1612. <span class="special">;</span>
  1613. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">count_</span> <span class="special">==</span> <span class="identifier">capacity_</span><span class="special">);</span>
  1614. <span class="special">}</span>
  1615. <span class="comment">/* Element Change */</span>
  1616. <span class="comment">// Add x on top.</span>
  1617. <span class="keyword">void</span> <span class="identifier">put</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
  1618. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  1619. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1620. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1621. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">full</span><span class="special">());</span> <span class="comment">// Not full.</span>
  1622. <span class="special">})</span>
  1623. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1624. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span> <span class="comment">// Not empty.</span>
  1625. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">x</span><span class="special">);</span> <span class="comment">// Added to top.</span>
  1626. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// One more.</span>
  1627. <span class="special">})</span>
  1628. <span class="special">;</span>
  1629. <span class="identifier">array_</span><span class="special">[</span><span class="identifier">count_</span><span class="special">++]</span> <span class="special">=</span> <span class="identifier">x</span><span class="special">;</span>
  1630. <span class="special">}</span>
  1631. <span class="comment">// Remove top element.</span>
  1632. <span class="keyword">void</span> <span class="identifier">remove</span><span class="special">()</span> <span class="special">{</span>
  1633. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  1634. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1635. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1636. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span> <span class="comment">// Not empty (i.e., count &gt; 0).</span>
  1637. <span class="special">})</span>
  1638. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1639. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">full</span><span class="special">());</span> <span class="comment">// Not full.</span>
  1640. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// One less.</span>
  1641. <span class="special">})</span>
  1642. <span class="special">;</span>
  1643. <span class="special">--</span><span class="identifier">count_</span><span class="special">;</span>
  1644. <span class="special">}</span>
  1645. <span class="comment">/* Friend Helpers */</span>
  1646. <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">stack4</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">stack4</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">{</span>
  1647. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">inv1</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(&amp;</span><span class="identifier">left</span><span class="special">);</span>
  1648. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">inv2</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(&amp;</span><span class="identifier">right</span><span class="special">);</span>
  1649. <span class="keyword">if</span><span class="special">(</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">count_</span> <span class="special">!=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">count_</span><span class="special">)</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  1650. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">count_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
  1651. <span class="keyword">if</span><span class="special">(</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">array_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">!=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">array_</span><span class="special">[</span><span class="identifier">i</span><span class="special">])</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  1652. <span class="special">}</span>
  1653. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  1654. <span class="special">}</span>
  1655. <span class="keyword">private</span><span class="special">:</span>
  1656. <span class="keyword">int</span> <span class="identifier">capacity_</span><span class="special">;</span>
  1657. <span class="keyword">int</span> <span class="identifier">count_</span><span class="special">;</span>
  1658. <span class="identifier">T</span><span class="special">*</span> <span class="identifier">array_</span><span class="special">;</span> <span class="comment">// Internally use C-style array.</span>
  1659. <span class="special">};</span>
  1660. <span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
  1661. </pre>
  1662. <p>
  1663. </p>
  1664. </td>
  1665. <td>
  1666. <p>
  1667. </p>
  1668. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">--</span> <span class="identifier">Extra</span> <span class="identifier">spaces</span><span class="special">,</span> <span class="identifier">newlines</span><span class="special">,</span> <span class="identifier">etc</span><span class="special">.</span> <span class="keyword">for</span> <span class="identifier">visual</span> <span class="identifier">alignment</span> <span class="identifier">with</span> <span class="keyword">this</span> <span class="identifier">library</span> <span class="identifier">code</span><span class="special">.</span>
  1669. <span class="identifier">indexing</span>
  1670. <span class="identifier">destription</span><span class="special">:</span> <span class="string">"Dispenser with LIFO access policy and a fixed max capacity."</span>
  1671. <span class="keyword">class</span> <span class="identifier">interface</span> <span class="identifier">STACK4</span><span class="special">[</span><span class="identifier">G</span><span class="special">]</span> <span class="identifier">creation</span> <span class="identifier">make</span> <span class="special">--</span> <span class="identifier">Interface</span> <span class="identifier">only</span> <span class="special">(</span><span class="identifier">no</span> <span class="identifier">implementation</span><span class="special">).</span>
  1672. <span class="identifier">invariant</span>
  1673. <span class="identifier">count_non_negative</span><span class="special">:</span> <span class="identifier">count</span> <span class="special">&gt;=</span> <span class="number">0</span>
  1674. <span class="identifier">count_bounded</span><span class="special">:</span> <span class="identifier">count</span> <span class="special">&lt;=</span> <span class="identifier">capacity</span>
  1675. <span class="identifier">empty_if_no_elements</span><span class="special">:</span> <span class="identifier">empty</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">count</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  1676. <span class="identifier">feature</span> <span class="special">--</span> <span class="identifier">Initialization</span>
  1677. <span class="special">--</span> <span class="identifier">Allocate</span> <span class="identifier">stack</span> <span class="keyword">for</span> <span class="identifier">a</span> <span class="identifier">maximum</span> <span class="identifier">of</span> <span class="identifier">n</span> <span class="identifier">elements</span><span class="special">.</span>
  1678. <span class="identifier">make</span><span class="special">(</span><span class="identifier">n</span><span class="special">:</span> <span class="identifier">INTEGER</span><span class="special">)</span> <span class="identifier">is</span>
  1679. <span class="identifier">require</span>
  1680. <span class="identifier">non_negative_capacity</span><span class="special">:</span> <span class="identifier">n</span> <span class="special">&gt;=</span> <span class="number">0</span>
  1681. <span class="identifier">ensure</span>
  1682. <span class="identifier">capacity_set</span><span class="special">:</span> <span class="identifier">capacity</span> <span class="special">=</span> <span class="identifier">n</span>
  1683. <span class="identifier">end</span>
  1684. <span class="identifier">feature</span> <span class="special">--</span> <span class="identifier">Access</span>
  1685. <span class="special">--</span> <span class="identifier">Max</span> <span class="identifier">number</span> <span class="identifier">of</span> <span class="identifier">stack</span> <span class="identifier">elements</span><span class="special">.</span>
  1686. <span class="identifier">capacity</span><span class="special">:</span> <span class="identifier">INTEGER</span>
  1687. <span class="special">--</span> <span class="identifier">Number</span> <span class="identifier">of</span> <span class="identifier">stack</span> <span class="identifier">elements</span><span class="special">.</span>
  1688. <span class="identifier">count</span><span class="special">:</span> <span class="identifier">INTEGER</span>
  1689. <span class="special">--</span> <span class="identifier">Top</span> <span class="identifier">element</span><span class="special">.</span>
  1690. <span class="identifier">item</span><span class="special">:</span> <span class="identifier">G</span> <span class="identifier">is</span>
  1691. <span class="identifier">require</span>
  1692. <span class="identifier">not_empty</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">empty</span> <span class="special">--</span> <span class="identifier">i</span><span class="special">.</span><span class="identifier">e</span><span class="special">.,</span> <span class="identifier">count</span> <span class="special">&gt;</span> <span class="number">0</span>
  1693. <span class="identifier">end</span>
  1694. <span class="identifier">feature</span> <span class="special">--</span> <span class="identifier">Status</span> <span class="identifier">report</span>
  1695. <span class="special">--</span> <span class="identifier">Is</span> <span class="identifier">stack</span> <span class="identifier">empty</span><span class="special">?</span>
  1696. <span class="identifier">empty</span><span class="special">:</span> <span class="identifier">BOOLEAN</span> <span class="identifier">is</span>
  1697. <span class="identifier">ensure</span>
  1698. <span class="identifier">empty_definition</span><span class="special">:</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">count</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  1699. <span class="identifier">end</span>
  1700. <span class="special">--</span> <span class="identifier">Is</span> <span class="identifier">stack</span> <span class="identifier">full</span><span class="special">?</span>
  1701. <span class="identifier">full</span><span class="special">:</span> <span class="identifier">BOOLEAN</span> <span class="identifier">is</span>
  1702. <span class="identifier">ensure</span>
  1703. <span class="identifier">full_definition</span><span class="special">:</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">count</span> <span class="special">=</span> <span class="identifier">capacity</span><span class="special">)</span>
  1704. <span class="identifier">end</span>
  1705. <span class="identifier">feature</span> <span class="special">--</span> <span class="identifier">Element</span> <span class="identifier">change</span>
  1706. <span class="special">--</span> <span class="identifier">Add</span> <span class="identifier">x</span> <span class="identifier">on</span> <span class="identifier">top</span><span class="special">.</span>
  1707. <span class="identifier">put</span><span class="special">(</span><span class="identifier">x</span><span class="special">:</span> <span class="identifier">G</span><span class="special">)</span> <span class="identifier">is</span>
  1708. <span class="identifier">require</span>
  1709. <span class="identifier">not_full</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">full</span>
  1710. <span class="identifier">ensure</span>
  1711. <span class="identifier">not_empty</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">empty</span>
  1712. <span class="identifier">added_to_top</span><span class="special">:</span> <span class="identifier">item</span> <span class="special">=</span> <span class="identifier">x</span>
  1713. <span class="identifier">one_more_item</span><span class="special">:</span> <span class="identifier">count</span> <span class="special">=</span> <span class="identifier">old</span> <span class="identifier">count</span> <span class="special">+</span> <span class="number">1</span>
  1714. <span class="identifier">end</span>
  1715. <span class="special">--</span> <span class="identifier">Remove</span> <span class="identifier">top</span> <span class="identifier">element</span><span class="special">.</span>
  1716. <span class="identifier">remove</span> <span class="identifier">is</span>
  1717. <span class="identifier">require</span>
  1718. <span class="identifier">not_empty</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">empty</span> <span class="special">--</span> <span class="identifier">i</span><span class="special">.</span><span class="identifier">e</span><span class="special">.,</span> <span class="identifier">count</span> <span class="special">&gt;</span> <span class="number">0</span>
  1719. <span class="identifier">ensure</span>
  1720. <span class="identifier">not_full</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">full</span>
  1721. <span class="identifier">one_fewer_item</span><span class="special">:</span> <span class="identifier">count</span> <span class="special">=</span> <span class="identifier">old</span> <span class="identifier">count</span> <span class="special">-</span> <span class="number">1</span>
  1722. <span class="identifier">end</span>
  1723. <span class="identifier">end</span> <span class="special">--</span> <span class="keyword">class</span> <span class="identifier">interface</span> <span class="identifier">STACK4</span>
  1724. <span class="special">--</span> <span class="identifier">End</span><span class="special">.</span>
  1725. </pre>
  1726. <p>
  1727. </p>
  1728. </td>
  1729. </tr>
  1730. <tr>
  1731. <td>
  1732. <p>
  1733. </p>
  1734. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="string">"stack4.hpp"</span>
  1735. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  1736. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  1737. <span class="identifier">stack4</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">s</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
  1738. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
  1739. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  1740. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
  1741. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">full</span><span class="special">());</span>
  1742. <span class="identifier">s</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
  1743. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
  1744. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">full</span><span class="special">());</span>
  1745. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
  1746. <span class="identifier">s</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
  1747. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
  1748. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">full</span><span class="special">());</span>
  1749. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  1750. <span class="special">}</span>
  1751. </pre>
  1752. <p>
  1753. </p>
  1754. </td>
  1755. <td>
  1756. </td>
  1757. </tr>
  1758. </tbody>
  1759. </table></div>
  1760. </div>
  1761. <div class="section">
  1762. <div class="titlepage"><div><div><h3 class="title">
  1763. <a name="boost_contract.examples.__meyer97___stack3__error_codes_instead_of_preconditions"></a><a class="link" href="examples.html#boost_contract.examples.__meyer97___stack3__error_codes_instead_of_preconditions" title="[Meyer97] Stack3: Error codes instead of preconditions">[Meyer97]
  1764. Stack3: Error codes instead of preconditions</a>
  1765. </h3></div></div></div>
  1766. <p>
  1767. </p>
  1768. <pre class="programlisting"><span class="comment">// File: stack3.cpp</span>
  1769. <span class="preprocessor">#include</span> <span class="string">"stack4.hpp"</span>
  1770. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1771. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1772. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  1773. <span class="comment">// Dispenser LIFO with max capacity using error codes.</span>
  1774. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  1775. <span class="keyword">class</span> <span class="identifier">stack3</span> <span class="special">{</span>
  1776. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  1777. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1778. <span class="keyword">if</span><span class="special">(!</span><span class="identifier">error</span><span class="special">())</span> <span class="special">{</span>
  1779. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Count non-negative.</span>
  1780. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">capacity</span><span class="special">());</span> <span class="comment">// Count bounded.</span>
  1781. <span class="comment">// Empty if no element.</span>
  1782. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span>
  1783. <span class="special">}</span>
  1784. <span class="special">}</span>
  1785. <span class="keyword">public</span><span class="special">:</span>
  1786. <span class="keyword">enum</span> <span class="identifier">error_code</span> <span class="special">{</span>
  1787. <span class="identifier">no_error</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span>
  1788. <span class="identifier">overflow_error</span><span class="special">,</span>
  1789. <span class="identifier">underflow_error</span><span class="special">,</span>
  1790. <span class="identifier">size_error</span>
  1791. <span class="special">};</span>
  1792. <span class="comment">/* Initialization */</span>
  1793. <span class="comment">// Create stack for max of n elems, if n &lt; 0 set error (no preconditions).</span>
  1794. <span class="keyword">explicit</span> <span class="identifier">stack3</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">default_value</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">())</span> <span class="special">:</span>
  1795. <span class="identifier">stack_</span><span class="special">(</span><span class="number">0</span><span class="special">),</span> <span class="identifier">error_</span><span class="special">(</span><span class="identifier">no_error</span><span class="special">)</span> <span class="special">{</span>
  1796. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1797. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1798. <span class="comment">// Error if impossible.</span>
  1799. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">((</span><span class="identifier">n</span> <span class="special">&lt;</span> <span class="number">0</span><span class="special">)</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">error</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">size_error</span><span class="special">));</span>
  1800. <span class="comment">// No error if possible.</span>
  1801. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">((</span><span class="identifier">n</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">)</span> <span class="special">==</span> <span class="special">!</span><span class="identifier">error</span><span class="special">());</span>
  1802. <span class="comment">// Created if no error.</span>
  1803. <span class="keyword">if</span><span class="special">(!</span><span class="identifier">error</span><span class="special">())</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">n</span><span class="special">);</span>
  1804. <span class="special">})</span>
  1805. <span class="special">;</span>
  1806. <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">)</span> <span class="identifier">stack_</span> <span class="special">=</span> <span class="identifier">stack4</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;(</span><span class="identifier">n</span><span class="special">);</span>
  1807. <span class="keyword">else</span> <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">size_error</span><span class="special">;</span>
  1808. <span class="special">}</span>
  1809. <span class="comment">/* Access */</span>
  1810. <span class="comment">// Max number of stack elements.</span>
  1811. <span class="keyword">int</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1812. <span class="comment">// Check invariants.</span>
  1813. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1814. <span class="keyword">return</span> <span class="identifier">stack_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
  1815. <span class="special">}</span>
  1816. <span class="comment">// Number of stack elements.</span>
  1817. <span class="keyword">int</span> <span class="identifier">count</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1818. <span class="comment">// Check invariants.</span>
  1819. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1820. <span class="keyword">return</span> <span class="identifier">stack_</span><span class="special">.</span><span class="identifier">count</span><span class="special">();</span>
  1821. <span class="special">}</span>
  1822. <span class="comment">// Top element if present, otherwise none and set error (no preconditions).</span>
  1823. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;</span> <span class="identifier">item</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1824. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1825. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1826. <span class="comment">// Error if impossible.</span>
  1827. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">error</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">underflow_error</span><span class="special">));</span>
  1828. <span class="comment">// No error if possible.</span>
  1829. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">!</span><span class="identifier">error</span><span class="special">());</span>
  1830. <span class="special">})</span>
  1831. <span class="special">;</span>
  1832. <span class="keyword">if</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span>
  1833. <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">no_error</span><span class="special">;</span>
  1834. <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;(</span><span class="identifier">stack_</span><span class="special">.</span><span class="identifier">item</span><span class="special">());</span>
  1835. <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
  1836. <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">underflow_error</span><span class="special">;</span>
  1837. <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;();</span>
  1838. <span class="special">}</span>
  1839. <span class="special">}</span>
  1840. <span class="comment">/* Status Report */</span>
  1841. <span class="comment">// Error indicator set by various operations.</span>
  1842. <span class="identifier">error_code</span> <span class="identifier">error</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1843. <span class="comment">// Check invariants.</span>
  1844. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1845. <span class="keyword">return</span> <span class="identifier">error_</span><span class="special">;</span>
  1846. <span class="special">}</span>
  1847. <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1848. <span class="comment">// Check invariants.</span>
  1849. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1850. <span class="keyword">return</span> <span class="identifier">stack_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();</span>
  1851. <span class="special">}</span>
  1852. <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1853. <span class="comment">// Check invariants.</span>
  1854. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1855. <span class="keyword">return</span> <span class="identifier">stack_</span><span class="special">.</span><span class="identifier">full</span><span class="special">();</span>
  1856. <span class="special">}</span>
  1857. <span class="comment">/* Element Change */</span>
  1858. <span class="comment">// Add x to top if capacity allows, otherwise set error (no preconditions).</span>
  1859. <span class="keyword">void</span> <span class="identifier">put</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
  1860. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">&gt;</span> <span class="identifier">old_full</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">full</span><span class="special">());</span>
  1861. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  1862. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1863. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1864. <span class="comment">// Error if impossible.</span>
  1865. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(*</span><span class="identifier">old_full</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">error</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">overflow_error</span><span class="special">));</span>
  1866. <span class="comment">// No error if possible.</span>
  1867. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!*</span><span class="identifier">old_full</span> <span class="special">==</span> <span class="special">!</span><span class="identifier">error</span><span class="special">());</span>
  1868. <span class="keyword">if</span><span class="special">(!</span><span class="identifier">error</span><span class="special">())</span> <span class="special">{</span> <span class="comment">// If no error...</span>
  1869. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span> <span class="comment">// ...not empty.</span>
  1870. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(*</span><span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">x</span><span class="special">);</span> <span class="comment">// ...added to top.</span>
  1871. <span class="comment">// ...one more.</span>
  1872. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span>
  1873. <span class="special">}</span>
  1874. <span class="special">})</span>
  1875. <span class="special">;</span>
  1876. <span class="keyword">if</span><span class="special">(</span><span class="identifier">full</span><span class="special">())</span> <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">overflow_error</span><span class="special">;</span>
  1877. <span class="keyword">else</span> <span class="special">{</span>
  1878. <span class="identifier">stack_</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
  1879. <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">no_error</span><span class="special">;</span>
  1880. <span class="special">}</span>
  1881. <span class="special">}</span>
  1882. <span class="comment">// Remove top element if possible, otherwise set error (no preconditions).</span>
  1883. <span class="keyword">void</span> <span class="identifier">remove</span><span class="special">()</span> <span class="special">{</span>
  1884. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">&gt;</span> <span class="identifier">old_empty</span> <span class="special">=</span>
  1885. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">empty</span><span class="special">());</span>
  1886. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  1887. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1888. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1889. <span class="comment">// Error if impossible.</span>
  1890. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(*</span><span class="identifier">old_empty</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">error</span><span class="special">()</span> <span class="special">==</span>
  1891. <span class="identifier">underflow_error</span><span class="special">));</span>
  1892. <span class="comment">// No error if possible.</span>
  1893. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!*</span><span class="identifier">old_empty</span> <span class="special">==</span> <span class="special">!</span><span class="identifier">error</span><span class="special">());</span>
  1894. <span class="keyword">if</span><span class="special">(!</span><span class="identifier">error</span><span class="special">())</span> <span class="special">{</span> <span class="comment">// If no error...</span>
  1895. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">full</span><span class="special">());</span> <span class="comment">// ...not full.</span>
  1896. <span class="comment">// ...one less.</span>
  1897. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
  1898. <span class="special">}</span>
  1899. <span class="special">})</span>
  1900. <span class="special">;</span>
  1901. <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">underflow_error</span><span class="special">;</span>
  1902. <span class="keyword">else</span> <span class="special">{</span>
  1903. <span class="identifier">stack_</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
  1904. <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">no_error</span><span class="special">;</span>
  1905. <span class="special">}</span>
  1906. <span class="special">}</span>
  1907. <span class="keyword">private</span><span class="special">:</span>
  1908. <span class="identifier">stack4</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">stack_</span><span class="special">;</span>
  1909. <span class="keyword">mutable</span> <span class="identifier">error_code</span> <span class="identifier">error_</span><span class="special">;</span>
  1910. <span class="special">};</span>
  1911. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  1912. <span class="identifier">stack3</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">s</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
  1913. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
  1914. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  1915. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
  1916. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">full</span><span class="special">());</span>
  1917. <span class="identifier">s</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
  1918. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
  1919. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">full</span><span class="special">());</span>
  1920. <span class="identifier">assert</span><span class="special">(*</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
  1921. <span class="identifier">s</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
  1922. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
  1923. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">full</span><span class="special">());</span>
  1924. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  1925. <span class="special">}</span>
  1926. </pre>
  1927. <p>
  1928. </p>
  1929. </div>
  1930. <div class="section">
  1931. <div class="titlepage"><div><div><h3 class="title">
  1932. <a name="boost_contract.examples.__mitchell02___name_list__relaxed_subcontracts"></a><a class="link" href="examples.html#boost_contract.examples.__mitchell02___name_list__relaxed_subcontracts" title="[Mitchell02] Name List: Relaxed subcontracts">[Mitchell02]
  1933. Name List: Relaxed subcontracts</a>
  1934. </h3></div></div></div>
  1935. <p>
  1936. </p>
  1937. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  1938. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
  1939. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
  1940. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">algorithm</span><span class="special">&gt;</span>
  1941. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  1942. <span class="comment">// List of names.</span>
  1943. <span class="keyword">class</span> <span class="identifier">name_list</span> <span class="special">{</span>
  1944. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  1945. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1946. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Non-negative count.</span>
  1947. <span class="special">}</span>
  1948. <span class="keyword">public</span><span class="special">:</span>
  1949. <span class="comment">/* Creation */</span>
  1950. <span class="comment">// Create an empty list.</span>
  1951. <span class="identifier">name_list</span><span class="special">()</span> <span class="special">{</span>
  1952. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1953. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1954. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Empty list.</span>
  1955. <span class="special">})</span>
  1956. <span class="special">;</span>
  1957. <span class="special">}</span>
  1958. <span class="comment">// Destroy list.</span>
  1959. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">name_list</span><span class="special">()</span> <span class="special">{</span>
  1960. <span class="comment">// Check invariants.</span>
  1961. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1962. <span class="special">}</span>
  1963. <span class="comment">/* Basic Queries */</span>
  1964. <span class="comment">// Number of names in list.</span>
  1965. <span class="keyword">int</span> <span class="identifier">count</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  1966. <span class="comment">// Check invariants.</span>
  1967. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  1968. <span class="keyword">return</span> <span class="identifier">names_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
  1969. <span class="special">}</span>
  1970. <span class="comment">// Is name in list?</span>
  1971. <span class="keyword">bool</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">name</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  1972. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  1973. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  1974. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1975. <span class="comment">// If empty, has not.</span>
  1976. <span class="keyword">if</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">result</span><span class="special">);</span>
  1977. <span class="special">})</span>
  1978. <span class="special">;</span>
  1979. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">names_</span><span class="special">.</span><span class="identifier">cend</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">names_</span><span class="special">.</span><span class="identifier">cbegin</span><span class="special">(),</span>
  1980. <span class="identifier">names_</span><span class="special">.</span><span class="identifier">cend</span><span class="special">(),</span> <span class="identifier">name</span><span class="special">);</span>
  1981. <span class="special">}</span>
  1982. <span class="comment">/* Commands */</span>
  1983. <span class="comment">// Add name to list, if name not already in list.</span>
  1984. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">put</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">name</span><span class="special">,</span>
  1985. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span>
  1986. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">&gt;</span> <span class="identifier">old_has_name</span> <span class="special">=</span>
  1987. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">));</span>
  1988. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span>
  1989. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">count</span><span class="special">());</span>
  1990. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  1991. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1992. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">));</span> <span class="comment">// Not already in list.</span>
  1993. <span class="special">})</span>
  1994. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  1995. <span class="keyword">if</span><span class="special">(!*</span><span class="identifier">old_has_name</span><span class="special">)</span> <span class="special">{</span> <span class="comment">// If-guard allows to relax subcontracts.</span>
  1996. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">));</span> <span class="comment">// Name in list.</span>
  1997. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Inc.</span>
  1998. <span class="special">}</span>
  1999. <span class="special">})</span>
  2000. <span class="special">;</span>
  2001. <span class="identifier">names_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">name</span><span class="special">);</span>
  2002. <span class="special">}</span>
  2003. <span class="keyword">private</span><span class="special">:</span>
  2004. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;</span> <span class="identifier">names_</span><span class="special">;</span>
  2005. <span class="special">};</span>
  2006. <span class="keyword">class</span> <span class="identifier">relaxed_name_list</span>
  2007. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">public</span> <span class="identifier">name_list</span>
  2008. <span class="special">:</span> <span class="identifier">BASES</span>
  2009. <span class="special">{</span>
  2010. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2011. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span> <span class="comment">// Subcontracting.</span>
  2012. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  2013. <span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">put</span><span class="special">);</span>
  2014. <span class="keyword">public</span><span class="special">:</span>
  2015. <span class="comment">/* Commands */</span>
  2016. <span class="comment">// Add name to list, or do nothing if name already in list (relaxed).</span>
  2017. <span class="keyword">void</span> <span class="identifier">put</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">name</span><span class="special">,</span>
  2018. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  2019. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">bool</span><span class="special">&gt;</span> <span class="identifier">old_has_name</span> <span class="special">=</span>
  2020. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">));</span>
  2021. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span>
  2022. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">count</span><span class="special">());</span>
  2023. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  2024. <span class="identifier">override_put</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">relaxed_name_list</span><span class="special">::</span><span class="identifier">put</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">name</span><span class="special">)</span>
  2025. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Relax inherited preconditions.</span>
  2026. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">));</span> <span class="comment">// Already in list.</span>
  2027. <span class="special">})</span>
  2028. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span> <span class="comment">// Inherited post. not checked given if-guard.</span>
  2029. <span class="keyword">if</span><span class="special">(*</span><span class="identifier">old_has_name</span><span class="special">)</span> <span class="special">{</span>
  2030. <span class="comment">// Count unchanged if name already in list.</span>
  2031. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span><span class="special">);</span>
  2032. <span class="special">}</span>
  2033. <span class="special">})</span>
  2034. <span class="special">;</span>
  2035. <span class="keyword">if</span><span class="special">(!</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">))</span> <span class="identifier">name_list</span><span class="special">::</span><span class="identifier">put</span><span class="special">(</span><span class="identifier">name</span><span class="special">);</span> <span class="comment">// Else, do nothing.</span>
  2036. <span class="special">}</span>
  2037. <span class="special">};</span>
  2038. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  2039. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="identifier">js</span> <span class="special">=</span> <span class="string">"John Smith"</span><span class="special">;</span>
  2040. <span class="identifier">relaxed_name_list</span> <span class="identifier">rl</span><span class="special">;</span>
  2041. <span class="identifier">rl</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="identifier">js</span><span class="special">);</span>
  2042. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">rl</span><span class="special">.</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">js</span><span class="special">));</span>
  2043. <span class="identifier">rl</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="identifier">js</span><span class="special">);</span> <span class="comment">// OK, relaxed contracts allow calling this again (do nothing).</span>
  2044. <span class="identifier">name_list</span> <span class="identifier">nl</span><span class="special">;</span>
  2045. <span class="identifier">nl</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="identifier">js</span><span class="special">);</span>
  2046. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">nl</span><span class="special">.</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">js</span><span class="special">));</span>
  2047. <span class="comment">// nl.put(js); // Error, contracts do not allow calling this again.</span>
  2048. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  2049. <span class="special">}</span>
  2050. </pre>
  2051. <p>
  2052. </p>
  2053. </div>
  2054. <div class="section">
  2055. <div class="titlepage"><div><div><h3 class="title">
  2056. <a name="boost_contract.examples.__mitchell02___dictionary__key_value_map"></a><a class="link" href="examples.html#boost_contract.examples.__mitchell02___dictionary__key_value_map" title="[Mitchell02] Dictionary: Key-value map">[Mitchell02]
  2057. Dictionary: Key-value map</a>
  2058. </h3></div></div></div>
  2059. <p>
  2060. </p>
  2061. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2062. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">utility</span><span class="special">&gt;</span>
  2063. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">map</span><span class="special">&gt;</span>
  2064. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  2065. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">K</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  2066. <span class="keyword">class</span> <span class="identifier">dictionary</span> <span class="special">{</span>
  2067. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2068. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2069. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Non-negative count.</span>
  2070. <span class="special">}</span>
  2071. <span class="keyword">public</span><span class="special">:</span>
  2072. <span class="comment">/* Creation */</span>
  2073. <span class="comment">// Create empty dictionary.</span>
  2074. <span class="identifier">dictionary</span><span class="special">()</span> <span class="special">{</span>
  2075. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2076. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2077. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Empty.</span>
  2078. <span class="special">})</span>
  2079. <span class="special">;</span>
  2080. <span class="special">}</span>
  2081. <span class="comment">// Destroy dictionary.</span>
  2082. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">dictionary</span><span class="special">()</span> <span class="special">{</span>
  2083. <span class="comment">// Check invariants.</span>
  2084. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2085. <span class="special">}</span>
  2086. <span class="comment">/* Basic Queries */</span>
  2087. <span class="comment">// Number of key entries.</span>
  2088. <span class="keyword">int</span> <span class="identifier">count</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2089. <span class="comment">// Check invariants.</span>
  2090. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2091. <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
  2092. <span class="special">}</span>
  2093. <span class="comment">// Has entry for key?</span>
  2094. <span class="keyword">bool</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">K</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">key</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  2095. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  2096. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2097. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2098. <span class="comment">// Empty has no key.</span>
  2099. <span class="keyword">if</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">result</span><span class="special">);</span>
  2100. <span class="special">})</span>
  2101. <span class="special">;</span>
  2102. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">items_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
  2103. <span class="special">}</span>
  2104. <span class="comment">// Value for a given key.</span>
  2105. <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value_for</span><span class="special">(</span><span class="identifier">K</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">key</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  2106. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2107. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2108. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">key</span><span class="special">));</span> <span class="comment">// Has key.</span>
  2109. <span class="special">})</span>
  2110. <span class="special">;</span>
  2111. <span class="comment">// Find != end because of precondition (no defensive programming).</span>
  2112. <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">key</span><span class="special">)-&gt;</span><span class="identifier">second</span><span class="special">;</span>
  2113. <span class="special">}</span>
  2114. <span class="comment">/* Commands */</span>
  2115. <span class="comment">// Add value of a given key.</span>
  2116. <span class="keyword">void</span> <span class="identifier">put</span><span class="special">(</span><span class="identifier">K</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">key</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  2117. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  2118. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2119. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2120. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">key</span><span class="special">));</span> <span class="comment">// Has not key already.</span>
  2121. <span class="special">})</span>
  2122. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2123. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Count inc.</span>
  2124. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">key</span><span class="special">));</span> <span class="comment">// Has key.</span>
  2125. <span class="comment">// Value set for key.</span>
  2126. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">value_for</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">);</span>
  2127. <span class="special">})</span>
  2128. <span class="special">;</span>
  2129. <span class="identifier">items_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">key</span><span class="special">,</span> <span class="identifier">value</span><span class="special">));</span>
  2130. <span class="special">}</span>
  2131. <span class="comment">// Remove value for given key.</span>
  2132. <span class="keyword">void</span> <span class="identifier">remove</span><span class="special">(</span><span class="identifier">K</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">key</span><span class="special">)</span> <span class="special">{</span>
  2133. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  2134. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2135. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2136. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">key</span><span class="special">));</span> <span class="comment">// Has key.</span>
  2137. <span class="special">})</span>
  2138. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2139. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Count dec.</span>
  2140. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">key</span><span class="special">));</span> <span class="comment">// Has not key.</span>
  2141. <span class="special">})</span>
  2142. <span class="special">;</span>
  2143. <span class="identifier">items_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">key</span><span class="special">);</span>
  2144. <span class="special">}</span>
  2145. <span class="keyword">private</span><span class="special">:</span>
  2146. <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">K</span><span class="special">,</span> <span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">items_</span><span class="special">;</span>
  2147. <span class="special">};</span>
  2148. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  2149. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="identifier">js</span> <span class="special">=</span> <span class="string">"John Smith"</span><span class="special">;</span>
  2150. <span class="identifier">dictionary</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">ages</span><span class="special">;</span>
  2151. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">ages</span><span class="special">.</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">js</span><span class="special">));</span>
  2152. <span class="identifier">ages</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="identifier">js</span><span class="special">,</span> <span class="number">23</span><span class="special">);</span>
  2153. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">ages</span><span class="special">.</span><span class="identifier">value_for</span><span class="special">(</span><span class="identifier">js</span><span class="special">)</span> <span class="special">==</span> <span class="number">23</span><span class="special">);</span>
  2154. <span class="identifier">ages</span><span class="special">.</span><span class="identifier">remove</span><span class="special">(</span><span class="identifier">js</span><span class="special">);</span>
  2155. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">ages</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  2156. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  2157. <span class="special">}</span>
  2158. </pre>
  2159. <p>
  2160. </p>
  2161. </div>
  2162. <div class="section">
  2163. <div class="titlepage"><div><div><h3 class="title">
  2164. <a name="boost_contract.examples.__mitchell02___courier__subcontracting_and_static_class_invariants"></a><a class="link" href="examples.html#boost_contract.examples.__mitchell02___courier__subcontracting_and_static_class_invariants" title="[Mitchell02] Courier: Subcontracting and static class invariants">[Mitchell02]
  2165. Courier: Subcontracting and static class invariants</a>
  2166. </h3></div></div></div>
  2167. <p>
  2168. </p>
  2169. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2170. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
  2171. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  2172. <span class="keyword">struct</span> <span class="identifier">package</span> <span class="special">{</span>
  2173. <span class="keyword">double</span> <span class="identifier">weight_kg</span><span class="special">;</span>
  2174. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">location</span><span class="special">;</span>
  2175. <span class="keyword">double</span> <span class="identifier">accepted_hour</span><span class="special">;</span>
  2176. <span class="keyword">double</span> <span class="identifier">delivered_hour</span><span class="special">;</span>
  2177. <span class="keyword">explicit</span> <span class="identifier">package</span><span class="special">(</span>
  2178. <span class="keyword">double</span> <span class="identifier">_weight_kg</span><span class="special">,</span>
  2179. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">_location</span> <span class="special">=</span> <span class="string">""</span><span class="special">,</span>
  2180. <span class="keyword">double</span> <span class="identifier">_accepted_hour</span> <span class="special">=</span> <span class="number">0.0</span><span class="special">,</span>
  2181. <span class="keyword">double</span> <span class="identifier">_delivered_hour</span> <span class="special">=</span> <span class="number">0.0</span>
  2182. <span class="special">)</span> <span class="special">:</span>
  2183. <span class="identifier">weight_kg</span><span class="special">(</span><span class="identifier">_weight_kg</span><span class="special">),</span>
  2184. <span class="identifier">location</span><span class="special">(</span><span class="identifier">_location</span><span class="special">),</span>
  2185. <span class="identifier">accepted_hour</span><span class="special">(</span><span class="identifier">_accepted_hour</span><span class="special">),</span>
  2186. <span class="identifier">delivered_hour</span><span class="special">(</span><span class="identifier">_delivered_hour</span><span class="special">)</span>
  2187. <span class="special">{}</span>
  2188. <span class="special">};</span>
  2189. <span class="comment">// Courier for package delivery.</span>
  2190. <span class="keyword">class</span> <span class="identifier">courier</span>
  2191. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">courier</span><span class="special">&gt;</span>
  2192. <span class="special">:</span> <span class="identifier">BASES</span>
  2193. <span class="special">{</span>
  2194. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2195. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  2196. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  2197. <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">static_invariant</span><span class="special">()</span> <span class="special">{</span>
  2198. <span class="comment">// Positive min. insurance.</span>
  2199. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">min_insurance_usd</span> <span class="special">&gt;=</span> <span class="number">0.0</span><span class="special">);</span>
  2200. <span class="special">}</span>
  2201. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2202. <span class="comment">// Above min. insurance.</span>
  2203. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">insurance_cover_usd</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">min_insurance_usd</span><span class="special">);</span>
  2204. <span class="special">}</span>
  2205. <span class="keyword">public</span><span class="special">:</span>
  2206. <span class="keyword">static</span> <span class="keyword">double</span> <span class="identifier">min_insurance_usd</span><span class="special">;</span>
  2207. <span class="comment">/* Creation */</span>
  2208. <span class="comment">// Create courier with specified insurance value.</span>
  2209. <span class="keyword">explicit</span> <span class="identifier">courier</span><span class="special">(</span><span class="keyword">double</span> <span class="identifier">_insurance_cover_usd</span> <span class="special">=</span> <span class="identifier">min_insurance_usd</span><span class="special">)</span> <span class="special">:</span>
  2210. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">courier</span><span class="special">&gt;([&amp;]</span> <span class="special">{</span>
  2211. <span class="comment">// Positive insurance.</span>
  2212. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">_insurance_cover_usd</span> <span class="special">&gt;=</span> <span class="number">0.0</span><span class="special">);</span>
  2213. <span class="special">}),</span>
  2214. <span class="identifier">insurance_cover_usd_</span><span class="special">(</span><span class="identifier">_insurance_cover_usd</span><span class="special">)</span>
  2215. <span class="special">{</span>
  2216. <span class="comment">// Check invariants.</span>
  2217. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2218. <span class="special">}</span>
  2219. <span class="comment">// Destroy courier.</span>
  2220. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">courier</span><span class="special">()</span> <span class="special">{</span>
  2221. <span class="comment">// Check invariants.</span>
  2222. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2223. <span class="special">}</span>
  2224. <span class="comment">/* Queries */</span>
  2225. <span class="comment">// Return insurance cover.</span>
  2226. <span class="keyword">double</span> <span class="identifier">insurance_cover_usd</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2227. <span class="comment">// Check invariants.</span>
  2228. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2229. <span class="keyword">return</span> <span class="identifier">insurance_cover_usd_</span><span class="special">;</span>
  2230. <span class="special">}</span>
  2231. <span class="comment">/* Commands */</span>
  2232. <span class="comment">// Deliver package to destination.</span>
  2233. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">deliver</span><span class="special">(</span>
  2234. <span class="identifier">package</span><span class="special">&amp;</span> <span class="identifier">package_delivery</span><span class="special">,</span>
  2235. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
  2236. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span>
  2237. <span class="special">)</span> <span class="special">{</span>
  2238. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  2239. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2240. <span class="comment">// Within max weight of this delivery.</span>
  2241. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">weight_kg</span> <span class="special">&lt;</span> <span class="number">5.0</span><span class="special">);</span>
  2242. <span class="special">})</span>
  2243. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2244. <span class="comment">// Within max delivery type.</span>
  2245. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="keyword">double</span><span class="special">(</span><span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">delivered_hour</span> <span class="special">-</span>
  2246. <span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">accepted_hour</span><span class="special">)</span> <span class="special">&lt;=</span> <span class="number">3.0</span><span class="special">);</span>
  2247. <span class="comment">// Delivered at destination.</span>
  2248. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">location</span> <span class="special">==</span> <span class="identifier">destination</span><span class="special">);</span>
  2249. <span class="special">})</span>
  2250. <span class="special">;</span>
  2251. <span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">location</span> <span class="special">=</span> <span class="identifier">destination</span><span class="special">;</span>
  2252. <span class="comment">// Delivery takes 2.5 hours.</span>
  2253. <span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">delivered_hour</span> <span class="special">=</span> <span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">accepted_hour</span> <span class="special">+</span> <span class="number">2.5</span><span class="special">;</span>
  2254. <span class="special">}</span>
  2255. <span class="keyword">private</span><span class="special">:</span>
  2256. <span class="keyword">double</span> <span class="identifier">insurance_cover_usd_</span><span class="special">;</span>
  2257. <span class="special">};</span>
  2258. <span class="keyword">double</span> <span class="identifier">courier</span><span class="special">::</span><span class="identifier">min_insurance_usd</span> <span class="special">=</span> <span class="number">10.0e+6</span><span class="special">;</span>
  2259. <span class="comment">// Different courier for package delivery.</span>
  2260. <span class="keyword">class</span> <span class="identifier">different_courier</span>
  2261. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span> <span class="special">\</span>
  2262. <span class="identifier">different_courier</span><span class="special">&gt;,</span> <span class="keyword">public</span> <span class="identifier">courier</span>
  2263. <span class="special">:</span> <span class="identifier">BASES</span>
  2264. <span class="special">{</span>
  2265. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2266. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span> <span class="comment">// Subcontracting.</span>
  2267. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  2268. <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">static_invariant</span><span class="special">()</span> <span class="special">{</span>
  2269. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span> <span class="comment">// Better insurance amount.</span>
  2270. <span class="identifier">different_insurance_usd</span> <span class="special">&gt;=</span> <span class="identifier">courier</span><span class="special">::</span><span class="identifier">min_insurance_usd</span><span class="special">);</span>
  2271. <span class="special">}</span>
  2272. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2273. <span class="comment">// Above different insurance value.</span>
  2274. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">insurance_cover_usd</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">different_insurance_usd</span><span class="special">);</span>
  2275. <span class="special">}</span>
  2276. <span class="identifier">BOOST_CONTRACT_OVERRIDE</span><span class="special">(</span><span class="identifier">deliver</span><span class="special">)</span>
  2277. <span class="keyword">public</span><span class="special">:</span>
  2278. <span class="keyword">static</span> <span class="keyword">double</span> <span class="identifier">different_insurance_usd</span><span class="special">;</span>
  2279. <span class="comment">/* Creation */</span>
  2280. <span class="comment">// Create courier with specified insurance value.</span>
  2281. <span class="keyword">explicit</span> <span class="identifier">different_courier</span><span class="special">(</span>
  2282. <span class="keyword">double</span> <span class="identifier">insurance_cover_usd</span> <span class="special">=</span> <span class="identifier">different_insurance_usd</span><span class="special">)</span> <span class="special">:</span>
  2283. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">different_courier</span><span class="special">&gt;([&amp;]</span> <span class="special">{</span>
  2284. <span class="comment">// Positive insurance value.</span>
  2285. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">insurance_cover_usd</span> <span class="special">&gt;</span> <span class="number">0.0</span><span class="special">);</span>
  2286. <span class="special">}),</span>
  2287. <span class="identifier">courier</span><span class="special">(</span><span class="identifier">insurance_cover_usd</span><span class="special">)</span>
  2288. <span class="special">{</span>
  2289. <span class="comment">// Check invariants.</span>
  2290. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2291. <span class="special">}</span>
  2292. <span class="comment">// Destroy courier.</span>
  2293. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">different_courier</span><span class="special">()</span> <span class="special">{</span>
  2294. <span class="comment">// Check invariants.</span>
  2295. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2296. <span class="special">}</span>
  2297. <span class="comment">/* Commands */</span>
  2298. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">deliver</span><span class="special">(</span>
  2299. <span class="identifier">package</span><span class="special">&amp;</span> <span class="identifier">package_delivery</span><span class="special">,</span>
  2300. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">destination</span><span class="special">,</span>
  2301. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span>
  2302. <span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  2303. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  2304. <span class="identifier">override_deliver</span>
  2305. <span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">different_courier</span><span class="special">::</span><span class="identifier">deliver</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">package_delivery</span><span class="special">,</span> <span class="identifier">destination</span><span class="special">)</span>
  2306. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2307. <span class="comment">// Package can weight more (weaker precondition).</span>
  2308. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">weight_kg</span> <span class="special">&lt;=</span> <span class="number">8.0</span><span class="special">);</span>
  2309. <span class="special">})</span>
  2310. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2311. <span class="comment">// Faster delivery (stronger postcondition).</span>
  2312. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="keyword">double</span><span class="special">(</span><span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">delivered_hour</span> <span class="special">-</span>
  2313. <span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">accepted_hour</span><span class="special">)</span> <span class="special">&lt;=</span> <span class="number">2.0</span><span class="special">);</span>
  2314. <span class="comment">// Inherited "delivery at destination" postcondition.</span>
  2315. <span class="special">})</span>
  2316. <span class="special">;</span>
  2317. <span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">location</span> <span class="special">=</span> <span class="identifier">destination</span><span class="special">;</span>
  2318. <span class="comment">// Delivery takes 0.5 hours.</span>
  2319. <span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">delivered_hour</span> <span class="special">=</span> <span class="identifier">package_delivery</span><span class="special">.</span><span class="identifier">accepted_hour</span> <span class="special">+</span> <span class="number">0.5</span><span class="special">;</span>
  2320. <span class="special">}</span>
  2321. <span class="special">};</span>
  2322. <span class="keyword">double</span> <span class="identifier">different_courier</span><span class="special">::</span><span class="identifier">different_insurance_usd</span> <span class="special">=</span> <span class="number">20.0e+6</span><span class="special">;</span>
  2323. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  2324. <span class="identifier">package</span> <span class="identifier">cups</span><span class="special">(</span><span class="number">3.6</span><span class="special">,</span> <span class="string">"store"</span><span class="special">);</span>
  2325. <span class="identifier">courier</span> <span class="identifier">c</span><span class="special">;</span>
  2326. <span class="identifier">c</span><span class="special">.</span><span class="identifier">deliver</span><span class="special">(</span><span class="identifier">cups</span><span class="special">,</span> <span class="string">"home"</span><span class="special">);</span>
  2327. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">cups</span><span class="special">.</span><span class="identifier">location</span> <span class="special">==</span> <span class="string">"home"</span><span class="special">);</span>
  2328. <span class="identifier">package</span> <span class="identifier">desk</span><span class="special">(</span><span class="number">7.2</span><span class="special">,</span> <span class="string">"store"</span><span class="special">);</span>
  2329. <span class="identifier">different_courier</span> <span class="identifier">dc</span><span class="special">;</span>
  2330. <span class="identifier">dc</span><span class="special">.</span><span class="identifier">deliver</span><span class="special">(</span><span class="identifier">desk</span><span class="special">,</span> <span class="string">"office"</span><span class="special">);</span>
  2331. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">desk</span><span class="special">.</span><span class="identifier">location</span> <span class="special">==</span> <span class="string">"office"</span><span class="special">);</span>
  2332. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  2333. <span class="special">}</span>
  2334. </pre>
  2335. <p>
  2336. </p>
  2337. </div>
  2338. <div class="section">
  2339. <div class="titlepage"><div><div><h3 class="title">
  2340. <a name="boost_contract.examples.__mitchell02___stack__stack_like_container"></a><a class="link" href="examples.html#boost_contract.examples.__mitchell02___stack__stack_like_container" title="[Mitchell02] Stack: Stack-like container">[Mitchell02]
  2341. Stack: Stack-like container</a>
  2342. </h3></div></div></div>
  2343. <p>
  2344. </p>
  2345. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2346. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2347. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
  2348. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  2349. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  2350. <span class="keyword">class</span> <span class="identifier">stack</span> <span class="special">{</span>
  2351. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2352. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2353. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Non-negative count.</span>
  2354. <span class="special">}</span>
  2355. <span class="keyword">public</span><span class="special">:</span>
  2356. <span class="comment">/* Creation */</span>
  2357. <span class="comment">// Create empty stack.</span>
  2358. <span class="identifier">stack</span><span class="special">()</span> <span class="special">{</span>
  2359. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2360. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2361. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Empty.</span>
  2362. <span class="special">})</span>
  2363. <span class="special">;</span>
  2364. <span class="special">}</span>
  2365. <span class="comment">// Destroy stack.</span>
  2366. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">stack</span><span class="special">()</span> <span class="special">{</span>
  2367. <span class="comment">// Check invariants.</span>
  2368. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2369. <span class="special">}</span>
  2370. <span class="comment">/* Basic Queries */</span>
  2371. <span class="comment">// Number of items.</span>
  2372. <span class="keyword">int</span> <span class="identifier">count</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2373. <span class="comment">// Check invariants.</span>
  2374. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2375. <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
  2376. <span class="special">}</span>
  2377. <span class="comment">// Item at index in [1, count()] (as in Eiffel).</span>
  2378. <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">item_at</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">index</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  2379. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2380. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2381. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">index</span> <span class="special">&gt;</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Positive index.</span>
  2382. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">index</span> <span class="special">&lt;=</span> <span class="identifier">count</span><span class="special">());</span> <span class="comment">// Index within count.</span>
  2383. <span class="special">})</span>
  2384. <span class="special">;</span>
  2385. <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">[</span><span class="identifier">index</span> <span class="special">-</span> <span class="number">1</span><span class="special">];</span>
  2386. <span class="special">}</span>
  2387. <span class="comment">/* Derived Queries */</span>
  2388. <span class="comment">// If no items.</span>
  2389. <span class="keyword">bool</span> <span class="identifier">is_empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2390. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  2391. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2392. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2393. <span class="comment">// Consistent with count.</span>
  2394. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span>
  2395. <span class="special">})</span>
  2396. <span class="special">;</span>
  2397. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  2398. <span class="special">}</span>
  2399. <span class="comment">// Top item.</span>
  2400. <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">item</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2401. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;</span> <span class="identifier">result</span><span class="special">;</span> <span class="comment">// Avoid extra construction of T.</span>
  2402. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2403. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2404. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&gt;</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Not empty.</span>
  2405. <span class="special">})</span>
  2406. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2407. <span class="comment">// Item on top.</span>
  2408. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(*</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">item_at</span><span class="special">(</span><span class="identifier">count</span><span class="special">()));</span>
  2409. <span class="special">})</span>
  2410. <span class="special">;</span>
  2411. <span class="keyword">return</span> <span class="special">*(</span><span class="identifier">result</span> <span class="special">=</span> <span class="identifier">item_at</span><span class="special">(</span><span class="identifier">count</span><span class="special">()));</span>
  2412. <span class="special">}</span>
  2413. <span class="comment">/* Commands */</span>
  2414. <span class="comment">// Push item to the top.</span>
  2415. <span class="keyword">void</span> <span class="identifier">put</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">new_item</span><span class="special">)</span> <span class="special">{</span>
  2416. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  2417. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2418. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2419. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Count inc.</span>
  2420. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">new_item</span><span class="special">);</span> <span class="comment">// Item set.</span>
  2421. <span class="special">})</span>
  2422. <span class="special">;</span>
  2423. <span class="identifier">items_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">new_item</span><span class="special">);</span>
  2424. <span class="special">}</span>
  2425. <span class="comment">// Pop top item.</span>
  2426. <span class="keyword">void</span> <span class="identifier">remove</span><span class="special">()</span> <span class="special">{</span>
  2427. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  2428. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2429. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2430. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&gt;</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Not empty.</span>
  2431. <span class="special">})</span>
  2432. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2433. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Count dec.</span>
  2434. <span class="special">})</span>
  2435. <span class="special">;</span>
  2436. <span class="identifier">items_</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span>
  2437. <span class="special">}</span>
  2438. <span class="keyword">private</span><span class="special">:</span>
  2439. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">items_</span><span class="special">;</span>
  2440. <span class="special">};</span>
  2441. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  2442. <span class="identifier">stack</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">s</span><span class="special">;</span>
  2443. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  2444. <span class="identifier">s</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
  2445. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
  2446. <span class="identifier">s</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
  2447. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">is_empty</span><span class="special">());</span>
  2448. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  2449. <span class="special">}</span>
  2450. </pre>
  2451. <p>
  2452. </p>
  2453. </div>
  2454. <div class="section">
  2455. <div class="titlepage"><div><div><h3 class="title">
  2456. <a name="boost_contract.examples.__mitchell02___simple_queue__queue_like_container_and_disable_old_value_copies_for_audit_assertions"></a><a class="link" href="examples.html#boost_contract.examples.__mitchell02___simple_queue__queue_like_container_and_disable_old_value_copies_for_audit_assertions" title="[Mitchell02] Simple Queue: Queue-like container and disable old value copies for audit assertions">[Mitchell02]
  2457. Simple Queue: Queue-like container and disable old value copies for audit assertions</a>
  2458. </h3></div></div></div>
  2459. <p>
  2460. </p>
  2461. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2462. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2463. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
  2464. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  2465. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  2466. <span class="keyword">class</span> <span class="identifier">simple_queue</span>
  2467. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span> <span class="special">\</span>
  2468. <span class="identifier">simple_queue</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  2469. <span class="special">:</span> <span class="identifier">BASES</span>
  2470. <span class="special">{</span>
  2471. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2472. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  2473. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  2474. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2475. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Non-negative count.</span>
  2476. <span class="special">}</span>
  2477. <span class="keyword">public</span><span class="special">:</span>
  2478. <span class="comment">/* Creation */</span>
  2479. <span class="comment">// Create empty queue.</span>
  2480. <span class="keyword">explicit</span> <span class="identifier">simple_queue</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a_capacity</span><span class="special">)</span> <span class="special">:</span>
  2481. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">simple_queue</span><span class="special">&gt;([&amp;]</span> <span class="special">{</span>
  2482. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">a_capacity</span> <span class="special">&gt;</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Positive capacity.</span>
  2483. <span class="special">})</span>
  2484. <span class="special">{</span>
  2485. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2486. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2487. <span class="comment">// Capacity set.</span>
  2488. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">a_capacity</span><span class="special">);</span>
  2489. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">is_empty</span><span class="special">());</span> <span class="comment">// Empty.</span>
  2490. <span class="special">})</span>
  2491. <span class="special">;</span>
  2492. <span class="identifier">items_</span><span class="special">.</span><span class="identifier">reserve</span><span class="special">(</span><span class="identifier">a_capacity</span><span class="special">);</span>
  2493. <span class="special">}</span>
  2494. <span class="comment">// Destroy queue.</span>
  2495. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">simple_queue</span><span class="special">()</span> <span class="special">{</span>
  2496. <span class="comment">// Check invariants.</span>
  2497. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2498. <span class="special">}</span>
  2499. <span class="comment">/* Basic Queries */</span>
  2500. <span class="comment">// Items in queue (in their order).</span>
  2501. <span class="comment">// (Somewhat exposes implementation but allows to check more contracts.)</span>
  2502. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">items</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2503. <span class="comment">// Check invariants.</span>
  2504. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2505. <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">;</span>
  2506. <span class="special">}</span>
  2507. <span class="comment">// Max number of items queue can hold.</span>
  2508. <span class="keyword">int</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2509. <span class="comment">// Check invariants.</span>
  2510. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2511. <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
  2512. <span class="special">}</span>
  2513. <span class="comment">/* Derived Queries */</span>
  2514. <span class="comment">// Number of items.</span>
  2515. <span class="keyword">int</span> <span class="identifier">count</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2516. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  2517. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2518. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2519. <span class="comment">// Return items count.</span>
  2520. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">items</span><span class="special">().</span><span class="identifier">size</span><span class="special">()));</span>
  2521. <span class="special">})</span>
  2522. <span class="special">;</span>
  2523. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
  2524. <span class="special">}</span>
  2525. <span class="comment">// Item at head.</span>
  2526. <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">head</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2527. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;</span> <span class="identifier">result</span><span class="special">;</span>
  2528. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2529. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2530. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">is_empty</span><span class="special">());</span> <span class="comment">// Not empty.</span>
  2531. <span class="special">})</span>
  2532. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2533. <span class="comment">// Return item on top.</span>
  2534. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(*</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">items</span><span class="special">().</span><span class="identifier">at</span><span class="special">(</span><span class="number">0</span><span class="special">));</span>
  2535. <span class="special">})</span>
  2536. <span class="special">;</span>
  2537. <span class="keyword">return</span> <span class="special">*(</span><span class="identifier">result</span> <span class="special">=</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="number">0</span><span class="special">));</span>
  2538. <span class="special">}</span>
  2539. <span class="comment">// If queue contains no item.</span>
  2540. <span class="keyword">bool</span> <span class="identifier">is_empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2541. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  2542. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2543. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2544. <span class="comment">// Consistent with count.</span>
  2545. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span>
  2546. <span class="special">})</span>
  2547. <span class="special">;</span>
  2548. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  2549. <span class="special">}</span>
  2550. <span class="comment">// If queue has no room for another item.</span>
  2551. <span class="keyword">bool</span> <span class="identifier">is_full</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2552. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  2553. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2554. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2555. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span> <span class="comment">// Consistent with size and capacity.</span>
  2556. <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">items</span><span class="special">().</span><span class="identifier">size</span><span class="special">())));</span>
  2557. <span class="special">})</span>
  2558. <span class="special">;</span>
  2559. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">());</span>
  2560. <span class="special">}</span>
  2561. <span class="comment">/* Commands */</span>
  2562. <span class="comment">// Remove head itme and shift all other items.</span>
  2563. <span class="keyword">void</span> <span class="identifier">remove</span><span class="special">()</span> <span class="special">{</span>
  2564. <span class="comment">// Expensive all_equal postcond. and old_items copy might be skipped.</span>
  2565. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">old_items</span><span class="special">;</span>
  2566. <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_CONTRACT_AUDIITS</span>
  2567. <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">items</span><span class="special">())</span>
  2568. <span class="preprocessor">#endif</span> <span class="comment">// Else, leave old pointer null...</span>
  2569. <span class="special">;</span>
  2570. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  2571. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2572. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2573. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">is_empty</span><span class="special">());</span> <span class="comment">// Not empty.</span>
  2574. <span class="special">})</span>
  2575. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2576. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Count dec.</span>
  2577. <span class="comment">// ...following skipped #ifndef AUDITS.</span>
  2578. <span class="keyword">if</span><span class="special">(</span><span class="identifier">old_items</span><span class="special">)</span> <span class="identifier">all_equal</span><span class="special">(</span><span class="identifier">items</span><span class="special">(),</span> <span class="special">*</span><span class="identifier">old_items</span><span class="special">,</span> <span class="comment">/* shifted = */</span> <span class="number">1</span><span class="special">);</span>
  2579. <span class="special">})</span>
  2580. <span class="special">;</span>
  2581. <span class="identifier">items_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">items_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span>
  2582. <span class="special">}</span>
  2583. <span class="comment">// Add item to tail.</span>
  2584. <span class="keyword">void</span> <span class="identifier">put</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">item</span><span class="special">)</span> <span class="special">{</span>
  2585. <span class="comment">// Expensive all_equal postcond. and old_items copy might be skipped.</span>
  2586. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">old_items</span><span class="special">;</span>
  2587. <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_CONTRACT_AUDITS</span>
  2588. <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">items</span><span class="special">())</span>
  2589. <span class="preprocessor">#endif</span> <span class="comment">// Else, leave old pointer null...</span>
  2590. <span class="special">;</span>
  2591. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  2592. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2593. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2594. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">capacity</span><span class="special">());</span> <span class="comment">// Room for add.</span>
  2595. <span class="special">})</span>
  2596. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2597. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Count inc.</span>
  2598. <span class="comment">// Second to last item.</span>
  2599. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">items</span><span class="special">().</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">-</span> <span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">item</span><span class="special">);</span>
  2600. <span class="comment">// ...following skipped #ifndef AUDITS.</span>
  2601. <span class="keyword">if</span><span class="special">(</span><span class="identifier">old_items</span><span class="special">)</span> <span class="identifier">all_equal</span><span class="special">(</span><span class="identifier">items</span><span class="special">(),</span> <span class="special">*</span><span class="identifier">old_items</span><span class="special">);</span>
  2602. <span class="special">})</span>
  2603. <span class="special">;</span>
  2604. <span class="identifier">items_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">item</span><span class="special">);</span>
  2605. <span class="special">}</span>
  2606. <span class="keyword">private</span><span class="special">:</span>
  2607. <span class="comment">// Contract helper.</span>
  2608. <span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">all_equal</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">left</span><span class="special">,</span>
  2609. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">right</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="identifier">offset</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span>
  2610. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  2611. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2612. <span class="comment">// Correct offset.</span>
  2613. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">offset</span><span class="special">);</span>
  2614. <span class="special">})</span>
  2615. <span class="special">;</span>
  2616. <span class="keyword">for</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">offset</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
  2617. <span class="keyword">if</span><span class="special">(</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">i</span> <span class="special">-</span> <span class="identifier">offset</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  2618. <span class="special">}</span>
  2619. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  2620. <span class="special">}</span>
  2621. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">items_</span><span class="special">;</span>
  2622. <span class="special">};</span>
  2623. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  2624. <span class="identifier">simple_queue</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">q</span><span class="special">(</span><span class="number">10</span><span class="special">);</span>
  2625. <span class="identifier">q</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
  2626. <span class="identifier">q</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">456</span><span class="special">);</span>
  2627. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">q</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="number">10</span><span class="special">);</span>
  2628. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">q</span><span class="special">.</span><span class="identifier">head</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
  2629. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">q</span><span class="special">.</span><span class="identifier">is_empty</span><span class="special">());</span>
  2630. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">q</span><span class="special">.</span><span class="identifier">is_full</span><span class="special">());</span>
  2631. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">items</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">items</span><span class="special">();</span>
  2632. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">items</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
  2633. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">items</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="number">456</span><span class="special">);</span>
  2634. <span class="identifier">q</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
  2635. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">q</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
  2636. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  2637. <span class="special">}</span>
  2638. </pre>
  2639. <p>
  2640. </p>
  2641. </div>
  2642. <div class="section">
  2643. <div class="titlepage"><div><div><h3 class="title">
  2644. <a name="boost_contract.examples.__mitchell02___customer_manager__contracts_instead_of_defensive_programming"></a><a class="link" href="examples.html#boost_contract.examples.__mitchell02___customer_manager__contracts_instead_of_defensive_programming" title="[Mitchell02] Customer Manager: Contracts instead of defensive programming">[Mitchell02]
  2645. Customer Manager: Contracts instead of defensive programming</a>
  2646. </h3></div></div></div>
  2647. <p>
  2648. </p>
  2649. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2650. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</span>
  2651. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">map</span><span class="special">&gt;</span>
  2652. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">utility</span><span class="special">&gt;</span>
  2653. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  2654. <span class="comment">// Basic customer information.</span>
  2655. <span class="keyword">struct</span> <span class="identifier">customer_info</span> <span class="special">{</span>
  2656. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">customer_manager</span><span class="special">;</span>
  2657. <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">identifier</span><span class="special">;</span>
  2658. <span class="identifier">identifier</span> <span class="identifier">id</span><span class="special">;</span>
  2659. <span class="keyword">explicit</span> <span class="identifier">customer_info</span><span class="special">(</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">_id</span><span class="special">)</span> <span class="special">:</span>
  2660. <span class="identifier">id</span><span class="special">(</span><span class="identifier">_id</span><span class="special">),</span> <span class="identifier">name_</span><span class="special">(),</span> <span class="identifier">address_</span><span class="special">(),</span> <span class="identifier">birthday_</span><span class="special">()</span> <span class="special">{}</span>
  2661. <span class="keyword">private</span><span class="special">:</span>
  2662. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">name_</span><span class="special">;</span>
  2663. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">address_</span><span class="special">;</span>
  2664. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">birthday_</span><span class="special">;</span>
  2665. <span class="special">};</span>
  2666. <span class="comment">// Manage customers.</span>
  2667. <span class="keyword">class</span> <span class="identifier">customer_manager</span> <span class="special">{</span>
  2668. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2669. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2670. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// Non-negative count.</span>
  2671. <span class="special">}</span>
  2672. <span class="keyword">public</span><span class="special">:</span>
  2673. <span class="comment">/* Creation */</span>
  2674. <span class="identifier">customer_manager</span><span class="special">()</span> <span class="special">{</span>
  2675. <span class="comment">// Check invariants.</span>
  2676. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2677. <span class="special">}</span>
  2678. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">customer_manager</span><span class="special">()</span> <span class="special">{</span>
  2679. <span class="comment">// Check invariants.</span>
  2680. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2681. <span class="special">}</span>
  2682. <span class="comment">/* Basic Queries */</span>
  2683. <span class="keyword">int</span> <span class="identifier">count</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2684. <span class="comment">// Check invariants.</span>
  2685. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2686. <span class="keyword">return</span> <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
  2687. <span class="special">}</span>
  2688. <span class="keyword">bool</span> <span class="identifier">id_active</span><span class="special">(</span><span class="identifier">customer_info</span><span class="special">::</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  2689. <span class="comment">// Check invariants.</span>
  2690. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2691. <span class="keyword">return</span> <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">cend</span><span class="special">();</span>
  2692. <span class="special">}</span>
  2693. <span class="comment">/* Derived Queries */</span>
  2694. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">name_for</span><span class="special">(</span><span class="identifier">customer_info</span><span class="special">::</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  2695. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2696. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2697. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">id_active</span><span class="special">(</span><span class="identifier">id</span><span class="special">));</span> <span class="comment">// Active.</span>
  2698. <span class="special">})</span>
  2699. <span class="special">;</span>
  2700. <span class="comment">// Find != end because of preconditions (no defensive programming).</span>
  2701. <span class="keyword">return</span> <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">)-&gt;</span><span class="identifier">second</span><span class="special">.</span><span class="identifier">name_</span><span class="special">;</span>
  2702. <span class="special">}</span>
  2703. <span class="comment">/* Commands */</span>
  2704. <span class="keyword">void</span> <span class="identifier">add</span><span class="special">(</span><span class="identifier">customer_info</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">info</span><span class="special">)</span> <span class="special">{</span>
  2705. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
  2706. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2707. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2708. <span class="comment">// Not already active.</span>
  2709. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">id_active</span><span class="special">(</span><span class="identifier">info</span><span class="special">.</span><span class="identifier">id</span><span class="special">));</span>
  2710. <span class="special">})</span>
  2711. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2712. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Count inc.</span>
  2713. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">id_active</span><span class="special">(</span><span class="identifier">info</span><span class="special">.</span><span class="identifier">id</span><span class="special">));</span> <span class="comment">// Activated.</span>
  2714. <span class="special">})</span>
  2715. <span class="special">;</span>
  2716. <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">info</span><span class="special">.</span><span class="identifier">id</span><span class="special">,</span> <span class="identifier">customer</span><span class="special">(</span><span class="identifier">info</span><span class="special">)));</span>
  2717. <span class="special">}</span>
  2718. <span class="keyword">void</span> <span class="identifier">set_name</span><span class="special">(</span><span class="identifier">customer_info</span><span class="special">::</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">id</span><span class="special">,</span>
  2719. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">name</span><span class="special">)</span> <span class="special">{</span>
  2720. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2721. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2722. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">id_active</span><span class="special">(</span><span class="identifier">id</span><span class="special">));</span> <span class="comment">// Already active.</span>
  2723. <span class="special">})</span>
  2724. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2725. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">name_for</span><span class="special">(</span><span class="identifier">id</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">name</span><span class="special">);</span> <span class="comment">// Name set.</span>
  2726. <span class="special">})</span>
  2727. <span class="special">;</span>
  2728. <span class="comment">// Find != end because of precondition (no defensive programming).</span>
  2729. <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">)-&gt;</span><span class="identifier">second</span><span class="special">.</span><span class="identifier">name_</span> <span class="special">=</span> <span class="identifier">name</span><span class="special">;</span>
  2730. <span class="special">}</span>
  2731. <span class="keyword">private</span><span class="special">:</span>
  2732. <span class="keyword">class</span> <span class="identifier">agent</span> <span class="special">{};</span> <span class="comment">// Customer agent.</span>
  2733. <span class="keyword">struct</span> <span class="identifier">customer</span> <span class="special">:</span> <span class="identifier">customer_info</span> <span class="special">{</span>
  2734. <span class="identifier">agent</span> <span class="identifier">managing_agent</span><span class="special">;</span>
  2735. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">last_contact</span><span class="special">;</span>
  2736. <span class="keyword">explicit</span> <span class="identifier">customer</span><span class="special">(</span><span class="identifier">customer_info</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">info</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">customer_info</span><span class="special">(</span><span class="identifier">info</span><span class="special">),</span>
  2737. <span class="identifier">managing_agent</span><span class="special">(),</span> <span class="identifier">last_contact</span><span class="special">()</span> <span class="special">{}</span>
  2738. <span class="special">};</span>
  2739. <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special">&lt;</span><span class="identifier">customer_info</span><span class="special">::</span><span class="identifier">identifier</span><span class="special">,</span> <span class="identifier">customer</span><span class="special">&gt;</span> <span class="identifier">customers_</span><span class="special">;</span>
  2740. <span class="special">};</span>
  2741. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  2742. <span class="identifier">customer_manager</span> <span class="identifier">m</span><span class="special">;</span>
  2743. <span class="identifier">customer_info</span> <span class="keyword">const</span> <span class="identifier">js</span><span class="special">(</span><span class="string">"john_smith_123"</span><span class="special">);</span>
  2744. <span class="identifier">m</span><span class="special">.</span><span class="identifier">add</span><span class="special">(</span><span class="identifier">js</span><span class="special">);</span>
  2745. <span class="identifier">m</span><span class="special">.</span><span class="identifier">set_name</span><span class="special">(</span><span class="identifier">js</span><span class="special">.</span><span class="identifier">id</span><span class="special">,</span> <span class="string">"John Smith"</span><span class="special">);</span>
  2746. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">m</span><span class="special">.</span><span class="identifier">name_for</span><span class="special">(</span><span class="identifier">js</span><span class="special">.</span><span class="identifier">id</span><span class="special">)</span> <span class="special">==</span> <span class="string">"John Smith"</span><span class="special">);</span>
  2747. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">m</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
  2748. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">m</span><span class="special">.</span><span class="identifier">id_active</span><span class="special">(</span><span class="identifier">js</span><span class="special">.</span><span class="identifier">id</span><span class="special">));</span>
  2749. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  2750. <span class="special">}</span>
  2751. </pre>
  2752. <p>
  2753. </p>
  2754. </div>
  2755. <div class="section">
  2756. <div class="titlepage"><div><div><h3 class="title">
  2757. <a name="boost_contract.examples.__mitchell02___observer__pure_virtual_functions"></a><a class="link" href="examples.html#boost_contract.examples.__mitchell02___observer__pure_virtual_functions" title="[Mitchell02] Observer: Pure virtual functions">[Mitchell02]
  2758. Observer: Pure virtual functions</a>
  2759. </h3></div></div></div>
  2760. <p>
  2761. </p>
  2762. <pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">OBSERVER_HPP_</span>
  2763. <span class="preprocessor">#define</span> <span class="identifier">OBSERVER_HPP_</span>
  2764. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2765. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  2766. <span class="comment">// Observer.</span>
  2767. <span class="keyword">class</span> <span class="identifier">observer</span> <span class="special">{</span>
  2768. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">subject</span><span class="special">;</span>
  2769. <span class="keyword">public</span><span class="special">:</span>
  2770. <span class="comment">// No inv and no bases so contracts optional if no pre, post, and override.</span>
  2771. <span class="comment">/* Creation */</span>
  2772. <span class="identifier">observer</span><span class="special">()</span> <span class="special">{</span>
  2773. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  2774. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2775. <span class="special">}</span>
  2776. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">observer</span><span class="special">()</span> <span class="special">{</span>
  2777. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  2778. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2779. <span class="special">}</span>
  2780. <span class="comment">/* Commands */</span>
  2781. <span class="comment">// If up-to-date with related subject.</span>
  2782. <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">up_to_date_with_subject</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  2783. <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  2784. <span class="comment">// Update this observer.</span>
  2785. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">update</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  2786. <span class="special">};</span>
  2787. <span class="keyword">bool</span> <span class="identifier">observer</span><span class="special">::</span><span class="identifier">up_to_date_with_subject</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  2788. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  2789. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  2790. <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  2791. <span class="special">}</span>
  2792. <span class="keyword">void</span> <span class="identifier">observer</span><span class="special">::</span><span class="identifier">update</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="special">{</span>
  2793. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  2794. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2795. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">up_to_date_with_subject</span><span class="special">());</span> <span class="comment">// Up-to-date.</span>
  2796. <span class="special">})</span>
  2797. <span class="special">;</span>
  2798. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  2799. <span class="special">}</span>
  2800. <span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
  2801. </pre>
  2802. <p>
  2803. </p>
  2804. <p>
  2805. </p>
  2806. <pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">SUBJECT_HPP_</span>
  2807. <span class="preprocessor">#define</span> <span class="identifier">SUBJECT_HPP_</span>
  2808. <span class="preprocessor">#include</span> <span class="string">"observer.hpp"</span>
  2809. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2810. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
  2811. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">algorithm</span><span class="special">&gt;</span>
  2812. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  2813. <span class="comment">// Subject for observer design pattern.</span>
  2814. <span class="keyword">class</span> <span class="identifier">subject</span> <span class="special">{</span>
  2815. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2816. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2817. <span class="identifier">BOOST_CONTRACT_ASSERT_AUDIT</span><span class="special">(</span><span class="identifier">all_observers_valid</span><span class="special">(</span><span class="identifier">observers</span><span class="special">()));</span> <span class="comment">// Valid.</span>
  2818. <span class="special">}</span>
  2819. <span class="keyword">public</span><span class="special">:</span>
  2820. <span class="comment">/* Creation */</span>
  2821. <span class="comment">// Construct subject with no observer.</span>
  2822. <span class="identifier">subject</span><span class="special">()</span> <span class="special">{</span>
  2823. <span class="comment">// Check invariant.</span>
  2824. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2825. <span class="special">}</span>
  2826. <span class="comment">// Destroy subject.</span>
  2827. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">subject</span><span class="special">()</span> <span class="special">{</span>
  2828. <span class="comment">// Check invariant.</span>
  2829. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2830. <span class="special">}</span>
  2831. <span class="comment">/* Queries */</span>
  2832. <span class="comment">// If given object is attached.</span>
  2833. <span class="keyword">bool</span> <span class="identifier">attached</span><span class="special">(</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">ob</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  2834. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2835. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2836. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">ob</span><span class="special">);</span> <span class="comment">// Not null.</span>
  2837. <span class="special">})</span>
  2838. <span class="special">;</span>
  2839. <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">observers_</span><span class="special">.</span><span class="identifier">cbegin</span><span class="special">(),</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">cend</span><span class="special">(),</span> <span class="identifier">ob</span><span class="special">)</span> <span class="special">!=</span>
  2840. <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">cend</span><span class="special">();</span>
  2841. <span class="special">}</span>
  2842. <span class="comment">/* Commands */</span>
  2843. <span class="comment">// Attach given object as an observer.</span>
  2844. <span class="keyword">void</span> <span class="identifier">attach</span><span class="special">(</span><span class="identifier">observer</span><span class="special">*</span> <span class="identifier">ob</span><span class="special">)</span> <span class="special">{</span>
  2845. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;</span> <span class="special">&gt;</span> <span class="identifier">old_observers</span><span class="special">;</span>
  2846. <span class="preprocessor">#ifdef</span> <span class="identifier">BOOST_CONTRACT_AUDITS</span>
  2847. <span class="identifier">old_observers</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">observers</span><span class="special">());</span>
  2848. <span class="preprocessor">#endif</span>
  2849. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  2850. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2851. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">ob</span><span class="special">);</span> <span class="comment">// Not null.</span>
  2852. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">attached</span><span class="special">(</span><span class="identifier">ob</span><span class="special">));</span> <span class="comment">// Not already attached.</span>
  2853. <span class="special">})</span>
  2854. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2855. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">attached</span><span class="special">(</span><span class="identifier">ob</span><span class="special">));</span> <span class="comment">// Attached.</span>
  2856. <span class="comment">// Others not changed (frame rule).</span>
  2857. <span class="identifier">BOOST_CONTRACT_ASSERT_AUDIT</span><span class="special">(</span><span class="identifier">other_observers_unchanged</span><span class="special">(</span>
  2858. <span class="special">*</span><span class="identifier">old_observers</span><span class="special">,</span> <span class="identifier">observers</span><span class="special">(),</span> <span class="identifier">ob</span><span class="special">));</span>
  2859. <span class="special">})</span>
  2860. <span class="special">;</span>
  2861. <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">ob</span><span class="special">);</span>
  2862. <span class="special">}</span>
  2863. <span class="keyword">protected</span><span class="special">:</span>
  2864. <span class="comment">// Contracts could have been omitted for protected/private with no pre/post.</span>
  2865. <span class="comment">/* Queries */</span>
  2866. <span class="comment">// All observers attached to this subject.</span>
  2867. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;</span> <span class="identifier">observers</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2868. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;</span> <span class="identifier">obs</span><span class="special">;</span>
  2869. <span class="keyword">for</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span><span class="special">*&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">cbegin</span><span class="special">();</span>
  2870. <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">cend</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
  2871. <span class="identifier">obs</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span>
  2872. <span class="special">}</span>
  2873. <span class="keyword">return</span> <span class="identifier">obs</span><span class="special">;</span>
  2874. <span class="special">}</span>
  2875. <span class="comment">/* Commands */</span>
  2876. <span class="comment">// Update all attached observers.</span>
  2877. <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="special">{</span>
  2878. <span class="comment">// Protected members use `function` (no inv and no subcontracting).</span>
  2879. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  2880. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2881. <span class="comment">// All updated.</span>
  2882. <span class="identifier">BOOST_CONTRACT_ASSERT_AUDIT</span><span class="special">(</span><span class="identifier">all_observers_updated</span><span class="special">(</span><span class="identifier">observers</span><span class="special">()));</span>
  2883. <span class="special">})</span>
  2884. <span class="special">;</span>
  2885. <span class="keyword">for</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span><span class="special">*&gt;::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  2886. <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
  2887. <span class="comment">// Class invariants ensure no null pointers in observers but class</span>
  2888. <span class="comment">// invariants not checked for non-public functions so assert here.</span>
  2889. <span class="identifier">assert</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span> <span class="comment">// Pointer not null (defensive programming).</span>
  2890. <span class="special">(*</span><span class="identifier">i</span><span class="special">)-&gt;</span><span class="identifier">update</span><span class="special">();</span>
  2891. <span class="special">}</span>
  2892. <span class="special">}</span>
  2893. <span class="keyword">private</span><span class="special">:</span>
  2894. <span class="comment">/* Contract Helpers */</span>
  2895. <span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">all_observers_valid</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">obs</span><span class="special">)</span> <span class="special">{</span>
  2896. <span class="keyword">for</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">obs</span><span class="special">.</span><span class="identifier">cbegin</span><span class="special">();</span>
  2897. <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">obs</span><span class="special">.</span><span class="identifier">cend</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
  2898. <span class="keyword">if</span><span class="special">(!*</span><span class="identifier">i</span><span class="special">)</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  2899. <span class="special">}</span>
  2900. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  2901. <span class="special">}</span>
  2902. <span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">other_observers_unchanged</span><span class="special">(</span>
  2903. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">old_obs</span><span class="special">,</span>
  2904. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">new_obs</span><span class="special">,</span>
  2905. <span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">ob</span>
  2906. <span class="special">)</span> <span class="special">{</span>
  2907. <span class="comment">// Private members use `function` (no inv and no subcontracting).</span>
  2908. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  2909. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  2910. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">ob</span><span class="special">);</span> <span class="comment">// Not null.</span>
  2911. <span class="special">})</span>
  2912. <span class="special">;</span>
  2913. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;</span> <span class="identifier">remaining</span> <span class="special">=</span> <span class="identifier">new_obs</span><span class="special">;</span>
  2914. <span class="identifier">std</span><span class="special">::</span><span class="identifier">remove</span><span class="special">(</span><span class="identifier">remaining</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">remaining</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">ob</span><span class="special">);</span>
  2915. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">remaining_it</span> <span class="special">=</span>
  2916. <span class="identifier">remaining</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  2917. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">old_it</span> <span class="special">=</span> <span class="identifier">old_obs</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
  2918. <span class="keyword">while</span><span class="special">(</span><span class="identifier">remaining</span><span class="special">.</span><span class="identifier">cend</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">remaining_it</span> <span class="special">&amp;&amp;</span> <span class="identifier">old_obs</span><span class="special">.</span><span class="identifier">cend</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">old_it</span><span class="special">)</span> <span class="special">{</span>
  2919. <span class="keyword">if</span><span class="special">(*</span><span class="identifier">remaining_it</span> <span class="special">!=</span> <span class="special">*</span><span class="identifier">old_it</span><span class="special">)</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  2920. <span class="special">++</span><span class="identifier">remaining_it</span><span class="special">;</span>
  2921. <span class="special">++</span><span class="identifier">old_it</span><span class="special">;</span>
  2922. <span class="special">}</span>
  2923. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  2924. <span class="special">}</span>
  2925. <span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">all_observers_updated</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">obs</span><span class="special">)</span> <span class="special">{</span>
  2926. <span class="keyword">for</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*&gt;::</span><span class="identifier">const_iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">obs</span><span class="special">.</span><span class="identifier">cbegin</span><span class="special">();</span>
  2927. <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">obs</span><span class="special">.</span><span class="identifier">cend</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
  2928. <span class="keyword">if</span><span class="special">(!*</span><span class="identifier">i</span><span class="special">)</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  2929. <span class="keyword">if</span><span class="special">(!(*</span><span class="identifier">i</span><span class="special">)-&gt;</span><span class="identifier">up_to_date_with_subject</span><span class="special">())</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  2930. <span class="special">}</span>
  2931. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  2932. <span class="special">}</span>
  2933. <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">observer</span><span class="special">*&gt;</span> <span class="identifier">observers_</span><span class="special">;</span>
  2934. <span class="special">};</span>
  2935. <span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
  2936. </pre>
  2937. <p>
  2938. </p>
  2939. <p>
  2940. </p>
  2941. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"observer/observer.hpp"</span>
  2942. <span class="preprocessor">#include</span> <span class="string">"observer/subject.hpp"</span>
  2943. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  2944. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  2945. <span class="keyword">int</span> <span class="identifier">test_state</span><span class="special">;</span> <span class="comment">// For testing only.</span>
  2946. <span class="comment">// Implement an actual subject.</span>
  2947. <span class="keyword">class</span> <span class="identifier">concrete_subject</span>
  2948. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">public</span> <span class="identifier">subject</span>
  2949. <span class="special">:</span> <span class="identifier">BASES</span>
  2950. <span class="special">{</span>
  2951. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2952. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span> <span class="comment">// Subcontracting.</span>
  2953. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  2954. <span class="keyword">public</span><span class="special">:</span>
  2955. <span class="keyword">typedef</span> <span class="keyword">int</span> <span class="identifier">state</span><span class="special">;</span> <span class="comment">// Some state being observed.</span>
  2956. <span class="identifier">concrete_subject</span><span class="special">()</span> <span class="special">:</span> <span class="identifier">state_</span><span class="special">()</span> <span class="special">{</span>
  2957. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  2958. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2959. <span class="special">}</span>
  2960. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">concrete_subject</span><span class="special">()</span> <span class="special">{</span>
  2961. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  2962. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2963. <span class="special">}</span>
  2964. <span class="keyword">void</span> <span class="identifier">set_state</span><span class="special">(</span><span class="identifier">state</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">new_state</span><span class="special">)</span> <span class="special">{</span>
  2965. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  2966. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2967. <span class="identifier">state_</span> <span class="special">=</span> <span class="identifier">new_state</span><span class="special">;</span>
  2968. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">state_</span> <span class="special">==</span> <span class="identifier">test_state</span><span class="special">);</span>
  2969. <span class="identifier">notify</span><span class="special">();</span> <span class="comment">// Notify all observers.</span>
  2970. <span class="special">}</span>
  2971. <span class="identifier">state</span> <span class="identifier">get_state</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  2972. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  2973. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2974. <span class="keyword">return</span> <span class="identifier">state_</span><span class="special">;</span>
  2975. <span class="special">}</span>
  2976. <span class="keyword">private</span><span class="special">:</span>
  2977. <span class="identifier">state</span> <span class="identifier">state_</span><span class="special">;</span>
  2978. <span class="special">};</span>
  2979. <span class="comment">// Implement an actual observer.</span>
  2980. <span class="keyword">class</span> <span class="identifier">concrete_observer</span>
  2981. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">public</span> <span class="identifier">observer</span>
  2982. <span class="special">:</span> <span class="identifier">BASES</span>
  2983. <span class="special">{</span>
  2984. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  2985. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span> <span class="comment">// Subcontracting.</span>
  2986. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  2987. <span class="identifier">BOOST_CONTRACT_OVERRIDES</span><span class="special">(</span><span class="identifier">up_to_date_with_subject</span><span class="special">,</span> <span class="identifier">update</span><span class="special">)</span>
  2988. <span class="keyword">public</span><span class="special">:</span>
  2989. <span class="comment">// Create concrete observer.</span>
  2990. <span class="keyword">explicit</span> <span class="identifier">concrete_observer</span><span class="special">(</span><span class="identifier">concrete_subject</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">subj</span><span class="special">)</span> <span class="special">:</span>
  2991. <span class="identifier">subject_</span><span class="special">(</span><span class="identifier">subj</span><span class="special">),</span> <span class="identifier">observed_state_</span><span class="special">()</span> <span class="special">{</span>
  2992. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  2993. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2994. <span class="special">}</span>
  2995. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">concrete_observer</span><span class="special">()</span> <span class="special">{</span>
  2996. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  2997. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  2998. <span class="special">}</span>
  2999. <span class="comment">// Implement base virtual functions.</span>
  3000. <span class="keyword">bool</span> <span class="identifier">up_to_date_with_subject</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  3001. <span class="keyword">const</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3002. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  3003. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3004. <span class="identifier">override_up_to_date_with_subject</span>
  3005. <span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">concrete_observer</span><span class="special">::</span><span class="identifier">up_to_date_with_subject</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3006. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> <span class="comment">// For simplicity, assume always up-to-date.</span>
  3007. <span class="special">}</span>
  3008. <span class="keyword">void</span> <span class="identifier">update</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3009. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3010. <span class="identifier">override_update</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">concrete_observer</span><span class="special">::</span><span class="identifier">update</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3011. <span class="identifier">observed_state_</span> <span class="special">=</span> <span class="identifier">subject_</span><span class="special">.</span><span class="identifier">get_state</span><span class="special">();</span>
  3012. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">observed_state_</span> <span class="special">==</span> <span class="identifier">test_state</span><span class="special">);</span>
  3013. <span class="special">}</span>
  3014. <span class="keyword">private</span><span class="special">:</span>
  3015. <span class="identifier">concrete_subject</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">subject_</span><span class="special">;</span>
  3016. <span class="identifier">concrete_subject</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">observed_state_</span><span class="special">;</span>
  3017. <span class="special">};</span>
  3018. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  3019. <span class="identifier">concrete_subject</span> <span class="identifier">subj</span><span class="special">;</span>
  3020. <span class="identifier">concrete_observer</span> <span class="identifier">ob</span><span class="special">(</span><span class="identifier">subj</span><span class="special">);</span>
  3021. <span class="identifier">subj</span><span class="special">.</span><span class="identifier">attach</span><span class="special">(&amp;</span><span class="identifier">ob</span><span class="special">);</span>
  3022. <span class="identifier">subj</span><span class="special">.</span><span class="identifier">set_state</span><span class="special">(</span><span class="identifier">test_state</span> <span class="special">=</span> <span class="number">123</span><span class="special">);</span>
  3023. <span class="identifier">subj</span><span class="special">.</span><span class="identifier">set_state</span><span class="special">(</span><span class="identifier">test_state</span> <span class="special">=</span> <span class="number">456</span><span class="special">);</span>
  3024. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  3025. <span class="special">}</span>
  3026. </pre>
  3027. <p>
  3028. </p>
  3029. </div>
  3030. <div class="section">
  3031. <div class="titlepage"><div><div><h3 class="title">
  3032. <a name="boost_contract.examples.__mitchell02___counter__subcontracting"></a><a name="Mitchell02_counter_anchor"></a><a class="link" href="examples.html#boost_contract.examples.__mitchell02___counter__subcontracting" title="[Mitchell02] Counter: Subcontracting">[Mitchell02]
  3033. Counter: Subcontracting</a>
  3034. </h3></div></div></div>
  3035. <p>
  3036. </p>
  3037. <pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">PUSH_BUTTON_HPP_</span>
  3038. <span class="preprocessor">#define</span> <span class="identifier">PUSH_BUTTON_HPP_</span>
  3039. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  3040. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  3041. <span class="keyword">class</span> <span class="identifier">push_button</span> <span class="special">{</span>
  3042. <span class="keyword">public</span><span class="special">:</span>
  3043. <span class="comment">// No inv and no bases so contracts optional if no pre, post, and override.</span>
  3044. <span class="comment">/* Creation */</span>
  3045. <span class="comment">// Create an enabled button.</span>
  3046. <span class="identifier">push_button</span><span class="special">()</span> <span class="special">:</span> <span class="identifier">enabled_</span><span class="special">(</span><span class="keyword">true</span><span class="special">)</span> <span class="special">{</span>
  3047. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3048. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3049. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">enabled</span><span class="special">());</span> <span class="comment">// Enabled.</span>
  3050. <span class="special">})</span>
  3051. <span class="special">;</span>
  3052. <span class="special">}</span>
  3053. <span class="comment">// Destroy button.</span>
  3054. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">push_button</span><span class="special">()</span> <span class="special">{</span>
  3055. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  3056. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3057. <span class="special">}</span>
  3058. <span class="comment">/* Queries */</span>
  3059. <span class="comment">// If button is enabled.</span>
  3060. <span class="keyword">bool</span> <span class="identifier">enabled</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3061. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  3062. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3063. <span class="keyword">return</span> <span class="identifier">enabled_</span><span class="special">;</span>
  3064. <span class="special">}</span>
  3065. <span class="comment">/* Commands */</span>
  3066. <span class="comment">// Enable button.</span>
  3067. <span class="keyword">void</span> <span class="identifier">enable</span><span class="special">()</span> <span class="special">{</span>
  3068. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3069. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3070. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">enabled</span><span class="special">());</span> <span class="comment">// Enabled.</span>
  3071. <span class="special">})</span>
  3072. <span class="special">;</span>
  3073. <span class="identifier">enabled_</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
  3074. <span class="special">}</span>
  3075. <span class="comment">// Disable button.</span>
  3076. <span class="keyword">void</span> <span class="identifier">disable</span><span class="special">()</span> <span class="special">{</span>
  3077. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3078. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3079. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">enabled</span><span class="special">());</span> <span class="comment">// Disabled.</span>
  3080. <span class="special">})</span>
  3081. <span class="special">;</span>
  3082. <span class="identifier">enabled_</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
  3083. <span class="special">}</span>
  3084. <span class="comment">// Invoke externally when button clicked.</span>
  3085. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">on_bn_clicked</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  3086. <span class="keyword">private</span><span class="special">:</span>
  3087. <span class="keyword">bool</span> <span class="identifier">enabled_</span><span class="special">;</span>
  3088. <span class="special">};</span>
  3089. <span class="keyword">void</span> <span class="identifier">push_button</span><span class="special">::</span><span class="identifier">on_bn_clicked</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="special">{</span>
  3090. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  3091. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3092. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">enabled</span><span class="special">());</span> <span class="comment">// Enabled.</span>
  3093. <span class="special">})</span>
  3094. <span class="special">;</span>
  3095. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  3096. <span class="special">}</span>
  3097. <span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
  3098. </pre>
  3099. <p>
  3100. </p>
  3101. <p>
  3102. </p>
  3103. <pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">DECREMENT_BUTTON_HPP_</span>
  3104. <span class="preprocessor">#define</span> <span class="identifier">DECREMENT_BUTTON_HPP_</span>
  3105. <span class="preprocessor">#include</span> <span class="string">"push_button.hpp"</span>
  3106. <span class="preprocessor">#include</span> <span class="string">"counter.hpp"</span>
  3107. <span class="preprocessor">#include</span> <span class="string">"../observer/observer.hpp"</span>
  3108. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  3109. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">noncopyable</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  3110. <span class="keyword">class</span> <span class="identifier">decrement_button</span>
  3111. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">public</span> <span class="identifier">push_button</span><span class="special">,</span> <span class="keyword">public</span> <span class="identifier">observer</span><span class="special">,</span> <span class="special">\</span>
  3112. <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span>
  3113. <span class="special">:</span> <span class="identifier">BASES</span>
  3114. <span class="special">{</span>
  3115. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  3116. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  3117. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  3118. <span class="identifier">BOOST_CONTRACT_OVERRIDES</span><span class="special">(</span><span class="identifier">on_bn_clicked</span><span class="special">,</span> <span class="identifier">up_to_date_with_subject</span><span class="special">,</span> <span class="identifier">update</span><span class="special">);</span>
  3119. <span class="keyword">public</span><span class="special">:</span>
  3120. <span class="comment">/* Creation */</span>
  3121. <span class="keyword">explicit</span> <span class="identifier">decrement_button</span><span class="special">(</span><span class="identifier">counter</span><span class="special">&amp;</span> <span class="identifier">a_counter</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">counter_</span><span class="special">(</span><span class="identifier">a_counter</span><span class="special">)</span> <span class="special">{</span>
  3122. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3123. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3124. <span class="comment">// Enable iff positive value.</span>
  3125. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">enabled</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">a_counter</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">&gt;</span> <span class="number">0</span><span class="special">));</span>
  3126. <span class="special">})</span>
  3127. <span class="special">;</span>
  3128. <span class="identifier">counter_</span><span class="special">.</span><span class="identifier">attach</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3129. <span class="special">}</span>
  3130. <span class="comment">// Destroy button.</span>
  3131. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">decrement_button</span><span class="special">()</span> <span class="special">{</span>
  3132. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  3133. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3134. <span class="special">}</span>
  3135. <span class="comment">/* Commands */</span>
  3136. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">on_bn_clicked</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  3137. <span class="comment">/* override */</span> <span class="special">{</span>
  3138. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_value</span> <span class="special">=</span>
  3139. <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">counter_</span><span class="special">.</span><span class="identifier">value</span><span class="special">());</span>
  3140. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3141. <span class="identifier">override_on_bn_clicked</span>
  3142. <span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">decrement_button</span><span class="special">::</span><span class="identifier">on_bn_clicked</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  3143. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3144. <span class="comment">// Counter decremented.</span>
  3145. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">counter_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_value</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
  3146. <span class="special">})</span>
  3147. <span class="special">;</span>
  3148. <span class="identifier">counter_</span><span class="special">.</span><span class="identifier">decrement</span><span class="special">();</span>
  3149. <span class="special">}</span>
  3150. <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">up_to_date_with_subject</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  3151. <span class="keyword">const</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3152. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  3153. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3154. <span class="identifier">override_up_to_date_with_subject</span>
  3155. <span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">decrement_button</span><span class="special">::</span><span class="identifier">up_to_date_with_subject</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3156. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> <span class="comment">// For simplicity, assume always up-to-date.</span>
  3157. <span class="special">}</span>
  3158. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">update</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3159. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3160. <span class="identifier">override_update</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">decrement_button</span><span class="special">::</span><span class="identifier">update</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  3161. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3162. <span class="comment">// Enabled iff positive value.</span>
  3163. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">enabled</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">counter_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">&gt;</span> <span class="number">0</span><span class="special">));</span>
  3164. <span class="special">})</span>
  3165. <span class="special">;</span>
  3166. <span class="keyword">if</span><span class="special">(</span><span class="identifier">counter_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="identifier">disable</span><span class="special">();</span>
  3167. <span class="keyword">else</span> <span class="identifier">enable</span><span class="special">();</span>
  3168. <span class="special">}</span>
  3169. <span class="keyword">private</span><span class="special">:</span>
  3170. <span class="identifier">counter</span><span class="special">&amp;</span> <span class="identifier">counter_</span><span class="special">;</span>
  3171. <span class="special">};</span>
  3172. <span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
  3173. </pre>
  3174. <p>
  3175. </p>
  3176. <p>
  3177. </p>
  3178. <pre class="programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">COUNTER_HPP_</span>
  3179. <span class="preprocessor">#define</span> <span class="identifier">COUNTER_HPP_</span>
  3180. <span class="preprocessor">#include</span> <span class="string">"../observer/subject.hpp"</span>
  3181. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  3182. <span class="keyword">class</span> <span class="identifier">counter</span>
  3183. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">public</span> <span class="identifier">subject</span>
  3184. <span class="special">:</span> <span class="identifier">BASES</span>
  3185. <span class="special">{</span>
  3186. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  3187. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  3188. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  3189. <span class="keyword">public</span><span class="special">:</span>
  3190. <span class="comment">/* Creation */</span>
  3191. <span class="comment">// Construct counter with specified value.</span>
  3192. <span class="keyword">explicit</span> <span class="identifier">counter</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">a_value</span> <span class="special">=</span> <span class="number">10</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">value_</span><span class="special">(</span><span class="identifier">a_value</span><span class="special">)</span> <span class="special">{</span>
  3193. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3194. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3195. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">a_value</span><span class="special">);</span> <span class="comment">// Value set.</span>
  3196. <span class="special">})</span>
  3197. <span class="special">;</span>
  3198. <span class="special">}</span>
  3199. <span class="comment">// Destroy counter.</span>
  3200. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">counter</span><span class="special">()</span> <span class="special">{</span>
  3201. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  3202. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3203. <span class="special">}</span>
  3204. <span class="comment">/* Queries */</span>
  3205. <span class="comment">// Current counter value.</span>
  3206. <span class="keyword">int</span> <span class="identifier">value</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3207. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  3208. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3209. <span class="keyword">return</span> <span class="identifier">value_</span><span class="special">;</span>
  3210. <span class="special">}</span>
  3211. <span class="comment">/* Commands */</span>
  3212. <span class="comment">// Decrement counter value.</span>
  3213. <span class="keyword">void</span> <span class="identifier">decrement</span><span class="special">()</span> <span class="special">{</span>
  3214. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">value</span><span class="special">());</span>
  3215. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3216. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3217. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_value</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Decrement.</span>
  3218. <span class="special">})</span>
  3219. <span class="special">;</span>
  3220. <span class="special">--</span><span class="identifier">value_</span><span class="special">;</span>
  3221. <span class="identifier">notify</span><span class="special">();</span> <span class="comment">// Notify all attached observers.</span>
  3222. <span class="special">}</span>
  3223. <span class="keyword">private</span><span class="special">:</span>
  3224. <span class="keyword">int</span> <span class="identifier">value_</span><span class="special">;</span>
  3225. <span class="special">};</span>
  3226. <span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
  3227. </pre>
  3228. <p>
  3229. </p>
  3230. <p>
  3231. </p>
  3232. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"counter/counter.hpp"</span>
  3233. <span class="preprocessor">#include</span> <span class="string">"counter/decrement_button.hpp"</span>
  3234. <span class="preprocessor">#include</span> <span class="string">"observer/observer.hpp"</span>
  3235. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  3236. <span class="keyword">int</span> <span class="identifier">test_counter</span><span class="special">;</span>
  3237. <span class="keyword">class</span> <span class="identifier">view_of_counter</span>
  3238. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">public</span> <span class="identifier">observer</span>
  3239. <span class="special">:</span> <span class="identifier">BASES</span>
  3240. <span class="special">{</span>
  3241. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  3242. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  3243. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  3244. <span class="identifier">BOOST_CONTRACT_OVERRIDES</span><span class="special">(</span><span class="identifier">up_to_date_with_subject</span><span class="special">,</span> <span class="identifier">update</span><span class="special">)</span>
  3245. <span class="keyword">public</span><span class="special">:</span>
  3246. <span class="comment">/* Creation */</span>
  3247. <span class="comment">// Create view associated with given counter.</span>
  3248. <span class="keyword">explicit</span> <span class="identifier">view_of_counter</span><span class="special">(</span><span class="identifier">counter</span><span class="special">&amp;</span> <span class="identifier">a_counter</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">counter_</span><span class="special">(</span><span class="identifier">a_counter</span><span class="special">)</span> <span class="special">{</span>
  3249. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  3250. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3251. <span class="identifier">counter_</span><span class="special">.</span><span class="identifier">attach</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3252. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">counter_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">test_counter</span><span class="special">);</span>
  3253. <span class="special">}</span>
  3254. <span class="comment">// Destroy view.</span>
  3255. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">view_of_counter</span><span class="special">()</span> <span class="special">{</span>
  3256. <span class="comment">// Could have omitted contracts here (nothing to check).</span>
  3257. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3258. <span class="special">}</span>
  3259. <span class="comment">/* Commands */</span>
  3260. <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">up_to_date_with_subject</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  3261. <span class="keyword">const</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3262. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  3263. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3264. <span class="identifier">override_up_to_date_with_subject</span>
  3265. <span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">view_of_counter</span><span class="special">::</span><span class="identifier">up_to_date_with_subject</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3266. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> <span class="comment">// For simplicity, assume always up-to-date.</span>
  3267. <span class="special">}</span>
  3268. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">update</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3269. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3270. <span class="identifier">override_update</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">view_of_counter</span><span class="special">::</span><span class="identifier">update</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3271. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">counter_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">test_counter</span><span class="special">);</span>
  3272. <span class="special">}</span>
  3273. <span class="keyword">private</span><span class="special">:</span>
  3274. <span class="identifier">counter</span><span class="special">&amp;</span> <span class="identifier">counter_</span><span class="special">;</span>
  3275. <span class="special">};</span>
  3276. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  3277. <span class="identifier">counter</span> <span class="identifier">cnt</span><span class="special">(</span><span class="identifier">test_counter</span> <span class="special">=</span> <span class="number">1</span><span class="special">);</span>
  3278. <span class="identifier">view_of_counter</span> <span class="identifier">view</span><span class="special">(</span><span class="identifier">cnt</span><span class="special">);</span>
  3279. <span class="identifier">decrement_button</span> <span class="identifier">dec</span><span class="special">(</span><span class="identifier">cnt</span><span class="special">);</span>
  3280. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">dec</span><span class="special">.</span><span class="identifier">enabled</span><span class="special">());</span>
  3281. <span class="identifier">test_counter</span><span class="special">--;</span>
  3282. <span class="identifier">dec</span><span class="special">.</span><span class="identifier">on_bn_clicked</span><span class="special">();</span>
  3283. <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">dec</span><span class="special">.</span><span class="identifier">enabled</span><span class="special">());</span>
  3284. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  3285. <span class="special">}</span>
  3286. </pre>
  3287. <p>
  3288. </p>
  3289. </div>
  3290. <div class="section">
  3291. <div class="titlepage"><div><div><h3 class="title">
  3292. <a name="boost_contract.examples.__cline90___vector__comparison_with_a___proposal_syntax"></a><a name="Cline90_vector_anchor"></a><a class="link" href="examples.html#boost_contract.examples.__cline90___vector__comparison_with_a___proposal_syntax" title="[Cline90] Vector: Comparison with A++ proposal syntax">[Cline90]
  3293. Vector: Comparison with A++ proposal syntax</a>
  3294. </h3></div></div></div>
  3295. <div class="informaltable"><table class="table">
  3296. <colgroup>
  3297. <col>
  3298. <col>
  3299. </colgroup>
  3300. <thead><tr>
  3301. <th>
  3302. <p>
  3303. This Library
  3304. </p>
  3305. </th>
  3306. <th>
  3307. <p>
  3308. A++ Proposal (never actually implemented)
  3309. </p>
  3310. </th>
  3311. </tr></thead>
  3312. <tbody>
  3313. <tr>
  3314. <td>
  3315. <p>
  3316. </p>
  3317. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#ifndef</span> <span class="identifier">VECTOR_HPP_</span>
  3318. <span class="preprocessor">#define</span> <span class="identifier">VECTOR_HPP_</span>
  3319. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  3320. <span class="comment">// NOTE: Incomplete contract assertions, addressing only `size`.</span>
  3321. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3322. <span class="keyword">class</span> <span class="identifier">vector</span>
  3323. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  3324. <span class="special">:</span> <span class="identifier">BASES</span>
  3325. <span class="special">{</span>
  3326. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  3327. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  3328. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  3329. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3330. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3331. <span class="special">}</span>
  3332. <span class="keyword">public</span><span class="special">:</span>
  3333. <span class="keyword">explicit</span> <span class="identifier">vector</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">count</span> <span class="special">=</span> <span class="number">10</span><span class="special">)</span> <span class="special">:</span>
  3334. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;([&amp;]</span> <span class="special">{</span>
  3335. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3336. <span class="special">}),</span>
  3337. <span class="identifier">data_</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">]),</span>
  3338. <span class="identifier">size_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span>
  3339. <span class="special">{</span>
  3340. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3341. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3342. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">);</span>
  3343. <span class="special">})</span>
  3344. <span class="special">;</span>
  3345. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">();</span>
  3346. <span class="special">}</span>
  3347. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">vector</span><span class="special">()</span> <span class="special">{</span>
  3348. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3349. <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
  3350. <span class="special">}</span>
  3351. <span class="keyword">int</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3352. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3353. <span class="keyword">return</span> <span class="identifier">size_</span><span class="special">;</span> <span class="comment">// Non-negative result already checked by invariant.</span>
  3354. <span class="special">}</span>
  3355. <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">count</span><span class="special">)</span> <span class="special">{</span>
  3356. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3357. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3358. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3359. <span class="special">})</span>
  3360. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3361. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">);</span>
  3362. <span class="special">})</span>
  3363. <span class="special">;</span>
  3364. <span class="identifier">T</span><span class="special">*</span> <span class="identifier">slice</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">];</span>
  3365. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">count</span> <span class="special">&amp;&amp;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">slice</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
  3366. <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
  3367. <span class="identifier">data_</span> <span class="special">=</span> <span class="identifier">slice</span><span class="special">;</span>
  3368. <span class="identifier">size_</span> <span class="special">=</span> <span class="identifier">count</span><span class="special">;</span>
  3369. <span class="special">}</span>
  3370. <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">[](</span><span class="keyword">int</span> <span class="identifier">index</span><span class="special">)</span> <span class="special">{</span>
  3371. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3372. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3373. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">index</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3374. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">index</span> <span class="special">&lt;</span> <span class="identifier">size</span><span class="special">());</span>
  3375. <span class="special">})</span>
  3376. <span class="special">;</span>
  3377. <span class="keyword">return</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
  3378. <span class="special">}</span>
  3379. <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">[](</span><span class="keyword">int</span> <span class="identifier">index</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  3380. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3381. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3382. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">index</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3383. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">index</span> <span class="special">&lt;</span> <span class="identifier">size</span><span class="special">());</span>
  3384. <span class="special">})</span>
  3385. <span class="special">;</span>
  3386. <span class="keyword">return</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
  3387. <span class="special">}</span>
  3388. <span class="keyword">private</span><span class="special">:</span>
  3389. <span class="identifier">T</span><span class="special">*</span> <span class="identifier">data_</span><span class="special">;</span>
  3390. <span class="keyword">int</span> <span class="identifier">size_</span><span class="special">;</span>
  3391. <span class="special">};</span>
  3392. <span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
  3393. </pre>
  3394. <p>
  3395. </p>
  3396. </td>
  3397. <td>
  3398. <p>
  3399. </p>
  3400. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// Extra spaces, newlines, etc. for visual alignment with this library code.</span>
  3401. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3402. <span class="keyword">class</span> <span class="identifier">vector</span> <span class="special">{</span>
  3403. <span class="identifier">legal</span><span class="special">:</span> <span class="comment">// Class invariants (legal).</span>
  3404. <span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">;</span>
  3405. <span class="keyword">public</span><span class="special">:</span>
  3406. <span class="keyword">explicit</span> <span class="identifier">vector</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">count</span> <span class="special">=</span> <span class="number">10</span><span class="special">)</span> <span class="special">:</span>
  3407. <span class="identifier">data_</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">]),</span>
  3408. <span class="identifier">size_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span>
  3409. <span class="special">{</span>
  3410. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">();</span>
  3411. <span class="special">}</span>
  3412. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">vector</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span> <span class="special">}</span>
  3413. <span class="keyword">int</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">}</span>
  3414. <span class="keyword">void</span> <span class="identifier">resize</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">count</span><span class="special">)</span> <span class="special">{</span>
  3415. <span class="identifier">T</span><span class="special">*</span> <span class="identifier">slice</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">];</span>
  3416. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">count</span> <span class="special">&amp;&amp;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">slice</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
  3417. <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
  3418. <span class="identifier">data_</span> <span class="special">=</span> <span class="identifier">slice</span><span class="special">;</span>
  3419. <span class="identifier">size_</span> <span class="special">=</span> <span class="identifier">count</span><span class="special">;</span>
  3420. <span class="special">}</span>
  3421. <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">[](</span><span class="keyword">int</span> <span class="identifier">index</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span> <span class="special">}</span>
  3422. <span class="identifier">T</span><span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">[](</span><span class="keyword">int</span> <span class="identifier">index</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span> <span class="special">}</span>
  3423. <span class="identifier">axioms</span><span class="special">:</span> <span class="comment">// Preconditions (require) and postconditions (promise) for each func.</span>
  3424. <span class="special">[</span><span class="keyword">int</span> <span class="identifier">count</span><span class="special">;</span> <span class="identifier">require</span> <span class="identifier">count</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">promise</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">]</span> <span class="identifier">vector</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
  3425. <span class="special">[</span><span class="keyword">int</span> <span class="identifier">count</span><span class="special">;</span> <span class="identifier">require</span> <span class="identifier">count</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">promise</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">]</span> <span class="identifier">resize</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
  3426. <span class="special">[</span><span class="keyword">int</span> <span class="identifier">index</span><span class="special">;</span> <span class="identifier">require</span> <span class="identifier">index</span> <span class="special">&gt;=</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">index</span> <span class="special">&lt;</span> <span class="identifier">size</span><span class="special">()]</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="identifier">x</span><span class="special">];</span> <span class="comment">// Op[].</span>
  3427. <span class="special">[</span><span class="keyword">int</span> <span class="identifier">index</span><span class="special">;</span> <span class="identifier">require</span> <span class="identifier">index</span> <span class="special">&gt;=</span> <span class="number">0</span> <span class="special">&amp;&amp;</span> <span class="identifier">index</span> <span class="special">&lt;</span> <span class="identifier">size</span><span class="special">()]</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="identifier">x</span><span class="special">]</span> <span class="keyword">const</span><span class="special">;</span> <span class="comment">// Op[].</span>
  3428. <span class="keyword">private</span><span class="special">:</span>
  3429. <span class="identifier">T</span><span class="special">*</span> <span class="identifier">data_</span><span class="special">;</span>
  3430. <span class="keyword">int</span> <span class="identifier">size_</span><span class="special">;</span>
  3431. <span class="special">};</span>
  3432. <span class="comment">// End.</span>
  3433. </pre>
  3434. <p>
  3435. </p>
  3436. </td>
  3437. </tr>
  3438. <tr>
  3439. <td>
  3440. <p>
  3441. </p>
  3442. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="string">"vector.hpp"</span>
  3443. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  3444. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  3445. <span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">v</span> <span class="special">(</span><span class="number">3</span><span class="special">);</span>
  3446. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
  3447. <span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">123</span><span class="special">;</span>
  3448. <span class="identifier">v</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
  3449. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
  3450. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">2</span><span class="special">);</span>
  3451. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  3452. <span class="special">}</span>
  3453. </pre>
  3454. <p>
  3455. </p>
  3456. </td>
  3457. <td>
  3458. </td>
  3459. </tr>
  3460. </tbody>
  3461. </table></div>
  3462. </div>
  3463. <div class="section">
  3464. <div class="titlepage"><div><div><h3 class="title">
  3465. <a name="boost_contract.examples.__cline90___stack__stack_like_container"></a><a class="link" href="examples.html#boost_contract.examples.__cline90___stack__stack_like_container" title="[Cline90] Stack: Stack-like container">[Cline90]
  3466. Stack: Stack-like container</a>
  3467. </h3></div></div></div>
  3468. <p>
  3469. </p>
  3470. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  3471. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  3472. <span class="comment">// NOTE: Incomplete contract assertions, addressing only `empty` and `full`.</span>
  3473. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3474. <span class="keyword">class</span> <span class="identifier">stack</span>
  3475. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">stack</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;</span>
  3476. <span class="special">:</span> <span class="identifier">BASES</span>
  3477. <span class="special">{</span>
  3478. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  3479. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  3480. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  3481. <span class="keyword">public</span><span class="special">:</span>
  3482. <span class="keyword">explicit</span> <span class="identifier">stack</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">capacity</span><span class="special">)</span> <span class="special">:</span>
  3483. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">stack</span><span class="special">&gt;([&amp;]</span> <span class="special">{</span>
  3484. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3485. <span class="special">}),</span>
  3486. <span class="identifier">data_</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">capacity</span><span class="special">]),</span> <span class="identifier">capacity_</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">),</span> <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span>
  3487. <span class="special">{</span>
  3488. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3489. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3490. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">());</span>
  3491. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">full</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">capacity</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span>
  3492. <span class="special">})</span>
  3493. <span class="special">;</span>
  3494. <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">capacity_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">();</span>
  3495. <span class="special">}</span>
  3496. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">stack</span><span class="special">()</span> <span class="special">{</span>
  3497. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3498. <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
  3499. <span class="special">}</span>
  3500. <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3501. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3502. <span class="keyword">return</span> <span class="identifier">size_</span> <span class="special">==</span> <span class="number">0</span><span class="special">;</span>
  3503. <span class="special">}</span>
  3504. <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3505. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3506. <span class="keyword">return</span> <span class="identifier">size_</span> <span class="special">==</span> <span class="identifier">capacity_</span><span class="special">;</span>
  3507. <span class="special">}</span>
  3508. <span class="keyword">void</span> <span class="identifier">push</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">{</span>
  3509. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3510. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3511. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">full</span><span class="special">());</span>
  3512. <span class="special">})</span>
  3513. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3514. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  3515. <span class="special">})</span>
  3516. <span class="special">;</span>
  3517. <span class="identifier">data_</span><span class="special">[</span><span class="identifier">size_</span><span class="special">++]</span> <span class="special">=</span> <span class="identifier">value</span><span class="special">;</span>
  3518. <span class="special">}</span>
  3519. <span class="identifier">T</span> <span class="identifier">pop</span><span class="special">()</span> <span class="special">{</span>
  3520. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3521. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3522. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  3523. <span class="special">})</span>
  3524. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3525. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">full</span><span class="special">());</span>
  3526. <span class="special">})</span>
  3527. <span class="special">;</span>
  3528. <span class="keyword">return</span> <span class="identifier">data_</span><span class="special">[--</span><span class="identifier">size_</span><span class="special">];</span>
  3529. <span class="special">}</span>
  3530. <span class="keyword">private</span><span class="special">:</span>
  3531. <span class="identifier">T</span><span class="special">*</span> <span class="identifier">data_</span><span class="special">;</span>
  3532. <span class="keyword">int</span> <span class="identifier">capacity_</span><span class="special">;</span>
  3533. <span class="keyword">int</span> <span class="identifier">size_</span><span class="special">;</span>
  3534. <span class="special">};</span>
  3535. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  3536. <span class="identifier">stack</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">s</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
  3537. <span class="identifier">s</span><span class="special">.</span><span class="identifier">push</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
  3538. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">pop</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
  3539. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  3540. <span class="special">}</span>
  3541. </pre>
  3542. <p>
  3543. </p>
  3544. </div>
  3545. <div class="section">
  3546. <div class="titlepage"><div><div><h3 class="title">
  3547. <a name="boost_contract.examples.__cline90___vector_stack__subcontracting"></a><a class="link" href="examples.html#boost_contract.examples.__cline90___vector_stack__subcontracting" title="[Cline90] Vector-Stack: Subcontracting">[Cline90]
  3548. Vector-Stack: Subcontracting</a>
  3549. </h3></div></div></div>
  3550. <p>
  3551. </p>
  3552. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"vector.hpp"</span>
  3553. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  3554. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  3555. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  3556. <span class="comment">// NOTE: Incomplete contract assertions, addressing only `empty` and `full`.</span>
  3557. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3558. <span class="keyword">class</span> <span class="identifier">abstract_stack</span> <span class="special">{</span>
  3559. <span class="keyword">public</span><span class="special">:</span>
  3560. <span class="identifier">abstract_stack</span><span class="special">()</span> <span class="special">{</span>
  3561. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3562. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3563. <span class="comment">// AXIOM as empty() cannot actually be checked here to avoid</span>
  3564. <span class="comment">// calling pure virtual function length() during construction).</span>
  3565. <span class="identifier">BOOST_CONTRACT_ASSERT_AXIOM</span><span class="special">(</span><span class="identifier">empty</span><span class="special">());</span>
  3566. <span class="special">})</span>
  3567. <span class="special">;</span>
  3568. <span class="special">}</span>
  3569. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">abstract_stack</span><span class="special">()</span> <span class="special">{</span>
  3570. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3571. <span class="special">}</span>
  3572. <span class="keyword">bool</span> <span class="identifier">full</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3573. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  3574. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3575. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3576. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">capacity</span><span class="special">()));</span>
  3577. <span class="special">})</span>
  3578. <span class="special">;</span>
  3579. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">capacity</span><span class="special">());</span>
  3580. <span class="special">}</span>
  3581. <span class="keyword">bool</span> <span class="identifier">empty</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3582. <span class="keyword">bool</span> <span class="identifier">result</span><span class="special">;</span>
  3583. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3584. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3585. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">));</span>
  3586. <span class="special">})</span>
  3587. <span class="special">;</span>
  3588. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  3589. <span class="special">}</span>
  3590. <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="identifier">length</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  3591. <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="identifier">capacity</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  3592. <span class="keyword">virtual</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">item</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  3593. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">push</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  3594. <span class="keyword">virtual</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">pop</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  3595. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">clear</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  3596. <span class="special">};</span>
  3597. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3598. <span class="keyword">int</span> <span class="identifier">abstract_stack</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">length</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  3599. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  3600. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  3601. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">(</span><span class="keyword">int</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  3602. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3603. <span class="special">})</span>
  3604. <span class="special">;</span>
  3605. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  3606. <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span>
  3607. <span class="special">}</span>
  3608. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3609. <span class="keyword">int</span> <span class="identifier">abstract_stack</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">capacity</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  3610. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  3611. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  3612. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">(</span><span class="keyword">int</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  3613. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3614. <span class="special">})</span>
  3615. <span class="special">;</span>
  3616. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  3617. <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span>
  3618. <span class="special">}</span>
  3619. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3620. <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abstract_stack</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">item</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span>
  3621. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;</span> <span class="identifier">result</span><span class="special">;</span>
  3622. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  3623. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3624. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  3625. <span class="special">})</span>
  3626. <span class="special">;</span>
  3627. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  3628. <span class="keyword">return</span> <span class="special">*</span><span class="identifier">result</span><span class="special">;</span>
  3629. <span class="special">}</span>
  3630. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3631. <span class="keyword">void</span> <span class="identifier">abstract_stack</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">push</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="special">{</span>
  3632. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  3633. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3634. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">full</span><span class="special">());</span>
  3635. <span class="special">})</span>
  3636. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3637. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  3638. <span class="special">})</span>
  3639. <span class="special">;</span>
  3640. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  3641. <span class="special">}</span>
  3642. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3643. <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abstract_stack</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">pop</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="special">{</span>
  3644. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;</span> <span class="identifier">result</span><span class="special">;</span>
  3645. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">old_item</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">item</span><span class="special">());</span>
  3646. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  3647. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3648. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span>
  3649. <span class="special">})</span>
  3650. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
  3651. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(!</span><span class="identifier">full</span><span class="special">());</span>
  3652. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(*</span><span class="identifier">result</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">old_item</span><span class="special">);</span>
  3653. <span class="special">})</span>
  3654. <span class="special">;</span>
  3655. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  3656. <span class="keyword">return</span> <span class="special">*</span><span class="identifier">result</span><span class="special">;</span>
  3657. <span class="special">}</span>
  3658. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3659. <span class="keyword">void</span> <span class="identifier">abstract_stack</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">clear</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span><span class="special">)</span> <span class="special">{</span>
  3660. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
  3661. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3662. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">empty</span><span class="special">());</span>
  3663. <span class="special">})</span>
  3664. <span class="special">;</span>
  3665. <span class="identifier">assert</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
  3666. <span class="special">}</span>
  3667. <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">&gt;</span>
  3668. <span class="keyword">class</span> <span class="identifier">vstack</span>
  3669. <span class="preprocessor">#define</span> <span class="identifier">BASES</span> <span class="keyword">private</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span> <span class="special">\</span>
  3670. <span class="identifier">vstack</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="special">&gt;,</span> <span class="keyword">public</span> <span class="identifier">abstract_stack</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span>
  3671. <span class="special">:</span> <span class="identifier">BASES</span>
  3672. <span class="special">{</span>
  3673. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  3674. <span class="keyword">typedef</span> <span class="identifier">BOOST_CONTRACT_BASE_TYPES</span><span class="special">(</span><span class="identifier">BASES</span><span class="special">)</span> <span class="identifier">base_types</span><span class="special">;</span>
  3675. <span class="preprocessor">#undef</span> <span class="identifier">BASES</span>
  3676. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3677. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">length</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3678. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">length</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">capacity</span><span class="special">());</span>
  3679. <span class="special">}</span>
  3680. <span class="identifier">BOOST_CONTRACT_OVERRIDES</span><span class="special">(</span><span class="identifier">length</span><span class="special">,</span> <span class="identifier">capacity</span><span class="special">,</span> <span class="identifier">item</span><span class="special">,</span> <span class="identifier">push</span><span class="special">,</span> <span class="identifier">pop</span><span class="special">,</span> <span class="identifier">clear</span><span class="special">)</span>
  3681. <span class="keyword">public</span><span class="special">:</span>
  3682. <span class="keyword">explicit</span> <span class="identifier">vstack</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">count</span> <span class="special">=</span> <span class="number">10</span><span class="special">)</span> <span class="special">:</span>
  3683. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor_precondition</span><span class="special">&lt;</span><span class="identifier">vstack</span><span class="special">&gt;([&amp;]</span> <span class="special">{</span>
  3684. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">count</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
  3685. <span class="special">}),</span>
  3686. <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">count</span><span class="special">),</span> <span class="comment">// OK, executed after precondition so count &gt;= 0.</span>
  3687. <span class="identifier">len_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span>
  3688. <span class="special">{</span>
  3689. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3690. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3691. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
  3692. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">);</span>
  3693. <span class="special">})</span>
  3694. <span class="special">;</span>
  3695. <span class="special">}</span>
  3696. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">vstack</span><span class="special">()</span> <span class="special">{</span>
  3697. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3698. <span class="special">}</span>
  3699. <span class="comment">// Inherited from abstract_stack.</span>
  3700. <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="identifier">length</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">const</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3701. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  3702. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3703. <span class="identifier">override_length</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">vstack</span><span class="special">::</span><span class="identifier">length</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3704. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">len_</span><span class="special">;</span>
  3705. <span class="special">}</span>
  3706. <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="identifier">capacity</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  3707. <span class="keyword">const</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3708. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  3709. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3710. <span class="identifier">override_capacity</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">vstack</span><span class="special">::</span><span class="identifier">capacity</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3711. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
  3712. <span class="special">}</span>
  3713. <span class="keyword">virtual</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">item</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  3714. <span class="keyword">const</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3715. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;</span> <span class="identifier">result</span><span class="special">;</span>
  3716. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3717. <span class="identifier">override_item</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">vstack</span><span class="special">::</span><span class="identifier">item</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3718. <span class="keyword">return</span> <span class="special">*(</span><span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">[</span><span class="identifier">len_</span> <span class="special">-</span> <span class="number">1</span><span class="special">]);</span>
  3719. <span class="special">}</span>
  3720. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">push</span><span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
  3721. <span class="comment">/* override */</span> <span class="special">{</span>
  3722. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3723. <span class="identifier">override_push</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">vstack</span><span class="special">::</span><span class="identifier">push</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
  3724. <span class="identifier">vect_</span><span class="special">[</span><span class="identifier">len_</span><span class="special">++]</span> <span class="special">=</span> <span class="identifier">value</span><span class="special">;</span>
  3725. <span class="special">}</span>
  3726. <span class="keyword">virtual</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">pop</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3727. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&amp;&gt;</span> <span class="identifier">result</span><span class="special">;</span>
  3728. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3729. <span class="identifier">override_pop</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">vstack</span><span class="special">::</span><span class="identifier">pop</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3730. <span class="keyword">return</span> <span class="special">*(</span><span class="identifier">result</span> <span class="special">=</span> <span class="identifier">vect_</span><span class="special">[--</span><span class="identifier">len_</span><span class="special">]);</span>
  3731. <span class="special">}</span>
  3732. <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">clear</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="comment">/* override */</span> <span class="special">{</span>
  3733. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">&lt;</span>
  3734. <span class="identifier">override_clear</span><span class="special">&gt;(</span><span class="identifier">v</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">vstack</span><span class="special">::</span><span class="identifier">clear</span><span class="special">,</span> <span class="keyword">this</span><span class="special">);</span>
  3735. <span class="identifier">len_</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  3736. <span class="special">}</span>
  3737. <span class="keyword">private</span><span class="special">:</span>
  3738. <span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;</span> <span class="identifier">vect_</span><span class="special">;</span>
  3739. <span class="keyword">int</span> <span class="identifier">len_</span><span class="special">;</span>
  3740. <span class="special">};</span>
  3741. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  3742. <span class="identifier">vstack</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">s</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
  3743. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
  3744. <span class="identifier">s</span><span class="special">.</span><span class="identifier">push</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
  3745. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
  3746. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">pop</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
  3747. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  3748. <span class="special">}</span>
  3749. </pre>
  3750. <p>
  3751. </p>
  3752. </div>
  3753. <div class="section">
  3754. <div class="titlepage"><div><div><h3 class="title">
  3755. <a name="boost_contract.examples.__cline90___calendar__a_very_simple_calendar"></a><a class="link" href="examples.html#boost_contract.examples.__cline90___calendar__a_very_simple_calendar" title="[Cline90] Calendar: A very simple calendar">[Cline90]
  3756. Calendar: A very simple calendar</a>
  3757. </h3></div></div></div>
  3758. <p>
  3759. </p>
  3760. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  3761. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
  3762. <span class="keyword">class</span> <span class="identifier">calendar</span> <span class="special">{</span>
  3763. <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>
  3764. <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3765. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">month</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">1</span><span class="special">);</span>
  3766. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">month</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="number">12</span><span class="special">);</span>
  3767. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">date</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="number">1</span><span class="special">);</span>
  3768. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">date</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">days_in</span><span class="special">(</span><span class="identifier">month</span><span class="special">()));</span>
  3769. <span class="special">}</span>
  3770. <span class="keyword">public</span><span class="special">:</span>
  3771. <span class="identifier">calendar</span><span class="special">()</span> <span class="special">:</span> <span class="identifier">month_</span><span class="special">(</span><span class="number">1</span><span class="special">),</span> <span class="identifier">date_</span><span class="special">(</span><span class="number">31</span><span class="special">)</span> <span class="special">{</span>
  3772. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">constructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3773. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3774. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">month</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
  3775. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">date</span><span class="special">()</span> <span class="special">==</span> <span class="number">31</span><span class="special">);</span>
  3776. <span class="special">})</span>
  3777. <span class="special">;</span>
  3778. <span class="special">}</span>
  3779. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">calendar</span><span class="special">()</span> <span class="special">{</span>
  3780. <span class="comment">// Check invariants.</span>
  3781. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">destructor</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3782. <span class="special">}</span>
  3783. <span class="keyword">int</span> <span class="identifier">month</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3784. <span class="comment">// Check invariants.</span>
  3785. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3786. <span class="keyword">return</span> <span class="identifier">month_</span><span class="special">;</span>
  3787. <span class="special">}</span>
  3788. <span class="keyword">int</span> <span class="identifier">date</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  3789. <span class="comment">// Check invariants.</span>
  3790. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
  3791. <span class="keyword">return</span> <span class="identifier">date_</span><span class="special">;</span>
  3792. <span class="special">}</span>
  3793. <span class="keyword">void</span> <span class="identifier">reset</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">new_month</span><span class="special">)</span> <span class="special">{</span>
  3794. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span><span class="keyword">this</span><span class="special">)</span>
  3795. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3796. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">new_month</span> <span class="special">&gt;=</span> <span class="number">1</span><span class="special">);</span>
  3797. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">new_month</span> <span class="special">&lt;=</span> <span class="number">12</span><span class="special">);</span>
  3798. <span class="special">})</span>
  3799. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3800. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">month</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">new_month</span><span class="special">);</span>
  3801. <span class="special">})</span>
  3802. <span class="special">;</span>
  3803. <span class="identifier">month_</span> <span class="special">=</span> <span class="identifier">new_month</span><span class="special">;</span>
  3804. <span class="special">}</span>
  3805. <span class="keyword">private</span><span class="special">:</span>
  3806. <span class="keyword">static</span> <span class="keyword">int</span> <span class="identifier">days_in</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">month</span><span class="special">)</span> <span class="special">{</span>
  3807. <span class="keyword">int</span> <span class="identifier">result</span><span class="special">;</span>
  3808. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">function</span><span class="special">()</span>
  3809. <span class="special">.</span><span class="identifier">precondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3810. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">month</span> <span class="special">&gt;=</span> <span class="number">1</span><span class="special">);</span>
  3811. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">month</span> <span class="special">&lt;=</span> <span class="number">12</span><span class="special">);</span>
  3812. <span class="special">})</span>
  3813. <span class="special">.</span><span class="identifier">postcondition</span><span class="special">([&amp;]</span> <span class="special">{</span>
  3814. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">&gt;=</span> <span class="number">1</span><span class="special">);</span>
  3815. <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="identifier">result</span> <span class="special">&lt;=</span> <span class="number">31</span><span class="special">);</span>
  3816. <span class="special">})</span>
  3817. <span class="special">;</span>
  3818. <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="number">31</span><span class="special">;</span> <span class="comment">// For simplicity, assume all months have 31 days.</span>
  3819. <span class="special">}</span>
  3820. <span class="keyword">int</span> <span class="identifier">month_</span><span class="special">,</span> <span class="identifier">date_</span><span class="special">;</span>
  3821. <span class="special">};</span>
  3822. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
  3823. <span class="identifier">calendar</span> <span class="identifier">cal</span><span class="special">;</span>
  3824. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">cal</span><span class="special">.</span><span class="identifier">date</span><span class="special">()</span> <span class="special">==</span> <span class="number">31</span><span class="special">);</span>
  3825. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">cal</span><span class="special">.</span><span class="identifier">month</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
  3826. <span class="identifier">cal</span><span class="special">.</span><span class="identifier">reset</span><span class="special">(</span><span class="number">8</span><span class="special">);</span> <span class="comment">// Set month </span>
  3827. <span class="identifier">assert</span><span class="special">(</span><span class="identifier">cal</span><span class="special">.</span><span class="identifier">month</span><span class="special">()</span> <span class="special">==</span> <span class="number">8</span><span class="special">);</span>
  3828. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  3829. <span class="special">}</span>
  3830. </pre>
  3831. <p>
  3832. </p>
  3833. </div>
  3834. </div>
  3835. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  3836. <td align="left"></td>
  3837. <td align="right"><div class="copyright-footer">Copyright &#169; 2008-2019 Lorenzo Caminiti<p>
  3838. Distributed under the Boost Software License, Version 1.0 (see accompanying
  3839. file LICENSE_1_0.txt or a copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  3840. </p>
  3841. </div></td>
  3842. </tr></table>
  3843. <hr>
  3844. <div class="spirit-nav">
  3845. <a accesskey="p" href="extras.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
  3846. </div>
  3847. </body>
  3848. </html>