1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487 |
- // -*- C++ -*-
- //===--------------------------- regex ------------------------------------===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is dual licensed under the MIT and the University of Illinois Open
- // Source Licenses. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- #ifndef _LIBCPP_REGEX
- #define _LIBCPP_REGEX
- /*
- regex synopsis
- #include <initializer_list>
- namespace std
- {
- namespace regex_constants
- {
- emum syntax_option_type
- {
- icase = unspecified,
- nosubs = unspecified,
- optimize = unspecified,
- collate = unspecified,
- ECMAScript = unspecified,
- basic = unspecified,
- extended = unspecified,
- awk = unspecified,
- grep = unspecified,
- egrep = unspecified
- };
- constexpr syntax_option_type operator~(syntax_option_type f);
- constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
- constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);
- enum match_flag_type
- {
- match_default = 0,
- match_not_bol = unspecified,
- match_not_eol = unspecified,
- match_not_bow = unspecified,
- match_not_eow = unspecified,
- match_any = unspecified,
- match_not_null = unspecified,
- match_continuous = unspecified,
- match_prev_avail = unspecified,
- format_default = 0,
- format_sed = unspecified,
- format_no_copy = unspecified,
- format_first_only = unspecified
- };
- constexpr match_flag_type operator~(match_flag_type f);
- constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
- constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);
- enum error_type
- {
- error_collate = unspecified,
- error_ctype = unspecified,
- error_escape = unspecified,
- error_backref = unspecified,
- error_brack = unspecified,
- error_paren = unspecified,
- error_brace = unspecified,
- error_badbrace = unspecified,
- error_range = unspecified,
- error_space = unspecified,
- error_badrepeat = unspecified,
- error_complexity = unspecified,
- error_stack = unspecified
- };
- } // regex_constants
- class regex_error
- : public runtime_error
- {
- public:
- explicit regex_error(regex_constants::error_type ecode);
- regex_constants::error_type code() const;
- };
- template <class charT>
- struct regex_traits
- {
- public:
- typedef charT char_type;
- typedef basic_string<char_type> string_type;
- typedef locale locale_type;
- typedef /bitmask_type/ char_class_type;
- regex_traits();
- static size_t length(const char_type* p);
- charT translate(charT c) const;
- charT translate_nocase(charT c) const;
- template <class ForwardIterator>
- string_type
- transform(ForwardIterator first, ForwardIterator last) const;
- template <class ForwardIterator>
- string_type
- transform_primary( ForwardIterator first, ForwardIterator last) const;
- template <class ForwardIterator>
- string_type
- lookup_collatename(ForwardIterator first, ForwardIterator last) const;
- template <class ForwardIterator>
- char_class_type
- lookup_classname(ForwardIterator first, ForwardIterator last,
- bool icase = false) const;
- bool isctype(charT c, char_class_type f) const;
- int value(charT ch, int radix) const;
- locale_type imbue(locale_type l);
- locale_type getloc()const;
- };
- template <class charT, class traits = regex_traits<charT>>
- class basic_regex
- {
- public:
- // types:
- typedef charT value_type;
- typedef regex_constants::syntax_option_type flag_type;
- typedef typename traits::locale_type locale_type;
- // constants:
- static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
- static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
- static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
- static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
- static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
- static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
- static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
- static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
- static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
- static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
- // construct/copy/destroy:
- basic_regex();
- explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
- basic_regex(const charT* p, size_t len, flag_type f);
- basic_regex(const basic_regex&);
- basic_regex(basic_regex&&) noexcept;
- template <class ST, class SA>
- explicit basic_regex(const basic_string<charT, ST, SA>& p,
- flag_type f = regex_constants::ECMAScript);
- template <class ForwardIterator>
- basic_regex(ForwardIterator first, ForwardIterator last,
- flag_type f = regex_constants::ECMAScript);
- basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
- ~basic_regex();
- basic_regex& operator=(const basic_regex&);
- basic_regex& operator=(basic_regex&&) noexcept;
- basic_regex& operator=(const charT* ptr);
- basic_regex& operator=(initializer_list<charT> il);
- template <class ST, class SA>
- basic_regex& operator=(const basic_string<charT, ST, SA>& p);
- // assign:
- basic_regex& assign(const basic_regex& that);
- basic_regex& assign(basic_regex&& that) noexcept;
- basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
- basic_regex& assign(const charT* p, size_t len, flag_type f);
- template <class string_traits, class A>
- basic_regex& assign(const basic_string<charT, string_traits, A>& s,
- flag_type f = regex_constants::ECMAScript);
- template <class InputIterator>
- basic_regex& assign(InputIterator first, InputIterator last,
- flag_type f = regex_constants::ECMAScript);
- basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
- // const operations:
- unsigned mark_count() const;
- flag_type flags() const;
- // locale:
- locale_type imbue(locale_type loc);
- locale_type getloc() const;
- // swap:
- void swap(basic_regex&);
- };
- typedef basic_regex<char> regex;
- typedef basic_regex<wchar_t> wregex;
- template <class charT, class traits>
- void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
- template <class BidirectionalIterator>
- class sub_match
- : public pair<BidirectionalIterator, BidirectionalIterator>
- {
- public:
- typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
- typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
- typedef BidirectionalIterator iterator;
- typedef basic_string<value_type> string_type;
- bool matched;
- constexpr sub_match();
- difference_type length() const;
- operator string_type() const;
- string_type str() const;
- int compare(const sub_match& s) const;
- int compare(const string_type& s) const;
- int compare(const value_type* s) const;
- };
- typedef sub_match<const char*> csub_match;
- typedef sub_match<const wchar_t*> wcsub_match;
- typedef sub_match<string::const_iterator> ssub_match;
- typedef sub_match<wstring::const_iterator> wssub_match;
- template <class BiIter>
- bool
- operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter, class ST, class SA>
- bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator==(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator!=(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator<(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
- template <class BiIter, class ST, class SA>
- bool operator>(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator>=(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
- template <class BiIter, class ST, class SA>
- bool
- operator<=(const sub_match<BiIter>& lhs,
- const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
- template <class BiIter>
- bool
- operator==(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator<(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator>(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator==(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
- template <class BiIter>
- bool
- operator!=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
- template <class BiIter>
- bool
- operator<(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
- template <class BiIter>
- bool
- operator>(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
- template <class BiIter>
- bool
- operator>=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
- template <class BiIter>
- bool
- operator<=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const* rhs);
- template <class BiIter>
- bool
- operator==(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator<(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator>(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
- const sub_match<BiIter>& rhs);
- template <class BiIter>
- bool
- operator==(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
- template <class BiIter>
- bool
- operator!=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
- template <class BiIter>
- bool
- operator<(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
- template <class BiIter>
- bool
- operator>(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
- template <class BiIter>
- bool
- operator>=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
- template <class BiIter>
- bool
- operator<=(const sub_match<BiIter>& lhs,
- typename iterator_traits<BiIter>::value_type const& rhs);
- template <class charT, class ST, class BiIter>
- basic_ostream<charT, ST>&
- operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
- template <class BidirectionalIterator,
- class Allocator = allocator<sub_match<BidirectionalIterator>>>
- class match_results
- {
- public:
- typedef sub_match<BidirectionalIterator> value_type;
- typedef const value_type& const_reference;
- typedef const_reference reference;
- typedef /implementation-defined/ const_iterator;
- typedef const_iterator iterator;
- typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
- typedef typename allocator_traits<Allocator>::size_type size_type;
- typedef Allocator allocator_type;
- typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
- typedef basic_string<char_type> string_type;
- // construct/copy/destroy:
- explicit match_results(const Allocator& a = Allocator());
- match_results(const match_results& m);
- match_results(match_results&& m) noexcept;
- match_results& operator=(const match_results& m);
- match_results& operator=(match_results&& m);
- ~match_results();
- bool ready() const;
- // size:
- size_type size() const;
- size_type max_size() const;
- bool empty() const;
- // element access:
- difference_type length(size_type sub = 0) const;
- difference_type position(size_type sub = 0) const;
- string_type str(size_type sub = 0) const;
- const_reference operator[](size_type n) const;
- const_reference prefix() const;
- const_reference suffix() const;
- const_iterator begin() const;
- const_iterator end() const;
- const_iterator cbegin() const;
- const_iterator cend() const;
- // format:
- template <class OutputIter>
- OutputIter
- format(OutputIter out, const char_type* fmt_first,
- const char_type* fmt_last,
- regex_constants::match_flag_type flags = regex_constants::format_default) const;
- template <class OutputIter, class ST, class SA>
- OutputIter
- format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::format_default) const;
- template <class ST, class SA>
- basic_string<char_type, ST, SA>
- format(const basic_string<char_type, ST, SA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::format_default) const;
- string_type
- format(const char_type* fmt,
- regex_constants::match_flag_type flags = regex_constants::format_default) const;
- // allocator:
- allocator_type get_allocator() const;
- // swap:
- void swap(match_results& that);
- };
- typedef match_results<const char*> cmatch;
- typedef match_results<const wchar_t*> wcmatch;
- typedef match_results<string::const_iterator> smatch;
- typedef match_results<wstring::const_iterator> wsmatch;
- template <class BidirectionalIterator, class Allocator>
- bool
- operator==(const match_results<BidirectionalIterator, Allocator>& m1,
- const match_results<BidirectionalIterator, Allocator>& m2);
- template <class BidirectionalIterator, class Allocator>
- bool
- operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
- const match_results<BidirectionalIterator, Allocator>& m2);
- template <class BidirectionalIterator, class Allocator>
- void
- swap(match_results<BidirectionalIterator, Allocator>& m1,
- match_results<BidirectionalIterator, Allocator>& m2);
- template <class BidirectionalIterator, class Allocator, class charT, class traits>
- bool
- regex_match(BidirectionalIterator first, BidirectionalIterator last,
- match_results<BidirectionalIterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class BidirectionalIterator, class charT, class traits>
- bool
- regex_match(BidirectionalIterator first, BidirectionalIterator last,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class charT, class Allocator, class traits>
- bool
- regex_match(const charT* str, match_results<const charT*, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class ST, class SA, class Allocator, class charT, class traits>
- bool
- regex_match(const basic_string<charT, ST, SA>& s,
- match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class charT, class traits>
- bool
- regex_match(const charT* str, const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class ST, class SA, class charT, class traits>
- bool
- regex_match(const basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class BidirectionalIterator, class Allocator, class charT, class traits>
- bool
- regex_search(BidirectionalIterator first, BidirectionalIterator last,
- match_results<BidirectionalIterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class BidirectionalIterator, class charT, class traits>
- bool
- regex_search(BidirectionalIterator first, BidirectionalIterator last,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class charT, class Allocator, class traits>
- bool
- regex_search(const charT* str, match_results<const charT*, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class charT, class traits>
- bool
- regex_search(const charT* str, const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class ST, class SA, class charT, class traits>
- bool
- regex_search(const basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class ST, class SA, class Allocator, class charT, class traits>
- bool
- regex_search(const basic_string<charT, ST, SA>& s,
- match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class OutputIterator, class BidirectionalIterator,
- class traits, class charT, class ST, class SA>
- OutputIterator
- regex_replace(OutputIterator out,
- BidirectionalIterator first, BidirectionalIterator last,
- const basic_regex<charT, traits>& e,
- const basic_string<charT, ST, SA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class OutputIterator, class BidirectionalIterator,
- class traits, class charT>
- OutputIterator
- regex_replace(OutputIterator out,
- BidirectionalIterator first, BidirectionalIterator last,
- const basic_regex<charT, traits>& e, const charT* fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class traits, class charT, class ST, class SA, class FST, class FSA>>
- basic_string<charT, ST, SA>
- regex_replace(const basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e,
- const basic_string<charT, FST, FSA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class traits, class charT, class ST, class SA>
- basic_string<charT, ST, SA>
- regex_replace(const basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e, const charT* fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class traits, class charT, class ST, class SA>
- basic_string<charT>
- regex_replace(const charT* s,
- const basic_regex<charT, traits>& e,
- const basic_string<charT, ST, SA>& fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class traits, class charT>
- basic_string<charT>
- regex_replace(const charT* s,
- const basic_regex<charT, traits>& e,
- const charT* fmt,
- regex_constants::match_flag_type flags = regex_constants::match_default);
- template <class BidirectionalIterator,
- class charT = typename iterator_traits< BidirectionalIterator>::value_type,
- class traits = regex_traits<charT>>
- class regex_iterator
- {
- public:
- typedef basic_regex<charT, traits> regex_type;
- typedef match_results<BidirectionalIterator> value_type;
- typedef ptrdiff_t difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef forward_iterator_tag iterator_category;
- regex_iterator();
- regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re,
- regex_constants::match_flag_type m = regex_constants::match_default);
- regex_iterator(const regex_iterator&);
- regex_iterator& operator=(const regex_iterator&);
- bool operator==(const regex_iterator&) const;
- bool operator!=(const regex_iterator&) const;
- const value_type& operator*() const;
- const value_type* operator->() const;
- regex_iterator& operator++();
- regex_iterator operator++(int);
- };
- typedef regex_iterator<const char*> cregex_iterator;
- typedef regex_iterator<const wchar_t*> wcregex_iterator;
- typedef regex_iterator<string::const_iterator> sregex_iterator;
- typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
- template <class BidirectionalIterator,
- class charT = typename iterator_traits< BidirectionalIterator>::value_type,
- class traits = regex_traits<charT>>
- class regex_token_iterator
- {
- public:
- typedef basic_regex<charT, traits> regex_type;
- typedef sub_match<BidirectionalIterator> value_type;
- typedef ptrdiff_t difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef forward_iterator_tag iterator_category;
- regex_token_iterator();
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re, int submatch = 0,
- regex_constants::match_flag_type m = regex_constants::match_default);
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re, const vector<int>& submatches,
- regex_constants::match_flag_type m = regex_constants::match_default);
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re, initializer_list<int> submatches,
- regex_constants::match_flag_type m = regex_constants::match_default);
- template <size_t N>
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re, const int (&submatches)[N],
- regex_constants::match_flag_type m = regex_constants::match_default);
- regex_token_iterator(const regex_token_iterator&);
- regex_token_iterator& operator=(const regex_token_iterator&);
- bool operator==(const regex_token_iterator&) const;
- bool operator!=(const regex_token_iterator&) const;
- const value_type& operator*() const;
- const value_type* operator->() const;
- regex_token_iterator& operator++();
- regex_token_iterator operator++(int);
- };
- typedef regex_token_iterator<const char*> cregex_token_iterator;
- typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
- typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
- typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
- } // std
- */
- #include <__config>
- #include <stdexcept>
- #include <__locale>
- #include <initializer_list>
- #include <utility>
- #include <iterator>
- #include <string>
- #include <memory>
- #include <vector>
- #include <deque>
- #include <__undef_min_max>
- #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
- #pragma GCC system_header
- #endif
- _LIBCPP_BEGIN_NAMESPACE_STD
- namespace regex_constants
- {
- // syntax_option_type
- enum syntax_option_type
- {
- icase = 1 << 0,
- nosubs = 1 << 1,
- optimize = 1 << 2,
- collate = 1 << 3,
- ECMAScript = 0,
- basic = 1 << 4,
- extended = 1 << 5,
- awk = 1 << 6,
- grep = 1 << 7,
- egrep = 1 << 8
- };
- inline _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- syntax_option_type
- operator~(syntax_option_type __x)
- {
- return syntax_option_type(~int(__x) & 0x1FF);
- }
- inline _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- syntax_option_type
- operator&(syntax_option_type __x, syntax_option_type __y)
- {
- return syntax_option_type(int(__x) & int(__y));
- }
- inline _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- syntax_option_type
- operator|(syntax_option_type __x, syntax_option_type __y)
- {
- return syntax_option_type(int(__x) | int(__y));
- }
- inline _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- syntax_option_type
- operator^(syntax_option_type __x, syntax_option_type __y)
- {
- return syntax_option_type(int(__x) ^ int(__y));
- }
- inline _LIBCPP_INLINE_VISIBILITY
- syntax_option_type&
- operator&=(syntax_option_type& __x, syntax_option_type __y)
- {
- __x = __x & __y;
- return __x;
- }
- inline _LIBCPP_INLINE_VISIBILITY
- syntax_option_type&
- operator|=(syntax_option_type& __x, syntax_option_type __y)
- {
- __x = __x | __y;
- return __x;
- }
- inline _LIBCPP_INLINE_VISIBILITY
- syntax_option_type&
- operator^=(syntax_option_type& __x, syntax_option_type __y)
- {
- __x = __x ^ __y;
- return __x;
- }
- // match_flag_type
- enum match_flag_type
- {
- match_default = 0,
- match_not_bol = 1 << 0,
- match_not_eol = 1 << 1,
- match_not_bow = 1 << 2,
- match_not_eow = 1 << 3,
- match_any = 1 << 4,
- match_not_null = 1 << 5,
- match_continuous = 1 << 6,
- match_prev_avail = 1 << 7,
- format_default = 0,
- format_sed = 1 << 8,
- format_no_copy = 1 << 9,
- format_first_only = 1 << 10,
- __no_update_pos = 1 << 11
- };
- inline _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- match_flag_type
- operator~(match_flag_type __x)
- {
- return match_flag_type(~int(__x) & 0x0FFF);
- }
- inline _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- match_flag_type
- operator&(match_flag_type __x, match_flag_type __y)
- {
- return match_flag_type(int(__x) & int(__y));
- }
- inline _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- match_flag_type
- operator|(match_flag_type __x, match_flag_type __y)
- {
- return match_flag_type(int(__x) | int(__y));
- }
- inline _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- match_flag_type
- operator^(match_flag_type __x, match_flag_type __y)
- {
- return match_flag_type(int(__x) ^ int(__y));
- }
- inline _LIBCPP_INLINE_VISIBILITY
- match_flag_type&
- operator&=(match_flag_type& __x, match_flag_type __y)
- {
- __x = __x & __y;
- return __x;
- }
- inline _LIBCPP_INLINE_VISIBILITY
- match_flag_type&
- operator|=(match_flag_type& __x, match_flag_type __y)
- {
- __x = __x | __y;
- return __x;
- }
- inline _LIBCPP_INLINE_VISIBILITY
- match_flag_type&
- operator^=(match_flag_type& __x, match_flag_type __y)
- {
- __x = __x ^ __y;
- return __x;
- }
- enum error_type
- {
- error_collate = 1,
- error_ctype,
- error_escape,
- error_backref,
- error_brack,
- error_paren,
- error_brace,
- error_badbrace,
- error_range,
- error_space,
- error_badrepeat,
- error_complexity,
- error_stack,
- __re_err_grammar,
- __re_err_empty,
- __re_err_unknown
- };
- } // regex_constants
- class _LIBCPP_EXCEPTION_ABI regex_error
- : public runtime_error
- {
- regex_constants::error_type __code_;
- public:
- explicit regex_error(regex_constants::error_type __ecode);
- virtual ~regex_error() throw();
- _LIBCPP_INLINE_VISIBILITY
- regex_constants::error_type code() const {return __code_;}
- };
- template <class _CharT>
- struct _LIBCPP_TYPE_VIS_ONLY regex_traits
- {
- public:
- typedef _CharT char_type;
- typedef basic_string<char_type> string_type;
- typedef locale locale_type;
- typedef ctype_base::mask char_class_type;
- static const char_class_type __regex_word = 0x80;
- private:
- locale __loc_;
- const ctype<char_type>* __ct_;
- const collate<char_type>* __col_;
- public:
- regex_traits();
- _LIBCPP_INLINE_VISIBILITY
- static size_t length(const char_type* __p)
- {return char_traits<char_type>::length(__p);}
- _LIBCPP_INLINE_VISIBILITY
- char_type translate(char_type __c) const {return __c;}
- char_type translate_nocase(char_type __c) const;
- template <class _ForwardIterator>
- string_type
- transform(_ForwardIterator __f, _ForwardIterator __l) const;
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- string_type
- transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
- {return __transform_primary(__f, __l, char_type());}
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- string_type
- lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
- {return __lookup_collatename(__f, __l, char_type());}
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- char_class_type
- lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
- bool __icase = false) const
- {return __lookup_classname(__f, __l, __icase, char_type());}
- bool isctype(char_type __c, char_class_type __m) const;
- _LIBCPP_INLINE_VISIBILITY
- int value(char_type __ch, int __radix) const
- {return __regex_traits_value(__ch, __radix);}
- locale_type imbue(locale_type __l);
- _LIBCPP_INLINE_VISIBILITY
- locale_type getloc()const {return __loc_;}
- private:
- void __init();
- template <class _ForwardIterator>
- string_type
- __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
- template <class _ForwardIterator>
- string_type
- __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
- template <class _ForwardIterator>
- string_type
- __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
- template <class _ForwardIterator>
- string_type
- __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
- template <class _ForwardIterator>
- char_class_type
- __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
- bool __icase, char) const;
- template <class _ForwardIterator>
- char_class_type
- __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
- bool __icase, wchar_t) const;
- static int __regex_traits_value(unsigned char __ch, int __radix);
- _LIBCPP_INLINE_VISIBILITY
- int __regex_traits_value(char __ch, int __radix) const
- {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
- int __regex_traits_value(wchar_t __ch, int __radix) const;
- };
- template <class _CharT>
- const typename regex_traits<_CharT>::char_class_type
- regex_traits<_CharT>::__regex_word;
- template <class _CharT>
- regex_traits<_CharT>::regex_traits()
- {
- __init();
- }
- template <class _CharT>
- typename regex_traits<_CharT>::char_type
- regex_traits<_CharT>::translate_nocase(char_type __c) const
- {
- return __ct_->tolower(__c);
- }
- template <class _CharT>
- template <class _ForwardIterator>
- typename regex_traits<_CharT>::string_type
- regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
- {
- string_type __s(__f, __l);
- return __col_->transform(__s.data(), __s.data() + __s.size());
- }
- template <class _CharT>
- void
- regex_traits<_CharT>::__init()
- {
- __ct_ = &use_facet<ctype<char_type> >(__loc_);
- __col_ = &use_facet<collate<char_type> >(__loc_);
- }
- template <class _CharT>
- typename regex_traits<_CharT>::locale_type
- regex_traits<_CharT>::imbue(locale_type __l)
- {
- locale __r = __loc_;
- __loc_ = __l;
- __init();
- return __r;
- }
- // transform_primary is very FreeBSD-specific
- template <class _CharT>
- template <class _ForwardIterator>
- typename regex_traits<_CharT>::string_type
- regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
- _ForwardIterator __l, char) const
- {
- const string_type __s(__f, __l);
- string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
- switch (__d.size())
- {
- case 1:
- break;
- case 12:
- __d[11] = __d[3];
- break;
- default:
- __d.clear();
- break;
- }
- return __d;
- }
- template <class _CharT>
- template <class _ForwardIterator>
- typename regex_traits<_CharT>::string_type
- regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
- _ForwardIterator __l, wchar_t) const
- {
- const string_type __s(__f, __l);
- string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
- switch (__d.size())
- {
- case 1:
- break;
- case 3:
- __d[2] = __d[0];
- break;
- default:
- __d.clear();
- break;
- }
- return __d;
- }
- // lookup_collatename is very FreeBSD-specific
- _LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
- template <class _CharT>
- template <class _ForwardIterator>
- typename regex_traits<_CharT>::string_type
- regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
- _ForwardIterator __l, char) const
- {
- string_type __s(__f, __l);
- string_type __r;
- if (!__s.empty())
- {
- __r = __get_collation_name(__s.c_str());
- if (__r.empty() && __s.size() <= 2)
- {
- __r = __col_->transform(__s.data(), __s.data() + __s.size());
- if (__r.size() == 1 || __r.size() == 12)
- __r = __s;
- else
- __r.clear();
- }
- }
- return __r;
- }
- template <class _CharT>
- template <class _ForwardIterator>
- typename regex_traits<_CharT>::string_type
- regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
- _ForwardIterator __l, wchar_t) const
- {
- string_type __s(__f, __l);
- string __n;
- __n.reserve(__s.size());
- for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
- __i != __e; ++__i)
- {
- if (static_cast<unsigned>(*__i) >= 127)
- return string_type();
- __n.push_back(char(*__i));
- }
- string_type __r;
- if (!__s.empty())
- {
- __n = __get_collation_name(__n.c_str());
- if (!__n.empty())
- __r.assign(__n.begin(), __n.end());
- else if (__s.size() <= 2)
- {
- __r = __col_->transform(__s.data(), __s.data() + __s.size());
- if (__r.size() == 1 || __r.size() == 3)
- __r = __s;
- else
- __r.clear();
- }
- }
- return __r;
- }
- // lookup_classname
- ctype_base::mask _LIBCPP_FUNC_VIS __get_classname(const char* __s, bool __icase);
- template <class _CharT>
- template <class _ForwardIterator>
- typename regex_traits<_CharT>::char_class_type
- regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
- _ForwardIterator __l,
- bool __icase, char) const
- {
- string_type __s(__f, __l);
- __ct_->tolower(&__s[0], &__s[0] + __s.size());
- return __get_classname(__s.c_str(), __icase);
- }
- template <class _CharT>
- template <class _ForwardIterator>
- typename regex_traits<_CharT>::char_class_type
- regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
- _ForwardIterator __l,
- bool __icase, wchar_t) const
- {
- string_type __s(__f, __l);
- __ct_->tolower(&__s[0], &__s[0] + __s.size());
- string __n;
- __n.reserve(__s.size());
- for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
- __i != __e; ++__i)
- {
- if (static_cast<unsigned>(*__i) >= 127)
- return char_class_type();
- __n.push_back(char(*__i));
- }
- return __get_classname(__n.c_str(), __icase);
- }
- template <class _CharT>
- bool
- regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
- {
- if (__ct_->is(__m, __c))
- return true;
- return (__c == '_' && (__m & __regex_word));
- }
- template <class _CharT>
- int
- regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
- {
- if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
- return __ch - '0';
- if (__radix != 8)
- {
- if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9'
- return __ch - '0';
- if (__radix == 16)
- {
- __ch |= 0x20; // tolower
- if ('a' <= __ch && __ch <= 'f')
- return __ch - ('a' - 10);
- }
- }
- return -1;
- }
- template <class _CharT>
- inline _LIBCPP_INLINE_VISIBILITY
- int
- regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
- {
- return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
- }
- template <class _CharT> class __node;
- template <class _BidirectionalIterator> class _LIBCPP_TYPE_VIS_ONLY sub_match;
- template <class _BidirectionalIterator,
- class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
- class _LIBCPP_TYPE_VIS_ONLY match_results;
- template <class _CharT>
- struct __state
- {
- enum
- {
- __end_state = -1000,
- __consume_input, // -999
- __begin_marked_expr, // -998
- __end_marked_expr, // -997
- __pop_state, // -996
- __accept_and_consume, // -995
- __accept_but_not_consume, // -994
- __reject, // -993
- __split,
- __repeat
- };
- int __do_;
- const _CharT* __first_;
- const _CharT* __current_;
- const _CharT* __last_;
- vector<sub_match<const _CharT*> > __sub_matches_;
- vector<pair<size_t, const _CharT*> > __loop_data_;
- const __node<_CharT>* __node_;
- regex_constants::match_flag_type __flags_;
- bool __at_first_;
- _LIBCPP_INLINE_VISIBILITY
- __state()
- : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
- __node_(nullptr), __flags_() {}
- };
- // __node
- template <class _CharT>
- class __node
- {
- __node(const __node&);
- __node& operator=(const __node&);
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __node() {}
- _LIBCPP_INLINE_VISIBILITY
- virtual ~__node() {}
- _LIBCPP_INLINE_VISIBILITY
- virtual void __exec(__state&) const {};
- _LIBCPP_INLINE_VISIBILITY
- virtual void __exec_split(bool, __state&) const {};
- };
- // __end_state
- template <class _CharT>
- class __end_state
- : public __node<_CharT>
- {
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __end_state() {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __end_state<_CharT>::__exec(__state& __s) const
- {
- __s.__do_ = __state::__end_state;
- }
- // __has_one_state
- template <class _CharT>
- class __has_one_state
- : public __node<_CharT>
- {
- __node<_CharT>* __first_;
- public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __has_one_state(__node<_CharT>* __s)
- : __first_(__s) {}
- _LIBCPP_INLINE_VISIBILITY
- __node<_CharT>* first() const {return __first_;}
- _LIBCPP_INLINE_VISIBILITY
- __node<_CharT>*& first() {return __first_;}
- };
- // __owns_one_state
- template <class _CharT>
- class __owns_one_state
- : public __has_one_state<_CharT>
- {
- typedef __has_one_state<_CharT> base;
- public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __owns_one_state(__node<_CharT>* __s)
- : base(__s) {}
- virtual ~__owns_one_state();
- };
- template <class _CharT>
- __owns_one_state<_CharT>::~__owns_one_state()
- {
- delete this->first();
- }
- // __empty_state
- template <class _CharT>
- class __empty_state
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __empty_state(__node<_CharT>* __s)
- : base(__s) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __empty_state<_CharT>::__exec(__state& __s) const
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- }
- // __empty_non_own_state
- template <class _CharT>
- class __empty_non_own_state
- : public __has_one_state<_CharT>
- {
- typedef __has_one_state<_CharT> base;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __empty_non_own_state(__node<_CharT>* __s)
- : base(__s) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __empty_non_own_state<_CharT>::__exec(__state& __s) const
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- }
- // __repeat_one_loop
- template <class _CharT>
- class __repeat_one_loop
- : public __has_one_state<_CharT>
- {
- typedef __has_one_state<_CharT> base;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __repeat_one_loop(__node<_CharT>* __s)
- : base(__s) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __repeat_one_loop<_CharT>::__exec(__state& __s) const
- {
- __s.__do_ = __state::__repeat;
- __s.__node_ = this->first();
- }
- // __owns_two_states
- template <class _CharT>
- class __owns_two_states
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- base* __second_;
- public:
- _LIBCPP_INLINE_VISIBILITY
- explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
- : base(__s1), __second_(__s2) {}
- virtual ~__owns_two_states();
- _LIBCPP_INLINE_VISIBILITY
- base* second() const {return __second_;}
- _LIBCPP_INLINE_VISIBILITY
- base*& second() {return __second_;}
- };
- template <class _CharT>
- __owns_two_states<_CharT>::~__owns_two_states()
- {
- delete __second_;
- }
- // __loop
- template <class _CharT>
- class __loop
- : public __owns_two_states<_CharT>
- {
- typedef __owns_two_states<_CharT> base;
- size_t __min_;
- size_t __max_;
- unsigned __loop_id_;
- unsigned __mexp_begin_;
- unsigned __mexp_end_;
- bool __greedy_;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __loop(unsigned __loop_id,
- __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
- unsigned __mexp_begin, unsigned __mexp_end,
- bool __greedy = true,
- size_t __min = 0,
- size_t __max = numeric_limits<size_t>::max())
- : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
- __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
- __greedy_(__greedy) {}
- virtual void __exec(__state& __s) const;
- virtual void __exec_split(bool __second, __state& __s) const;
- private:
- _LIBCPP_INLINE_VISIBILITY
- void __init_repeat(__state& __s) const
- {
- __s.__loop_data_[__loop_id_].second = __s.__current_;
- for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
- {
- __s.__sub_matches_[__i].first = __s.__last_;
- __s.__sub_matches_[__i].second = __s.__last_;
- __s.__sub_matches_[__i].matched = false;
- }
- }
- };
- template <class _CharT>
- void
- __loop<_CharT>::__exec(__state& __s) const
- {
- if (__s.__do_ == __state::__repeat)
- {
- bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
- bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
- if (__do_repeat && __do_alt &&
- __s.__loop_data_[__loop_id_].second == __s.__current_)
- __do_repeat = false;
- if (__do_repeat && __do_alt)
- __s.__do_ = __state::__split;
- else if (__do_repeat)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- __init_repeat(__s);
- }
- else
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->second();
- }
- }
- else
- {
- __s.__loop_data_[__loop_id_].first = 0;
- bool __do_repeat = 0 < __max_;
- bool __do_alt = 0 >= __min_;
- if (__do_repeat && __do_alt)
- __s.__do_ = __state::__split;
- else if (__do_repeat)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- __init_repeat(__s);
- }
- else
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->second();
- }
- }
- }
- template <class _CharT>
- void
- __loop<_CharT>::__exec_split(bool __second, __state& __s) const
- {
- __s.__do_ = __state::__accept_but_not_consume;
- if (__greedy_ != __second)
- {
- __s.__node_ = this->first();
- __init_repeat(__s);
- }
- else
- __s.__node_ = this->second();
- }
- // __alternate
- template <class _CharT>
- class __alternate
- : public __owns_two_states<_CharT>
- {
- typedef __owns_two_states<_CharT> base;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __alternate(__owns_one_state<_CharT>* __s1,
- __owns_one_state<_CharT>* __s2)
- : base(__s1, __s2) {}
- virtual void __exec(__state& __s) const;
- virtual void __exec_split(bool __second, __state& __s) const;
- };
- template <class _CharT>
- void
- __alternate<_CharT>::__exec(__state& __s) const
- {
- __s.__do_ = __state::__split;
- }
- template <class _CharT>
- void
- __alternate<_CharT>::__exec_split(bool __second, __state& __s) const
- {
- __s.__do_ = __state::__accept_but_not_consume;
- if (__second)
- __s.__node_ = this->second();
- else
- __s.__node_ = this->first();
- }
- // __begin_marked_subexpression
- template <class _CharT>
- class __begin_marked_subexpression
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- unsigned __mexp_;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
- : base(__s), __mexp_(__mexp) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __begin_marked_subexpression<_CharT>::__exec(__state& __s) const
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__sub_matches_[__mexp_-1].first = __s.__current_;
- __s.__node_ = this->first();
- }
- // __end_marked_subexpression
- template <class _CharT>
- class __end_marked_subexpression
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- unsigned __mexp_;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
- : base(__s), __mexp_(__mexp) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __end_marked_subexpression<_CharT>::__exec(__state& __s) const
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__sub_matches_[__mexp_-1].second = __s.__current_;
- __s.__sub_matches_[__mexp_-1].matched = true;
- __s.__node_ = this->first();
- }
- // __back_ref
- template <class _CharT>
- class __back_ref
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- unsigned __mexp_;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
- : base(__s), __mexp_(__mexp) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __back_ref<_CharT>::__exec(__state& __s) const
- {
- sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
- if (__sm.matched)
- {
- ptrdiff_t __len = __sm.second - __sm.first;
- if (__s.__last_ - __s.__current_ >= __len &&
- _VSTD::equal(__sm.first, __sm.second, __s.__current_))
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__current_ += __len;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __back_ref_icase
- template <class _CharT, class _Traits>
- class __back_ref_icase
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- _Traits __traits_;
- unsigned __mexp_;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
- __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __mexp_(__mexp) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT, class _Traits>
- void
- __back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
- {
- sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
- if (__sm.matched)
- {
- ptrdiff_t __len = __sm.second - __sm.first;
- if (__s.__last_ - __s.__current_ >= __len)
- {
- for (ptrdiff_t __i = 0; __i < __len; ++__i)
- {
- if (__traits_.translate_nocase(__sm.first[__i]) !=
- __traits_.translate_nocase(__s.__current_[__i]))
- goto __not_equal;
- }
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__current_ += __len;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- else
- {
- __not_equal:
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __back_ref_collate
- template <class _CharT, class _Traits>
- class __back_ref_collate
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- _Traits __traits_;
- unsigned __mexp_;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
- __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __mexp_(__mexp) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT, class _Traits>
- void
- __back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
- {
- sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
- if (__sm.matched)
- {
- ptrdiff_t __len = __sm.second - __sm.first;
- if (__s.__last_ - __s.__current_ >= __len)
- {
- for (ptrdiff_t __i = 0; __i < __len; ++__i)
- {
- if (__traits_.translate(__sm.first[__i]) !=
- __traits_.translate(__s.__current_[__i]))
- goto __not_equal;
- }
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__current_ += __len;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- else
- {
- __not_equal:
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __word_boundary
- template <class _CharT, class _Traits>
- class __word_boundary
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- _Traits __traits_;
- bool __invert_;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- explicit __word_boundary(const _Traits& __traits, bool __invert,
- __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __invert_(__invert) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT, class _Traits>
- void
- __word_boundary<_CharT, _Traits>::__exec(__state& __s) const
- {
- bool __is_word_b = false;
- if (__s.__first_ != __s.__last_)
- {
- if (__s.__current_ == __s.__last_)
- {
- if (!(__s.__flags_ & regex_constants::match_not_eow))
- {
- _CharT __c = __s.__current_[-1];
- __is_word_b = __c == '_' ||
- __traits_.isctype(__c, ctype_base::alnum);
- }
- }
- else if (__s.__current_ == __s.__first_ &&
- !(__s.__flags_ & regex_constants::match_prev_avail))
- {
- if (!(__s.__flags_ & regex_constants::match_not_bow))
- {
- _CharT __c = *__s.__current_;
- __is_word_b = __c == '_' ||
- __traits_.isctype(__c, ctype_base::alnum);
- }
- }
- else
- {
- _CharT __c1 = __s.__current_[-1];
- _CharT __c2 = *__s.__current_;
- bool __is_c1_b = __c1 == '_' ||
- __traits_.isctype(__c1, ctype_base::alnum);
- bool __is_c2_b = __c2 == '_' ||
- __traits_.isctype(__c2, ctype_base::alnum);
- __is_word_b = __is_c1_b != __is_c2_b;
- }
- }
- if (__is_word_b != __invert_)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __l_anchor
- template <class _CharT>
- class __l_anchor
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __l_anchor(__node<_CharT>* __s)
- : base(__s) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __l_anchor<_CharT>::__exec(__state& __s) const
- {
- if (__s.__at_first_ && __s.__current_ == __s.__first_)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __r_anchor
- template <class _CharT>
- class __r_anchor
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __r_anchor(__node<_CharT>* __s)
- : base(__s) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __r_anchor<_CharT>::__exec(__state& __s) const
- {
- if (__s.__current_ == __s.__last_)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __match_any
- template <class _CharT>
- class __match_any
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __match_any(__node<_CharT>* __s)
- : base(__s) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __match_any<_CharT>::__exec(__state& __s) const
- {
- if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
- {
- __s.__do_ = __state::__accept_and_consume;
- ++__s.__current_;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __match_any_but_newline
- template <class _CharT>
- class __match_any_but_newline
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __match_any_but_newline(__node<_CharT>* __s)
- : base(__s) {}
- virtual void __exec(__state&) const;
- };
- template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
- template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
- // __match_char
- template <class _CharT>
- class __match_char
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- _CharT __c_;
- __match_char(const __match_char&);
- __match_char& operator=(const __match_char&);
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __match_char(_CharT __c, __node<_CharT>* __s)
- : base(__s), __c_(__c) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT>
- void
- __match_char<_CharT>::__exec(__state& __s) const
- {
- if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
- {
- __s.__do_ = __state::__accept_and_consume;
- ++__s.__current_;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __match_char_icase
- template <class _CharT, class _Traits>
- class __match_char_icase
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- _Traits __traits_;
- _CharT __c_;
- __match_char_icase(const __match_char_icase&);
- __match_char_icase& operator=(const __match_char_icase&);
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT, class _Traits>
- void
- __match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
- {
- if (__s.__current_ != __s.__last_ &&
- __traits_.translate_nocase(*__s.__current_) == __c_)
- {
- __s.__do_ = __state::__accept_and_consume;
- ++__s.__current_;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __match_char_collate
- template <class _CharT, class _Traits>
- class __match_char_collate
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- _Traits __traits_;
- _CharT __c_;
- __match_char_collate(const __match_char_collate&);
- __match_char_collate& operator=(const __match_char_collate&);
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
- : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT, class _Traits>
- void
- __match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
- {
- if (__s.__current_ != __s.__last_ &&
- __traits_.translate(*__s.__current_) == __c_)
- {
- __s.__do_ = __state::__accept_and_consume;
- ++__s.__current_;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- // __bracket_expression
- template <class _CharT, class _Traits>
- class __bracket_expression
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- typedef typename _Traits::string_type string_type;
- _Traits __traits_;
- vector<_CharT> __chars_;
- vector<_CharT> __neg_chars_;
- vector<pair<string_type, string_type> > __ranges_;
- vector<pair<_CharT, _CharT> > __digraphs_;
- vector<string_type> __equivalences_;
- ctype_base::mask __mask_;
- ctype_base::mask __neg_mask_;
- bool __negate_;
- bool __icase_;
- bool __collate_;
- bool __might_have_digraph_;
- __bracket_expression(const __bracket_expression&);
- __bracket_expression& operator=(const __bracket_expression&);
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
- bool __negate, bool __icase, bool __collate)
- : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
- __negate_(__negate), __icase_(__icase), __collate_(__collate),
- __might_have_digraph_(__traits_.getloc().name() != "C") {}
- virtual void __exec(__state&) const;
- _LIBCPP_INLINE_VISIBILITY
- bool __negated() const {return __negate_;}
- _LIBCPP_INLINE_VISIBILITY
- void __add_char(_CharT __c)
- {
- if (__icase_)
- __chars_.push_back(__traits_.translate_nocase(__c));
- else if (__collate_)
- __chars_.push_back(__traits_.translate(__c));
- else
- __chars_.push_back(__c);
- }
- _LIBCPP_INLINE_VISIBILITY
- void __add_neg_char(_CharT __c)
- {
- if (__icase_)
- __neg_chars_.push_back(__traits_.translate_nocase(__c));
- else if (__collate_)
- __neg_chars_.push_back(__traits_.translate(__c));
- else
- __neg_chars_.push_back(__c);
- }
- _LIBCPP_INLINE_VISIBILITY
- void __add_range(string_type __b, string_type __e)
- {
- if (__collate_)
- {
- if (__icase_)
- {
- for (size_t __i = 0; __i < __b.size(); ++__i)
- __b[__i] = __traits_.translate_nocase(__b[__i]);
- for (size_t __i = 0; __i < __e.size(); ++__i)
- __e[__i] = __traits_.translate_nocase(__e[__i]);
- }
- else
- {
- for (size_t __i = 0; __i < __b.size(); ++__i)
- __b[__i] = __traits_.translate(__b[__i]);
- for (size_t __i = 0; __i < __e.size(); ++__i)
- __e[__i] = __traits_.translate(__e[__i]);
- }
- __ranges_.push_back(make_pair(
- __traits_.transform(__b.begin(), __b.end()),
- __traits_.transform(__e.begin(), __e.end())));
- }
- else
- {
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__b.size() != 1 || __e.size() != 1)
- throw regex_error(regex_constants::error_collate);
- #endif // _LIBCPP_NO_EXCEPTIONS
- if (__icase_)
- {
- __b[0] = __traits_.translate_nocase(__b[0]);
- __e[0] = __traits_.translate_nocase(__e[0]);
- }
- __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
- }
- }
- _LIBCPP_INLINE_VISIBILITY
- void __add_digraph(_CharT __c1, _CharT __c2)
- {
- if (__icase_)
- __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
- __traits_.translate_nocase(__c2)));
- else if (__collate_)
- __digraphs_.push_back(make_pair(__traits_.translate(__c1),
- __traits_.translate(__c2)));
- else
- __digraphs_.push_back(make_pair(__c1, __c2));
- }
- _LIBCPP_INLINE_VISIBILITY
- void __add_equivalence(const string_type& __s)
- {__equivalences_.push_back(__s);}
- _LIBCPP_INLINE_VISIBILITY
- void __add_class(ctype_base::mask __mask)
- {__mask_ |= __mask;}
- _LIBCPP_INLINE_VISIBILITY
- void __add_neg_class(ctype_base::mask __mask)
- {__neg_mask_ |= __mask;}
- };
- template <class _CharT, class _Traits>
- void
- __bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
- {
- bool __found = false;
- unsigned __consumed = 0;
- if (__s.__current_ != __s.__last_)
- {
- ++__consumed;
- if (__might_have_digraph_)
- {
- const _CharT* __next = _VSTD::next(__s.__current_);
- if (__next != __s.__last_)
- {
- pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
- if (__icase_)
- {
- __ch2.first = __traits_.translate_nocase(__ch2.first);
- __ch2.second = __traits_.translate_nocase(__ch2.second);
- }
- else if (__collate_)
- {
- __ch2.first = __traits_.translate(__ch2.first);
- __ch2.second = __traits_.translate(__ch2.second);
- }
- if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
- {
- // __ch2 is a digraph in this locale
- ++__consumed;
- for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
- {
- if (__ch2 == __digraphs_[__i])
- {
- __found = true;
- goto __exit;
- }
- }
- if (__collate_ && !__ranges_.empty())
- {
- string_type __s2 = __traits_.transform(&__ch2.first,
- &__ch2.first + 2);
- for (size_t __i = 0; __i < __ranges_.size(); ++__i)
- {
- if (__ranges_[__i].first <= __s2 &&
- __s2 <= __ranges_[__i].second)
- {
- __found = true;
- goto __exit;
- }
- }
- }
- if (!__equivalences_.empty())
- {
- string_type __s2 = __traits_.transform_primary(&__ch2.first,
- &__ch2.first + 2);
- for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
- {
- if (__s2 == __equivalences_[__i])
- {
- __found = true;
- goto __exit;
- }
- }
- }
- if (__traits_.isctype(__ch2.first, __mask_) &&
- __traits_.isctype(__ch2.second, __mask_))
- {
- __found = true;
- goto __exit;
- }
- if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
- !__traits_.isctype(__ch2.second, __neg_mask_))
- {
- __found = true;
- goto __exit;
- }
- goto __exit;
- }
- }
- }
- // test *__s.__current_ as not a digraph
- _CharT __ch = *__s.__current_;
- if (__icase_)
- __ch = __traits_.translate_nocase(__ch);
- else if (__collate_)
- __ch = __traits_.translate(__ch);
- for (size_t __i = 0; __i < __chars_.size(); ++__i)
- {
- if (__ch == __chars_[__i])
- {
- __found = true;
- goto __exit;
- }
- }
- if (!__neg_chars_.empty())
- {
- for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
- {
- if (__ch == __neg_chars_[__i])
- goto __is_neg_char;
- }
- __found = true;
- goto __exit;
- }
- __is_neg_char:
- if (!__ranges_.empty())
- {
- string_type __s2 = __collate_ ?
- __traits_.transform(&__ch, &__ch + 1) :
- string_type(1, __ch);
- for (size_t __i = 0; __i < __ranges_.size(); ++__i)
- {
- if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
- {
- __found = true;
- goto __exit;
- }
- }
- }
- if (!__equivalences_.empty())
- {
- string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
- for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
- {
- if (__s2 == __equivalences_[__i])
- {
- __found = true;
- goto __exit;
- }
- }
- }
- if (__traits_.isctype(__ch, __mask_))
- {
- __found = true;
- goto __exit;
- }
- if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
- {
- __found = true;
- goto __exit;
- }
- }
- else
- __found = __negate_; // force reject
- __exit:
- if (__found != __negate_)
- {
- __s.__do_ = __state::__accept_and_consume;
- __s.__current_ += __consumed;
- __s.__node_ = this->first();
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- template <class _CharT, class _Traits> class __lookahead;
- template <class _CharT, class _Traits = regex_traits<_CharT> >
- class _LIBCPP_TYPE_VIS_ONLY basic_regex
- {
- public:
- // types:
- typedef _CharT value_type;
- typedef regex_constants::syntax_option_type flag_type;
- typedef typename _Traits::locale_type locale_type;
- private:
- _Traits __traits_;
- flag_type __flags_;
- unsigned __marked_count_;
- unsigned __loop_count_;
- int __open_count_;
- shared_ptr<__empty_state<_CharT> > __start_;
- __owns_one_state<_CharT>* __end_;
- typedef _VSTD::__state<_CharT> __state;
- typedef _VSTD::__node<_CharT> __node;
- public:
- // constants:
- static const regex_constants::syntax_option_type icase = regex_constants::icase;
- static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
- static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
- static const regex_constants::syntax_option_type collate = regex_constants::collate;
- static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
- static const regex_constants::syntax_option_type basic = regex_constants::basic;
- static const regex_constants::syntax_option_type extended = regex_constants::extended;
- static const regex_constants::syntax_option_type awk = regex_constants::awk;
- static const regex_constants::syntax_option_type grep = regex_constants::grep;
- static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
- // construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY
- basic_regex()
- : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {}
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__p, __p + __traits_.length(__p));}
- _LIBCPP_INLINE_VISIBILITY
- basic_regex(const value_type* __p, size_t __len, flag_type __f)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__p, __p + __len);}
- // basic_regex(const basic_regex&) = default;
- // basic_regex(basic_regex&&) = default;
- template <class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
- flag_type __f = regex_constants::ECMAScript)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__p.begin(), __p.end());}
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- basic_regex(_ForwardIterator __first, _ForwardIterator __last,
- flag_type __f = regex_constants::ECMAScript)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__first, __last);}
- #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- _LIBCPP_INLINE_VISIBILITY
- basic_regex(initializer_list<value_type> __il,
- flag_type __f = regex_constants::ECMAScript)
- : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
- __end_(0)
- {__parse(__il.begin(), __il.end());}
- #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- // ~basic_regex() = default;
- // basic_regex& operator=(const basic_regex&) = default;
- // basic_regex& operator=(basic_regex&&) = default;
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& operator=(const value_type* __p)
- {return assign(__p);}
- #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& operator=(initializer_list<value_type> __il)
- {return assign(__il);}
- #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- template <class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
- {return assign(__p);}
- // assign:
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(const basic_regex& __that)
- {return *this = __that;}
- #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(basic_regex&& __that) _NOEXCEPT
- {return *this = _VSTD::move(__that);}
- #endif
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
- {return assign(__p, __p + __traits_.length(__p), __f);}
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
- {return assign(__p, __p + __len, __f);}
- template <class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
- flag_type __f = regex_constants::ECMAScript)
- {return assign(__s.begin(), __s.end(), __f);}
- template <class _InputIterator>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_input_iterator <_InputIterator>::value &&
- !__is_forward_iterator<_InputIterator>::value,
- basic_regex&
- >::type
- assign(_InputIterator __first, _InputIterator __last,
- flag_type __f = regex_constants::ECMAScript)
- {
- basic_string<_CharT> __t(__first, __last);
- return assign(__t.begin(), __t.end(), __f);
- }
- private:
- _LIBCPP_INLINE_VISIBILITY
- void __member_init(flag_type __f)
- {
- __flags_ = __f;
- __marked_count_ = 0;
- __loop_count_ = 0;
- __open_count_ = 0;
- __end_ = nullptr;
- }
- public:
- template <class _ForwardIterator>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if
- <
- __is_forward_iterator<_ForwardIterator>::value,
- basic_regex&
- >::type
- assign(_ForwardIterator __first, _ForwardIterator __last,
- flag_type __f = regex_constants::ECMAScript)
- {
- __member_init(__f);
- __parse(__first, __last);
- return *this;
- }
- #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- _LIBCPP_INLINE_VISIBILITY
- basic_regex& assign(initializer_list<value_type> __il,
- flag_type __f = regex_constants::ECMAScript)
- {return assign(__il.begin(), __il.end(), __f);}
- #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- // const operations:
- _LIBCPP_INLINE_VISIBILITY
- unsigned mark_count() const {return __marked_count_;}
- _LIBCPP_INLINE_VISIBILITY
- flag_type flags() const {return __flags_;}
- // locale:
- _LIBCPP_INLINE_VISIBILITY
- locale_type imbue(locale_type __loc)
- {
- __member_init(ECMAScript);
- __start_.reset();
- return __traits_.imbue(__loc);
- }
- _LIBCPP_INLINE_VISIBILITY
- locale_type getloc() const {return __traits_.getloc();}
- // swap:
- void swap(basic_regex& __r);
- private:
- _LIBCPP_INLINE_VISIBILITY
- unsigned __loop_count() const {return __loop_count_;}
- template <class _ForwardIterator>
- _ForwardIterator
- __parse(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
- __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin, unsigned __mexp_end);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
- __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin, unsigned __mexp_end);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
- basic_string<_CharT>& __col_sym);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_term(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
- basic_string<_CharT>* __str = nullptr);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
- basic_string<_CharT>& __str,
- __bracket_expression<_CharT, _Traits>* __ml);
- template <class _ForwardIterator>
- _ForwardIterator
- __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
- basic_string<_CharT>* __str = nullptr);
- _LIBCPP_INLINE_VISIBILITY
- void __push_l_anchor();
- void __push_r_anchor();
- void __push_match_any();
- void __push_match_any_but_newline();
- _LIBCPP_INLINE_VISIBILITY
- void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
- {__push_loop(__min, numeric_limits<size_t>::max(), __s,
- __mexp_begin, __mexp_end);}
- _LIBCPP_INLINE_VISIBILITY
- void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
- {__push_loop(__min, numeric_limits<size_t>::max(), __s,
- __mexp_begin, __mexp_end, false);}
- void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
- size_t __mexp_begin = 0, size_t __mexp_end = 0,
- bool __greedy = true);
- __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
- void __push_char(value_type __c);
- void __push_back_ref(int __i);
- void __push_alternation(__owns_one_state<_CharT>* __sa,
- __owns_one_state<_CharT>* __sb);
- void __push_begin_marked_subexpression();
- void __push_end_marked_subexpression(unsigned);
- void __push_empty();
- void __push_word_boundary(bool);
- void __push_lookahead(const basic_regex&, bool, unsigned);
- template <class _Allocator>
- bool
- __search(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags) const;
- template <class _Allocator>
- bool
- __match_at_start(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool) const;
- template <class _Allocator>
- bool
- __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool) const;
- template <class _Allocator>
- bool
- __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool) const;
- template <class _Allocator>
- bool
- __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool) const;
- template <class _Bp, class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
- regex_constants::match_flag_type);
- template <class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
- const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
- template <class _Bp, class _Cp, class _Tp>
- friend
- bool
- regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
- regex_constants::match_flag_type);
- template <class _Cp, class _Tp>
- friend
- bool
- regex_search(const _Cp*, const _Cp*,
- const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
- template <class _Cp, class _Ap, class _Tp>
- friend
- bool
- regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
- regex_constants::match_flag_type);
- template <class _ST, class _SA, class _Cp, class _Tp>
- friend
- bool
- regex_search(const basic_string<_Cp, _ST, _SA>& __s,
- const basic_regex<_Cp, _Tp>& __e,
- regex_constants::match_flag_type __flags);
- template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_search(const basic_string<_Cp, _ST, _SA>& __s,
- match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
- const basic_regex<_Cp, _Tp>& __e,
- regex_constants::match_flag_type __flags);
- template <class _Iter, class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_search(__wrap_iter<_Iter> __first,
- __wrap_iter<_Iter> __last,
- match_results<__wrap_iter<_Iter>, _Ap>& __m,
- const basic_regex<_Cp, _Tp>& __e,
- regex_constants::match_flag_type __flags);
- template <class, class> friend class __lookahead;
- };
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
- template <class _CharT, class _Traits>
- const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
- {
- using _VSTD::swap;
- swap(__traits_, __r.__traits_);
- swap(__flags_, __r.__flags_);
- swap(__marked_count_, __r.__marked_count_);
- swap(__loop_count_, __r.__loop_count_);
- swap(__open_count_, __r.__open_count_);
- swap(__start_, __r.__start_);
- swap(__end_, __r.__end_);
- }
- template <class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- void
- swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
- {
- return __x.swap(__y);
- }
- // __lookahead
- template <class _CharT, class _Traits>
- class __lookahead
- : public __owns_one_state<_CharT>
- {
- typedef __owns_one_state<_CharT> base;
- basic_regex<_CharT, _Traits> __exp_;
- unsigned __mexp_;
- bool __invert_;
- __lookahead(const __lookahead&);
- __lookahead& operator=(const __lookahead&);
- public:
- typedef _VSTD::__state<_CharT> __state;
- _LIBCPP_INLINE_VISIBILITY
- __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
- : base(__s), __exp_(__exp), __invert_(__invert), __mexp_(__mexp) {}
- virtual void __exec(__state&) const;
- };
- template <class _CharT, class _Traits>
- void
- __lookahead<_CharT, _Traits>::__exec(__state& __s) const
- {
- match_results<const _CharT*> __m;
- __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
- bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
- __m,
- __s.__flags_ | regex_constants::match_continuous,
- __s.__at_first_ && __s.__current_ == __s.__first_);
- if (__matched != __invert_)
- {
- __s.__do_ = __state::__accept_but_not_consume;
- __s.__node_ = this->first();
- for (unsigned __i = 1; __i < __m.size(); ++__i) {
- __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
- }
- }
- else
- {
- __s.__do_ = __state::__reject;
- __s.__node_ = nullptr;
- }
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- {
- unique_ptr<__node> __h(new __end_state<_CharT>);
- __start_.reset(new __empty_state<_CharT>(__h.get()));
- __h.release();
- __end_ = __start_.get();
- }
- switch (__flags_ & 0x1F0)
- {
- case ECMAScript:
- __first = __parse_ecma_exp(__first, __last);
- break;
- case basic:
- __first = __parse_basic_reg_exp(__first, __last);
- break;
- case extended:
- case awk:
- __first = __parse_extended_reg_exp(__first, __last);
- break;
- case grep:
- __first = __parse_grep(__first, __last);
- break;
- case egrep:
- __first = __parse_egrep(__first, __last);
- break;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- default:
- throw regex_error(regex_constants::__re_err_grammar);
- #endif // _LIBCPP_NO_EXCEPTIONS
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- if (*__first == '^')
- {
- __push_l_anchor();
- ++__first;
- }
- if (__first != __last)
- {
- __first = __parse_RE_expression(__first, __last);
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp == __last && *__first == '$')
- {
- __push_r_anchor();
- ++__first;
- }
- }
- }
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first != __last)
- throw regex_error(regex_constants::__re_err_empty);
- #endif // _LIBCPP_NO_EXCEPTIONS
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- __owns_one_state<_CharT>* __sa = __end_;
- _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __first)
- throw regex_error(regex_constants::__re_err_empty);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __first = __temp;
- while (__first != __last && *__first == '|')
- {
- __owns_one_state<_CharT>* __sb = __end_;
- __temp = __parse_ERE_branch(++__first, __last);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __first)
- throw regex_error(regex_constants::__re_err_empty);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __push_alternation(__sa, __sb);
- __first = __temp;
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __first)
- throw regex_error(regex_constants::__re_err_empty);
- #endif // _LIBCPP_NO_EXCEPTIONS
- do
- {
- __first = __temp;
- __temp = __parse_ERE_expression(__first, __last);
- } while (__temp != __first);
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- __owns_one_state<_CharT>* __e = __end_;
- unsigned __mexp_begin = __marked_count_;
- _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
- if (__temp == __first && __temp != __last)
- {
- switch (*__temp)
- {
- case '^':
- __push_l_anchor();
- ++__temp;
- break;
- case '$':
- __push_r_anchor();
- ++__temp;
- break;
- case '(':
- __push_begin_marked_subexpression();
- unsigned __temp_count = __marked_count_;
- ++__open_count_;
- __temp = __parse_extended_reg_exp(++__temp, __last);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __last || *__temp != ')')
- throw regex_error(regex_constants::error_paren);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __push_end_marked_subexpression(__temp_count);
- --__open_count_;
- ++__temp;
- break;
- }
- }
- if (__temp != __first)
- __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
- __marked_count_+1);
- __first = __temp;
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- while (true)
- {
- _ForwardIterator __temp = __parse_simple_RE(__first, __last);
- if (__temp == __first)
- break;
- __first = __temp;
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- __owns_one_state<_CharT>* __e = __end_;
- unsigned __mexp_begin = __marked_count_;
- _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
- if (__temp != __first)
- __first = __parse_RE_dupl_symbol(__temp, __last, __e,
- __mexp_begin+1, __marked_count_+1);
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- _ForwardIterator __temp = __first;
- __first = __parse_one_char_or_coll_elem_RE(__first, __last);
- if (__temp == __first)
- {
- __temp = __parse_Back_open_paren(__first, __last);
- if (__temp != __first)
- {
- __push_begin_marked_subexpression();
- unsigned __temp_count = __marked_count_;
- __first = __parse_RE_expression(__temp, __last);
- __temp = __parse_Back_close_paren(__first, __last);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __first)
- throw regex_error(regex_constants::error_paren);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __push_end_marked_subexpression(__temp_count);
- __first = __temp;
- }
- else
- __first = __parse_BACKREF(__first, __last);
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
- _ForwardIterator __first,
- _ForwardIterator __last)
- {
- _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
- if (__temp == __first)
- {
- __temp = __parse_QUOTED_CHAR(__first, __last);
- if (__temp == __first)
- {
- if (__temp != __last && *__temp == '.')
- {
- __push_match_any();
- ++__temp;
- }
- else
- __temp = __parse_bracket_expression(__first, __last);
- }
- }
- __first = __temp;
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
- _ForwardIterator __first,
- _ForwardIterator __last)
- {
- _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
- if (__temp == __first)
- {
- __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
- if (__temp == __first)
- {
- if (__temp != __last && *__temp == '.')
- {
- __push_match_any();
- ++__temp;
- }
- else
- __temp = __parse_bracket_expression(__first, __last);
- }
- }
- __first = __temp;
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\' && *__temp == '(')
- __first = ++__temp;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\' && *__temp == ')')
- __first = ++__temp;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\' && *__temp == '{')
- __first = ++__temp;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\' && *__temp == '}')
- __first = ++__temp;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\' && '1' <= *__temp && *__temp <= '9')
- {
- __push_back_ref(*__temp - '0');
- __first = ++__temp;
- }
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp == __last && *__first == '$')
- return __first;
- // Not called inside a bracket
- if (*__first == '.' || *__first == '\\' || *__first == '[')
- return __first;
- __push_char(*__first);
- ++__first;
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- switch (*__first)
- {
- case '^':
- case '.':
- case '[':
- case '$':
- case '(':
- case '|':
- case '*':
- case '+':
- case '?':
- case '{':
- case '\\':
- break;
- case ')':
- if (__open_count_ == 0)
- {
- __push_char(*__first);
- ++__first;
- }
- break;
- default:
- __push_char(*__first);
- ++__first;
- break;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\')
- {
- switch (*__temp)
- {
- case '^':
- case '.':
- case '*':
- case '[':
- case '$':
- case '\\':
- __push_char(*__temp);
- __first = ++__temp;
- break;
- }
- }
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__first == '\\')
- {
- switch (*__temp)
- {
- case '^':
- case '.':
- case '*':
- case '[':
- case '$':
- case '\\':
- case '(':
- case ')':
- case '|':
- case '+':
- case '?':
- case '{':
- case '}':
- __push_char(*__temp);
- __first = ++__temp;
- break;
- default:
- if ((__flags_ & 0x1F0) == awk)
- __first = __parse_awk_escape(++__first, __last);
- break;
- }
- }
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
- _ForwardIterator __last,
- __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin,
- unsigned __mexp_end)
- {
- if (__first != __last)
- {
- if (*__first == '*')
- {
- __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
- ++__first;
- }
- else
- {
- _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
- if (__temp != __first)
- {
- int __min = 0;
- __first = __temp;
- __temp = __parse_DUP_COUNT(__first, __last, __min);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __first)
- throw regex_error(regex_constants::error_badbrace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __first = __temp;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_brace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- if (*__first != ',')
- {
- __temp = __parse_Back_close_brace(__first, __last);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __first)
- throw regex_error(regex_constants::error_brace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
- true);
- __first = __temp;
- }
- else
- {
- ++__first; // consume ','
- int __max = -1;
- __first = __parse_DUP_COUNT(__first, __last, __max);
- __temp = __parse_Back_close_brace(__first, __last);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __first)
- throw regex_error(regex_constants::error_brace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- if (__max == -1)
- __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
- else
- {
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__max < __min)
- throw regex_error(regex_constants::error_badbrace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
- true);
- }
- __first = __temp;
- }
- }
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
- _ForwardIterator __last,
- __owns_one_state<_CharT>* __s,
- unsigned __mexp_begin,
- unsigned __mexp_end)
- {
- if (__first != __last)
- {
- unsigned __grammar = __flags_ & 0x1F0;
- switch (*__first)
- {
- case '*':
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
- }
- else
- __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
- break;
- case '+':
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
- }
- else
- __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
- break;
- case '?':
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
- }
- else
- __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
- break;
- case '{':
- {
- int __min;
- _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __first)
- throw regex_error(regex_constants::error_badbrace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __first = __temp;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_brace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- switch (*__first)
- {
- case '}':
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
- }
- else
- __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
- break;
- case ',':
- ++__first;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_badbrace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- if (*__first == '}')
- {
- ++__first;
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
- }
- else
- __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
- }
- else
- {
- int __max = -1;
- __temp = __parse_DUP_COUNT(__first, __last, __max);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __first)
- throw regex_error(regex_constants::error_brace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __first = __temp;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last || *__first != '}')
- throw regex_error(regex_constants::error_brace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- ++__first;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__max < __min)
- throw regex_error(regex_constants::error_badbrace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- if (__grammar == ECMAScript && __first != __last && *__first == '?')
- {
- ++__first;
- __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
- }
- else
- __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
- }
- break;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- default:
- throw regex_error(regex_constants::error_badbrace);
- #endif // _LIBCPP_NO_EXCEPTIONS
- }
- }
- break;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last && *__first == '[')
- {
- ++__first;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_brack);
- #endif // _LIBCPP_NO_EXCEPTIONS
- bool __negate = false;
- if (*__first == '^')
- {
- ++__first;
- __negate = true;
- }
- __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
- // __ml owned by *this
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_brack);
- #endif // _LIBCPP_NO_EXCEPTIONS
- if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
- {
- __ml->__add_char(']');
- ++__first;
- }
- __first = __parse_follow_list(__first, __last, __ml);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_brack);
- #endif // _LIBCPP_NO_EXCEPTIONS
- if (*__first == '-')
- {
- __ml->__add_char('-');
- ++__first;
- }
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last || *__first != ']')
- throw regex_error(regex_constants::error_brack);
- #endif // _LIBCPP_NO_EXCEPTIONS
- ++__first;
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
- _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml)
- {
- if (__first != __last)
- {
- while (true)
- {
- _ForwardIterator __temp = __parse_expression_term(__first, __last,
- __ml);
- if (__temp == __first)
- break;
- __first = __temp;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
- _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml)
- {
- if (__first != __last && *__first != ']')
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- basic_string<_CharT> __start_range;
- if (__temp != __last && *__first == '[')
- {
- if (*__temp == '=')
- return __parse_equivalence_class(++__temp, __last, __ml);
- else if (*__temp == ':')
- return __parse_character_class(++__temp, __last, __ml);
- else if (*__temp == '.')
- __first = __parse_collating_symbol(++__temp, __last, __start_range);
- }
- unsigned __grammar = __flags_ & 0x1F0;
- if (__start_range.empty())
- {
- if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
- {
- if (__grammar == ECMAScript)
- __first = __parse_class_escape(++__first, __last, __start_range, __ml);
- else
- __first = __parse_awk_escape(++__first, __last, &__start_range);
- }
- else
- {
- __start_range = *__first;
- ++__first;
- }
- }
- if (__first != __last && *__first != ']')
- {
- __temp = _VSTD::next(__first);
- if (__temp != __last && *__first == '-' && *__temp != ']')
- {
- // parse a range
- basic_string<_CharT> __end_range;
- __first = __temp;
- ++__temp;
- if (__temp != __last && *__first == '[' && *__temp == '.')
- __first = __parse_collating_symbol(++__temp, __last, __end_range);
- else
- {
- if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
- {
- if (__grammar == ECMAScript)
- __first = __parse_class_escape(++__first, __last,
- __end_range, __ml);
- else
- __first = __parse_awk_escape(++__first, __last,
- &__end_range);
- }
- else
- {
- __end_range = *__first;
- ++__first;
- }
- }
- __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
- }
- else if (!__start_range.empty())
- {
- if (__start_range.size() == 1)
- __ml->__add_char(__start_range[0]);
- else
- __ml->__add_digraph(__start_range[0], __start_range[1]);
- }
- }
- else if (!__start_range.empty())
- {
- if (__start_range.size() == 1)
- __ml->__add_char(__start_range[0]);
- else
- __ml->__add_digraph(__start_range[0], __start_range[1]);
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
- _ForwardIterator __last,
- basic_string<_CharT>& __str,
- __bracket_expression<_CharT, _Traits>* __ml)
- {
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- switch (*__first)
- {
- case 0:
- __str = *__first;
- return ++__first;
- case 'b':
- __str = _CharT(8);
- return ++__first;
- case 'd':
- __ml->__add_class(ctype_base::digit);
- return ++__first;
- case 'D':
- __ml->__add_neg_class(ctype_base::digit);
- return ++__first;
- case 's':
- __ml->__add_class(ctype_base::space);
- return ++__first;
- case 'S':
- __ml->__add_neg_class(ctype_base::space);
- return ++__first;
- case 'w':
- __ml->__add_class(ctype_base::alnum);
- __ml->__add_char('_');
- return ++__first;
- case 'W':
- __ml->__add_neg_class(ctype_base::alnum);
- __ml->__add_neg_char('_');
- return ++__first;
- }
- __first = __parse_character_escape(__first, __last, &__str);
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
- _ForwardIterator __last,
- basic_string<_CharT>* __str)
- {
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- switch (*__first)
- {
- case '\\':
- case '"':
- case '/':
- if (__str)
- *__str = *__first;
- else
- __push_char(*__first);
- return ++__first;
- case 'a':
- if (__str)
- *__str = _CharT(7);
- else
- __push_char(_CharT(7));
- return ++__first;
- case 'b':
- if (__str)
- *__str = _CharT(8);
- else
- __push_char(_CharT(8));
- return ++__first;
- case 'f':
- if (__str)
- *__str = _CharT(0xC);
- else
- __push_char(_CharT(0xC));
- return ++__first;
- case 'n':
- if (__str)
- *__str = _CharT(0xA);
- else
- __push_char(_CharT(0xA));
- return ++__first;
- case 'r':
- if (__str)
- *__str = _CharT(0xD);
- else
- __push_char(_CharT(0xD));
- return ++__first;
- case 't':
- if (__str)
- *__str = _CharT(0x9);
- else
- __push_char(_CharT(0x9));
- return ++__first;
- case 'v':
- if (__str)
- *__str = _CharT(0xB);
- else
- __push_char(_CharT(0xB));
- return ++__first;
- }
- if ('0' <= *__first && *__first <= '7')
- {
- unsigned __val = *__first - '0';
- if (++__first != __last && ('0' <= *__first && *__first <= '7'))
- {
- __val = 8 * __val + *__first - '0';
- if (++__first != __last && ('0' <= *__first && *__first <= '7'))
- __val = 8 * __val + *__first++ - '0';
- }
- if (__str)
- *__str = _CharT(__val);
- else
- __push_char(_CharT(__val));
- }
- #ifndef _LIBCPP_NO_EXCEPTIONS
- else
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
- _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml)
- {
- // Found [=
- // This means =] must exist
- value_type _Equal_close[2] = {'=', ']'};
- _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
- _Equal_close+2);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __last)
- throw regex_error(regex_constants::error_brack);
- #endif // _LIBCPP_NO_EXCEPTIONS
- // [__first, __temp) contains all text in [= ... =]
- typedef typename _Traits::string_type string_type;
- string_type __collate_name =
- __traits_.lookup_collatename(__first, __temp);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__collate_name.empty())
- throw regex_error(regex_constants::error_collate);
- #endif // _LIBCPP_NO_EXCEPTIONS
- string_type __equiv_name =
- __traits_.transform_primary(__collate_name.begin(),
- __collate_name.end());
- if (!__equiv_name.empty())
- __ml->__add_equivalence(__equiv_name);
- else
- {
- switch (__collate_name.size())
- {
- case 1:
- __ml->__add_char(__collate_name[0]);
- break;
- case 2:
- __ml->__add_digraph(__collate_name[0], __collate_name[1]);
- break;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- default:
- throw regex_error(regex_constants::error_collate);
- #endif // _LIBCPP_NO_EXCEPTIONS
- }
- }
- __first = _VSTD::next(__temp, 2);
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
- _ForwardIterator __last,
- __bracket_expression<_CharT, _Traits>* __ml)
- {
- // Found [:
- // This means :] must exist
- value_type _Colon_close[2] = {':', ']'};
- _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
- _Colon_close+2);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __last)
- throw regex_error(regex_constants::error_brack);
- #endif // _LIBCPP_NO_EXCEPTIONS
- // [__first, __temp) contains all text in [: ... :]
- typedef typename _Traits::char_class_type char_class_type;
- char_class_type __class_type =
- __traits_.lookup_classname(__first, __temp, __flags_ & icase);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__class_type == 0)
- throw regex_error(regex_constants::error_brack);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __ml->__add_class(__class_type);
- __first = _VSTD::next(__temp, 2);
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
- _ForwardIterator __last,
- basic_string<_CharT>& __col_sym)
- {
- // Found [.
- // This means .] must exist
- value_type _Dot_close[2] = {'.', ']'};
- _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
- _Dot_close+2);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __last)
- throw regex_error(regex_constants::error_brack);
- #endif // _LIBCPP_NO_EXCEPTIONS
- // [__first, __temp) contains all text in [. ... .]
- typedef typename _Traits::string_type string_type;
- __col_sym = __traits_.lookup_collatename(__first, __temp);
- switch (__col_sym.size())
- {
- case 1:
- case 2:
- break;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- default:
- throw regex_error(regex_constants::error_collate);
- #endif // _LIBCPP_NO_EXCEPTIONS
- }
- __first = _VSTD::next(__temp, 2);
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
- _ForwardIterator __last,
- int& __c)
- {
- if (__first != __last && '0' <= *__first && *__first <= '9')
- {
- __c = *__first - '0';
- for (++__first; __first != __last && '0' <= *__first && *__first <= '9';
- ++__first)
- {
- __c *= 10;
- __c += *__first - '0';
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- __owns_one_state<_CharT>* __sa = __end_;
- _ForwardIterator __temp = __parse_alternative(__first, __last);
- if (__temp == __first)
- __push_empty();
- __first = __temp;
- while (__first != __last && *__first == '|')
- {
- __owns_one_state<_CharT>* __sb = __end_;
- __temp = __parse_alternative(++__first, __last);
- if (__temp == __first)
- __push_empty();
- __push_alternation(__sa, __sb);
- __first = __temp;
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- while (true)
- {
- _ForwardIterator __temp = __parse_term(__first, __last);
- if (__temp == __first)
- break;
- __first = __temp;
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- _ForwardIterator __temp = __parse_assertion(__first, __last);
- if (__temp == __first)
- {
- __owns_one_state<_CharT>* __e = __end_;
- unsigned __mexp_begin = __marked_count_;
- __temp = __parse_atom(__first, __last);
- if (__temp != __first)
- __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
- __mexp_begin+1, __marked_count_+1);
- }
- else
- __first = __temp;
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- switch (*__first)
- {
- case '^':
- __push_l_anchor();
- ++__first;
- break;
- case '$':
- __push_r_anchor();
- ++__first;
- break;
- case '\\':
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last)
- {
- if (*__temp == 'b')
- {
- __push_word_boundary(false);
- __first = ++__temp;
- }
- else if (*__temp == 'B')
- {
- __push_word_boundary(true);
- __first = ++__temp;
- }
- }
- }
- break;
- case '(':
- {
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last && *__temp == '?')
- {
- if (++__temp != __last)
- {
- switch (*__temp)
- {
- case '=':
- {
- basic_regex __exp;
- __exp.__flags_ = __flags_;
- __temp = __exp.__parse(++__temp, __last);
- unsigned __mexp = __exp.__marked_count_;
- __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
- __marked_count_ += __mexp;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __last || *__temp != ')')
- throw regex_error(regex_constants::error_paren);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __first = ++__temp;
- }
- break;
- case '!':
- {
- basic_regex __exp;
- __exp.__flags_ = __flags_;
- __temp = __exp.__parse(++__temp, __last);
- unsigned __mexp = __exp.__marked_count_;
- __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
- __marked_count_ += __mexp;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__temp == __last || *__temp != ')')
- throw regex_error(regex_constants::error_paren);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __first = ++__temp;
- }
- break;
- }
- }
- }
- }
- break;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- switch (*__first)
- {
- case '.':
- __push_match_any_but_newline();
- ++__first;
- break;
- case '\\':
- __first = __parse_atom_escape(__first, __last);
- break;
- case '[':
- __first = __parse_bracket_expression(__first, __last);
- break;
- case '(':
- {
- ++__first;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_paren);
- #endif // _LIBCPP_NO_EXCEPTIONS
- _ForwardIterator __temp = _VSTD::next(__first);
- if (__temp != __last && *__first == '?' && *__temp == ':')
- {
- ++__open_count_;
- __first = __parse_ecma_exp(++__temp, __last);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last || *__first != ')')
- throw regex_error(regex_constants::error_paren);
- #endif // _LIBCPP_NO_EXCEPTIONS
- --__open_count_;
- ++__first;
- }
- else
- {
- __push_begin_marked_subexpression();
- unsigned __temp_count = __marked_count_;
- ++__open_count_;
- __first = __parse_ecma_exp(__first, __last);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last || *__first != ')')
- throw regex_error(regex_constants::error_paren);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __push_end_marked_subexpression(__temp_count);
- --__open_count_;
- ++__first;
- }
- }
- break;
- default:
- __first = __parse_pattern_character(__first, __last);
- break;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last && *__first == '\\')
- {
- _ForwardIterator __t1 = _VSTD::next(__first);
- _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
- if (__t2 != __t1)
- __first = __t2;
- else
- {
- __t2 = __parse_character_class_escape(__t1, __last);
- if (__t2 != __t1)
- __first = __t2;
- else
- {
- __t2 = __parse_character_escape(__t1, __last);
- if (__t2 != __t1)
- __first = __t2;
- }
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- if (*__first == '0')
- {
- __push_char(_CharT());
- ++__first;
- }
- else if ('1' <= *__first && *__first <= '9')
- {
- unsigned __v = *__first - '0';
- for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
- __v = 10 * __v + *__first - '0';
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__v > mark_count())
- throw regex_error(regex_constants::error_backref);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __push_back_ref(__v);
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- __bracket_expression<_CharT, _Traits>* __ml;
- switch (*__first)
- {
- case 'd':
- __ml = __start_matching_list(false);
- __ml->__add_class(ctype_base::digit);
- ++__first;
- break;
- case 'D':
- __ml = __start_matching_list(true);
- __ml->__add_class(ctype_base::digit);
- ++__first;
- break;
- case 's':
- __ml = __start_matching_list(false);
- __ml->__add_class(ctype_base::space);
- ++__first;
- break;
- case 'S':
- __ml = __start_matching_list(true);
- __ml->__add_class(ctype_base::space);
- ++__first;
- break;
- case 'w':
- __ml = __start_matching_list(false);
- __ml->__add_class(ctype_base::alnum);
- __ml->__add_char('_');
- ++__first;
- break;
- case 'W':
- __ml = __start_matching_list(true);
- __ml->__add_class(ctype_base::alnum);
- __ml->__add_char('_');
- ++__first;
- break;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
- _ForwardIterator __last,
- basic_string<_CharT>* __str)
- {
- if (__first != __last)
- {
- _ForwardIterator __t;
- unsigned __sum = 0;
- int __hd;
- switch (*__first)
- {
- case 'f':
- if (__str)
- *__str = _CharT(0xC);
- else
- __push_char(_CharT(0xC));
- ++__first;
- break;
- case 'n':
- if (__str)
- *__str = _CharT(0xA);
- else
- __push_char(_CharT(0xA));
- ++__first;
- break;
- case 'r':
- if (__str)
- *__str = _CharT(0xD);
- else
- __push_char(_CharT(0xD));
- ++__first;
- break;
- case 't':
- if (__str)
- *__str = _CharT(0x9);
- else
- __push_char(_CharT(0x9));
- ++__first;
- break;
- case 'v':
- if (__str)
- *__str = _CharT(0xB);
- else
- __push_char(_CharT(0xB));
- ++__first;
- break;
- case 'c':
- if ((__t = _VSTD::next(__first)) != __last)
- {
- if (('A' <= *__t && *__t <= 'Z') ||
- ('a' <= *__t && *__t <= 'z'))
- {
- if (__str)
- *__str = _CharT(*__t % 32);
- else
- __push_char(_CharT(*__t % 32));
- __first = ++__t;
- }
- #ifndef _LIBCPP_NO_EXCEPTIONS
- else
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- }
- #ifndef _LIBCPP_NO_EXCEPTIONS
- else
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- break;
- case 'u':
- ++__first;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __hd = __traits_.value(*__first, 16);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__hd == -1)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __sum = 16 * __sum + static_cast<unsigned>(__hd);
- ++__first;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __hd = __traits_.value(*__first, 16);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__hd == -1)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __sum = 16 * __sum + static_cast<unsigned>(__hd);
- // drop through
- case 'x':
- ++__first;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __hd = __traits_.value(*__first, 16);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__hd == -1)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __sum = 16 * __sum + static_cast<unsigned>(__hd);
- ++__first;
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__first == __last)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __hd = __traits_.value(*__first, 16);
- #ifndef _LIBCPP_NO_EXCEPTIONS
- if (__hd == -1)
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- __sum = 16 * __sum + static_cast<unsigned>(__hd);
- if (__str)
- *__str = _CharT(__sum);
- else
- __push_char(_CharT(__sum));
- ++__first;
- break;
- default:
- if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
- {
- if (__str)
- *__str = *__first;
- else
- __push_char(*__first);
- ++__first;
- }
- #ifndef _LIBCPP_NO_EXCEPTIONS
- else
- throw regex_error(regex_constants::error_escape);
- #endif // _LIBCPP_NO_EXCEPTIONS
- break;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- if (__first != __last)
- {
- switch (*__first)
- {
- case '^':
- case '$':
- case '\\':
- case '.':
- case '*':
- case '+':
- case '?':
- case '(':
- case ')':
- case '[':
- case ']':
- case '{':
- case '}':
- case '|':
- break;
- default:
- __push_char(*__first);
- ++__first;
- break;
- }
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- __owns_one_state<_CharT>* __sa = __end_;
- _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
- if (__t1 != __first)
- __parse_basic_reg_exp(__first, __t1);
- else
- __push_empty();
- __first = __t1;
- if (__first != __last)
- ++__first;
- while (__first != __last)
- {
- __t1 = _VSTD::find(__first, __last, _CharT('\n'));
- __owns_one_state<_CharT>* __sb = __end_;
- if (__t1 != __first)
- __parse_basic_reg_exp(__first, __t1);
- else
- __push_empty();
- __push_alternation(__sa, __sb);
- __first = __t1;
- if (__first != __last)
- ++__first;
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- template <class _ForwardIterator>
- _ForwardIterator
- basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
- _ForwardIterator __last)
- {
- __owns_one_state<_CharT>* __sa = __end_;
- _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
- if (__t1 != __first)
- __parse_extended_reg_exp(__first, __t1);
- else
- __push_empty();
- __first = __t1;
- if (__first != __last)
- ++__first;
- while (__first != __last)
- {
- __t1 = _VSTD::find(__first, __last, _CharT('\n'));
- __owns_one_state<_CharT>* __sb = __end_;
- if (__t1 != __first)
- __parse_extended_reg_exp(__first, __t1);
- else
- __push_empty();
- __push_alternation(__sa, __sb);
- __first = __t1;
- if (__first != __last)
- ++__first;
- }
- return __first;
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
- __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
- bool __greedy)
- {
- unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
- __end_->first() = nullptr;
- unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
- __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
- __min, __max));
- __s->first() = nullptr;
- __e1.release();
- __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
- __end_ = __e2->second();
- __s->first() = __e2.release();
- ++__loop_count_;
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_char(value_type __c)
- {
- if (flags() & icase)
- __end_->first() = new __match_char_icase<_CharT, _Traits>
- (__traits_, __c, __end_->first());
- else if (flags() & collate)
- __end_->first() = new __match_char_collate<_CharT, _Traits>
- (__traits_, __c, __end_->first());
- else
- __end_->first() = new __match_char<_CharT>(__c, __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
- {
- if (!(__flags_ & nosubs))
- {
- __end_->first() =
- new __begin_marked_subexpression<_CharT>(++__marked_count_,
- __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
- {
- if (!(__flags_ & nosubs))
- {
- __end_->first() =
- new __end_marked_subexpression<_CharT>(__sub, __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_l_anchor()
- {
- __end_->first() = new __l_anchor<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_r_anchor()
- {
- __end_->first() = new __r_anchor<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_match_any()
- {
- __end_->first() = new __match_any<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
- {
- __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_empty()
- {
- __end_->first() = new __empty_state<_CharT>(__end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
- {
- __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
- __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
- {
- if (flags() & icase)
- __end_->first() = new __back_ref_icase<_CharT, _Traits>
- (__traits_, __i, __end_->first());
- else if (flags() & collate)
- __end_->first() = new __back_ref_collate<_CharT, _Traits>
- (__traits_, __i, __end_->first());
- else
- __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
- __owns_one_state<_CharT>* __ea)
- {
- __sa->first() = new __alternate<_CharT>(
- static_cast<__owns_one_state<_CharT>*>(__sa->first()),
- static_cast<__owns_one_state<_CharT>*>(__ea->first()));
- __ea->first() = nullptr;
- __ea->first() = new __empty_state<_CharT>(__end_->first());
- __end_->first() = nullptr;
- __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
- __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
- }
- template <class _CharT, class _Traits>
- __bracket_expression<_CharT, _Traits>*
- basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
- {
- __bracket_expression<_CharT, _Traits>* __r =
- new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
- __negate, __flags_ & icase,
- __flags_ & collate);
- __end_->first() = __r;
- __end_ = __r;
- return __r;
- }
- template <class _CharT, class _Traits>
- void
- basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
- bool __invert,
- unsigned __mexp)
- {
- __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
- __end_->first(), __mexp);
- __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
- }
- typedef basic_regex<char> regex;
- typedef basic_regex<wchar_t> wregex;
- // sub_match
- template <class _BidirectionalIterator>
- class _LIBCPP_TYPE_VIS_ONLY sub_match
- : public pair<_BidirectionalIterator, _BidirectionalIterator>
- {
- public:
- typedef _BidirectionalIterator iterator;
- typedef typename iterator_traits<iterator>::value_type value_type;
- typedef typename iterator_traits<iterator>::difference_type difference_type;
- typedef basic_string<value_type> string_type;
- bool matched;
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR sub_match() : matched() {}
- _LIBCPP_INLINE_VISIBILITY
- difference_type length() const
- {return matched ? _VSTD::distance(this->first, this->second) : 0;}
- _LIBCPP_INLINE_VISIBILITY
- string_type str() const
- {return matched ? string_type(this->first, this->second) : string_type();}
- _LIBCPP_INLINE_VISIBILITY
- operator string_type() const
- {return str();}
- _LIBCPP_INLINE_VISIBILITY
- int compare(const sub_match& __s) const
- {return str().compare(__s.str());}
- _LIBCPP_INLINE_VISIBILITY
- int compare(const string_type& __s) const
- {return str().compare(__s);}
- _LIBCPP_INLINE_VISIBILITY
- int compare(const value_type* __s) const
- {return str().compare(__s);}
- };
- typedef sub_match<const char*> csub_match;
- typedef sub_match<const wchar_t*> wcsub_match;
- typedef sub_match<string::const_iterator> ssub_match;
- typedef sub_match<wstring::const_iterator> wssub_match;
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
- {
- return __x.compare(__y) == 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
- {
- return !(__x == __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
- {
- return __x.compare(__y) < 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
- {
- return !(__y < __x);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
- {
- return !(__x < __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
- {
- return __y < __x;
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
- {
- return __y.compare(__x.c_str()) == 0;
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
- {
- return !(__x == __y);
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
- {
- return __y.compare(__x.c_str()) > 0;
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
- {
- return __y < __x;
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
- {
- return !(__x < __y);
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
- const sub_match<_BiIter>& __y)
- {
- return !(__y < __x);
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
- {
- return __x.compare(__y.c_str()) == 0;
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
- {
- return !(__x == __y);
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
- {
- return __x.compare(__y.c_str()) < 0;
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool operator>(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
- {
- return __y < __x;
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>=(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
- {
- return !(__x < __y);
- }
- template <class _BiIter, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<=(const sub_match<_BiIter>& __x,
- const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
- {
- return !(__y < __x);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
- {
- return __y.compare(__x) == 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
- {
- return !(__x == __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
- {
- return __y.compare(__x) > 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
- {
- return __y < __x;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
- {
- return !(__x < __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
- const sub_match<_BiIter>& __y)
- {
- return !(__y < __x);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
- {
- return __x.compare(__y) == 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
- {
- return !(__x == __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
- {
- return __x.compare(__y) < 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
- {
- return __y < __x;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
- {
- return !(__x < __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const* __y)
- {
- return !(__y < __x);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
- {
- typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
- return __y.compare(string_type(1, __x)) == 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
- {
- return !(__x == __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
- {
- typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
- return __y.compare(string_type(1, __x)) > 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
- {
- return __y < __x;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
- {
- return !(__x < __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
- const sub_match<_BiIter>& __y)
- {
- return !(__y < __x);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator==(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
- {
- typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
- return __x.compare(string_type(1, __y)) == 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
- {
- return !(__x == __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
- {
- typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
- return __x.compare(string_type(1, __y)) < 0;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
- {
- return __y < __x;
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator>=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
- {
- return !(__x < __y);
- }
- template <class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator<=(const sub_match<_BiIter>& __x,
- typename iterator_traits<_BiIter>::value_type const& __y)
- {
- return !(__y < __x);
- }
- template <class _CharT, class _ST, class _BiIter>
- inline _LIBCPP_INLINE_VISIBILITY
- basic_ostream<_CharT, _ST>&
- operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
- {
- return __os << __m.str();
- }
- template <class _BidirectionalIterator, class _Allocator>
- class _LIBCPP_TYPE_VIS_ONLY match_results
- {
- public:
- typedef _Allocator allocator_type;
- typedef sub_match<_BidirectionalIterator> value_type;
- private:
- typedef vector<value_type, allocator_type> __container_type;
- __container_type __matches_;
- value_type __unmatched_;
- value_type __prefix_;
- value_type __suffix_;
- bool __ready_;
- public:
- _BidirectionalIterator __position_start_;
- typedef const value_type& const_reference;
- typedef const_reference reference;
- typedef typename __container_type::const_iterator const_iterator;
- typedef const_iterator iterator;
- typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
- typedef typename allocator_traits<allocator_type>::size_type size_type;
- typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
- typedef basic_string<char_type> string_type;
- // construct/copy/destroy:
- explicit match_results(const allocator_type& __a = allocator_type());
- // match_results(const match_results&) = default;
- // match_results& operator=(const match_results&) = default;
- // match_results(match_results&& __m) = default;
- // match_results& operator=(match_results&& __m) = default;
- // ~match_results() = default;
- _LIBCPP_INLINE_VISIBILITY
- bool ready() const {return __ready_;}
- // size:
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const {return __matches_.size();}
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const {return __matches_.max_size();}
- _LIBCPP_INLINE_VISIBILITY
- bool empty() const {return size() == 0;}
- // element access:
- _LIBCPP_INLINE_VISIBILITY
- difference_type length(size_type __sub = 0) const
- {return (*this)[__sub].length();}
- _LIBCPP_INLINE_VISIBILITY
- difference_type position(size_type __sub = 0) const
- {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
- _LIBCPP_INLINE_VISIBILITY
- string_type str(size_type __sub = 0) const
- {return (*this)[__sub].str();}
- _LIBCPP_INLINE_VISIBILITY
- const_reference operator[](size_type __n) const
- {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
- _LIBCPP_INLINE_VISIBILITY
- const_reference prefix() const {return __prefix_;}
- _LIBCPP_INLINE_VISIBILITY
- const_reference suffix() const {return __suffix_;}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const {return __matches_.end();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
- _LIBCPP_INLINE_VISIBILITY
- const_iterator cend() const {return __matches_.end();}
- // format:
- template <class _OutputIter>
- _OutputIter
- format(_OutputIter __out, const char_type* __fmt_first,
- const char_type* __fmt_last,
- regex_constants::match_flag_type __flags = regex_constants::format_default) const;
- template <class _OutputIter, class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- _OutputIter
- format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::format_default) const
- {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
- template <class _ST, class _SA>
- _LIBCPP_INLINE_VISIBILITY
- basic_string<char_type, _ST, _SA>
- format(const basic_string<char_type, _ST, _SA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::format_default) const
- {
- basic_string<char_type, _ST, _SA> __r;
- format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
- __flags);
- return __r;
- }
- _LIBCPP_INLINE_VISIBILITY
- string_type
- format(const char_type* __fmt,
- regex_constants::match_flag_type __flags = regex_constants::format_default) const
- {
- string_type __r;
- format(back_inserter(__r), __fmt,
- __fmt + char_traits<char_type>::length(__fmt), __flags);
- return __r;
- }
- // allocator:
- _LIBCPP_INLINE_VISIBILITY
- allocator_type get_allocator() const {return __matches_.get_allocator();}
- // swap:
- void swap(match_results& __m);
- template <class _Bp, class _Ap>
- _LIBCPP_INLINE_VISIBILITY
- void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
- const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
- {
- _Bp __mf = __m.prefix().first;
- __matches_.resize(__m.size());
- for (size_type __i = 0; __i < __matches_.size(); ++__i)
- {
- __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
- __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
- __matches_[__i].matched = __m[__i].matched;
- }
- __unmatched_.first = __l;
- __unmatched_.second = __l;
- __unmatched_.matched = false;
- __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
- __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
- __prefix_.matched = __m.prefix().matched;
- __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
- __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
- __suffix_.matched = __m.suffix().matched;
- if (!__no_update_pos)
- __position_start_ = __prefix_.first;
- __ready_ = __m.ready();
- }
- private:
- void __init(unsigned __s,
- _BidirectionalIterator __f, _BidirectionalIterator __l,
- bool __no_update_pos = false);
- template <class, class> friend class basic_regex;
- template <class _Bp, class _Ap, class _Cp, class _Tp>
- friend
- bool
- regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
- regex_constants::match_flag_type);
- template <class _Bp, class _Ap>
- friend
- bool
- operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
- template <class, class> friend class __lookahead;
- };
- template <class _BidirectionalIterator, class _Allocator>
- match_results<_BidirectionalIterator, _Allocator>::match_results(
- const allocator_type& __a)
- : __matches_(__a),
- __unmatched_(),
- __prefix_(),
- __suffix_(),
- __position_start_(),
- __ready_(false)
- {
- }
- template <class _BidirectionalIterator, class _Allocator>
- void
- match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
- _BidirectionalIterator __f, _BidirectionalIterator __l,
- bool __no_update_pos)
- {
- __unmatched_.first = __l;
- __unmatched_.second = __l;
- __unmatched_.matched = false;
- __matches_.assign(__s, __unmatched_);
- __prefix_.first = __f;
- __prefix_.second = __f;
- __prefix_.matched = false;
- __suffix_ = __unmatched_;
- if (!__no_update_pos)
- __position_start_ = __prefix_.first;
- __ready_ = true;
- }
- template <class _BidirectionalIterator, class _Allocator>
- template <class _OutputIter>
- _OutputIter
- match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out,
- const char_type* __fmt_first, const char_type* __fmt_last,
- regex_constants::match_flag_type __flags) const
- {
- if (__flags & regex_constants::format_sed)
- {
- for (; __fmt_first != __fmt_last; ++__fmt_first)
- {
- if (*__fmt_first == '&')
- __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
- __out);
- else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
- {
- ++__fmt_first;
- if ('0' <= *__fmt_first && *__fmt_first <= '9')
- {
- size_t __i = *__fmt_first - '0';
- __out = _VSTD::copy(__matches_[__i].first,
- __matches_[__i].second, __out);
- }
- else
- {
- *__out = *__fmt_first;
- ++__out;
- }
- }
- else
- {
- *__out = *__fmt_first;
- ++__out;
- }
- }
- }
- else
- {
- for (; __fmt_first != __fmt_last; ++__fmt_first)
- {
- if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
- {
- switch (__fmt_first[1])
- {
- case '$':
- *__out = *++__fmt_first;
- ++__out;
- break;
- case '&':
- ++__fmt_first;
- __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
- __out);
- break;
- case '`':
- ++__fmt_first;
- __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out);
- break;
- case '\'':
- ++__fmt_first;
- __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out);
- break;
- default:
- if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
- {
- ++__fmt_first;
- size_t __i = *__fmt_first - '0';
- if (__fmt_first + 1 != __fmt_last &&
- '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
- {
- ++__fmt_first;
- __i = 10 * __i + *__fmt_first - '0';
- }
- __out = _VSTD::copy(__matches_[__i].first,
- __matches_[__i].second, __out);
- }
- else
- {
- *__out = *__fmt_first;
- ++__out;
- }
- break;
- }
- }
- else
- {
- *__out = *__fmt_first;
- ++__out;
- }
- }
- }
- return __out;
- }
- template <class _BidirectionalIterator, class _Allocator>
- void
- match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
- {
- using _VSTD::swap;
- swap(__matches_, __m.__matches_);
- swap(__unmatched_, __m.__unmatched_);
- swap(__prefix_, __m.__prefix_);
- swap(__suffix_, __m.__suffix_);
- swap(__position_start_, __m.__position_start_);
- swap(__ready_, __m.__ready_);
- }
- typedef match_results<const char*> cmatch;
- typedef match_results<const wchar_t*> wcmatch;
- typedef match_results<string::const_iterator> smatch;
- typedef match_results<wstring::const_iterator> wsmatch;
- template <class _BidirectionalIterator, class _Allocator>
- bool
- operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
- const match_results<_BidirectionalIterator, _Allocator>& __y)
- {
- if (__x.__ready_ != __y.__ready_)
- return false;
- if (!__x.__ready_)
- return true;
- return __x.__matches_ == __y.__matches_ &&
- __x.__prefix_ == __y.__prefix_ &&
- __x.__suffix_ == __y.__suffix_;
- }
- template <class _BidirectionalIterator, class _Allocator>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
- const match_results<_BidirectionalIterator, _Allocator>& __y)
- {
- return !(__x == __y);
- }
- template <class _BidirectionalIterator, class _Allocator>
- inline _LIBCPP_INLINE_VISIBILITY
- void
- swap(match_results<_BidirectionalIterator, _Allocator>& __x,
- match_results<_BidirectionalIterator, _Allocator>& __y)
- {
- __x.swap(__y);
- }
- // regex_search
- template <class _CharT, class _Traits>
- template <class _Allocator>
- bool
- basic_regex<_CharT, _Traits>::__match_at_start_ecma(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool __at_first) const
- {
- vector<__state> __states;
- __node* __st = __start_.get();
- if (__st)
- {
- __states.push_back(__state());
- __states.back().__do_ = 0;
- __states.back().__first_ = __first;
- __states.back().__current_ = __first;
- __states.back().__last_ = __last;
- __states.back().__sub_matches_.resize(mark_count());
- __states.back().__loop_data_.resize(__loop_count());
- __states.back().__node_ = __st;
- __states.back().__flags_ = __flags;
- __states.back().__at_first_ = __at_first;
- do
- {
- __state& __s = __states.back();
- if (__s.__node_)
- __s.__node_->__exec(__s);
- switch (__s.__do_)
- {
- case __state::__end_state:
- __m.__matches_[0].first = __first;
- __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
- __m.__matches_[0].matched = true;
- for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
- __m.__matches_[__i+1] = __s.__sub_matches_[__i];
- return true;
- case __state::__accept_and_consume:
- case __state::__repeat:
- case __state::__accept_but_not_consume:
- break;
- case __state::__split:
- {
- __state __snext = __s;
- __s.__node_->__exec_split(true, __s);
- __snext.__node_->__exec_split(false, __snext);
- __states.push_back(_VSTD::move(__snext));
- }
- break;
- case __state::__reject:
- __states.pop_back();
- break;
- default:
- #ifndef _LIBCPP_NO_EXCEPTIONS
- throw regex_error(regex_constants::__re_err_unknown);
- #endif
- break;
- }
- } while (!__states.empty());
- }
- return false;
- }
- template <class _CharT, class _Traits>
- template <class _Allocator>
- bool
- basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool __at_first) const
- {
- deque<__state> __states;
- ptrdiff_t __highest_j = 0;
- ptrdiff_t _Np = _VSTD::distance(__first, __last);
- __node* __st = __start_.get();
- if (__st)
- {
- __states.push_back(__state());
- __states.back().__do_ = 0;
- __states.back().__first_ = __first;
- __states.back().__current_ = __first;
- __states.back().__last_ = __last;
- __states.back().__loop_data_.resize(__loop_count());
- __states.back().__node_ = __st;
- __states.back().__flags_ = __flags;
- __states.back().__at_first_ = __at_first;
- bool __matched = false;
- do
- {
- __state& __s = __states.back();
- if (__s.__node_)
- __s.__node_->__exec(__s);
- switch (__s.__do_)
- {
- case __state::__end_state:
- if (!__matched || __highest_j < __s.__current_ - __s.__first_)
- __highest_j = __s.__current_ - __s.__first_;
- __matched = true;
- if (__highest_j == _Np)
- __states.clear();
- else
- __states.pop_back();
- break;
- case __state::__consume_input:
- break;
- case __state::__accept_and_consume:
- __states.push_front(_VSTD::move(__s));
- __states.pop_back();
- break;
- case __state::__repeat:
- case __state::__accept_but_not_consume:
- break;
- case __state::__split:
- {
- __state __snext = __s;
- __s.__node_->__exec_split(true, __s);
- __snext.__node_->__exec_split(false, __snext);
- __states.push_back(_VSTD::move(__snext));
- }
- break;
- case __state::__reject:
- __states.pop_back();
- break;
- default:
- #ifndef _LIBCPP_NO_EXCEPTIONS
- throw regex_error(regex_constants::__re_err_unknown);
- #endif
- break;
- }
- } while (!__states.empty());
- if (__matched)
- {
- __m.__matches_[0].first = __first;
- __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
- __m.__matches_[0].matched = true;
- return true;
- }
- }
- return false;
- }
- template <class _CharT, class _Traits>
- template <class _Allocator>
- bool
- basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool __at_first) const
- {
- vector<__state> __states;
- __state __best_state;
- ptrdiff_t __j = 0;
- ptrdiff_t __highest_j = 0;
- ptrdiff_t _Np = _VSTD::distance(__first, __last);
- __node* __st = __start_.get();
- if (__st)
- {
- __states.push_back(__state());
- __states.back().__do_ = 0;
- __states.back().__first_ = __first;
- __states.back().__current_ = __first;
- __states.back().__last_ = __last;
- __states.back().__sub_matches_.resize(mark_count());
- __states.back().__loop_data_.resize(__loop_count());
- __states.back().__node_ = __st;
- __states.back().__flags_ = __flags;
- __states.back().__at_first_ = __at_first;
- const _CharT* __current = __first;
- bool __matched = false;
- do
- {
- __state& __s = __states.back();
- if (__s.__node_)
- __s.__node_->__exec(__s);
- switch (__s.__do_)
- {
- case __state::__end_state:
- if (!__matched || __highest_j < __s.__current_ - __s.__first_)
- {
- __highest_j = __s.__current_ - __s.__first_;
- __best_state = __s;
- }
- __matched = true;
- if (__highest_j == _Np)
- __states.clear();
- else
- __states.pop_back();
- break;
- case __state::__accept_and_consume:
- __j += __s.__current_ - __current;
- __current = __s.__current_;
- break;
- case __state::__repeat:
- case __state::__accept_but_not_consume:
- break;
- case __state::__split:
- {
- __state __snext = __s;
- __s.__node_->__exec_split(true, __s);
- __snext.__node_->__exec_split(false, __snext);
- __states.push_back(_VSTD::move(__snext));
- }
- break;
- case __state::__reject:
- __states.pop_back();
- break;
- default:
- #ifndef _LIBCPP_NO_EXCEPTIONS
- throw regex_error(regex_constants::__re_err_unknown);
- #endif
- break;
- }
- } while (!__states.empty());
- if (__matched)
- {
- __m.__matches_[0].first = __first;
- __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
- __m.__matches_[0].matched = true;
- for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
- __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
- return true;
- }
- }
- return false;
- }
- template <class _CharT, class _Traits>
- template <class _Allocator>
- bool
- basic_regex<_CharT, _Traits>::__match_at_start(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags, bool __at_first) const
- {
- if ((__flags_ & 0x1F0) == ECMAScript)
- return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
- if (mark_count() == 0)
- return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
- return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
- }
- template <class _CharT, class _Traits>
- template <class _Allocator>
- bool
- basic_regex<_CharT, _Traits>::__search(
- const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- regex_constants::match_flag_type __flags) const
- {
- __m.__init(1 + mark_count(), __first, __last,
- __flags & regex_constants::__no_update_pos);
- if (__match_at_start(__first, __last, __m, __flags,
- !(__flags & regex_constants::__no_update_pos)))
- {
- __m.__prefix_.second = __m[0].first;
- __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
- __m.__suffix_.first = __m[0].second;
- __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
- return true;
- }
- if (__first != __last && !(__flags & regex_constants::match_continuous))
- {
- __flags |= regex_constants::match_prev_avail;
- for (++__first; __first != __last; ++__first)
- {
- __m.__matches_.assign(__m.size(), __m.__unmatched_);
- if (__match_at_start(__first, __last, __m, __flags, false))
- {
- __m.__prefix_.second = __m[0].first;
- __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
- __m.__suffix_.first = __m[0].second;
- __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
- return true;
- }
- __m.__matches_.assign(__m.size(), __m.__unmatched_);
- }
- }
- __m.__matches_.clear();
- return false;
- }
- template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
- match_results<_BidirectionalIterator, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
- basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
- match_results<const _CharT*> __mc;
- bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
- __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
- return __r;
- }
- template <class _Iter, class _Allocator, class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_search(__wrap_iter<_Iter> __first,
- __wrap_iter<_Iter> __last,
- match_results<__wrap_iter<_Iter>, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- match_results<const _CharT*> __mc;
- bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
- __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
- return __r;
- }
- template <class _Allocator, class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_search(const _CharT* __first, const _CharT* __last,
- match_results<const _CharT*, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- return __e.__search(__first, __last, __m, __flags);
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- basic_string<_CharT> __s(__first, __last);
- match_results<const _CharT*> __mc;
- return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
- }
- template <class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_search(const _CharT* __first, const _CharT* __last,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- match_results<const _CharT*> __mc;
- return __e.__search(__first, __last, __mc, __flags);
- }
- template <class _CharT, class _Allocator, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
- }
- template <class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- match_results<const _CharT*> __m;
- return _VSTD::regex_search(__str, __m, __e, __flags);
- }
- template <class _ST, class _SA, class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_search(const basic_string<_CharT, _ST, _SA>& __s,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- match_results<const _CharT*> __mc;
- return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
- }
- template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_search(const basic_string<_CharT, _ST, _SA>& __s,
- match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- match_results<const _CharT*> __mc;
- bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
- __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
- return __r;
- }
- // regex_match
- template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
- bool
- regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
- match_results<_BidirectionalIterator, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- bool __r = _VSTD::regex_search(__first, __last, __m, __e,
- __flags | regex_constants::match_continuous);
- if (__r)
- {
- __r = !__m.suffix().matched;
- if (!__r)
- __m.__matches_.clear();
- }
- return __r;
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- match_results<_BidirectionalIterator> __m;
- return _VSTD::regex_match(__first, __last, __m, __e, __flags);
- }
- template <class _CharT, class _Allocator, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
- }
- template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_match(const basic_string<_CharT, _ST, _SA>& __s,
- match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
- }
- template <class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
- }
- template <class _ST, class _SA, class _CharT, class _Traits>
- inline _LIBCPP_INLINE_VISIBILITY
- bool
- regex_match(const basic_string<_CharT, _ST, _SA>& __s,
- const basic_regex<_CharT, _Traits>& __e,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
- }
- // regex_iterator
- template <class _BidirectionalIterator,
- class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
- class _Traits = regex_traits<_CharT> >
- class _LIBCPP_TYPE_VIS_ONLY regex_iterator
- {
- public:
- typedef basic_regex<_CharT, _Traits> regex_type;
- typedef match_results<_BidirectionalIterator> value_type;
- typedef ptrdiff_t difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef forward_iterator_tag iterator_category;
- private:
- _BidirectionalIterator __begin_;
- _BidirectionalIterator __end_;
- const regex_type* __pregex_;
- regex_constants::match_flag_type __flags_;
- value_type __match_;
- public:
- regex_iterator();
- regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re,
- regex_constants::match_flag_type __m = regex_constants::match_default);
- bool operator==(const regex_iterator& __x) const;
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {return __match_;}
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {return &__match_;}
- regex_iterator& operator++();
- _LIBCPP_INLINE_VISIBILITY
- regex_iterator operator++(int)
- {
- regex_iterator __t(*this);
- ++(*this);
- return __t;
- }
- };
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
- : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
- {
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, regex_constants::match_flag_type __m)
- : __begin_(__a),
- __end_(__b),
- __pregex_(&__re),
- __flags_(__m)
- {
- _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- bool
- regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
- operator==(const regex_iterator& __x) const
- {
- if (__match_.empty() && __x.__match_.empty())
- return true;
- if (__match_.empty() || __x.__match_.empty())
- return false;
- return __begin_ == __x.__begin_ &&
- __end_ == __x.__end_ &&
- __pregex_ == __x.__pregex_ &&
- __flags_ == __x.__flags_ &&
- __match_[0] == __x.__match_[0];
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
- regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
- {
- __flags_ |= regex_constants::__no_update_pos;
- _BidirectionalIterator __start = __match_[0].second;
- if (__match_.empty())
- {
- if (__start == __end_)
- {
- __match_ = value_type();
- return *this;
- }
- else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
- __flags_ | regex_constants::match_not_null |
- regex_constants::match_continuous))
- return *this;
- else
- ++__start;
- }
- __flags_ |= regex_constants::match_prev_avail;
- if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
- __match_ = value_type();
- return *this;
- }
- typedef regex_iterator<const char*> cregex_iterator;
- typedef regex_iterator<const wchar_t*> wcregex_iterator;
- typedef regex_iterator<string::const_iterator> sregex_iterator;
- typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
- // regex_token_iterator
- template <class _BidirectionalIterator,
- class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
- class _Traits = regex_traits<_CharT> >
- class _LIBCPP_TYPE_VIS_ONLY regex_token_iterator
- {
- public:
- typedef basic_regex<_CharT, _Traits> regex_type;
- typedef sub_match<_BidirectionalIterator> value_type;
- typedef ptrdiff_t difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef forward_iterator_tag iterator_category;
- private:
- typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
- _Position __position_;
- const value_type* __result_;
- value_type __suffix_;
- ptrdiff_t _N_;
- vector<int> __subs_;
- public:
- regex_token_iterator();
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, int __submatch = 0,
- regex_constants::match_flag_type __m =
- regex_constants::match_default);
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, const vector<int>& __submatches,
- regex_constants::match_flag_type __m =
- regex_constants::match_default);
- #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re,
- initializer_list<int> __submatches,
- regex_constants::match_flag_type __m =
- regex_constants::match_default);
- #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- template <size_t _Np>
- regex_token_iterator(_BidirectionalIterator __a,
- _BidirectionalIterator __b,
- const regex_type& __re,
- const int (&__submatches)[_Np],
- regex_constants::match_flag_type __m =
- regex_constants::match_default);
- regex_token_iterator(const regex_token_iterator&);
- regex_token_iterator& operator=(const regex_token_iterator&);
- bool operator==(const regex_token_iterator& __x) const;
- _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
- _LIBCPP_INLINE_VISIBILITY
- const value_type& operator*() const {return *__result_;}
- _LIBCPP_INLINE_VISIBILITY
- const value_type* operator->() const {return __result_;}
- regex_token_iterator& operator++();
- _LIBCPP_INLINE_VISIBILITY
- regex_token_iterator operator++(int)
- {
- regex_token_iterator __t(*this);
- ++(*this);
- return __t;
- }
- private:
- void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
- };
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator()
- : __result_(nullptr),
- __suffix_(),
- _N_(0)
- {
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- void
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
- {
- if (__position_ != _Position())
- {
- if (__subs_[_N_] == -1)
- __result_ = &__position_->prefix();
- else
- __result_ = &(*__position_)[__subs_[_N_]];
- }
- else if (__subs_[_N_] == -1)
- {
- __suffix_.matched = true;
- __suffix_.first = __a;
- __suffix_.second = __b;
- __result_ = &__suffix_;
- }
- else
- __result_ = nullptr;
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, int __submatch,
- regex_constants::match_flag_type __m)
- : __position_(__a, __b, __re, __m),
- _N_(0),
- __subs_(1, __submatch)
- {
- __init(__a, __b);
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re, const vector<int>& __submatches,
- regex_constants::match_flag_type __m)
- : __position_(__a, __b, __re, __m),
- _N_(0),
- __subs_(__submatches)
- {
- __init(__a, __b);
- }
- #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re,
- initializer_list<int> __submatches,
- regex_constants::match_flag_type __m)
- : __position_(__a, __b, __re, __m),
- _N_(0),
- __subs_(__submatches)
- {
- __init(__a, __b);
- }
- #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- template <size_t _Np>
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
- const regex_type& __re,
- const int (&__submatches)[_Np],
- regex_constants::match_flag_type __m)
- : __position_(__a, __b, __re, __m),
- _N_(0),
- __subs_(__submatches, __submatches + _Np)
- {
- __init(__a, __b);
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- regex_token_iterator(const regex_token_iterator& __x)
- : __position_(__x.__position_),
- __result_(__x.__result_),
- __suffix_(__x.__suffix_),
- _N_(__x._N_),
- __subs_(__x.__subs_)
- {
- if (__x.__result_ == &__x.__suffix_)
- __result_ == &__suffix_;
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- operator=(const regex_token_iterator& __x)
- {
- if (this != &__x)
- {
- __position_ = __x.__position_;
- if (__x.__result_ == &__x.__suffix_)
- __result_ == &__suffix_;
- else
- __result_ = __x.__result_;
- __suffix_ = __x.__suffix_;
- _N_ = __x._N_;
- __subs_ = __x.__subs_;
- }
- return *this;
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- bool
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
- operator==(const regex_token_iterator& __x) const
- {
- if (__result_ == nullptr && __x.__result_ == nullptr)
- return true;
- if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
- __suffix_ == __x.__suffix_)
- return true;
- if (__result_ == nullptr || __x.__result_ == nullptr)
- return false;
- if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
- return false;
- return __position_ == __x.__position_ && _N_ == __x._N_ &&
- __subs_ == __x.__subs_;
- }
- template <class _BidirectionalIterator, class _CharT, class _Traits>
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
- regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
- {
- _Position __prev = __position_;
- if (__result_ == &__suffix_)
- __result_ = nullptr;
- else if (_N_ + 1 < __subs_.size())
- {
- ++_N_;
- if (__subs_[_N_] == -1)
- __result_ = &__position_->prefix();
- else
- __result_ = &(*__position_)[__subs_[_N_]];
- }
- else
- {
- _N_ = 0;
- ++__position_;
- if (__position_ != _Position())
- {
- if (__subs_[_N_] == -1)
- __result_ = &__position_->prefix();
- else
- __result_ = &(*__position_)[__subs_[_N_]];
- }
- else
- {
- if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
- && __prev->suffix().length() != 0)
- {
- __suffix_.matched = true;
- __suffix_.first = __prev->suffix().first;
- __suffix_.second = __prev->suffix().second;
- __result_ = &__suffix_;
- }
- else
- __result_ = nullptr;
- }
- }
- return *this;
- }
- typedef regex_token_iterator<const char*> cregex_token_iterator;
- typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
- typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
- typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
- // regex_replace
- template <class _OutputIterator, class _BidirectionalIterator,
- class _Traits, class _CharT>
- _OutputIterator
- regex_replace(_OutputIterator __out,
- _BidirectionalIterator __first, _BidirectionalIterator __last,
- const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
- _Iter __i(__first, __last, __e, __flags);
- _Iter __eof;
- if (__i == __eof)
- {
- if (!(__flags & regex_constants::format_no_copy))
- __out = _VSTD::copy(__first, __last, __out);
- }
- else
- {
- sub_match<_BidirectionalIterator> __lm;
- for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
- {
- if (!(__flags & regex_constants::format_no_copy))
- __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out);
- __out = __i->format(__out, __fmt, __fmt + __len, __flags);
- __lm = __i->suffix();
- if (__flags & regex_constants::format_first_only)
- break;
- }
- if (!(__flags & regex_constants::format_no_copy))
- __out = _VSTD::copy(__lm.first, __lm.second, __out);
- }
- return __out;
- }
- template <class _OutputIterator, class _BidirectionalIterator,
- class _Traits, class _CharT, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- _OutputIterator
- regex_replace(_OutputIterator __out,
- _BidirectionalIterator __first, _BidirectionalIterator __last,
- const basic_regex<_CharT, _Traits>& __e,
- const basic_string<_CharT, _ST, _SA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
- }
- template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
- class _FSA>
- inline _LIBCPP_INLINE_VISIBILITY
- basic_string<_CharT, _ST, _SA>
- regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
- const basic_regex<_CharT, _Traits>& __e,
- const basic_string<_CharT, _FST, _FSA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- basic_string<_CharT, _ST, _SA> __r;
- _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
- __fmt.c_str(), __flags);
- return __r;
- }
- template <class _Traits, class _CharT, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- basic_string<_CharT, _ST, _SA>
- regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
- const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- basic_string<_CharT, _ST, _SA> __r;
- _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
- __fmt, __flags);
- return __r;
- }
- template <class _Traits, class _CharT, class _ST, class _SA>
- inline _LIBCPP_INLINE_VISIBILITY
- basic_string<_CharT>
- regex_replace(const _CharT* __s,
- const basic_regex<_CharT, _Traits>& __e,
- const basic_string<_CharT, _ST, _SA>& __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- basic_string<_CharT> __r;
- _VSTD::regex_replace(back_inserter(__r), __s,
- __s + char_traits<_CharT>::length(__s), __e,
- __fmt.c_str(), __flags);
- return __r;
- }
- template <class _Traits, class _CharT>
- inline _LIBCPP_INLINE_VISIBILITY
- basic_string<_CharT>
- regex_replace(const _CharT* __s,
- const basic_regex<_CharT, _Traits>& __e,
- const _CharT* __fmt,
- regex_constants::match_flag_type __flags = regex_constants::match_default)
- {
- basic_string<_CharT> __r;
- _VSTD::regex_replace(back_inserter(__r), __s,
- __s + char_traits<_CharT>::length(__s), __e,
- __fmt, __flags);
- return __r;
- }
- _LIBCPP_END_NAMESPACE_STD
- #endif // _LIBCPP_REGEX
|