| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027 |
- /*************************************************************************
- * *
- * ODER's Utilities Library. Copyright (C) 2008 Oleh Derevenko. *
- * All rights reserved. e-mail: [email protected] (change all "a" to "e") *
- * *
- * This library is free software; you can redistribute it and/or *
- * modify it under the terms of EITHER: *
- * (1) The GNU Lesser General Public License as published by the Free *
- * Software Foundation; either version 3 of the License, or (at *
- * your option) any later version. The text of the GNU Lesser *
- * General Public License is included with this library in the *
- * file LICENSE-LESSER.TXT. Since LGPL is the extension of GPL *
- * the text of GNU General Public License is also provided for *
- * your information in file LICENSE.TXT. *
- * (2) The BSD-style license that is included with this library in *
- * the file LICENSE-BSD.TXT. *
- * (3) The zlib/libpng license that is included with this library in *
- * the file LICENSE-ZLIB.TXT *
- * *
- * This library is distributed WITHOUT ANY WARRANTY, including implied *
- * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
- * See the files LICENSE.TXT and LICENSE-LESSER.TXT or LICENSE-BSD.TXT *
- * or LICENSE-ZLIB.TXT for more details. *
- * *
- *************************************************************************/
- #include <ou/features.h>
- #include <ou/platform.h>
- #if _OU_COMPILER == _OU_COMPILER_MSVC
- #pragma warning(disable:4786)
- #endif
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
- #include <ou/threadlocalstorage.h>
- #endif
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- #include <ou/atomic.h>
- #endif
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- #include <ou/atomicflags.h>
- #endif
- #include <ou/simpleflags.h>
- #include <ou/flagsdefines.h>
- #include <ou/enumarrays.h>
- #include <ou/templates.h>
- #include <ou/typewrapper.h>
- #include <ou/customization.h>
- #include <ou/inttypes.h>
- #include <ou/macros.h>
- #include <ou/malloc.h>
- #include <ou/namespace.h>
- using namespace _OU_NAMESPACE;
- #include <stdio.h>
- #include <string.h>
- //////////////////////////////////////////////////////////////////////////
- typedef bool (*CFeatureTestProcedure)();
- bool TestSubsystem(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount,
- const unsigned int uiFeatureMax, const char *const *aszFeatureNames, CFeatureTestProcedure const *afnFeatureTests)
- {
- unsigned int nSuccessCount = 0;
-
- for (unsigned int uiSubsystemFeature = 0; uiSubsystemFeature != uiFeatureMax; ++uiSubsystemFeature)
- {
- const char *szFeatureName = aszFeatureNames[uiSubsystemFeature];
- printf("Testing %34s: ", szFeatureName);
-
- CFeatureTestProcedure fnTestProcedure = afnFeatureTests[uiSubsystemFeature];
- bool bTestResult = fnTestProcedure();
- printf("%s\n", bTestResult ? "success" : "*** failure ***");
-
- if (bTestResult)
- {
- nSuccessCount += 1;
- }
- }
-
- nOutSuccessCount = nSuccessCount;
- nOutTestCount = uiFeatureMax;
- return nSuccessCount == uiFeatureMax;
- }
- //////////////////////////////////////////////////////////////////////////
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
- bool g_bTestTLSAPIInitialized = false;
- HTLSKEY g_htkTestTLSKey;
- enum ETESTTLSVALUES
- {
- TTV_FIRSTVALUE,
- TTV_SECONDVALUE,
- TTV__MAX,
- };
- unsigned int g_uiTestTLSDestructorCallCount = 0;
- unsigned int g_uiTestTLSDestructorSuccessCount = 0;
- void _OU_CONVENTION_CALLBACK TestTlsSecondValueDestructor(void *pv_Value)
- {
- g_uiTestTLSDestructorCallCount += 1;
- if (pv_Value == (void *)(&TestTlsSecondValueDestructor))
- {
- g_uiTestTLSDestructorSuccessCount += 1;
- }
- }
- bool TestTls_Initialization()
- {
- bool bResult = false;
-
- do
- {
- if (!CTLSInitialization::InitializeTLSAPI(g_htkTestTLSKey, 1, 0))
- {
- break;
- }
- CTLSInitialization::FinalizeTLSAPI();
- if (!CTLSInitialization::InitializeTLSAPI(g_htkTestTLSKey, TTV__MAX, CTLSInitialization::SIF_MANUAL_CLEANUP_ON_THREAD_EXIT))
- {
- break;
- }
- g_bTestTLSAPIInitialized = true;
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestTls_GetSetValue()
- {
- bool bResult = false;
-
- do
- {
- tlsvaluetype vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
- if (vtFirstValue != 0)
- {
- break;
- }
-
- tlsvaluetype vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
-
- if (vtSecondValue != 0)
- {
- break;
- }
- if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE, (tlsvaluetype)&TestTls_GetSetValue))
- {
- break;
- }
-
- if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)&TestTlsSecondValueDestructor, &TestTlsSecondValueDestructor))
- {
- break;
- }
- vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
- if ((void *)vtFirstValue != &TestTls_GetSetValue)
- {
- break;
- }
- vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
- if ((void *)vtSecondValue != &TestTlsSecondValueDestructor)
- {
- break;
- }
-
- if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, 0, &TestTlsSecondValueDestructor))
- {
- break;
- }
- vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
-
- if (vtSecondValue != 0)
- {
- break;
- }
-
- if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)&TestTlsSecondValueDestructor, &TestTlsSecondValueDestructor))
- {
- break;
- }
-
- if (g_uiTestTLSDestructorCallCount != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestTls_UnsafeGetSetValue()
- {
- bool bResult = false;
-
- do
- {
- tlsvaluetype vtFirstValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
-
- if ((void *)vtFirstValue != &TestTls_GetSetValue)
- {
- break;
- }
-
- tlsvaluetype vtSecondValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
-
- if ((void *)vtSecondValue != &TestTlsSecondValueDestructor)
- {
- break;
- }
- CThreadLocalStorage::UnsafeSetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE, (tlsvaluetype)(size_t)(-1));
- CThreadLocalStorage::UnsafeSetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)(size_t)(-1));
- vtFirstValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
-
- if ((size_t)vtFirstValue != (size_t)(-1))
- {
- break;
- }
-
- vtSecondValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
-
- if ((size_t)vtSecondValue != (size_t)(-1))
- {
- break;
- }
-
- // Safe function used by intent !!!
- vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
-
- if ((size_t)vtFirstValue != (size_t)(-1))
- {
- break;
- }
-
- // Safe function used by intent !!!
- vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
-
- if ((size_t)vtSecondValue != (size_t)(-1))
- {
- break;
- }
-
- CThreadLocalStorage::UnsafeSetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)(&TestTlsSecondValueDestructor));
- if (g_uiTestTLSDestructorCallCount != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestTls_CleanupDestructor()
- {
- bool bResult = false;
-
- do
- {
- CTLSInitialization::CleanupOnThreadExit();
- if (g_uiTestTLSDestructorCallCount != 1 || g_uiTestTLSDestructorSuccessCount != 1)
- {
- break;
- }
-
- tlsvaluetype vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
-
- if (vtFirstValue != 0)
- {
- break;
- }
-
- // Safe function used by intent !!!
- tlsvaluetype vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
-
- if (vtSecondValue != 0)
- {
- break;
- }
- g_uiTestTLSDestructorCallCount = 0;
- g_uiTestTLSDestructorSuccessCount = 0;
- CTLSInitialization::CleanupOnThreadExit();
-
- if (g_uiTestTLSDestructorCallCount != 0)
- {
- break;
- }
-
- if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, 0, &TestTlsSecondValueDestructor))
- {
- break;
- }
-
- CTLSInitialization::CleanupOnThreadExit();
-
- if (g_uiTestTLSDestructorCallCount != 0)
- {
- break;
- }
-
- if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)(size_t)(-1), &TestTlsSecondValueDestructor))
- {
- break;
- }
-
- if (g_uiTestTLSDestructorCallCount != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestTls_Finalization()
- {
- OU_ASSERT(g_bTestTLSAPIInitialized);
- bool bResult = false;
-
- do
- {
- CTLSInitialization::FinalizeTLSAPI();
-
- g_bTestTLSAPIInitialized = false;
- if (g_uiTestTLSDestructorCallCount != 1 || g_uiTestTLSDestructorSuccessCount != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- enum EOUTLSFEATURE
- {
- OHF__MIN,
-
- OHF_INITIALIZATION = OHF__MIN,
- OHF_GETSETVALUE,
- OHF_UNSAFEGETSETVALUE,
- OHF_CLEANUPDESTRUCTOR,
- OHF_FINALIZATION,
-
- OHF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUTLSFEATURE, OHF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestTls_Initialization, // OHF_INITIALIZATION
- &TestTls_GetSetValue, // OHF_GETSETVALUE,
- &TestTls_UnsafeGetSetValue, // OHF_UNSAFEGETSETVALUE,
- &TestTls_CleanupDestructor, // OHF_CLEANUPDESTRUCTOR,
- &TestTls_Finalization, // OHF_FINALIZATION,
- };
- static const CEnumUnsortedElementArray<EOUTLSFEATURE, OHF__MAX, CFeatureTestProcedure> g_afnTlsFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUTLSFEATURE, OHF__MAX, const char *>::m_aetElementArray[] =
- {
- "API Initialization", // OHF_INITIALIZATION
- "Get.../SetStorageValue", // OHF_GETSETVALUE,
- "UnsafeGet.../UnsafeSetStorageValue", // OHF_UNSAFEGETSETVALUE,
- "Storage Cleanup/Value Destructors", // OHF_CLEANUPDESTRUCTOR,
- "API Finalization", // OHF_FINALIZATION,
- };
- static const CEnumUnsortedElementArray<EOUTLSFEATURE, OHF__MAX, const char *> g_aszTlsFeatureTestNames;
- bool TestTLS(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- bool bResult = TestSubsystem(nOutSuccessCount, nOutTestCount, OHF__MAX, g_aszTlsFeatureTestNames.GetStoragePointer(), g_afnTlsFeatureTestProcedures.GetStoragePointer());
- if (g_bTestTLSAPIInitialized)
- {
- CTLSInitialization::FinalizeTLSAPI();
- }
-
- return bResult;
- }
- #endif // #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
- //////////////////////////////////////////////////////////////////////////
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- bool TestAtomic_Increment()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = (atomicord32)(-1);
- // Putting function inside of conditional operator causes
- // incorrect code generation by GCC 4.0.1 on MacOS X Leopard 64 bit.
- atomicord32 aoIncrementFirstResult = AtomicIncrement(&aoStorage);
- if (aoIncrementFirstResult != 0 || aoStorage != (atomicord32)0)
- {
- break;
- }
-
- if (AtomicIncrement(&aoStorage) != (atomicord32)1 || aoStorage != (atomicord32)1)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_Decrement()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = (atomicord32)1;
-
- // Putting function inside of conditional operator causes
- // incorrect code generation by GCC 4.0.1 on MacOS X Leopard 64 bit.
- atomicord32 aoDecrementFirstResult = AtomicDecrement(&aoStorage);
- if (aoDecrementFirstResult != (atomicord32)0 || aoStorage != (atomicord32)0)
- {
- break;
- }
-
- if (AtomicDecrement(&aoStorage) != (atomicord32)(-1) || aoStorage != (atomicord32)(-1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_IncrementNoResult()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = (atomicord32)(-1);
-
- AtomicIncrementNoResult(&aoStorage);
- if (aoStorage != (atomicord32)0)
- {
- break;
- }
-
- AtomicIncrementNoResult(&aoStorage);
- if (aoStorage != (atomicord32)1)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_DecrementNoResult()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = (atomicord32)1;
-
- AtomicDecrementNoResult(&aoStorage);
- if (aoStorage != (atomicord32)0)
- {
- break;
- }
-
- AtomicDecrementNoResult(&aoStorage);
- if (aoStorage != (atomicord32)(-1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_Exchange()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = 0;
- if (AtomicExchange(&aoStorage, (atomicord32)1) != 0 || aoStorage != (atomicord32)1)
- {
- break;
- }
-
- if (AtomicExchange(&aoStorage, (atomicord32)(-1)) != (atomicord32)1 || aoStorage != (atomicord32)(-1))
- {
- break;
- }
-
- if (AtomicExchange(&aoStorage, 0) != (atomicord32)(-1) || aoStorage != 0)
- {
- break;
- }
-
- if (AtomicExchange(&aoStorage, 0) != 0 || aoStorage != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_ExchangeAdd()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = 0;
- if (AtomicExchangeAdd(&aoStorage, (atomicord32)1) != 0 || aoStorage != (atomicord32)1)
- {
- break;
- }
-
- if (AtomicExchangeAdd(&aoStorage, (atomicord32)(-2)) != 1 || aoStorage != (atomicord32)(-1))
- {
- break;
- }
-
- if (AtomicExchangeAdd(&aoStorage, (atomicord32)1) != (atomicord32)(-1) || aoStorage != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_ExchangeAddNoResult()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = 0;
-
- AtomicExchangeAddNoResult(&aoStorage, (atomicord32)1);
-
- if (aoStorage != (atomicord32)1)
- {
- break;
- }
-
- AtomicExchangeAddNoResult(&aoStorage, (atomicord32)(-2));
- if (aoStorage != (atomicord32)(-1))
- {
- break;
- }
-
- AtomicExchangeAddNoResult(&aoStorage, (atomicord32)1);
-
- if (aoStorage != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_CompareExchange()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = 0;
- if (AtomicCompareExchange(&aoStorage, 1, 1) || aoStorage != 0)
- {
- break;
- }
-
- if (!AtomicCompareExchange(&aoStorage, 0, 1) || aoStorage != 1)
- {
- break;
- }
-
- if (!AtomicCompareExchange(&aoStorage, 1, 1) || aoStorage != 1)
- {
- break;
- }
-
- if (!AtomicCompareExchange(&aoStorage, 1, (atomicord32)(-1)) || aoStorage != (atomicord32)(-1))
- {
- break;
- }
-
- if (AtomicCompareExchange(&aoStorage, 1, (atomicord32)(-1)) || aoStorage != (atomicord32)(-1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- const atomicord32 g_aoBitmask = (atomicord32)(OU_INT32_MIN + 1);
- bool TestAtomic_And()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = (atomicord32)OU_UINT32_MAX;
- if (AtomicAnd(&aoStorage, g_aoBitmask) != (atomicord32)OU_UINT32_MAX || aoStorage != g_aoBitmask)
- {
- break;
- }
- if (AtomicAnd(&aoStorage, 0) != g_aoBitmask || aoStorage != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_Or()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = 0;
-
- if (AtomicOr(&aoStorage, g_aoBitmask) != 0 || aoStorage != g_aoBitmask)
- {
- break;
- }
-
- if (AtomicOr(&aoStorage, (atomicord32)OU_UINT32_MAX) != g_aoBitmask || aoStorage != (atomicord32)OU_UINT32_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_Xor()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = 0;
-
- if (AtomicXor(&aoStorage, g_aoBitmask) != 0 || aoStorage != g_aoBitmask)
- {
- break;
- }
-
- if (AtomicXor(&aoStorage, (atomicord32)OU_UINT32_MAX) != g_aoBitmask || aoStorage != (atomicord32)(OU_UINT32_MAX ^ g_aoBitmask))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_AndNoResult()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = (atomicord32)OU_UINT32_MAX;
-
- AtomicAndNoResult(&aoStorage, g_aoBitmask);
- if (aoStorage != g_aoBitmask)
- {
- break;
- }
-
- AtomicAndNoResult(&aoStorage, 0);
- if (aoStorage != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_OrNoResult()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = 0;
-
- AtomicOrNoResult(&aoStorage, g_aoBitmask);
- if (aoStorage != g_aoBitmask)
- {
- break;
- }
-
- AtomicOrNoResult(&aoStorage, (atomicord32)OU_UINT32_MAX);
- if (aoStorage != (atomicord32)OU_UINT32_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_XorNoResult()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicord32 aoStorage = 0;
-
- AtomicXorNoResult(&aoStorage, g_aoBitmask);
- if (aoStorage != g_aoBitmask)
- {
- break;
- }
-
- AtomicXorNoResult(&aoStorage, (atomicord32)OU_UINT32_MAX);
- if (aoStorage != (atomicord32)(OU_UINT32_MAX ^ g_aoBitmask))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_ExchangePointer()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicptr apStorage = NULL;
- if (AtomicExchangePointer(&apStorage, (atomicptr)(&TestAtomic_ExchangePointer)) != NULL || apStorage != (atomicptr)(&TestAtomic_ExchangePointer))
- {
- break;
- }
-
- if (AtomicExchangePointer(&apStorage, (atomicptr)(&apStorage)) != (atomicptr)(&TestAtomic_ExchangePointer) || apStorage != (atomicptr)(&apStorage))
- {
- break;
- }
-
- if (AtomicExchangePointer(&apStorage, NULL) != (atomicptr)(&apStorage) || apStorage != NULL)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomic_CompareExchangePointer()
- {
- bool bResult = false;
-
- do
- {
- volatile atomicptr apStorage = NULL;
-
- if (AtomicCompareExchangePointer(&apStorage, (atomicptr)(&TestAtomic_CompareExchangePointer), (atomicptr)(&TestAtomic_CompareExchangePointer)) || apStorage != NULL)
- {
- break;
- }
-
- if (!AtomicCompareExchangePointer(&apStorage, NULL, (atomicptr)(&TestAtomic_CompareExchangePointer)) || apStorage != (atomicptr)(&TestAtomic_CompareExchangePointer))
- {
- break;
- }
-
- if (!AtomicCompareExchangePointer(&apStorage, (atomicptr)(&TestAtomic_CompareExchangePointer), (atomicptr)(&apStorage)) || apStorage != (atomicptr)(&apStorage))
- {
- break;
- }
-
- if (!AtomicCompareExchangePointer(&apStorage, (atomicptr)(&apStorage), (atomicptr)(&apStorage)) || apStorage != (atomicptr)(&apStorage))
- {
- break;
- }
-
- if (AtomicCompareExchangePointer(&apStorage, NULL, NULL) || apStorage != (atomicptr)(&apStorage))
- {
- break;
- }
-
- if (!AtomicCompareExchangePointer(&apStorage, (atomicptr)(&apStorage), NULL) || apStorage != NULL)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- enum EOUATOMICFEATURE
- {
- OOF__MIN,
-
- OOF_INCREMENT = OOF__MIN,
- OOF_DECREMENT,
- OOF_INCREMENTNORESULT,
- OOF_DECREMENTNORESULT,
- OOF_EXCHANGE,
- OOF_EXCHANGEADD,
- OOF_EXCHANGEADDNORESULT,
- OOF_COMPAREEXCHANGE,
- OOF_AND,
- OOF_OR,
- OOF_XOR,
- OOF_ANDNORESULT,
- OOF_ORNORESULT,
- OOF_XORNORESULT,
- OOF_EXCHANGEPOINTER,
- OOF_COMPAREEXCHANGEPOINTER,
-
- OOF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUATOMICFEATURE, OOF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestAtomic_Increment, // OOF_INCREMENT,
- &TestAtomic_Decrement, // OOF_DECREMENT,
- &TestAtomic_IncrementNoResult, // OOF_INCREMENTNORESULT,
- &TestAtomic_DecrementNoResult, // OOF_DECREMENTNORESULT,
- &TestAtomic_Exchange, // OOF_EXCHANGE,
- &TestAtomic_ExchangeAdd, // OOF_EXCHANGEADD,
- &TestAtomic_ExchangeAddNoResult, // OOF_EXCHANGEADDNORESULT,
- &TestAtomic_CompareExchange, // OOF_COMPAREEXCHANGE,
- &TestAtomic_And, // OOF_AND,
- &TestAtomic_Or, // OOF_OR,
- &TestAtomic_Xor, // OOF_XOR,
- &TestAtomic_AndNoResult, // OOF_ANDNORESULT,
- &TestAtomic_OrNoResult, // OOF_ORNORESULT,
- &TestAtomic_XorNoResult, // OOF_XORNORESULT,
- &TestAtomic_ExchangePointer, // OOF_EXCHANGEPOINTER,
- &TestAtomic_CompareExchangePointer, // OOF_COMPAREEXCHANGEPOINTER,
- };
- static const CEnumUnsortedElementArray<EOUATOMICFEATURE, OOF__MAX, CFeatureTestProcedure> g_afnAtomicFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUATOMICFEATURE, OOF__MAX, const char *>::m_aetElementArray[] =
- {
- "AtomicIncrement", // OOF_INCREMENT,
- "AtomicDecrement", // OOF_DECREMENT,
- "AtomicIncrementNoResult", // OOF_INCREMENTNORESULT,
- "AtomicDecrementNoResult", // OOF_DECREMENTNORESULT,
- "AtomicExchange", // OOF_EXCHANGE,
- "AtomicExchangeAdd", // OOF_EXCHANGEADD,
- "AtomicExchangeAddNoResult", // OOF_EXCHANGEADDNORESULT,
- "AtomicCompareExchange", // OOF_COMPAREEXCHANGE,
- "AtomicAnd", // OOF_AND,
- "AtomicOr", // OOF_OR,
- "AtomicXor", // OOF_XOR,
- "AtomicAndNoResult", // OOF_ANDNORESULT,
- "AtomicOrNoResult", // OOF_ORNORESULT,
- "AtomicXorNoResult", // OOF_XORNORESULT,
- "AtomicExchangePointer", // OOF_EXCHANGEPOINTER,
- "AtomicCompareExchangePointer", // OOF_COMPAREEXCHANGEPOINTER,
- };
- static const CEnumUnsortedElementArray<EOUATOMICFEATURE, OOF__MAX, const char *> g_aszAtomicFeatureTestNames;
- bool TestAtomic(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- bool bResult = false;
- nOutSuccessCount = 0;
- nOutTestCount = OOF__MAX;
- bool bAPIInitialized = false;
-
- do
- {
- if (!InitializeAtomicAPI())
- {
- break;
- }
-
- bAPIInitialized = true;
- if (!TestSubsystem(nOutSuccessCount, nOutTestCount, OOF__MAX, g_aszAtomicFeatureTestNames.GetStoragePointer(), g_afnAtomicFeatureTestProcedures.GetStoragePointer()))
- {
- break;
- }
- bResult = true;
- }
- while (false);
-
- if (bAPIInitialized)
- {
- FinalizeAtomicAPI();
- }
- return bResult;
- }
- #endif // #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- //////////////////////////////////////////////////////////////////////////
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- const atomicord32 g_aoTestValue32 = (atomicord32)0xA5A5A5A5;
- const atomicord32 g_aoTestMask32 = (atomicord32)0xC6C6C6C6;
- const atomicord32 g_aoTestBit32 = (atomicord32)OU_INT32_MIN;
- const atomicord32 g_aoTestAnotherBit32 = (atomicord32)((uint32ou)OU_INT32_MIN >> 1);
- bool TestAtomicFlags_Constructors()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(CAtomicFlags::value_type) != sizeof(atomicord32))
- {
- break;
- }
- CAtomicFlags afEmptyFlags;
- if (afEmptyFlags.QueryFlagsAllValues())
- {
- break;
- }
- CAtomicFlags afFullFlags(OU_UINT32_MAX);
-
- if (afFullFlags.QueryFlagsAllValues() != (atomicord32)OU_UINT32_MAX)
- {
- break;
- }
- CAtomicFlags afCopyOfFullFlags(afFullFlags);
- if (afCopyOfFullFlags.QueryFlagsAllValues() != (atomicord32)OU_UINT32_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_AssignFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags;
- afTestFlags.AssignFlagsAllValues(OU_UINT32_MAX);
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_UINT32_MAX)
- {
- break;
- }
- afTestFlags.AssignFlagsAllValues(0);
- if (afTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_QueryFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
-
- if (afTestFlags.QueryFlagsAllValues() != g_aoTestValue32)
- {
- break;
- }
- // Double check to be sure ;-)
- if (afTestFlags.QueryFlagsAllValues() != g_aoTestValue32)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_SetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
- afTestFlags.SetFlagsMaskValue(g_aoTestMask32, true);
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 | g_aoTestMask32))
- {
- break;
- }
- afTestFlags.SetFlagsMaskValue(g_aoTestValue32, false);
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(~g_aoTestValue32 & g_aoTestMask32))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_SignalFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
-
- afTestFlags.SignalFlagsMaskValue(g_aoTestMask32);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 | g_aoTestMask32))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_DropFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
-
- afTestFlags.DropFlagsMaskValue(g_aoTestMask32);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 & ~g_aoTestMask32))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_ToggleSingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
-
- bool bPreviousValue = afTestFlags.ToggleSingleFlagValue(g_aoTestBit32);
-
- if (bPreviousValue != ((g_aoTestValue32 & g_aoTestBit32) != 0) || afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 ^ g_aoTestBit32))
- {
- break;
- }
- bool bAnotherPreviousValue = afTestFlags.ToggleSingleFlagValue(g_aoTestBit32);
-
- if (bAnotherPreviousValue == bPreviousValue || afTestFlags.QueryFlagsAllValues() != g_aoTestValue32)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_ModifySingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
-
- bool bFirstModification = afTestFlags.ModifySingleFlagValue(g_aoTestBit32, true);
-
- if (bFirstModification != ((g_aoTestValue32 & g_aoTestBit32) != g_aoTestBit32) || afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 | g_aoTestBit32))
- {
- break;
- }
-
- bool bAnotherModification = afTestFlags.ModifySingleFlagValue(g_aoTestBit32, bFirstModification);
-
- if (bAnotherModification == bFirstModification || afTestFlags.QueryFlagsAllValues() != (bFirstModification ? (atomicord32)(g_aoTestValue32 | g_aoTestBit32) : (atomicord32)(g_aoTestValue32 & ~g_aoTestBit32)))
- {
- break;
- }
- bool bYetAnotherModification = afTestFlags.ModifySingleFlagValue(g_aoTestBit32, bAnotherModification);
- if (bYetAnotherModification != bAnotherModification || afTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (atomicord32)(g_aoTestValue32 | g_aoTestBit32) : (atomicord32)(g_aoTestValue32 & ~g_aoTestBit32)))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_AssignFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
- atomicord32 aoPreviousFlags = afTestFlags.AssignFlagsByMask(g_aoTestMask32, g_aoTestMask32);
- const atomicord32 aoNewFlags = (g_aoTestValue32 & ~g_aoTestMask32) | g_aoTestMask32;
- if (aoPreviousFlags != g_aoTestValue32 || afTestFlags.QueryFlagsAllValues() != aoNewFlags)
- {
- break;
- }
- atomicord32 aoAnotherPreviousFlags = afTestFlags.AssignFlagsByMask(g_aoTestValue32, 0);
- const atomicord32 aoAnotherNewFlags = aoNewFlags & ~g_aoTestValue32;
- if (aoAnotherPreviousFlags != aoNewFlags || afTestFlags.QueryFlagsAllValues() != aoAnotherNewFlags)
- {
- break;
- }
-
- atomicord32 aoYetAnotherPreviousFlags = afTestFlags.AssignFlagsByMask(g_aoTestMask32, g_aoTestMask32 & g_aoTestValue32);
- OU_ASSERT((g_aoTestMask32 & g_aoTestValue32) != 0); // Test degeneration
-
- const atomicord32 aoYetAnotherNewFlags = (aoAnotherNewFlags & ~g_aoTestMask32) | (g_aoTestMask32 & g_aoTestValue32);
- OU_ASSERT(aoYetAnotherNewFlags != (atomicord32)OU_UINT32_MAX); // Test degeneration
-
- if (aoYetAnotherPreviousFlags != aoAnotherNewFlags || afTestFlags.QueryFlagsAllValues() != aoYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_AlterFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
-
- bool bWasModification = afTestFlags.AlterFlagsByMask(g_aoTestMask32, g_aoTestMask32);
-
- const atomicord32 aoNewFlags = (g_aoTestValue32 & ~g_aoTestMask32) | g_aoTestMask32;
-
- if (bWasModification != ((g_aoTestValue32 & g_aoTestMask32) != g_aoTestMask32) || afTestFlags.QueryFlagsAllValues() != aoNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModification = afTestFlags.AlterFlagsByMask(g_aoTestValue32, 0);
-
- const atomicord32 aoAnotherNewFlags = aoNewFlags & ~g_aoTestValue32;
-
- if (bWasAnotherModification != ((aoNewFlags & g_aoTestValue32) != 0) || afTestFlags.QueryFlagsAllValues() != aoAnotherNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModificationRepeated = afTestFlags.AlterFlagsByMask(g_aoTestValue32, 0);
-
- if (bWasAnotherModificationRepeated || afTestFlags.QueryFlagsAllValues() != aoAnotherNewFlags)
- {
- break;
- }
-
- bool bWasYetAnotherModification = afTestFlags.AlterFlagsByMask(g_aoTestMask32, g_aoTestMask32 & g_aoTestValue32);
- OU_ASSERT((g_aoTestMask32 & g_aoTestValue32) != 0); // Test degeneration
-
- const atomicord32 aoYetAnotherNewFlags = (aoAnotherNewFlags & ~g_aoTestMask32) | (g_aoTestMask32 & g_aoTestValue32);
- OU_ASSERT(aoYetAnotherNewFlags != (atomicord32)OU_UINT32_MAX); // Test degeneration
-
- if (bWasYetAnotherModification != ((aoAnotherNewFlags & g_aoTestMask32) != (g_aoTestMask32 & g_aoTestValue32)) || afTestFlags.QueryFlagsAllValues() != aoYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_GetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
-
- if (afTestFlags.GetFlagsMaskValue(g_aoTestMask32) != ((g_aoTestValue32 & g_aoTestMask32) != 0))
- {
- break;
- }
-
- if (afTestFlags.GetFlagsMaskValue(~g_aoTestValue32))
- {
- break;
- }
-
- if (!afTestFlags.GetFlagsMaskValue(OU_UINT32_MAX))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_QueryFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
-
- if (afTestFlags.QueryFlagsByMask(g_aoTestMask32) != (atomicord32)(g_aoTestValue32 & g_aoTestMask32))
- {
- break;
- }
-
- if (afTestFlags.QueryFlagsByMask(0))
- {
- break;
- }
-
- if (afTestFlags.QueryFlagsByMask(OU_UINT32_MAX) != g_aoTestValue32)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_OnlySignalSingleFlagOutOfMask()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(g_aoTestValue32);
- OU_ASSERT(g_aoTestValue32 != 0); // Test degeneration
-
- if (afTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_aoTestBit32))
- {
- break;
- }
- if (afTestFlags.QueryFlagsAllValues() != g_aoTestValue32)
- {
- break;
- }
-
- afTestFlags.AssignFlagsAllValues(0);
- if (!afTestFlags.OnlySignalSingleFlagOutOfMask(g_aoTestBit32, g_aoTestBit32))
- {
- break;
- }
-
- if (afTestFlags.QueryFlagsAllValues() != g_aoTestBit32)
- {
- break;
- }
-
- if (afTestFlags.OnlySignalSingleFlagOutOfMask(g_aoTestBit32, g_aoTestBit32))
- {
- break;
- }
-
- if (afTestFlags.QueryFlagsAllValues() != g_aoTestBit32)
- {
- break;
- }
-
- if (afTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_aoTestAnotherBit32))
- {
- break;
- }
-
- if (afTestFlags.QueryFlagsAllValues() != g_aoTestBit32)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumSetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags;
-
- afTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
- if (afTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- afTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- afTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_INT32_MIN)
- {
- break;
- }
-
- afTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false);
-
- if (afTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumSignalEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags;
-
- afTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (afTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- afTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- afTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- afTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumDropEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(OU_UINT32_MAX);
-
- afTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_UINT32_MAX ^ 1))
- {
- break;
- }
-
- afTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)~(OU_INT32_MIN + 1))
- {
- break;
- }
-
- afTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)~(OU_INT32_MIN + 1))
- {
- break;
- }
-
- afTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)~(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumToggleEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags;
-
- bool bToggleFirstResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (bToggleFirstResult || afTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bToggleSecondResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (bToggleSecondResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bool bToggleThirdResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (!bToggleThirdResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_INT32_MIN)
- {
- break;
- }
-
- bool bToggleFourthResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (!bToggleFourthResult || afTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumModifyEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags;
-
- bool bModifyFirstResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
-
- if (!bModifyFirstResult || afTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bModifySecondResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
-
- if (!bModifySecondResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bool bModifyThirdResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
-
- if (bModifyThirdResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bool bModifyFourthResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
-
- if (bModifyFourthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bool bModifyFifthResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false);
-
- if (!bModifyFifthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_INT32_MIN)
- {
- break;
- }
-
- bool bModifySixthResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false);
-
- if (!bModifySixthResult || afTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumSignalFirstEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags;
- bool bFirstResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
- if (!bFirstResult || afTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (bSecondResult || afTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1);
-
- if (!bThirdResult || afTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (bFourthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumSignalLastEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags;
-
- bool bFirstResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (!bFirstResult || afTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (bSecondResult || afTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
-
- if (!bThirdResult || afTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (bFourthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
-
- if (!afTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT32_BITS))
- {
- break;
- }
-
- if (afTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1))
- {
- break;
- }
-
- if (afTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT32_BITS - 1))
- {
- break;
- }
-
- if (!afTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumFindFirstEnumeratedFlag()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
- unsigned int uiFirstResult = afTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT32_BITS);
- if (uiFirstResult != 0)
- {
- break;
- }
- unsigned int uiSecondResult = afTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT32_BITS - 1);
- if (uiSecondResult != OU_UINT32_BITS - 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumAllSignalEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags;
-
- afTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
- if (afTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
- afTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT32_BITS - 2);
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_UINT32_MAX ^ 2))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumAllDropEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags(OU_UINT32_MAX);
-
- afTestFlags.EnumAllDropEnumeratedFlags(1, 1);
-
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_UINT32_MAX ^ 1))
- {
- break;
- }
-
- afTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT32_BITS - 2);
-
- if (afTestFlags.QueryFlagsAllValues() != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumAllQueryEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
-
- atomicord32 aoFirstResult = afTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT32_BITS);
- if (aoFirstResult != (atomicord32)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- atomicord32 aoSecondResult = afTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 1);
- if (aoSecondResult != (atomicord32)(OU_INT32_MIN))
- {
- break;
- }
-
- atomicord32 aoThirdResult = afTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 2);
- if (aoThirdResult != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_EnumAnyGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
-
- bool bFirstResult = afTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT32_BITS);
- if (!bFirstResult)
- {
- break;
- }
-
- bool bSecondResult = afTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 1);
- if (!bSecondResult)
- {
- break;
- }
-
- bool bThirdResult = afTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 2);
- if (bThirdResult)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_StoreFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags;
- afTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
- if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(2 << 1))
- {
- break;
- }
-
- afTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT32_BITS - 2, 3);
-
- if (afTestFlags.QueryFlagsAllValues() != ((atomicord32)(2 << 1) | (atomicord32)(OU_INT32_MIN | (OU_INT32_MIN >> 1))))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestAtomicFlags_RetrieveFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
-
- unsigned int aoFirstResult = afTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
- if (aoFirstResult != 0)
- {
- break;
- }
-
- unsigned int aoSecondResult = afTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT32_BITS - 2);
- if (aoSecondResult != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- enum EOUATOMICFLAGSFEATURE
- {
- OAF__MIN,
-
- OAF_CONSTRUCTORS = OAF__MIN,
- OAF_ASSIGNFLAGSALLVALUES,
- OAF_QUERYFLAGSALLVALUES,
- OAF_SETFLAGSMASKVALUE,
- OAF_SIGNALFLAGSMASKVALUE,
- OAF_DROPFLAGSMASKVALUE,
- OAF_TOGGLESINGLEFLAGVALUE,
- OAF_MODIFYSINGLEFLAGVALUE,
- OAF_ASSIGNFLAGSBYMASK,
- OAF_ALTERFLAGSBYMASK,
- OAF_GETFLAGSMASKVALUE,
- OAF_QUERYFLAGSBYMASK,
- OAF_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- OAF_ENUMSETENUMERATEDFLAGVALUE,
- OAF_ENUMSIGNALENUMERATEDFLAGVALUE,
- OAF_ENUMDROPENUMERATEDFLAGVALUE,
- OAF_ENUMTOGGLEENUMERATEDFLAGVALUE,
- OAF_ENUMMODIFYENUMERATEDFLAGVALUE,
- OAF_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- OAF_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- OAF_ENUMGETENUMERATEDFLAGVALUE,
- OAF_ENUMFINDFIRSTENUMERATEDFLAG,
- OAF_ENUMALLSIGNALENUMERATEDFLAGS,
- OAF_ENUMALLDROPENUMERATEDFLAGS,
- OAF_ENUMALLQUERYENUMERATEDFLAGS,
- OAF_ENUMANYGETENUMERATEDFLAGVALUE,
- OAF_STOREFLAGSENUMERATEDVALUE,
- OAF_RETRIEVEFLAGSENUMERATEDVALUE,
- OAF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUATOMICFLAGSFEATURE, OAF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestAtomicFlags_Constructors, // OAF_CONSTRUCTORS
- &TestAtomicFlags_AssignFlagsAllValues, // OAF_ASSIGNFLAGSALLVALUES,
- &TestAtomicFlags_QueryFlagsAllValues, // OAF_QUERYFLAGSALLVALUES,
- &TestAtomicFlags_SetFlagsMaskValue, // OAF_SETFLAGSMASKVALUE,
- &TestAtomicFlags_SignalFlagsMaskValue, // OAF_SIGNALFLAGSMASKVALUE,
- &TestAtomicFlags_DropFlagsMaskValue, // OAF_DROPFLAGSMASKVALUE,
- &TestAtomicFlags_ToggleSingleFlagValue, // OAF_TOGGLESINGLEFLAGVALUE,
- &TestAtomicFlags_ModifySingleFlagValue, // OAF_MODIFYSINGLEFLAGVALUE,
- &TestAtomicFlags_AssignFlagsByMask, // OAF_ASSIGNFLAGSBYMASK,
- &TestAtomicFlags_AlterFlagsByMask, // OAF_ALTERFLAGSBYMASK,
- &TestAtomicFlags_GetFlagsMaskValue, // OAF_GETFLAGSMASKVALUE,
- &TestAtomicFlags_QueryFlagsByMask, // OAF_QUERYFLAGSBYMASK,
- &TestAtomicFlags_OnlySignalSingleFlagOutOfMask, // OAF_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- &TestAtomicFlags_EnumSetEnumeratedFlagValue, // OAF_ENUMSETENUMERATEDFLAGVALUE,
- &TestAtomicFlags_EnumSignalEnumeratedFlagValue, // OAF_ENUMSIGNALENUMERATEDFLAGVALUE,
- &TestAtomicFlags_EnumDropEnumeratedFlagValue, // OAF_ENUMDROPENUMERATEDFLAGVALUE,
- &TestAtomicFlags_EnumToggleEnumeratedFlagValue, // OAF_ENUMTOGGLEENUMERATEDFLAGVALUE,
- &TestAtomicFlags_EnumModifyEnumeratedFlagValue, // OAF_ENUMMODIFYENUMERATEDFLAGVALUE,
- &TestAtomicFlags_EnumSignalFirstEnumeratedFlagValue, // OAF_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- &TestAtomicFlags_EnumSignalLastEnumeratedFlagValue, // OAF_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- &TestAtomicFlags_EnumGetEnumeratedFlagValue, // OAF_ENUMGETENUMERATEDFLAGVALUE,
- &TestAtomicFlags_EnumFindFirstEnumeratedFlag, // OAF_ENUMFINDFIRSTENUMERATEDFLAG,
- &TestAtomicFlags_EnumAllSignalEnumeratedFlags, // OAF_ENUMALLSIGNALENUMERATEDFLAGS,
- &TestAtomicFlags_EnumAllDropEnumeratedFlags, // OAF_ENUMALLDROPENUMERATEDFLAGS,
- &TestAtomicFlags_EnumAllQueryEnumeratedFlags, // OAF_ENUMALLQUERYENUMERATEDFLAGS,
- &TestAtomicFlags_EnumAnyGetEnumeratedFlagValue, // OAF_ENUMANYGETENUMERATEDFLAGVALUE,
- &TestAtomicFlags_StoreFlagsEnumeratedValue, // OAF_STOREFLAGSENUMERATEDVALUE,
- &TestAtomicFlags_RetrieveFlagsEnumeratedValue, // OAF_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUATOMICFLAGSFEATURE, OAF__MAX, CFeatureTestProcedure> g_afnAtomicFlagsFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUATOMICFLAGSFEATURE, OAF__MAX, const char *>::m_aetElementArray[] =
- {
- "Constructors", // OAF_CONSTRUCTORS
- "AssignFlagsAllValues", // OAF_ASSIGNFLAGSALLVALUES,
- "QueryFlagsAllValues", // OAF_QUERYFLAGSALLVALUES,
- "SetFlagsMaskValue", // OAF_SETFLAGSMASKVALUE,
- "SignalFlagsMaskValue", // OAF_SIGNALFLAGSMASKVALUE,
- "DropFlagsMaskValue", // OAF_DROPFLAGSMASKVALUE,
- "ToggleSingleFlagValue", // OAF_TOGGLESINGLEFLAGVALUE,
- "ModifySingleFlagValue", // OAF_MODIFYSINGLEFLAGVALUE,
- "AssignFlagsByMask", // OAF_ASSIGNFLAGSBYMASK,
- "AlterFlagsByMask", // OAF_ALTERFLAGSBYMASK,
- "GetFlagsMaskValue", // OAF_GETFLAGSMASKVALUE,
- "QueryFlagsByMask", // OAF_QUERYFLAGSBYMASK,
- "OnlySignalSingleFlagOutOfMask", // OAF_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- "EnumSetEnumeratedFlagValue", // OAF_ENUMSETENUMERATEDFLAGVALUE,
- "EnumSignalEnumeratedFlagValue", // OAF_ENUMSIGNALENUMERATEDFLAGVALUE,
- "EnumDropEnumeratedFlagValue", // OAF_ENUMDROPENUMERATEDFLAGVALUE,
- "EnumToggleEnumeratedFlagValue", // OAF_ENUMTOGGLEENUMERATEDFLAGVALUE,
- "EnumModifyEnumeratedFlagValue", // OAF_ENUMMODIFYENUMERATEDFLAGVALUE,
- "EnumSignalFirstEnumeratedFlagValue", // OAF_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- "EnumSignalLastEnumeratedFlagValue", // OAF_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- "EnumGetEnumeratedFlagValue", // OAF_ENUMGETENUMERATEDFLAGVALUE,
- "EnumFindFirstEnumeratedFlag", // OAF_ENUMFINDFIRSTENUMERATEDFLAG,
- "EnumAllSignalEnumeratedFlags", // OAF_ENUMALLSIGNALENUMERATEDFLAGS,
- "EnumAllDropEnumeratedFlags", // OAF_ENUMALLDROPENUMERATEDFLAGS,
- "EnumAllQueryEnumeratedFlags", // OAF_ENUMALLQUERYENUMERATEDFLAGS,
- "EnumAnyGetEnumeratedFlagValue", // OAF_ENUMANYGETENUMERATEDFLAGVALUE,
- "StoreFlagsEnumeratedValue", // OAF_STOREFLAGSENUMERATEDVALUE,
- "RetrieveFlagsEnumeratedValue", // OAF_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUATOMICFLAGSFEATURE, OAF__MAX, const char *> g_aszAtomicFlagsFeatureTestNames;
- bool TestAtomicFlags(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- bool bResult = false;
- nOutSuccessCount = 0;
- nOutTestCount = OAF__MAX;
-
- bool bAPIInitialized = false;
-
- do
- {
- if (!InitializeAtomicAPI())
- {
- break;
- }
-
- bAPIInitialized = true;
-
- if (!TestSubsystem(nOutSuccessCount, nOutTestCount, OAF__MAX, g_aszAtomicFlagsFeatureTestNames.GetStoragePointer(), g_afnAtomicFlagsFeatureTestProcedures.GetStoragePointer()))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- if (bAPIInitialized)
- {
- FinalizeAtomicAPI();
- }
-
- return bResult;
- }
- #endif // #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- //////////////////////////////////////////////////////////////////////////
- typedef CSimpleFlagsTemplate<uint64ou> CSimpleFlags64;
- const uint64ou g_uiTestValue64 = ((uint64ou)0xA5A5A5A5 << 32) | 0xA5A5A5A5;
- const uint64ou g_uiTestMask64 = ((uint64ou)0xC6C6C6C6 << 32) | 0xC6C6C6C6;
- const uint64ou g_uiTestBit64 = (uint64ou)OU_INT64_MIN;
- const uint64ou g_uiTestAnotherBit64 = (uint64ou)((uint64ou)OU_INT64_MIN >> 1);
- bool TestSimpleFlags64_Constructors()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(CSimpleFlags64::value_type) != sizeof(uint64ou) || sizeof(CSimpleFlags64) != sizeof(uint64ou))
- {
- break;
- }
- CSimpleFlags64 sfEmptyFlags;
- if (sfEmptyFlags.QueryFlagsAllValues())
- {
- break;
- }
- CSimpleFlags64 sfFullFlags(OU_UINT64_MAX);
-
- if (sfFullFlags.QueryFlagsAllValues() != OU_UINT64_MAX)
- {
- break;
- }
- CSimpleFlags64 sfCopyOfFullFlags(sfFullFlags);
- if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT64_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_AssignFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags;
- sfTestFlags.AssignFlagsAllValues(OU_UINT64_MAX);
- if (sfTestFlags.QueryFlagsAllValues() != OU_UINT64_MAX)
- {
- break;
- }
- sfTestFlags.AssignFlagsAllValues(0);
- if (sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_QueryFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64)
- {
- break;
- }
- // Double check to be sure ;-)
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_SetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
- sfTestFlags.SetFlagsMaskValue(g_uiTestMask64, true);
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 | g_uiTestMask64))
- {
- break;
- }
- sfTestFlags.SetFlagsMaskValue(g_uiTestValue64, false);
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(~g_uiTestValue64 & g_uiTestMask64))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_SignalFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
-
- sfTestFlags.SignalFlagsMaskValue(g_uiTestMask64);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 | g_uiTestMask64))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_DropFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
-
- sfTestFlags.DropFlagsMaskValue(g_uiTestMask64);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 & ~g_uiTestMask64))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_ToggleSingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
-
- bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit64);
-
- if (bPreviousValue != ((g_uiTestValue64 & g_uiTestBit64) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 ^ g_uiTestBit64))
- {
- break;
- }
- bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit64);
-
- if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_ModifySingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
-
- bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit64, true);
-
- if (bFirstModification != ((g_uiTestValue64 & g_uiTestBit64) != g_uiTestBit64) || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 | g_uiTestBit64))
- {
- break;
- }
-
- bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit64, bFirstModification);
-
- if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint64ou)(g_uiTestValue64 | g_uiTestBit64) : (uint64ou)(g_uiTestValue64 & ~g_uiTestBit64)))
- {
- break;
- }
- bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit64, bAnotherModification);
- if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint64ou)(g_uiTestValue64 | g_uiTestBit64) : (uint64ou)(g_uiTestValue64 & ~g_uiTestBit64)))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_AssignFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
- uint64ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask64, g_uiTestMask64);
- const uint64ou uiNewFlags = (g_uiTestValue64 & ~g_uiTestMask64) | g_uiTestMask64;
- if (uiPreviousFlags != g_uiTestValue64 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
- {
- break;
- }
- uint64ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue64, 0);
- const uint64ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue64;
- if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- uint64ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask64, g_uiTestMask64 & g_uiTestValue64);
- OU_ASSERT((g_uiTestMask64 & g_uiTestValue64) != 0); // Test degeneration
-
- const uint64ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask64) | (g_uiTestMask64 & g_uiTestValue64);
- OU_ASSERT(uiYetAnotherNewFlags != OU_UINT64_MAX); // Test degeneration
-
- if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_AlterFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
-
- bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask64, g_uiTestMask64);
-
- const uint64ou uiNewFlags = (g_uiTestValue64 & ~g_uiTestMask64) | g_uiTestMask64;
-
- if (bWasModification != ((g_uiTestValue64 & g_uiTestMask64) != g_uiTestMask64) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue64, 0);
-
- const uint64ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue64;
-
- if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue64) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue64, 0);
-
- if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask64, g_uiTestMask64 & g_uiTestValue64);
- OU_ASSERT((g_uiTestMask64 & g_uiTestValue64) != 0); // Test degeneration
-
- const uint64ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask64) | (g_uiTestMask64 & g_uiTestValue64);
- OU_ASSERT(uiYetAnotherNewFlags != OU_UINT64_MAX); // Test degeneration
-
- if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask64) != (g_uiTestMask64 & g_uiTestValue64)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_GetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
-
- if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask64) != ((g_uiTestValue64 & g_uiTestMask64) != 0))
- {
- break;
- }
-
- if (sfTestFlags.GetFlagsMaskValue(~g_uiTestValue64))
- {
- break;
- }
-
- if (!sfTestFlags.GetFlagsMaskValue(OU_UINT64_MAX))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_QueryFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
-
- if (sfTestFlags.QueryFlagsByMask(g_uiTestMask64) != (uint64ou)(g_uiTestValue64 & g_uiTestMask64))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsByMask(0))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsByMask(OU_UINT64_MAX) != g_uiTestValue64)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_OnlySignalSingleFlagOutOfMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(g_uiTestValue64);
- OU_ASSERT(g_uiTestValue64 != 0); // Test degeneration
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT64_MAX, g_uiTestBit64))
- {
- break;
- }
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64)
- {
- break;
- }
-
- sfTestFlags.AssignFlagsAllValues(0);
- if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit64, g_uiTestBit64))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit64)
- {
- break;
- }
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit64, g_uiTestBit64))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit64)
- {
- break;
- }
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT64_MAX, g_uiTestAnotherBit64))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit64)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumSetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags;
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT64_BITS, true);
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, true);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT64_BITS, false);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)OU_INT64_MIN)
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, false);
-
- if (sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumSignalEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags;
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumDropEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(OU_UINT64_MAX);
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT64_MAX ^ 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)~(OU_INT64_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)~(OU_INT64_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)~(OU_INT64_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumToggleEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags;
-
- bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
-
- if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
-
- if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
- {
- break;
- }
-
- bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
-
- if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)OU_INT64_MIN)
- {
- break;
- }
-
- bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
-
- if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumModifyEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags;
-
- bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT64_BITS, true);
-
- if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, true);
-
- if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
- {
- break;
- }
-
- bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT64_BITS, true);
-
- if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
- {
- break;
- }
-
- bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, true);
-
- if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
- {
- break;
- }
-
- bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT64_BITS, false);
-
- if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)OU_INT64_MIN)
- {
- break;
- }
-
- bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, false);
-
- if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumSignalFirstEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags;
- bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
- if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
-
- if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT64_BITS - 1);
-
- if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
-
- if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumSignalLastEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags;
-
- bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
-
- if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
-
- if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
-
- if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT64_BITS))
- {
- break;
- }
-
- if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT64_BITS - 1))
- {
- break;
- }
-
- if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT64_BITS - 1))
- {
- break;
- }
-
- if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumFindFirstEnumeratedFlag()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
- unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT64_BITS);
- if (uiFirstResult != 0)
- {
- break;
- }
- unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT64_BITS - 1);
- if (uiSecondResult != OU_UINT64_BITS - 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumAllSignalEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags;
-
- sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
- sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT64_BITS - 2);
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_UINT64_MAX ^ 2))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumAllDropEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags(OU_UINT64_MAX);
-
- sfTestFlags.EnumAllDropEnumeratedFlags(1, 1);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_UINT64_MAX ^ 1))
- {
- break;
- }
-
- sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT64_BITS - 2);
-
- if (sfTestFlags.QueryFlagsAllValues() != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumAllQueryEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
-
- uint64ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT64_BITS);
- if (uiFirstResult != (uint64ou)(OU_INT64_MIN + 1))
- {
- break;
- }
-
- uint64ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT64_BITS - 1);
- if (uiSecondResult != (uint64ou)(OU_INT64_MIN))
- {
- break;
- }
-
- uint64ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT64_BITS - 2);
- if (uiThirdResult != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_EnumAnyGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
-
- bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT64_BITS);
- if (!bFirstResult)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT64_BITS - 1);
- if (!bSecondResult)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT64_BITS - 2);
- if (bThirdResult)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_StoreFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags;
- sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
- if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(2 << 1))
- {
- break;
- }
-
- sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT64_BITS - 2, 3);
-
- if (sfTestFlags.QueryFlagsAllValues() != ((uint64ou)(2 << 1) | (uint64ou)(OU_INT64_MIN | (OU_INT64_MIN >> 1))))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags64_RetrieveFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
-
- unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
- if (uiFirstResult != 0)
- {
- break;
- }
-
- unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT64_BITS - 2);
- if (uiSecondResult != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- enum EOUSIMPLEFLAGSFEATURE64
- {
- OSF64__MIN,
-
- OSF64_CONSTRUCTORS = OSF64__MIN,
- OSF64_ASSIGNFLAGSALLVALUES,
- OSF64_QUERYFLAGSALLVALUES,
- OSF64_SETFLAGSMASKVALUE,
- OSF64_SIGNALFLAGSMASKVALUE,
- OSF64_DROPFLAGSMASKVALUE,
- OSF64_TOGGLESINGLEFLAGVALUE,
- OSF64_MODIFYSINGLEFLAGVALUE,
- OSF64_ASSIGNFLAGSBYMASK,
- OSF64_ALTERFLAGSBYMASK,
- OSF64_GETFLAGSMASKVALUE,
- OSF64_QUERYFLAGSBYMASK,
- OSF64_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- OSF64_ENUMSETENUMERATEDFLAGVALUE,
- OSF64_ENUMSIGNALENUMERATEDFLAGVALUE,
- OSF64_ENUMDROPENUMERATEDFLAGVALUE,
- OSF64_ENUMTOGGLEENUMERATEDFLAGVALUE,
- OSF64_ENUMMODIFYENUMERATEDFLAGVALUE,
- OSF64_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- OSF64_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- OSF64_ENUMGETENUMERATEDFLAGVALUE,
- OSF64_ENUMFINDFIRSTENUMERATEDFLAG,
- OSF64_ENUMALLSIGNALENUMERATEDFLAGS,
- OSF64_ENUMALLDROPENUMERATEDFLAGS,
- OSF64_ENUMALLQUERYENUMERATEDFLAGS,
- OSF64_ENUMANYGETENUMERATEDFLAGVALUE,
- OSF64_STOREFLAGSENUMERATEDVALUE,
- OSF64_RETRIEVEFLAGSENUMERATEDVALUE,
- OSF64__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE64, OSF64__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestSimpleFlags64_Constructors, // OSF64_CONSTRUCTORS
- &TestSimpleFlags64_AssignFlagsAllValues, // OSF64_ASSIGNFLAGSALLVALUES,
- &TestSimpleFlags64_QueryFlagsAllValues, // OSF64_QUERYFLAGSALLVALUES,
- &TestSimpleFlags64_SetFlagsMaskValue, // OSF64_SETFLAGSMASKVALUE,
- &TestSimpleFlags64_SignalFlagsMaskValue, // OSF64_SIGNALFLAGSMASKVALUE,
- &TestSimpleFlags64_DropFlagsMaskValue, // OSF64_DROPFLAGSMASKVALUE,
- &TestSimpleFlags64_ToggleSingleFlagValue, // OSF64_TOGGLESINGLEFLAGVALUE,
- &TestSimpleFlags64_ModifySingleFlagValue, // OSF64_MODIFYSINGLEFLAGVALUE,
- &TestSimpleFlags64_AssignFlagsByMask, // OSF64_ASSIGNFLAGSBYMASK,
- &TestSimpleFlags64_AlterFlagsByMask, // OSF64_ALTERFLAGSBYMASK,
- &TestSimpleFlags64_GetFlagsMaskValue, // OSF64_GETFLAGSMASKVALUE,
- &TestSimpleFlags64_QueryFlagsByMask, // OSF64_QUERYFLAGSBYMASK,
- &TestSimpleFlags64_OnlySignalSingleFlagOutOfMask, // OSF64_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- &TestSimpleFlags64_EnumSetEnumeratedFlagValue, // OSF64_ENUMSETENUMERATEDFLAGVALUE,
- &TestSimpleFlags64_EnumSignalEnumeratedFlagValue, // OSF64_ENUMSIGNALENUMERATEDFLAGVALUE,
- &TestSimpleFlags64_EnumDropEnumeratedFlagValue, // OSF64_ENUMDROPENUMERATEDFLAGVALUE,
- &TestSimpleFlags64_EnumToggleEnumeratedFlagValue, // OSF64_ENUMTOGGLEENUMERATEDFLAGVALUE,
- &TestSimpleFlags64_EnumModifyEnumeratedFlagValue, // OSF64_ENUMMODIFYENUMERATEDFLAGVALUE,
- &TestSimpleFlags64_EnumSignalFirstEnumeratedFlagValue, // OSF64_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- &TestSimpleFlags64_EnumSignalLastEnumeratedFlagValue, // OSF64_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- &TestSimpleFlags64_EnumGetEnumeratedFlagValue, // OSF64_ENUMGETENUMERATEDFLAGVALUE,
- &TestSimpleFlags64_EnumFindFirstEnumeratedFlag, // OSF64_ENUMFINDFIRSTENUMERATEDFLAG,
- &TestSimpleFlags64_EnumAllSignalEnumeratedFlags, // OSF64_ENUMALLSIGNALENUMERATEDFLAGS,
- &TestSimpleFlags64_EnumAllDropEnumeratedFlags, // OSF64_ENUMALLDROPENUMERATEDFLAGS,
- &TestSimpleFlags64_EnumAllQueryEnumeratedFlags, // OSF64_ENUMALLQUERYENUMERATEDFLAGS,
- &TestSimpleFlags64_EnumAnyGetEnumeratedFlagValue, // OSF64_ENUMANYGETENUMERATEDFLAGVALUE,
- &TestSimpleFlags64_StoreFlagsEnumeratedValue, // OSF64_STOREFLAGSENUMERATEDVALUE,
- &TestSimpleFlags64_RetrieveFlagsEnumeratedValue, // OSF64_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE64, OSF64__MAX, CFeatureTestProcedure> g_afnSimpleFlags64FeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE64, OSF64__MAX, const char *>::m_aetElementArray[] =
- {
- "Constructors", // OSF64_CONSTRUCTORS
- "AssignFlagsAllValues", // OSF64_ASSIGNFLAGSALLVALUES,
- "QueryFlagsAllValues", // OSF64_QUERYFLAGSALLVALUES,
- "SetFlagsMaskValue", // OSF64_SETFLAGSMASKVALUE,
- "SignalFlagsMaskValue", // OSF64_SIGNALFLAGSMASKVALUE,
- "DropFlagsMaskValue", // OSF64_DROPFLAGSMASKVALUE,
- "ToggleSingleFlagValue", // OSF64_TOGGLESINGLEFLAGVALUE,
- "ModifySingleFlagValue", // OSF64_MODIFYSINGLEFLAGVALUE,
- "AssignFlagsByMask", // OSF64_ASSIGNFLAGSBYMASK,
- "AlterFlagsByMask", // OSF64_ALTERFLAGSBYMASK,
- "GetFlagsMaskValue", // OSF64_GETFLAGSMASKVALUE,
- "QueryFlagsByMask", // OSF64_QUERYFLAGSBYMASK,
- "OnlySignalSingleFlagOutOfMask", // OSF64_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- "EnumSetEnumeratedFlagValue", // OSF64_ENUMSETENUMERATEDFLAGVALUE,
- "EnumSignalEnumeratedFlagValue", // OSF64_ENUMSIGNALENUMERATEDFLAGVALUE,
- "EnumDropEnumeratedFlagValue", // OSF64_ENUMDROPENUMERATEDFLAGVALUE,
- "EnumToggleEnumeratedFlagValue", // OSF64_ENUMTOGGLEENUMERATEDFLAGVALUE,
- "EnumModifyEnumeratedFlagValue", // OSF64_ENUMMODIFYENUMERATEDFLAGVALUE,
- "EnumSignalFirstEnumeratedFlagValue", // OSF64_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- "EnumSignalLastEnumeratedFlagValue", // OSF64_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- "EnumGetEnumeratedFlagValue", // OSF64_ENUMGETENUMERATEDFLAGVALUE,
- "EnumFindFirstEnumeratedFlag", // OSF64_ENUMFINDFIRSTENUMERATEDFLAG,
- "EnumAllSignalEnumeratedFlags", // OSF64_ENUMALLSIGNALENUMERATEDFLAGS,
- "EnumAllDropEnumeratedFlags", // OSF64_ENUMALLDROPENUMERATEDFLAGS,
- "EnumAllQueryEnumeratedFlags", // OSF64_ENUMALLQUERYENUMERATEDFLAGS,
- "EnumAnyGetEnumeratedFlagValue", // OSF64_ENUMANYGETENUMERATEDFLAGVALUE,
- "StoreFlagsEnumeratedValue", // OSF64_STOREFLAGSENUMERATEDVALUE,
- "RetrieveFlagsEnumeratedValue", // OSF64_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE64, OSF64__MAX, const char *> g_aszSimpleFlags64FeatureTestNames;
- bool TestSimpleFlags64(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF64__MAX, g_aszSimpleFlags64FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags64FeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- typedef CSimpleFlags CSimpleFlags32;
- const uint32ou g_uiTestValue32 = (uint32ou)0xA5A5A5A5;
- const uint32ou g_uiTestMask32 = (uint32ou)0xC6C6C6C6;
- const uint32ou g_uiTestBit32 = (uint32ou)OU_INT32_MIN;
- const uint32ou g_uiTestAnotherBit32 = (uint32ou)((uint32ou)OU_INT32_MIN >> 1);
- bool TestSimpleFlags32_Constructors()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(CSimpleFlags32::value_type) != sizeof(uint32ou) || sizeof(CSimpleFlags32) != sizeof(uint32ou))
- {
- break;
- }
- CSimpleFlags32 sfEmptyFlags;
- if (sfEmptyFlags.QueryFlagsAllValues())
- {
- break;
- }
- CSimpleFlags32 sfFullFlags(OU_UINT32_MAX);
-
- if (sfFullFlags.QueryFlagsAllValues() != OU_UINT32_MAX)
- {
- break;
- }
- CSimpleFlags32 sfCopyOfFullFlags(sfFullFlags);
- if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT32_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_AssignFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags;
- sfTestFlags.AssignFlagsAllValues(OU_UINT32_MAX);
- if (sfTestFlags.QueryFlagsAllValues() != OU_UINT32_MAX)
- {
- break;
- }
- sfTestFlags.AssignFlagsAllValues(0);
- if (sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_QueryFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32)
- {
- break;
- }
- // Double check to be sure ;-)
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_SetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
- sfTestFlags.SetFlagsMaskValue(g_uiTestMask32, true);
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 | g_uiTestMask32))
- {
- break;
- }
- sfTestFlags.SetFlagsMaskValue(g_uiTestValue32, false);
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(~g_uiTestValue32 & g_uiTestMask32))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_SignalFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
-
- sfTestFlags.SignalFlagsMaskValue(g_uiTestMask32);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 | g_uiTestMask32))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_DropFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
-
- sfTestFlags.DropFlagsMaskValue(g_uiTestMask32);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 & ~g_uiTestMask32))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_ToggleSingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
-
- bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit32);
-
- if (bPreviousValue != ((g_uiTestValue32 & g_uiTestBit32) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 ^ g_uiTestBit32))
- {
- break;
- }
- bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit32);
-
- if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_ModifySingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
-
- bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit32, true);
-
- if (bFirstModification != ((g_uiTestValue32 & g_uiTestBit32) != g_uiTestBit32) || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 | g_uiTestBit32))
- {
- break;
- }
-
- bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit32, bFirstModification);
-
- if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint32ou)(g_uiTestValue32 | g_uiTestBit32) : (uint32ou)(g_uiTestValue32 & ~g_uiTestBit32)))
- {
- break;
- }
- bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit32, bAnotherModification);
- if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint32ou)(g_uiTestValue32 | g_uiTestBit32) : (uint32ou)(g_uiTestValue32 & ~g_uiTestBit32)))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_AssignFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
- uint32ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask32, g_uiTestMask32);
- const uint32ou uiNewFlags = (g_uiTestValue32 & ~g_uiTestMask32) | g_uiTestMask32;
- if (uiPreviousFlags != g_uiTestValue32 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
- {
- break;
- }
- uint32ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue32, 0);
- const uint32ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue32;
- if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- uint32ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask32, g_uiTestMask32 & g_uiTestValue32);
- OU_ASSERT((g_uiTestMask32 & g_uiTestValue32) != 0); // Test degeneration
-
- const uint32ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask32) | (g_uiTestMask32 & g_uiTestValue32);
- OU_ASSERT(uiYetAnotherNewFlags != OU_UINT32_MAX); // Test degeneration
-
- if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_AlterFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
-
- bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask32, g_uiTestMask32);
-
- const uint32ou uiNewFlags = (g_uiTestValue32 & ~g_uiTestMask32) | g_uiTestMask32;
-
- if (bWasModification != ((g_uiTestValue32 & g_uiTestMask32) != g_uiTestMask32) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue32, 0);
-
- const uint32ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue32;
-
- if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue32) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue32, 0);
-
- if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask32, g_uiTestMask32 & g_uiTestValue32);
- OU_ASSERT((g_uiTestMask32 & g_uiTestValue32) != 0); // Test degeneration
-
- const uint32ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask32) | (g_uiTestMask32 & g_uiTestValue32);
- OU_ASSERT(uiYetAnotherNewFlags != OU_UINT32_MAX); // Test degeneration
-
- if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask32) != (g_uiTestMask32 & g_uiTestValue32)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_GetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
-
- if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask32) != ((g_uiTestValue32 & g_uiTestMask32) != 0))
- {
- break;
- }
-
- if (sfTestFlags.GetFlagsMaskValue(~g_uiTestValue32))
- {
- break;
- }
-
- if (!sfTestFlags.GetFlagsMaskValue(OU_UINT32_MAX))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_QueryFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
-
- if (sfTestFlags.QueryFlagsByMask(g_uiTestMask32) != (uint32ou)(g_uiTestValue32 & g_uiTestMask32))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsByMask(0))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsByMask(OU_UINT32_MAX) != g_uiTestValue32)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_OnlySignalSingleFlagOutOfMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(g_uiTestValue32);
- OU_ASSERT(g_uiTestValue32 != 0); // Test degeneration
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_uiTestBit32))
- {
- break;
- }
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32)
- {
- break;
- }
-
- sfTestFlags.AssignFlagsAllValues(0);
- if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit32, g_uiTestBit32))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit32)
- {
- break;
- }
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit32, g_uiTestBit32))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit32)
- {
- break;
- }
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_uiTestAnotherBit32))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit32)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumSetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags;
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)OU_INT32_MIN)
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false);
-
- if (sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumSignalEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags;
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumDropEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(OU_UINT32_MAX);
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT32_MAX ^ 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)~(OU_INT32_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)~(OU_INT32_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)~(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumToggleEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags;
-
- bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)OU_INT32_MIN)
- {
- break;
- }
-
- bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumModifyEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags;
-
- bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
-
- if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
-
- if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
-
- if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
-
- if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false);
-
- if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)OU_INT32_MIN)
- {
- break;
- }
-
- bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false);
-
- if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumSignalFirstEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags;
- bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
- if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
-
- if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1);
-
- if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumSignalLastEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags;
-
- bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
-
- if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
-
- if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
-
- if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT32_BITS))
- {
- break;
- }
-
- if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1))
- {
- break;
- }
-
- if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT32_BITS - 1))
- {
- break;
- }
-
- if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumFindFirstEnumeratedFlag()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
- unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT32_BITS);
- if (uiFirstResult != 0)
- {
- break;
- }
- unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT32_BITS - 1);
- if (uiSecondResult != OU_UINT32_BITS - 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumAllSignalEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags;
-
- sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
- sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT32_BITS - 2);
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_UINT32_MAX ^ 2))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumAllDropEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags(OU_UINT32_MAX);
-
- sfTestFlags.EnumAllDropEnumeratedFlags(1, 1);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_UINT32_MAX ^ 1))
- {
- break;
- }
-
- sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT32_BITS - 2);
-
- if (sfTestFlags.QueryFlagsAllValues() != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumAllQueryEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
-
- uint32ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT32_BITS);
- if (uiFirstResult != (uint32ou)(OU_INT32_MIN + 1))
- {
- break;
- }
-
- uint32ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 1);
- if (uiSecondResult != (uint32ou)(OU_INT32_MIN))
- {
- break;
- }
-
- uint32ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 2);
- if (uiThirdResult != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_EnumAnyGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
-
- bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT32_BITS);
- if (!bFirstResult)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 1);
- if (!bSecondResult)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 2);
- if (bThirdResult)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_StoreFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags;
- sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
- if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(2 << 1))
- {
- break;
- }
-
- sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT32_BITS - 2, 3);
-
- if (sfTestFlags.QueryFlagsAllValues() != ((uint32ou)(2 << 1) | (uint32ou)(OU_INT32_MIN | (OU_INT32_MIN >> 1))))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags32_RetrieveFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
-
- unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
- if (uiFirstResult != 0)
- {
- break;
- }
-
- unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT32_BITS - 2);
- if (uiSecondResult != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- enum EOUSIMPLEFLAGSFEATURE32
- {
- OSF32__MIN,
-
- OSF32_CONSTRUCTORS = OSF32__MIN,
- OSF32_ASSIGNFLAGSALLVALUES,
- OSF32_QUERYFLAGSALLVALUES,
- OSF32_SETFLAGSMASKVALUE,
- OSF32_SIGNALFLAGSMASKVALUE,
- OSF32_DROPFLAGSMASKVALUE,
- OSF32_TOGGLESINGLEFLAGVALUE,
- OSF32_MODIFYSINGLEFLAGVALUE,
- OSF32_ASSIGNFLAGSBYMASK,
- OSF32_ALTERFLAGSBYMASK,
- OSF32_GETFLAGSMASKVALUE,
- OSF32_QUERYFLAGSBYMASK,
- OSF32_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- OSF32_ENUMSETENUMERATEDFLAGVALUE,
- OSF32_ENUMSIGNALENUMERATEDFLAGVALUE,
- OSF32_ENUMDROPENUMERATEDFLAGVALUE,
- OSF32_ENUMTOGGLEENUMERATEDFLAGVALUE,
- OSF32_ENUMMODIFYENUMERATEDFLAGVALUE,
- OSF32_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- OSF32_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- OSF32_ENUMGETENUMERATEDFLAGVALUE,
- OSF32_ENUMFINDFIRSTENUMERATEDFLAG,
- OSF32_ENUMALLSIGNALENUMERATEDFLAGS,
- OSF32_ENUMALLDROPENUMERATEDFLAGS,
- OSF32_ENUMALLQUERYENUMERATEDFLAGS,
- OSF32_ENUMANYGETENUMERATEDFLAGVALUE,
- OSF32_STOREFLAGSENUMERATEDVALUE,
- OSF32_RETRIEVEFLAGSENUMERATEDVALUE,
- OSF32__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE32, OSF32__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestSimpleFlags32_Constructors, // OSF32_CONSTRUCTORS
- &TestSimpleFlags32_AssignFlagsAllValues, // OSF32_ASSIGNFLAGSALLVALUES,
- &TestSimpleFlags32_QueryFlagsAllValues, // OSF32_QUERYFLAGSALLVALUES,
- &TestSimpleFlags32_SetFlagsMaskValue, // OSF32_SETFLAGSMASKVALUE,
- &TestSimpleFlags32_SignalFlagsMaskValue, // OSF32_SIGNALFLAGSMASKVALUE,
- &TestSimpleFlags32_DropFlagsMaskValue, // OSF32_DROPFLAGSMASKVALUE,
- &TestSimpleFlags32_ToggleSingleFlagValue, // OSF32_TOGGLESINGLEFLAGVALUE,
- &TestSimpleFlags32_ModifySingleFlagValue, // OSF32_MODIFYSINGLEFLAGVALUE,
- &TestSimpleFlags32_AssignFlagsByMask, // OSF32_ASSIGNFLAGSBYMASK,
- &TestSimpleFlags32_AlterFlagsByMask, // OSF32_ALTERFLAGSBYMASK,
- &TestSimpleFlags32_GetFlagsMaskValue, // OSF32_GETFLAGSMASKVALUE,
- &TestSimpleFlags32_QueryFlagsByMask, // OSF32_QUERYFLAGSBYMASK,
- &TestSimpleFlags32_OnlySignalSingleFlagOutOfMask, // OSF32_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- &TestSimpleFlags32_EnumSetEnumeratedFlagValue, // OSF32_ENUMSETENUMERATEDFLAGVALUE,
- &TestSimpleFlags32_EnumSignalEnumeratedFlagValue, // OSF32_ENUMSIGNALENUMERATEDFLAGVALUE,
- &TestSimpleFlags32_EnumDropEnumeratedFlagValue, // OSF32_ENUMDROPENUMERATEDFLAGVALUE,
- &TestSimpleFlags32_EnumToggleEnumeratedFlagValue, // OSF32_ENUMTOGGLEENUMERATEDFLAGVALUE,
- &TestSimpleFlags32_EnumModifyEnumeratedFlagValue, // OSF32_ENUMMODIFYENUMERATEDFLAGVALUE,
- &TestSimpleFlags32_EnumSignalFirstEnumeratedFlagValue, // OSF32_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- &TestSimpleFlags32_EnumSignalLastEnumeratedFlagValue, // OSF32_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- &TestSimpleFlags32_EnumGetEnumeratedFlagValue, // OSF32_ENUMGETENUMERATEDFLAGVALUE,
- &TestSimpleFlags32_EnumFindFirstEnumeratedFlag, // OSF32_ENUMFINDFIRSTENUMERATEDFLAG,
- &TestSimpleFlags32_EnumAllSignalEnumeratedFlags, // OSF32_ENUMALLSIGNALENUMERATEDFLAGS,
- &TestSimpleFlags32_EnumAllDropEnumeratedFlags, // OSF32_ENUMALLDROPENUMERATEDFLAGS,
- &TestSimpleFlags32_EnumAllQueryEnumeratedFlags, // OSF32_ENUMALLQUERYENUMERATEDFLAGS,
- &TestSimpleFlags32_EnumAnyGetEnumeratedFlagValue, // OSF32_ENUMANYGETENUMERATEDFLAGVALUE,
- &TestSimpleFlags32_StoreFlagsEnumeratedValue, // OSF32_STOREFLAGSENUMERATEDVALUE,
- &TestSimpleFlags32_RetrieveFlagsEnumeratedValue, // OSF32_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE32, OSF32__MAX, CFeatureTestProcedure> g_afnSimpleFlags32FeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE32, OSF32__MAX, const char *>::m_aetElementArray[] =
- {
- "Constructors", // OSF32_CONSTRUCTORS
- "AssignFlagsAllValues", // OSF32_ASSIGNFLAGSALLVALUES,
- "QueryFlagsAllValues", // OSF32_QUERYFLAGSALLVALUES,
- "SetFlagsMaskValue", // OSF32_SETFLAGSMASKVALUE,
- "SignalFlagsMaskValue", // OSF32_SIGNALFLAGSMASKVALUE,
- "DropFlagsMaskValue", // OSF32_DROPFLAGSMASKVALUE,
- "ToggleSingleFlagValue", // OSF32_TOGGLESINGLEFLAGVALUE,
- "ModifySingleFlagValue", // OSF32_MODIFYSINGLEFLAGVALUE,
- "AssignFlagsByMask", // OSF32_ASSIGNFLAGSBYMASK,
- "AlterFlagsByMask", // OSF32_ALTERFLAGSBYMASK,
- "GetFlagsMaskValue", // OSF32_GETFLAGSMASKVALUE,
- "QueryFlagsByMask", // OSF32_QUERYFLAGSBYMASK,
- "OnlySignalSingleFlagOutOfMask", // OSF32_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- "EnumSetEnumeratedFlagValue", // OSF32_ENUMSETENUMERATEDFLAGVALUE,
- "EnumSignalEnumeratedFlagValue", // OSF32_ENUMSIGNALENUMERATEDFLAGVALUE,
- "EnumDropEnumeratedFlagValue", // OSF32_ENUMDROPENUMERATEDFLAGVALUE,
- "EnumToggleEnumeratedFlagValue", // OSF32_ENUMTOGGLEENUMERATEDFLAGVALUE,
- "EnumModifyEnumeratedFlagValue", // OSF32_ENUMMODIFYENUMERATEDFLAGVALUE,
- "EnumSignalFirstEnumeratedFlagValue", // OSF32_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- "EnumSignalLastEnumeratedFlagValue", // OSF32_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- "EnumGetEnumeratedFlagValue", // OSF32_ENUMGETENUMERATEDFLAGVALUE,
- "EnumFindFirstEnumeratedFlag", // OSF32_ENUMFINDFIRSTENUMERATEDFLAG,
- "EnumAllSignalEnumeratedFlags", // OSF32_ENUMALLSIGNALENUMERATEDFLAGS,
- "EnumAllDropEnumeratedFlags", // OSF32_ENUMALLDROPENUMERATEDFLAGS,
- "EnumAllQueryEnumeratedFlags", // OSF32_ENUMALLQUERYENUMERATEDFLAGS,
- "EnumAnyGetEnumeratedFlagValue", // OSF32_ENUMANYGETENUMERATEDFLAGVALUE,
- "StoreFlagsEnumeratedValue", // OSF32_STOREFLAGSENUMERATEDVALUE,
- "RetrieveFlagsEnumeratedValue", // OSF32_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE32, OSF32__MAX, const char *> g_aszSimpleFlags32FeatureTestNames;
- bool TestSimpleFlags32(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF32__MAX, g_aszSimpleFlags32FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags32FeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- typedef CSimpleFlagsTemplate<uint16ou> CSimpleFlags16;
- const uint16ou g_uiTestValue16 = (uint16ou)0xA5A5;
- const uint16ou g_uiTestMask16 = (uint16ou)0xC6C6;
- const uint16ou g_uiTestBit16 = (uint16ou)OU_INT16_MIN;
- const uint16ou g_uiTestAnotherBit16 = (uint16ou)((uint16ou)OU_INT16_MIN >> 1);
- bool TestSimpleFlags16_Constructors()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(CSimpleFlags16::value_type) != sizeof(uint16ou) || sizeof(CSimpleFlags16) != sizeof(uint16ou))
- {
- break;
- }
- CSimpleFlags16 sfEmptyFlags;
- if (sfEmptyFlags.QueryFlagsAllValues())
- {
- break;
- }
- CSimpleFlags16 sfFullFlags(OU_UINT16_MAX);
-
- if (sfFullFlags.QueryFlagsAllValues() != OU_UINT16_MAX)
- {
- break;
- }
- CSimpleFlags16 sfCopyOfFullFlags(sfFullFlags);
- if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT16_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_AssignFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags;
- sfTestFlags.AssignFlagsAllValues(OU_UINT16_MAX);
- if (sfTestFlags.QueryFlagsAllValues() != OU_UINT16_MAX)
- {
- break;
- }
- sfTestFlags.AssignFlagsAllValues(0);
- if (sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_QueryFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16)
- {
- break;
- }
- // Double check to be sure ;-)
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_SetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
- sfTestFlags.SetFlagsMaskValue(g_uiTestMask16, true);
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 | g_uiTestMask16))
- {
- break;
- }
- sfTestFlags.SetFlagsMaskValue(g_uiTestValue16, false);
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(~g_uiTestValue16 & g_uiTestMask16))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_SignalFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
-
- sfTestFlags.SignalFlagsMaskValue(g_uiTestMask16);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 | g_uiTestMask16))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_DropFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
-
- sfTestFlags.DropFlagsMaskValue(g_uiTestMask16);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 & ~g_uiTestMask16))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_ToggleSingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
-
- bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit16);
-
- if (bPreviousValue != ((g_uiTestValue16 & g_uiTestBit16) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 ^ g_uiTestBit16))
- {
- break;
- }
- bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit16);
-
- if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_ModifySingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
-
- bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit16, true);
-
- if (bFirstModification != ((g_uiTestValue16 & g_uiTestBit16) != g_uiTestBit16) || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 | g_uiTestBit16))
- {
- break;
- }
-
- bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit16, bFirstModification);
-
- if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint16ou)(g_uiTestValue16 | g_uiTestBit16) : (uint16ou)(g_uiTestValue16 & ~g_uiTestBit16)))
- {
- break;
- }
- bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit16, bAnotherModification);
- if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint16ou)(g_uiTestValue16 | g_uiTestBit16) : (uint16ou)(g_uiTestValue16 & ~g_uiTestBit16)))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_AssignFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
- uint16ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask16, g_uiTestMask16);
- const uint16ou uiNewFlags = (g_uiTestValue16 & ~g_uiTestMask16) | g_uiTestMask16;
- if (uiPreviousFlags != g_uiTestValue16 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
- {
- break;
- }
- uint16ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue16, 0);
- const uint16ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue16;
- if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- uint16ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask16, g_uiTestMask16 & g_uiTestValue16);
- OU_ASSERT((g_uiTestMask16 & g_uiTestValue16) != 0); // Test degeneration
-
- const uint16ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask16) | (g_uiTestMask16 & g_uiTestValue16);
- OU_ASSERT(uiYetAnotherNewFlags != OU_UINT16_MAX); // Test degeneration
-
- if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_AlterFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
-
- bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask16, g_uiTestMask16);
-
- const uint16ou uiNewFlags = (g_uiTestValue16 & ~g_uiTestMask16) | g_uiTestMask16;
-
- if (bWasModification != ((g_uiTestValue16 & g_uiTestMask16) != g_uiTestMask16) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue16, 0);
-
- const uint16ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue16;
-
- if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue16) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue16, 0);
-
- if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask16, g_uiTestMask16 & g_uiTestValue16);
- OU_ASSERT((g_uiTestMask16 & g_uiTestValue16) != 0); // Test degeneration
-
- const uint16ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask16) | (g_uiTestMask16 & g_uiTestValue16);
- OU_ASSERT(uiYetAnotherNewFlags != OU_UINT16_MAX); // Test degeneration
-
- if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask16) != (g_uiTestMask16 & g_uiTestValue16)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_GetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
-
- if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask16) != ((g_uiTestValue16 & g_uiTestMask16) != 0))
- {
- break;
- }
-
- if (sfTestFlags.GetFlagsMaskValue((uint16ou)(~g_uiTestValue16)))
- {
- break;
- }
-
- if (!sfTestFlags.GetFlagsMaskValue(OU_UINT16_MAX))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_QueryFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
-
- if (sfTestFlags.QueryFlagsByMask(g_uiTestMask16) != (uint16ou)(g_uiTestValue16 & g_uiTestMask16))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsByMask(0))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsByMask(OU_UINT16_MAX) != g_uiTestValue16)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_OnlySignalSingleFlagOutOfMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(g_uiTestValue16);
- OU_ASSERT(g_uiTestValue16 != 0); // Test degeneration
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT16_MAX, g_uiTestBit16))
- {
- break;
- }
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16)
- {
- break;
- }
-
- sfTestFlags.AssignFlagsAllValues(0);
- if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit16, g_uiTestBit16))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit16)
- {
- break;
- }
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit16, g_uiTestBit16))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit16)
- {
- break;
- }
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT16_MAX, g_uiTestAnotherBit16))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit16)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumSetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags;
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT16_BITS, true);
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, true);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT16_BITS, false);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)OU_INT16_MIN)
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, false);
-
- if (sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumSignalEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags;
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumDropEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(OU_UINT16_MAX);
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT16_MAX ^ 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)~(OU_INT16_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)~(OU_INT16_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)~(OU_INT16_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumToggleEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags;
-
- bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
-
- if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
-
- if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
- {
- break;
- }
-
- bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
-
- if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)OU_INT16_MIN)
- {
- break;
- }
-
- bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
-
- if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumModifyEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags;
-
- bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT16_BITS, true);
-
- if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, true);
-
- if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
- {
- break;
- }
-
- bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT16_BITS, true);
-
- if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
- {
- break;
- }
-
- bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, true);
-
- if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
- {
- break;
- }
-
- bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT16_BITS, false);
-
- if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)OU_INT16_MIN)
- {
- break;
- }
-
- bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, false);
-
- if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumSignalFirstEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags;
- bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
- if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
-
- if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT16_BITS - 1);
-
- if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
-
- if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumSignalLastEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags;
-
- bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
-
- if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
-
- if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
-
- if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT16_BITS))
- {
- break;
- }
-
- if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT16_BITS - 1))
- {
- break;
- }
-
- if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT16_BITS - 1))
- {
- break;
- }
-
- if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumFindFirstEnumeratedFlag()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
- unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT16_BITS);
- if (uiFirstResult != 0)
- {
- break;
- }
- unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT16_BITS - 1);
- if (uiSecondResult != OU_UINT16_BITS - 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumAllSignalEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags;
-
- sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
- sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT16_BITS - 2);
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_UINT16_MAX ^ 2))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumAllDropEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags(OU_UINT16_MAX);
-
- sfTestFlags.EnumAllDropEnumeratedFlags(1, 1);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_UINT16_MAX ^ 1))
- {
- break;
- }
-
- sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT16_BITS - 2);
-
- if (sfTestFlags.QueryFlagsAllValues() != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumAllQueryEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
-
- uint16ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT16_BITS);
- if (uiFirstResult != (uint16ou)(OU_INT16_MIN + 1))
- {
- break;
- }
-
- uint16ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT16_BITS - 1);
- if (uiSecondResult != (uint16ou)(OU_INT16_MIN))
- {
- break;
- }
-
- uint16ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT16_BITS - 2);
- if (uiThirdResult != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_EnumAnyGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
-
- bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT16_BITS);
- if (!bFirstResult)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT16_BITS - 1);
- if (!bSecondResult)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT16_BITS - 2);
- if (bThirdResult)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_StoreFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags;
- sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
- if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(2 << 1))
- {
- break;
- }
-
- sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT16_BITS - 2, 3);
-
- if (sfTestFlags.QueryFlagsAllValues() != ((uint16ou)(2 << 1) | (uint16ou)(OU_INT16_MIN | (OU_INT16_MIN >> 1))))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags16_RetrieveFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
-
- unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
- if (uiFirstResult != 0)
- {
- break;
- }
-
- unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT16_BITS - 2);
- if (uiSecondResult != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- enum EOUSIMPLEFLAGSFEATURE16
- {
- OSF16__MIN,
-
- OSF16_CONSTRUCTORS = OSF16__MIN,
- OSF16_ASSIGNFLAGSALLVALUES,
- OSF16_QUERYFLAGSALLVALUES,
- OSF16_SETFLAGSMASKVALUE,
- OSF16_SIGNALFLAGSMASKVALUE,
- OSF16_DROPFLAGSMASKVALUE,
- OSF16_TOGGLESINGLEFLAGVALUE,
- OSF16_MODIFYSINGLEFLAGVALUE,
- OSF16_ASSIGNFLAGSBYMASK,
- OSF16_ALTERFLAGSBYMASK,
- OSF16_GETFLAGSMASKVALUE,
- OSF16_QUERYFLAGSBYMASK,
- OSF16_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- OSF16_ENUMSETENUMERATEDFLAGVALUE,
- OSF16_ENUMSIGNALENUMERATEDFLAGVALUE,
- OSF16_ENUMDROPENUMERATEDFLAGVALUE,
- OSF16_ENUMTOGGLEENUMERATEDFLAGVALUE,
- OSF16_ENUMMODIFYENUMERATEDFLAGVALUE,
- OSF16_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- OSF16_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- OSF16_ENUMGETENUMERATEDFLAGVALUE,
- OSF16_ENUMFINDFIRSTENUMERATEDFLAG,
- OSF16_ENUMALLSIGNALENUMERATEDFLAGS,
- OSF16_ENUMALLDROPENUMERATEDFLAGS,
- OSF16_ENUMALLQUERYENUMERATEDFLAGS,
- OSF16_ENUMANYGETENUMERATEDFLAGVALUE,
- OSF16_STOREFLAGSENUMERATEDVALUE,
- OSF16_RETRIEVEFLAGSENUMERATEDVALUE,
- OSF16__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE16, OSF16__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestSimpleFlags16_Constructors, // OSF16_CONSTRUCTORS
- &TestSimpleFlags16_AssignFlagsAllValues, // OSF16_ASSIGNFLAGSALLVALUES,
- &TestSimpleFlags16_QueryFlagsAllValues, // OSF16_QUERYFLAGSALLVALUES,
- &TestSimpleFlags16_SetFlagsMaskValue, // OSF16_SETFLAGSMASKVALUE,
- &TestSimpleFlags16_SignalFlagsMaskValue, // OSF16_SIGNALFLAGSMASKVALUE,
- &TestSimpleFlags16_DropFlagsMaskValue, // OSF16_DROPFLAGSMASKVALUE,
- &TestSimpleFlags16_ToggleSingleFlagValue, // OSF16_TOGGLESINGLEFLAGVALUE,
- &TestSimpleFlags16_ModifySingleFlagValue, // OSF16_MODIFYSINGLEFLAGVALUE,
- &TestSimpleFlags16_AssignFlagsByMask, // OSF16_ASSIGNFLAGSBYMASK,
- &TestSimpleFlags16_AlterFlagsByMask, // OSF16_ALTERFLAGSBYMASK,
- &TestSimpleFlags16_GetFlagsMaskValue, // OSF16_GETFLAGSMASKVALUE,
- &TestSimpleFlags16_QueryFlagsByMask, // OSF16_QUERYFLAGSBYMASK,
- &TestSimpleFlags16_OnlySignalSingleFlagOutOfMask, // OSF16_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- &TestSimpleFlags16_EnumSetEnumeratedFlagValue, // OSF16_ENUMSETENUMERATEDFLAGVALUE,
- &TestSimpleFlags16_EnumSignalEnumeratedFlagValue, // OSF16_ENUMSIGNALENUMERATEDFLAGVALUE,
- &TestSimpleFlags16_EnumDropEnumeratedFlagValue, // OSF16_ENUMDROPENUMERATEDFLAGVALUE,
- &TestSimpleFlags16_EnumToggleEnumeratedFlagValue, // OSF16_ENUMTOGGLEENUMERATEDFLAGVALUE,
- &TestSimpleFlags16_EnumModifyEnumeratedFlagValue, // OSF16_ENUMMODIFYENUMERATEDFLAGVALUE,
- &TestSimpleFlags16_EnumSignalFirstEnumeratedFlagValue, // OSF16_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- &TestSimpleFlags16_EnumSignalLastEnumeratedFlagValue, // OSF16_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- &TestSimpleFlags16_EnumGetEnumeratedFlagValue, // OSF16_ENUMGETENUMERATEDFLAGVALUE,
- &TestSimpleFlags16_EnumFindFirstEnumeratedFlag, // OSF16_ENUMFINDFIRSTENUMERATEDFLAG,
- &TestSimpleFlags16_EnumAllSignalEnumeratedFlags, // OSF16_ENUMALLSIGNALENUMERATEDFLAGS,
- &TestSimpleFlags16_EnumAllDropEnumeratedFlags, // OSF16_ENUMALLDROPENUMERATEDFLAGS,
- &TestSimpleFlags16_EnumAllQueryEnumeratedFlags, // OSF16_ENUMALLQUERYENUMERATEDFLAGS,
- &TestSimpleFlags16_EnumAnyGetEnumeratedFlagValue, // OSF16_ENUMANYGETENUMERATEDFLAGVALUE,
- &TestSimpleFlags16_StoreFlagsEnumeratedValue, // OSF16_STOREFLAGSENUMERATEDVALUE,
- &TestSimpleFlags16_RetrieveFlagsEnumeratedValue, // OSF16_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE16, OSF16__MAX, CFeatureTestProcedure> g_afnSimpleFlags16FeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE16, OSF16__MAX, const char *>::m_aetElementArray[] =
- {
- "Constructors", // OSF16_CONSTRUCTORS
- "AssignFlagsAllValues", // OSF16_ASSIGNFLAGSALLVALUES,
- "QueryFlagsAllValues", // OSF16_QUERYFLAGSALLVALUES,
- "SetFlagsMaskValue", // OSF16_SETFLAGSMASKVALUE,
- "SignalFlagsMaskValue", // OSF16_SIGNALFLAGSMASKVALUE,
- "DropFlagsMaskValue", // OSF16_DROPFLAGSMASKVALUE,
- "ToggleSingleFlagValue", // OSF16_TOGGLESINGLEFLAGVALUE,
- "ModifySingleFlagValue", // OSF16_MODIFYSINGLEFLAGVALUE,
- "AssignFlagsByMask", // OSF16_ASSIGNFLAGSBYMASK,
- "AlterFlagsByMask", // OSF16_ALTERFLAGSBYMASK,
- "GetFlagsMaskValue", // OSF16_GETFLAGSMASKVALUE,
- "QueryFlagsByMask", // OSF16_QUERYFLAGSBYMASK,
- "OnlySignalSingleFlagOutOfMask", // OSF16_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- "EnumSetEnumeratedFlagValue", // OSF16_ENUMSETENUMERATEDFLAGVALUE,
- "EnumSignalEnumeratedFlagValue", // OSF16_ENUMSIGNALENUMERATEDFLAGVALUE,
- "EnumDropEnumeratedFlagValue", // OSF16_ENUMDROPENUMERATEDFLAGVALUE,
- "EnumToggleEnumeratedFlagValue", // OSF16_ENUMTOGGLEENUMERATEDFLAGVALUE,
- "EnumModifyEnumeratedFlagValue", // OSF16_ENUMMODIFYENUMERATEDFLAGVALUE,
- "EnumSignalFirstEnumeratedFlagValue", // OSF16_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- "EnumSignalLastEnumeratedFlagValue", // OSF16_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- "EnumGetEnumeratedFlagValue", // OSF16_ENUMGETENUMERATEDFLAGVALUE,
- "EnumFindFirstEnumeratedFlag", // OSF16_ENUMFINDFIRSTENUMERATEDFLAG,
- "EnumAllSignalEnumeratedFlags", // OSF16_ENUMALLSIGNALENUMERATEDFLAGS,
- "EnumAllDropEnumeratedFlags", // OSF16_ENUMALLDROPENUMERATEDFLAGS,
- "EnumAllQueryEnumeratedFlags", // OSF16_ENUMALLQUERYENUMERATEDFLAGS,
- "EnumAnyGetEnumeratedFlagValue", // OSF16_ENUMANYGETENUMERATEDFLAGVALUE,
- "StoreFlagsEnumeratedValue", // OSF16_STOREFLAGSENUMERATEDVALUE,
- "RetrieveFlagsEnumeratedValue", // OSF16_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE16, OSF16__MAX, const char *> g_aszSimpleFlags16FeatureTestNames;
- bool TestSimpleFlags16(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF16__MAX, g_aszSimpleFlags16FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags16FeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- typedef CSimpleFlagsTemplate<uint8ou> CSimpleFlags8;
- const uint8ou g_uiTestValue8 = (uint8ou)0xA5;
- const uint8ou g_uiTestMask8 = (uint8ou)0xC6;
- const uint8ou g_uiTestBit8 = (uint8ou)OU_INT8_MIN;
- const uint8ou g_uiTestAnotherBit8 = (uint8ou)((uint8ou)OU_INT8_MIN >> 1);
- bool TestSimpleFlags8_Constructors()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(CSimpleFlags8::value_type) != sizeof(uint8ou) || sizeof(CSimpleFlags8) != sizeof(uint8ou))
- {
- break;
- }
- CSimpleFlags8 sfEmptyFlags;
- if (sfEmptyFlags.QueryFlagsAllValues())
- {
- break;
- }
- CSimpleFlags8 sfFullFlags(OU_UINT8_MAX);
-
- if (sfFullFlags.QueryFlagsAllValues() != OU_UINT8_MAX)
- {
- break;
- }
- CSimpleFlags8 sfCopyOfFullFlags(sfFullFlags);
- if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT8_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_AssignFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags;
- sfTestFlags.AssignFlagsAllValues(OU_UINT8_MAX);
- if (sfTestFlags.QueryFlagsAllValues() != OU_UINT8_MAX)
- {
- break;
- }
- sfTestFlags.AssignFlagsAllValues(0);
- if (sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_QueryFlagsAllValues()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8)
- {
- break;
- }
- // Double check to be sure ;-)
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_SetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
- sfTestFlags.SetFlagsMaskValue(g_uiTestMask8, true);
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 | g_uiTestMask8))
- {
- break;
- }
- sfTestFlags.SetFlagsMaskValue(g_uiTestValue8, false);
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(~g_uiTestValue8 & g_uiTestMask8))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_SignalFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
-
- sfTestFlags.SignalFlagsMaskValue(g_uiTestMask8);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 | g_uiTestMask8))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_DropFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
-
- sfTestFlags.DropFlagsMaskValue(g_uiTestMask8);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 & ~g_uiTestMask8))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_ToggleSingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
-
- bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit8);
-
- if (bPreviousValue != ((g_uiTestValue8 & g_uiTestBit8) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 ^ g_uiTestBit8))
- {
- break;
- }
- bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit8);
-
- if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_ModifySingleFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
-
- bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit8, true);
-
- if (bFirstModification != ((g_uiTestValue8 & g_uiTestBit8) != g_uiTestBit8) || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 | g_uiTestBit8))
- {
- break;
- }
-
- bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit8, bFirstModification);
-
- if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint8ou)(g_uiTestValue8 | g_uiTestBit8) : (uint8ou)(g_uiTestValue8 & ~g_uiTestBit8)))
- {
- break;
- }
- bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit8, bAnotherModification);
- if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint8ou)(g_uiTestValue8 | g_uiTestBit8) : (uint8ou)(g_uiTestValue8 & ~g_uiTestBit8)))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_AssignFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
- uint8ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask8, g_uiTestMask8);
- const uint8ou uiNewFlags = (g_uiTestValue8 & ~g_uiTestMask8) | g_uiTestMask8;
- if (uiPreviousFlags != g_uiTestValue8 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
- {
- break;
- }
- uint8ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue8, 0);
- const uint8ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue8;
- if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- uint8ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask8, g_uiTestMask8 & g_uiTestValue8);
- OU_ASSERT((g_uiTestMask8 & g_uiTestValue8) != 0); // Test degeneration
-
- const uint8ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask8) | (g_uiTestMask8 & g_uiTestValue8);
- OU_ASSERT(uiYetAnotherNewFlags != OU_UINT8_MAX); // Test degeneration
-
- if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_AlterFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
-
- bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask8, g_uiTestMask8);
-
- const uint8ou uiNewFlags = (g_uiTestValue8 & ~g_uiTestMask8) | g_uiTestMask8;
-
- if (bWasModification != ((g_uiTestValue8 & g_uiTestMask8) != g_uiTestMask8) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue8, 0);
-
- const uint8ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue8;
-
- if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue8) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue8, 0);
-
- if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
- {
- break;
- }
-
- bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask8, g_uiTestMask8 & g_uiTestValue8);
- OU_ASSERT((g_uiTestMask8 & g_uiTestValue8) != 0); // Test degeneration
-
- const uint8ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask8) | (g_uiTestMask8 & g_uiTestValue8);
- OU_ASSERT(uiYetAnotherNewFlags != OU_UINT8_MAX); // Test degeneration
-
- if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask8) != (g_uiTestMask8 & g_uiTestValue8)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_GetFlagsMaskValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
-
- if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask8) != ((g_uiTestValue8 & g_uiTestMask8) != 0))
- {
- break;
- }
-
- if (sfTestFlags.GetFlagsMaskValue((uint8ou)(~g_uiTestValue8)))
- {
- break;
- }
-
- if (!sfTestFlags.GetFlagsMaskValue(OU_UINT8_MAX))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_QueryFlagsByMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
-
- if (sfTestFlags.QueryFlagsByMask(g_uiTestMask8) != (uint8ou)(g_uiTestValue8 & g_uiTestMask8))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsByMask(0))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsByMask(OU_UINT8_MAX) != g_uiTestValue8)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_OnlySignalSingleFlagOutOfMask()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(g_uiTestValue8);
- OU_ASSERT(g_uiTestValue8 != 0); // Test degeneration
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT8_MAX, g_uiTestBit8))
- {
- break;
- }
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8)
- {
- break;
- }
-
- sfTestFlags.AssignFlagsAllValues(0);
- if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit8, g_uiTestBit8))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit8)
- {
- break;
- }
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit8, g_uiTestBit8))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit8)
- {
- break;
- }
-
- if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT8_MAX, g_uiTestAnotherBit8))
- {
- break;
- }
-
- if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit8)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumSetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags;
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT8_BITS, true);
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, true);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT8_BITS, false);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)OU_INT8_MIN)
- {
- break;
- }
-
- sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, false);
-
- if (sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumSignalEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags;
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumDropEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(OU_UINT8_MAX);
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT8_MAX ^ 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)~(OU_INT8_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)~(OU_INT8_MIN + 1))
- {
- break;
- }
-
- sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)~(OU_INT8_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumToggleEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags;
-
- bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
-
- if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
-
- if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
- {
- break;
- }
-
- bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
-
- if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)OU_INT8_MIN)
- {
- break;
- }
-
- bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
-
- if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumModifyEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags;
-
- bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT8_BITS, true);
-
- if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, true);
-
- if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
- {
- break;
- }
-
- bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT8_BITS, true);
-
- if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
- {
- break;
- }
-
- bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, true);
-
- if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
- {
- break;
- }
-
- bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT8_BITS, false);
-
- if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)OU_INT8_MIN)
- {
- break;
- }
-
- bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, false);
-
- if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumSignalFirstEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags;
- bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
- if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
-
- if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT8_BITS - 1);
-
- if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
-
- if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumSignalLastEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags;
-
- bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
-
- if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
-
- if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
- {
- break;
- }
-
- bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
-
- if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 3))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
-
- if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT8_BITS))
- {
- break;
- }
-
- if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT8_BITS - 1))
- {
- break;
- }
-
- if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT8_BITS - 1))
- {
- break;
- }
-
- if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumFindFirstEnumeratedFlag()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
- unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT8_BITS);
- if (uiFirstResult != 0)
- {
- break;
- }
- unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT8_BITS - 1);
- if (uiSecondResult != OU_UINT8_BITS - 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumAllSignalEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags;
-
- sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
- if (sfTestFlags.QueryFlagsAllValues() != 1)
- {
- break;
- }
- sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT8_BITS - 2);
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_UINT8_MAX ^ 2))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumAllDropEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags(OU_UINT8_MAX);
-
- sfTestFlags.EnumAllDropEnumeratedFlags(1, 1);
-
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_UINT8_MAX ^ 1))
- {
- break;
- }
-
- sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT8_BITS - 2);
-
- if (sfTestFlags.QueryFlagsAllValues() != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumAllQueryEnumeratedFlags()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
-
- uint8ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT8_BITS);
- if (uiFirstResult != (uint8ou)(OU_INT8_MIN + 1))
- {
- break;
- }
-
- uint8ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT8_BITS - 1);
- if (uiSecondResult != (uint8ou)(OU_INT8_MIN))
- {
- break;
- }
-
- uint8ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT8_BITS - 2);
- if (uiThirdResult != 0)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_EnumAnyGetEnumeratedFlagValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
-
- bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT8_BITS);
- if (!bFirstResult)
- {
- break;
- }
-
- bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT8_BITS - 1);
- if (!bSecondResult)
- {
- break;
- }
-
- bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT8_BITS - 2);
- if (bThirdResult)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_StoreFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags;
- sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
- if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(2 << 1))
- {
- break;
- }
-
- sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT8_BITS - 2, 3);
-
- if (sfTestFlags.QueryFlagsAllValues() != ((uint8ou)(2 << 1) | (uint8ou)(OU_INT8_MIN | (OU_INT8_MIN >> 1))))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestSimpleFlags8_RetrieveFlagsEnumeratedValue()
- {
- bool bResult = false;
-
- do
- {
- CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
-
- unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
- if (uiFirstResult != 0)
- {
- break;
- }
-
- unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT8_BITS - 2);
- if (uiSecondResult != 2)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- enum EOUSIMPLEFLAGSFEATURE8
- {
- OSF8__MIN,
-
- OSF8_CONSTRUCTORS = OSF8__MIN,
- OSF8_ASSIGNFLAGSALLVALUES,
- OSF8_QUERYFLAGSALLVALUES,
- OSF8_SETFLAGSMASKVALUE,
- OSF8_SIGNALFLAGSMASKVALUE,
- OSF8_DROPFLAGSMASKVALUE,
- OSF8_TOGGLESINGLEFLAGVALUE,
- OSF8_MODIFYSINGLEFLAGVALUE,
- OSF8_ASSIGNFLAGSBYMASK,
- OSF8_ALTERFLAGSBYMASK,
- OSF8_GETFLAGSMASKVALUE,
- OSF8_QUERYFLAGSBYMASK,
- OSF8_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- OSF8_ENUMSETENUMERATEDFLAGVALUE,
- OSF8_ENUMSIGNALENUMERATEDFLAGVALUE,
- OSF8_ENUMDROPENUMERATEDFLAGVALUE,
- OSF8_ENUMTOGGLEENUMERATEDFLAGVALUE,
- OSF8_ENUMMODIFYENUMERATEDFLAGVALUE,
- OSF8_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- OSF8_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- OSF8_ENUMGETENUMERATEDFLAGVALUE,
- OSF8_ENUMFINDFIRSTENUMERATEDFLAG,
- OSF8_ENUMALLSIGNALENUMERATEDFLAGS,
- OSF8_ENUMALLDROPENUMERATEDFLAGS,
- OSF8_ENUMALLQUERYENUMERATEDFLAGS,
- OSF8_ENUMANYGETENUMERATEDFLAGVALUE,
- OSF8_STOREFLAGSENUMERATEDVALUE,
- OSF8_RETRIEVEFLAGSENUMERATEDVALUE,
- OSF8__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE8, OSF8__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestSimpleFlags8_Constructors, // OSF8_CONSTRUCTORS
- &TestSimpleFlags8_AssignFlagsAllValues, // OSF8_ASSIGNFLAGSALLVALUES,
- &TestSimpleFlags8_QueryFlagsAllValues, // OSF8_QUERYFLAGSALLVALUES,
- &TestSimpleFlags8_SetFlagsMaskValue, // OSF8_SETFLAGSMASKVALUE,
- &TestSimpleFlags8_SignalFlagsMaskValue, // OSF8_SIGNALFLAGSMASKVALUE,
- &TestSimpleFlags8_DropFlagsMaskValue, // OSF8_DROPFLAGSMASKVALUE,
- &TestSimpleFlags8_ToggleSingleFlagValue, // OSF8_TOGGLESINGLEFLAGVALUE,
- &TestSimpleFlags8_ModifySingleFlagValue, // OSF8_MODIFYSINGLEFLAGVALUE,
- &TestSimpleFlags8_AssignFlagsByMask, // OSF8_ASSIGNFLAGSBYMASK,
- &TestSimpleFlags8_AlterFlagsByMask, // OSF8_ALTERFLAGSBYMASK,
- &TestSimpleFlags8_GetFlagsMaskValue, // OSF8_GETFLAGSMASKVALUE,
- &TestSimpleFlags8_QueryFlagsByMask, // OSF8_QUERYFLAGSBYMASK,
- &TestSimpleFlags8_OnlySignalSingleFlagOutOfMask, // OSF8_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- &TestSimpleFlags8_EnumSetEnumeratedFlagValue, // OSF8_ENUMSETENUMERATEDFLAGVALUE,
- &TestSimpleFlags8_EnumSignalEnumeratedFlagValue, // OSF8_ENUMSIGNALENUMERATEDFLAGVALUE,
- &TestSimpleFlags8_EnumDropEnumeratedFlagValue, // OSF8_ENUMDROPENUMERATEDFLAGVALUE,
- &TestSimpleFlags8_EnumToggleEnumeratedFlagValue, // OSF8_ENUMTOGGLEENUMERATEDFLAGVALUE,
- &TestSimpleFlags8_EnumModifyEnumeratedFlagValue, // OSF8_ENUMMODIFYENUMERATEDFLAGVALUE,
- &TestSimpleFlags8_EnumSignalFirstEnumeratedFlagValue, // OSF8_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- &TestSimpleFlags8_EnumSignalLastEnumeratedFlagValue, // OSF8_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- &TestSimpleFlags8_EnumGetEnumeratedFlagValue, // OSF8_ENUMGETENUMERATEDFLAGVALUE,
- &TestSimpleFlags8_EnumFindFirstEnumeratedFlag, // OSF8_ENUMFINDFIRSTENUMERATEDFLAG,
- &TestSimpleFlags8_EnumAllSignalEnumeratedFlags, // OSF8_ENUMALLSIGNALENUMERATEDFLAGS,
- &TestSimpleFlags8_EnumAllDropEnumeratedFlags, // OSF8_ENUMALLDROPENUMERATEDFLAGS,
- &TestSimpleFlags8_EnumAllQueryEnumeratedFlags, // OSF8_ENUMALLQUERYENUMERATEDFLAGS,
- &TestSimpleFlags8_EnumAnyGetEnumeratedFlagValue, // OSF8_ENUMANYGETENUMERATEDFLAGVALUE,
- &TestSimpleFlags8_StoreFlagsEnumeratedValue, // OSF8_STOREFLAGSENUMERATEDVALUE,
- &TestSimpleFlags8_RetrieveFlagsEnumeratedValue, // OSF8_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE8, OSF8__MAX, CFeatureTestProcedure> g_afnSimpleFlags8FeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE8, OSF8__MAX, const char *>::m_aetElementArray[] =
- {
- "Constructors", // OSF8_CONSTRUCTORS
- "AssignFlagsAllValues", // OSF8_ASSIGNFLAGSALLVALUES,
- "QueryFlagsAllValues", // OSF8_QUERYFLAGSALLVALUES,
- "SetFlagsMaskValue", // OSF8_SETFLAGSMASKVALUE,
- "SignalFlagsMaskValue", // OSF8_SIGNALFLAGSMASKVALUE,
- "DropFlagsMaskValue", // OSF8_DROPFLAGSMASKVALUE,
- "ToggleSingleFlagValue", // OSF8_TOGGLESINGLEFLAGVALUE,
- "ModifySingleFlagValue", // OSF8_MODIFYSINGLEFLAGVALUE,
- "AssignFlagsByMask", // OSF8_ASSIGNFLAGSBYMASK,
- "AlterFlagsByMask", // OSF8_ALTERFLAGSBYMASK,
- "GetFlagsMaskValue", // OSF8_GETFLAGSMASKVALUE,
- "QueryFlagsByMask", // OSF8_QUERYFLAGSBYMASK,
- "OnlySignalSingleFlagOutOfMask", // OSF8_ONLYSIGNALSINGLEFLAGOUTOFMASK,
- "EnumSetEnumeratedFlagValue", // OSF8_ENUMSETENUMERATEDFLAGVALUE,
- "EnumSignalEnumeratedFlagValue", // OSF8_ENUMSIGNALENUMERATEDFLAGVALUE,
- "EnumDropEnumeratedFlagValue", // OSF8_ENUMDROPENUMERATEDFLAGVALUE,
- "EnumToggleEnumeratedFlagValue", // OSF8_ENUMTOGGLEENUMERATEDFLAGVALUE,
- "EnumModifyEnumeratedFlagValue", // OSF8_ENUMMODIFYENUMERATEDFLAGVALUE,
- "EnumSignalFirstEnumeratedFlagValue", // OSF8_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
- "EnumSignalLastEnumeratedFlagValue", // OSF8_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
- "EnumGetEnumeratedFlagValue", // OSF8_ENUMGETENUMERATEDFLAGVALUE,
- "EnumFindFirstEnumeratedFlag", // OSF8_ENUMFINDFIRSTENUMERATEDFLAG,
- "EnumAllSignalEnumeratedFlags", // OSF8_ENUMALLSIGNALENUMERATEDFLAGS,
- "EnumAllDropEnumeratedFlags", // OSF8_ENUMALLDROPENUMERATEDFLAGS,
- "EnumAllQueryEnumeratedFlags", // OSF8_ENUMALLQUERYENUMERATEDFLAGS,
- "EnumAnyGetEnumeratedFlagValue", // OSF8_ENUMANYGETENUMERATEDFLAGVALUE,
- "StoreFlagsEnumeratedValue", // OSF8_STOREFLAGSENUMERATEDVALUE,
- "RetrieveFlagsEnumeratedValue", // OSF8_RETRIEVEFLAGSENUMERATEDVALUE,
- };
- static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE8, OSF8__MAX, const char *> g_aszSimpleFlags8FeatureTestNames;
- bool TestSimpleFlags8(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF8__MAX, g_aszSimpleFlags8FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags8FeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- bool TestFlagsDefines_EnumFlagsMask()
- {
- bool bResult = false;
-
- do
- {
- int64ou iMask;
-
- iMask = OU_FLAGS_ENUMFLAGS_MASK(uint8ou, 1, 1);
- if (iMask - 1 != 0)
- {
- break;
- }
-
- iMask = OU_FLAGS_ENUMFLAGS_MASK(uint8ou, 1, OU_UINT8_BITS);
- if (iMask ^ OU_UINT8_MAX)
- {
- break;
- }
- iMask = OU_FLAGS_ENUMFLAGS_MASK(uint16ou, 1, 1);
- if (iMask - 1 != 0)
- {
- break;
- }
-
- iMask = OU_FLAGS_ENUMFLAGS_MASK(uint16ou, 1, OU_UINT16_BITS);
- if (iMask ^ OU_UINT16_MAX)
- {
- break;
- }
-
- iMask = OU_FLAGS_ENUMFLAGS_MASK(uint32ou, 1, 1);
- if (iMask - 1 != 0)
- {
- break;
- }
-
- iMask = OU_FLAGS_ENUMFLAGS_MASK(uint32ou, 1, OU_UINT32_BITS);
- if (iMask ^ OU_UINT32_MAX)
- {
- break;
- }
-
- iMask = OU_FLAGS_ENUMFLAGS_MASK(uint64ou, 1, 1);
- if (iMask - 1 != 0)
- {
- break;
- }
-
- iMask = OU_FLAGS_ENUMFLAGS_MASK(uint64ou, 1, OU_UINT64_BITS);
- if (iMask ^ OU_UINT64_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestFlagsDefines_EnumFlagsStartValid()
- {
- bool bResult = false;
-
- do
- {
- if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint8ou, 1, OU_UINT8_BITS))
- {
- break;
- }
- /*
- if (OU_FLAGS_ENUMFLAGS_START_VALID(uint8ou, 1, OU_UINT8_BITS + 1))
- {
- break;
- }
- */
- if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint16ou, 1, OU_UINT16_BITS))
- {
- break;
- }
- /*
- if (OU_FLAGS_ENUMFLAGS_START_VALID(uint16ou, 1, OU_UINT16_BITS + 1))
- {
- break;
- }
- */
- if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint32ou, 1, OU_UINT32_BITS))
- {
- break;
- }
- /*
- if (OU_FLAGS_ENUMFLAGS_START_VALID(uint32ou, 1, OU_UINT32_BITS + 1))
- {
- break;
- }
- */
- if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint64ou, 1, OU_UINT64_BITS))
- {
- break;
- }
- /*
- if (OU_FLAGS_ENUMFLAGS_START_VALID(uint64ou, 1, OU_UINT64_BITS + 1))
- {
- break;
- }
- */
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestFlagsDefines_StoreEnumValueInMask()
- {
- bool bResult = false;
-
- do
- {
- if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 1, 1))
- {
- break;
- }
- if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 0, OU_UINT8_MAX) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, OU_UINT8_MAX, OU_UINT8_MAX))
- {
- break;
- }
- if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 2, 1))
- {
- break;
- }
- if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 1, 0))
- {
- break;
- }
-
- if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 1, 1))
- {
- break;
- }
-
- if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 0, OU_UINT16_MAX) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, OU_UINT16_MAX, OU_UINT16_MAX))
- {
- break;
- }
-
- if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 2, 1))
- {
- break;
- }
-
- if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 1, 0))
- {
- break;
- }
-
- if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 1, 1))
- {
- break;
- }
-
- if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 0, OU_UINT32_MAX) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, OU_UINT32_MAX, OU_UINT32_MAX))
- {
- break;
- }
-
- if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 2, 1))
- {
- break;
- }
-
- if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 1, 0))
- {
- break;
- }
-
- if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 1, 1))
- {
- break;
- }
-
- if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 0, OU_UINT64_MAX) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, OU_UINT64_MAX, OU_UINT64_MAX))
- {
- break;
- }
-
- if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 2, 1))
- {
- break;
- }
-
- if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 1, 0))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- bool TestFlagsDefines_FlagIsSingle()
- {
- bool bResult = false;
-
- do
- {
- if (!OU_FLAGS_FLAG_IS_SINGLE(uint8ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint8ou, OU_INT8_MIN))
- {
- break;
- }
- if (OU_FLAGS_FLAG_IS_SINGLE(uint8ou, 0) || OU_FLAGS_FLAG_IS_SINGLE(uint8ou, 3) || OU_FLAGS_FLAG_IS_SINGLE(uint8ou, OU_INT8_MIN + 1))
- {
- break;
- }
-
- if (!OU_FLAGS_FLAG_IS_SINGLE(uint16ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint16ou, OU_INT16_MIN))
- {
- break;
- }
-
- if (OU_FLAGS_FLAG_IS_SINGLE(uint16ou, 0) || OU_FLAGS_FLAG_IS_SINGLE(uint16ou, 3) || OU_FLAGS_FLAG_IS_SINGLE(uint16ou, OU_INT16_MIN + 1))
- {
- break;
- }
-
- if (!OU_FLAGS_FLAG_IS_SINGLE(uint32ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint32ou, OU_INT32_MIN))
- {
- break;
- }
-
- if (OU_FLAGS_FLAG_IS_SINGLE(uint32ou, 0) || OU_FLAGS_FLAG_IS_SINGLE(uint32ou, 3) || OU_FLAGS_FLAG_IS_SINGLE(uint32ou, OU_INT32_MIN + 1))
- {
- break;
- }
-
- if (!OU_FLAGS_FLAG_IS_SINGLE(uint64ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint64ou, OU_INT64_MIN))
- {
- break;
- }
-
- if (OU_FLAGS_FLAG_IS_SINGLE(uint64ou, 0) || OU_FLAGS_FLAG_IS_SINGLE(uint64ou, 3) || OU_FLAGS_FLAG_IS_SINGLE(uint64ou, OU_INT64_MIN + 1))
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- enum EOUFLAGSDEFINESFEATURE
- {
- OFF__MIN,
-
- OFF_ENUMFLAGS_MASK = OFF__MIN,
- OFF_ENUMFLAGS_START_VALID,
- OFF_STOREENUM_VALUE_IN_MASK,
- OFF_FLAG_IS_SINGLE,
-
- OFF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUFLAGSDEFINESFEATURE, OFF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestFlagsDefines_EnumFlagsMask, // OFF_ENUMFLAGS_MASK,
- &TestFlagsDefines_EnumFlagsStartValid, // OFF_ENUMFLAGS_START_VALID,
- &TestFlagsDefines_StoreEnumValueInMask, // OFF_STOREENUM_VALUE_IN_MASK,
- &TestFlagsDefines_FlagIsSingle, // OFF_FLAG_IS_SINGLE,
- };
- static const CEnumUnsortedElementArray<EOUFLAGSDEFINESFEATURE, OFF__MAX, CFeatureTestProcedure> g_afnFlagsDefineFeatureTestProcedures;
- template<>const char *const CEnumUnsortedElementArray<EOUFLAGSDEFINESFEATURE, OFF__MAX, const char *>::m_aetElementArray[] =
- {
- "ENUMFLAGS_MASK", // OFF_ENUMFLAGS_MASK = OFF__MIN,
- "ENUMFLAGS_START_VALID", // OFF_ENUMFLAGS_START_VALID,
- "STOREENUM_VALUE_IN_MASK", // OFF_STOREENUM_VALUE_IN_MASK,
- "FLAG_IS_SINGLE", // OFF_FLAG_IS_SINGLE,
- };
- static const CEnumUnsortedElementArray<EOUFLAGSDEFINESFEATURE, OFF__MAX, const char *> g_aszFlagsDefineFeatureTestNames;
- bool TestFlagsDefines(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OFF__MAX, g_aszFlagsDefineFeatureTestNames.GetStoragePointer(), g_afnFlagsDefineFeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- enum EENUMARRAYTESTENUM
- {
- ATE__MIN,
- ATE_FIRSTELEMENT = ATE__MIN,
- ATE_SECONDELEMENT,
- ATE_THIRDELEMENT,
- ATE__MAX,
- };
- template<>
- const int CEnumUnsortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, int>::m_aetElementArray[] =
- {
- 1, // ATE_FIRSTELEMENT,
- 3, // ATE_SECONDELEMENT,
- 2, // ATE_THIRDELEMENT,
- };
- static const CEnumUnsortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, int> g_ai_IntUnsortedArray;
- template<>
- const int CEnumSortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, int>::m_aetElementArray[] =
- {
- 1, // ATE_FIRSTELEMENT,
- 2, // ATE_SECONDELEMENT,
- 3, // ATE_THIRDELEMENT,
- };
- static const CEnumSortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, int> g_ai_IntSortedArray;
- struct ConstCharPtrEq
- {
- bool operator ()(const char *szLeftValue, const char *szRightValue) const
- {
- return strcmp(szLeftValue, szRightValue) == 0;
- }
- };
- struct ConstCharPtrLess
- {
- bool operator ()(const char *szLeftValue, const char *szRightValue) const
- {
- return strcmp(szLeftValue, szRightValue) < 0;
- }
- };
- template<>
- const char *const CEnumUnsortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, const char *, 0, ConstCharPtrEq>::m_aetElementArray[] =
- {
- "first",
- "third",
- "second",
- };
- static const CEnumUnsortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, const char *, 0, ConstCharPtrEq> g_aszStringUnsortedArray;
- template<>
- const char *const CEnumSortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, const char *, 0, ConstCharPtrLess>::m_aetElementArray[] =
- {
- "first",
- "second",
- "third",
- };
- static const CEnumSortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, const char *, 0, ConstCharPtrLess> g_aszStringSortedArray;
- bool TestEnumArrays_UnsortedArray()
- {
- EENUMARRAYTESTENUM teEnumCurrent = ATE__MIN;
-
- for (; teEnumCurrent != ATE__MAX; ++teEnumCurrent)
- {
- int iCurrentValue = g_ai_IntUnsortedArray.Encode(teEnumCurrent);
- EENUMARRAYTESTENUM teIntDecodeCheck = g_ai_IntUnsortedArray.Decode(iCurrentValue);
-
- if (!g_ai_IntUnsortedArray.IsValidDecode(teIntDecodeCheck) || teIntDecodeCheck != teEnumCurrent)
- {
- break;
- }
- if (g_ai_IntUnsortedArray.GetStoragePointer()[teEnumCurrent] != iCurrentValue)
- {
- break;
- }
- const char *szCurrentString = g_aszStringUnsortedArray.Encode(teEnumCurrent);
- EENUMARRAYTESTENUM teStringDecodeCheck = g_aszStringUnsortedArray.Decode(szCurrentString);
-
- if (!g_aszStringUnsortedArray.IsValidDecode(teStringDecodeCheck) || teStringDecodeCheck != teEnumCurrent)
- {
- break;
- }
- if (strcmp(g_aszStringUnsortedArray.GetStoragePointer()[teEnumCurrent], szCurrentString) != 0)
- {
- break;
- }
- EENUMARRAYTESTENUM teInvalidDecodeCheck = g_aszStringUnsortedArray.Decode(szCurrentString + 1);
- if (teInvalidDecodeCheck != ATE__MAX || g_aszStringUnsortedArray.IsValidDecode(teInvalidDecodeCheck))
- {
- break;
- }
- }
- bool bResult = teEnumCurrent == ATE__MAX;
- return bResult;
- }
- bool TestEnumArrays_SortedArray()
- {
- EENUMARRAYTESTENUM teEnumCurrent = ATE__MIN;
-
- for (; teEnumCurrent != ATE__MAX; ++teEnumCurrent)
- {
- int iCurrentValue = g_ai_IntSortedArray.Encode(teEnumCurrent);
- EENUMARRAYTESTENUM teIntDecodeCheck = g_ai_IntSortedArray.Decode(iCurrentValue);
-
- if (!g_ai_IntSortedArray.IsValidDecode(teIntDecodeCheck) || teIntDecodeCheck != teEnumCurrent)
- {
- break;
- }
- if (g_ai_IntSortedArray.GetStoragePointer()[teEnumCurrent] != iCurrentValue)
- {
- break;
- }
- const char *szCurrentString = g_aszStringSortedArray.Encode(teEnumCurrent);
- EENUMARRAYTESTENUM teStringDecodeCheck = g_aszStringSortedArray.Decode(szCurrentString);
-
- if (!g_aszStringSortedArray.IsValidDecode(teStringDecodeCheck) || teStringDecodeCheck != teEnumCurrent)
- {
- break;
- }
- if (strcmp(g_aszStringSortedArray.GetStoragePointer()[teEnumCurrent], szCurrentString) != 0)
- {
- break;
- }
- EENUMARRAYTESTENUM teInvalidDecodeCheck = g_aszStringSortedArray.Decode(szCurrentString + 1);
- if (teInvalidDecodeCheck != ATE__MAX || g_aszStringSortedArray.IsValidDecode(teInvalidDecodeCheck))
- {
- break;
- }
- }
- bool bResult = teEnumCurrent == ATE__MAX;
- return bResult;
- }
- enum EOUENUMARRAYSFEATURE
- {
- ORF__MIN,
- ORF_UNSORTEDARRAY = ORF__MIN,
- ORF_SORTEDARRAY,
- ORF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUENUMARRAYSFEATURE, ORF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestEnumArrays_UnsortedArray, // ORF_UNSORTEDARRAY,
- &TestEnumArrays_SortedArray, // ORF_SORTEDARRAY,
- };
- static const CEnumUnsortedElementArray<EOUENUMARRAYSFEATURE, ORF__MAX, CFeatureTestProcedure> g_afnEnumArrayFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUENUMARRAYSFEATURE, ORF__MAX, const char *>::m_aetElementArray[] =
- {
- "Unsorted Array", // ORF_UNSORTEDARRAY,
- "Sorted Array", // ORF_SORTEDARRAY,
- };
- static const CEnumUnsortedElementArray<EOUENUMARRAYSFEATURE, ORF__MAX, const char *> g_aszEnumArrayFeatureTestNames;
- bool TestEnumArrays(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, ORF__MAX, g_aszEnumArrayFeatureTestNames.GetStoragePointer(), g_afnEnumArrayFeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- enum ETESTTEMPLATES8
- {
- TT8_ONE,
- TT8_TWO,
- };
- enum ETESTTEMPLATES16
- {
- TT16_ONE = 1000,
- TT16_TWO,
- };
- enum ETESTTEMPLATES32
- {
- TT32_ONE = 100000,
- TT32_TWO,
- };
- bool TestTemplates_PrefixIncrement()
- {
- bool bResult = false;
- do
- {
- ETESTTEMPLATES8 t8Test = TT8_ONE;
- ETESTTEMPLATES16 t16Test = TT16_ONE;
- ETESTTEMPLATES32 t32Test = TT32_ONE;
- if (++t8Test != TT8_TWO || t8Test != TT8_TWO)
- {
- break;
- }
- ++t8Test = TT8_ONE;
- if (t8Test != TT8_ONE)
- {
- break;
- }
- if (++t16Test != TT16_TWO || t16Test != TT16_TWO)
- {
- break;
- }
- ++t16Test = TT16_ONE;
- if (t16Test != TT16_ONE)
- {
- break;
- }
- if (++t32Test != TT32_TWO || t32Test != TT32_TWO)
- {
- break;
- }
- ++t32Test = TT32_ONE;
- if (t32Test != TT32_ONE)
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestTemplates_PostfixIncrement()
- {
- bool bResult = false;
- do
- {
- ETESTTEMPLATES8 t8Test = TT8_ONE;
- ETESTTEMPLATES16 t16Test = TT16_ONE;
- ETESTTEMPLATES32 t32Test = TT32_ONE;
- if (t8Test++ != TT8_ONE || t8Test != TT8_TWO)
- {
- break;
- }
- if (t16Test++ != TT16_ONE || t16Test != TT16_TWO)
- {
- break;
- }
- if (t32Test++ != TT32_ONE || t32Test != TT32_TWO)
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestTemplates_PrefixDecrement()
- {
- bool bResult = false;
- do
- {
- ETESTTEMPLATES8 t8Test = TT8_TWO;
- ETESTTEMPLATES16 t16Test = TT16_TWO;
- ETESTTEMPLATES32 t32Test = TT32_TWO;
- if (--t8Test != TT8_ONE || t8Test != TT8_ONE)
- {
- break;
- }
- --t8Test = TT8_TWO;
- if (t8Test != TT8_TWO)
- {
- break;
- }
- if (--t16Test != TT16_ONE || t16Test != TT16_ONE)
- {
- break;
- }
- --t16Test = TT16_TWO;
- if (t16Test != TT16_TWO)
- {
- break;
- }
- if (--t32Test != TT32_ONE || t32Test != TT32_ONE)
- {
- break;
- }
- --t32Test = TT32_TWO;
- if (t32Test != TT32_TWO)
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestTemplates_PostfixDecrement()
- {
- bool bResult = false;
- do
- {
- ETESTTEMPLATES8 t8Test = TT8_TWO;
- ETESTTEMPLATES16 t16Test = TT16_TWO;
- ETESTTEMPLATES32 t32Test = TT32_TWO;
- if (t8Test-- != TT8_TWO || t8Test != TT8_ONE)
- {
- break;
- }
- if (t16Test-- != TT16_TWO || t16Test != TT16_ONE)
- {
- break;
- }
- if (t32Test-- != TT32_TWO || t32Test != TT32_ONE)
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestTemplates_IsEmptySz()
- {
- bool bResult = false;
- do
- {
- const char *szData = "a";
- const char *szEmpty = "";
- const char *szNull = NULL;
- if (IsEmptySz(szData) || !IsEmptySz(szEmpty) || !IsEmptySz(szNull))
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- enum EOUTEMPLATESFEATURE
- {
- OTF__MIN,
- OTF_PREFIXINCREMENT = OTF__MIN,
- OTF_POSTFIXINCREMENT,
- OTF_PREFIXDECREMENT,
- OTF_POSTFIXDECREMENT,
- OTF_ISEMPTYSZ,
- OTF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUTEMPLATESFEATURE, OTF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestTemplates_PrefixIncrement, // OTF_PREFIXINCREMENT,
- &TestTemplates_PostfixIncrement, // OTF_POSTFIXINCREMENT,
- &TestTemplates_PrefixDecrement, // OTF_PREFIXDECREMENT,
- &TestTemplates_PostfixDecrement, // OTF_POSTFIXDECREMENT,
- &TestTemplates_IsEmptySz, // OTF_ISEMPTYSZ,
- };
- static const CEnumUnsortedElementArray<EOUTEMPLATESFEATURE, OTF__MAX, CFeatureTestProcedure> g_afnTemplateFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUTEMPLATESFEATURE, OTF__MAX, const char *>::m_aetElementArray[] =
- {
- "Prefix Increment", // OTF_PREFIXINCREMENT,
- "Postfix Increment", // OTF_POSTFIXINCREMENT,
- "Prefix Decrement", // OTF_PREFIXDECREMENT,
- "Postfix Decrement", // OTF_POSTFIXDECREMENT,
- "IsEmptySz", // OTF_ISEMPTYSZ,
- };
- static const CEnumUnsortedElementArray<EOUTEMPLATESFEATURE, OTF__MAX, const char *> g_aszTemplateFeatureTestNames;
- bool TestTemplates(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OTF__MAX, g_aszTemplateFeatureTestNames.GetStoragePointer(), g_afnTemplateFeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- typedef CTypeSimpleWrapper<int> CTestWrapper;
- bool TestTypeWrappers_Constructors()
- {
- CTestWrapper twEmptyWrapper;
- CTestWrapper twZeroWrapper(0);
- CTestWrapper twCopyWrapper(twZeroWrapper);
- return true;
- }
- bool TestTypeWrappers_Comparison()
- {
- bool bResult = false;
- do
- {
- CTestWrapper twOneWrapper(1);
- CTestWrapper twTwoWrapper(2);
- if (!(twTwoWrapper == twTwoWrapper) || twOneWrapper == twTwoWrapper)
- {
- break;
- }
- if (twTwoWrapper != twTwoWrapper || !(twOneWrapper != twTwoWrapper))
- {
- break;
- }
- if (!(twOneWrapper < twTwoWrapper) || twTwoWrapper < twTwoWrapper || twTwoWrapper < twOneWrapper)
- {
- break;
- }
- if (twOneWrapper > twTwoWrapper || twTwoWrapper > twTwoWrapper || !(twTwoWrapper > twOneWrapper))
- {
- break;
- }
- if (!(twOneWrapper <= twTwoWrapper) || !(twTwoWrapper <= twTwoWrapper) || twTwoWrapper <= twOneWrapper)
- {
- break;
- }
- if (twOneWrapper >= twTwoWrapper || !(twTwoWrapper >= twTwoWrapper) || !(twTwoWrapper >= twOneWrapper))
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestTypeWrappers_BoolCasts()
- {
- bool bResult = false;
- do
- {
- CTestWrapper twZeroWrapper(0);
- CTestWrapper twOneWrapper(1);
- /* -- cast to bool is commented in definition
- if (twZeroWrapper || !(false || twOneWrapper))
- {
- break;
- }
- */
- if (!(!twZeroWrapper) || !twOneWrapper)
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestTypeWrappers_Assignment()
- {
- bool bResult = false;
- do
- {
- CTestWrapper twZeroWrapper(0);
- CTestWrapper twOneWrapper(1);
- CTestWrapper twTestWrapper;
- CTestWrapper &twFirstAssignmentReference = (twTestWrapper = (CTestWrapper::value_type)1);
- if (twTestWrapper != twOneWrapper || &twFirstAssignmentReference != &twTestWrapper)
- {
- break;
- }
- CTestWrapper &twSecondAssignmentReference = (twTestWrapper = twZeroWrapper);
- if (twTestWrapper != twZeroWrapper || &twSecondAssignmentReference != &twTestWrapper)
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestTypeWrappers_DataCast()
- {
- bool bResult = false;
- do
- {
- const CTestWrapper twZeroWrapper(0);
- CTestWrapper twOneWrapper(1);
- const CTestWrapper::value_type &wtZeroValue = (const CTestWrapper::value_type &)twZeroWrapper;
- CTestWrapper::value_type &wtOneValue = (CTestWrapper::value_type &)twOneWrapper;
- if (wtZeroValue != 0 || wtOneValue != 1)
- {
- break;
- }
- wtOneValue = 0;
- if (twOneWrapper != twZeroWrapper)
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestTypeWrappers_DataComparison()
- {
- bool bResult = false;
- do
- {
- const CTestWrapper twZeroWrapper(0);
- const CTestWrapper twOneWrapper(1);
- const CTestWrapper::value_type &wtZeroValue = twZeroWrapper;
- const CTestWrapper::value_type &wtOneValue = twOneWrapper;
- if (!(twZeroWrapper == wtZeroValue) || (twZeroWrapper == wtOneValue))
- {
- break;
- }
- if (!(wtZeroValue == twZeroWrapper) || (wtOneValue == twZeroWrapper))
- {
- break;
- }
- if ((twZeroWrapper != wtZeroValue) || !(twZeroWrapper != wtOneValue))
- {
- break;
- }
- if ((wtZeroValue != twZeroWrapper) || !(wtOneValue != twZeroWrapper))
- {
- break;
- }
- if ((twZeroWrapper < wtZeroValue) || !(twZeroWrapper < wtOneValue) || (twOneWrapper < wtZeroValue))
- {
- break;
- }
- if ((wtZeroValue < twZeroWrapper) || (wtOneValue < twZeroWrapper) || !(wtZeroValue < twOneWrapper))
- {
- break;
- }
- if ((twZeroWrapper > wtZeroValue) || (twZeroWrapper > wtOneValue) || !(twOneWrapper > wtZeroValue))
- {
- break;
- }
- if ((wtZeroValue > twZeroWrapper) || !(wtOneValue > twZeroWrapper) || (wtZeroValue > twOneWrapper))
- {
- break;
- }
- if (!(twZeroWrapper <= wtZeroValue) || !(twZeroWrapper <= wtOneValue) || (twOneWrapper <= wtZeroValue))
- {
- break;
- }
- if (!(wtZeroValue <= twZeroWrapper) || (wtOneValue <= twZeroWrapper) || !(wtZeroValue <= twOneWrapper))
- {
- break;
- }
- if (!(twZeroWrapper >= wtZeroValue) || (twZeroWrapper >= wtOneValue) || !(twOneWrapper >= wtZeroValue))
- {
- break;
- }
- if (!(wtZeroValue >= twZeroWrapper) || !(wtOneValue >= twZeroWrapper) || (wtZeroValue >= twOneWrapper))
- {
- break;
- }
- bResult = true;
- }
- while (false);
- return bResult;
- }
- enum EOUTYPEWRAPPERFEATURE
- {
- OWF__MIN,
- OWF_CONSTRUCTORS = OWF__MIN,
- OWF_COMPARISON,
- OWF_BOOLCASTS,
- OWF_ASSIGNMENT,
- OWF_DATACAST,
- OWF_DATACOMPARISON,
- OWF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUTYPEWRAPPERFEATURE, OWF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestTypeWrappers_Constructors, // OWF_CONSTRUCTORS,
- &TestTypeWrappers_Comparison, // OWF_COMPARISON,
- &TestTypeWrappers_BoolCasts, // OWF_BOOLCASTS,
- &TestTypeWrappers_Assignment, // OWF_ASSIGNMENT,
- &TestTypeWrappers_DataCast, // OWF_DATACAST,
- &TestTypeWrappers_DataComparison, // OWF_DATACOMPARISON,
- };
- static const CEnumUnsortedElementArray<EOUTYPEWRAPPERFEATURE, OWF__MAX, CFeatureTestProcedure> g_afnTypeWrapperFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUTYPEWRAPPERFEATURE, OWF__MAX, const char *>::m_aetElementArray[] =
- {
- "Constructors", // OWF_CONSTRUCTORS,
- "Comparison Operators", // OWF_COMPARISON,
- "Boolean Casts", // OWF_BOOLCASTS,
- "Assignment Operators", // OWF_ASSIGNMENT,
- "Data Cast", // OWF_DATACAST,
- "Data Comparisons", // OWF_DATACOMPARISON,
- };
- static const CEnumUnsortedElementArray<EOUTYPEWRAPPERFEATURE, OWF__MAX, const char *> g_aszTypeWrapperFeatureTestNames;
- bool TestTypeWrapper(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OWF__MAX, g_aszTypeWrapperFeatureTestNames.GetStoragePointer(), g_afnTypeWrapperFeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- struct CTestCustomizations_Asserts_FailureInfo
- {
- EASSERTIONFAILURESEVERITY m_fsFailureSeverity;
- const char *m_szAssertionExpression;
- const char *m_szAssertionFileName;
- unsigned int m_uiAssertionSourceLine;
- };
- static const CTestCustomizations_Asserts_FailureInfo g_fiAssertInvalidInfo = { AFS__MAX, NULL, NULL, 0 };
- static CTestCustomizations_Asserts_FailureInfo g_fiAssertLastInfo;
- void _OU_CONVENTION_CALLBACK TestCustomizations_Asserts_AssertionFailure(EASSERTIONFAILURESEVERITY fsFailureSeverity,
- const char *szAssertionExpression, const char *szAssertionFileName, unsigned int uiAssertionSourceLine)
- {
- g_fiAssertLastInfo.m_fsFailureSeverity = fsFailureSeverity;
- g_fiAssertLastInfo.m_szAssertionExpression = szAssertionExpression;
- g_fiAssertLastInfo.m_szAssertionFileName = szAssertionFileName;
- g_fiAssertLastInfo.m_uiAssertionSourceLine = uiAssertionSourceLine;
- }
- bool TestCustomizations_Asserts()
- {
- bool bResult = false;
- CAssertionFailedProcedure fnAssertOldHandler = CAssertionCheckCustomization::GetAssertFailureCustomHandler();
- CAssertionCheckCustomization::CustomizeAssertionChecks(&TestCustomizations_Asserts_AssertionFailure);
- do
- {
- #if !defined(NDEBUG)
- // Only callback invocation is checked here.
- // Availability of functionality depending on preprocessor defines
- // is verified in OST_ASSERT subsystem.
- OU_ASSERT(false); // const unsigned int uiAssertToVerifyLines = 14; -- see further in code
- if (g_fiAssertLastInfo.m_fsFailureSeverity != AFS_ASSERT
- || g_fiAssertLastInfo.m_szAssertionExpression == NULL
- || g_fiAssertLastInfo.m_szAssertionFileName == NULL
- || strcmp(g_fiAssertLastInfo.m_szAssertionFileName, __FILE__) != 0
- || g_fiAssertLastInfo.m_uiAssertionSourceLine == 0)
- {
- break;
- }
- CTestCustomizations_Asserts_FailureInfo fiAssertFailureInfoSave = g_fiAssertLastInfo;
- g_fiAssertLastInfo = g_fiAssertInvalidInfo;
- OU_VERIFY(false); const unsigned int uiAssertToVerifyLines = 14;
- if (g_fiAssertLastInfo.m_fsFailureSeverity != AFS_ASSERT
- || g_fiAssertLastInfo.m_szAssertionExpression == NULL
- || strcmp(g_fiAssertLastInfo.m_szAssertionExpression, fiAssertFailureInfoSave.m_szAssertionExpression) != 0
- || g_fiAssertLastInfo.m_szAssertionFileName == NULL
- || strcmp(g_fiAssertLastInfo.m_szAssertionFileName, __FILE__) != 0
- || g_fiAssertLastInfo.m_uiAssertionSourceLine != fiAssertFailureInfoSave.m_uiAssertionSourceLine + uiAssertToVerifyLines)
- {
- break;
- }
- g_fiAssertLastInfo = g_fiAssertInvalidInfo;
- #endif // #if !defined(NDEBUG)
- /* -- can't verify OU_CHECK() as it crashes the application on failure
- OU_CHECK(false);
- if (g_fiAssertLastInfo.m_fsFailureSeverity != AFS_CHECK
- || g_fiAssertLastInfo.m_szAssertionExpression == NULL
- || g_fiAssertLastInfo.m_szAssertionFileName == NULL
- || strcmp(g_fiAssertLastInfo.m_szAssertionFileName, __FILE__) != 0
- || g_fiAssertLastInfo.m_uiAssertionSourceLine == 0)
- {
- break;
- }
- */
- bResult = true;
- }
- while (false);
- CAssertionCheckCustomization::CustomizeAssertionChecks(fnAssertOldHandler);
- return bResult;
- }
- void *const g_pv_MallocResult = (void *)(size_t)0x12345678;
- bool g_bMallocInvocation = false, g_bReallocInvocation = false;
- bool g_bFreeInvocation = false, g_bFreeSuccess = false;
- void *_OU_CONVENTION_CALLBACK TestCustomizations_MemMgr_Alloc(size_t nBlockSize)
- {
- g_bMallocInvocation = true;
- return (void *)((ptrdiff_t)g_pv_MallocResult + nBlockSize);
- }
- void *_OU_CONVENTION_CALLBACK TestCustomizations_MemMgr_Realloc(void *pv_OldBlock, size_t nBlockNewSize)
- {
- g_bReallocInvocation = true;
- return (void *)((ptrdiff_t)pv_OldBlock - nBlockNewSize);
- }
- void _OU_CONVENTION_CALLBACK TestCustomizations_MemMgr_Free(void *pv_OldBlock)
- {
- g_bFreeInvocation = true;
- g_bFreeSuccess = pv_OldBlock == g_pv_MallocResult;
- }
- bool TestCustomizations_MemMgr()
- {
- bool bResult = false;
- CMemoryAllocationProcedure fnAllocationOldProcedure = CMemoryManagerCustomization::GetMemoryAllocationCustomProcedure();
- CMemoryReallocationProcedure fnReallocationOldProcedure = CMemoryManagerCustomization::GetMemoryReallocationCustomProcedure();
- CMemoryDeallocationProcedure fnDeallocationOldProcedure = CMemoryManagerCustomization::GetMemoryDeallocationCustomProcedure();
- CMemoryManagerCustomization::CustomizeMemoryManager(&TestCustomizations_MemMgr_Alloc, &TestCustomizations_MemMgr_Realloc, &TestCustomizations_MemMgr_Free);
- do
- {
- const size_t nBlockSize = 0x1000;
- void *pv_BlockAllocated = AllocateMemoryBlock(nBlockSize);
- if (!g_bMallocInvocation
- || pv_BlockAllocated != (void *)((size_t)g_pv_MallocResult + nBlockSize))
- {
- break;
- }
- void *pv_BlockReallocated = ReallocateMemoryBlock(pv_BlockAllocated, 2 * nBlockSize);
- if (!g_bReallocInvocation
- || pv_BlockReallocated != (void *)((size_t)g_pv_MallocResult - nBlockSize))
- {
- break;
- }
- FreeMemoryBlock(g_pv_MallocResult);
- if (!g_bFreeInvocation || !g_bFreeSuccess)
- {
- break;
- }
- bResult = true;
- }
- while (false);
- CMemoryManagerCustomization::CustomizeMemoryManager(fnAllocationOldProcedure, fnReallocationOldProcedure, fnDeallocationOldProcedure);
- return bResult;
- }
- enum EOUCUSTOMIZATIONFEATURE
- {
- OCF__MIN,
-
- OCF_ASSERTS = OCF__MIN,
- OCF_MEMMGR,
-
- OCF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUCUSTOMIZATIONFEATURE, OCF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestCustomizations_Asserts, // OCF_ASSERTS,
- &TestCustomizations_MemMgr, // OCF_MEMMGR,
- };
- static const CEnumUnsortedElementArray<EOUCUSTOMIZATIONFEATURE, OCF__MAX, CFeatureTestProcedure> g_afnCustomizationFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUCUSTOMIZATIONFEATURE, OCF__MAX, const char *>::m_aetElementArray[] =
- {
- "Asserts", // OCF_ASSERTS,
- "Memory Manager", // OCF_MEMMGR,
- };
- static const CEnumUnsortedElementArray<EOUCUSTOMIZATIONFEATURE, OCF__MAX, const char *> g_aszCustomizationFeatureTestNames;
- bool TestCustomization(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OCF__MAX, g_aszCustomizationFeatureTestNames.GetStoragePointer(), g_afnCustomizationFeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- static const size_t g_nTestMallocBlockInitialSize = 1001;
- static const size_t g_nTestMallocBlockNextSize = 65501;
- static const uint8ou g_uiTestMallocToken = 0xAA;
- static void *g_pv_MemoryBlock = NULL;
- bool TestMallocs_Allocate()
- {
- bool bResult = false;
- do
- {
- g_pv_MemoryBlock = AllocateMemoryBlock(g_nTestMallocBlockInitialSize);
- if (g_pv_MemoryBlock == NULL || OU_ALIGNED_SIZE((size_t)g_pv_MemoryBlock, _OU_MEMORY_REQUIRED_ALIGNMENT) != (size_t)g_pv_MemoryBlock)
- {
- break;
- }
- *((uint8ou *)g_pv_MemoryBlock + g_nTestMallocBlockInitialSize - 1) = g_uiTestMallocToken;
-
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestMallocs_Reallocate()
- {
- OU_ASSERT(g_nTestMallocBlockNextSize > g_nTestMallocBlockInitialSize);
- bool bResult = false;
- do
- {
- void *pv_OldMemoryBlock = g_pv_MemoryBlock;
- g_pv_MemoryBlock = ReallocateMemoryBlock(pv_OldMemoryBlock, g_nTestMallocBlockNextSize);
- if (g_pv_MemoryBlock == NULL || OU_ALIGNED_SIZE((size_t)g_pv_MemoryBlock, _OU_MEMORY_REQUIRED_ALIGNMENT) != (size_t)g_pv_MemoryBlock)
- {
- break;
- }
- if (*((uint8ou *)g_pv_MemoryBlock + g_nTestMallocBlockInitialSize - 1) != g_uiTestMallocToken)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
- return bResult;
- }
- bool TestMallocs_Deallocate()
- {
- FreeMemoryBlock(g_pv_MemoryBlock);
- FreeMemoryBlock(NULL); // Free must survive NULL-pointer
- return true;
- }
- enum EOUMALLOCFEATURE
- {
- OLF__MIN,
-
- OLF_ALLOCATE = OLF__MIN,
- OLF_REALLOCATE,
- OLF_DEALLOCATE,
-
- OLF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUMALLOCFEATURE, OLF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestMallocs_Allocate, // OLF_ALLOCATE,
- &TestMallocs_Reallocate, // OLF_REALLOCATE,
- &TestMallocs_Deallocate, // OLF_DEALLOCATE,
- };
- static const CEnumUnsortedElementArray<EOUMALLOCFEATURE, OLF__MAX, CFeatureTestProcedure> g_afnMallocFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUMALLOCFEATURE, OLF__MAX, const char *>::m_aetElementArray[] =
- {
- "AllocateMemoryBlock", // OLF_ALLOCATE,
- "ReallocateMemoryBlock", // OLF_REALLOCATE,
- "FreeMemoryBlock", // OLF_DEALLOCATE,
- };
- static const CEnumUnsortedElementArray<EOUMALLOCFEATURE, OLF__MAX, const char *> g_aszMallocFeatureTestNames;
- bool TestMalloc(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OLF__MAX, g_aszMallocFeatureTestNames.GetStoragePointer(), g_afnMallocFeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- bool TestAsserts_FalseFunction(bool &bVarInvocation)
- {
- bool bResult = true;
- bVarInvocation = !bVarInvocation;
- bool *pv_Pointer = &bResult;
- if (pv_Pointer)
- {
- bResult = false;
- }
- return bResult;
- }
- bool TestAsserts_TrueFunction(bool &bVarInvocation)
- {
- bool bResult = false;
- bVarInvocation = !bVarInvocation;
-
- bool *pv_Pointer = &bResult;
- if (pv_Pointer)
- {
- bResult = true;
- }
-
- return bResult;
- }
- bool TestAsserts_Assert()
- {
- bool bNDebugInvocation = false, bOrdinaryInvocation = false;
- #if defined(NDEBUG)
-
- OU_ASSERT(TestAsserts_FalseFunction(bNDebugInvocation));
- bOrdinaryInvocation = true;
- #endif // #if defined(NDEBUG)
-
- OU_ASSERT(TestAsserts_TrueFunction(bOrdinaryInvocation));
- return !bNDebugInvocation && bOrdinaryInvocation;
- }
- bool TestAsserts_Verify()
- {
- bool bNDebugInvocation = false, bOrdinaryInvocation = false;
-
- #if defined(NDEBUG)
-
- OU_VERIFY(TestAsserts_FalseFunction(bNDebugInvocation));
-
- #else // #if !defined(NDEBUG)
- bNDebugInvocation = true;
- #endif // #if !defined(NDEBUG)
-
- OU_VERIFY(TestAsserts_TrueFunction(bOrdinaryInvocation));
-
- return bNDebugInvocation && bOrdinaryInvocation;
- }
- bool TestAsserts_Check()
- {
- bool bOrdinaryInvocation = false;
-
- OU_CHECK(TestAsserts_TrueFunction(bOrdinaryInvocation));
-
- return bOrdinaryInvocation;
- }
- enum EOUASSERTFEATURE
- {
- OEF__MIN,
-
- OEF_ASSERT = OEF__MIN,
- OEF_VERIFY,
- OEF_CHECK,
-
- OEF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUASSERTFEATURE, OEF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestAsserts_Assert, // OEF_ASSERT,
- &TestAsserts_Verify, // OEF_VERIFY,
- &TestAsserts_Check, // OEF_CHECK,
-
- };
- static const CEnumUnsortedElementArray<EOUASSERTFEATURE, OEF__MAX, CFeatureTestProcedure> g_afnAssertFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUASSERTFEATURE, OEF__MAX, const char *>::m_aetElementArray[] =
- {
- "OU_ASSERT", // OEF_ASSERT,
- "OU_VERIFY", // OEF_VERIFY,
- "OU_CHECK", // OEF_CHECK,
- };
- static const CEnumUnsortedElementArray<EOUASSERTFEATURE, OEF__MAX, const char *> g_aszAssertFeatureTestNames;
- bool TestAssert(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OEF__MAX, g_aszAssertFeatureTestNames.GetStoragePointer(), g_afnAssertFeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- struct CTestIntTypes_int8
- {
- int8ou m_iPad;
- int8ou m_iValue;
- };
- bool TestIntTypes_Int8()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(int8ou) != 1 || offsetof(CTestIntTypes_int8, m_iValue) != 1)
- {
- break;
- }
- if (OU_INT8_BITS != sizeof(int8ou) * OU_BITS_IN_BYTE )
- {
- break;
- }
- if ((int8ou)OU_INT8_MIN == 0 || (int8ou)(OU_INT8_MIN << 1) != 0)
- {
- break;
- }
- if (~OU_INT8_MIN != OU_INT8_MAX || ~OU_INT8_MAX != OU_INT8_MIN)
- {
- break;
- }
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- struct CTestIntTypes_uint8
- {
- int8ou m_iPad;
- uint8ou m_iValue;
- };
- bool TestIntTypes_UInt8()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(uint8ou) != 1 || offsetof(CTestIntTypes_uint8, m_iValue) != 1)
- {
- break;
- }
- if (OU_UINT8_BITS != sizeof(uint8ou) * OU_BITS_IN_BYTE)
- {
- break;
- }
-
- if (OU_UINT8_MIN != 0)
- {
- break;
- }
- if (!(OU_UINT8_MAX & (uint8ou)1) || (OU_UINT8_MAX >> 1) != (uint8ou)OU_INT8_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- struct CTestIntTypes_int16
- {
- int8ou m_iPad;
- int16ou m_iValue;
- };
- bool TestIntTypes_Int16()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(int16ou) != 2 || offsetof(CTestIntTypes_int16, m_iValue) != 2)
- {
- break;
- }
-
- if (OU_INT16_BITS != sizeof(int16ou) * OU_BITS_IN_BYTE )
- {
- break;
- }
-
- if ((int16ou)OU_INT16_MIN == 0 || (int16ou)(OU_INT16_MIN << 1) != 0)
- {
- break;
- }
-
- if (~OU_INT16_MIN != OU_INT16_MAX || ~OU_INT16_MAX != OU_INT16_MIN)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- struct CTestIntTypes_uint16
- {
- int8ou m_iPad;
- uint16ou m_iValue;
- };
- bool TestIntTypes_UInt16()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(uint16ou) != 2 || offsetof(CTestIntTypes_uint16, m_iValue) != 2)
- {
- break;
- }
-
- if (OU_UINT16_BITS != sizeof(uint16ou) * OU_BITS_IN_BYTE)
- {
- break;
- }
-
- if (OU_UINT16_MIN != 0)
- {
- break;
- }
-
- if (!(OU_UINT16_MAX & (uint16ou)1) || (OU_UINT16_MAX >> 1) != (uint16ou)OU_INT16_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- struct CTestIntTypes_int32
- {
- int8ou m_iPad;
- int32ou m_iValue;
- };
- bool TestIntTypes_Int32()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(int32ou) != 4 || offsetof(CTestIntTypes_int32, m_iValue) != 4)
- {
- break;
- }
-
- if (OU_INT32_BITS != sizeof(int32ou) * OU_BITS_IN_BYTE )
- {
- break;
- }
-
- if ((int32ou)OU_INT32_MIN == 0 || (int32ou)(OU_INT32_MIN << 1) != 0)
- {
- break;
- }
-
- if (~OU_INT32_MIN != OU_INT32_MAX || ~OU_INT32_MAX != OU_INT32_MIN)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- struct CTestIntTypes_uint32
- {
- int8ou m_iPad;
- uint32ou m_iValue;
- };
- bool TestIntTypes_UInt32()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(uint32ou) != 4 || offsetof(CTestIntTypes_uint32, m_iValue) != 4)
- {
- break;
- }
-
- if (OU_UINT32_BITS != sizeof(uint32ou) * OU_BITS_IN_BYTE)
- {
- break;
- }
-
- if (OU_UINT32_MIN != 0)
- {
- break;
- }
-
- if (!(OU_UINT32_MAX & (uint32ou)1) || (OU_UINT32_MAX >> 1) != (uint32ou)OU_INT32_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- struct CTestIntTypes_int64
- {
- int8ou m_iPad;
- int64ou m_iValue;
- };
- bool TestIntTypes_Int64()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(int64ou) != 8)
- {
- break;
- }
-
- #if _OU_TARGET_ARCH == _OU_TARGET_ARCH_X86 && _OU_TARGET_OS != _OU_TARGET_OS_MAC
-
- if (offsetof(CTestIntTypes_int64, m_iValue) != 8)
- {
- break;
- }
- #endif
- if (OU_INT64_BITS != sizeof(int64ou) * OU_BITS_IN_BYTE )
- {
- break;
- }
-
- if ((int64ou)OU_INT64_MIN == 0 || (int64ou)(OU_INT64_MIN << 1) != 0)
- {
- break;
- }
-
- if (~OU_INT64_MIN != OU_INT64_MAX || ~OU_INT64_MAX != OU_INT64_MIN)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- struct CTestIntTypes_uint64
- {
- int8ou m_iPad;
- uint64ou m_iValue;
- };
- bool TestIntTypes_UInt64()
- {
- bool bResult = false;
-
- do
- {
- if (sizeof(uint64ou) != 8)
- {
- break;
- }
-
- #if _OU_TARGET_ARCH == _OU_TARGET_ARCH_X86 && _OU_TARGET_OS != _OU_TARGET_OS_MAC
-
- if (offsetof(CTestIntTypes_uint64, m_iValue) != 8)
- {
- break;
- }
- #endif
- if (OU_UINT64_BITS != sizeof(uint64ou) * OU_BITS_IN_BYTE)
- {
- break;
- }
-
- if (OU_UINT64_MIN != 0)
- {
- break;
- }
-
- if (!(OU_UINT64_MAX & (uint64ou)1) || (OU_UINT64_MAX >> 1) != (uint64ou)OU_INT64_MAX)
- {
- break;
- }
-
- bResult = true;
- }
- while (false);
-
- return bResult;
- }
- enum EOUINTTYPEFEATURE
- {
- OIF__MIN,
-
- OIF_INT8 = OIF__MIN,
- OIF_UINT8,
- OIF_INT16,
- OIF_UINT16,
- OIF_INT32,
- OIF_UINT32,
- OIF_INT64,
- OIF_UINT64,
-
- OIF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUINTTYPEFEATURE, OIF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestIntTypes_Int8, // OIF_INT8,
- &TestIntTypes_UInt8, // OIF_UINT8,
- &TestIntTypes_Int16, // OIF_INT16,
- &TestIntTypes_UInt16, // OIF_UINT16,
- &TestIntTypes_Int32, // OIF_INT32,
- &TestIntTypes_UInt32, // OIF_UINT32,
- &TestIntTypes_Int64, // OIF_INT64,
- &TestIntTypes_UInt64, // OIF_UINT64,
- };
- static const CEnumUnsortedElementArray<EOUINTTYPEFEATURE, OIF__MAX, CFeatureTestProcedure> g_afnIntTypeFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUINTTYPEFEATURE, OIF__MAX, const char *>::m_aetElementArray[] =
- {
- "int8ou", // OIF_INT8,
- "uint8ou", // OIF_UINT8,
- "int16ou", // OIF_INT16,
- "uint16ou", // OIF_UINT16,
- "int32ou", // OIF_INT32,
- "uint32ou", // OIF_UINT32,
- "int64ou", // OIF_INT64,
- "uint64ou", // OIF_UINT64,
- };
- static const CEnumUnsortedElementArray<EOUINTTYPEFEATURE, OIF__MAX, const char *> g_aszIntTypeFeatureTestNames;
- bool TestIntTypes(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OIF__MAX, g_aszIntTypeFeatureTestNames.GetStoragePointer(), g_afnIntTypeFeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- struct CTestMacros_OffsetStruct
- {
- int8ou m_i8a;
- int16ou m_i16a;
- int32ou m_i32a;
- int64ou m_i64;
- int32ou m_i32b;
- int16ou m_i16b;
- int8ou m_i8b;
- };
- bool TestMacros_OffsetOf()
- {
- size_t sOffset_i8a = offsetof(CTestMacros_OffsetStruct, m_i8a);
- size_t sOffset_i16a = offsetof(CTestMacros_OffsetStruct, m_i16a);
- size_t sOffset_i32a = offsetof(CTestMacros_OffsetStruct, m_i32a);
- size_t sOffset_i64 = offsetof(CTestMacros_OffsetStruct, m_i64);
- size_t sOffset_i32b = offsetof(CTestMacros_OffsetStruct, m_i32b);
- size_t sOffset_i16b = offsetof(CTestMacros_OffsetStruct, m_i16b);
- size_t sOffset_i8b = offsetof(CTestMacros_OffsetStruct, m_i8b);
- size_t sStructSize = sizeof(CTestMacros_OffsetStruct);
- return true
- && sOffset_i8a == 0
- && sOffset_i16a == 2
- && sOffset_i32a == 4
- && sOffset_i64 == 8
- && sOffset_i32b == 16
- && sOffset_i16b == 20
- && sOffset_i8b == 22
- && sStructSize == 24;
- }
- bool TestMacros_AlignedSize()
- {
- return true
- && OU_ALIGNED_SIZE(0, sizeof(int8ou)) == 0
- && OU_ALIGNED_SIZE(0, sizeof(int16ou)) == 0
- && OU_ALIGNED_SIZE(0, sizeof(int32ou)) == 0
- && OU_ALIGNED_SIZE(0, sizeof(int64ou)) == 0
- && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int8ou)) == sizeof(int8ou)
- && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int16ou)) == sizeof(int16ou)
- && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int32ou)) == sizeof(int32ou)
- && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int64ou)) == sizeof(int64ou)
- && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int8ou)) == sizeof(int16ou)
- && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int16ou)) == sizeof(int16ou)
- && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int32ou)) == sizeof(int32ou)
- && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int64ou)) == sizeof(int64ou)
- && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int8ou)) == sizeof(int32ou)
- && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int16ou)) == sizeof(int32ou)
- && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int32ou)) == sizeof(int32ou)
- && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int64ou)) == sizeof(int64ou)
- && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int8ou)) == sizeof(int64ou)
- && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int16ou)) == sizeof(int64ou)
- && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int32ou)) == sizeof(int64ou)
- && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int64ou)) == sizeof(int64ou);
- }
- bool TestMacros_ArraySize()
- {
- static int m_ai_Array1[1];
- static int m_aai_Array11[1][1];
- static int m_ai_Array2[2];
- static int m_aai_Array21[2][1];
- static int m_aai_Array12[1][2];
- return true
- && OU_ARRAY_SIZE(m_ai_Array1) == 1
- && OU_ARRAY_SIZE(m_aai_Array11[0]) == 1
- && OU_ARRAY_SIZE(m_aai_Array11) == 1
- && OU_ARRAY_SIZE(m_ai_Array2) == 2
- && OU_ARRAY_SIZE(m_aai_Array21[0]) == 1
- && OU_ARRAY_SIZE(m_aai_Array21) == 2
- && OU_ARRAY_SIZE(m_aai_Array12[0]) == 2
- && OU_ARRAY_SIZE(m_aai_Array12) == 1;
- }
- bool TestMacros_InIntRange()
- {
- char iZero = 0;
- char iOne = 1;
- char iMinusOne = -1;
- unsigned int uiTen = 10;
- unsigned int uiNotZero = ~0U;
- return true
- && !OU_IN_INT_RANGE(iZero, 0, 0)
- && !OU_IN_INT_RANGE(iOne, 0, 0)
- && !OU_IN_INT_RANGE(iMinusOne, 0, 0)
- && !OU_IN_INT_RANGE(uiTen, 0, 0)
- && !OU_IN_INT_RANGE(uiNotZero, 0, 0)
- && OU_IN_INT_RANGE(iZero, 0, 1)
- && !OU_IN_INT_RANGE(iOne, 0, 1)
- && !OU_IN_INT_RANGE(iMinusOne, 0, 1)
- && !OU_IN_INT_RANGE(uiTen, 0, 1)
- && !OU_IN_INT_RANGE(uiNotZero, 0, 1)
- && !OU_IN_INT_RANGE(iZero, 1, 2)
- && OU_IN_INT_RANGE(iOne, 1, 2)
- && !OU_IN_INT_RANGE(iMinusOne, 1, 2)
- && !OU_IN_INT_RANGE(uiTen, 1, 2)
- && !OU_IN_INT_RANGE(uiNotZero, 1, 2)
- && OU_IN_INT_RANGE(iZero, -1, 1)
- && !OU_IN_INT_RANGE(iOne, -1, 1)
- && OU_IN_INT_RANGE(iMinusOne, -1, 1)
- && !OU_IN_INT_RANGE(uiTen, -1, 1)
- && OU_IN_INT_RANGE(uiNotZero, -1, 1)
- && !OU_IN_INT_RANGE(iZero, 1, -1)
- && OU_IN_INT_RANGE(iOne, 1, -1)
- && !OU_IN_INT_RANGE(iMinusOne, 1, -1)
- && OU_IN_INT_RANGE(uiTen, 1, -1)
- && !OU_IN_INT_RANGE(uiNotZero, 1, -1);
- }
- bool TestMacros_InI64Range()
- {
- char iZero = 0;
- char iOne = 1;
- char iMinusOne = -1;
- unsigned int uiTen = 10;
- unsigned int uiNotZero = ~0U;
-
- return true
- && !OU_IN_I64_RANGE(iZero, 0, 0)
- && !OU_IN_I64_RANGE(iOne, 0, 0)
- && !OU_IN_I64_RANGE(iMinusOne, 0, 0)
- && !OU_IN_I64_RANGE(uiTen, 0, 0)
- && !OU_IN_I64_RANGE(uiNotZero, 0, 0)
-
- && OU_IN_I64_RANGE(iZero, 0, 1)
- && !OU_IN_I64_RANGE(iOne, 0, 1)
- && !OU_IN_I64_RANGE(iMinusOne, 0, 1)
- && !OU_IN_I64_RANGE(uiTen, 0, 1)
- && !OU_IN_I64_RANGE(uiNotZero, 0, 1)
-
- && !OU_IN_I64_RANGE(iZero, 1, 2)
- && OU_IN_I64_RANGE(iOne, 1, 2)
- && !OU_IN_I64_RANGE(iMinusOne, 1, 2)
- && !OU_IN_I64_RANGE(uiTen, 1, 2)
- && !OU_IN_I64_RANGE(uiNotZero, 1, 2)
-
- && OU_IN_I64_RANGE(iZero, -1, 1)
- && !OU_IN_I64_RANGE(iOne, -1, 1)
- && OU_IN_I64_RANGE(iMinusOne, -1, 1)
- && !OU_IN_I64_RANGE(uiTen, -1, 1)
- && !OU_IN_I64_RANGE(uiNotZero, -1, 1)
-
- && !OU_IN_I64_RANGE(iZero, 1, -1)
- && OU_IN_I64_RANGE(iOne, 1, -1)
- && !OU_IN_I64_RANGE(iMinusOne, 1, -1)
- && OU_IN_I64_RANGE(uiTen, 1, -1)
- && OU_IN_I64_RANGE(uiNotZero, 1, -1);
- }
- bool TestMacros_InSizetRange()
- {
- char iZero = 0;
- char iOne = 1;
- char iMinusOne = -1;
- unsigned int uiTen = 10;
- unsigned int uiNotZero = ~0U;
-
- return true
- && !OU_IN_SIZET_RANGE(iZero, 0, 0)
- && !OU_IN_SIZET_RANGE(iOne, 0, 0)
- && !OU_IN_SIZET_RANGE(iMinusOne, 0, 0)
- && !OU_IN_SIZET_RANGE(uiTen, 0, 0)
- && !OU_IN_SIZET_RANGE(uiNotZero, 0, 0)
-
- && OU_IN_SIZET_RANGE(iZero, 0, 1)
- && !OU_IN_SIZET_RANGE(iOne, 0, 1)
- && !OU_IN_SIZET_RANGE(iMinusOne, 0, 1)
- && !OU_IN_SIZET_RANGE(uiTen, 0, 1)
- && !OU_IN_SIZET_RANGE(uiNotZero, 0, 1)
-
- && !OU_IN_SIZET_RANGE(iZero, 1, 2)
- && OU_IN_SIZET_RANGE(iOne, 1, 2)
- && !OU_IN_SIZET_RANGE(iMinusOne, 1, 2)
- && !OU_IN_SIZET_RANGE(uiTen, 1, 2)
- && !OU_IN_SIZET_RANGE(uiNotZero, 1, 2)
-
- && OU_IN_SIZET_RANGE(iZero, -1, 1)
- && !OU_IN_SIZET_RANGE(iOne, -1, 1)
- && OU_IN_SIZET_RANGE(iMinusOne, -1, 1)
- && !OU_IN_SIZET_RANGE(uiTen, -1, 1)
- && OU_IN_SIZET_RANGE(uiNotZero, -1, 1) == (sizeof(size_t) == sizeof(unsigned int))
-
- && !OU_IN_SIZET_RANGE(iZero, 1, -1)
- && OU_IN_SIZET_RANGE(iOne, 1, -1)
- && !OU_IN_SIZET_RANGE(iMinusOne, 1, -1)
- && OU_IN_SIZET_RANGE(uiTen, 1, -1)
- && OU_IN_SIZET_RANGE(uiNotZero, 1, -1) != (sizeof(size_t) == sizeof(unsigned int));
- }
- enum EOUMACROFEATURE
- {
- OMF__MIN,
- OMF_OFFSETOF = OMF__MIN,
- OMF_ALIGNEDSIZE,
- OMF_ARRAYSIZE,
- OMF_ININTRANGE,
- OMF_INI64RANGE,
- OMF_INSIZETRANGE,
- OMF__MAX,
- };
- template<>
- CFeatureTestProcedure const CEnumUnsortedElementArray<EOUMACROFEATURE, OMF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
- {
- &TestMacros_OffsetOf, // OMF_OFFSETOF,
- &TestMacros_AlignedSize, // OMF_ALIGNEDSIZE,
- &TestMacros_ArraySize, // OMF_ARRAYSIZE,
- &TestMacros_InIntRange, // OMF_ININTRANGE,
- &TestMacros_InI64Range, // OMF_INI64RANGE,
- &TestMacros_InSizetRange, // OMF_INSIZETRANGE,
- };
- static const CEnumUnsortedElementArray<EOUMACROFEATURE, OMF__MAX, CFeatureTestProcedure> g_afnMacroFeatureTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUMACROFEATURE, OMF__MAX, const char *>::m_aetElementArray[] =
- {
- "offsetof", // OMF_OFFSETOF,
- "OU_ALIGNED_SIZE", // OMF_ALIGNEDSIZE,
- "OU_ARRAY_SIZE", // OMF_ARRAYSIZE,
- "OU_IN_INT_RANGE", // OMF_ININTRANGE,
- "OU_IN_I64_RANGE", // OMF_INI64RANGE,
- "OU_IN_SIZET_RANGE", // OMF_INSIZETRANGE,
- };
- static const CEnumUnsortedElementArray<EOUMACROFEATURE, OMF__MAX, const char *> g_aszMacroFeatureTestNames;
- bool TestMacros(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- return TestSubsystem(nOutSuccessCount, nOutTestCount, OMF__MAX, g_aszMacroFeatureTestNames.GetStoragePointer(), g_afnMacroFeatureTestProcedures.GetStoragePointer());
- }
- //////////////////////////////////////////////////////////////////////////
- // Verifies that target order is not changed
- template<>
- int const CEnumSortedElementArray<int, _OU_TARGET_OS__MAX - 1, int, 100>::m_aetElementArray[] =
- {
- _OU_TARGET_OS_GENUNIX, // _OU_TARGET_OS_GENUNIX
- _OU_TARGET_OS_WINDOWS, // _OU_TARGET_OS_WINDOWS
- _OU_TARGET_OS_QNX, // _OU_TARGET_OS_QNX
- _OU_TARGET_OS_MAC, // _OU_TARGET_OS_MAC
- _OU_TARGET_OS_AIX, // _OU_TARGET_OS_AIX
- _OU_TARGET_OS_SUNOS, // _OU_TARGET_OS_SUNOS
- _OU_TARGET_OS_IOS, // _OU_TARGET_OS_IOS
- };
- static const CEnumSortedElementArray<int, _OU_TARGET_OS__MAX - 1, int, 100> g_ai_TargetOrderCheck;
- template<>
- const char *const CEnumUnsortedElementArray<int, _OU_TARGET_OS__MAX - 1, const char *, 100>::m_aetElementArray[] =
- {
- "GENERIC UNIX", // _OU_TARGET_OS_GENUNIX
- "WINDOWS", // _OU_TARGET_OS_WINDOWS
- "QNX", // _OU_TARGET_OS_QNX
- "MAC", // _OU_TARGET_OS_MAC
- "AIX", // _OU_TARGET_OS_AIX
- "SunOS", // _OU_TARGET_OS_SUNOS
- "iOS", // _OU_TARGET_OS_IOS
- };
- static const CEnumUnsortedElementArray<int, _OU_TARGET_OS__MAX - 1, const char *, 100> g_aszOSNames;
- // Verifies that bits order is not changed
- template<>
- int const CEnumSortedElementArray<int, _OU_TARGET_BITS__MAX - 1, int, 101>::m_aetElementArray[] =
- {
- _OU_TARGET_BITS_32, // _OU_TARGET_BITS_32
- _OU_TARGET_BITS_64, // _OU_TARGET_BITS_64
- };
- static const CEnumSortedElementArray<int, _OU_TARGET_BITS__MAX - 1, int, 101> g_ai_BitsOrderCheck;
- template<>
- const char *const CEnumUnsortedElementArray<int, _OU_TARGET_BITS__MAX - 1, const char *, 101>::m_aetElementArray[] =
- {
- "32", // _OU_TARGET_BITS_32
- "64", // _OU_TARGET_BITS_64
- };
- static const CEnumUnsortedElementArray<int, _OU_TARGET_BITS__MAX - 1, const char *, 101> g_aszBitsNames;
- // Verifies that architectures order is not changed
- template<>
- int const CEnumSortedElementArray<int, _OU_TARGET_ARCH__MAX - 1, int, 102>::m_aetElementArray[] =
- {
- _OU_TARGET_ARCH_OTHER, // _OU_TARGET_ARCH_OTHER
- _OU_TARGET_ARCH_X86, // _OU_TARGET_ARCH_X86
- _OU_TARGET_ARCH_IA64, // _OU_TARGET_ARCH_IA64
- _OU_TARGET_ARCH_X64, // _OU_TARGET_ARCH_X64
- _OU_TARGET_ARCH_POWERPC, // _OU_TARGET_ARCH_POWERPC
- _OU_TARGET_ARCH_SPARC, // _OU_TARGET_ARCH_SPARC
- _OU_TARGET_ARCH_ARM, // _OU_TARGET_ARCH_ARM
- };
- static const CEnumSortedElementArray<int, _OU_TARGET_ARCH__MAX - 1, int, 102> g_ai_ArchitecturesOrderCheck;
- template<>
- const char *const CEnumUnsortedElementArray<int, _OU_TARGET_ARCH__MAX - 1, const char *, 102>::m_aetElementArray[] =
- {
- "OTHER", // _OU_TARGET_ARCH_OTHER
- "x86", // _OU_TARGET_ARCH_X86
- "Itanium", // _OU_TARGET_ARCH_IA64
- "x64", // _OU_TARGET_ARCH_X64
- "PowerPC", // _OU_TARGET_ARCH_POWERPC
- "Sparc", // _OU_TARGET_ARCH_SPARC
- "ARM", // _OU_TARGET_ARCH_ARM
- };
- static const CEnumUnsortedElementArray<int, _OU_TARGET_ARCH__MAX - 1, const char *, 102> g_aszArchitecturesNames;
- // Verifies that compilers order is not changed
- template<>
- int const CEnumSortedElementArray<int, _OU_COMPILER__MAX - 1, int, 103>::m_aetElementArray[] =
- {
- _OU_COMPILER__OTHER, // _OU_COMPILER__OTHER,
- _OU_COMPILER_GCC, // _OU_COMPILER_GCC,
- _OU_COMPILER_MSVC, // _OU_COMPILER_MSVC,
- };
- static const CEnumSortedElementArray<int, _OU_COMPILER__MAX - 1, int, 103> g_ai_CompilersOrderCheck;
- template<>
- const char *const CEnumUnsortedElementArray<int, _OU_COMPILER__MAX - 1, const char *, 103>::m_aetElementArray[] =
- {
- "UNKNOWN", // _OU_COMPILER__OTHER,
- "GCC", // _OU_COMPILER_GCC,
- "MSVC", // _OU_COMPILER_MSVC,
- };
- static const CEnumUnsortedElementArray<int, _OU_COMPILER__MAX - 1, const char *, 103> g_aszCompilersNames;
- // Verifies that compiler versions order is not changed
- template<>
- int const CEnumSortedElementArray<int, _OU_COMPILER_VERSION__MAX - 1, int, 104>::m_aetElementArray[] =
- {
- _OU_COMPILER_VERSION__OTHER, // _OU_COMPILER_VERSION__OTHER,
- _OU_COMPILER_VERSION_MSVC1998, // _OU_COMPILER_VERSION_MSVC1998,
- _OU_COMPILER_VERSION_GCCLT4, // _OU_COMPILER_VERSION_GCCLT4,
- };
- static const CEnumSortedElementArray<int, _OU_COMPILER_VERSION__MAX - 1, int, 104> g_ai_CompilersVersionOrderCheck;
- template<>
- const char *const CEnumUnsortedElementArray<int, _OU_COMPILER_VERSION__MAX - 1, const char *, 104>::m_aetElementArray[] =
- {
- "OTHER", // _OU_COMPILER_VERSION__OTHER,
- "MSVC1998", // _OU_COMPILER_VERSION_MSVC1998,
- "GCC LESS THAN 4.0", // _OU_COMPILER_VERSION_GCCLT4,
- };
- static const CEnumUnsortedElementArray<int, _OU_COMPILER_VERSION__MAX - 1, const char *, 104> g_aszCompilerVersionNames;
- #define _TESTPLATFORM_DEFINITION_TEXT(Definition) #Definition
- #define TESTPLATFORM_TEFINITION_TEXT(Definition) _TESTPLATFORM_DEFINITION_TEXT(Definition)
- bool TestPlatform(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
- {
- const char *szOSName = g_aszOSNames.Encode(_OU_TARGET_OS - 1);
- const char *szBitsName = g_aszBitsNames.Encode(_OU_TARGET_BITS - 1);
- const char *szArchitectureName = g_aszArchitecturesNames.Encode(_OU_TARGET_ARCH - 1);
- const char *szCompilerName = g_aszCompilersNames.Encode(_OU_COMPILER - 1);
- const char *szCompilerVersion = g_aszCompilerVersionNames.Encode(_OU_COMPILER_VERSION - 1);
-
- printf("Target OS: %s\n", szOSName);
- printf("Target Bits: %s\n", szBitsName);
- printf("Target Architecture %s\n", szArchitectureName);
- printf("Compiler Name: %s\n", szCompilerName);
- printf("Compiler Version: %s\n", szCompilerVersion);
- printf("Method Convention: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_CONVENTION_METHOD));
- printf("Function Convention: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_CONVENTION_API));
- printf("Callback Convention: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_CONVENTION_CALLBACK));
- printf("Alwaysinline definition: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_ALWAYSINLINE));
- printf("Inline definition: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_INLINE));
-
- nOutSuccessCount = 0;
- nOutTestCount = 0;
- return true;
- }
- //////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////
- enum EOUSUBSYSTEMTEST
- {
- OST__MIN,
- OST_INTTYPES = OST__MIN,
- OST_MACROS,
- OST_TEMPLATES,
- OST_TYPEWRAPPER,
- OST_ASSERT,
- OST_MALLOC,
- OST_CUSTOMIZATION,
- OST_ENUMARRAYS,
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- OST_ATOMIC,
- #endif
- OST_FLAGSDEFINES,
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- OST_ATOMICFLAGS,
- #endif
- OST_SIMPLEFLAGS64,
- OST_SIMPLEFLAGS32,
- OST_SIMPLEFLAGS16,
- OST_SIMPLEFLAGS8,
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
- OST_TLS,
- #endif
- OST_PLATFORM,
- OST__MAX,
- };
- typedef bool (*COUSubsystemTestProcedure)(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount);
- template<>
- COUSubsystemTestProcedure const CEnumUnsortedElementArray<EOUSUBSYSTEMTEST, OST__MAX, COUSubsystemTestProcedure>::m_aetElementArray[] =
- {
- &TestIntTypes, // OST_INTTYPES,
- &TestMacros, // OST_MACROS,
- &TestTemplates, // OST_TEMPLATES,
- &TestTypeWrapper, // OST_TYPEWRAPPER,
- &TestAssert, // OST_ASSERT,
- &TestMalloc, // OST_MALLOC,
- &TestCustomization, // OST_CUSTOMIZATION,
- &TestEnumArrays, // OST_ENUMARRAYS,
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- &TestAtomic, // OST_ATOMIC,
- #endif
- &TestFlagsDefines, // OST_FLAGSDEFINES,
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- &TestAtomicFlags, // OST_ATOMICFLAGS,
- #endif
- &TestSimpleFlags64, // OST_SIMPLEFLAGS64,
- &TestSimpleFlags32, // OST_SIMPLEFLAGS32,
- &TestSimpleFlags16, // OST_SIMPLEFLAGS16,
- &TestSimpleFlags8, // OST_SIMPLEFLAGS8,
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
- &TestTLS, // OST_TLS,
- #endif
- &TestPlatform, // OST_PLATFORM,
- };
- static const CEnumUnsortedElementArray<EOUSUBSYSTEMTEST, OST__MAX, COUSubsystemTestProcedure> g_afnOUSubsystemTestProcedures;
- template<>
- const char *const CEnumUnsortedElementArray<EOUSUBSYSTEMTEST, OST__MAX, const char *>::m_aetElementArray[] =
- {
- "IntTypes", // OST_INTTYPES,
- "Macros", // OST_MACROS,
- "Templates", // OST_TEMPLATES,
- "TypeWrapper", // OST_TYPEWRAPPER,
- "Assert", // OST_ASSERT,
- "Malloc", // OST_MALLOC,
- "Customization", // OST_CUSTOMIZATION,
- "EnumArrays", // OST_ENUMARRAYS,
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- "Atomic", // OST_ATOMIC,
- #endif
- "FlagsDefines", // OST_FLAGSDEFINES,
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
- "AtomicFlags", // OST_ATOMICFLAGS,
- #endif
- "SimpleFlags64", // OST_SIMPLEFLAGS64,
- "SimpleFlags32", // OST_SIMPLEFLAGS32,
- "SimpleFlags16", // OST_SIMPLEFLAGS16,
- "SimpleFlags8", // OST_SIMPLEFLAGS8,
- #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
- "TLS", // OST_TLS,
- #endif
- "Platform", // OST_PLATFORM,
- };
- static const CEnumUnsortedElementArray<EOUSUBSYSTEMTEST, OST__MAX, const char *> g_aszOUSubsystemNames;
- bool ProcessOUCoverageTests(unsigned int &nOutFailureCount)
- {
- unsigned int nSuccessCount = 0;
- for (EOUSUBSYSTEMTEST stSubsystemTest = OST__MIN; stSubsystemTest != OST__MAX; ++stSubsystemTest)
- {
- const char *szSubsystemName = g_aszOUSubsystemNames.Encode(stSubsystemTest);
- printf("\nTesting subsystem \"%s\"\n", szSubsystemName);
- printf("---------------------------------------------------\n");
- unsigned int nSubsysytemSuccessCount = 0, nSubsystemTestCount = 1;
- COUSubsystemTestProcedure fnTestProcedure = g_afnOUSubsystemTestProcedures.Encode(stSubsystemTest);
- if (fnTestProcedure(nSubsysytemSuccessCount, nSubsystemTestCount) && nSubsysytemSuccessCount == nSubsystemTestCount)
- {
- nSuccessCount += 1;
- }
- unsigned int nSubsysytemFailureCount = nSubsystemTestCount - nSubsysytemSuccessCount;
- printf("---------------------------------------------------\n");
- printf("Feature tests failed: %3u out of %3u\n", nSubsysytemFailureCount, nSubsystemTestCount);
- }
- unsigned int nFailureCount = OST__MAX - nSuccessCount;
-
- printf("\n===================================================\n");
- printf("Subsystem tests failed: %3u out of %3u\n", nFailureCount, (unsigned int)OST__MAX);
- nOutFailureCount = nFailureCount;
- return nSuccessCount == OST__MAX;
- }
- int main(int argc, char* argv[])
- {
- unsigned int nFailureCount;
- ProcessOUCoverageTests(nFailureCount);
- return nFailureCount;
- }
|