outest.cpp 208 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027
  1. /*************************************************************************
  2. * *
  3. * ODER's Utilities Library. Copyright (C) 2008 Oleh Derevenko. *
  4. * All rights reserved. e-mail: [email protected] (change all "a" to "e") *
  5. * *
  6. * This library is free software; you can redistribute it and/or *
  7. * modify it under the terms of EITHER: *
  8. * (1) The GNU Lesser General Public License as published by the Free *
  9. * Software Foundation; either version 3 of the License, or (at *
  10. * your option) any later version. The text of the GNU Lesser *
  11. * General Public License is included with this library in the *
  12. * file LICENSE-LESSER.TXT. Since LGPL is the extension of GPL *
  13. * the text of GNU General Public License is also provided for *
  14. * your information in file LICENSE.TXT. *
  15. * (2) The BSD-style license that is included with this library in *
  16. * the file LICENSE-BSD.TXT. *
  17. * (3) The zlib/libpng license that is included with this library in *
  18. * the file LICENSE-ZLIB.TXT *
  19. * *
  20. * This library is distributed WITHOUT ANY WARRANTY, including implied *
  21. * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
  22. * See the files LICENSE.TXT and LICENSE-LESSER.TXT or LICENSE-BSD.TXT *
  23. * or LICENSE-ZLIB.TXT for more details. *
  24. * *
  25. *************************************************************************/
  26. #include <ou/features.h>
  27. #include <ou/platform.h>
  28. #if _OU_COMPILER == _OU_COMPILER_MSVC
  29. #pragma warning(disable:4786)
  30. #endif
  31. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
  32. #include <ou/threadlocalstorage.h>
  33. #endif
  34. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  35. #include <ou/atomic.h>
  36. #endif
  37. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  38. #include <ou/atomicflags.h>
  39. #endif
  40. #include <ou/simpleflags.h>
  41. #include <ou/flagsdefines.h>
  42. #include <ou/enumarrays.h>
  43. #include <ou/templates.h>
  44. #include <ou/typewrapper.h>
  45. #include <ou/customization.h>
  46. #include <ou/inttypes.h>
  47. #include <ou/macros.h>
  48. #include <ou/malloc.h>
  49. #include <ou/namespace.h>
  50. using namespace _OU_NAMESPACE;
  51. #include <stdio.h>
  52. #include <string.h>
  53. //////////////////////////////////////////////////////////////////////////
  54. typedef bool (*CFeatureTestProcedure)();
  55. bool TestSubsystem(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount,
  56. const unsigned int uiFeatureMax, const char *const *aszFeatureNames, CFeatureTestProcedure const *afnFeatureTests)
  57. {
  58. unsigned int nSuccessCount = 0;
  59. for (unsigned int uiSubsystemFeature = 0; uiSubsystemFeature != uiFeatureMax; ++uiSubsystemFeature)
  60. {
  61. const char *szFeatureName = aszFeatureNames[uiSubsystemFeature];
  62. printf("Testing %34s: ", szFeatureName);
  63. CFeatureTestProcedure fnTestProcedure = afnFeatureTests[uiSubsystemFeature];
  64. bool bTestResult = fnTestProcedure();
  65. printf("%s\n", bTestResult ? "success" : "*** failure ***");
  66. if (bTestResult)
  67. {
  68. nSuccessCount += 1;
  69. }
  70. }
  71. nOutSuccessCount = nSuccessCount;
  72. nOutTestCount = uiFeatureMax;
  73. return nSuccessCount == uiFeatureMax;
  74. }
  75. //////////////////////////////////////////////////////////////////////////
  76. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
  77. bool g_bTestTLSAPIInitialized = false;
  78. HTLSKEY g_htkTestTLSKey;
  79. enum ETESTTLSVALUES
  80. {
  81. TTV_FIRSTVALUE,
  82. TTV_SECONDVALUE,
  83. TTV__MAX,
  84. };
  85. unsigned int g_uiTestTLSDestructorCallCount = 0;
  86. unsigned int g_uiTestTLSDestructorSuccessCount = 0;
  87. void _OU_CONVENTION_CALLBACK TestTlsSecondValueDestructor(void *pv_Value)
  88. {
  89. g_uiTestTLSDestructorCallCount += 1;
  90. if (pv_Value == (void *)(&TestTlsSecondValueDestructor))
  91. {
  92. g_uiTestTLSDestructorSuccessCount += 1;
  93. }
  94. }
  95. bool TestTls_Initialization()
  96. {
  97. bool bResult = false;
  98. do
  99. {
  100. if (!CTLSInitialization::InitializeTLSAPI(g_htkTestTLSKey, 1, 0))
  101. {
  102. break;
  103. }
  104. CTLSInitialization::FinalizeTLSAPI();
  105. if (!CTLSInitialization::InitializeTLSAPI(g_htkTestTLSKey, TTV__MAX, CTLSInitialization::SIF_MANUAL_CLEANUP_ON_THREAD_EXIT))
  106. {
  107. break;
  108. }
  109. g_bTestTLSAPIInitialized = true;
  110. bResult = true;
  111. }
  112. while (false);
  113. return bResult;
  114. }
  115. bool TestTls_GetSetValue()
  116. {
  117. bool bResult = false;
  118. do
  119. {
  120. tlsvaluetype vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
  121. if (vtFirstValue != 0)
  122. {
  123. break;
  124. }
  125. tlsvaluetype vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
  126. if (vtSecondValue != 0)
  127. {
  128. break;
  129. }
  130. if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE, (tlsvaluetype)&TestTls_GetSetValue))
  131. {
  132. break;
  133. }
  134. if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)&TestTlsSecondValueDestructor, &TestTlsSecondValueDestructor))
  135. {
  136. break;
  137. }
  138. vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
  139. if ((void *)vtFirstValue != &TestTls_GetSetValue)
  140. {
  141. break;
  142. }
  143. vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
  144. if ((void *)vtSecondValue != &TestTlsSecondValueDestructor)
  145. {
  146. break;
  147. }
  148. if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, 0, &TestTlsSecondValueDestructor))
  149. {
  150. break;
  151. }
  152. vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
  153. if (vtSecondValue != 0)
  154. {
  155. break;
  156. }
  157. if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)&TestTlsSecondValueDestructor, &TestTlsSecondValueDestructor))
  158. {
  159. break;
  160. }
  161. if (g_uiTestTLSDestructorCallCount != 0)
  162. {
  163. break;
  164. }
  165. bResult = true;
  166. }
  167. while (false);
  168. return bResult;
  169. }
  170. bool TestTls_UnsafeGetSetValue()
  171. {
  172. bool bResult = false;
  173. do
  174. {
  175. tlsvaluetype vtFirstValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
  176. if ((void *)vtFirstValue != &TestTls_GetSetValue)
  177. {
  178. break;
  179. }
  180. tlsvaluetype vtSecondValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
  181. if ((void *)vtSecondValue != &TestTlsSecondValueDestructor)
  182. {
  183. break;
  184. }
  185. CThreadLocalStorage::UnsafeSetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE, (tlsvaluetype)(size_t)(-1));
  186. CThreadLocalStorage::UnsafeSetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)(size_t)(-1));
  187. vtFirstValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
  188. if ((size_t)vtFirstValue != (size_t)(-1))
  189. {
  190. break;
  191. }
  192. vtSecondValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
  193. if ((size_t)vtSecondValue != (size_t)(-1))
  194. {
  195. break;
  196. }
  197. // Safe function used by intent !!!
  198. vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
  199. if ((size_t)vtFirstValue != (size_t)(-1))
  200. {
  201. break;
  202. }
  203. // Safe function used by intent !!!
  204. vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
  205. if ((size_t)vtSecondValue != (size_t)(-1))
  206. {
  207. break;
  208. }
  209. CThreadLocalStorage::UnsafeSetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)(&TestTlsSecondValueDestructor));
  210. if (g_uiTestTLSDestructorCallCount != 0)
  211. {
  212. break;
  213. }
  214. bResult = true;
  215. }
  216. while (false);
  217. return bResult;
  218. }
  219. bool TestTls_CleanupDestructor()
  220. {
  221. bool bResult = false;
  222. do
  223. {
  224. CTLSInitialization::CleanupOnThreadExit();
  225. if (g_uiTestTLSDestructorCallCount != 1 || g_uiTestTLSDestructorSuccessCount != 1)
  226. {
  227. break;
  228. }
  229. tlsvaluetype vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE);
  230. if (vtFirstValue != 0)
  231. {
  232. break;
  233. }
  234. // Safe function used by intent !!!
  235. tlsvaluetype vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE);
  236. if (vtSecondValue != 0)
  237. {
  238. break;
  239. }
  240. g_uiTestTLSDestructorCallCount = 0;
  241. g_uiTestTLSDestructorSuccessCount = 0;
  242. CTLSInitialization::CleanupOnThreadExit();
  243. if (g_uiTestTLSDestructorCallCount != 0)
  244. {
  245. break;
  246. }
  247. if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, 0, &TestTlsSecondValueDestructor))
  248. {
  249. break;
  250. }
  251. CTLSInitialization::CleanupOnThreadExit();
  252. if (g_uiTestTLSDestructorCallCount != 0)
  253. {
  254. break;
  255. }
  256. if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)(size_t)(-1), &TestTlsSecondValueDestructor))
  257. {
  258. break;
  259. }
  260. if (g_uiTestTLSDestructorCallCount != 0)
  261. {
  262. break;
  263. }
  264. bResult = true;
  265. }
  266. while (false);
  267. return bResult;
  268. }
  269. bool TestTls_Finalization()
  270. {
  271. OU_ASSERT(g_bTestTLSAPIInitialized);
  272. bool bResult = false;
  273. do
  274. {
  275. CTLSInitialization::FinalizeTLSAPI();
  276. g_bTestTLSAPIInitialized = false;
  277. if (g_uiTestTLSDestructorCallCount != 1 || g_uiTestTLSDestructorSuccessCount != 0)
  278. {
  279. break;
  280. }
  281. bResult = true;
  282. }
  283. while (false);
  284. return bResult;
  285. }
  286. enum EOUTLSFEATURE
  287. {
  288. OHF__MIN,
  289. OHF_INITIALIZATION = OHF__MIN,
  290. OHF_GETSETVALUE,
  291. OHF_UNSAFEGETSETVALUE,
  292. OHF_CLEANUPDESTRUCTOR,
  293. OHF_FINALIZATION,
  294. OHF__MAX,
  295. };
  296. template<>
  297. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUTLSFEATURE, OHF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  298. {
  299. &TestTls_Initialization, // OHF_INITIALIZATION
  300. &TestTls_GetSetValue, // OHF_GETSETVALUE,
  301. &TestTls_UnsafeGetSetValue, // OHF_UNSAFEGETSETVALUE,
  302. &TestTls_CleanupDestructor, // OHF_CLEANUPDESTRUCTOR,
  303. &TestTls_Finalization, // OHF_FINALIZATION,
  304. };
  305. static const CEnumUnsortedElementArray<EOUTLSFEATURE, OHF__MAX, CFeatureTestProcedure> g_afnTlsFeatureTestProcedures;
  306. template<>
  307. const char *const CEnumUnsortedElementArray<EOUTLSFEATURE, OHF__MAX, const char *>::m_aetElementArray[] =
  308. {
  309. "API Initialization", // OHF_INITIALIZATION
  310. "Get.../SetStorageValue", // OHF_GETSETVALUE,
  311. "UnsafeGet.../UnsafeSetStorageValue", // OHF_UNSAFEGETSETVALUE,
  312. "Storage Cleanup/Value Destructors", // OHF_CLEANUPDESTRUCTOR,
  313. "API Finalization", // OHF_FINALIZATION,
  314. };
  315. static const CEnumUnsortedElementArray<EOUTLSFEATURE, OHF__MAX, const char *> g_aszTlsFeatureTestNames;
  316. bool TestTLS(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  317. {
  318. bool bResult = TestSubsystem(nOutSuccessCount, nOutTestCount, OHF__MAX, g_aszTlsFeatureTestNames.GetStoragePointer(), g_afnTlsFeatureTestProcedures.GetStoragePointer());
  319. if (g_bTestTLSAPIInitialized)
  320. {
  321. CTLSInitialization::FinalizeTLSAPI();
  322. }
  323. return bResult;
  324. }
  325. #endif // #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
  326. //////////////////////////////////////////////////////////////////////////
  327. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  328. bool TestAtomic_Increment()
  329. {
  330. bool bResult = false;
  331. do
  332. {
  333. volatile atomicord32 aoStorage = (atomicord32)(-1);
  334. // Putting function inside of conditional operator causes
  335. // incorrect code generation by GCC 4.0.1 on MacOS X Leopard 64 bit.
  336. atomicord32 aoIncrementFirstResult = AtomicIncrement(&aoStorage);
  337. if (aoIncrementFirstResult != 0 || aoStorage != (atomicord32)0)
  338. {
  339. break;
  340. }
  341. if (AtomicIncrement(&aoStorage) != (atomicord32)1 || aoStorage != (atomicord32)1)
  342. {
  343. break;
  344. }
  345. bResult = true;
  346. }
  347. while (false);
  348. return bResult;
  349. }
  350. bool TestAtomic_Decrement()
  351. {
  352. bool bResult = false;
  353. do
  354. {
  355. volatile atomicord32 aoStorage = (atomicord32)1;
  356. // Putting function inside of conditional operator causes
  357. // incorrect code generation by GCC 4.0.1 on MacOS X Leopard 64 bit.
  358. atomicord32 aoDecrementFirstResult = AtomicDecrement(&aoStorage);
  359. if (aoDecrementFirstResult != (atomicord32)0 || aoStorage != (atomicord32)0)
  360. {
  361. break;
  362. }
  363. if (AtomicDecrement(&aoStorage) != (atomicord32)(-1) || aoStorage != (atomicord32)(-1))
  364. {
  365. break;
  366. }
  367. bResult = true;
  368. }
  369. while (false);
  370. return bResult;
  371. }
  372. bool TestAtomic_IncrementNoResult()
  373. {
  374. bool bResult = false;
  375. do
  376. {
  377. volatile atomicord32 aoStorage = (atomicord32)(-1);
  378. AtomicIncrementNoResult(&aoStorage);
  379. if (aoStorage != (atomicord32)0)
  380. {
  381. break;
  382. }
  383. AtomicIncrementNoResult(&aoStorage);
  384. if (aoStorage != (atomicord32)1)
  385. {
  386. break;
  387. }
  388. bResult = true;
  389. }
  390. while (false);
  391. return bResult;
  392. }
  393. bool TestAtomic_DecrementNoResult()
  394. {
  395. bool bResult = false;
  396. do
  397. {
  398. volatile atomicord32 aoStorage = (atomicord32)1;
  399. AtomicDecrementNoResult(&aoStorage);
  400. if (aoStorage != (atomicord32)0)
  401. {
  402. break;
  403. }
  404. AtomicDecrementNoResult(&aoStorage);
  405. if (aoStorage != (atomicord32)(-1))
  406. {
  407. break;
  408. }
  409. bResult = true;
  410. }
  411. while (false);
  412. return bResult;
  413. }
  414. bool TestAtomic_Exchange()
  415. {
  416. bool bResult = false;
  417. do
  418. {
  419. volatile atomicord32 aoStorage = 0;
  420. if (AtomicExchange(&aoStorage, (atomicord32)1) != 0 || aoStorage != (atomicord32)1)
  421. {
  422. break;
  423. }
  424. if (AtomicExchange(&aoStorage, (atomicord32)(-1)) != (atomicord32)1 || aoStorage != (atomicord32)(-1))
  425. {
  426. break;
  427. }
  428. if (AtomicExchange(&aoStorage, 0) != (atomicord32)(-1) || aoStorage != 0)
  429. {
  430. break;
  431. }
  432. if (AtomicExchange(&aoStorage, 0) != 0 || aoStorage != 0)
  433. {
  434. break;
  435. }
  436. bResult = true;
  437. }
  438. while (false);
  439. return bResult;
  440. }
  441. bool TestAtomic_ExchangeAdd()
  442. {
  443. bool bResult = false;
  444. do
  445. {
  446. volatile atomicord32 aoStorage = 0;
  447. if (AtomicExchangeAdd(&aoStorage, (atomicord32)1) != 0 || aoStorage != (atomicord32)1)
  448. {
  449. break;
  450. }
  451. if (AtomicExchangeAdd(&aoStorage, (atomicord32)(-2)) != 1 || aoStorage != (atomicord32)(-1))
  452. {
  453. break;
  454. }
  455. if (AtomicExchangeAdd(&aoStorage, (atomicord32)1) != (atomicord32)(-1) || aoStorage != 0)
  456. {
  457. break;
  458. }
  459. bResult = true;
  460. }
  461. while (false);
  462. return bResult;
  463. }
  464. bool TestAtomic_ExchangeAddNoResult()
  465. {
  466. bool bResult = false;
  467. do
  468. {
  469. volatile atomicord32 aoStorage = 0;
  470. AtomicExchangeAddNoResult(&aoStorage, (atomicord32)1);
  471. if (aoStorage != (atomicord32)1)
  472. {
  473. break;
  474. }
  475. AtomicExchangeAddNoResult(&aoStorage, (atomicord32)(-2));
  476. if (aoStorage != (atomicord32)(-1))
  477. {
  478. break;
  479. }
  480. AtomicExchangeAddNoResult(&aoStorage, (atomicord32)1);
  481. if (aoStorage != 0)
  482. {
  483. break;
  484. }
  485. bResult = true;
  486. }
  487. while (false);
  488. return bResult;
  489. }
  490. bool TestAtomic_CompareExchange()
  491. {
  492. bool bResult = false;
  493. do
  494. {
  495. volatile atomicord32 aoStorage = 0;
  496. if (AtomicCompareExchange(&aoStorage, 1, 1) || aoStorage != 0)
  497. {
  498. break;
  499. }
  500. if (!AtomicCompareExchange(&aoStorage, 0, 1) || aoStorage != 1)
  501. {
  502. break;
  503. }
  504. if (!AtomicCompareExchange(&aoStorage, 1, 1) || aoStorage != 1)
  505. {
  506. break;
  507. }
  508. if (!AtomicCompareExchange(&aoStorage, 1, (atomicord32)(-1)) || aoStorage != (atomicord32)(-1))
  509. {
  510. break;
  511. }
  512. if (AtomicCompareExchange(&aoStorage, 1, (atomicord32)(-1)) || aoStorage != (atomicord32)(-1))
  513. {
  514. break;
  515. }
  516. bResult = true;
  517. }
  518. while (false);
  519. return bResult;
  520. }
  521. const atomicord32 g_aoBitmask = (atomicord32)(OU_INT32_MIN + 1);
  522. bool TestAtomic_And()
  523. {
  524. bool bResult = false;
  525. do
  526. {
  527. volatile atomicord32 aoStorage = (atomicord32)OU_UINT32_MAX;
  528. if (AtomicAnd(&aoStorage, g_aoBitmask) != (atomicord32)OU_UINT32_MAX || aoStorage != g_aoBitmask)
  529. {
  530. break;
  531. }
  532. if (AtomicAnd(&aoStorage, 0) != g_aoBitmask || aoStorage != 0)
  533. {
  534. break;
  535. }
  536. bResult = true;
  537. }
  538. while (false);
  539. return bResult;
  540. }
  541. bool TestAtomic_Or()
  542. {
  543. bool bResult = false;
  544. do
  545. {
  546. volatile atomicord32 aoStorage = 0;
  547. if (AtomicOr(&aoStorage, g_aoBitmask) != 0 || aoStorage != g_aoBitmask)
  548. {
  549. break;
  550. }
  551. if (AtomicOr(&aoStorage, (atomicord32)OU_UINT32_MAX) != g_aoBitmask || aoStorage != (atomicord32)OU_UINT32_MAX)
  552. {
  553. break;
  554. }
  555. bResult = true;
  556. }
  557. while (false);
  558. return bResult;
  559. }
  560. bool TestAtomic_Xor()
  561. {
  562. bool bResult = false;
  563. do
  564. {
  565. volatile atomicord32 aoStorage = 0;
  566. if (AtomicXor(&aoStorage, g_aoBitmask) != 0 || aoStorage != g_aoBitmask)
  567. {
  568. break;
  569. }
  570. if (AtomicXor(&aoStorage, (atomicord32)OU_UINT32_MAX) != g_aoBitmask || aoStorage != (atomicord32)(OU_UINT32_MAX ^ g_aoBitmask))
  571. {
  572. break;
  573. }
  574. bResult = true;
  575. }
  576. while (false);
  577. return bResult;
  578. }
  579. bool TestAtomic_AndNoResult()
  580. {
  581. bool bResult = false;
  582. do
  583. {
  584. volatile atomicord32 aoStorage = (atomicord32)OU_UINT32_MAX;
  585. AtomicAndNoResult(&aoStorage, g_aoBitmask);
  586. if (aoStorage != g_aoBitmask)
  587. {
  588. break;
  589. }
  590. AtomicAndNoResult(&aoStorage, 0);
  591. if (aoStorage != 0)
  592. {
  593. break;
  594. }
  595. bResult = true;
  596. }
  597. while (false);
  598. return bResult;
  599. }
  600. bool TestAtomic_OrNoResult()
  601. {
  602. bool bResult = false;
  603. do
  604. {
  605. volatile atomicord32 aoStorage = 0;
  606. AtomicOrNoResult(&aoStorage, g_aoBitmask);
  607. if (aoStorage != g_aoBitmask)
  608. {
  609. break;
  610. }
  611. AtomicOrNoResult(&aoStorage, (atomicord32)OU_UINT32_MAX);
  612. if (aoStorage != (atomicord32)OU_UINT32_MAX)
  613. {
  614. break;
  615. }
  616. bResult = true;
  617. }
  618. while (false);
  619. return bResult;
  620. }
  621. bool TestAtomic_XorNoResult()
  622. {
  623. bool bResult = false;
  624. do
  625. {
  626. volatile atomicord32 aoStorage = 0;
  627. AtomicXorNoResult(&aoStorage, g_aoBitmask);
  628. if (aoStorage != g_aoBitmask)
  629. {
  630. break;
  631. }
  632. AtomicXorNoResult(&aoStorage, (atomicord32)OU_UINT32_MAX);
  633. if (aoStorage != (atomicord32)(OU_UINT32_MAX ^ g_aoBitmask))
  634. {
  635. break;
  636. }
  637. bResult = true;
  638. }
  639. while (false);
  640. return bResult;
  641. }
  642. bool TestAtomic_ExchangePointer()
  643. {
  644. bool bResult = false;
  645. do
  646. {
  647. volatile atomicptr apStorage = NULL;
  648. if (AtomicExchangePointer(&apStorage, (atomicptr)(&TestAtomic_ExchangePointer)) != NULL || apStorage != (atomicptr)(&TestAtomic_ExchangePointer))
  649. {
  650. break;
  651. }
  652. if (AtomicExchangePointer(&apStorage, (atomicptr)(&apStorage)) != (atomicptr)(&TestAtomic_ExchangePointer) || apStorage != (atomicptr)(&apStorage))
  653. {
  654. break;
  655. }
  656. if (AtomicExchangePointer(&apStorage, NULL) != (atomicptr)(&apStorage) || apStorage != NULL)
  657. {
  658. break;
  659. }
  660. bResult = true;
  661. }
  662. while (false);
  663. return bResult;
  664. }
  665. bool TestAtomic_CompareExchangePointer()
  666. {
  667. bool bResult = false;
  668. do
  669. {
  670. volatile atomicptr apStorage = NULL;
  671. if (AtomicCompareExchangePointer(&apStorage, (atomicptr)(&TestAtomic_CompareExchangePointer), (atomicptr)(&TestAtomic_CompareExchangePointer)) || apStorage != NULL)
  672. {
  673. break;
  674. }
  675. if (!AtomicCompareExchangePointer(&apStorage, NULL, (atomicptr)(&TestAtomic_CompareExchangePointer)) || apStorage != (atomicptr)(&TestAtomic_CompareExchangePointer))
  676. {
  677. break;
  678. }
  679. if (!AtomicCompareExchangePointer(&apStorage, (atomicptr)(&TestAtomic_CompareExchangePointer), (atomicptr)(&apStorage)) || apStorage != (atomicptr)(&apStorage))
  680. {
  681. break;
  682. }
  683. if (!AtomicCompareExchangePointer(&apStorage, (atomicptr)(&apStorage), (atomicptr)(&apStorage)) || apStorage != (atomicptr)(&apStorage))
  684. {
  685. break;
  686. }
  687. if (AtomicCompareExchangePointer(&apStorage, NULL, NULL) || apStorage != (atomicptr)(&apStorage))
  688. {
  689. break;
  690. }
  691. if (!AtomicCompareExchangePointer(&apStorage, (atomicptr)(&apStorage), NULL) || apStorage != NULL)
  692. {
  693. break;
  694. }
  695. bResult = true;
  696. }
  697. while (false);
  698. return bResult;
  699. }
  700. enum EOUATOMICFEATURE
  701. {
  702. OOF__MIN,
  703. OOF_INCREMENT = OOF__MIN,
  704. OOF_DECREMENT,
  705. OOF_INCREMENTNORESULT,
  706. OOF_DECREMENTNORESULT,
  707. OOF_EXCHANGE,
  708. OOF_EXCHANGEADD,
  709. OOF_EXCHANGEADDNORESULT,
  710. OOF_COMPAREEXCHANGE,
  711. OOF_AND,
  712. OOF_OR,
  713. OOF_XOR,
  714. OOF_ANDNORESULT,
  715. OOF_ORNORESULT,
  716. OOF_XORNORESULT,
  717. OOF_EXCHANGEPOINTER,
  718. OOF_COMPAREEXCHANGEPOINTER,
  719. OOF__MAX,
  720. };
  721. template<>
  722. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUATOMICFEATURE, OOF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  723. {
  724. &TestAtomic_Increment, // OOF_INCREMENT,
  725. &TestAtomic_Decrement, // OOF_DECREMENT,
  726. &TestAtomic_IncrementNoResult, // OOF_INCREMENTNORESULT,
  727. &TestAtomic_DecrementNoResult, // OOF_DECREMENTNORESULT,
  728. &TestAtomic_Exchange, // OOF_EXCHANGE,
  729. &TestAtomic_ExchangeAdd, // OOF_EXCHANGEADD,
  730. &TestAtomic_ExchangeAddNoResult, // OOF_EXCHANGEADDNORESULT,
  731. &TestAtomic_CompareExchange, // OOF_COMPAREEXCHANGE,
  732. &TestAtomic_And, // OOF_AND,
  733. &TestAtomic_Or, // OOF_OR,
  734. &TestAtomic_Xor, // OOF_XOR,
  735. &TestAtomic_AndNoResult, // OOF_ANDNORESULT,
  736. &TestAtomic_OrNoResult, // OOF_ORNORESULT,
  737. &TestAtomic_XorNoResult, // OOF_XORNORESULT,
  738. &TestAtomic_ExchangePointer, // OOF_EXCHANGEPOINTER,
  739. &TestAtomic_CompareExchangePointer, // OOF_COMPAREEXCHANGEPOINTER,
  740. };
  741. static const CEnumUnsortedElementArray<EOUATOMICFEATURE, OOF__MAX, CFeatureTestProcedure> g_afnAtomicFeatureTestProcedures;
  742. template<>
  743. const char *const CEnumUnsortedElementArray<EOUATOMICFEATURE, OOF__MAX, const char *>::m_aetElementArray[] =
  744. {
  745. "AtomicIncrement", // OOF_INCREMENT,
  746. "AtomicDecrement", // OOF_DECREMENT,
  747. "AtomicIncrementNoResult", // OOF_INCREMENTNORESULT,
  748. "AtomicDecrementNoResult", // OOF_DECREMENTNORESULT,
  749. "AtomicExchange", // OOF_EXCHANGE,
  750. "AtomicExchangeAdd", // OOF_EXCHANGEADD,
  751. "AtomicExchangeAddNoResult", // OOF_EXCHANGEADDNORESULT,
  752. "AtomicCompareExchange", // OOF_COMPAREEXCHANGE,
  753. "AtomicAnd", // OOF_AND,
  754. "AtomicOr", // OOF_OR,
  755. "AtomicXor", // OOF_XOR,
  756. "AtomicAndNoResult", // OOF_ANDNORESULT,
  757. "AtomicOrNoResult", // OOF_ORNORESULT,
  758. "AtomicXorNoResult", // OOF_XORNORESULT,
  759. "AtomicExchangePointer", // OOF_EXCHANGEPOINTER,
  760. "AtomicCompareExchangePointer", // OOF_COMPAREEXCHANGEPOINTER,
  761. };
  762. static const CEnumUnsortedElementArray<EOUATOMICFEATURE, OOF__MAX, const char *> g_aszAtomicFeatureTestNames;
  763. bool TestAtomic(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  764. {
  765. bool bResult = false;
  766. nOutSuccessCount = 0;
  767. nOutTestCount = OOF__MAX;
  768. bool bAPIInitialized = false;
  769. do
  770. {
  771. if (!InitializeAtomicAPI())
  772. {
  773. break;
  774. }
  775. bAPIInitialized = true;
  776. if (!TestSubsystem(nOutSuccessCount, nOutTestCount, OOF__MAX, g_aszAtomicFeatureTestNames.GetStoragePointer(), g_afnAtomicFeatureTestProcedures.GetStoragePointer()))
  777. {
  778. break;
  779. }
  780. bResult = true;
  781. }
  782. while (false);
  783. if (bAPIInitialized)
  784. {
  785. FinalizeAtomicAPI();
  786. }
  787. return bResult;
  788. }
  789. #endif // #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  790. //////////////////////////////////////////////////////////////////////////
  791. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  792. const atomicord32 g_aoTestValue32 = (atomicord32)0xA5A5A5A5;
  793. const atomicord32 g_aoTestMask32 = (atomicord32)0xC6C6C6C6;
  794. const atomicord32 g_aoTestBit32 = (atomicord32)OU_INT32_MIN;
  795. const atomicord32 g_aoTestAnotherBit32 = (atomicord32)((uint32ou)OU_INT32_MIN >> 1);
  796. bool TestAtomicFlags_Constructors()
  797. {
  798. bool bResult = false;
  799. do
  800. {
  801. if (sizeof(CAtomicFlags::value_type) != sizeof(atomicord32))
  802. {
  803. break;
  804. }
  805. CAtomicFlags afEmptyFlags;
  806. if (afEmptyFlags.QueryFlagsAllValues())
  807. {
  808. break;
  809. }
  810. CAtomicFlags afFullFlags(OU_UINT32_MAX);
  811. if (afFullFlags.QueryFlagsAllValues() != (atomicord32)OU_UINT32_MAX)
  812. {
  813. break;
  814. }
  815. CAtomicFlags afCopyOfFullFlags(afFullFlags);
  816. if (afCopyOfFullFlags.QueryFlagsAllValues() != (atomicord32)OU_UINT32_MAX)
  817. {
  818. break;
  819. }
  820. bResult = true;
  821. }
  822. while (false);
  823. return bResult;
  824. }
  825. bool TestAtomicFlags_AssignFlagsAllValues()
  826. {
  827. bool bResult = false;
  828. do
  829. {
  830. CAtomicFlags afTestFlags;
  831. afTestFlags.AssignFlagsAllValues(OU_UINT32_MAX);
  832. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_UINT32_MAX)
  833. {
  834. break;
  835. }
  836. afTestFlags.AssignFlagsAllValues(0);
  837. if (afTestFlags.QueryFlagsAllValues() != 0)
  838. {
  839. break;
  840. }
  841. bResult = true;
  842. }
  843. while (false);
  844. return bResult;
  845. }
  846. bool TestAtomicFlags_QueryFlagsAllValues()
  847. {
  848. bool bResult = false;
  849. do
  850. {
  851. CAtomicFlags afTestFlags(g_aoTestValue32);
  852. if (afTestFlags.QueryFlagsAllValues() != g_aoTestValue32)
  853. {
  854. break;
  855. }
  856. // Double check to be sure ;-)
  857. if (afTestFlags.QueryFlagsAllValues() != g_aoTestValue32)
  858. {
  859. break;
  860. }
  861. bResult = true;
  862. }
  863. while (false);
  864. return bResult;
  865. }
  866. bool TestAtomicFlags_SetFlagsMaskValue()
  867. {
  868. bool bResult = false;
  869. do
  870. {
  871. CAtomicFlags afTestFlags(g_aoTestValue32);
  872. afTestFlags.SetFlagsMaskValue(g_aoTestMask32, true);
  873. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 | g_aoTestMask32))
  874. {
  875. break;
  876. }
  877. afTestFlags.SetFlagsMaskValue(g_aoTestValue32, false);
  878. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(~g_aoTestValue32 & g_aoTestMask32))
  879. {
  880. break;
  881. }
  882. bResult = true;
  883. }
  884. while (false);
  885. return bResult;
  886. }
  887. bool TestAtomicFlags_SignalFlagsMaskValue()
  888. {
  889. bool bResult = false;
  890. do
  891. {
  892. CAtomicFlags afTestFlags(g_aoTestValue32);
  893. afTestFlags.SignalFlagsMaskValue(g_aoTestMask32);
  894. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 | g_aoTestMask32))
  895. {
  896. break;
  897. }
  898. bResult = true;
  899. }
  900. while (false);
  901. return bResult;
  902. }
  903. bool TestAtomicFlags_DropFlagsMaskValue()
  904. {
  905. bool bResult = false;
  906. do
  907. {
  908. CAtomicFlags afTestFlags(g_aoTestValue32);
  909. afTestFlags.DropFlagsMaskValue(g_aoTestMask32);
  910. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 & ~g_aoTestMask32))
  911. {
  912. break;
  913. }
  914. bResult = true;
  915. }
  916. while (false);
  917. return bResult;
  918. }
  919. bool TestAtomicFlags_ToggleSingleFlagValue()
  920. {
  921. bool bResult = false;
  922. do
  923. {
  924. CAtomicFlags afTestFlags(g_aoTestValue32);
  925. bool bPreviousValue = afTestFlags.ToggleSingleFlagValue(g_aoTestBit32);
  926. if (bPreviousValue != ((g_aoTestValue32 & g_aoTestBit32) != 0) || afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 ^ g_aoTestBit32))
  927. {
  928. break;
  929. }
  930. bool bAnotherPreviousValue = afTestFlags.ToggleSingleFlagValue(g_aoTestBit32);
  931. if (bAnotherPreviousValue == bPreviousValue || afTestFlags.QueryFlagsAllValues() != g_aoTestValue32)
  932. {
  933. break;
  934. }
  935. bResult = true;
  936. }
  937. while (false);
  938. return bResult;
  939. }
  940. bool TestAtomicFlags_ModifySingleFlagValue()
  941. {
  942. bool bResult = false;
  943. do
  944. {
  945. CAtomicFlags afTestFlags(g_aoTestValue32);
  946. bool bFirstModification = afTestFlags.ModifySingleFlagValue(g_aoTestBit32, true);
  947. if (bFirstModification != ((g_aoTestValue32 & g_aoTestBit32) != g_aoTestBit32) || afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 | g_aoTestBit32))
  948. {
  949. break;
  950. }
  951. bool bAnotherModification = afTestFlags.ModifySingleFlagValue(g_aoTestBit32, bFirstModification);
  952. if (bAnotherModification == bFirstModification || afTestFlags.QueryFlagsAllValues() != (bFirstModification ? (atomicord32)(g_aoTestValue32 | g_aoTestBit32) : (atomicord32)(g_aoTestValue32 & ~g_aoTestBit32)))
  953. {
  954. break;
  955. }
  956. bool bYetAnotherModification = afTestFlags.ModifySingleFlagValue(g_aoTestBit32, bAnotherModification);
  957. if (bYetAnotherModification != bAnotherModification || afTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (atomicord32)(g_aoTestValue32 | g_aoTestBit32) : (atomicord32)(g_aoTestValue32 & ~g_aoTestBit32)))
  958. {
  959. break;
  960. }
  961. bResult = true;
  962. }
  963. while (false);
  964. return bResult;
  965. }
  966. bool TestAtomicFlags_AssignFlagsByMask()
  967. {
  968. bool bResult = false;
  969. do
  970. {
  971. CAtomicFlags afTestFlags(g_aoTestValue32);
  972. atomicord32 aoPreviousFlags = afTestFlags.AssignFlagsByMask(g_aoTestMask32, g_aoTestMask32);
  973. const atomicord32 aoNewFlags = (g_aoTestValue32 & ~g_aoTestMask32) | g_aoTestMask32;
  974. if (aoPreviousFlags != g_aoTestValue32 || afTestFlags.QueryFlagsAllValues() != aoNewFlags)
  975. {
  976. break;
  977. }
  978. atomicord32 aoAnotherPreviousFlags = afTestFlags.AssignFlagsByMask(g_aoTestValue32, 0);
  979. const atomicord32 aoAnotherNewFlags = aoNewFlags & ~g_aoTestValue32;
  980. if (aoAnotherPreviousFlags != aoNewFlags || afTestFlags.QueryFlagsAllValues() != aoAnotherNewFlags)
  981. {
  982. break;
  983. }
  984. atomicord32 aoYetAnotherPreviousFlags = afTestFlags.AssignFlagsByMask(g_aoTestMask32, g_aoTestMask32 & g_aoTestValue32);
  985. OU_ASSERT((g_aoTestMask32 & g_aoTestValue32) != 0); // Test degeneration
  986. const atomicord32 aoYetAnotherNewFlags = (aoAnotherNewFlags & ~g_aoTestMask32) | (g_aoTestMask32 & g_aoTestValue32);
  987. OU_ASSERT(aoYetAnotherNewFlags != (atomicord32)OU_UINT32_MAX); // Test degeneration
  988. if (aoYetAnotherPreviousFlags != aoAnotherNewFlags || afTestFlags.QueryFlagsAllValues() != aoYetAnotherNewFlags)
  989. {
  990. break;
  991. }
  992. bResult = true;
  993. }
  994. while (false);
  995. return bResult;
  996. }
  997. bool TestAtomicFlags_AlterFlagsByMask()
  998. {
  999. bool bResult = false;
  1000. do
  1001. {
  1002. CAtomicFlags afTestFlags(g_aoTestValue32);
  1003. bool bWasModification = afTestFlags.AlterFlagsByMask(g_aoTestMask32, g_aoTestMask32);
  1004. const atomicord32 aoNewFlags = (g_aoTestValue32 & ~g_aoTestMask32) | g_aoTestMask32;
  1005. if (bWasModification != ((g_aoTestValue32 & g_aoTestMask32) != g_aoTestMask32) || afTestFlags.QueryFlagsAllValues() != aoNewFlags)
  1006. {
  1007. break;
  1008. }
  1009. bool bWasAnotherModification = afTestFlags.AlterFlagsByMask(g_aoTestValue32, 0);
  1010. const atomicord32 aoAnotherNewFlags = aoNewFlags & ~g_aoTestValue32;
  1011. if (bWasAnotherModification != ((aoNewFlags & g_aoTestValue32) != 0) || afTestFlags.QueryFlagsAllValues() != aoAnotherNewFlags)
  1012. {
  1013. break;
  1014. }
  1015. bool bWasAnotherModificationRepeated = afTestFlags.AlterFlagsByMask(g_aoTestValue32, 0);
  1016. if (bWasAnotherModificationRepeated || afTestFlags.QueryFlagsAllValues() != aoAnotherNewFlags)
  1017. {
  1018. break;
  1019. }
  1020. bool bWasYetAnotherModification = afTestFlags.AlterFlagsByMask(g_aoTestMask32, g_aoTestMask32 & g_aoTestValue32);
  1021. OU_ASSERT((g_aoTestMask32 & g_aoTestValue32) != 0); // Test degeneration
  1022. const atomicord32 aoYetAnotherNewFlags = (aoAnotherNewFlags & ~g_aoTestMask32) | (g_aoTestMask32 & g_aoTestValue32);
  1023. OU_ASSERT(aoYetAnotherNewFlags != (atomicord32)OU_UINT32_MAX); // Test degeneration
  1024. if (bWasYetAnotherModification != ((aoAnotherNewFlags & g_aoTestMask32) != (g_aoTestMask32 & g_aoTestValue32)) || afTestFlags.QueryFlagsAllValues() != aoYetAnotherNewFlags)
  1025. {
  1026. break;
  1027. }
  1028. bResult = true;
  1029. }
  1030. while (false);
  1031. return bResult;
  1032. }
  1033. bool TestAtomicFlags_GetFlagsMaskValue()
  1034. {
  1035. bool bResult = false;
  1036. do
  1037. {
  1038. CAtomicFlags afTestFlags(g_aoTestValue32);
  1039. if (afTestFlags.GetFlagsMaskValue(g_aoTestMask32) != ((g_aoTestValue32 & g_aoTestMask32) != 0))
  1040. {
  1041. break;
  1042. }
  1043. if (afTestFlags.GetFlagsMaskValue(~g_aoTestValue32))
  1044. {
  1045. break;
  1046. }
  1047. if (!afTestFlags.GetFlagsMaskValue(OU_UINT32_MAX))
  1048. {
  1049. break;
  1050. }
  1051. bResult = true;
  1052. }
  1053. while (false);
  1054. return bResult;
  1055. }
  1056. bool TestAtomicFlags_QueryFlagsByMask()
  1057. {
  1058. bool bResult = false;
  1059. do
  1060. {
  1061. CAtomicFlags afTestFlags(g_aoTestValue32);
  1062. if (afTestFlags.QueryFlagsByMask(g_aoTestMask32) != (atomicord32)(g_aoTestValue32 & g_aoTestMask32))
  1063. {
  1064. break;
  1065. }
  1066. if (afTestFlags.QueryFlagsByMask(0))
  1067. {
  1068. break;
  1069. }
  1070. if (afTestFlags.QueryFlagsByMask(OU_UINT32_MAX) != g_aoTestValue32)
  1071. {
  1072. break;
  1073. }
  1074. bResult = true;
  1075. }
  1076. while (false);
  1077. return bResult;
  1078. }
  1079. bool TestAtomicFlags_OnlySignalSingleFlagOutOfMask()
  1080. {
  1081. bool bResult = false;
  1082. do
  1083. {
  1084. CAtomicFlags afTestFlags(g_aoTestValue32);
  1085. OU_ASSERT(g_aoTestValue32 != 0); // Test degeneration
  1086. if (afTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_aoTestBit32))
  1087. {
  1088. break;
  1089. }
  1090. if (afTestFlags.QueryFlagsAllValues() != g_aoTestValue32)
  1091. {
  1092. break;
  1093. }
  1094. afTestFlags.AssignFlagsAllValues(0);
  1095. if (!afTestFlags.OnlySignalSingleFlagOutOfMask(g_aoTestBit32, g_aoTestBit32))
  1096. {
  1097. break;
  1098. }
  1099. if (afTestFlags.QueryFlagsAllValues() != g_aoTestBit32)
  1100. {
  1101. break;
  1102. }
  1103. if (afTestFlags.OnlySignalSingleFlagOutOfMask(g_aoTestBit32, g_aoTestBit32))
  1104. {
  1105. break;
  1106. }
  1107. if (afTestFlags.QueryFlagsAllValues() != g_aoTestBit32)
  1108. {
  1109. break;
  1110. }
  1111. if (afTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_aoTestAnotherBit32))
  1112. {
  1113. break;
  1114. }
  1115. if (afTestFlags.QueryFlagsAllValues() != g_aoTestBit32)
  1116. {
  1117. break;
  1118. }
  1119. bResult = true;
  1120. }
  1121. while (false);
  1122. return bResult;
  1123. }
  1124. bool TestAtomicFlags_EnumSetEnumeratedFlagValue()
  1125. {
  1126. bool bResult = false;
  1127. do
  1128. {
  1129. CAtomicFlags afTestFlags;
  1130. afTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
  1131. if (afTestFlags.QueryFlagsAllValues() != 1)
  1132. {
  1133. break;
  1134. }
  1135. afTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
  1136. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
  1137. {
  1138. break;
  1139. }
  1140. afTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false);
  1141. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_INT32_MIN)
  1142. {
  1143. break;
  1144. }
  1145. afTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false);
  1146. if (afTestFlags.QueryFlagsAllValues() != 0)
  1147. {
  1148. break;
  1149. }
  1150. bResult = true;
  1151. }
  1152. while (false);
  1153. return bResult;
  1154. }
  1155. bool TestAtomicFlags_EnumSignalEnumeratedFlagValue()
  1156. {
  1157. bool bResult = false;
  1158. do
  1159. {
  1160. CAtomicFlags afTestFlags;
  1161. afTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  1162. if (afTestFlags.QueryFlagsAllValues() != 1)
  1163. {
  1164. break;
  1165. }
  1166. afTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  1167. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
  1168. {
  1169. break;
  1170. }
  1171. afTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  1172. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
  1173. {
  1174. break;
  1175. }
  1176. afTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  1177. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
  1178. {
  1179. break;
  1180. }
  1181. bResult = true;
  1182. }
  1183. while (false);
  1184. return bResult;
  1185. }
  1186. bool TestAtomicFlags_EnumDropEnumeratedFlagValue()
  1187. {
  1188. bool bResult = false;
  1189. do
  1190. {
  1191. CAtomicFlags afTestFlags(OU_UINT32_MAX);
  1192. afTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  1193. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_UINT32_MAX ^ 1))
  1194. {
  1195. break;
  1196. }
  1197. afTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  1198. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)~(OU_INT32_MIN + 1))
  1199. {
  1200. break;
  1201. }
  1202. afTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  1203. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)~(OU_INT32_MIN + 1))
  1204. {
  1205. break;
  1206. }
  1207. afTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  1208. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)~(OU_INT32_MIN + 1))
  1209. {
  1210. break;
  1211. }
  1212. bResult = true;
  1213. }
  1214. while (false);
  1215. return bResult;
  1216. }
  1217. bool TestAtomicFlags_EnumToggleEnumeratedFlagValue()
  1218. {
  1219. bool bResult = false;
  1220. do
  1221. {
  1222. CAtomicFlags afTestFlags;
  1223. bool bToggleFirstResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  1224. if (bToggleFirstResult || afTestFlags.QueryFlagsAllValues() != 1)
  1225. {
  1226. break;
  1227. }
  1228. bool bToggleSecondResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  1229. if (bToggleSecondResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
  1230. {
  1231. break;
  1232. }
  1233. bool bToggleThirdResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  1234. if (!bToggleThirdResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_INT32_MIN)
  1235. {
  1236. break;
  1237. }
  1238. bool bToggleFourthResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  1239. if (!bToggleFourthResult || afTestFlags.QueryFlagsAllValues() != 0)
  1240. {
  1241. break;
  1242. }
  1243. bResult = true;
  1244. }
  1245. while (false);
  1246. return bResult;
  1247. }
  1248. bool TestAtomicFlags_EnumModifyEnumeratedFlagValue()
  1249. {
  1250. bool bResult = false;
  1251. do
  1252. {
  1253. CAtomicFlags afTestFlags;
  1254. bool bModifyFirstResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
  1255. if (!bModifyFirstResult || afTestFlags.QueryFlagsAllValues() != 1)
  1256. {
  1257. break;
  1258. }
  1259. bool bModifySecondResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
  1260. if (!bModifySecondResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
  1261. {
  1262. break;
  1263. }
  1264. bool bModifyThirdResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
  1265. if (bModifyThirdResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
  1266. {
  1267. break;
  1268. }
  1269. bool bModifyFourthResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
  1270. if (bModifyFourthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1))
  1271. {
  1272. break;
  1273. }
  1274. bool bModifyFifthResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false);
  1275. if (!bModifyFifthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_INT32_MIN)
  1276. {
  1277. break;
  1278. }
  1279. bool bModifySixthResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false);
  1280. if (!bModifySixthResult || afTestFlags.QueryFlagsAllValues() != 0)
  1281. {
  1282. break;
  1283. }
  1284. bResult = true;
  1285. }
  1286. while (false);
  1287. return bResult;
  1288. }
  1289. bool TestAtomicFlags_EnumSignalFirstEnumeratedFlagValue()
  1290. {
  1291. bool bResult = false;
  1292. do
  1293. {
  1294. CAtomicFlags afTestFlags;
  1295. bool bFirstResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  1296. if (!bFirstResult || afTestFlags.QueryFlagsAllValues() != 1)
  1297. {
  1298. break;
  1299. }
  1300. bool bSecondResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  1301. if (bSecondResult || afTestFlags.QueryFlagsAllValues() != 1)
  1302. {
  1303. break;
  1304. }
  1305. bool bThirdResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1);
  1306. if (!bThirdResult || afTestFlags.QueryFlagsAllValues() != 3)
  1307. {
  1308. break;
  1309. }
  1310. bool bFourthResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  1311. if (bFourthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 3))
  1312. {
  1313. break;
  1314. }
  1315. bResult = true;
  1316. }
  1317. while (false);
  1318. return bResult;
  1319. }
  1320. bool TestAtomicFlags_EnumSignalLastEnumeratedFlagValue()
  1321. {
  1322. bool bResult = false;
  1323. do
  1324. {
  1325. CAtomicFlags afTestFlags;
  1326. bool bFirstResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  1327. if (!bFirstResult || afTestFlags.QueryFlagsAllValues() != 1)
  1328. {
  1329. break;
  1330. }
  1331. bool bSecondResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  1332. if (bSecondResult || afTestFlags.QueryFlagsAllValues() != 1)
  1333. {
  1334. break;
  1335. }
  1336. bool bThirdResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
  1337. if (!bThirdResult || afTestFlags.QueryFlagsAllValues() != 3)
  1338. {
  1339. break;
  1340. }
  1341. bool bFourthResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  1342. if (bFourthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 3))
  1343. {
  1344. break;
  1345. }
  1346. bResult = true;
  1347. }
  1348. while (false);
  1349. return bResult;
  1350. }
  1351. bool TestAtomicFlags_EnumGetEnumeratedFlagValue()
  1352. {
  1353. bool bResult = false;
  1354. do
  1355. {
  1356. CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
  1357. if (!afTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT32_BITS))
  1358. {
  1359. break;
  1360. }
  1361. if (afTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1))
  1362. {
  1363. break;
  1364. }
  1365. if (afTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT32_BITS - 1))
  1366. {
  1367. break;
  1368. }
  1369. if (!afTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS))
  1370. {
  1371. break;
  1372. }
  1373. bResult = true;
  1374. }
  1375. while (false);
  1376. return bResult;
  1377. }
  1378. bool TestAtomicFlags_EnumFindFirstEnumeratedFlag()
  1379. {
  1380. bool bResult = false;
  1381. do
  1382. {
  1383. CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
  1384. unsigned int uiFirstResult = afTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT32_BITS);
  1385. if (uiFirstResult != 0)
  1386. {
  1387. break;
  1388. }
  1389. unsigned int uiSecondResult = afTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT32_BITS - 1);
  1390. if (uiSecondResult != OU_UINT32_BITS - 2)
  1391. {
  1392. break;
  1393. }
  1394. bResult = true;
  1395. }
  1396. while (false);
  1397. return bResult;
  1398. }
  1399. bool TestAtomicFlags_EnumAllSignalEnumeratedFlags()
  1400. {
  1401. bool bResult = false;
  1402. do
  1403. {
  1404. CAtomicFlags afTestFlags;
  1405. afTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
  1406. if (afTestFlags.QueryFlagsAllValues() != 1)
  1407. {
  1408. break;
  1409. }
  1410. afTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT32_BITS - 2);
  1411. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_UINT32_MAX ^ 2))
  1412. {
  1413. break;
  1414. }
  1415. bResult = true;
  1416. }
  1417. while (false);
  1418. return bResult;
  1419. }
  1420. bool TestAtomicFlags_EnumAllDropEnumeratedFlags()
  1421. {
  1422. bool bResult = false;
  1423. do
  1424. {
  1425. CAtomicFlags afTestFlags(OU_UINT32_MAX);
  1426. afTestFlags.EnumAllDropEnumeratedFlags(1, 1);
  1427. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_UINT32_MAX ^ 1))
  1428. {
  1429. break;
  1430. }
  1431. afTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT32_BITS - 2);
  1432. if (afTestFlags.QueryFlagsAllValues() != 2)
  1433. {
  1434. break;
  1435. }
  1436. bResult = true;
  1437. }
  1438. while (false);
  1439. return bResult;
  1440. }
  1441. bool TestAtomicFlags_EnumAllQueryEnumeratedFlags()
  1442. {
  1443. bool bResult = false;
  1444. do
  1445. {
  1446. CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
  1447. atomicord32 aoFirstResult = afTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT32_BITS);
  1448. if (aoFirstResult != (atomicord32)(OU_INT32_MIN + 1))
  1449. {
  1450. break;
  1451. }
  1452. atomicord32 aoSecondResult = afTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 1);
  1453. if (aoSecondResult != (atomicord32)(OU_INT32_MIN))
  1454. {
  1455. break;
  1456. }
  1457. atomicord32 aoThirdResult = afTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 2);
  1458. if (aoThirdResult != 0)
  1459. {
  1460. break;
  1461. }
  1462. bResult = true;
  1463. }
  1464. while (false);
  1465. return bResult;
  1466. }
  1467. bool TestAtomicFlags_EnumAnyGetEnumeratedFlagValue()
  1468. {
  1469. bool bResult = false;
  1470. do
  1471. {
  1472. CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
  1473. bool bFirstResult = afTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT32_BITS);
  1474. if (!bFirstResult)
  1475. {
  1476. break;
  1477. }
  1478. bool bSecondResult = afTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 1);
  1479. if (!bSecondResult)
  1480. {
  1481. break;
  1482. }
  1483. bool bThirdResult = afTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 2);
  1484. if (bThirdResult)
  1485. {
  1486. break;
  1487. }
  1488. bResult = true;
  1489. }
  1490. while (false);
  1491. return bResult;
  1492. }
  1493. bool TestAtomicFlags_StoreFlagsEnumeratedValue()
  1494. {
  1495. bool bResult = false;
  1496. do
  1497. {
  1498. CAtomicFlags afTestFlags;
  1499. afTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
  1500. if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(2 << 1))
  1501. {
  1502. break;
  1503. }
  1504. afTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT32_BITS - 2, 3);
  1505. if (afTestFlags.QueryFlagsAllValues() != ((atomicord32)(2 << 1) | (atomicord32)(OU_INT32_MIN | (OU_INT32_MIN >> 1))))
  1506. {
  1507. break;
  1508. }
  1509. bResult = true;
  1510. }
  1511. while (false);
  1512. return bResult;
  1513. }
  1514. bool TestAtomicFlags_RetrieveFlagsEnumeratedValue()
  1515. {
  1516. bool bResult = false;
  1517. do
  1518. {
  1519. CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1));
  1520. unsigned int aoFirstResult = afTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
  1521. if (aoFirstResult != 0)
  1522. {
  1523. break;
  1524. }
  1525. unsigned int aoSecondResult = afTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT32_BITS - 2);
  1526. if (aoSecondResult != 2)
  1527. {
  1528. break;
  1529. }
  1530. bResult = true;
  1531. }
  1532. while (false);
  1533. return bResult;
  1534. }
  1535. enum EOUATOMICFLAGSFEATURE
  1536. {
  1537. OAF__MIN,
  1538. OAF_CONSTRUCTORS = OAF__MIN,
  1539. OAF_ASSIGNFLAGSALLVALUES,
  1540. OAF_QUERYFLAGSALLVALUES,
  1541. OAF_SETFLAGSMASKVALUE,
  1542. OAF_SIGNALFLAGSMASKVALUE,
  1543. OAF_DROPFLAGSMASKVALUE,
  1544. OAF_TOGGLESINGLEFLAGVALUE,
  1545. OAF_MODIFYSINGLEFLAGVALUE,
  1546. OAF_ASSIGNFLAGSBYMASK,
  1547. OAF_ALTERFLAGSBYMASK,
  1548. OAF_GETFLAGSMASKVALUE,
  1549. OAF_QUERYFLAGSBYMASK,
  1550. OAF_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  1551. OAF_ENUMSETENUMERATEDFLAGVALUE,
  1552. OAF_ENUMSIGNALENUMERATEDFLAGVALUE,
  1553. OAF_ENUMDROPENUMERATEDFLAGVALUE,
  1554. OAF_ENUMTOGGLEENUMERATEDFLAGVALUE,
  1555. OAF_ENUMMODIFYENUMERATEDFLAGVALUE,
  1556. OAF_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  1557. OAF_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  1558. OAF_ENUMGETENUMERATEDFLAGVALUE,
  1559. OAF_ENUMFINDFIRSTENUMERATEDFLAG,
  1560. OAF_ENUMALLSIGNALENUMERATEDFLAGS,
  1561. OAF_ENUMALLDROPENUMERATEDFLAGS,
  1562. OAF_ENUMALLQUERYENUMERATEDFLAGS,
  1563. OAF_ENUMANYGETENUMERATEDFLAGVALUE,
  1564. OAF_STOREFLAGSENUMERATEDVALUE,
  1565. OAF_RETRIEVEFLAGSENUMERATEDVALUE,
  1566. OAF__MAX,
  1567. };
  1568. template<>
  1569. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUATOMICFLAGSFEATURE, OAF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  1570. {
  1571. &TestAtomicFlags_Constructors, // OAF_CONSTRUCTORS
  1572. &TestAtomicFlags_AssignFlagsAllValues, // OAF_ASSIGNFLAGSALLVALUES,
  1573. &TestAtomicFlags_QueryFlagsAllValues, // OAF_QUERYFLAGSALLVALUES,
  1574. &TestAtomicFlags_SetFlagsMaskValue, // OAF_SETFLAGSMASKVALUE,
  1575. &TestAtomicFlags_SignalFlagsMaskValue, // OAF_SIGNALFLAGSMASKVALUE,
  1576. &TestAtomicFlags_DropFlagsMaskValue, // OAF_DROPFLAGSMASKVALUE,
  1577. &TestAtomicFlags_ToggleSingleFlagValue, // OAF_TOGGLESINGLEFLAGVALUE,
  1578. &TestAtomicFlags_ModifySingleFlagValue, // OAF_MODIFYSINGLEFLAGVALUE,
  1579. &TestAtomicFlags_AssignFlagsByMask, // OAF_ASSIGNFLAGSBYMASK,
  1580. &TestAtomicFlags_AlterFlagsByMask, // OAF_ALTERFLAGSBYMASK,
  1581. &TestAtomicFlags_GetFlagsMaskValue, // OAF_GETFLAGSMASKVALUE,
  1582. &TestAtomicFlags_QueryFlagsByMask, // OAF_QUERYFLAGSBYMASK,
  1583. &TestAtomicFlags_OnlySignalSingleFlagOutOfMask, // OAF_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  1584. &TestAtomicFlags_EnumSetEnumeratedFlagValue, // OAF_ENUMSETENUMERATEDFLAGVALUE,
  1585. &TestAtomicFlags_EnumSignalEnumeratedFlagValue, // OAF_ENUMSIGNALENUMERATEDFLAGVALUE,
  1586. &TestAtomicFlags_EnumDropEnumeratedFlagValue, // OAF_ENUMDROPENUMERATEDFLAGVALUE,
  1587. &TestAtomicFlags_EnumToggleEnumeratedFlagValue, // OAF_ENUMTOGGLEENUMERATEDFLAGVALUE,
  1588. &TestAtomicFlags_EnumModifyEnumeratedFlagValue, // OAF_ENUMMODIFYENUMERATEDFLAGVALUE,
  1589. &TestAtomicFlags_EnumSignalFirstEnumeratedFlagValue, // OAF_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  1590. &TestAtomicFlags_EnumSignalLastEnumeratedFlagValue, // OAF_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  1591. &TestAtomicFlags_EnumGetEnumeratedFlagValue, // OAF_ENUMGETENUMERATEDFLAGVALUE,
  1592. &TestAtomicFlags_EnumFindFirstEnumeratedFlag, // OAF_ENUMFINDFIRSTENUMERATEDFLAG,
  1593. &TestAtomicFlags_EnumAllSignalEnumeratedFlags, // OAF_ENUMALLSIGNALENUMERATEDFLAGS,
  1594. &TestAtomicFlags_EnumAllDropEnumeratedFlags, // OAF_ENUMALLDROPENUMERATEDFLAGS,
  1595. &TestAtomicFlags_EnumAllQueryEnumeratedFlags, // OAF_ENUMALLQUERYENUMERATEDFLAGS,
  1596. &TestAtomicFlags_EnumAnyGetEnumeratedFlagValue, // OAF_ENUMANYGETENUMERATEDFLAGVALUE,
  1597. &TestAtomicFlags_StoreFlagsEnumeratedValue, // OAF_STOREFLAGSENUMERATEDVALUE,
  1598. &TestAtomicFlags_RetrieveFlagsEnumeratedValue, // OAF_RETRIEVEFLAGSENUMERATEDVALUE,
  1599. };
  1600. static const CEnumUnsortedElementArray<EOUATOMICFLAGSFEATURE, OAF__MAX, CFeatureTestProcedure> g_afnAtomicFlagsFeatureTestProcedures;
  1601. template<>
  1602. const char *const CEnumUnsortedElementArray<EOUATOMICFLAGSFEATURE, OAF__MAX, const char *>::m_aetElementArray[] =
  1603. {
  1604. "Constructors", // OAF_CONSTRUCTORS
  1605. "AssignFlagsAllValues", // OAF_ASSIGNFLAGSALLVALUES,
  1606. "QueryFlagsAllValues", // OAF_QUERYFLAGSALLVALUES,
  1607. "SetFlagsMaskValue", // OAF_SETFLAGSMASKVALUE,
  1608. "SignalFlagsMaskValue", // OAF_SIGNALFLAGSMASKVALUE,
  1609. "DropFlagsMaskValue", // OAF_DROPFLAGSMASKVALUE,
  1610. "ToggleSingleFlagValue", // OAF_TOGGLESINGLEFLAGVALUE,
  1611. "ModifySingleFlagValue", // OAF_MODIFYSINGLEFLAGVALUE,
  1612. "AssignFlagsByMask", // OAF_ASSIGNFLAGSBYMASK,
  1613. "AlterFlagsByMask", // OAF_ALTERFLAGSBYMASK,
  1614. "GetFlagsMaskValue", // OAF_GETFLAGSMASKVALUE,
  1615. "QueryFlagsByMask", // OAF_QUERYFLAGSBYMASK,
  1616. "OnlySignalSingleFlagOutOfMask", // OAF_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  1617. "EnumSetEnumeratedFlagValue", // OAF_ENUMSETENUMERATEDFLAGVALUE,
  1618. "EnumSignalEnumeratedFlagValue", // OAF_ENUMSIGNALENUMERATEDFLAGVALUE,
  1619. "EnumDropEnumeratedFlagValue", // OAF_ENUMDROPENUMERATEDFLAGVALUE,
  1620. "EnumToggleEnumeratedFlagValue", // OAF_ENUMTOGGLEENUMERATEDFLAGVALUE,
  1621. "EnumModifyEnumeratedFlagValue", // OAF_ENUMMODIFYENUMERATEDFLAGVALUE,
  1622. "EnumSignalFirstEnumeratedFlagValue", // OAF_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  1623. "EnumSignalLastEnumeratedFlagValue", // OAF_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  1624. "EnumGetEnumeratedFlagValue", // OAF_ENUMGETENUMERATEDFLAGVALUE,
  1625. "EnumFindFirstEnumeratedFlag", // OAF_ENUMFINDFIRSTENUMERATEDFLAG,
  1626. "EnumAllSignalEnumeratedFlags", // OAF_ENUMALLSIGNALENUMERATEDFLAGS,
  1627. "EnumAllDropEnumeratedFlags", // OAF_ENUMALLDROPENUMERATEDFLAGS,
  1628. "EnumAllQueryEnumeratedFlags", // OAF_ENUMALLQUERYENUMERATEDFLAGS,
  1629. "EnumAnyGetEnumeratedFlagValue", // OAF_ENUMANYGETENUMERATEDFLAGVALUE,
  1630. "StoreFlagsEnumeratedValue", // OAF_STOREFLAGSENUMERATEDVALUE,
  1631. "RetrieveFlagsEnumeratedValue", // OAF_RETRIEVEFLAGSENUMERATEDVALUE,
  1632. };
  1633. static const CEnumUnsortedElementArray<EOUATOMICFLAGSFEATURE, OAF__MAX, const char *> g_aszAtomicFlagsFeatureTestNames;
  1634. bool TestAtomicFlags(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  1635. {
  1636. bool bResult = false;
  1637. nOutSuccessCount = 0;
  1638. nOutTestCount = OAF__MAX;
  1639. bool bAPIInitialized = false;
  1640. do
  1641. {
  1642. if (!InitializeAtomicAPI())
  1643. {
  1644. break;
  1645. }
  1646. bAPIInitialized = true;
  1647. if (!TestSubsystem(nOutSuccessCount, nOutTestCount, OAF__MAX, g_aszAtomicFlagsFeatureTestNames.GetStoragePointer(), g_afnAtomicFlagsFeatureTestProcedures.GetStoragePointer()))
  1648. {
  1649. break;
  1650. }
  1651. bResult = true;
  1652. }
  1653. while (false);
  1654. if (bAPIInitialized)
  1655. {
  1656. FinalizeAtomicAPI();
  1657. }
  1658. return bResult;
  1659. }
  1660. #endif // #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  1661. //////////////////////////////////////////////////////////////////////////
  1662. typedef CSimpleFlagsTemplate<uint64ou> CSimpleFlags64;
  1663. const uint64ou g_uiTestValue64 = ((uint64ou)0xA5A5A5A5 << 32) | 0xA5A5A5A5;
  1664. const uint64ou g_uiTestMask64 = ((uint64ou)0xC6C6C6C6 << 32) | 0xC6C6C6C6;
  1665. const uint64ou g_uiTestBit64 = (uint64ou)OU_INT64_MIN;
  1666. const uint64ou g_uiTestAnotherBit64 = (uint64ou)((uint64ou)OU_INT64_MIN >> 1);
  1667. bool TestSimpleFlags64_Constructors()
  1668. {
  1669. bool bResult = false;
  1670. do
  1671. {
  1672. if (sizeof(CSimpleFlags64::value_type) != sizeof(uint64ou) || sizeof(CSimpleFlags64) != sizeof(uint64ou))
  1673. {
  1674. break;
  1675. }
  1676. CSimpleFlags64 sfEmptyFlags;
  1677. if (sfEmptyFlags.QueryFlagsAllValues())
  1678. {
  1679. break;
  1680. }
  1681. CSimpleFlags64 sfFullFlags(OU_UINT64_MAX);
  1682. if (sfFullFlags.QueryFlagsAllValues() != OU_UINT64_MAX)
  1683. {
  1684. break;
  1685. }
  1686. CSimpleFlags64 sfCopyOfFullFlags(sfFullFlags);
  1687. if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT64_MAX)
  1688. {
  1689. break;
  1690. }
  1691. bResult = true;
  1692. }
  1693. while (false);
  1694. return bResult;
  1695. }
  1696. bool TestSimpleFlags64_AssignFlagsAllValues()
  1697. {
  1698. bool bResult = false;
  1699. do
  1700. {
  1701. CSimpleFlags64 sfTestFlags;
  1702. sfTestFlags.AssignFlagsAllValues(OU_UINT64_MAX);
  1703. if (sfTestFlags.QueryFlagsAllValues() != OU_UINT64_MAX)
  1704. {
  1705. break;
  1706. }
  1707. sfTestFlags.AssignFlagsAllValues(0);
  1708. if (sfTestFlags.QueryFlagsAllValues() != 0)
  1709. {
  1710. break;
  1711. }
  1712. bResult = true;
  1713. }
  1714. while (false);
  1715. return bResult;
  1716. }
  1717. bool TestSimpleFlags64_QueryFlagsAllValues()
  1718. {
  1719. bool bResult = false;
  1720. do
  1721. {
  1722. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1723. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64)
  1724. {
  1725. break;
  1726. }
  1727. // Double check to be sure ;-)
  1728. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64)
  1729. {
  1730. break;
  1731. }
  1732. bResult = true;
  1733. }
  1734. while (false);
  1735. return bResult;
  1736. }
  1737. bool TestSimpleFlags64_SetFlagsMaskValue()
  1738. {
  1739. bool bResult = false;
  1740. do
  1741. {
  1742. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1743. sfTestFlags.SetFlagsMaskValue(g_uiTestMask64, true);
  1744. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 | g_uiTestMask64))
  1745. {
  1746. break;
  1747. }
  1748. sfTestFlags.SetFlagsMaskValue(g_uiTestValue64, false);
  1749. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(~g_uiTestValue64 & g_uiTestMask64))
  1750. {
  1751. break;
  1752. }
  1753. bResult = true;
  1754. }
  1755. while (false);
  1756. return bResult;
  1757. }
  1758. bool TestSimpleFlags64_SignalFlagsMaskValue()
  1759. {
  1760. bool bResult = false;
  1761. do
  1762. {
  1763. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1764. sfTestFlags.SignalFlagsMaskValue(g_uiTestMask64);
  1765. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 | g_uiTestMask64))
  1766. {
  1767. break;
  1768. }
  1769. bResult = true;
  1770. }
  1771. while (false);
  1772. return bResult;
  1773. }
  1774. bool TestSimpleFlags64_DropFlagsMaskValue()
  1775. {
  1776. bool bResult = false;
  1777. do
  1778. {
  1779. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1780. sfTestFlags.DropFlagsMaskValue(g_uiTestMask64);
  1781. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 & ~g_uiTestMask64))
  1782. {
  1783. break;
  1784. }
  1785. bResult = true;
  1786. }
  1787. while (false);
  1788. return bResult;
  1789. }
  1790. bool TestSimpleFlags64_ToggleSingleFlagValue()
  1791. {
  1792. bool bResult = false;
  1793. do
  1794. {
  1795. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1796. bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit64);
  1797. if (bPreviousValue != ((g_uiTestValue64 & g_uiTestBit64) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 ^ g_uiTestBit64))
  1798. {
  1799. break;
  1800. }
  1801. bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit64);
  1802. if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64)
  1803. {
  1804. break;
  1805. }
  1806. bResult = true;
  1807. }
  1808. while (false);
  1809. return bResult;
  1810. }
  1811. bool TestSimpleFlags64_ModifySingleFlagValue()
  1812. {
  1813. bool bResult = false;
  1814. do
  1815. {
  1816. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1817. bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit64, true);
  1818. if (bFirstModification != ((g_uiTestValue64 & g_uiTestBit64) != g_uiTestBit64) || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 | g_uiTestBit64))
  1819. {
  1820. break;
  1821. }
  1822. bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit64, bFirstModification);
  1823. if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint64ou)(g_uiTestValue64 | g_uiTestBit64) : (uint64ou)(g_uiTestValue64 & ~g_uiTestBit64)))
  1824. {
  1825. break;
  1826. }
  1827. bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit64, bAnotherModification);
  1828. if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint64ou)(g_uiTestValue64 | g_uiTestBit64) : (uint64ou)(g_uiTestValue64 & ~g_uiTestBit64)))
  1829. {
  1830. break;
  1831. }
  1832. bResult = true;
  1833. }
  1834. while (false);
  1835. return bResult;
  1836. }
  1837. bool TestSimpleFlags64_AssignFlagsByMask()
  1838. {
  1839. bool bResult = false;
  1840. do
  1841. {
  1842. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1843. uint64ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask64, g_uiTestMask64);
  1844. const uint64ou uiNewFlags = (g_uiTestValue64 & ~g_uiTestMask64) | g_uiTestMask64;
  1845. if (uiPreviousFlags != g_uiTestValue64 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
  1846. {
  1847. break;
  1848. }
  1849. uint64ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue64, 0);
  1850. const uint64ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue64;
  1851. if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  1852. {
  1853. break;
  1854. }
  1855. uint64ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask64, g_uiTestMask64 & g_uiTestValue64);
  1856. OU_ASSERT((g_uiTestMask64 & g_uiTestValue64) != 0); // Test degeneration
  1857. const uint64ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask64) | (g_uiTestMask64 & g_uiTestValue64);
  1858. OU_ASSERT(uiYetAnotherNewFlags != OU_UINT64_MAX); // Test degeneration
  1859. if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
  1860. {
  1861. break;
  1862. }
  1863. bResult = true;
  1864. }
  1865. while (false);
  1866. return bResult;
  1867. }
  1868. bool TestSimpleFlags64_AlterFlagsByMask()
  1869. {
  1870. bool bResult = false;
  1871. do
  1872. {
  1873. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1874. bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask64, g_uiTestMask64);
  1875. const uint64ou uiNewFlags = (g_uiTestValue64 & ~g_uiTestMask64) | g_uiTestMask64;
  1876. if (bWasModification != ((g_uiTestValue64 & g_uiTestMask64) != g_uiTestMask64) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
  1877. {
  1878. break;
  1879. }
  1880. bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue64, 0);
  1881. const uint64ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue64;
  1882. if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue64) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  1883. {
  1884. break;
  1885. }
  1886. bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue64, 0);
  1887. if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  1888. {
  1889. break;
  1890. }
  1891. bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask64, g_uiTestMask64 & g_uiTestValue64);
  1892. OU_ASSERT((g_uiTestMask64 & g_uiTestValue64) != 0); // Test degeneration
  1893. const uint64ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask64) | (g_uiTestMask64 & g_uiTestValue64);
  1894. OU_ASSERT(uiYetAnotherNewFlags != OU_UINT64_MAX); // Test degeneration
  1895. if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask64) != (g_uiTestMask64 & g_uiTestValue64)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
  1896. {
  1897. break;
  1898. }
  1899. bResult = true;
  1900. }
  1901. while (false);
  1902. return bResult;
  1903. }
  1904. bool TestSimpleFlags64_GetFlagsMaskValue()
  1905. {
  1906. bool bResult = false;
  1907. do
  1908. {
  1909. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1910. if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask64) != ((g_uiTestValue64 & g_uiTestMask64) != 0))
  1911. {
  1912. break;
  1913. }
  1914. if (sfTestFlags.GetFlagsMaskValue(~g_uiTestValue64))
  1915. {
  1916. break;
  1917. }
  1918. if (!sfTestFlags.GetFlagsMaskValue(OU_UINT64_MAX))
  1919. {
  1920. break;
  1921. }
  1922. bResult = true;
  1923. }
  1924. while (false);
  1925. return bResult;
  1926. }
  1927. bool TestSimpleFlags64_QueryFlagsByMask()
  1928. {
  1929. bool bResult = false;
  1930. do
  1931. {
  1932. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1933. if (sfTestFlags.QueryFlagsByMask(g_uiTestMask64) != (uint64ou)(g_uiTestValue64 & g_uiTestMask64))
  1934. {
  1935. break;
  1936. }
  1937. if (sfTestFlags.QueryFlagsByMask(0))
  1938. {
  1939. break;
  1940. }
  1941. if (sfTestFlags.QueryFlagsByMask(OU_UINT64_MAX) != g_uiTestValue64)
  1942. {
  1943. break;
  1944. }
  1945. bResult = true;
  1946. }
  1947. while (false);
  1948. return bResult;
  1949. }
  1950. bool TestSimpleFlags64_OnlySignalSingleFlagOutOfMask()
  1951. {
  1952. bool bResult = false;
  1953. do
  1954. {
  1955. CSimpleFlags64 sfTestFlags(g_uiTestValue64);
  1956. OU_ASSERT(g_uiTestValue64 != 0); // Test degeneration
  1957. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT64_MAX, g_uiTestBit64))
  1958. {
  1959. break;
  1960. }
  1961. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64)
  1962. {
  1963. break;
  1964. }
  1965. sfTestFlags.AssignFlagsAllValues(0);
  1966. if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit64, g_uiTestBit64))
  1967. {
  1968. break;
  1969. }
  1970. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit64)
  1971. {
  1972. break;
  1973. }
  1974. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit64, g_uiTestBit64))
  1975. {
  1976. break;
  1977. }
  1978. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit64)
  1979. {
  1980. break;
  1981. }
  1982. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT64_MAX, g_uiTestAnotherBit64))
  1983. {
  1984. break;
  1985. }
  1986. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit64)
  1987. {
  1988. break;
  1989. }
  1990. bResult = true;
  1991. }
  1992. while (false);
  1993. return bResult;
  1994. }
  1995. bool TestSimpleFlags64_EnumSetEnumeratedFlagValue()
  1996. {
  1997. bool bResult = false;
  1998. do
  1999. {
  2000. CSimpleFlags64 sfTestFlags;
  2001. sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT64_BITS, true);
  2002. if (sfTestFlags.QueryFlagsAllValues() != 1)
  2003. {
  2004. break;
  2005. }
  2006. sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, true);
  2007. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
  2008. {
  2009. break;
  2010. }
  2011. sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT64_BITS, false);
  2012. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)OU_INT64_MIN)
  2013. {
  2014. break;
  2015. }
  2016. sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, false);
  2017. if (sfTestFlags.QueryFlagsAllValues() != 0)
  2018. {
  2019. break;
  2020. }
  2021. bResult = true;
  2022. }
  2023. while (false);
  2024. return bResult;
  2025. }
  2026. bool TestSimpleFlags64_EnumSignalEnumeratedFlagValue()
  2027. {
  2028. bool bResult = false;
  2029. do
  2030. {
  2031. CSimpleFlags64 sfTestFlags;
  2032. sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
  2033. if (sfTestFlags.QueryFlagsAllValues() != 1)
  2034. {
  2035. break;
  2036. }
  2037. sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
  2038. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
  2039. {
  2040. break;
  2041. }
  2042. sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
  2043. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
  2044. {
  2045. break;
  2046. }
  2047. sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
  2048. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
  2049. {
  2050. break;
  2051. }
  2052. bResult = true;
  2053. }
  2054. while (false);
  2055. return bResult;
  2056. }
  2057. bool TestSimpleFlags64_EnumDropEnumeratedFlagValue()
  2058. {
  2059. bool bResult = false;
  2060. do
  2061. {
  2062. CSimpleFlags64 sfTestFlags(OU_UINT64_MAX);
  2063. sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
  2064. if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT64_MAX ^ 1))
  2065. {
  2066. break;
  2067. }
  2068. sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
  2069. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)~(OU_INT64_MIN + 1))
  2070. {
  2071. break;
  2072. }
  2073. sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
  2074. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)~(OU_INT64_MIN + 1))
  2075. {
  2076. break;
  2077. }
  2078. sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
  2079. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)~(OU_INT64_MIN + 1))
  2080. {
  2081. break;
  2082. }
  2083. bResult = true;
  2084. }
  2085. while (false);
  2086. return bResult;
  2087. }
  2088. bool TestSimpleFlags64_EnumToggleEnumeratedFlagValue()
  2089. {
  2090. bool bResult = false;
  2091. do
  2092. {
  2093. CSimpleFlags64 sfTestFlags;
  2094. bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
  2095. if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  2096. {
  2097. break;
  2098. }
  2099. bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
  2100. if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
  2101. {
  2102. break;
  2103. }
  2104. bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
  2105. if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)OU_INT64_MIN)
  2106. {
  2107. break;
  2108. }
  2109. bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
  2110. if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0)
  2111. {
  2112. break;
  2113. }
  2114. bResult = true;
  2115. }
  2116. while (false);
  2117. return bResult;
  2118. }
  2119. bool TestSimpleFlags64_EnumModifyEnumeratedFlagValue()
  2120. {
  2121. bool bResult = false;
  2122. do
  2123. {
  2124. CSimpleFlags64 sfTestFlags;
  2125. bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT64_BITS, true);
  2126. if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  2127. {
  2128. break;
  2129. }
  2130. bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, true);
  2131. if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
  2132. {
  2133. break;
  2134. }
  2135. bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT64_BITS, true);
  2136. if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
  2137. {
  2138. break;
  2139. }
  2140. bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, true);
  2141. if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1))
  2142. {
  2143. break;
  2144. }
  2145. bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT64_BITS, false);
  2146. if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)OU_INT64_MIN)
  2147. {
  2148. break;
  2149. }
  2150. bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, false);
  2151. if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0)
  2152. {
  2153. break;
  2154. }
  2155. bResult = true;
  2156. }
  2157. while (false);
  2158. return bResult;
  2159. }
  2160. bool TestSimpleFlags64_EnumSignalFirstEnumeratedFlagValue()
  2161. {
  2162. bool bResult = false;
  2163. do
  2164. {
  2165. CSimpleFlags64 sfTestFlags;
  2166. bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
  2167. if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  2168. {
  2169. break;
  2170. }
  2171. bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT64_BITS);
  2172. if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
  2173. {
  2174. break;
  2175. }
  2176. bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT64_BITS - 1);
  2177. if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
  2178. {
  2179. break;
  2180. }
  2181. bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
  2182. if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 3))
  2183. {
  2184. break;
  2185. }
  2186. bResult = true;
  2187. }
  2188. while (false);
  2189. return bResult;
  2190. }
  2191. bool TestSimpleFlags64_EnumSignalLastEnumeratedFlagValue()
  2192. {
  2193. bool bResult = false;
  2194. do
  2195. {
  2196. CSimpleFlags64 sfTestFlags;
  2197. bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  2198. if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  2199. {
  2200. break;
  2201. }
  2202. bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  2203. if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
  2204. {
  2205. break;
  2206. }
  2207. bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
  2208. if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
  2209. {
  2210. break;
  2211. }
  2212. bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS);
  2213. if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 3))
  2214. {
  2215. break;
  2216. }
  2217. bResult = true;
  2218. }
  2219. while (false);
  2220. return bResult;
  2221. }
  2222. bool TestSimpleFlags64_EnumGetEnumeratedFlagValue()
  2223. {
  2224. bool bResult = false;
  2225. do
  2226. {
  2227. CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
  2228. if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT64_BITS))
  2229. {
  2230. break;
  2231. }
  2232. if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT64_BITS - 1))
  2233. {
  2234. break;
  2235. }
  2236. if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT64_BITS - 1))
  2237. {
  2238. break;
  2239. }
  2240. if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS))
  2241. {
  2242. break;
  2243. }
  2244. bResult = true;
  2245. }
  2246. while (false);
  2247. return bResult;
  2248. }
  2249. bool TestSimpleFlags64_EnumFindFirstEnumeratedFlag()
  2250. {
  2251. bool bResult = false;
  2252. do
  2253. {
  2254. CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
  2255. unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT64_BITS);
  2256. if (uiFirstResult != 0)
  2257. {
  2258. break;
  2259. }
  2260. unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT64_BITS - 1);
  2261. if (uiSecondResult != OU_UINT64_BITS - 2)
  2262. {
  2263. break;
  2264. }
  2265. bResult = true;
  2266. }
  2267. while (false);
  2268. return bResult;
  2269. }
  2270. bool TestSimpleFlags64_EnumAllSignalEnumeratedFlags()
  2271. {
  2272. bool bResult = false;
  2273. do
  2274. {
  2275. CSimpleFlags64 sfTestFlags;
  2276. sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
  2277. if (sfTestFlags.QueryFlagsAllValues() != 1)
  2278. {
  2279. break;
  2280. }
  2281. sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT64_BITS - 2);
  2282. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_UINT64_MAX ^ 2))
  2283. {
  2284. break;
  2285. }
  2286. bResult = true;
  2287. }
  2288. while (false);
  2289. return bResult;
  2290. }
  2291. bool TestSimpleFlags64_EnumAllDropEnumeratedFlags()
  2292. {
  2293. bool bResult = false;
  2294. do
  2295. {
  2296. CSimpleFlags64 sfTestFlags(OU_UINT64_MAX);
  2297. sfTestFlags.EnumAllDropEnumeratedFlags(1, 1);
  2298. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_UINT64_MAX ^ 1))
  2299. {
  2300. break;
  2301. }
  2302. sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT64_BITS - 2);
  2303. if (sfTestFlags.QueryFlagsAllValues() != 2)
  2304. {
  2305. break;
  2306. }
  2307. bResult = true;
  2308. }
  2309. while (false);
  2310. return bResult;
  2311. }
  2312. bool TestSimpleFlags64_EnumAllQueryEnumeratedFlags()
  2313. {
  2314. bool bResult = false;
  2315. do
  2316. {
  2317. CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
  2318. uint64ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT64_BITS);
  2319. if (uiFirstResult != (uint64ou)(OU_INT64_MIN + 1))
  2320. {
  2321. break;
  2322. }
  2323. uint64ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT64_BITS - 1);
  2324. if (uiSecondResult != (uint64ou)(OU_INT64_MIN))
  2325. {
  2326. break;
  2327. }
  2328. uint64ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT64_BITS - 2);
  2329. if (uiThirdResult != 0)
  2330. {
  2331. break;
  2332. }
  2333. bResult = true;
  2334. }
  2335. while (false);
  2336. return bResult;
  2337. }
  2338. bool TestSimpleFlags64_EnumAnyGetEnumeratedFlagValue()
  2339. {
  2340. bool bResult = false;
  2341. do
  2342. {
  2343. CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
  2344. bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT64_BITS);
  2345. if (!bFirstResult)
  2346. {
  2347. break;
  2348. }
  2349. bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT64_BITS - 1);
  2350. if (!bSecondResult)
  2351. {
  2352. break;
  2353. }
  2354. bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT64_BITS - 2);
  2355. if (bThirdResult)
  2356. {
  2357. break;
  2358. }
  2359. bResult = true;
  2360. }
  2361. while (false);
  2362. return bResult;
  2363. }
  2364. bool TestSimpleFlags64_StoreFlagsEnumeratedValue()
  2365. {
  2366. bool bResult = false;
  2367. do
  2368. {
  2369. CSimpleFlags64 sfTestFlags;
  2370. sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
  2371. if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(2 << 1))
  2372. {
  2373. break;
  2374. }
  2375. sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT64_BITS - 2, 3);
  2376. if (sfTestFlags.QueryFlagsAllValues() != ((uint64ou)(2 << 1) | (uint64ou)(OU_INT64_MIN | (OU_INT64_MIN >> 1))))
  2377. {
  2378. break;
  2379. }
  2380. bResult = true;
  2381. }
  2382. while (false);
  2383. return bResult;
  2384. }
  2385. bool TestSimpleFlags64_RetrieveFlagsEnumeratedValue()
  2386. {
  2387. bool bResult = false;
  2388. do
  2389. {
  2390. CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1));
  2391. unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
  2392. if (uiFirstResult != 0)
  2393. {
  2394. break;
  2395. }
  2396. unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT64_BITS - 2);
  2397. if (uiSecondResult != 2)
  2398. {
  2399. break;
  2400. }
  2401. bResult = true;
  2402. }
  2403. while (false);
  2404. return bResult;
  2405. }
  2406. enum EOUSIMPLEFLAGSFEATURE64
  2407. {
  2408. OSF64__MIN,
  2409. OSF64_CONSTRUCTORS = OSF64__MIN,
  2410. OSF64_ASSIGNFLAGSALLVALUES,
  2411. OSF64_QUERYFLAGSALLVALUES,
  2412. OSF64_SETFLAGSMASKVALUE,
  2413. OSF64_SIGNALFLAGSMASKVALUE,
  2414. OSF64_DROPFLAGSMASKVALUE,
  2415. OSF64_TOGGLESINGLEFLAGVALUE,
  2416. OSF64_MODIFYSINGLEFLAGVALUE,
  2417. OSF64_ASSIGNFLAGSBYMASK,
  2418. OSF64_ALTERFLAGSBYMASK,
  2419. OSF64_GETFLAGSMASKVALUE,
  2420. OSF64_QUERYFLAGSBYMASK,
  2421. OSF64_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  2422. OSF64_ENUMSETENUMERATEDFLAGVALUE,
  2423. OSF64_ENUMSIGNALENUMERATEDFLAGVALUE,
  2424. OSF64_ENUMDROPENUMERATEDFLAGVALUE,
  2425. OSF64_ENUMTOGGLEENUMERATEDFLAGVALUE,
  2426. OSF64_ENUMMODIFYENUMERATEDFLAGVALUE,
  2427. OSF64_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  2428. OSF64_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  2429. OSF64_ENUMGETENUMERATEDFLAGVALUE,
  2430. OSF64_ENUMFINDFIRSTENUMERATEDFLAG,
  2431. OSF64_ENUMALLSIGNALENUMERATEDFLAGS,
  2432. OSF64_ENUMALLDROPENUMERATEDFLAGS,
  2433. OSF64_ENUMALLQUERYENUMERATEDFLAGS,
  2434. OSF64_ENUMANYGETENUMERATEDFLAGVALUE,
  2435. OSF64_STOREFLAGSENUMERATEDVALUE,
  2436. OSF64_RETRIEVEFLAGSENUMERATEDVALUE,
  2437. OSF64__MAX,
  2438. };
  2439. template<>
  2440. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE64, OSF64__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  2441. {
  2442. &TestSimpleFlags64_Constructors, // OSF64_CONSTRUCTORS
  2443. &TestSimpleFlags64_AssignFlagsAllValues, // OSF64_ASSIGNFLAGSALLVALUES,
  2444. &TestSimpleFlags64_QueryFlagsAllValues, // OSF64_QUERYFLAGSALLVALUES,
  2445. &TestSimpleFlags64_SetFlagsMaskValue, // OSF64_SETFLAGSMASKVALUE,
  2446. &TestSimpleFlags64_SignalFlagsMaskValue, // OSF64_SIGNALFLAGSMASKVALUE,
  2447. &TestSimpleFlags64_DropFlagsMaskValue, // OSF64_DROPFLAGSMASKVALUE,
  2448. &TestSimpleFlags64_ToggleSingleFlagValue, // OSF64_TOGGLESINGLEFLAGVALUE,
  2449. &TestSimpleFlags64_ModifySingleFlagValue, // OSF64_MODIFYSINGLEFLAGVALUE,
  2450. &TestSimpleFlags64_AssignFlagsByMask, // OSF64_ASSIGNFLAGSBYMASK,
  2451. &TestSimpleFlags64_AlterFlagsByMask, // OSF64_ALTERFLAGSBYMASK,
  2452. &TestSimpleFlags64_GetFlagsMaskValue, // OSF64_GETFLAGSMASKVALUE,
  2453. &TestSimpleFlags64_QueryFlagsByMask, // OSF64_QUERYFLAGSBYMASK,
  2454. &TestSimpleFlags64_OnlySignalSingleFlagOutOfMask, // OSF64_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  2455. &TestSimpleFlags64_EnumSetEnumeratedFlagValue, // OSF64_ENUMSETENUMERATEDFLAGVALUE,
  2456. &TestSimpleFlags64_EnumSignalEnumeratedFlagValue, // OSF64_ENUMSIGNALENUMERATEDFLAGVALUE,
  2457. &TestSimpleFlags64_EnumDropEnumeratedFlagValue, // OSF64_ENUMDROPENUMERATEDFLAGVALUE,
  2458. &TestSimpleFlags64_EnumToggleEnumeratedFlagValue, // OSF64_ENUMTOGGLEENUMERATEDFLAGVALUE,
  2459. &TestSimpleFlags64_EnumModifyEnumeratedFlagValue, // OSF64_ENUMMODIFYENUMERATEDFLAGVALUE,
  2460. &TestSimpleFlags64_EnumSignalFirstEnumeratedFlagValue, // OSF64_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  2461. &TestSimpleFlags64_EnumSignalLastEnumeratedFlagValue, // OSF64_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  2462. &TestSimpleFlags64_EnumGetEnumeratedFlagValue, // OSF64_ENUMGETENUMERATEDFLAGVALUE,
  2463. &TestSimpleFlags64_EnumFindFirstEnumeratedFlag, // OSF64_ENUMFINDFIRSTENUMERATEDFLAG,
  2464. &TestSimpleFlags64_EnumAllSignalEnumeratedFlags, // OSF64_ENUMALLSIGNALENUMERATEDFLAGS,
  2465. &TestSimpleFlags64_EnumAllDropEnumeratedFlags, // OSF64_ENUMALLDROPENUMERATEDFLAGS,
  2466. &TestSimpleFlags64_EnumAllQueryEnumeratedFlags, // OSF64_ENUMALLQUERYENUMERATEDFLAGS,
  2467. &TestSimpleFlags64_EnumAnyGetEnumeratedFlagValue, // OSF64_ENUMANYGETENUMERATEDFLAGVALUE,
  2468. &TestSimpleFlags64_StoreFlagsEnumeratedValue, // OSF64_STOREFLAGSENUMERATEDVALUE,
  2469. &TestSimpleFlags64_RetrieveFlagsEnumeratedValue, // OSF64_RETRIEVEFLAGSENUMERATEDVALUE,
  2470. };
  2471. static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE64, OSF64__MAX, CFeatureTestProcedure> g_afnSimpleFlags64FeatureTestProcedures;
  2472. template<>
  2473. const char *const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE64, OSF64__MAX, const char *>::m_aetElementArray[] =
  2474. {
  2475. "Constructors", // OSF64_CONSTRUCTORS
  2476. "AssignFlagsAllValues", // OSF64_ASSIGNFLAGSALLVALUES,
  2477. "QueryFlagsAllValues", // OSF64_QUERYFLAGSALLVALUES,
  2478. "SetFlagsMaskValue", // OSF64_SETFLAGSMASKVALUE,
  2479. "SignalFlagsMaskValue", // OSF64_SIGNALFLAGSMASKVALUE,
  2480. "DropFlagsMaskValue", // OSF64_DROPFLAGSMASKVALUE,
  2481. "ToggleSingleFlagValue", // OSF64_TOGGLESINGLEFLAGVALUE,
  2482. "ModifySingleFlagValue", // OSF64_MODIFYSINGLEFLAGVALUE,
  2483. "AssignFlagsByMask", // OSF64_ASSIGNFLAGSBYMASK,
  2484. "AlterFlagsByMask", // OSF64_ALTERFLAGSBYMASK,
  2485. "GetFlagsMaskValue", // OSF64_GETFLAGSMASKVALUE,
  2486. "QueryFlagsByMask", // OSF64_QUERYFLAGSBYMASK,
  2487. "OnlySignalSingleFlagOutOfMask", // OSF64_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  2488. "EnumSetEnumeratedFlagValue", // OSF64_ENUMSETENUMERATEDFLAGVALUE,
  2489. "EnumSignalEnumeratedFlagValue", // OSF64_ENUMSIGNALENUMERATEDFLAGVALUE,
  2490. "EnumDropEnumeratedFlagValue", // OSF64_ENUMDROPENUMERATEDFLAGVALUE,
  2491. "EnumToggleEnumeratedFlagValue", // OSF64_ENUMTOGGLEENUMERATEDFLAGVALUE,
  2492. "EnumModifyEnumeratedFlagValue", // OSF64_ENUMMODIFYENUMERATEDFLAGVALUE,
  2493. "EnumSignalFirstEnumeratedFlagValue", // OSF64_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  2494. "EnumSignalLastEnumeratedFlagValue", // OSF64_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  2495. "EnumGetEnumeratedFlagValue", // OSF64_ENUMGETENUMERATEDFLAGVALUE,
  2496. "EnumFindFirstEnumeratedFlag", // OSF64_ENUMFINDFIRSTENUMERATEDFLAG,
  2497. "EnumAllSignalEnumeratedFlags", // OSF64_ENUMALLSIGNALENUMERATEDFLAGS,
  2498. "EnumAllDropEnumeratedFlags", // OSF64_ENUMALLDROPENUMERATEDFLAGS,
  2499. "EnumAllQueryEnumeratedFlags", // OSF64_ENUMALLQUERYENUMERATEDFLAGS,
  2500. "EnumAnyGetEnumeratedFlagValue", // OSF64_ENUMANYGETENUMERATEDFLAGVALUE,
  2501. "StoreFlagsEnumeratedValue", // OSF64_STOREFLAGSENUMERATEDVALUE,
  2502. "RetrieveFlagsEnumeratedValue", // OSF64_RETRIEVEFLAGSENUMERATEDVALUE,
  2503. };
  2504. static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE64, OSF64__MAX, const char *> g_aszSimpleFlags64FeatureTestNames;
  2505. bool TestSimpleFlags64(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  2506. {
  2507. return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF64__MAX, g_aszSimpleFlags64FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags64FeatureTestProcedures.GetStoragePointer());
  2508. }
  2509. //////////////////////////////////////////////////////////////////////////
  2510. typedef CSimpleFlags CSimpleFlags32;
  2511. const uint32ou g_uiTestValue32 = (uint32ou)0xA5A5A5A5;
  2512. const uint32ou g_uiTestMask32 = (uint32ou)0xC6C6C6C6;
  2513. const uint32ou g_uiTestBit32 = (uint32ou)OU_INT32_MIN;
  2514. const uint32ou g_uiTestAnotherBit32 = (uint32ou)((uint32ou)OU_INT32_MIN >> 1);
  2515. bool TestSimpleFlags32_Constructors()
  2516. {
  2517. bool bResult = false;
  2518. do
  2519. {
  2520. if (sizeof(CSimpleFlags32::value_type) != sizeof(uint32ou) || sizeof(CSimpleFlags32) != sizeof(uint32ou))
  2521. {
  2522. break;
  2523. }
  2524. CSimpleFlags32 sfEmptyFlags;
  2525. if (sfEmptyFlags.QueryFlagsAllValues())
  2526. {
  2527. break;
  2528. }
  2529. CSimpleFlags32 sfFullFlags(OU_UINT32_MAX);
  2530. if (sfFullFlags.QueryFlagsAllValues() != OU_UINT32_MAX)
  2531. {
  2532. break;
  2533. }
  2534. CSimpleFlags32 sfCopyOfFullFlags(sfFullFlags);
  2535. if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT32_MAX)
  2536. {
  2537. break;
  2538. }
  2539. bResult = true;
  2540. }
  2541. while (false);
  2542. return bResult;
  2543. }
  2544. bool TestSimpleFlags32_AssignFlagsAllValues()
  2545. {
  2546. bool bResult = false;
  2547. do
  2548. {
  2549. CSimpleFlags32 sfTestFlags;
  2550. sfTestFlags.AssignFlagsAllValues(OU_UINT32_MAX);
  2551. if (sfTestFlags.QueryFlagsAllValues() != OU_UINT32_MAX)
  2552. {
  2553. break;
  2554. }
  2555. sfTestFlags.AssignFlagsAllValues(0);
  2556. if (sfTestFlags.QueryFlagsAllValues() != 0)
  2557. {
  2558. break;
  2559. }
  2560. bResult = true;
  2561. }
  2562. while (false);
  2563. return bResult;
  2564. }
  2565. bool TestSimpleFlags32_QueryFlagsAllValues()
  2566. {
  2567. bool bResult = false;
  2568. do
  2569. {
  2570. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2571. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32)
  2572. {
  2573. break;
  2574. }
  2575. // Double check to be sure ;-)
  2576. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32)
  2577. {
  2578. break;
  2579. }
  2580. bResult = true;
  2581. }
  2582. while (false);
  2583. return bResult;
  2584. }
  2585. bool TestSimpleFlags32_SetFlagsMaskValue()
  2586. {
  2587. bool bResult = false;
  2588. do
  2589. {
  2590. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2591. sfTestFlags.SetFlagsMaskValue(g_uiTestMask32, true);
  2592. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 | g_uiTestMask32))
  2593. {
  2594. break;
  2595. }
  2596. sfTestFlags.SetFlagsMaskValue(g_uiTestValue32, false);
  2597. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(~g_uiTestValue32 & g_uiTestMask32))
  2598. {
  2599. break;
  2600. }
  2601. bResult = true;
  2602. }
  2603. while (false);
  2604. return bResult;
  2605. }
  2606. bool TestSimpleFlags32_SignalFlagsMaskValue()
  2607. {
  2608. bool bResult = false;
  2609. do
  2610. {
  2611. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2612. sfTestFlags.SignalFlagsMaskValue(g_uiTestMask32);
  2613. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 | g_uiTestMask32))
  2614. {
  2615. break;
  2616. }
  2617. bResult = true;
  2618. }
  2619. while (false);
  2620. return bResult;
  2621. }
  2622. bool TestSimpleFlags32_DropFlagsMaskValue()
  2623. {
  2624. bool bResult = false;
  2625. do
  2626. {
  2627. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2628. sfTestFlags.DropFlagsMaskValue(g_uiTestMask32);
  2629. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 & ~g_uiTestMask32))
  2630. {
  2631. break;
  2632. }
  2633. bResult = true;
  2634. }
  2635. while (false);
  2636. return bResult;
  2637. }
  2638. bool TestSimpleFlags32_ToggleSingleFlagValue()
  2639. {
  2640. bool bResult = false;
  2641. do
  2642. {
  2643. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2644. bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit32);
  2645. if (bPreviousValue != ((g_uiTestValue32 & g_uiTestBit32) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 ^ g_uiTestBit32))
  2646. {
  2647. break;
  2648. }
  2649. bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit32);
  2650. if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32)
  2651. {
  2652. break;
  2653. }
  2654. bResult = true;
  2655. }
  2656. while (false);
  2657. return bResult;
  2658. }
  2659. bool TestSimpleFlags32_ModifySingleFlagValue()
  2660. {
  2661. bool bResult = false;
  2662. do
  2663. {
  2664. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2665. bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit32, true);
  2666. if (bFirstModification != ((g_uiTestValue32 & g_uiTestBit32) != g_uiTestBit32) || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 | g_uiTestBit32))
  2667. {
  2668. break;
  2669. }
  2670. bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit32, bFirstModification);
  2671. if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint32ou)(g_uiTestValue32 | g_uiTestBit32) : (uint32ou)(g_uiTestValue32 & ~g_uiTestBit32)))
  2672. {
  2673. break;
  2674. }
  2675. bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit32, bAnotherModification);
  2676. if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint32ou)(g_uiTestValue32 | g_uiTestBit32) : (uint32ou)(g_uiTestValue32 & ~g_uiTestBit32)))
  2677. {
  2678. break;
  2679. }
  2680. bResult = true;
  2681. }
  2682. while (false);
  2683. return bResult;
  2684. }
  2685. bool TestSimpleFlags32_AssignFlagsByMask()
  2686. {
  2687. bool bResult = false;
  2688. do
  2689. {
  2690. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2691. uint32ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask32, g_uiTestMask32);
  2692. const uint32ou uiNewFlags = (g_uiTestValue32 & ~g_uiTestMask32) | g_uiTestMask32;
  2693. if (uiPreviousFlags != g_uiTestValue32 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
  2694. {
  2695. break;
  2696. }
  2697. uint32ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue32, 0);
  2698. const uint32ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue32;
  2699. if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  2700. {
  2701. break;
  2702. }
  2703. uint32ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask32, g_uiTestMask32 & g_uiTestValue32);
  2704. OU_ASSERT((g_uiTestMask32 & g_uiTestValue32) != 0); // Test degeneration
  2705. const uint32ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask32) | (g_uiTestMask32 & g_uiTestValue32);
  2706. OU_ASSERT(uiYetAnotherNewFlags != OU_UINT32_MAX); // Test degeneration
  2707. if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
  2708. {
  2709. break;
  2710. }
  2711. bResult = true;
  2712. }
  2713. while (false);
  2714. return bResult;
  2715. }
  2716. bool TestSimpleFlags32_AlterFlagsByMask()
  2717. {
  2718. bool bResult = false;
  2719. do
  2720. {
  2721. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2722. bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask32, g_uiTestMask32);
  2723. const uint32ou uiNewFlags = (g_uiTestValue32 & ~g_uiTestMask32) | g_uiTestMask32;
  2724. if (bWasModification != ((g_uiTestValue32 & g_uiTestMask32) != g_uiTestMask32) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
  2725. {
  2726. break;
  2727. }
  2728. bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue32, 0);
  2729. const uint32ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue32;
  2730. if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue32) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  2731. {
  2732. break;
  2733. }
  2734. bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue32, 0);
  2735. if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  2736. {
  2737. break;
  2738. }
  2739. bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask32, g_uiTestMask32 & g_uiTestValue32);
  2740. OU_ASSERT((g_uiTestMask32 & g_uiTestValue32) != 0); // Test degeneration
  2741. const uint32ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask32) | (g_uiTestMask32 & g_uiTestValue32);
  2742. OU_ASSERT(uiYetAnotherNewFlags != OU_UINT32_MAX); // Test degeneration
  2743. if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask32) != (g_uiTestMask32 & g_uiTestValue32)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
  2744. {
  2745. break;
  2746. }
  2747. bResult = true;
  2748. }
  2749. while (false);
  2750. return bResult;
  2751. }
  2752. bool TestSimpleFlags32_GetFlagsMaskValue()
  2753. {
  2754. bool bResult = false;
  2755. do
  2756. {
  2757. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2758. if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask32) != ((g_uiTestValue32 & g_uiTestMask32) != 0))
  2759. {
  2760. break;
  2761. }
  2762. if (sfTestFlags.GetFlagsMaskValue(~g_uiTestValue32))
  2763. {
  2764. break;
  2765. }
  2766. if (!sfTestFlags.GetFlagsMaskValue(OU_UINT32_MAX))
  2767. {
  2768. break;
  2769. }
  2770. bResult = true;
  2771. }
  2772. while (false);
  2773. return bResult;
  2774. }
  2775. bool TestSimpleFlags32_QueryFlagsByMask()
  2776. {
  2777. bool bResult = false;
  2778. do
  2779. {
  2780. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2781. if (sfTestFlags.QueryFlagsByMask(g_uiTestMask32) != (uint32ou)(g_uiTestValue32 & g_uiTestMask32))
  2782. {
  2783. break;
  2784. }
  2785. if (sfTestFlags.QueryFlagsByMask(0))
  2786. {
  2787. break;
  2788. }
  2789. if (sfTestFlags.QueryFlagsByMask(OU_UINT32_MAX) != g_uiTestValue32)
  2790. {
  2791. break;
  2792. }
  2793. bResult = true;
  2794. }
  2795. while (false);
  2796. return bResult;
  2797. }
  2798. bool TestSimpleFlags32_OnlySignalSingleFlagOutOfMask()
  2799. {
  2800. bool bResult = false;
  2801. do
  2802. {
  2803. CSimpleFlags32 sfTestFlags(g_uiTestValue32);
  2804. OU_ASSERT(g_uiTestValue32 != 0); // Test degeneration
  2805. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_uiTestBit32))
  2806. {
  2807. break;
  2808. }
  2809. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32)
  2810. {
  2811. break;
  2812. }
  2813. sfTestFlags.AssignFlagsAllValues(0);
  2814. if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit32, g_uiTestBit32))
  2815. {
  2816. break;
  2817. }
  2818. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit32)
  2819. {
  2820. break;
  2821. }
  2822. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit32, g_uiTestBit32))
  2823. {
  2824. break;
  2825. }
  2826. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit32)
  2827. {
  2828. break;
  2829. }
  2830. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_uiTestAnotherBit32))
  2831. {
  2832. break;
  2833. }
  2834. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit32)
  2835. {
  2836. break;
  2837. }
  2838. bResult = true;
  2839. }
  2840. while (false);
  2841. return bResult;
  2842. }
  2843. bool TestSimpleFlags32_EnumSetEnumeratedFlagValue()
  2844. {
  2845. bool bResult = false;
  2846. do
  2847. {
  2848. CSimpleFlags32 sfTestFlags;
  2849. sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
  2850. if (sfTestFlags.QueryFlagsAllValues() != 1)
  2851. {
  2852. break;
  2853. }
  2854. sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
  2855. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
  2856. {
  2857. break;
  2858. }
  2859. sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false);
  2860. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)OU_INT32_MIN)
  2861. {
  2862. break;
  2863. }
  2864. sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false);
  2865. if (sfTestFlags.QueryFlagsAllValues() != 0)
  2866. {
  2867. break;
  2868. }
  2869. bResult = true;
  2870. }
  2871. while (false);
  2872. return bResult;
  2873. }
  2874. bool TestSimpleFlags32_EnumSignalEnumeratedFlagValue()
  2875. {
  2876. bool bResult = false;
  2877. do
  2878. {
  2879. CSimpleFlags32 sfTestFlags;
  2880. sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  2881. if (sfTestFlags.QueryFlagsAllValues() != 1)
  2882. {
  2883. break;
  2884. }
  2885. sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  2886. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
  2887. {
  2888. break;
  2889. }
  2890. sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  2891. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
  2892. {
  2893. break;
  2894. }
  2895. sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  2896. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
  2897. {
  2898. break;
  2899. }
  2900. bResult = true;
  2901. }
  2902. while (false);
  2903. return bResult;
  2904. }
  2905. bool TestSimpleFlags32_EnumDropEnumeratedFlagValue()
  2906. {
  2907. bool bResult = false;
  2908. do
  2909. {
  2910. CSimpleFlags32 sfTestFlags(OU_UINT32_MAX);
  2911. sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  2912. if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT32_MAX ^ 1))
  2913. {
  2914. break;
  2915. }
  2916. sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  2917. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)~(OU_INT32_MIN + 1))
  2918. {
  2919. break;
  2920. }
  2921. sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  2922. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)~(OU_INT32_MIN + 1))
  2923. {
  2924. break;
  2925. }
  2926. sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  2927. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)~(OU_INT32_MIN + 1))
  2928. {
  2929. break;
  2930. }
  2931. bResult = true;
  2932. }
  2933. while (false);
  2934. return bResult;
  2935. }
  2936. bool TestSimpleFlags32_EnumToggleEnumeratedFlagValue()
  2937. {
  2938. bool bResult = false;
  2939. do
  2940. {
  2941. CSimpleFlags32 sfTestFlags;
  2942. bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  2943. if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  2944. {
  2945. break;
  2946. }
  2947. bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  2948. if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
  2949. {
  2950. break;
  2951. }
  2952. bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  2953. if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)OU_INT32_MIN)
  2954. {
  2955. break;
  2956. }
  2957. bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  2958. if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0)
  2959. {
  2960. break;
  2961. }
  2962. bResult = true;
  2963. }
  2964. while (false);
  2965. return bResult;
  2966. }
  2967. bool TestSimpleFlags32_EnumModifyEnumeratedFlagValue()
  2968. {
  2969. bool bResult = false;
  2970. do
  2971. {
  2972. CSimpleFlags32 sfTestFlags;
  2973. bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
  2974. if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  2975. {
  2976. break;
  2977. }
  2978. bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
  2979. if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
  2980. {
  2981. break;
  2982. }
  2983. bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true);
  2984. if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
  2985. {
  2986. break;
  2987. }
  2988. bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true);
  2989. if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1))
  2990. {
  2991. break;
  2992. }
  2993. bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false);
  2994. if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)OU_INT32_MIN)
  2995. {
  2996. break;
  2997. }
  2998. bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false);
  2999. if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0)
  3000. {
  3001. break;
  3002. }
  3003. bResult = true;
  3004. }
  3005. while (false);
  3006. return bResult;
  3007. }
  3008. bool TestSimpleFlags32_EnumSignalFirstEnumeratedFlagValue()
  3009. {
  3010. bool bResult = false;
  3011. do
  3012. {
  3013. CSimpleFlags32 sfTestFlags;
  3014. bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  3015. if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3016. {
  3017. break;
  3018. }
  3019. bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS);
  3020. if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3021. {
  3022. break;
  3023. }
  3024. bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1);
  3025. if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
  3026. {
  3027. break;
  3028. }
  3029. bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  3030. if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 3))
  3031. {
  3032. break;
  3033. }
  3034. bResult = true;
  3035. }
  3036. while (false);
  3037. return bResult;
  3038. }
  3039. bool TestSimpleFlags32_EnumSignalLastEnumeratedFlagValue()
  3040. {
  3041. bool bResult = false;
  3042. do
  3043. {
  3044. CSimpleFlags32 sfTestFlags;
  3045. bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  3046. if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3047. {
  3048. break;
  3049. }
  3050. bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  3051. if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3052. {
  3053. break;
  3054. }
  3055. bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
  3056. if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
  3057. {
  3058. break;
  3059. }
  3060. bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS);
  3061. if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 3))
  3062. {
  3063. break;
  3064. }
  3065. bResult = true;
  3066. }
  3067. while (false);
  3068. return bResult;
  3069. }
  3070. bool TestSimpleFlags32_EnumGetEnumeratedFlagValue()
  3071. {
  3072. bool bResult = false;
  3073. do
  3074. {
  3075. CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
  3076. if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT32_BITS))
  3077. {
  3078. break;
  3079. }
  3080. if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1))
  3081. {
  3082. break;
  3083. }
  3084. if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT32_BITS - 1))
  3085. {
  3086. break;
  3087. }
  3088. if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS))
  3089. {
  3090. break;
  3091. }
  3092. bResult = true;
  3093. }
  3094. while (false);
  3095. return bResult;
  3096. }
  3097. bool TestSimpleFlags32_EnumFindFirstEnumeratedFlag()
  3098. {
  3099. bool bResult = false;
  3100. do
  3101. {
  3102. CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
  3103. unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT32_BITS);
  3104. if (uiFirstResult != 0)
  3105. {
  3106. break;
  3107. }
  3108. unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT32_BITS - 1);
  3109. if (uiSecondResult != OU_UINT32_BITS - 2)
  3110. {
  3111. break;
  3112. }
  3113. bResult = true;
  3114. }
  3115. while (false);
  3116. return bResult;
  3117. }
  3118. bool TestSimpleFlags32_EnumAllSignalEnumeratedFlags()
  3119. {
  3120. bool bResult = false;
  3121. do
  3122. {
  3123. CSimpleFlags32 sfTestFlags;
  3124. sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
  3125. if (sfTestFlags.QueryFlagsAllValues() != 1)
  3126. {
  3127. break;
  3128. }
  3129. sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT32_BITS - 2);
  3130. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_UINT32_MAX ^ 2))
  3131. {
  3132. break;
  3133. }
  3134. bResult = true;
  3135. }
  3136. while (false);
  3137. return bResult;
  3138. }
  3139. bool TestSimpleFlags32_EnumAllDropEnumeratedFlags()
  3140. {
  3141. bool bResult = false;
  3142. do
  3143. {
  3144. CSimpleFlags32 sfTestFlags(OU_UINT32_MAX);
  3145. sfTestFlags.EnumAllDropEnumeratedFlags(1, 1);
  3146. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_UINT32_MAX ^ 1))
  3147. {
  3148. break;
  3149. }
  3150. sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT32_BITS - 2);
  3151. if (sfTestFlags.QueryFlagsAllValues() != 2)
  3152. {
  3153. break;
  3154. }
  3155. bResult = true;
  3156. }
  3157. while (false);
  3158. return bResult;
  3159. }
  3160. bool TestSimpleFlags32_EnumAllQueryEnumeratedFlags()
  3161. {
  3162. bool bResult = false;
  3163. do
  3164. {
  3165. CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
  3166. uint32ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT32_BITS);
  3167. if (uiFirstResult != (uint32ou)(OU_INT32_MIN + 1))
  3168. {
  3169. break;
  3170. }
  3171. uint32ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 1);
  3172. if (uiSecondResult != (uint32ou)(OU_INT32_MIN))
  3173. {
  3174. break;
  3175. }
  3176. uint32ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 2);
  3177. if (uiThirdResult != 0)
  3178. {
  3179. break;
  3180. }
  3181. bResult = true;
  3182. }
  3183. while (false);
  3184. return bResult;
  3185. }
  3186. bool TestSimpleFlags32_EnumAnyGetEnumeratedFlagValue()
  3187. {
  3188. bool bResult = false;
  3189. do
  3190. {
  3191. CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
  3192. bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT32_BITS);
  3193. if (!bFirstResult)
  3194. {
  3195. break;
  3196. }
  3197. bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 1);
  3198. if (!bSecondResult)
  3199. {
  3200. break;
  3201. }
  3202. bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 2);
  3203. if (bThirdResult)
  3204. {
  3205. break;
  3206. }
  3207. bResult = true;
  3208. }
  3209. while (false);
  3210. return bResult;
  3211. }
  3212. bool TestSimpleFlags32_StoreFlagsEnumeratedValue()
  3213. {
  3214. bool bResult = false;
  3215. do
  3216. {
  3217. CSimpleFlags32 sfTestFlags;
  3218. sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
  3219. if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(2 << 1))
  3220. {
  3221. break;
  3222. }
  3223. sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT32_BITS - 2, 3);
  3224. if (sfTestFlags.QueryFlagsAllValues() != ((uint32ou)(2 << 1) | (uint32ou)(OU_INT32_MIN | (OU_INT32_MIN >> 1))))
  3225. {
  3226. break;
  3227. }
  3228. bResult = true;
  3229. }
  3230. while (false);
  3231. return bResult;
  3232. }
  3233. bool TestSimpleFlags32_RetrieveFlagsEnumeratedValue()
  3234. {
  3235. bool bResult = false;
  3236. do
  3237. {
  3238. CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1));
  3239. unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
  3240. if (uiFirstResult != 0)
  3241. {
  3242. break;
  3243. }
  3244. unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT32_BITS - 2);
  3245. if (uiSecondResult != 2)
  3246. {
  3247. break;
  3248. }
  3249. bResult = true;
  3250. }
  3251. while (false);
  3252. return bResult;
  3253. }
  3254. enum EOUSIMPLEFLAGSFEATURE32
  3255. {
  3256. OSF32__MIN,
  3257. OSF32_CONSTRUCTORS = OSF32__MIN,
  3258. OSF32_ASSIGNFLAGSALLVALUES,
  3259. OSF32_QUERYFLAGSALLVALUES,
  3260. OSF32_SETFLAGSMASKVALUE,
  3261. OSF32_SIGNALFLAGSMASKVALUE,
  3262. OSF32_DROPFLAGSMASKVALUE,
  3263. OSF32_TOGGLESINGLEFLAGVALUE,
  3264. OSF32_MODIFYSINGLEFLAGVALUE,
  3265. OSF32_ASSIGNFLAGSBYMASK,
  3266. OSF32_ALTERFLAGSBYMASK,
  3267. OSF32_GETFLAGSMASKVALUE,
  3268. OSF32_QUERYFLAGSBYMASK,
  3269. OSF32_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  3270. OSF32_ENUMSETENUMERATEDFLAGVALUE,
  3271. OSF32_ENUMSIGNALENUMERATEDFLAGVALUE,
  3272. OSF32_ENUMDROPENUMERATEDFLAGVALUE,
  3273. OSF32_ENUMTOGGLEENUMERATEDFLAGVALUE,
  3274. OSF32_ENUMMODIFYENUMERATEDFLAGVALUE,
  3275. OSF32_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  3276. OSF32_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  3277. OSF32_ENUMGETENUMERATEDFLAGVALUE,
  3278. OSF32_ENUMFINDFIRSTENUMERATEDFLAG,
  3279. OSF32_ENUMALLSIGNALENUMERATEDFLAGS,
  3280. OSF32_ENUMALLDROPENUMERATEDFLAGS,
  3281. OSF32_ENUMALLQUERYENUMERATEDFLAGS,
  3282. OSF32_ENUMANYGETENUMERATEDFLAGVALUE,
  3283. OSF32_STOREFLAGSENUMERATEDVALUE,
  3284. OSF32_RETRIEVEFLAGSENUMERATEDVALUE,
  3285. OSF32__MAX,
  3286. };
  3287. template<>
  3288. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE32, OSF32__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  3289. {
  3290. &TestSimpleFlags32_Constructors, // OSF32_CONSTRUCTORS
  3291. &TestSimpleFlags32_AssignFlagsAllValues, // OSF32_ASSIGNFLAGSALLVALUES,
  3292. &TestSimpleFlags32_QueryFlagsAllValues, // OSF32_QUERYFLAGSALLVALUES,
  3293. &TestSimpleFlags32_SetFlagsMaskValue, // OSF32_SETFLAGSMASKVALUE,
  3294. &TestSimpleFlags32_SignalFlagsMaskValue, // OSF32_SIGNALFLAGSMASKVALUE,
  3295. &TestSimpleFlags32_DropFlagsMaskValue, // OSF32_DROPFLAGSMASKVALUE,
  3296. &TestSimpleFlags32_ToggleSingleFlagValue, // OSF32_TOGGLESINGLEFLAGVALUE,
  3297. &TestSimpleFlags32_ModifySingleFlagValue, // OSF32_MODIFYSINGLEFLAGVALUE,
  3298. &TestSimpleFlags32_AssignFlagsByMask, // OSF32_ASSIGNFLAGSBYMASK,
  3299. &TestSimpleFlags32_AlterFlagsByMask, // OSF32_ALTERFLAGSBYMASK,
  3300. &TestSimpleFlags32_GetFlagsMaskValue, // OSF32_GETFLAGSMASKVALUE,
  3301. &TestSimpleFlags32_QueryFlagsByMask, // OSF32_QUERYFLAGSBYMASK,
  3302. &TestSimpleFlags32_OnlySignalSingleFlagOutOfMask, // OSF32_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  3303. &TestSimpleFlags32_EnumSetEnumeratedFlagValue, // OSF32_ENUMSETENUMERATEDFLAGVALUE,
  3304. &TestSimpleFlags32_EnumSignalEnumeratedFlagValue, // OSF32_ENUMSIGNALENUMERATEDFLAGVALUE,
  3305. &TestSimpleFlags32_EnumDropEnumeratedFlagValue, // OSF32_ENUMDROPENUMERATEDFLAGVALUE,
  3306. &TestSimpleFlags32_EnumToggleEnumeratedFlagValue, // OSF32_ENUMTOGGLEENUMERATEDFLAGVALUE,
  3307. &TestSimpleFlags32_EnumModifyEnumeratedFlagValue, // OSF32_ENUMMODIFYENUMERATEDFLAGVALUE,
  3308. &TestSimpleFlags32_EnumSignalFirstEnumeratedFlagValue, // OSF32_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  3309. &TestSimpleFlags32_EnumSignalLastEnumeratedFlagValue, // OSF32_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  3310. &TestSimpleFlags32_EnumGetEnumeratedFlagValue, // OSF32_ENUMGETENUMERATEDFLAGVALUE,
  3311. &TestSimpleFlags32_EnumFindFirstEnumeratedFlag, // OSF32_ENUMFINDFIRSTENUMERATEDFLAG,
  3312. &TestSimpleFlags32_EnumAllSignalEnumeratedFlags, // OSF32_ENUMALLSIGNALENUMERATEDFLAGS,
  3313. &TestSimpleFlags32_EnumAllDropEnumeratedFlags, // OSF32_ENUMALLDROPENUMERATEDFLAGS,
  3314. &TestSimpleFlags32_EnumAllQueryEnumeratedFlags, // OSF32_ENUMALLQUERYENUMERATEDFLAGS,
  3315. &TestSimpleFlags32_EnumAnyGetEnumeratedFlagValue, // OSF32_ENUMANYGETENUMERATEDFLAGVALUE,
  3316. &TestSimpleFlags32_StoreFlagsEnumeratedValue, // OSF32_STOREFLAGSENUMERATEDVALUE,
  3317. &TestSimpleFlags32_RetrieveFlagsEnumeratedValue, // OSF32_RETRIEVEFLAGSENUMERATEDVALUE,
  3318. };
  3319. static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE32, OSF32__MAX, CFeatureTestProcedure> g_afnSimpleFlags32FeatureTestProcedures;
  3320. template<>
  3321. const char *const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE32, OSF32__MAX, const char *>::m_aetElementArray[] =
  3322. {
  3323. "Constructors", // OSF32_CONSTRUCTORS
  3324. "AssignFlagsAllValues", // OSF32_ASSIGNFLAGSALLVALUES,
  3325. "QueryFlagsAllValues", // OSF32_QUERYFLAGSALLVALUES,
  3326. "SetFlagsMaskValue", // OSF32_SETFLAGSMASKVALUE,
  3327. "SignalFlagsMaskValue", // OSF32_SIGNALFLAGSMASKVALUE,
  3328. "DropFlagsMaskValue", // OSF32_DROPFLAGSMASKVALUE,
  3329. "ToggleSingleFlagValue", // OSF32_TOGGLESINGLEFLAGVALUE,
  3330. "ModifySingleFlagValue", // OSF32_MODIFYSINGLEFLAGVALUE,
  3331. "AssignFlagsByMask", // OSF32_ASSIGNFLAGSBYMASK,
  3332. "AlterFlagsByMask", // OSF32_ALTERFLAGSBYMASK,
  3333. "GetFlagsMaskValue", // OSF32_GETFLAGSMASKVALUE,
  3334. "QueryFlagsByMask", // OSF32_QUERYFLAGSBYMASK,
  3335. "OnlySignalSingleFlagOutOfMask", // OSF32_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  3336. "EnumSetEnumeratedFlagValue", // OSF32_ENUMSETENUMERATEDFLAGVALUE,
  3337. "EnumSignalEnumeratedFlagValue", // OSF32_ENUMSIGNALENUMERATEDFLAGVALUE,
  3338. "EnumDropEnumeratedFlagValue", // OSF32_ENUMDROPENUMERATEDFLAGVALUE,
  3339. "EnumToggleEnumeratedFlagValue", // OSF32_ENUMTOGGLEENUMERATEDFLAGVALUE,
  3340. "EnumModifyEnumeratedFlagValue", // OSF32_ENUMMODIFYENUMERATEDFLAGVALUE,
  3341. "EnumSignalFirstEnumeratedFlagValue", // OSF32_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  3342. "EnumSignalLastEnumeratedFlagValue", // OSF32_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  3343. "EnumGetEnumeratedFlagValue", // OSF32_ENUMGETENUMERATEDFLAGVALUE,
  3344. "EnumFindFirstEnumeratedFlag", // OSF32_ENUMFINDFIRSTENUMERATEDFLAG,
  3345. "EnumAllSignalEnumeratedFlags", // OSF32_ENUMALLSIGNALENUMERATEDFLAGS,
  3346. "EnumAllDropEnumeratedFlags", // OSF32_ENUMALLDROPENUMERATEDFLAGS,
  3347. "EnumAllQueryEnumeratedFlags", // OSF32_ENUMALLQUERYENUMERATEDFLAGS,
  3348. "EnumAnyGetEnumeratedFlagValue", // OSF32_ENUMANYGETENUMERATEDFLAGVALUE,
  3349. "StoreFlagsEnumeratedValue", // OSF32_STOREFLAGSENUMERATEDVALUE,
  3350. "RetrieveFlagsEnumeratedValue", // OSF32_RETRIEVEFLAGSENUMERATEDVALUE,
  3351. };
  3352. static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE32, OSF32__MAX, const char *> g_aszSimpleFlags32FeatureTestNames;
  3353. bool TestSimpleFlags32(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  3354. {
  3355. return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF32__MAX, g_aszSimpleFlags32FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags32FeatureTestProcedures.GetStoragePointer());
  3356. }
  3357. //////////////////////////////////////////////////////////////////////////
  3358. typedef CSimpleFlagsTemplate<uint16ou> CSimpleFlags16;
  3359. const uint16ou g_uiTestValue16 = (uint16ou)0xA5A5;
  3360. const uint16ou g_uiTestMask16 = (uint16ou)0xC6C6;
  3361. const uint16ou g_uiTestBit16 = (uint16ou)OU_INT16_MIN;
  3362. const uint16ou g_uiTestAnotherBit16 = (uint16ou)((uint16ou)OU_INT16_MIN >> 1);
  3363. bool TestSimpleFlags16_Constructors()
  3364. {
  3365. bool bResult = false;
  3366. do
  3367. {
  3368. if (sizeof(CSimpleFlags16::value_type) != sizeof(uint16ou) || sizeof(CSimpleFlags16) != sizeof(uint16ou))
  3369. {
  3370. break;
  3371. }
  3372. CSimpleFlags16 sfEmptyFlags;
  3373. if (sfEmptyFlags.QueryFlagsAllValues())
  3374. {
  3375. break;
  3376. }
  3377. CSimpleFlags16 sfFullFlags(OU_UINT16_MAX);
  3378. if (sfFullFlags.QueryFlagsAllValues() != OU_UINT16_MAX)
  3379. {
  3380. break;
  3381. }
  3382. CSimpleFlags16 sfCopyOfFullFlags(sfFullFlags);
  3383. if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT16_MAX)
  3384. {
  3385. break;
  3386. }
  3387. bResult = true;
  3388. }
  3389. while (false);
  3390. return bResult;
  3391. }
  3392. bool TestSimpleFlags16_AssignFlagsAllValues()
  3393. {
  3394. bool bResult = false;
  3395. do
  3396. {
  3397. CSimpleFlags16 sfTestFlags;
  3398. sfTestFlags.AssignFlagsAllValues(OU_UINT16_MAX);
  3399. if (sfTestFlags.QueryFlagsAllValues() != OU_UINT16_MAX)
  3400. {
  3401. break;
  3402. }
  3403. sfTestFlags.AssignFlagsAllValues(0);
  3404. if (sfTestFlags.QueryFlagsAllValues() != 0)
  3405. {
  3406. break;
  3407. }
  3408. bResult = true;
  3409. }
  3410. while (false);
  3411. return bResult;
  3412. }
  3413. bool TestSimpleFlags16_QueryFlagsAllValues()
  3414. {
  3415. bool bResult = false;
  3416. do
  3417. {
  3418. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3419. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16)
  3420. {
  3421. break;
  3422. }
  3423. // Double check to be sure ;-)
  3424. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16)
  3425. {
  3426. break;
  3427. }
  3428. bResult = true;
  3429. }
  3430. while (false);
  3431. return bResult;
  3432. }
  3433. bool TestSimpleFlags16_SetFlagsMaskValue()
  3434. {
  3435. bool bResult = false;
  3436. do
  3437. {
  3438. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3439. sfTestFlags.SetFlagsMaskValue(g_uiTestMask16, true);
  3440. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 | g_uiTestMask16))
  3441. {
  3442. break;
  3443. }
  3444. sfTestFlags.SetFlagsMaskValue(g_uiTestValue16, false);
  3445. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(~g_uiTestValue16 & g_uiTestMask16))
  3446. {
  3447. break;
  3448. }
  3449. bResult = true;
  3450. }
  3451. while (false);
  3452. return bResult;
  3453. }
  3454. bool TestSimpleFlags16_SignalFlagsMaskValue()
  3455. {
  3456. bool bResult = false;
  3457. do
  3458. {
  3459. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3460. sfTestFlags.SignalFlagsMaskValue(g_uiTestMask16);
  3461. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 | g_uiTestMask16))
  3462. {
  3463. break;
  3464. }
  3465. bResult = true;
  3466. }
  3467. while (false);
  3468. return bResult;
  3469. }
  3470. bool TestSimpleFlags16_DropFlagsMaskValue()
  3471. {
  3472. bool bResult = false;
  3473. do
  3474. {
  3475. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3476. sfTestFlags.DropFlagsMaskValue(g_uiTestMask16);
  3477. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 & ~g_uiTestMask16))
  3478. {
  3479. break;
  3480. }
  3481. bResult = true;
  3482. }
  3483. while (false);
  3484. return bResult;
  3485. }
  3486. bool TestSimpleFlags16_ToggleSingleFlagValue()
  3487. {
  3488. bool bResult = false;
  3489. do
  3490. {
  3491. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3492. bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit16);
  3493. if (bPreviousValue != ((g_uiTestValue16 & g_uiTestBit16) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 ^ g_uiTestBit16))
  3494. {
  3495. break;
  3496. }
  3497. bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit16);
  3498. if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16)
  3499. {
  3500. break;
  3501. }
  3502. bResult = true;
  3503. }
  3504. while (false);
  3505. return bResult;
  3506. }
  3507. bool TestSimpleFlags16_ModifySingleFlagValue()
  3508. {
  3509. bool bResult = false;
  3510. do
  3511. {
  3512. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3513. bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit16, true);
  3514. if (bFirstModification != ((g_uiTestValue16 & g_uiTestBit16) != g_uiTestBit16) || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 | g_uiTestBit16))
  3515. {
  3516. break;
  3517. }
  3518. bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit16, bFirstModification);
  3519. if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint16ou)(g_uiTestValue16 | g_uiTestBit16) : (uint16ou)(g_uiTestValue16 & ~g_uiTestBit16)))
  3520. {
  3521. break;
  3522. }
  3523. bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit16, bAnotherModification);
  3524. if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint16ou)(g_uiTestValue16 | g_uiTestBit16) : (uint16ou)(g_uiTestValue16 & ~g_uiTestBit16)))
  3525. {
  3526. break;
  3527. }
  3528. bResult = true;
  3529. }
  3530. while (false);
  3531. return bResult;
  3532. }
  3533. bool TestSimpleFlags16_AssignFlagsByMask()
  3534. {
  3535. bool bResult = false;
  3536. do
  3537. {
  3538. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3539. uint16ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask16, g_uiTestMask16);
  3540. const uint16ou uiNewFlags = (g_uiTestValue16 & ~g_uiTestMask16) | g_uiTestMask16;
  3541. if (uiPreviousFlags != g_uiTestValue16 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
  3542. {
  3543. break;
  3544. }
  3545. uint16ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue16, 0);
  3546. const uint16ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue16;
  3547. if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  3548. {
  3549. break;
  3550. }
  3551. uint16ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask16, g_uiTestMask16 & g_uiTestValue16);
  3552. OU_ASSERT((g_uiTestMask16 & g_uiTestValue16) != 0); // Test degeneration
  3553. const uint16ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask16) | (g_uiTestMask16 & g_uiTestValue16);
  3554. OU_ASSERT(uiYetAnotherNewFlags != OU_UINT16_MAX); // Test degeneration
  3555. if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
  3556. {
  3557. break;
  3558. }
  3559. bResult = true;
  3560. }
  3561. while (false);
  3562. return bResult;
  3563. }
  3564. bool TestSimpleFlags16_AlterFlagsByMask()
  3565. {
  3566. bool bResult = false;
  3567. do
  3568. {
  3569. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3570. bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask16, g_uiTestMask16);
  3571. const uint16ou uiNewFlags = (g_uiTestValue16 & ~g_uiTestMask16) | g_uiTestMask16;
  3572. if (bWasModification != ((g_uiTestValue16 & g_uiTestMask16) != g_uiTestMask16) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
  3573. {
  3574. break;
  3575. }
  3576. bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue16, 0);
  3577. const uint16ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue16;
  3578. if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue16) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  3579. {
  3580. break;
  3581. }
  3582. bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue16, 0);
  3583. if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  3584. {
  3585. break;
  3586. }
  3587. bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask16, g_uiTestMask16 & g_uiTestValue16);
  3588. OU_ASSERT((g_uiTestMask16 & g_uiTestValue16) != 0); // Test degeneration
  3589. const uint16ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask16) | (g_uiTestMask16 & g_uiTestValue16);
  3590. OU_ASSERT(uiYetAnotherNewFlags != OU_UINT16_MAX); // Test degeneration
  3591. if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask16) != (g_uiTestMask16 & g_uiTestValue16)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
  3592. {
  3593. break;
  3594. }
  3595. bResult = true;
  3596. }
  3597. while (false);
  3598. return bResult;
  3599. }
  3600. bool TestSimpleFlags16_GetFlagsMaskValue()
  3601. {
  3602. bool bResult = false;
  3603. do
  3604. {
  3605. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3606. if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask16) != ((g_uiTestValue16 & g_uiTestMask16) != 0))
  3607. {
  3608. break;
  3609. }
  3610. if (sfTestFlags.GetFlagsMaskValue((uint16ou)(~g_uiTestValue16)))
  3611. {
  3612. break;
  3613. }
  3614. if (!sfTestFlags.GetFlagsMaskValue(OU_UINT16_MAX))
  3615. {
  3616. break;
  3617. }
  3618. bResult = true;
  3619. }
  3620. while (false);
  3621. return bResult;
  3622. }
  3623. bool TestSimpleFlags16_QueryFlagsByMask()
  3624. {
  3625. bool bResult = false;
  3626. do
  3627. {
  3628. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3629. if (sfTestFlags.QueryFlagsByMask(g_uiTestMask16) != (uint16ou)(g_uiTestValue16 & g_uiTestMask16))
  3630. {
  3631. break;
  3632. }
  3633. if (sfTestFlags.QueryFlagsByMask(0))
  3634. {
  3635. break;
  3636. }
  3637. if (sfTestFlags.QueryFlagsByMask(OU_UINT16_MAX) != g_uiTestValue16)
  3638. {
  3639. break;
  3640. }
  3641. bResult = true;
  3642. }
  3643. while (false);
  3644. return bResult;
  3645. }
  3646. bool TestSimpleFlags16_OnlySignalSingleFlagOutOfMask()
  3647. {
  3648. bool bResult = false;
  3649. do
  3650. {
  3651. CSimpleFlags16 sfTestFlags(g_uiTestValue16);
  3652. OU_ASSERT(g_uiTestValue16 != 0); // Test degeneration
  3653. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT16_MAX, g_uiTestBit16))
  3654. {
  3655. break;
  3656. }
  3657. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16)
  3658. {
  3659. break;
  3660. }
  3661. sfTestFlags.AssignFlagsAllValues(0);
  3662. if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit16, g_uiTestBit16))
  3663. {
  3664. break;
  3665. }
  3666. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit16)
  3667. {
  3668. break;
  3669. }
  3670. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit16, g_uiTestBit16))
  3671. {
  3672. break;
  3673. }
  3674. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit16)
  3675. {
  3676. break;
  3677. }
  3678. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT16_MAX, g_uiTestAnotherBit16))
  3679. {
  3680. break;
  3681. }
  3682. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit16)
  3683. {
  3684. break;
  3685. }
  3686. bResult = true;
  3687. }
  3688. while (false);
  3689. return bResult;
  3690. }
  3691. bool TestSimpleFlags16_EnumSetEnumeratedFlagValue()
  3692. {
  3693. bool bResult = false;
  3694. do
  3695. {
  3696. CSimpleFlags16 sfTestFlags;
  3697. sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT16_BITS, true);
  3698. if (sfTestFlags.QueryFlagsAllValues() != 1)
  3699. {
  3700. break;
  3701. }
  3702. sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, true);
  3703. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
  3704. {
  3705. break;
  3706. }
  3707. sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT16_BITS, false);
  3708. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)OU_INT16_MIN)
  3709. {
  3710. break;
  3711. }
  3712. sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, false);
  3713. if (sfTestFlags.QueryFlagsAllValues() != 0)
  3714. {
  3715. break;
  3716. }
  3717. bResult = true;
  3718. }
  3719. while (false);
  3720. return bResult;
  3721. }
  3722. bool TestSimpleFlags16_EnumSignalEnumeratedFlagValue()
  3723. {
  3724. bool bResult = false;
  3725. do
  3726. {
  3727. CSimpleFlags16 sfTestFlags;
  3728. sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
  3729. if (sfTestFlags.QueryFlagsAllValues() != 1)
  3730. {
  3731. break;
  3732. }
  3733. sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
  3734. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
  3735. {
  3736. break;
  3737. }
  3738. sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
  3739. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
  3740. {
  3741. break;
  3742. }
  3743. sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
  3744. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
  3745. {
  3746. break;
  3747. }
  3748. bResult = true;
  3749. }
  3750. while (false);
  3751. return bResult;
  3752. }
  3753. bool TestSimpleFlags16_EnumDropEnumeratedFlagValue()
  3754. {
  3755. bool bResult = false;
  3756. do
  3757. {
  3758. CSimpleFlags16 sfTestFlags(OU_UINT16_MAX);
  3759. sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
  3760. if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT16_MAX ^ 1))
  3761. {
  3762. break;
  3763. }
  3764. sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
  3765. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)~(OU_INT16_MIN + 1))
  3766. {
  3767. break;
  3768. }
  3769. sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
  3770. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)~(OU_INT16_MIN + 1))
  3771. {
  3772. break;
  3773. }
  3774. sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
  3775. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)~(OU_INT16_MIN + 1))
  3776. {
  3777. break;
  3778. }
  3779. bResult = true;
  3780. }
  3781. while (false);
  3782. return bResult;
  3783. }
  3784. bool TestSimpleFlags16_EnumToggleEnumeratedFlagValue()
  3785. {
  3786. bool bResult = false;
  3787. do
  3788. {
  3789. CSimpleFlags16 sfTestFlags;
  3790. bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
  3791. if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3792. {
  3793. break;
  3794. }
  3795. bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
  3796. if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
  3797. {
  3798. break;
  3799. }
  3800. bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
  3801. if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)OU_INT16_MIN)
  3802. {
  3803. break;
  3804. }
  3805. bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
  3806. if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0)
  3807. {
  3808. break;
  3809. }
  3810. bResult = true;
  3811. }
  3812. while (false);
  3813. return bResult;
  3814. }
  3815. bool TestSimpleFlags16_EnumModifyEnumeratedFlagValue()
  3816. {
  3817. bool bResult = false;
  3818. do
  3819. {
  3820. CSimpleFlags16 sfTestFlags;
  3821. bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT16_BITS, true);
  3822. if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3823. {
  3824. break;
  3825. }
  3826. bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, true);
  3827. if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
  3828. {
  3829. break;
  3830. }
  3831. bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT16_BITS, true);
  3832. if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
  3833. {
  3834. break;
  3835. }
  3836. bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, true);
  3837. if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1))
  3838. {
  3839. break;
  3840. }
  3841. bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT16_BITS, false);
  3842. if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)OU_INT16_MIN)
  3843. {
  3844. break;
  3845. }
  3846. bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, false);
  3847. if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0)
  3848. {
  3849. break;
  3850. }
  3851. bResult = true;
  3852. }
  3853. while (false);
  3854. return bResult;
  3855. }
  3856. bool TestSimpleFlags16_EnumSignalFirstEnumeratedFlagValue()
  3857. {
  3858. bool bResult = false;
  3859. do
  3860. {
  3861. CSimpleFlags16 sfTestFlags;
  3862. bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
  3863. if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3864. {
  3865. break;
  3866. }
  3867. bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT16_BITS);
  3868. if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3869. {
  3870. break;
  3871. }
  3872. bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT16_BITS - 1);
  3873. if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
  3874. {
  3875. break;
  3876. }
  3877. bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
  3878. if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 3))
  3879. {
  3880. break;
  3881. }
  3882. bResult = true;
  3883. }
  3884. while (false);
  3885. return bResult;
  3886. }
  3887. bool TestSimpleFlags16_EnumSignalLastEnumeratedFlagValue()
  3888. {
  3889. bool bResult = false;
  3890. do
  3891. {
  3892. CSimpleFlags16 sfTestFlags;
  3893. bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  3894. if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3895. {
  3896. break;
  3897. }
  3898. bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  3899. if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
  3900. {
  3901. break;
  3902. }
  3903. bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
  3904. if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
  3905. {
  3906. break;
  3907. }
  3908. bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS);
  3909. if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 3))
  3910. {
  3911. break;
  3912. }
  3913. bResult = true;
  3914. }
  3915. while (false);
  3916. return bResult;
  3917. }
  3918. bool TestSimpleFlags16_EnumGetEnumeratedFlagValue()
  3919. {
  3920. bool bResult = false;
  3921. do
  3922. {
  3923. CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
  3924. if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT16_BITS))
  3925. {
  3926. break;
  3927. }
  3928. if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT16_BITS - 1))
  3929. {
  3930. break;
  3931. }
  3932. if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT16_BITS - 1))
  3933. {
  3934. break;
  3935. }
  3936. if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS))
  3937. {
  3938. break;
  3939. }
  3940. bResult = true;
  3941. }
  3942. while (false);
  3943. return bResult;
  3944. }
  3945. bool TestSimpleFlags16_EnumFindFirstEnumeratedFlag()
  3946. {
  3947. bool bResult = false;
  3948. do
  3949. {
  3950. CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
  3951. unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT16_BITS);
  3952. if (uiFirstResult != 0)
  3953. {
  3954. break;
  3955. }
  3956. unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT16_BITS - 1);
  3957. if (uiSecondResult != OU_UINT16_BITS - 2)
  3958. {
  3959. break;
  3960. }
  3961. bResult = true;
  3962. }
  3963. while (false);
  3964. return bResult;
  3965. }
  3966. bool TestSimpleFlags16_EnumAllSignalEnumeratedFlags()
  3967. {
  3968. bool bResult = false;
  3969. do
  3970. {
  3971. CSimpleFlags16 sfTestFlags;
  3972. sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
  3973. if (sfTestFlags.QueryFlagsAllValues() != 1)
  3974. {
  3975. break;
  3976. }
  3977. sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT16_BITS - 2);
  3978. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_UINT16_MAX ^ 2))
  3979. {
  3980. break;
  3981. }
  3982. bResult = true;
  3983. }
  3984. while (false);
  3985. return bResult;
  3986. }
  3987. bool TestSimpleFlags16_EnumAllDropEnumeratedFlags()
  3988. {
  3989. bool bResult = false;
  3990. do
  3991. {
  3992. CSimpleFlags16 sfTestFlags(OU_UINT16_MAX);
  3993. sfTestFlags.EnumAllDropEnumeratedFlags(1, 1);
  3994. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_UINT16_MAX ^ 1))
  3995. {
  3996. break;
  3997. }
  3998. sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT16_BITS - 2);
  3999. if (sfTestFlags.QueryFlagsAllValues() != 2)
  4000. {
  4001. break;
  4002. }
  4003. bResult = true;
  4004. }
  4005. while (false);
  4006. return bResult;
  4007. }
  4008. bool TestSimpleFlags16_EnumAllQueryEnumeratedFlags()
  4009. {
  4010. bool bResult = false;
  4011. do
  4012. {
  4013. CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
  4014. uint16ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT16_BITS);
  4015. if (uiFirstResult != (uint16ou)(OU_INT16_MIN + 1))
  4016. {
  4017. break;
  4018. }
  4019. uint16ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT16_BITS - 1);
  4020. if (uiSecondResult != (uint16ou)(OU_INT16_MIN))
  4021. {
  4022. break;
  4023. }
  4024. uint16ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT16_BITS - 2);
  4025. if (uiThirdResult != 0)
  4026. {
  4027. break;
  4028. }
  4029. bResult = true;
  4030. }
  4031. while (false);
  4032. return bResult;
  4033. }
  4034. bool TestSimpleFlags16_EnumAnyGetEnumeratedFlagValue()
  4035. {
  4036. bool bResult = false;
  4037. do
  4038. {
  4039. CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
  4040. bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT16_BITS);
  4041. if (!bFirstResult)
  4042. {
  4043. break;
  4044. }
  4045. bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT16_BITS - 1);
  4046. if (!bSecondResult)
  4047. {
  4048. break;
  4049. }
  4050. bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT16_BITS - 2);
  4051. if (bThirdResult)
  4052. {
  4053. break;
  4054. }
  4055. bResult = true;
  4056. }
  4057. while (false);
  4058. return bResult;
  4059. }
  4060. bool TestSimpleFlags16_StoreFlagsEnumeratedValue()
  4061. {
  4062. bool bResult = false;
  4063. do
  4064. {
  4065. CSimpleFlags16 sfTestFlags;
  4066. sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
  4067. if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(2 << 1))
  4068. {
  4069. break;
  4070. }
  4071. sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT16_BITS - 2, 3);
  4072. if (sfTestFlags.QueryFlagsAllValues() != ((uint16ou)(2 << 1) | (uint16ou)(OU_INT16_MIN | (OU_INT16_MIN >> 1))))
  4073. {
  4074. break;
  4075. }
  4076. bResult = true;
  4077. }
  4078. while (false);
  4079. return bResult;
  4080. }
  4081. bool TestSimpleFlags16_RetrieveFlagsEnumeratedValue()
  4082. {
  4083. bool bResult = false;
  4084. do
  4085. {
  4086. CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1));
  4087. unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
  4088. if (uiFirstResult != 0)
  4089. {
  4090. break;
  4091. }
  4092. unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT16_BITS - 2);
  4093. if (uiSecondResult != 2)
  4094. {
  4095. break;
  4096. }
  4097. bResult = true;
  4098. }
  4099. while (false);
  4100. return bResult;
  4101. }
  4102. enum EOUSIMPLEFLAGSFEATURE16
  4103. {
  4104. OSF16__MIN,
  4105. OSF16_CONSTRUCTORS = OSF16__MIN,
  4106. OSF16_ASSIGNFLAGSALLVALUES,
  4107. OSF16_QUERYFLAGSALLVALUES,
  4108. OSF16_SETFLAGSMASKVALUE,
  4109. OSF16_SIGNALFLAGSMASKVALUE,
  4110. OSF16_DROPFLAGSMASKVALUE,
  4111. OSF16_TOGGLESINGLEFLAGVALUE,
  4112. OSF16_MODIFYSINGLEFLAGVALUE,
  4113. OSF16_ASSIGNFLAGSBYMASK,
  4114. OSF16_ALTERFLAGSBYMASK,
  4115. OSF16_GETFLAGSMASKVALUE,
  4116. OSF16_QUERYFLAGSBYMASK,
  4117. OSF16_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  4118. OSF16_ENUMSETENUMERATEDFLAGVALUE,
  4119. OSF16_ENUMSIGNALENUMERATEDFLAGVALUE,
  4120. OSF16_ENUMDROPENUMERATEDFLAGVALUE,
  4121. OSF16_ENUMTOGGLEENUMERATEDFLAGVALUE,
  4122. OSF16_ENUMMODIFYENUMERATEDFLAGVALUE,
  4123. OSF16_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  4124. OSF16_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  4125. OSF16_ENUMGETENUMERATEDFLAGVALUE,
  4126. OSF16_ENUMFINDFIRSTENUMERATEDFLAG,
  4127. OSF16_ENUMALLSIGNALENUMERATEDFLAGS,
  4128. OSF16_ENUMALLDROPENUMERATEDFLAGS,
  4129. OSF16_ENUMALLQUERYENUMERATEDFLAGS,
  4130. OSF16_ENUMANYGETENUMERATEDFLAGVALUE,
  4131. OSF16_STOREFLAGSENUMERATEDVALUE,
  4132. OSF16_RETRIEVEFLAGSENUMERATEDVALUE,
  4133. OSF16__MAX,
  4134. };
  4135. template<>
  4136. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE16, OSF16__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  4137. {
  4138. &TestSimpleFlags16_Constructors, // OSF16_CONSTRUCTORS
  4139. &TestSimpleFlags16_AssignFlagsAllValues, // OSF16_ASSIGNFLAGSALLVALUES,
  4140. &TestSimpleFlags16_QueryFlagsAllValues, // OSF16_QUERYFLAGSALLVALUES,
  4141. &TestSimpleFlags16_SetFlagsMaskValue, // OSF16_SETFLAGSMASKVALUE,
  4142. &TestSimpleFlags16_SignalFlagsMaskValue, // OSF16_SIGNALFLAGSMASKVALUE,
  4143. &TestSimpleFlags16_DropFlagsMaskValue, // OSF16_DROPFLAGSMASKVALUE,
  4144. &TestSimpleFlags16_ToggleSingleFlagValue, // OSF16_TOGGLESINGLEFLAGVALUE,
  4145. &TestSimpleFlags16_ModifySingleFlagValue, // OSF16_MODIFYSINGLEFLAGVALUE,
  4146. &TestSimpleFlags16_AssignFlagsByMask, // OSF16_ASSIGNFLAGSBYMASK,
  4147. &TestSimpleFlags16_AlterFlagsByMask, // OSF16_ALTERFLAGSBYMASK,
  4148. &TestSimpleFlags16_GetFlagsMaskValue, // OSF16_GETFLAGSMASKVALUE,
  4149. &TestSimpleFlags16_QueryFlagsByMask, // OSF16_QUERYFLAGSBYMASK,
  4150. &TestSimpleFlags16_OnlySignalSingleFlagOutOfMask, // OSF16_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  4151. &TestSimpleFlags16_EnumSetEnumeratedFlagValue, // OSF16_ENUMSETENUMERATEDFLAGVALUE,
  4152. &TestSimpleFlags16_EnumSignalEnumeratedFlagValue, // OSF16_ENUMSIGNALENUMERATEDFLAGVALUE,
  4153. &TestSimpleFlags16_EnumDropEnumeratedFlagValue, // OSF16_ENUMDROPENUMERATEDFLAGVALUE,
  4154. &TestSimpleFlags16_EnumToggleEnumeratedFlagValue, // OSF16_ENUMTOGGLEENUMERATEDFLAGVALUE,
  4155. &TestSimpleFlags16_EnumModifyEnumeratedFlagValue, // OSF16_ENUMMODIFYENUMERATEDFLAGVALUE,
  4156. &TestSimpleFlags16_EnumSignalFirstEnumeratedFlagValue, // OSF16_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  4157. &TestSimpleFlags16_EnumSignalLastEnumeratedFlagValue, // OSF16_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  4158. &TestSimpleFlags16_EnumGetEnumeratedFlagValue, // OSF16_ENUMGETENUMERATEDFLAGVALUE,
  4159. &TestSimpleFlags16_EnumFindFirstEnumeratedFlag, // OSF16_ENUMFINDFIRSTENUMERATEDFLAG,
  4160. &TestSimpleFlags16_EnumAllSignalEnumeratedFlags, // OSF16_ENUMALLSIGNALENUMERATEDFLAGS,
  4161. &TestSimpleFlags16_EnumAllDropEnumeratedFlags, // OSF16_ENUMALLDROPENUMERATEDFLAGS,
  4162. &TestSimpleFlags16_EnumAllQueryEnumeratedFlags, // OSF16_ENUMALLQUERYENUMERATEDFLAGS,
  4163. &TestSimpleFlags16_EnumAnyGetEnumeratedFlagValue, // OSF16_ENUMANYGETENUMERATEDFLAGVALUE,
  4164. &TestSimpleFlags16_StoreFlagsEnumeratedValue, // OSF16_STOREFLAGSENUMERATEDVALUE,
  4165. &TestSimpleFlags16_RetrieveFlagsEnumeratedValue, // OSF16_RETRIEVEFLAGSENUMERATEDVALUE,
  4166. };
  4167. static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE16, OSF16__MAX, CFeatureTestProcedure> g_afnSimpleFlags16FeatureTestProcedures;
  4168. template<>
  4169. const char *const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE16, OSF16__MAX, const char *>::m_aetElementArray[] =
  4170. {
  4171. "Constructors", // OSF16_CONSTRUCTORS
  4172. "AssignFlagsAllValues", // OSF16_ASSIGNFLAGSALLVALUES,
  4173. "QueryFlagsAllValues", // OSF16_QUERYFLAGSALLVALUES,
  4174. "SetFlagsMaskValue", // OSF16_SETFLAGSMASKVALUE,
  4175. "SignalFlagsMaskValue", // OSF16_SIGNALFLAGSMASKVALUE,
  4176. "DropFlagsMaskValue", // OSF16_DROPFLAGSMASKVALUE,
  4177. "ToggleSingleFlagValue", // OSF16_TOGGLESINGLEFLAGVALUE,
  4178. "ModifySingleFlagValue", // OSF16_MODIFYSINGLEFLAGVALUE,
  4179. "AssignFlagsByMask", // OSF16_ASSIGNFLAGSBYMASK,
  4180. "AlterFlagsByMask", // OSF16_ALTERFLAGSBYMASK,
  4181. "GetFlagsMaskValue", // OSF16_GETFLAGSMASKVALUE,
  4182. "QueryFlagsByMask", // OSF16_QUERYFLAGSBYMASK,
  4183. "OnlySignalSingleFlagOutOfMask", // OSF16_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  4184. "EnumSetEnumeratedFlagValue", // OSF16_ENUMSETENUMERATEDFLAGVALUE,
  4185. "EnumSignalEnumeratedFlagValue", // OSF16_ENUMSIGNALENUMERATEDFLAGVALUE,
  4186. "EnumDropEnumeratedFlagValue", // OSF16_ENUMDROPENUMERATEDFLAGVALUE,
  4187. "EnumToggleEnumeratedFlagValue", // OSF16_ENUMTOGGLEENUMERATEDFLAGVALUE,
  4188. "EnumModifyEnumeratedFlagValue", // OSF16_ENUMMODIFYENUMERATEDFLAGVALUE,
  4189. "EnumSignalFirstEnumeratedFlagValue", // OSF16_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  4190. "EnumSignalLastEnumeratedFlagValue", // OSF16_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  4191. "EnumGetEnumeratedFlagValue", // OSF16_ENUMGETENUMERATEDFLAGVALUE,
  4192. "EnumFindFirstEnumeratedFlag", // OSF16_ENUMFINDFIRSTENUMERATEDFLAG,
  4193. "EnumAllSignalEnumeratedFlags", // OSF16_ENUMALLSIGNALENUMERATEDFLAGS,
  4194. "EnumAllDropEnumeratedFlags", // OSF16_ENUMALLDROPENUMERATEDFLAGS,
  4195. "EnumAllQueryEnumeratedFlags", // OSF16_ENUMALLQUERYENUMERATEDFLAGS,
  4196. "EnumAnyGetEnumeratedFlagValue", // OSF16_ENUMANYGETENUMERATEDFLAGVALUE,
  4197. "StoreFlagsEnumeratedValue", // OSF16_STOREFLAGSENUMERATEDVALUE,
  4198. "RetrieveFlagsEnumeratedValue", // OSF16_RETRIEVEFLAGSENUMERATEDVALUE,
  4199. };
  4200. static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE16, OSF16__MAX, const char *> g_aszSimpleFlags16FeatureTestNames;
  4201. bool TestSimpleFlags16(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  4202. {
  4203. return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF16__MAX, g_aszSimpleFlags16FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags16FeatureTestProcedures.GetStoragePointer());
  4204. }
  4205. //////////////////////////////////////////////////////////////////////////
  4206. typedef CSimpleFlagsTemplate<uint8ou> CSimpleFlags8;
  4207. const uint8ou g_uiTestValue8 = (uint8ou)0xA5;
  4208. const uint8ou g_uiTestMask8 = (uint8ou)0xC6;
  4209. const uint8ou g_uiTestBit8 = (uint8ou)OU_INT8_MIN;
  4210. const uint8ou g_uiTestAnotherBit8 = (uint8ou)((uint8ou)OU_INT8_MIN >> 1);
  4211. bool TestSimpleFlags8_Constructors()
  4212. {
  4213. bool bResult = false;
  4214. do
  4215. {
  4216. if (sizeof(CSimpleFlags8::value_type) != sizeof(uint8ou) || sizeof(CSimpleFlags8) != sizeof(uint8ou))
  4217. {
  4218. break;
  4219. }
  4220. CSimpleFlags8 sfEmptyFlags;
  4221. if (sfEmptyFlags.QueryFlagsAllValues())
  4222. {
  4223. break;
  4224. }
  4225. CSimpleFlags8 sfFullFlags(OU_UINT8_MAX);
  4226. if (sfFullFlags.QueryFlagsAllValues() != OU_UINT8_MAX)
  4227. {
  4228. break;
  4229. }
  4230. CSimpleFlags8 sfCopyOfFullFlags(sfFullFlags);
  4231. if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT8_MAX)
  4232. {
  4233. break;
  4234. }
  4235. bResult = true;
  4236. }
  4237. while (false);
  4238. return bResult;
  4239. }
  4240. bool TestSimpleFlags8_AssignFlagsAllValues()
  4241. {
  4242. bool bResult = false;
  4243. do
  4244. {
  4245. CSimpleFlags8 sfTestFlags;
  4246. sfTestFlags.AssignFlagsAllValues(OU_UINT8_MAX);
  4247. if (sfTestFlags.QueryFlagsAllValues() != OU_UINT8_MAX)
  4248. {
  4249. break;
  4250. }
  4251. sfTestFlags.AssignFlagsAllValues(0);
  4252. if (sfTestFlags.QueryFlagsAllValues() != 0)
  4253. {
  4254. break;
  4255. }
  4256. bResult = true;
  4257. }
  4258. while (false);
  4259. return bResult;
  4260. }
  4261. bool TestSimpleFlags8_QueryFlagsAllValues()
  4262. {
  4263. bool bResult = false;
  4264. do
  4265. {
  4266. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4267. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8)
  4268. {
  4269. break;
  4270. }
  4271. // Double check to be sure ;-)
  4272. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8)
  4273. {
  4274. break;
  4275. }
  4276. bResult = true;
  4277. }
  4278. while (false);
  4279. return bResult;
  4280. }
  4281. bool TestSimpleFlags8_SetFlagsMaskValue()
  4282. {
  4283. bool bResult = false;
  4284. do
  4285. {
  4286. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4287. sfTestFlags.SetFlagsMaskValue(g_uiTestMask8, true);
  4288. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 | g_uiTestMask8))
  4289. {
  4290. break;
  4291. }
  4292. sfTestFlags.SetFlagsMaskValue(g_uiTestValue8, false);
  4293. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(~g_uiTestValue8 & g_uiTestMask8))
  4294. {
  4295. break;
  4296. }
  4297. bResult = true;
  4298. }
  4299. while (false);
  4300. return bResult;
  4301. }
  4302. bool TestSimpleFlags8_SignalFlagsMaskValue()
  4303. {
  4304. bool bResult = false;
  4305. do
  4306. {
  4307. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4308. sfTestFlags.SignalFlagsMaskValue(g_uiTestMask8);
  4309. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 | g_uiTestMask8))
  4310. {
  4311. break;
  4312. }
  4313. bResult = true;
  4314. }
  4315. while (false);
  4316. return bResult;
  4317. }
  4318. bool TestSimpleFlags8_DropFlagsMaskValue()
  4319. {
  4320. bool bResult = false;
  4321. do
  4322. {
  4323. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4324. sfTestFlags.DropFlagsMaskValue(g_uiTestMask8);
  4325. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 & ~g_uiTestMask8))
  4326. {
  4327. break;
  4328. }
  4329. bResult = true;
  4330. }
  4331. while (false);
  4332. return bResult;
  4333. }
  4334. bool TestSimpleFlags8_ToggleSingleFlagValue()
  4335. {
  4336. bool bResult = false;
  4337. do
  4338. {
  4339. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4340. bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit8);
  4341. if (bPreviousValue != ((g_uiTestValue8 & g_uiTestBit8) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 ^ g_uiTestBit8))
  4342. {
  4343. break;
  4344. }
  4345. bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit8);
  4346. if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8)
  4347. {
  4348. break;
  4349. }
  4350. bResult = true;
  4351. }
  4352. while (false);
  4353. return bResult;
  4354. }
  4355. bool TestSimpleFlags8_ModifySingleFlagValue()
  4356. {
  4357. bool bResult = false;
  4358. do
  4359. {
  4360. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4361. bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit8, true);
  4362. if (bFirstModification != ((g_uiTestValue8 & g_uiTestBit8) != g_uiTestBit8) || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 | g_uiTestBit8))
  4363. {
  4364. break;
  4365. }
  4366. bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit8, bFirstModification);
  4367. if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint8ou)(g_uiTestValue8 | g_uiTestBit8) : (uint8ou)(g_uiTestValue8 & ~g_uiTestBit8)))
  4368. {
  4369. break;
  4370. }
  4371. bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit8, bAnotherModification);
  4372. if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint8ou)(g_uiTestValue8 | g_uiTestBit8) : (uint8ou)(g_uiTestValue8 & ~g_uiTestBit8)))
  4373. {
  4374. break;
  4375. }
  4376. bResult = true;
  4377. }
  4378. while (false);
  4379. return bResult;
  4380. }
  4381. bool TestSimpleFlags8_AssignFlagsByMask()
  4382. {
  4383. bool bResult = false;
  4384. do
  4385. {
  4386. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4387. uint8ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask8, g_uiTestMask8);
  4388. const uint8ou uiNewFlags = (g_uiTestValue8 & ~g_uiTestMask8) | g_uiTestMask8;
  4389. if (uiPreviousFlags != g_uiTestValue8 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
  4390. {
  4391. break;
  4392. }
  4393. uint8ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue8, 0);
  4394. const uint8ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue8;
  4395. if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  4396. {
  4397. break;
  4398. }
  4399. uint8ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask8, g_uiTestMask8 & g_uiTestValue8);
  4400. OU_ASSERT((g_uiTestMask8 & g_uiTestValue8) != 0); // Test degeneration
  4401. const uint8ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask8) | (g_uiTestMask8 & g_uiTestValue8);
  4402. OU_ASSERT(uiYetAnotherNewFlags != OU_UINT8_MAX); // Test degeneration
  4403. if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
  4404. {
  4405. break;
  4406. }
  4407. bResult = true;
  4408. }
  4409. while (false);
  4410. return bResult;
  4411. }
  4412. bool TestSimpleFlags8_AlterFlagsByMask()
  4413. {
  4414. bool bResult = false;
  4415. do
  4416. {
  4417. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4418. bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask8, g_uiTestMask8);
  4419. const uint8ou uiNewFlags = (g_uiTestValue8 & ~g_uiTestMask8) | g_uiTestMask8;
  4420. if (bWasModification != ((g_uiTestValue8 & g_uiTestMask8) != g_uiTestMask8) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags)
  4421. {
  4422. break;
  4423. }
  4424. bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue8, 0);
  4425. const uint8ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue8;
  4426. if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue8) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  4427. {
  4428. break;
  4429. }
  4430. bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue8, 0);
  4431. if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags)
  4432. {
  4433. break;
  4434. }
  4435. bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask8, g_uiTestMask8 & g_uiTestValue8);
  4436. OU_ASSERT((g_uiTestMask8 & g_uiTestValue8) != 0); // Test degeneration
  4437. const uint8ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask8) | (g_uiTestMask8 & g_uiTestValue8);
  4438. OU_ASSERT(uiYetAnotherNewFlags != OU_UINT8_MAX); // Test degeneration
  4439. if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask8) != (g_uiTestMask8 & g_uiTestValue8)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags)
  4440. {
  4441. break;
  4442. }
  4443. bResult = true;
  4444. }
  4445. while (false);
  4446. return bResult;
  4447. }
  4448. bool TestSimpleFlags8_GetFlagsMaskValue()
  4449. {
  4450. bool bResult = false;
  4451. do
  4452. {
  4453. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4454. if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask8) != ((g_uiTestValue8 & g_uiTestMask8) != 0))
  4455. {
  4456. break;
  4457. }
  4458. if (sfTestFlags.GetFlagsMaskValue((uint8ou)(~g_uiTestValue8)))
  4459. {
  4460. break;
  4461. }
  4462. if (!sfTestFlags.GetFlagsMaskValue(OU_UINT8_MAX))
  4463. {
  4464. break;
  4465. }
  4466. bResult = true;
  4467. }
  4468. while (false);
  4469. return bResult;
  4470. }
  4471. bool TestSimpleFlags8_QueryFlagsByMask()
  4472. {
  4473. bool bResult = false;
  4474. do
  4475. {
  4476. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4477. if (sfTestFlags.QueryFlagsByMask(g_uiTestMask8) != (uint8ou)(g_uiTestValue8 & g_uiTestMask8))
  4478. {
  4479. break;
  4480. }
  4481. if (sfTestFlags.QueryFlagsByMask(0))
  4482. {
  4483. break;
  4484. }
  4485. if (sfTestFlags.QueryFlagsByMask(OU_UINT8_MAX) != g_uiTestValue8)
  4486. {
  4487. break;
  4488. }
  4489. bResult = true;
  4490. }
  4491. while (false);
  4492. return bResult;
  4493. }
  4494. bool TestSimpleFlags8_OnlySignalSingleFlagOutOfMask()
  4495. {
  4496. bool bResult = false;
  4497. do
  4498. {
  4499. CSimpleFlags8 sfTestFlags(g_uiTestValue8);
  4500. OU_ASSERT(g_uiTestValue8 != 0); // Test degeneration
  4501. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT8_MAX, g_uiTestBit8))
  4502. {
  4503. break;
  4504. }
  4505. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8)
  4506. {
  4507. break;
  4508. }
  4509. sfTestFlags.AssignFlagsAllValues(0);
  4510. if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit8, g_uiTestBit8))
  4511. {
  4512. break;
  4513. }
  4514. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit8)
  4515. {
  4516. break;
  4517. }
  4518. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit8, g_uiTestBit8))
  4519. {
  4520. break;
  4521. }
  4522. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit8)
  4523. {
  4524. break;
  4525. }
  4526. if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT8_MAX, g_uiTestAnotherBit8))
  4527. {
  4528. break;
  4529. }
  4530. if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit8)
  4531. {
  4532. break;
  4533. }
  4534. bResult = true;
  4535. }
  4536. while (false);
  4537. return bResult;
  4538. }
  4539. bool TestSimpleFlags8_EnumSetEnumeratedFlagValue()
  4540. {
  4541. bool bResult = false;
  4542. do
  4543. {
  4544. CSimpleFlags8 sfTestFlags;
  4545. sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT8_BITS, true);
  4546. if (sfTestFlags.QueryFlagsAllValues() != 1)
  4547. {
  4548. break;
  4549. }
  4550. sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, true);
  4551. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
  4552. {
  4553. break;
  4554. }
  4555. sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT8_BITS, false);
  4556. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)OU_INT8_MIN)
  4557. {
  4558. break;
  4559. }
  4560. sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, false);
  4561. if (sfTestFlags.QueryFlagsAllValues() != 0)
  4562. {
  4563. break;
  4564. }
  4565. bResult = true;
  4566. }
  4567. while (false);
  4568. return bResult;
  4569. }
  4570. bool TestSimpleFlags8_EnumSignalEnumeratedFlagValue()
  4571. {
  4572. bool bResult = false;
  4573. do
  4574. {
  4575. CSimpleFlags8 sfTestFlags;
  4576. sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
  4577. if (sfTestFlags.QueryFlagsAllValues() != 1)
  4578. {
  4579. break;
  4580. }
  4581. sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
  4582. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
  4583. {
  4584. break;
  4585. }
  4586. sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
  4587. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
  4588. {
  4589. break;
  4590. }
  4591. sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
  4592. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
  4593. {
  4594. break;
  4595. }
  4596. bResult = true;
  4597. }
  4598. while (false);
  4599. return bResult;
  4600. }
  4601. bool TestSimpleFlags8_EnumDropEnumeratedFlagValue()
  4602. {
  4603. bool bResult = false;
  4604. do
  4605. {
  4606. CSimpleFlags8 sfTestFlags(OU_UINT8_MAX);
  4607. sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
  4608. if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT8_MAX ^ 1))
  4609. {
  4610. break;
  4611. }
  4612. sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
  4613. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)~(OU_INT8_MIN + 1))
  4614. {
  4615. break;
  4616. }
  4617. sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
  4618. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)~(OU_INT8_MIN + 1))
  4619. {
  4620. break;
  4621. }
  4622. sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
  4623. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)~(OU_INT8_MIN + 1))
  4624. {
  4625. break;
  4626. }
  4627. bResult = true;
  4628. }
  4629. while (false);
  4630. return bResult;
  4631. }
  4632. bool TestSimpleFlags8_EnumToggleEnumeratedFlagValue()
  4633. {
  4634. bool bResult = false;
  4635. do
  4636. {
  4637. CSimpleFlags8 sfTestFlags;
  4638. bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
  4639. if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  4640. {
  4641. break;
  4642. }
  4643. bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
  4644. if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
  4645. {
  4646. break;
  4647. }
  4648. bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
  4649. if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)OU_INT8_MIN)
  4650. {
  4651. break;
  4652. }
  4653. bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
  4654. if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0)
  4655. {
  4656. break;
  4657. }
  4658. bResult = true;
  4659. }
  4660. while (false);
  4661. return bResult;
  4662. }
  4663. bool TestSimpleFlags8_EnumModifyEnumeratedFlagValue()
  4664. {
  4665. bool bResult = false;
  4666. do
  4667. {
  4668. CSimpleFlags8 sfTestFlags;
  4669. bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT8_BITS, true);
  4670. if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  4671. {
  4672. break;
  4673. }
  4674. bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, true);
  4675. if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
  4676. {
  4677. break;
  4678. }
  4679. bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT8_BITS, true);
  4680. if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
  4681. {
  4682. break;
  4683. }
  4684. bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, true);
  4685. if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1))
  4686. {
  4687. break;
  4688. }
  4689. bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT8_BITS, false);
  4690. if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)OU_INT8_MIN)
  4691. {
  4692. break;
  4693. }
  4694. bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, false);
  4695. if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0)
  4696. {
  4697. break;
  4698. }
  4699. bResult = true;
  4700. }
  4701. while (false);
  4702. return bResult;
  4703. }
  4704. bool TestSimpleFlags8_EnumSignalFirstEnumeratedFlagValue()
  4705. {
  4706. bool bResult = false;
  4707. do
  4708. {
  4709. CSimpleFlags8 sfTestFlags;
  4710. bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
  4711. if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  4712. {
  4713. break;
  4714. }
  4715. bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT8_BITS);
  4716. if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
  4717. {
  4718. break;
  4719. }
  4720. bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT8_BITS - 1);
  4721. if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
  4722. {
  4723. break;
  4724. }
  4725. bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
  4726. if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 3))
  4727. {
  4728. break;
  4729. }
  4730. bResult = true;
  4731. }
  4732. while (false);
  4733. return bResult;
  4734. }
  4735. bool TestSimpleFlags8_EnumSignalLastEnumeratedFlagValue()
  4736. {
  4737. bool bResult = false;
  4738. do
  4739. {
  4740. CSimpleFlags8 sfTestFlags;
  4741. bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  4742. if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1)
  4743. {
  4744. break;
  4745. }
  4746. bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1);
  4747. if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1)
  4748. {
  4749. break;
  4750. }
  4751. bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2);
  4752. if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3)
  4753. {
  4754. break;
  4755. }
  4756. bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS);
  4757. if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 3))
  4758. {
  4759. break;
  4760. }
  4761. bResult = true;
  4762. }
  4763. while (false);
  4764. return bResult;
  4765. }
  4766. bool TestSimpleFlags8_EnumGetEnumeratedFlagValue()
  4767. {
  4768. bool bResult = false;
  4769. do
  4770. {
  4771. CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
  4772. if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT8_BITS))
  4773. {
  4774. break;
  4775. }
  4776. if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT8_BITS - 1))
  4777. {
  4778. break;
  4779. }
  4780. if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT8_BITS - 1))
  4781. {
  4782. break;
  4783. }
  4784. if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS))
  4785. {
  4786. break;
  4787. }
  4788. bResult = true;
  4789. }
  4790. while (false);
  4791. return bResult;
  4792. }
  4793. bool TestSimpleFlags8_EnumFindFirstEnumeratedFlag()
  4794. {
  4795. bool bResult = false;
  4796. do
  4797. {
  4798. CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
  4799. unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT8_BITS);
  4800. if (uiFirstResult != 0)
  4801. {
  4802. break;
  4803. }
  4804. unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT8_BITS - 1);
  4805. if (uiSecondResult != OU_UINT8_BITS - 2)
  4806. {
  4807. break;
  4808. }
  4809. bResult = true;
  4810. }
  4811. while (false);
  4812. return bResult;
  4813. }
  4814. bool TestSimpleFlags8_EnumAllSignalEnumeratedFlags()
  4815. {
  4816. bool bResult = false;
  4817. do
  4818. {
  4819. CSimpleFlags8 sfTestFlags;
  4820. sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1);
  4821. if (sfTestFlags.QueryFlagsAllValues() != 1)
  4822. {
  4823. break;
  4824. }
  4825. sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT8_BITS - 2);
  4826. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_UINT8_MAX ^ 2))
  4827. {
  4828. break;
  4829. }
  4830. bResult = true;
  4831. }
  4832. while (false);
  4833. return bResult;
  4834. }
  4835. bool TestSimpleFlags8_EnumAllDropEnumeratedFlags()
  4836. {
  4837. bool bResult = false;
  4838. do
  4839. {
  4840. CSimpleFlags8 sfTestFlags(OU_UINT8_MAX);
  4841. sfTestFlags.EnumAllDropEnumeratedFlags(1, 1);
  4842. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_UINT8_MAX ^ 1))
  4843. {
  4844. break;
  4845. }
  4846. sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT8_BITS - 2);
  4847. if (sfTestFlags.QueryFlagsAllValues() != 2)
  4848. {
  4849. break;
  4850. }
  4851. bResult = true;
  4852. }
  4853. while (false);
  4854. return bResult;
  4855. }
  4856. bool TestSimpleFlags8_EnumAllQueryEnumeratedFlags()
  4857. {
  4858. bool bResult = false;
  4859. do
  4860. {
  4861. CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
  4862. uint8ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT8_BITS);
  4863. if (uiFirstResult != (uint8ou)(OU_INT8_MIN + 1))
  4864. {
  4865. break;
  4866. }
  4867. uint8ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT8_BITS - 1);
  4868. if (uiSecondResult != (uint8ou)(OU_INT8_MIN))
  4869. {
  4870. break;
  4871. }
  4872. uint8ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT8_BITS - 2);
  4873. if (uiThirdResult != 0)
  4874. {
  4875. break;
  4876. }
  4877. bResult = true;
  4878. }
  4879. while (false);
  4880. return bResult;
  4881. }
  4882. bool TestSimpleFlags8_EnumAnyGetEnumeratedFlagValue()
  4883. {
  4884. bool bResult = false;
  4885. do
  4886. {
  4887. CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
  4888. bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT8_BITS);
  4889. if (!bFirstResult)
  4890. {
  4891. break;
  4892. }
  4893. bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT8_BITS - 1);
  4894. if (!bSecondResult)
  4895. {
  4896. break;
  4897. }
  4898. bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT8_BITS - 2);
  4899. if (bThirdResult)
  4900. {
  4901. break;
  4902. }
  4903. bResult = true;
  4904. }
  4905. while (false);
  4906. return bResult;
  4907. }
  4908. bool TestSimpleFlags8_StoreFlagsEnumeratedValue()
  4909. {
  4910. bool bResult = false;
  4911. do
  4912. {
  4913. CSimpleFlags8 sfTestFlags;
  4914. sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2);
  4915. if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(2 << 1))
  4916. {
  4917. break;
  4918. }
  4919. sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT8_BITS - 2, 3);
  4920. if (sfTestFlags.QueryFlagsAllValues() != ((uint8ou)(2 << 1) | (uint8ou)(OU_INT8_MIN | (OU_INT8_MIN >> 1))))
  4921. {
  4922. break;
  4923. }
  4924. bResult = true;
  4925. }
  4926. while (false);
  4927. return bResult;
  4928. }
  4929. bool TestSimpleFlags8_RetrieveFlagsEnumeratedValue()
  4930. {
  4931. bool bResult = false;
  4932. do
  4933. {
  4934. CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1));
  4935. unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1);
  4936. if (uiFirstResult != 0)
  4937. {
  4938. break;
  4939. }
  4940. unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT8_BITS - 2);
  4941. if (uiSecondResult != 2)
  4942. {
  4943. break;
  4944. }
  4945. bResult = true;
  4946. }
  4947. while (false);
  4948. return bResult;
  4949. }
  4950. enum EOUSIMPLEFLAGSFEATURE8
  4951. {
  4952. OSF8__MIN,
  4953. OSF8_CONSTRUCTORS = OSF8__MIN,
  4954. OSF8_ASSIGNFLAGSALLVALUES,
  4955. OSF8_QUERYFLAGSALLVALUES,
  4956. OSF8_SETFLAGSMASKVALUE,
  4957. OSF8_SIGNALFLAGSMASKVALUE,
  4958. OSF8_DROPFLAGSMASKVALUE,
  4959. OSF8_TOGGLESINGLEFLAGVALUE,
  4960. OSF8_MODIFYSINGLEFLAGVALUE,
  4961. OSF8_ASSIGNFLAGSBYMASK,
  4962. OSF8_ALTERFLAGSBYMASK,
  4963. OSF8_GETFLAGSMASKVALUE,
  4964. OSF8_QUERYFLAGSBYMASK,
  4965. OSF8_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  4966. OSF8_ENUMSETENUMERATEDFLAGVALUE,
  4967. OSF8_ENUMSIGNALENUMERATEDFLAGVALUE,
  4968. OSF8_ENUMDROPENUMERATEDFLAGVALUE,
  4969. OSF8_ENUMTOGGLEENUMERATEDFLAGVALUE,
  4970. OSF8_ENUMMODIFYENUMERATEDFLAGVALUE,
  4971. OSF8_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  4972. OSF8_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  4973. OSF8_ENUMGETENUMERATEDFLAGVALUE,
  4974. OSF8_ENUMFINDFIRSTENUMERATEDFLAG,
  4975. OSF8_ENUMALLSIGNALENUMERATEDFLAGS,
  4976. OSF8_ENUMALLDROPENUMERATEDFLAGS,
  4977. OSF8_ENUMALLQUERYENUMERATEDFLAGS,
  4978. OSF8_ENUMANYGETENUMERATEDFLAGVALUE,
  4979. OSF8_STOREFLAGSENUMERATEDVALUE,
  4980. OSF8_RETRIEVEFLAGSENUMERATEDVALUE,
  4981. OSF8__MAX,
  4982. };
  4983. template<>
  4984. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE8, OSF8__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  4985. {
  4986. &TestSimpleFlags8_Constructors, // OSF8_CONSTRUCTORS
  4987. &TestSimpleFlags8_AssignFlagsAllValues, // OSF8_ASSIGNFLAGSALLVALUES,
  4988. &TestSimpleFlags8_QueryFlagsAllValues, // OSF8_QUERYFLAGSALLVALUES,
  4989. &TestSimpleFlags8_SetFlagsMaskValue, // OSF8_SETFLAGSMASKVALUE,
  4990. &TestSimpleFlags8_SignalFlagsMaskValue, // OSF8_SIGNALFLAGSMASKVALUE,
  4991. &TestSimpleFlags8_DropFlagsMaskValue, // OSF8_DROPFLAGSMASKVALUE,
  4992. &TestSimpleFlags8_ToggleSingleFlagValue, // OSF8_TOGGLESINGLEFLAGVALUE,
  4993. &TestSimpleFlags8_ModifySingleFlagValue, // OSF8_MODIFYSINGLEFLAGVALUE,
  4994. &TestSimpleFlags8_AssignFlagsByMask, // OSF8_ASSIGNFLAGSBYMASK,
  4995. &TestSimpleFlags8_AlterFlagsByMask, // OSF8_ALTERFLAGSBYMASK,
  4996. &TestSimpleFlags8_GetFlagsMaskValue, // OSF8_GETFLAGSMASKVALUE,
  4997. &TestSimpleFlags8_QueryFlagsByMask, // OSF8_QUERYFLAGSBYMASK,
  4998. &TestSimpleFlags8_OnlySignalSingleFlagOutOfMask, // OSF8_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  4999. &TestSimpleFlags8_EnumSetEnumeratedFlagValue, // OSF8_ENUMSETENUMERATEDFLAGVALUE,
  5000. &TestSimpleFlags8_EnumSignalEnumeratedFlagValue, // OSF8_ENUMSIGNALENUMERATEDFLAGVALUE,
  5001. &TestSimpleFlags8_EnumDropEnumeratedFlagValue, // OSF8_ENUMDROPENUMERATEDFLAGVALUE,
  5002. &TestSimpleFlags8_EnumToggleEnumeratedFlagValue, // OSF8_ENUMTOGGLEENUMERATEDFLAGVALUE,
  5003. &TestSimpleFlags8_EnumModifyEnumeratedFlagValue, // OSF8_ENUMMODIFYENUMERATEDFLAGVALUE,
  5004. &TestSimpleFlags8_EnumSignalFirstEnumeratedFlagValue, // OSF8_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  5005. &TestSimpleFlags8_EnumSignalLastEnumeratedFlagValue, // OSF8_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  5006. &TestSimpleFlags8_EnumGetEnumeratedFlagValue, // OSF8_ENUMGETENUMERATEDFLAGVALUE,
  5007. &TestSimpleFlags8_EnumFindFirstEnumeratedFlag, // OSF8_ENUMFINDFIRSTENUMERATEDFLAG,
  5008. &TestSimpleFlags8_EnumAllSignalEnumeratedFlags, // OSF8_ENUMALLSIGNALENUMERATEDFLAGS,
  5009. &TestSimpleFlags8_EnumAllDropEnumeratedFlags, // OSF8_ENUMALLDROPENUMERATEDFLAGS,
  5010. &TestSimpleFlags8_EnumAllQueryEnumeratedFlags, // OSF8_ENUMALLQUERYENUMERATEDFLAGS,
  5011. &TestSimpleFlags8_EnumAnyGetEnumeratedFlagValue, // OSF8_ENUMANYGETENUMERATEDFLAGVALUE,
  5012. &TestSimpleFlags8_StoreFlagsEnumeratedValue, // OSF8_STOREFLAGSENUMERATEDVALUE,
  5013. &TestSimpleFlags8_RetrieveFlagsEnumeratedValue, // OSF8_RETRIEVEFLAGSENUMERATEDVALUE,
  5014. };
  5015. static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE8, OSF8__MAX, CFeatureTestProcedure> g_afnSimpleFlags8FeatureTestProcedures;
  5016. template<>
  5017. const char *const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE8, OSF8__MAX, const char *>::m_aetElementArray[] =
  5018. {
  5019. "Constructors", // OSF8_CONSTRUCTORS
  5020. "AssignFlagsAllValues", // OSF8_ASSIGNFLAGSALLVALUES,
  5021. "QueryFlagsAllValues", // OSF8_QUERYFLAGSALLVALUES,
  5022. "SetFlagsMaskValue", // OSF8_SETFLAGSMASKVALUE,
  5023. "SignalFlagsMaskValue", // OSF8_SIGNALFLAGSMASKVALUE,
  5024. "DropFlagsMaskValue", // OSF8_DROPFLAGSMASKVALUE,
  5025. "ToggleSingleFlagValue", // OSF8_TOGGLESINGLEFLAGVALUE,
  5026. "ModifySingleFlagValue", // OSF8_MODIFYSINGLEFLAGVALUE,
  5027. "AssignFlagsByMask", // OSF8_ASSIGNFLAGSBYMASK,
  5028. "AlterFlagsByMask", // OSF8_ALTERFLAGSBYMASK,
  5029. "GetFlagsMaskValue", // OSF8_GETFLAGSMASKVALUE,
  5030. "QueryFlagsByMask", // OSF8_QUERYFLAGSBYMASK,
  5031. "OnlySignalSingleFlagOutOfMask", // OSF8_ONLYSIGNALSINGLEFLAGOUTOFMASK,
  5032. "EnumSetEnumeratedFlagValue", // OSF8_ENUMSETENUMERATEDFLAGVALUE,
  5033. "EnumSignalEnumeratedFlagValue", // OSF8_ENUMSIGNALENUMERATEDFLAGVALUE,
  5034. "EnumDropEnumeratedFlagValue", // OSF8_ENUMDROPENUMERATEDFLAGVALUE,
  5035. "EnumToggleEnumeratedFlagValue", // OSF8_ENUMTOGGLEENUMERATEDFLAGVALUE,
  5036. "EnumModifyEnumeratedFlagValue", // OSF8_ENUMMODIFYENUMERATEDFLAGVALUE,
  5037. "EnumSignalFirstEnumeratedFlagValue", // OSF8_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE,
  5038. "EnumSignalLastEnumeratedFlagValue", // OSF8_ENUMSIGNALLASTENUMERATEDFLAGVALUE,
  5039. "EnumGetEnumeratedFlagValue", // OSF8_ENUMGETENUMERATEDFLAGVALUE,
  5040. "EnumFindFirstEnumeratedFlag", // OSF8_ENUMFINDFIRSTENUMERATEDFLAG,
  5041. "EnumAllSignalEnumeratedFlags", // OSF8_ENUMALLSIGNALENUMERATEDFLAGS,
  5042. "EnumAllDropEnumeratedFlags", // OSF8_ENUMALLDROPENUMERATEDFLAGS,
  5043. "EnumAllQueryEnumeratedFlags", // OSF8_ENUMALLQUERYENUMERATEDFLAGS,
  5044. "EnumAnyGetEnumeratedFlagValue", // OSF8_ENUMANYGETENUMERATEDFLAGVALUE,
  5045. "StoreFlagsEnumeratedValue", // OSF8_STOREFLAGSENUMERATEDVALUE,
  5046. "RetrieveFlagsEnumeratedValue", // OSF8_RETRIEVEFLAGSENUMERATEDVALUE,
  5047. };
  5048. static const CEnumUnsortedElementArray<EOUSIMPLEFLAGSFEATURE8, OSF8__MAX, const char *> g_aszSimpleFlags8FeatureTestNames;
  5049. bool TestSimpleFlags8(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  5050. {
  5051. return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF8__MAX, g_aszSimpleFlags8FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags8FeatureTestProcedures.GetStoragePointer());
  5052. }
  5053. //////////////////////////////////////////////////////////////////////////
  5054. bool TestFlagsDefines_EnumFlagsMask()
  5055. {
  5056. bool bResult = false;
  5057. do
  5058. {
  5059. int64ou iMask;
  5060. iMask = OU_FLAGS_ENUMFLAGS_MASK(uint8ou, 1, 1);
  5061. if (iMask - 1 != 0)
  5062. {
  5063. break;
  5064. }
  5065. iMask = OU_FLAGS_ENUMFLAGS_MASK(uint8ou, 1, OU_UINT8_BITS);
  5066. if (iMask ^ OU_UINT8_MAX)
  5067. {
  5068. break;
  5069. }
  5070. iMask = OU_FLAGS_ENUMFLAGS_MASK(uint16ou, 1, 1);
  5071. if (iMask - 1 != 0)
  5072. {
  5073. break;
  5074. }
  5075. iMask = OU_FLAGS_ENUMFLAGS_MASK(uint16ou, 1, OU_UINT16_BITS);
  5076. if (iMask ^ OU_UINT16_MAX)
  5077. {
  5078. break;
  5079. }
  5080. iMask = OU_FLAGS_ENUMFLAGS_MASK(uint32ou, 1, 1);
  5081. if (iMask - 1 != 0)
  5082. {
  5083. break;
  5084. }
  5085. iMask = OU_FLAGS_ENUMFLAGS_MASK(uint32ou, 1, OU_UINT32_BITS);
  5086. if (iMask ^ OU_UINT32_MAX)
  5087. {
  5088. break;
  5089. }
  5090. iMask = OU_FLAGS_ENUMFLAGS_MASK(uint64ou, 1, 1);
  5091. if (iMask - 1 != 0)
  5092. {
  5093. break;
  5094. }
  5095. iMask = OU_FLAGS_ENUMFLAGS_MASK(uint64ou, 1, OU_UINT64_BITS);
  5096. if (iMask ^ OU_UINT64_MAX)
  5097. {
  5098. break;
  5099. }
  5100. bResult = true;
  5101. }
  5102. while (false);
  5103. return bResult;
  5104. }
  5105. bool TestFlagsDefines_EnumFlagsStartValid()
  5106. {
  5107. bool bResult = false;
  5108. do
  5109. {
  5110. if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint8ou, 1, OU_UINT8_BITS))
  5111. {
  5112. break;
  5113. }
  5114. /*
  5115. if (OU_FLAGS_ENUMFLAGS_START_VALID(uint8ou, 1, OU_UINT8_BITS + 1))
  5116. {
  5117. break;
  5118. }
  5119. */
  5120. if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint16ou, 1, OU_UINT16_BITS))
  5121. {
  5122. break;
  5123. }
  5124. /*
  5125. if (OU_FLAGS_ENUMFLAGS_START_VALID(uint16ou, 1, OU_UINT16_BITS + 1))
  5126. {
  5127. break;
  5128. }
  5129. */
  5130. if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint32ou, 1, OU_UINT32_BITS))
  5131. {
  5132. break;
  5133. }
  5134. /*
  5135. if (OU_FLAGS_ENUMFLAGS_START_VALID(uint32ou, 1, OU_UINT32_BITS + 1))
  5136. {
  5137. break;
  5138. }
  5139. */
  5140. if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint64ou, 1, OU_UINT64_BITS))
  5141. {
  5142. break;
  5143. }
  5144. /*
  5145. if (OU_FLAGS_ENUMFLAGS_START_VALID(uint64ou, 1, OU_UINT64_BITS + 1))
  5146. {
  5147. break;
  5148. }
  5149. */
  5150. bResult = true;
  5151. }
  5152. while (false);
  5153. return bResult;
  5154. }
  5155. bool TestFlagsDefines_StoreEnumValueInMask()
  5156. {
  5157. bool bResult = false;
  5158. do
  5159. {
  5160. if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 1, 1))
  5161. {
  5162. break;
  5163. }
  5164. 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))
  5165. {
  5166. break;
  5167. }
  5168. if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 2, 1))
  5169. {
  5170. break;
  5171. }
  5172. if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 1, 0))
  5173. {
  5174. break;
  5175. }
  5176. if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 1, 1))
  5177. {
  5178. break;
  5179. }
  5180. 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))
  5181. {
  5182. break;
  5183. }
  5184. if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 2, 1))
  5185. {
  5186. break;
  5187. }
  5188. if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 1, 0))
  5189. {
  5190. break;
  5191. }
  5192. if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 1, 1))
  5193. {
  5194. break;
  5195. }
  5196. 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))
  5197. {
  5198. break;
  5199. }
  5200. if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 2, 1))
  5201. {
  5202. break;
  5203. }
  5204. if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 1, 0))
  5205. {
  5206. break;
  5207. }
  5208. if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 1, 1))
  5209. {
  5210. break;
  5211. }
  5212. 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))
  5213. {
  5214. break;
  5215. }
  5216. if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 2, 1))
  5217. {
  5218. break;
  5219. }
  5220. if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 1, 0))
  5221. {
  5222. break;
  5223. }
  5224. bResult = true;
  5225. }
  5226. while (false);
  5227. return bResult;
  5228. }
  5229. bool TestFlagsDefines_FlagIsSingle()
  5230. {
  5231. bool bResult = false;
  5232. do
  5233. {
  5234. if (!OU_FLAGS_FLAG_IS_SINGLE(uint8ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint8ou, OU_INT8_MIN))
  5235. {
  5236. break;
  5237. }
  5238. 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))
  5239. {
  5240. break;
  5241. }
  5242. if (!OU_FLAGS_FLAG_IS_SINGLE(uint16ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint16ou, OU_INT16_MIN))
  5243. {
  5244. break;
  5245. }
  5246. 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))
  5247. {
  5248. break;
  5249. }
  5250. if (!OU_FLAGS_FLAG_IS_SINGLE(uint32ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint32ou, OU_INT32_MIN))
  5251. {
  5252. break;
  5253. }
  5254. 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))
  5255. {
  5256. break;
  5257. }
  5258. if (!OU_FLAGS_FLAG_IS_SINGLE(uint64ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint64ou, OU_INT64_MIN))
  5259. {
  5260. break;
  5261. }
  5262. 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))
  5263. {
  5264. break;
  5265. }
  5266. bResult = true;
  5267. }
  5268. while (false);
  5269. return bResult;
  5270. }
  5271. enum EOUFLAGSDEFINESFEATURE
  5272. {
  5273. OFF__MIN,
  5274. OFF_ENUMFLAGS_MASK = OFF__MIN,
  5275. OFF_ENUMFLAGS_START_VALID,
  5276. OFF_STOREENUM_VALUE_IN_MASK,
  5277. OFF_FLAG_IS_SINGLE,
  5278. OFF__MAX,
  5279. };
  5280. template<>
  5281. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUFLAGSDEFINESFEATURE, OFF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  5282. {
  5283. &TestFlagsDefines_EnumFlagsMask, // OFF_ENUMFLAGS_MASK,
  5284. &TestFlagsDefines_EnumFlagsStartValid, // OFF_ENUMFLAGS_START_VALID,
  5285. &TestFlagsDefines_StoreEnumValueInMask, // OFF_STOREENUM_VALUE_IN_MASK,
  5286. &TestFlagsDefines_FlagIsSingle, // OFF_FLAG_IS_SINGLE,
  5287. };
  5288. static const CEnumUnsortedElementArray<EOUFLAGSDEFINESFEATURE, OFF__MAX, CFeatureTestProcedure> g_afnFlagsDefineFeatureTestProcedures;
  5289. template<>const char *const CEnumUnsortedElementArray<EOUFLAGSDEFINESFEATURE, OFF__MAX, const char *>::m_aetElementArray[] =
  5290. {
  5291. "ENUMFLAGS_MASK", // OFF_ENUMFLAGS_MASK = OFF__MIN,
  5292. "ENUMFLAGS_START_VALID", // OFF_ENUMFLAGS_START_VALID,
  5293. "STOREENUM_VALUE_IN_MASK", // OFF_STOREENUM_VALUE_IN_MASK,
  5294. "FLAG_IS_SINGLE", // OFF_FLAG_IS_SINGLE,
  5295. };
  5296. static const CEnumUnsortedElementArray<EOUFLAGSDEFINESFEATURE, OFF__MAX, const char *> g_aszFlagsDefineFeatureTestNames;
  5297. bool TestFlagsDefines(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  5298. {
  5299. return TestSubsystem(nOutSuccessCount, nOutTestCount, OFF__MAX, g_aszFlagsDefineFeatureTestNames.GetStoragePointer(), g_afnFlagsDefineFeatureTestProcedures.GetStoragePointer());
  5300. }
  5301. //////////////////////////////////////////////////////////////////////////
  5302. enum EENUMARRAYTESTENUM
  5303. {
  5304. ATE__MIN,
  5305. ATE_FIRSTELEMENT = ATE__MIN,
  5306. ATE_SECONDELEMENT,
  5307. ATE_THIRDELEMENT,
  5308. ATE__MAX,
  5309. };
  5310. template<>
  5311. const int CEnumUnsortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, int>::m_aetElementArray[] =
  5312. {
  5313. 1, // ATE_FIRSTELEMENT,
  5314. 3, // ATE_SECONDELEMENT,
  5315. 2, // ATE_THIRDELEMENT,
  5316. };
  5317. static const CEnumUnsortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, int> g_ai_IntUnsortedArray;
  5318. template<>
  5319. const int CEnumSortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, int>::m_aetElementArray[] =
  5320. {
  5321. 1, // ATE_FIRSTELEMENT,
  5322. 2, // ATE_SECONDELEMENT,
  5323. 3, // ATE_THIRDELEMENT,
  5324. };
  5325. static const CEnumSortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, int> g_ai_IntSortedArray;
  5326. struct ConstCharPtrEq
  5327. {
  5328. bool operator ()(const char *szLeftValue, const char *szRightValue) const
  5329. {
  5330. return strcmp(szLeftValue, szRightValue) == 0;
  5331. }
  5332. };
  5333. struct ConstCharPtrLess
  5334. {
  5335. bool operator ()(const char *szLeftValue, const char *szRightValue) const
  5336. {
  5337. return strcmp(szLeftValue, szRightValue) < 0;
  5338. }
  5339. };
  5340. template<>
  5341. const char *const CEnumUnsortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, const char *, 0, ConstCharPtrEq>::m_aetElementArray[] =
  5342. {
  5343. "first",
  5344. "third",
  5345. "second",
  5346. };
  5347. static const CEnumUnsortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, const char *, 0, ConstCharPtrEq> g_aszStringUnsortedArray;
  5348. template<>
  5349. const char *const CEnumSortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, const char *, 0, ConstCharPtrLess>::m_aetElementArray[] =
  5350. {
  5351. "first",
  5352. "second",
  5353. "third",
  5354. };
  5355. static const CEnumSortedElementArray<EENUMARRAYTESTENUM, ATE__MAX, const char *, 0, ConstCharPtrLess> g_aszStringSortedArray;
  5356. bool TestEnumArrays_UnsortedArray()
  5357. {
  5358. EENUMARRAYTESTENUM teEnumCurrent = ATE__MIN;
  5359. for (; teEnumCurrent != ATE__MAX; ++teEnumCurrent)
  5360. {
  5361. int iCurrentValue = g_ai_IntUnsortedArray.Encode(teEnumCurrent);
  5362. EENUMARRAYTESTENUM teIntDecodeCheck = g_ai_IntUnsortedArray.Decode(iCurrentValue);
  5363. if (!g_ai_IntUnsortedArray.IsValidDecode(teIntDecodeCheck) || teIntDecodeCheck != teEnumCurrent)
  5364. {
  5365. break;
  5366. }
  5367. if (g_ai_IntUnsortedArray.GetStoragePointer()[teEnumCurrent] != iCurrentValue)
  5368. {
  5369. break;
  5370. }
  5371. const char *szCurrentString = g_aszStringUnsortedArray.Encode(teEnumCurrent);
  5372. EENUMARRAYTESTENUM teStringDecodeCheck = g_aszStringUnsortedArray.Decode(szCurrentString);
  5373. if (!g_aszStringUnsortedArray.IsValidDecode(teStringDecodeCheck) || teStringDecodeCheck != teEnumCurrent)
  5374. {
  5375. break;
  5376. }
  5377. if (strcmp(g_aszStringUnsortedArray.GetStoragePointer()[teEnumCurrent], szCurrentString) != 0)
  5378. {
  5379. break;
  5380. }
  5381. EENUMARRAYTESTENUM teInvalidDecodeCheck = g_aszStringUnsortedArray.Decode(szCurrentString + 1);
  5382. if (teInvalidDecodeCheck != ATE__MAX || g_aszStringUnsortedArray.IsValidDecode(teInvalidDecodeCheck))
  5383. {
  5384. break;
  5385. }
  5386. }
  5387. bool bResult = teEnumCurrent == ATE__MAX;
  5388. return bResult;
  5389. }
  5390. bool TestEnumArrays_SortedArray()
  5391. {
  5392. EENUMARRAYTESTENUM teEnumCurrent = ATE__MIN;
  5393. for (; teEnumCurrent != ATE__MAX; ++teEnumCurrent)
  5394. {
  5395. int iCurrentValue = g_ai_IntSortedArray.Encode(teEnumCurrent);
  5396. EENUMARRAYTESTENUM teIntDecodeCheck = g_ai_IntSortedArray.Decode(iCurrentValue);
  5397. if (!g_ai_IntSortedArray.IsValidDecode(teIntDecodeCheck) || teIntDecodeCheck != teEnumCurrent)
  5398. {
  5399. break;
  5400. }
  5401. if (g_ai_IntSortedArray.GetStoragePointer()[teEnumCurrent] != iCurrentValue)
  5402. {
  5403. break;
  5404. }
  5405. const char *szCurrentString = g_aszStringSortedArray.Encode(teEnumCurrent);
  5406. EENUMARRAYTESTENUM teStringDecodeCheck = g_aszStringSortedArray.Decode(szCurrentString);
  5407. if (!g_aszStringSortedArray.IsValidDecode(teStringDecodeCheck) || teStringDecodeCheck != teEnumCurrent)
  5408. {
  5409. break;
  5410. }
  5411. if (strcmp(g_aszStringSortedArray.GetStoragePointer()[teEnumCurrent], szCurrentString) != 0)
  5412. {
  5413. break;
  5414. }
  5415. EENUMARRAYTESTENUM teInvalidDecodeCheck = g_aszStringSortedArray.Decode(szCurrentString + 1);
  5416. if (teInvalidDecodeCheck != ATE__MAX || g_aszStringSortedArray.IsValidDecode(teInvalidDecodeCheck))
  5417. {
  5418. break;
  5419. }
  5420. }
  5421. bool bResult = teEnumCurrent == ATE__MAX;
  5422. return bResult;
  5423. }
  5424. enum EOUENUMARRAYSFEATURE
  5425. {
  5426. ORF__MIN,
  5427. ORF_UNSORTEDARRAY = ORF__MIN,
  5428. ORF_SORTEDARRAY,
  5429. ORF__MAX,
  5430. };
  5431. template<>
  5432. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUENUMARRAYSFEATURE, ORF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  5433. {
  5434. &TestEnumArrays_UnsortedArray, // ORF_UNSORTEDARRAY,
  5435. &TestEnumArrays_SortedArray, // ORF_SORTEDARRAY,
  5436. };
  5437. static const CEnumUnsortedElementArray<EOUENUMARRAYSFEATURE, ORF__MAX, CFeatureTestProcedure> g_afnEnumArrayFeatureTestProcedures;
  5438. template<>
  5439. const char *const CEnumUnsortedElementArray<EOUENUMARRAYSFEATURE, ORF__MAX, const char *>::m_aetElementArray[] =
  5440. {
  5441. "Unsorted Array", // ORF_UNSORTEDARRAY,
  5442. "Sorted Array", // ORF_SORTEDARRAY,
  5443. };
  5444. static const CEnumUnsortedElementArray<EOUENUMARRAYSFEATURE, ORF__MAX, const char *> g_aszEnumArrayFeatureTestNames;
  5445. bool TestEnumArrays(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  5446. {
  5447. return TestSubsystem(nOutSuccessCount, nOutTestCount, ORF__MAX, g_aszEnumArrayFeatureTestNames.GetStoragePointer(), g_afnEnumArrayFeatureTestProcedures.GetStoragePointer());
  5448. }
  5449. //////////////////////////////////////////////////////////////////////////
  5450. enum ETESTTEMPLATES8
  5451. {
  5452. TT8_ONE,
  5453. TT8_TWO,
  5454. };
  5455. enum ETESTTEMPLATES16
  5456. {
  5457. TT16_ONE = 1000,
  5458. TT16_TWO,
  5459. };
  5460. enum ETESTTEMPLATES32
  5461. {
  5462. TT32_ONE = 100000,
  5463. TT32_TWO,
  5464. };
  5465. bool TestTemplates_PrefixIncrement()
  5466. {
  5467. bool bResult = false;
  5468. do
  5469. {
  5470. ETESTTEMPLATES8 t8Test = TT8_ONE;
  5471. ETESTTEMPLATES16 t16Test = TT16_ONE;
  5472. ETESTTEMPLATES32 t32Test = TT32_ONE;
  5473. if (++t8Test != TT8_TWO || t8Test != TT8_TWO)
  5474. {
  5475. break;
  5476. }
  5477. ++t8Test = TT8_ONE;
  5478. if (t8Test != TT8_ONE)
  5479. {
  5480. break;
  5481. }
  5482. if (++t16Test != TT16_TWO || t16Test != TT16_TWO)
  5483. {
  5484. break;
  5485. }
  5486. ++t16Test = TT16_ONE;
  5487. if (t16Test != TT16_ONE)
  5488. {
  5489. break;
  5490. }
  5491. if (++t32Test != TT32_TWO || t32Test != TT32_TWO)
  5492. {
  5493. break;
  5494. }
  5495. ++t32Test = TT32_ONE;
  5496. if (t32Test != TT32_ONE)
  5497. {
  5498. break;
  5499. }
  5500. bResult = true;
  5501. }
  5502. while (false);
  5503. return bResult;
  5504. }
  5505. bool TestTemplates_PostfixIncrement()
  5506. {
  5507. bool bResult = false;
  5508. do
  5509. {
  5510. ETESTTEMPLATES8 t8Test = TT8_ONE;
  5511. ETESTTEMPLATES16 t16Test = TT16_ONE;
  5512. ETESTTEMPLATES32 t32Test = TT32_ONE;
  5513. if (t8Test++ != TT8_ONE || t8Test != TT8_TWO)
  5514. {
  5515. break;
  5516. }
  5517. if (t16Test++ != TT16_ONE || t16Test != TT16_TWO)
  5518. {
  5519. break;
  5520. }
  5521. if (t32Test++ != TT32_ONE || t32Test != TT32_TWO)
  5522. {
  5523. break;
  5524. }
  5525. bResult = true;
  5526. }
  5527. while (false);
  5528. return bResult;
  5529. }
  5530. bool TestTemplates_PrefixDecrement()
  5531. {
  5532. bool bResult = false;
  5533. do
  5534. {
  5535. ETESTTEMPLATES8 t8Test = TT8_TWO;
  5536. ETESTTEMPLATES16 t16Test = TT16_TWO;
  5537. ETESTTEMPLATES32 t32Test = TT32_TWO;
  5538. if (--t8Test != TT8_ONE || t8Test != TT8_ONE)
  5539. {
  5540. break;
  5541. }
  5542. --t8Test = TT8_TWO;
  5543. if (t8Test != TT8_TWO)
  5544. {
  5545. break;
  5546. }
  5547. if (--t16Test != TT16_ONE || t16Test != TT16_ONE)
  5548. {
  5549. break;
  5550. }
  5551. --t16Test = TT16_TWO;
  5552. if (t16Test != TT16_TWO)
  5553. {
  5554. break;
  5555. }
  5556. if (--t32Test != TT32_ONE || t32Test != TT32_ONE)
  5557. {
  5558. break;
  5559. }
  5560. --t32Test = TT32_TWO;
  5561. if (t32Test != TT32_TWO)
  5562. {
  5563. break;
  5564. }
  5565. bResult = true;
  5566. }
  5567. while (false);
  5568. return bResult;
  5569. }
  5570. bool TestTemplates_PostfixDecrement()
  5571. {
  5572. bool bResult = false;
  5573. do
  5574. {
  5575. ETESTTEMPLATES8 t8Test = TT8_TWO;
  5576. ETESTTEMPLATES16 t16Test = TT16_TWO;
  5577. ETESTTEMPLATES32 t32Test = TT32_TWO;
  5578. if (t8Test-- != TT8_TWO || t8Test != TT8_ONE)
  5579. {
  5580. break;
  5581. }
  5582. if (t16Test-- != TT16_TWO || t16Test != TT16_ONE)
  5583. {
  5584. break;
  5585. }
  5586. if (t32Test-- != TT32_TWO || t32Test != TT32_ONE)
  5587. {
  5588. break;
  5589. }
  5590. bResult = true;
  5591. }
  5592. while (false);
  5593. return bResult;
  5594. }
  5595. bool TestTemplates_IsEmptySz()
  5596. {
  5597. bool bResult = false;
  5598. do
  5599. {
  5600. const char *szData = "a";
  5601. const char *szEmpty = "";
  5602. const char *szNull = NULL;
  5603. if (IsEmptySz(szData) || !IsEmptySz(szEmpty) || !IsEmptySz(szNull))
  5604. {
  5605. break;
  5606. }
  5607. bResult = true;
  5608. }
  5609. while (false);
  5610. return bResult;
  5611. }
  5612. enum EOUTEMPLATESFEATURE
  5613. {
  5614. OTF__MIN,
  5615. OTF_PREFIXINCREMENT = OTF__MIN,
  5616. OTF_POSTFIXINCREMENT,
  5617. OTF_PREFIXDECREMENT,
  5618. OTF_POSTFIXDECREMENT,
  5619. OTF_ISEMPTYSZ,
  5620. OTF__MAX,
  5621. };
  5622. template<>
  5623. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUTEMPLATESFEATURE, OTF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  5624. {
  5625. &TestTemplates_PrefixIncrement, // OTF_PREFIXINCREMENT,
  5626. &TestTemplates_PostfixIncrement, // OTF_POSTFIXINCREMENT,
  5627. &TestTemplates_PrefixDecrement, // OTF_PREFIXDECREMENT,
  5628. &TestTemplates_PostfixDecrement, // OTF_POSTFIXDECREMENT,
  5629. &TestTemplates_IsEmptySz, // OTF_ISEMPTYSZ,
  5630. };
  5631. static const CEnumUnsortedElementArray<EOUTEMPLATESFEATURE, OTF__MAX, CFeatureTestProcedure> g_afnTemplateFeatureTestProcedures;
  5632. template<>
  5633. const char *const CEnumUnsortedElementArray<EOUTEMPLATESFEATURE, OTF__MAX, const char *>::m_aetElementArray[] =
  5634. {
  5635. "Prefix Increment", // OTF_PREFIXINCREMENT,
  5636. "Postfix Increment", // OTF_POSTFIXINCREMENT,
  5637. "Prefix Decrement", // OTF_PREFIXDECREMENT,
  5638. "Postfix Decrement", // OTF_POSTFIXDECREMENT,
  5639. "IsEmptySz", // OTF_ISEMPTYSZ,
  5640. };
  5641. static const CEnumUnsortedElementArray<EOUTEMPLATESFEATURE, OTF__MAX, const char *> g_aszTemplateFeatureTestNames;
  5642. bool TestTemplates(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  5643. {
  5644. return TestSubsystem(nOutSuccessCount, nOutTestCount, OTF__MAX, g_aszTemplateFeatureTestNames.GetStoragePointer(), g_afnTemplateFeatureTestProcedures.GetStoragePointer());
  5645. }
  5646. //////////////////////////////////////////////////////////////////////////
  5647. typedef CTypeSimpleWrapper<int> CTestWrapper;
  5648. bool TestTypeWrappers_Constructors()
  5649. {
  5650. CTestWrapper twEmptyWrapper;
  5651. CTestWrapper twZeroWrapper(0);
  5652. CTestWrapper twCopyWrapper(twZeroWrapper);
  5653. return true;
  5654. }
  5655. bool TestTypeWrappers_Comparison()
  5656. {
  5657. bool bResult = false;
  5658. do
  5659. {
  5660. CTestWrapper twOneWrapper(1);
  5661. CTestWrapper twTwoWrapper(2);
  5662. if (!(twTwoWrapper == twTwoWrapper) || twOneWrapper == twTwoWrapper)
  5663. {
  5664. break;
  5665. }
  5666. if (twTwoWrapper != twTwoWrapper || !(twOneWrapper != twTwoWrapper))
  5667. {
  5668. break;
  5669. }
  5670. if (!(twOneWrapper < twTwoWrapper) || twTwoWrapper < twTwoWrapper || twTwoWrapper < twOneWrapper)
  5671. {
  5672. break;
  5673. }
  5674. if (twOneWrapper > twTwoWrapper || twTwoWrapper > twTwoWrapper || !(twTwoWrapper > twOneWrapper))
  5675. {
  5676. break;
  5677. }
  5678. if (!(twOneWrapper <= twTwoWrapper) || !(twTwoWrapper <= twTwoWrapper) || twTwoWrapper <= twOneWrapper)
  5679. {
  5680. break;
  5681. }
  5682. if (twOneWrapper >= twTwoWrapper || !(twTwoWrapper >= twTwoWrapper) || !(twTwoWrapper >= twOneWrapper))
  5683. {
  5684. break;
  5685. }
  5686. bResult = true;
  5687. }
  5688. while (false);
  5689. return bResult;
  5690. }
  5691. bool TestTypeWrappers_BoolCasts()
  5692. {
  5693. bool bResult = false;
  5694. do
  5695. {
  5696. CTestWrapper twZeroWrapper(0);
  5697. CTestWrapper twOneWrapper(1);
  5698. /* -- cast to bool is commented in definition
  5699. if (twZeroWrapper || !(false || twOneWrapper))
  5700. {
  5701. break;
  5702. }
  5703. */
  5704. if (!(!twZeroWrapper) || !twOneWrapper)
  5705. {
  5706. break;
  5707. }
  5708. bResult = true;
  5709. }
  5710. while (false);
  5711. return bResult;
  5712. }
  5713. bool TestTypeWrappers_Assignment()
  5714. {
  5715. bool bResult = false;
  5716. do
  5717. {
  5718. CTestWrapper twZeroWrapper(0);
  5719. CTestWrapper twOneWrapper(1);
  5720. CTestWrapper twTestWrapper;
  5721. CTestWrapper &twFirstAssignmentReference = (twTestWrapper = (CTestWrapper::value_type)1);
  5722. if (twTestWrapper != twOneWrapper || &twFirstAssignmentReference != &twTestWrapper)
  5723. {
  5724. break;
  5725. }
  5726. CTestWrapper &twSecondAssignmentReference = (twTestWrapper = twZeroWrapper);
  5727. if (twTestWrapper != twZeroWrapper || &twSecondAssignmentReference != &twTestWrapper)
  5728. {
  5729. break;
  5730. }
  5731. bResult = true;
  5732. }
  5733. while (false);
  5734. return bResult;
  5735. }
  5736. bool TestTypeWrappers_DataCast()
  5737. {
  5738. bool bResult = false;
  5739. do
  5740. {
  5741. const CTestWrapper twZeroWrapper(0);
  5742. CTestWrapper twOneWrapper(1);
  5743. const CTestWrapper::value_type &wtZeroValue = (const CTestWrapper::value_type &)twZeroWrapper;
  5744. CTestWrapper::value_type &wtOneValue = (CTestWrapper::value_type &)twOneWrapper;
  5745. if (wtZeroValue != 0 || wtOneValue != 1)
  5746. {
  5747. break;
  5748. }
  5749. wtOneValue = 0;
  5750. if (twOneWrapper != twZeroWrapper)
  5751. {
  5752. break;
  5753. }
  5754. bResult = true;
  5755. }
  5756. while (false);
  5757. return bResult;
  5758. }
  5759. bool TestTypeWrappers_DataComparison()
  5760. {
  5761. bool bResult = false;
  5762. do
  5763. {
  5764. const CTestWrapper twZeroWrapper(0);
  5765. const CTestWrapper twOneWrapper(1);
  5766. const CTestWrapper::value_type &wtZeroValue = twZeroWrapper;
  5767. const CTestWrapper::value_type &wtOneValue = twOneWrapper;
  5768. if (!(twZeroWrapper == wtZeroValue) || (twZeroWrapper == wtOneValue))
  5769. {
  5770. break;
  5771. }
  5772. if (!(wtZeroValue == twZeroWrapper) || (wtOneValue == twZeroWrapper))
  5773. {
  5774. break;
  5775. }
  5776. if ((twZeroWrapper != wtZeroValue) || !(twZeroWrapper != wtOneValue))
  5777. {
  5778. break;
  5779. }
  5780. if ((wtZeroValue != twZeroWrapper) || !(wtOneValue != twZeroWrapper))
  5781. {
  5782. break;
  5783. }
  5784. if ((twZeroWrapper < wtZeroValue) || !(twZeroWrapper < wtOneValue) || (twOneWrapper < wtZeroValue))
  5785. {
  5786. break;
  5787. }
  5788. if ((wtZeroValue < twZeroWrapper) || (wtOneValue < twZeroWrapper) || !(wtZeroValue < twOneWrapper))
  5789. {
  5790. break;
  5791. }
  5792. if ((twZeroWrapper > wtZeroValue) || (twZeroWrapper > wtOneValue) || !(twOneWrapper > wtZeroValue))
  5793. {
  5794. break;
  5795. }
  5796. if ((wtZeroValue > twZeroWrapper) || !(wtOneValue > twZeroWrapper) || (wtZeroValue > twOneWrapper))
  5797. {
  5798. break;
  5799. }
  5800. if (!(twZeroWrapper <= wtZeroValue) || !(twZeroWrapper <= wtOneValue) || (twOneWrapper <= wtZeroValue))
  5801. {
  5802. break;
  5803. }
  5804. if (!(wtZeroValue <= twZeroWrapper) || (wtOneValue <= twZeroWrapper) || !(wtZeroValue <= twOneWrapper))
  5805. {
  5806. break;
  5807. }
  5808. if (!(twZeroWrapper >= wtZeroValue) || (twZeroWrapper >= wtOneValue) || !(twOneWrapper >= wtZeroValue))
  5809. {
  5810. break;
  5811. }
  5812. if (!(wtZeroValue >= twZeroWrapper) || !(wtOneValue >= twZeroWrapper) || (wtZeroValue >= twOneWrapper))
  5813. {
  5814. break;
  5815. }
  5816. bResult = true;
  5817. }
  5818. while (false);
  5819. return bResult;
  5820. }
  5821. enum EOUTYPEWRAPPERFEATURE
  5822. {
  5823. OWF__MIN,
  5824. OWF_CONSTRUCTORS = OWF__MIN,
  5825. OWF_COMPARISON,
  5826. OWF_BOOLCASTS,
  5827. OWF_ASSIGNMENT,
  5828. OWF_DATACAST,
  5829. OWF_DATACOMPARISON,
  5830. OWF__MAX,
  5831. };
  5832. template<>
  5833. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUTYPEWRAPPERFEATURE, OWF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  5834. {
  5835. &TestTypeWrappers_Constructors, // OWF_CONSTRUCTORS,
  5836. &TestTypeWrappers_Comparison, // OWF_COMPARISON,
  5837. &TestTypeWrappers_BoolCasts, // OWF_BOOLCASTS,
  5838. &TestTypeWrappers_Assignment, // OWF_ASSIGNMENT,
  5839. &TestTypeWrappers_DataCast, // OWF_DATACAST,
  5840. &TestTypeWrappers_DataComparison, // OWF_DATACOMPARISON,
  5841. };
  5842. static const CEnumUnsortedElementArray<EOUTYPEWRAPPERFEATURE, OWF__MAX, CFeatureTestProcedure> g_afnTypeWrapperFeatureTestProcedures;
  5843. template<>
  5844. const char *const CEnumUnsortedElementArray<EOUTYPEWRAPPERFEATURE, OWF__MAX, const char *>::m_aetElementArray[] =
  5845. {
  5846. "Constructors", // OWF_CONSTRUCTORS,
  5847. "Comparison Operators", // OWF_COMPARISON,
  5848. "Boolean Casts", // OWF_BOOLCASTS,
  5849. "Assignment Operators", // OWF_ASSIGNMENT,
  5850. "Data Cast", // OWF_DATACAST,
  5851. "Data Comparisons", // OWF_DATACOMPARISON,
  5852. };
  5853. static const CEnumUnsortedElementArray<EOUTYPEWRAPPERFEATURE, OWF__MAX, const char *> g_aszTypeWrapperFeatureTestNames;
  5854. bool TestTypeWrapper(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  5855. {
  5856. return TestSubsystem(nOutSuccessCount, nOutTestCount, OWF__MAX, g_aszTypeWrapperFeatureTestNames.GetStoragePointer(), g_afnTypeWrapperFeatureTestProcedures.GetStoragePointer());
  5857. }
  5858. //////////////////////////////////////////////////////////////////////////
  5859. struct CTestCustomizations_Asserts_FailureInfo
  5860. {
  5861. EASSERTIONFAILURESEVERITY m_fsFailureSeverity;
  5862. const char *m_szAssertionExpression;
  5863. const char *m_szAssertionFileName;
  5864. unsigned int m_uiAssertionSourceLine;
  5865. };
  5866. static const CTestCustomizations_Asserts_FailureInfo g_fiAssertInvalidInfo = { AFS__MAX, NULL, NULL, 0 };
  5867. static CTestCustomizations_Asserts_FailureInfo g_fiAssertLastInfo;
  5868. void _OU_CONVENTION_CALLBACK TestCustomizations_Asserts_AssertionFailure(EASSERTIONFAILURESEVERITY fsFailureSeverity,
  5869. const char *szAssertionExpression, const char *szAssertionFileName, unsigned int uiAssertionSourceLine)
  5870. {
  5871. g_fiAssertLastInfo.m_fsFailureSeverity = fsFailureSeverity;
  5872. g_fiAssertLastInfo.m_szAssertionExpression = szAssertionExpression;
  5873. g_fiAssertLastInfo.m_szAssertionFileName = szAssertionFileName;
  5874. g_fiAssertLastInfo.m_uiAssertionSourceLine = uiAssertionSourceLine;
  5875. }
  5876. bool TestCustomizations_Asserts()
  5877. {
  5878. bool bResult = false;
  5879. CAssertionFailedProcedure fnAssertOldHandler = CAssertionCheckCustomization::GetAssertFailureCustomHandler();
  5880. CAssertionCheckCustomization::CustomizeAssertionChecks(&TestCustomizations_Asserts_AssertionFailure);
  5881. do
  5882. {
  5883. #if !defined(NDEBUG)
  5884. // Only callback invocation is checked here.
  5885. // Availability of functionality depending on preprocessor defines
  5886. // is verified in OST_ASSERT subsystem.
  5887. OU_ASSERT(false); // const unsigned int uiAssertToVerifyLines = 14; -- see further in code
  5888. if (g_fiAssertLastInfo.m_fsFailureSeverity != AFS_ASSERT
  5889. || g_fiAssertLastInfo.m_szAssertionExpression == NULL
  5890. || g_fiAssertLastInfo.m_szAssertionFileName == NULL
  5891. || strcmp(g_fiAssertLastInfo.m_szAssertionFileName, __FILE__) != 0
  5892. || g_fiAssertLastInfo.m_uiAssertionSourceLine == 0)
  5893. {
  5894. break;
  5895. }
  5896. CTestCustomizations_Asserts_FailureInfo fiAssertFailureInfoSave = g_fiAssertLastInfo;
  5897. g_fiAssertLastInfo = g_fiAssertInvalidInfo;
  5898. OU_VERIFY(false); const unsigned int uiAssertToVerifyLines = 14;
  5899. if (g_fiAssertLastInfo.m_fsFailureSeverity != AFS_ASSERT
  5900. || g_fiAssertLastInfo.m_szAssertionExpression == NULL
  5901. || strcmp(g_fiAssertLastInfo.m_szAssertionExpression, fiAssertFailureInfoSave.m_szAssertionExpression) != 0
  5902. || g_fiAssertLastInfo.m_szAssertionFileName == NULL
  5903. || strcmp(g_fiAssertLastInfo.m_szAssertionFileName, __FILE__) != 0
  5904. || g_fiAssertLastInfo.m_uiAssertionSourceLine != fiAssertFailureInfoSave.m_uiAssertionSourceLine + uiAssertToVerifyLines)
  5905. {
  5906. break;
  5907. }
  5908. g_fiAssertLastInfo = g_fiAssertInvalidInfo;
  5909. #endif // #if !defined(NDEBUG)
  5910. /* -- can't verify OU_CHECK() as it crashes the application on failure
  5911. OU_CHECK(false);
  5912. if (g_fiAssertLastInfo.m_fsFailureSeverity != AFS_CHECK
  5913. || g_fiAssertLastInfo.m_szAssertionExpression == NULL
  5914. || g_fiAssertLastInfo.m_szAssertionFileName == NULL
  5915. || strcmp(g_fiAssertLastInfo.m_szAssertionFileName, __FILE__) != 0
  5916. || g_fiAssertLastInfo.m_uiAssertionSourceLine == 0)
  5917. {
  5918. break;
  5919. }
  5920. */
  5921. bResult = true;
  5922. }
  5923. while (false);
  5924. CAssertionCheckCustomization::CustomizeAssertionChecks(fnAssertOldHandler);
  5925. return bResult;
  5926. }
  5927. void *const g_pv_MallocResult = (void *)(size_t)0x12345678;
  5928. bool g_bMallocInvocation = false, g_bReallocInvocation = false;
  5929. bool g_bFreeInvocation = false, g_bFreeSuccess = false;
  5930. void *_OU_CONVENTION_CALLBACK TestCustomizations_MemMgr_Alloc(size_t nBlockSize)
  5931. {
  5932. g_bMallocInvocation = true;
  5933. return (void *)((ptrdiff_t)g_pv_MallocResult + nBlockSize);
  5934. }
  5935. void *_OU_CONVENTION_CALLBACK TestCustomizations_MemMgr_Realloc(void *pv_OldBlock, size_t nBlockNewSize)
  5936. {
  5937. g_bReallocInvocation = true;
  5938. return (void *)((ptrdiff_t)pv_OldBlock - nBlockNewSize);
  5939. }
  5940. void _OU_CONVENTION_CALLBACK TestCustomizations_MemMgr_Free(void *pv_OldBlock)
  5941. {
  5942. g_bFreeInvocation = true;
  5943. g_bFreeSuccess = pv_OldBlock == g_pv_MallocResult;
  5944. }
  5945. bool TestCustomizations_MemMgr()
  5946. {
  5947. bool bResult = false;
  5948. CMemoryAllocationProcedure fnAllocationOldProcedure = CMemoryManagerCustomization::GetMemoryAllocationCustomProcedure();
  5949. CMemoryReallocationProcedure fnReallocationOldProcedure = CMemoryManagerCustomization::GetMemoryReallocationCustomProcedure();
  5950. CMemoryDeallocationProcedure fnDeallocationOldProcedure = CMemoryManagerCustomization::GetMemoryDeallocationCustomProcedure();
  5951. CMemoryManagerCustomization::CustomizeMemoryManager(&TestCustomizations_MemMgr_Alloc, &TestCustomizations_MemMgr_Realloc, &TestCustomizations_MemMgr_Free);
  5952. do
  5953. {
  5954. const size_t nBlockSize = 0x1000;
  5955. void *pv_BlockAllocated = AllocateMemoryBlock(nBlockSize);
  5956. if (!g_bMallocInvocation
  5957. || pv_BlockAllocated != (void *)((size_t)g_pv_MallocResult + nBlockSize))
  5958. {
  5959. break;
  5960. }
  5961. void *pv_BlockReallocated = ReallocateMemoryBlock(pv_BlockAllocated, 2 * nBlockSize);
  5962. if (!g_bReallocInvocation
  5963. || pv_BlockReallocated != (void *)((size_t)g_pv_MallocResult - nBlockSize))
  5964. {
  5965. break;
  5966. }
  5967. FreeMemoryBlock(g_pv_MallocResult);
  5968. if (!g_bFreeInvocation || !g_bFreeSuccess)
  5969. {
  5970. break;
  5971. }
  5972. bResult = true;
  5973. }
  5974. while (false);
  5975. CMemoryManagerCustomization::CustomizeMemoryManager(fnAllocationOldProcedure, fnReallocationOldProcedure, fnDeallocationOldProcedure);
  5976. return bResult;
  5977. }
  5978. enum EOUCUSTOMIZATIONFEATURE
  5979. {
  5980. OCF__MIN,
  5981. OCF_ASSERTS = OCF__MIN,
  5982. OCF_MEMMGR,
  5983. OCF__MAX,
  5984. };
  5985. template<>
  5986. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUCUSTOMIZATIONFEATURE, OCF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  5987. {
  5988. &TestCustomizations_Asserts, // OCF_ASSERTS,
  5989. &TestCustomizations_MemMgr, // OCF_MEMMGR,
  5990. };
  5991. static const CEnumUnsortedElementArray<EOUCUSTOMIZATIONFEATURE, OCF__MAX, CFeatureTestProcedure> g_afnCustomizationFeatureTestProcedures;
  5992. template<>
  5993. const char *const CEnumUnsortedElementArray<EOUCUSTOMIZATIONFEATURE, OCF__MAX, const char *>::m_aetElementArray[] =
  5994. {
  5995. "Asserts", // OCF_ASSERTS,
  5996. "Memory Manager", // OCF_MEMMGR,
  5997. };
  5998. static const CEnumUnsortedElementArray<EOUCUSTOMIZATIONFEATURE, OCF__MAX, const char *> g_aszCustomizationFeatureTestNames;
  5999. bool TestCustomization(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  6000. {
  6001. return TestSubsystem(nOutSuccessCount, nOutTestCount, OCF__MAX, g_aszCustomizationFeatureTestNames.GetStoragePointer(), g_afnCustomizationFeatureTestProcedures.GetStoragePointer());
  6002. }
  6003. //////////////////////////////////////////////////////////////////////////
  6004. static const size_t g_nTestMallocBlockInitialSize = 1001;
  6005. static const size_t g_nTestMallocBlockNextSize = 65501;
  6006. static const uint8ou g_uiTestMallocToken = 0xAA;
  6007. static void *g_pv_MemoryBlock = NULL;
  6008. bool TestMallocs_Allocate()
  6009. {
  6010. bool bResult = false;
  6011. do
  6012. {
  6013. g_pv_MemoryBlock = AllocateMemoryBlock(g_nTestMallocBlockInitialSize);
  6014. if (g_pv_MemoryBlock == NULL || OU_ALIGNED_SIZE((size_t)g_pv_MemoryBlock, _OU_MEMORY_REQUIRED_ALIGNMENT) != (size_t)g_pv_MemoryBlock)
  6015. {
  6016. break;
  6017. }
  6018. *((uint8ou *)g_pv_MemoryBlock + g_nTestMallocBlockInitialSize - 1) = g_uiTestMallocToken;
  6019. bResult = true;
  6020. }
  6021. while (false);
  6022. return bResult;
  6023. }
  6024. bool TestMallocs_Reallocate()
  6025. {
  6026. OU_ASSERT(g_nTestMallocBlockNextSize > g_nTestMallocBlockInitialSize);
  6027. bool bResult = false;
  6028. do
  6029. {
  6030. void *pv_OldMemoryBlock = g_pv_MemoryBlock;
  6031. g_pv_MemoryBlock = ReallocateMemoryBlock(pv_OldMemoryBlock, g_nTestMallocBlockNextSize);
  6032. if (g_pv_MemoryBlock == NULL || OU_ALIGNED_SIZE((size_t)g_pv_MemoryBlock, _OU_MEMORY_REQUIRED_ALIGNMENT) != (size_t)g_pv_MemoryBlock)
  6033. {
  6034. break;
  6035. }
  6036. if (*((uint8ou *)g_pv_MemoryBlock + g_nTestMallocBlockInitialSize - 1) != g_uiTestMallocToken)
  6037. {
  6038. break;
  6039. }
  6040. bResult = true;
  6041. }
  6042. while (false);
  6043. return bResult;
  6044. }
  6045. bool TestMallocs_Deallocate()
  6046. {
  6047. FreeMemoryBlock(g_pv_MemoryBlock);
  6048. FreeMemoryBlock(NULL); // Free must survive NULL-pointer
  6049. return true;
  6050. }
  6051. enum EOUMALLOCFEATURE
  6052. {
  6053. OLF__MIN,
  6054. OLF_ALLOCATE = OLF__MIN,
  6055. OLF_REALLOCATE,
  6056. OLF_DEALLOCATE,
  6057. OLF__MAX,
  6058. };
  6059. template<>
  6060. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUMALLOCFEATURE, OLF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  6061. {
  6062. &TestMallocs_Allocate, // OLF_ALLOCATE,
  6063. &TestMallocs_Reallocate, // OLF_REALLOCATE,
  6064. &TestMallocs_Deallocate, // OLF_DEALLOCATE,
  6065. };
  6066. static const CEnumUnsortedElementArray<EOUMALLOCFEATURE, OLF__MAX, CFeatureTestProcedure> g_afnMallocFeatureTestProcedures;
  6067. template<>
  6068. const char *const CEnumUnsortedElementArray<EOUMALLOCFEATURE, OLF__MAX, const char *>::m_aetElementArray[] =
  6069. {
  6070. "AllocateMemoryBlock", // OLF_ALLOCATE,
  6071. "ReallocateMemoryBlock", // OLF_REALLOCATE,
  6072. "FreeMemoryBlock", // OLF_DEALLOCATE,
  6073. };
  6074. static const CEnumUnsortedElementArray<EOUMALLOCFEATURE, OLF__MAX, const char *> g_aszMallocFeatureTestNames;
  6075. bool TestMalloc(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  6076. {
  6077. return TestSubsystem(nOutSuccessCount, nOutTestCount, OLF__MAX, g_aszMallocFeatureTestNames.GetStoragePointer(), g_afnMallocFeatureTestProcedures.GetStoragePointer());
  6078. }
  6079. //////////////////////////////////////////////////////////////////////////
  6080. bool TestAsserts_FalseFunction(bool &bVarInvocation)
  6081. {
  6082. bool bResult = true;
  6083. bVarInvocation = !bVarInvocation;
  6084. bool *pv_Pointer = &bResult;
  6085. if (pv_Pointer)
  6086. {
  6087. bResult = false;
  6088. }
  6089. return bResult;
  6090. }
  6091. bool TestAsserts_TrueFunction(bool &bVarInvocation)
  6092. {
  6093. bool bResult = false;
  6094. bVarInvocation = !bVarInvocation;
  6095. bool *pv_Pointer = &bResult;
  6096. if (pv_Pointer)
  6097. {
  6098. bResult = true;
  6099. }
  6100. return bResult;
  6101. }
  6102. bool TestAsserts_Assert()
  6103. {
  6104. bool bNDebugInvocation = false, bOrdinaryInvocation = false;
  6105. #if defined(NDEBUG)
  6106. OU_ASSERT(TestAsserts_FalseFunction(bNDebugInvocation));
  6107. bOrdinaryInvocation = true;
  6108. #endif // #if defined(NDEBUG)
  6109. OU_ASSERT(TestAsserts_TrueFunction(bOrdinaryInvocation));
  6110. return !bNDebugInvocation && bOrdinaryInvocation;
  6111. }
  6112. bool TestAsserts_Verify()
  6113. {
  6114. bool bNDebugInvocation = false, bOrdinaryInvocation = false;
  6115. #if defined(NDEBUG)
  6116. OU_VERIFY(TestAsserts_FalseFunction(bNDebugInvocation));
  6117. #else // #if !defined(NDEBUG)
  6118. bNDebugInvocation = true;
  6119. #endif // #if !defined(NDEBUG)
  6120. OU_VERIFY(TestAsserts_TrueFunction(bOrdinaryInvocation));
  6121. return bNDebugInvocation && bOrdinaryInvocation;
  6122. }
  6123. bool TestAsserts_Check()
  6124. {
  6125. bool bOrdinaryInvocation = false;
  6126. OU_CHECK(TestAsserts_TrueFunction(bOrdinaryInvocation));
  6127. return bOrdinaryInvocation;
  6128. }
  6129. enum EOUASSERTFEATURE
  6130. {
  6131. OEF__MIN,
  6132. OEF_ASSERT = OEF__MIN,
  6133. OEF_VERIFY,
  6134. OEF_CHECK,
  6135. OEF__MAX,
  6136. };
  6137. template<>
  6138. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUASSERTFEATURE, OEF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  6139. {
  6140. &TestAsserts_Assert, // OEF_ASSERT,
  6141. &TestAsserts_Verify, // OEF_VERIFY,
  6142. &TestAsserts_Check, // OEF_CHECK,
  6143. };
  6144. static const CEnumUnsortedElementArray<EOUASSERTFEATURE, OEF__MAX, CFeatureTestProcedure> g_afnAssertFeatureTestProcedures;
  6145. template<>
  6146. const char *const CEnumUnsortedElementArray<EOUASSERTFEATURE, OEF__MAX, const char *>::m_aetElementArray[] =
  6147. {
  6148. "OU_ASSERT", // OEF_ASSERT,
  6149. "OU_VERIFY", // OEF_VERIFY,
  6150. "OU_CHECK", // OEF_CHECK,
  6151. };
  6152. static const CEnumUnsortedElementArray<EOUASSERTFEATURE, OEF__MAX, const char *> g_aszAssertFeatureTestNames;
  6153. bool TestAssert(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  6154. {
  6155. return TestSubsystem(nOutSuccessCount, nOutTestCount, OEF__MAX, g_aszAssertFeatureTestNames.GetStoragePointer(), g_afnAssertFeatureTestProcedures.GetStoragePointer());
  6156. }
  6157. //////////////////////////////////////////////////////////////////////////
  6158. struct CTestIntTypes_int8
  6159. {
  6160. int8ou m_iPad;
  6161. int8ou m_iValue;
  6162. };
  6163. bool TestIntTypes_Int8()
  6164. {
  6165. bool bResult = false;
  6166. do
  6167. {
  6168. if (sizeof(int8ou) != 1 || offsetof(CTestIntTypes_int8, m_iValue) != 1)
  6169. {
  6170. break;
  6171. }
  6172. if (OU_INT8_BITS != sizeof(int8ou) * OU_BITS_IN_BYTE )
  6173. {
  6174. break;
  6175. }
  6176. if ((int8ou)OU_INT8_MIN == 0 || (int8ou)(OU_INT8_MIN << 1) != 0)
  6177. {
  6178. break;
  6179. }
  6180. if (~OU_INT8_MIN != OU_INT8_MAX || ~OU_INT8_MAX != OU_INT8_MIN)
  6181. {
  6182. break;
  6183. }
  6184. bResult = true;
  6185. }
  6186. while (false);
  6187. return bResult;
  6188. }
  6189. struct CTestIntTypes_uint8
  6190. {
  6191. int8ou m_iPad;
  6192. uint8ou m_iValue;
  6193. };
  6194. bool TestIntTypes_UInt8()
  6195. {
  6196. bool bResult = false;
  6197. do
  6198. {
  6199. if (sizeof(uint8ou) != 1 || offsetof(CTestIntTypes_uint8, m_iValue) != 1)
  6200. {
  6201. break;
  6202. }
  6203. if (OU_UINT8_BITS != sizeof(uint8ou) * OU_BITS_IN_BYTE)
  6204. {
  6205. break;
  6206. }
  6207. if (OU_UINT8_MIN != 0)
  6208. {
  6209. break;
  6210. }
  6211. if (!(OU_UINT8_MAX & (uint8ou)1) || (OU_UINT8_MAX >> 1) != (uint8ou)OU_INT8_MAX)
  6212. {
  6213. break;
  6214. }
  6215. bResult = true;
  6216. }
  6217. while (false);
  6218. return bResult;
  6219. }
  6220. struct CTestIntTypes_int16
  6221. {
  6222. int8ou m_iPad;
  6223. int16ou m_iValue;
  6224. };
  6225. bool TestIntTypes_Int16()
  6226. {
  6227. bool bResult = false;
  6228. do
  6229. {
  6230. if (sizeof(int16ou) != 2 || offsetof(CTestIntTypes_int16, m_iValue) != 2)
  6231. {
  6232. break;
  6233. }
  6234. if (OU_INT16_BITS != sizeof(int16ou) * OU_BITS_IN_BYTE )
  6235. {
  6236. break;
  6237. }
  6238. if ((int16ou)OU_INT16_MIN == 0 || (int16ou)(OU_INT16_MIN << 1) != 0)
  6239. {
  6240. break;
  6241. }
  6242. if (~OU_INT16_MIN != OU_INT16_MAX || ~OU_INT16_MAX != OU_INT16_MIN)
  6243. {
  6244. break;
  6245. }
  6246. bResult = true;
  6247. }
  6248. while (false);
  6249. return bResult;
  6250. }
  6251. struct CTestIntTypes_uint16
  6252. {
  6253. int8ou m_iPad;
  6254. uint16ou m_iValue;
  6255. };
  6256. bool TestIntTypes_UInt16()
  6257. {
  6258. bool bResult = false;
  6259. do
  6260. {
  6261. if (sizeof(uint16ou) != 2 || offsetof(CTestIntTypes_uint16, m_iValue) != 2)
  6262. {
  6263. break;
  6264. }
  6265. if (OU_UINT16_BITS != sizeof(uint16ou) * OU_BITS_IN_BYTE)
  6266. {
  6267. break;
  6268. }
  6269. if (OU_UINT16_MIN != 0)
  6270. {
  6271. break;
  6272. }
  6273. if (!(OU_UINT16_MAX & (uint16ou)1) || (OU_UINT16_MAX >> 1) != (uint16ou)OU_INT16_MAX)
  6274. {
  6275. break;
  6276. }
  6277. bResult = true;
  6278. }
  6279. while (false);
  6280. return bResult;
  6281. }
  6282. struct CTestIntTypes_int32
  6283. {
  6284. int8ou m_iPad;
  6285. int32ou m_iValue;
  6286. };
  6287. bool TestIntTypes_Int32()
  6288. {
  6289. bool bResult = false;
  6290. do
  6291. {
  6292. if (sizeof(int32ou) != 4 || offsetof(CTestIntTypes_int32, m_iValue) != 4)
  6293. {
  6294. break;
  6295. }
  6296. if (OU_INT32_BITS != sizeof(int32ou) * OU_BITS_IN_BYTE )
  6297. {
  6298. break;
  6299. }
  6300. if ((int32ou)OU_INT32_MIN == 0 || (int32ou)(OU_INT32_MIN << 1) != 0)
  6301. {
  6302. break;
  6303. }
  6304. if (~OU_INT32_MIN != OU_INT32_MAX || ~OU_INT32_MAX != OU_INT32_MIN)
  6305. {
  6306. break;
  6307. }
  6308. bResult = true;
  6309. }
  6310. while (false);
  6311. return bResult;
  6312. }
  6313. struct CTestIntTypes_uint32
  6314. {
  6315. int8ou m_iPad;
  6316. uint32ou m_iValue;
  6317. };
  6318. bool TestIntTypes_UInt32()
  6319. {
  6320. bool bResult = false;
  6321. do
  6322. {
  6323. if (sizeof(uint32ou) != 4 || offsetof(CTestIntTypes_uint32, m_iValue) != 4)
  6324. {
  6325. break;
  6326. }
  6327. if (OU_UINT32_BITS != sizeof(uint32ou) * OU_BITS_IN_BYTE)
  6328. {
  6329. break;
  6330. }
  6331. if (OU_UINT32_MIN != 0)
  6332. {
  6333. break;
  6334. }
  6335. if (!(OU_UINT32_MAX & (uint32ou)1) || (OU_UINT32_MAX >> 1) != (uint32ou)OU_INT32_MAX)
  6336. {
  6337. break;
  6338. }
  6339. bResult = true;
  6340. }
  6341. while (false);
  6342. return bResult;
  6343. }
  6344. struct CTestIntTypes_int64
  6345. {
  6346. int8ou m_iPad;
  6347. int64ou m_iValue;
  6348. };
  6349. bool TestIntTypes_Int64()
  6350. {
  6351. bool bResult = false;
  6352. do
  6353. {
  6354. if (sizeof(int64ou) != 8)
  6355. {
  6356. break;
  6357. }
  6358. #if _OU_TARGET_ARCH == _OU_TARGET_ARCH_X86 && _OU_TARGET_OS != _OU_TARGET_OS_MAC
  6359. if (offsetof(CTestIntTypes_int64, m_iValue) != 8)
  6360. {
  6361. break;
  6362. }
  6363. #endif
  6364. if (OU_INT64_BITS != sizeof(int64ou) * OU_BITS_IN_BYTE )
  6365. {
  6366. break;
  6367. }
  6368. if ((int64ou)OU_INT64_MIN == 0 || (int64ou)(OU_INT64_MIN << 1) != 0)
  6369. {
  6370. break;
  6371. }
  6372. if (~OU_INT64_MIN != OU_INT64_MAX || ~OU_INT64_MAX != OU_INT64_MIN)
  6373. {
  6374. break;
  6375. }
  6376. bResult = true;
  6377. }
  6378. while (false);
  6379. return bResult;
  6380. }
  6381. struct CTestIntTypes_uint64
  6382. {
  6383. int8ou m_iPad;
  6384. uint64ou m_iValue;
  6385. };
  6386. bool TestIntTypes_UInt64()
  6387. {
  6388. bool bResult = false;
  6389. do
  6390. {
  6391. if (sizeof(uint64ou) != 8)
  6392. {
  6393. break;
  6394. }
  6395. #if _OU_TARGET_ARCH == _OU_TARGET_ARCH_X86 && _OU_TARGET_OS != _OU_TARGET_OS_MAC
  6396. if (offsetof(CTestIntTypes_uint64, m_iValue) != 8)
  6397. {
  6398. break;
  6399. }
  6400. #endif
  6401. if (OU_UINT64_BITS != sizeof(uint64ou) * OU_BITS_IN_BYTE)
  6402. {
  6403. break;
  6404. }
  6405. if (OU_UINT64_MIN != 0)
  6406. {
  6407. break;
  6408. }
  6409. if (!(OU_UINT64_MAX & (uint64ou)1) || (OU_UINT64_MAX >> 1) != (uint64ou)OU_INT64_MAX)
  6410. {
  6411. break;
  6412. }
  6413. bResult = true;
  6414. }
  6415. while (false);
  6416. return bResult;
  6417. }
  6418. enum EOUINTTYPEFEATURE
  6419. {
  6420. OIF__MIN,
  6421. OIF_INT8 = OIF__MIN,
  6422. OIF_UINT8,
  6423. OIF_INT16,
  6424. OIF_UINT16,
  6425. OIF_INT32,
  6426. OIF_UINT32,
  6427. OIF_INT64,
  6428. OIF_UINT64,
  6429. OIF__MAX,
  6430. };
  6431. template<>
  6432. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUINTTYPEFEATURE, OIF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  6433. {
  6434. &TestIntTypes_Int8, // OIF_INT8,
  6435. &TestIntTypes_UInt8, // OIF_UINT8,
  6436. &TestIntTypes_Int16, // OIF_INT16,
  6437. &TestIntTypes_UInt16, // OIF_UINT16,
  6438. &TestIntTypes_Int32, // OIF_INT32,
  6439. &TestIntTypes_UInt32, // OIF_UINT32,
  6440. &TestIntTypes_Int64, // OIF_INT64,
  6441. &TestIntTypes_UInt64, // OIF_UINT64,
  6442. };
  6443. static const CEnumUnsortedElementArray<EOUINTTYPEFEATURE, OIF__MAX, CFeatureTestProcedure> g_afnIntTypeFeatureTestProcedures;
  6444. template<>
  6445. const char *const CEnumUnsortedElementArray<EOUINTTYPEFEATURE, OIF__MAX, const char *>::m_aetElementArray[] =
  6446. {
  6447. "int8ou", // OIF_INT8,
  6448. "uint8ou", // OIF_UINT8,
  6449. "int16ou", // OIF_INT16,
  6450. "uint16ou", // OIF_UINT16,
  6451. "int32ou", // OIF_INT32,
  6452. "uint32ou", // OIF_UINT32,
  6453. "int64ou", // OIF_INT64,
  6454. "uint64ou", // OIF_UINT64,
  6455. };
  6456. static const CEnumUnsortedElementArray<EOUINTTYPEFEATURE, OIF__MAX, const char *> g_aszIntTypeFeatureTestNames;
  6457. bool TestIntTypes(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  6458. {
  6459. return TestSubsystem(nOutSuccessCount, nOutTestCount, OIF__MAX, g_aszIntTypeFeatureTestNames.GetStoragePointer(), g_afnIntTypeFeatureTestProcedures.GetStoragePointer());
  6460. }
  6461. //////////////////////////////////////////////////////////////////////////
  6462. struct CTestMacros_OffsetStruct
  6463. {
  6464. int8ou m_i8a;
  6465. int16ou m_i16a;
  6466. int32ou m_i32a;
  6467. int64ou m_i64;
  6468. int32ou m_i32b;
  6469. int16ou m_i16b;
  6470. int8ou m_i8b;
  6471. };
  6472. bool TestMacros_OffsetOf()
  6473. {
  6474. size_t sOffset_i8a = offsetof(CTestMacros_OffsetStruct, m_i8a);
  6475. size_t sOffset_i16a = offsetof(CTestMacros_OffsetStruct, m_i16a);
  6476. size_t sOffset_i32a = offsetof(CTestMacros_OffsetStruct, m_i32a);
  6477. size_t sOffset_i64 = offsetof(CTestMacros_OffsetStruct, m_i64);
  6478. size_t sOffset_i32b = offsetof(CTestMacros_OffsetStruct, m_i32b);
  6479. size_t sOffset_i16b = offsetof(CTestMacros_OffsetStruct, m_i16b);
  6480. size_t sOffset_i8b = offsetof(CTestMacros_OffsetStruct, m_i8b);
  6481. size_t sStructSize = sizeof(CTestMacros_OffsetStruct);
  6482. return true
  6483. && sOffset_i8a == 0
  6484. && sOffset_i16a == 2
  6485. && sOffset_i32a == 4
  6486. && sOffset_i64 == 8
  6487. && sOffset_i32b == 16
  6488. && sOffset_i16b == 20
  6489. && sOffset_i8b == 22
  6490. && sStructSize == 24;
  6491. }
  6492. bool TestMacros_AlignedSize()
  6493. {
  6494. return true
  6495. && OU_ALIGNED_SIZE(0, sizeof(int8ou)) == 0
  6496. && OU_ALIGNED_SIZE(0, sizeof(int16ou)) == 0
  6497. && OU_ALIGNED_SIZE(0, sizeof(int32ou)) == 0
  6498. && OU_ALIGNED_SIZE(0, sizeof(int64ou)) == 0
  6499. && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int8ou)) == sizeof(int8ou)
  6500. && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int16ou)) == sizeof(int16ou)
  6501. && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int32ou)) == sizeof(int32ou)
  6502. && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int64ou)) == sizeof(int64ou)
  6503. && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int8ou)) == sizeof(int16ou)
  6504. && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int16ou)) == sizeof(int16ou)
  6505. && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int32ou)) == sizeof(int32ou)
  6506. && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int64ou)) == sizeof(int64ou)
  6507. && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int8ou)) == sizeof(int32ou)
  6508. && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int16ou)) == sizeof(int32ou)
  6509. && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int32ou)) == sizeof(int32ou)
  6510. && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int64ou)) == sizeof(int64ou)
  6511. && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int8ou)) == sizeof(int64ou)
  6512. && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int16ou)) == sizeof(int64ou)
  6513. && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int32ou)) == sizeof(int64ou)
  6514. && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int64ou)) == sizeof(int64ou);
  6515. }
  6516. bool TestMacros_ArraySize()
  6517. {
  6518. static int m_ai_Array1[1];
  6519. static int m_aai_Array11[1][1];
  6520. static int m_ai_Array2[2];
  6521. static int m_aai_Array21[2][1];
  6522. static int m_aai_Array12[1][2];
  6523. return true
  6524. && OU_ARRAY_SIZE(m_ai_Array1) == 1
  6525. && OU_ARRAY_SIZE(m_aai_Array11[0]) == 1
  6526. && OU_ARRAY_SIZE(m_aai_Array11) == 1
  6527. && OU_ARRAY_SIZE(m_ai_Array2) == 2
  6528. && OU_ARRAY_SIZE(m_aai_Array21[0]) == 1
  6529. && OU_ARRAY_SIZE(m_aai_Array21) == 2
  6530. && OU_ARRAY_SIZE(m_aai_Array12[0]) == 2
  6531. && OU_ARRAY_SIZE(m_aai_Array12) == 1;
  6532. }
  6533. bool TestMacros_InIntRange()
  6534. {
  6535. char iZero = 0;
  6536. char iOne = 1;
  6537. char iMinusOne = -1;
  6538. unsigned int uiTen = 10;
  6539. unsigned int uiNotZero = ~0U;
  6540. return true
  6541. && !OU_IN_INT_RANGE(iZero, 0, 0)
  6542. && !OU_IN_INT_RANGE(iOne, 0, 0)
  6543. && !OU_IN_INT_RANGE(iMinusOne, 0, 0)
  6544. && !OU_IN_INT_RANGE(uiTen, 0, 0)
  6545. && !OU_IN_INT_RANGE(uiNotZero, 0, 0)
  6546. && OU_IN_INT_RANGE(iZero, 0, 1)
  6547. && !OU_IN_INT_RANGE(iOne, 0, 1)
  6548. && !OU_IN_INT_RANGE(iMinusOne, 0, 1)
  6549. && !OU_IN_INT_RANGE(uiTen, 0, 1)
  6550. && !OU_IN_INT_RANGE(uiNotZero, 0, 1)
  6551. && !OU_IN_INT_RANGE(iZero, 1, 2)
  6552. && OU_IN_INT_RANGE(iOne, 1, 2)
  6553. && !OU_IN_INT_RANGE(iMinusOne, 1, 2)
  6554. && !OU_IN_INT_RANGE(uiTen, 1, 2)
  6555. && !OU_IN_INT_RANGE(uiNotZero, 1, 2)
  6556. && OU_IN_INT_RANGE(iZero, -1, 1)
  6557. && !OU_IN_INT_RANGE(iOne, -1, 1)
  6558. && OU_IN_INT_RANGE(iMinusOne, -1, 1)
  6559. && !OU_IN_INT_RANGE(uiTen, -1, 1)
  6560. && OU_IN_INT_RANGE(uiNotZero, -1, 1)
  6561. && !OU_IN_INT_RANGE(iZero, 1, -1)
  6562. && OU_IN_INT_RANGE(iOne, 1, -1)
  6563. && !OU_IN_INT_RANGE(iMinusOne, 1, -1)
  6564. && OU_IN_INT_RANGE(uiTen, 1, -1)
  6565. && !OU_IN_INT_RANGE(uiNotZero, 1, -1);
  6566. }
  6567. bool TestMacros_InI64Range()
  6568. {
  6569. char iZero = 0;
  6570. char iOne = 1;
  6571. char iMinusOne = -1;
  6572. unsigned int uiTen = 10;
  6573. unsigned int uiNotZero = ~0U;
  6574. return true
  6575. && !OU_IN_I64_RANGE(iZero, 0, 0)
  6576. && !OU_IN_I64_RANGE(iOne, 0, 0)
  6577. && !OU_IN_I64_RANGE(iMinusOne, 0, 0)
  6578. && !OU_IN_I64_RANGE(uiTen, 0, 0)
  6579. && !OU_IN_I64_RANGE(uiNotZero, 0, 0)
  6580. && OU_IN_I64_RANGE(iZero, 0, 1)
  6581. && !OU_IN_I64_RANGE(iOne, 0, 1)
  6582. && !OU_IN_I64_RANGE(iMinusOne, 0, 1)
  6583. && !OU_IN_I64_RANGE(uiTen, 0, 1)
  6584. && !OU_IN_I64_RANGE(uiNotZero, 0, 1)
  6585. && !OU_IN_I64_RANGE(iZero, 1, 2)
  6586. && OU_IN_I64_RANGE(iOne, 1, 2)
  6587. && !OU_IN_I64_RANGE(iMinusOne, 1, 2)
  6588. && !OU_IN_I64_RANGE(uiTen, 1, 2)
  6589. && !OU_IN_I64_RANGE(uiNotZero, 1, 2)
  6590. && OU_IN_I64_RANGE(iZero, -1, 1)
  6591. && !OU_IN_I64_RANGE(iOne, -1, 1)
  6592. && OU_IN_I64_RANGE(iMinusOne, -1, 1)
  6593. && !OU_IN_I64_RANGE(uiTen, -1, 1)
  6594. && !OU_IN_I64_RANGE(uiNotZero, -1, 1)
  6595. && !OU_IN_I64_RANGE(iZero, 1, -1)
  6596. && OU_IN_I64_RANGE(iOne, 1, -1)
  6597. && !OU_IN_I64_RANGE(iMinusOne, 1, -1)
  6598. && OU_IN_I64_RANGE(uiTen, 1, -1)
  6599. && OU_IN_I64_RANGE(uiNotZero, 1, -1);
  6600. }
  6601. bool TestMacros_InSizetRange()
  6602. {
  6603. char iZero = 0;
  6604. char iOne = 1;
  6605. char iMinusOne = -1;
  6606. unsigned int uiTen = 10;
  6607. unsigned int uiNotZero = ~0U;
  6608. return true
  6609. && !OU_IN_SIZET_RANGE(iZero, 0, 0)
  6610. && !OU_IN_SIZET_RANGE(iOne, 0, 0)
  6611. && !OU_IN_SIZET_RANGE(iMinusOne, 0, 0)
  6612. && !OU_IN_SIZET_RANGE(uiTen, 0, 0)
  6613. && !OU_IN_SIZET_RANGE(uiNotZero, 0, 0)
  6614. && OU_IN_SIZET_RANGE(iZero, 0, 1)
  6615. && !OU_IN_SIZET_RANGE(iOne, 0, 1)
  6616. && !OU_IN_SIZET_RANGE(iMinusOne, 0, 1)
  6617. && !OU_IN_SIZET_RANGE(uiTen, 0, 1)
  6618. && !OU_IN_SIZET_RANGE(uiNotZero, 0, 1)
  6619. && !OU_IN_SIZET_RANGE(iZero, 1, 2)
  6620. && OU_IN_SIZET_RANGE(iOne, 1, 2)
  6621. && !OU_IN_SIZET_RANGE(iMinusOne, 1, 2)
  6622. && !OU_IN_SIZET_RANGE(uiTen, 1, 2)
  6623. && !OU_IN_SIZET_RANGE(uiNotZero, 1, 2)
  6624. && OU_IN_SIZET_RANGE(iZero, -1, 1)
  6625. && !OU_IN_SIZET_RANGE(iOne, -1, 1)
  6626. && OU_IN_SIZET_RANGE(iMinusOne, -1, 1)
  6627. && !OU_IN_SIZET_RANGE(uiTen, -1, 1)
  6628. && OU_IN_SIZET_RANGE(uiNotZero, -1, 1) == (sizeof(size_t) == sizeof(unsigned int))
  6629. && !OU_IN_SIZET_RANGE(iZero, 1, -1)
  6630. && OU_IN_SIZET_RANGE(iOne, 1, -1)
  6631. && !OU_IN_SIZET_RANGE(iMinusOne, 1, -1)
  6632. && OU_IN_SIZET_RANGE(uiTen, 1, -1)
  6633. && OU_IN_SIZET_RANGE(uiNotZero, 1, -1) != (sizeof(size_t) == sizeof(unsigned int));
  6634. }
  6635. enum EOUMACROFEATURE
  6636. {
  6637. OMF__MIN,
  6638. OMF_OFFSETOF = OMF__MIN,
  6639. OMF_ALIGNEDSIZE,
  6640. OMF_ARRAYSIZE,
  6641. OMF_ININTRANGE,
  6642. OMF_INI64RANGE,
  6643. OMF_INSIZETRANGE,
  6644. OMF__MAX,
  6645. };
  6646. template<>
  6647. CFeatureTestProcedure const CEnumUnsortedElementArray<EOUMACROFEATURE, OMF__MAX, CFeatureTestProcedure>::m_aetElementArray[] =
  6648. {
  6649. &TestMacros_OffsetOf, // OMF_OFFSETOF,
  6650. &TestMacros_AlignedSize, // OMF_ALIGNEDSIZE,
  6651. &TestMacros_ArraySize, // OMF_ARRAYSIZE,
  6652. &TestMacros_InIntRange, // OMF_ININTRANGE,
  6653. &TestMacros_InI64Range, // OMF_INI64RANGE,
  6654. &TestMacros_InSizetRange, // OMF_INSIZETRANGE,
  6655. };
  6656. static const CEnumUnsortedElementArray<EOUMACROFEATURE, OMF__MAX, CFeatureTestProcedure> g_afnMacroFeatureTestProcedures;
  6657. template<>
  6658. const char *const CEnumUnsortedElementArray<EOUMACROFEATURE, OMF__MAX, const char *>::m_aetElementArray[] =
  6659. {
  6660. "offsetof", // OMF_OFFSETOF,
  6661. "OU_ALIGNED_SIZE", // OMF_ALIGNEDSIZE,
  6662. "OU_ARRAY_SIZE", // OMF_ARRAYSIZE,
  6663. "OU_IN_INT_RANGE", // OMF_ININTRANGE,
  6664. "OU_IN_I64_RANGE", // OMF_INI64RANGE,
  6665. "OU_IN_SIZET_RANGE", // OMF_INSIZETRANGE,
  6666. };
  6667. static const CEnumUnsortedElementArray<EOUMACROFEATURE, OMF__MAX, const char *> g_aszMacroFeatureTestNames;
  6668. bool TestMacros(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  6669. {
  6670. return TestSubsystem(nOutSuccessCount, nOutTestCount, OMF__MAX, g_aszMacroFeatureTestNames.GetStoragePointer(), g_afnMacroFeatureTestProcedures.GetStoragePointer());
  6671. }
  6672. //////////////////////////////////////////////////////////////////////////
  6673. // Verifies that target order is not changed
  6674. template<>
  6675. int const CEnumSortedElementArray<int, _OU_TARGET_OS__MAX - 1, int, 100>::m_aetElementArray[] =
  6676. {
  6677. _OU_TARGET_OS_GENUNIX, // _OU_TARGET_OS_GENUNIX
  6678. _OU_TARGET_OS_WINDOWS, // _OU_TARGET_OS_WINDOWS
  6679. _OU_TARGET_OS_QNX, // _OU_TARGET_OS_QNX
  6680. _OU_TARGET_OS_MAC, // _OU_TARGET_OS_MAC
  6681. _OU_TARGET_OS_AIX, // _OU_TARGET_OS_AIX
  6682. _OU_TARGET_OS_SUNOS, // _OU_TARGET_OS_SUNOS
  6683. _OU_TARGET_OS_IOS, // _OU_TARGET_OS_IOS
  6684. };
  6685. static const CEnumSortedElementArray<int, _OU_TARGET_OS__MAX - 1, int, 100> g_ai_TargetOrderCheck;
  6686. template<>
  6687. const char *const CEnumUnsortedElementArray<int, _OU_TARGET_OS__MAX - 1, const char *, 100>::m_aetElementArray[] =
  6688. {
  6689. "GENERIC UNIX", // _OU_TARGET_OS_GENUNIX
  6690. "WINDOWS", // _OU_TARGET_OS_WINDOWS
  6691. "QNX", // _OU_TARGET_OS_QNX
  6692. "MAC", // _OU_TARGET_OS_MAC
  6693. "AIX", // _OU_TARGET_OS_AIX
  6694. "SunOS", // _OU_TARGET_OS_SUNOS
  6695. "iOS", // _OU_TARGET_OS_IOS
  6696. };
  6697. static const CEnumUnsortedElementArray<int, _OU_TARGET_OS__MAX - 1, const char *, 100> g_aszOSNames;
  6698. // Verifies that bits order is not changed
  6699. template<>
  6700. int const CEnumSortedElementArray<int, _OU_TARGET_BITS__MAX - 1, int, 101>::m_aetElementArray[] =
  6701. {
  6702. _OU_TARGET_BITS_32, // _OU_TARGET_BITS_32
  6703. _OU_TARGET_BITS_64, // _OU_TARGET_BITS_64
  6704. };
  6705. static const CEnumSortedElementArray<int, _OU_TARGET_BITS__MAX - 1, int, 101> g_ai_BitsOrderCheck;
  6706. template<>
  6707. const char *const CEnumUnsortedElementArray<int, _OU_TARGET_BITS__MAX - 1, const char *, 101>::m_aetElementArray[] =
  6708. {
  6709. "32", // _OU_TARGET_BITS_32
  6710. "64", // _OU_TARGET_BITS_64
  6711. };
  6712. static const CEnumUnsortedElementArray<int, _OU_TARGET_BITS__MAX - 1, const char *, 101> g_aszBitsNames;
  6713. // Verifies that architectures order is not changed
  6714. template<>
  6715. int const CEnumSortedElementArray<int, _OU_TARGET_ARCH__MAX - 1, int, 102>::m_aetElementArray[] =
  6716. {
  6717. _OU_TARGET_ARCH_OTHER, // _OU_TARGET_ARCH_OTHER
  6718. _OU_TARGET_ARCH_X86, // _OU_TARGET_ARCH_X86
  6719. _OU_TARGET_ARCH_IA64, // _OU_TARGET_ARCH_IA64
  6720. _OU_TARGET_ARCH_X64, // _OU_TARGET_ARCH_X64
  6721. _OU_TARGET_ARCH_POWERPC, // _OU_TARGET_ARCH_POWERPC
  6722. _OU_TARGET_ARCH_SPARC, // _OU_TARGET_ARCH_SPARC
  6723. _OU_TARGET_ARCH_ARM, // _OU_TARGET_ARCH_ARM
  6724. };
  6725. static const CEnumSortedElementArray<int, _OU_TARGET_ARCH__MAX - 1, int, 102> g_ai_ArchitecturesOrderCheck;
  6726. template<>
  6727. const char *const CEnumUnsortedElementArray<int, _OU_TARGET_ARCH__MAX - 1, const char *, 102>::m_aetElementArray[] =
  6728. {
  6729. "OTHER", // _OU_TARGET_ARCH_OTHER
  6730. "x86", // _OU_TARGET_ARCH_X86
  6731. "Itanium", // _OU_TARGET_ARCH_IA64
  6732. "x64", // _OU_TARGET_ARCH_X64
  6733. "PowerPC", // _OU_TARGET_ARCH_POWERPC
  6734. "Sparc", // _OU_TARGET_ARCH_SPARC
  6735. "ARM", // _OU_TARGET_ARCH_ARM
  6736. };
  6737. static const CEnumUnsortedElementArray<int, _OU_TARGET_ARCH__MAX - 1, const char *, 102> g_aszArchitecturesNames;
  6738. // Verifies that compilers order is not changed
  6739. template<>
  6740. int const CEnumSortedElementArray<int, _OU_COMPILER__MAX - 1, int, 103>::m_aetElementArray[] =
  6741. {
  6742. _OU_COMPILER__OTHER, // _OU_COMPILER__OTHER,
  6743. _OU_COMPILER_GCC, // _OU_COMPILER_GCC,
  6744. _OU_COMPILER_MSVC, // _OU_COMPILER_MSVC,
  6745. };
  6746. static const CEnumSortedElementArray<int, _OU_COMPILER__MAX - 1, int, 103> g_ai_CompilersOrderCheck;
  6747. template<>
  6748. const char *const CEnumUnsortedElementArray<int, _OU_COMPILER__MAX - 1, const char *, 103>::m_aetElementArray[] =
  6749. {
  6750. "UNKNOWN", // _OU_COMPILER__OTHER,
  6751. "GCC", // _OU_COMPILER_GCC,
  6752. "MSVC", // _OU_COMPILER_MSVC,
  6753. };
  6754. static const CEnumUnsortedElementArray<int, _OU_COMPILER__MAX - 1, const char *, 103> g_aszCompilersNames;
  6755. // Verifies that compiler versions order is not changed
  6756. template<>
  6757. int const CEnumSortedElementArray<int, _OU_COMPILER_VERSION__MAX - 1, int, 104>::m_aetElementArray[] =
  6758. {
  6759. _OU_COMPILER_VERSION__OTHER, // _OU_COMPILER_VERSION__OTHER,
  6760. _OU_COMPILER_VERSION_MSVC1998, // _OU_COMPILER_VERSION_MSVC1998,
  6761. _OU_COMPILER_VERSION_GCCLT4, // _OU_COMPILER_VERSION_GCCLT4,
  6762. };
  6763. static const CEnumSortedElementArray<int, _OU_COMPILER_VERSION__MAX - 1, int, 104> g_ai_CompilersVersionOrderCheck;
  6764. template<>
  6765. const char *const CEnumUnsortedElementArray<int, _OU_COMPILER_VERSION__MAX - 1, const char *, 104>::m_aetElementArray[] =
  6766. {
  6767. "OTHER", // _OU_COMPILER_VERSION__OTHER,
  6768. "MSVC1998", // _OU_COMPILER_VERSION_MSVC1998,
  6769. "GCC LESS THAN 4.0", // _OU_COMPILER_VERSION_GCCLT4,
  6770. };
  6771. static const CEnumUnsortedElementArray<int, _OU_COMPILER_VERSION__MAX - 1, const char *, 104> g_aszCompilerVersionNames;
  6772. #define _TESTPLATFORM_DEFINITION_TEXT(Definition) #Definition
  6773. #define TESTPLATFORM_TEFINITION_TEXT(Definition) _TESTPLATFORM_DEFINITION_TEXT(Definition)
  6774. bool TestPlatform(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount)
  6775. {
  6776. const char *szOSName = g_aszOSNames.Encode(_OU_TARGET_OS - 1);
  6777. const char *szBitsName = g_aszBitsNames.Encode(_OU_TARGET_BITS - 1);
  6778. const char *szArchitectureName = g_aszArchitecturesNames.Encode(_OU_TARGET_ARCH - 1);
  6779. const char *szCompilerName = g_aszCompilersNames.Encode(_OU_COMPILER - 1);
  6780. const char *szCompilerVersion = g_aszCompilerVersionNames.Encode(_OU_COMPILER_VERSION - 1);
  6781. printf("Target OS: %s\n", szOSName);
  6782. printf("Target Bits: %s\n", szBitsName);
  6783. printf("Target Architecture %s\n", szArchitectureName);
  6784. printf("Compiler Name: %s\n", szCompilerName);
  6785. printf("Compiler Version: %s\n", szCompilerVersion);
  6786. printf("Method Convention: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_CONVENTION_METHOD));
  6787. printf("Function Convention: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_CONVENTION_API));
  6788. printf("Callback Convention: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_CONVENTION_CALLBACK));
  6789. printf("Alwaysinline definition: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_ALWAYSINLINE));
  6790. printf("Inline definition: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_INLINE));
  6791. nOutSuccessCount = 0;
  6792. nOutTestCount = 0;
  6793. return true;
  6794. }
  6795. //////////////////////////////////////////////////////////////////////////
  6796. //////////////////////////////////////////////////////////////////////////
  6797. //////////////////////////////////////////////////////////////////////////
  6798. enum EOUSUBSYSTEMTEST
  6799. {
  6800. OST__MIN,
  6801. OST_INTTYPES = OST__MIN,
  6802. OST_MACROS,
  6803. OST_TEMPLATES,
  6804. OST_TYPEWRAPPER,
  6805. OST_ASSERT,
  6806. OST_MALLOC,
  6807. OST_CUSTOMIZATION,
  6808. OST_ENUMARRAYS,
  6809. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  6810. OST_ATOMIC,
  6811. #endif
  6812. OST_FLAGSDEFINES,
  6813. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  6814. OST_ATOMICFLAGS,
  6815. #endif
  6816. OST_SIMPLEFLAGS64,
  6817. OST_SIMPLEFLAGS32,
  6818. OST_SIMPLEFLAGS16,
  6819. OST_SIMPLEFLAGS8,
  6820. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
  6821. OST_TLS,
  6822. #endif
  6823. OST_PLATFORM,
  6824. OST__MAX,
  6825. };
  6826. typedef bool (*COUSubsystemTestProcedure)(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount);
  6827. template<>
  6828. COUSubsystemTestProcedure const CEnumUnsortedElementArray<EOUSUBSYSTEMTEST, OST__MAX, COUSubsystemTestProcedure>::m_aetElementArray[] =
  6829. {
  6830. &TestIntTypes, // OST_INTTYPES,
  6831. &TestMacros, // OST_MACROS,
  6832. &TestTemplates, // OST_TEMPLATES,
  6833. &TestTypeWrapper, // OST_TYPEWRAPPER,
  6834. &TestAssert, // OST_ASSERT,
  6835. &TestMalloc, // OST_MALLOC,
  6836. &TestCustomization, // OST_CUSTOMIZATION,
  6837. &TestEnumArrays, // OST_ENUMARRAYS,
  6838. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  6839. &TestAtomic, // OST_ATOMIC,
  6840. #endif
  6841. &TestFlagsDefines, // OST_FLAGSDEFINES,
  6842. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  6843. &TestAtomicFlags, // OST_ATOMICFLAGS,
  6844. #endif
  6845. &TestSimpleFlags64, // OST_SIMPLEFLAGS64,
  6846. &TestSimpleFlags32, // OST_SIMPLEFLAGS32,
  6847. &TestSimpleFlags16, // OST_SIMPLEFLAGS16,
  6848. &TestSimpleFlags8, // OST_SIMPLEFLAGS8,
  6849. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
  6850. &TestTLS, // OST_TLS,
  6851. #endif
  6852. &TestPlatform, // OST_PLATFORM,
  6853. };
  6854. static const CEnumUnsortedElementArray<EOUSUBSYSTEMTEST, OST__MAX, COUSubsystemTestProcedure> g_afnOUSubsystemTestProcedures;
  6855. template<>
  6856. const char *const CEnumUnsortedElementArray<EOUSUBSYSTEMTEST, OST__MAX, const char *>::m_aetElementArray[] =
  6857. {
  6858. "IntTypes", // OST_INTTYPES,
  6859. "Macros", // OST_MACROS,
  6860. "Templates", // OST_TEMPLATES,
  6861. "TypeWrapper", // OST_TYPEWRAPPER,
  6862. "Assert", // OST_ASSERT,
  6863. "Malloc", // OST_MALLOC,
  6864. "Customization", // OST_CUSTOMIZATION,
  6865. "EnumArrays", // OST_ENUMARRAYS,
  6866. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  6867. "Atomic", // OST_ATOMIC,
  6868. #endif
  6869. "FlagsDefines", // OST_FLAGSDEFINES,
  6870. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS
  6871. "AtomicFlags", // OST_ATOMICFLAGS,
  6872. #endif
  6873. "SimpleFlags64", // OST_SIMPLEFLAGS64,
  6874. "SimpleFlags32", // OST_SIMPLEFLAGS32,
  6875. "SimpleFlags16", // OST_SIMPLEFLAGS16,
  6876. "SimpleFlags8", // OST_SIMPLEFLAGS8,
  6877. #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS
  6878. "TLS", // OST_TLS,
  6879. #endif
  6880. "Platform", // OST_PLATFORM,
  6881. };
  6882. static const CEnumUnsortedElementArray<EOUSUBSYSTEMTEST, OST__MAX, const char *> g_aszOUSubsystemNames;
  6883. bool ProcessOUCoverageTests(unsigned int &nOutFailureCount)
  6884. {
  6885. unsigned int nSuccessCount = 0;
  6886. for (EOUSUBSYSTEMTEST stSubsystemTest = OST__MIN; stSubsystemTest != OST__MAX; ++stSubsystemTest)
  6887. {
  6888. const char *szSubsystemName = g_aszOUSubsystemNames.Encode(stSubsystemTest);
  6889. printf("\nTesting subsystem \"%s\"\n", szSubsystemName);
  6890. printf("---------------------------------------------------\n");
  6891. unsigned int nSubsysytemSuccessCount = 0, nSubsystemTestCount = 1;
  6892. COUSubsystemTestProcedure fnTestProcedure = g_afnOUSubsystemTestProcedures.Encode(stSubsystemTest);
  6893. if (fnTestProcedure(nSubsysytemSuccessCount, nSubsystemTestCount) && nSubsysytemSuccessCount == nSubsystemTestCount)
  6894. {
  6895. nSuccessCount += 1;
  6896. }
  6897. unsigned int nSubsysytemFailureCount = nSubsystemTestCount - nSubsysytemSuccessCount;
  6898. printf("---------------------------------------------------\n");
  6899. printf("Feature tests failed: %3u out of %3u\n", nSubsysytemFailureCount, nSubsystemTestCount);
  6900. }
  6901. unsigned int nFailureCount = OST__MAX - nSuccessCount;
  6902. printf("\n===================================================\n");
  6903. printf("Subsystem tests failed: %3u out of %3u\n", nFailureCount, (unsigned int)OST__MAX);
  6904. nOutFailureCount = nFailureCount;
  6905. return nSuccessCount == OST__MAX;
  6906. }
  6907. int main(int argc, char* argv[])
  6908. {
  6909. unsigned int nFailureCount;
  6910. ProcessOUCoverageTests(nFailureCount);
  6911. return nFailureCount;
  6912. }