12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028 |
- //
- // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
- // Copyright (c) 2019-2020 Krystian Stasiowski (sdkrystian at gmail dot com)
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- //
- // Official repository: https://github.com/boostorg/static_string
- //
- #ifndef BOOST_STATIC_STRING_STATIC_STRING_HPP
- #define BOOST_STATIC_STRING_STATIC_STRING_HPP
- #if defined(__GNUC__) && __GNUC__ >= 8
- #pragma GCC diagnostic push
- #pragma GCC system_header
- // false positives
- #pragma GCC diagnostic ignored "-Warray-bounds"
- #pragma GCC diagnostic ignored "-Wrestrict"
- #pragma GCC diagnostic ignored "-Wstringop-overflow"
- #endif
- #if defined(__GNUC__) && __GNUC__ >= 7
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wnoexcept-type"
- #endif
- // External include guard
- #ifndef BOOST_STATIC_STRING_CONFIG_HPP
- #include <boost/static_string/config.hpp>
- #include <boost/config/workaround.hpp>
- #endif
- #include <algorithm>
- #include <cstdint>
- #include <cstdio>
- #include <functional>
- #include <initializer_list>
- #include <limits>
- #include <iosfwd>
- #include <type_traits>
- namespace boost {
- namespace static_strings {
- #ifndef BOOST_STATIC_STRING_DOCS
- template<std::size_t N, typename CharT, typename Traits>
- class basic_static_string;
- //------------------------------------------------------------------------------
- //
- // Aliases
- //
- //------------------------------------------------------------------------------
- template<std::size_t N>
- using static_string =
- basic_static_string<N, char, std::char_traits<char>>;
- #ifdef BOOST_STATIC_STRING_HAS_WCHAR
- template<std::size_t N>
- using static_wstring =
- basic_static_string<N, wchar_t, std::char_traits<wchar_t>>;
- #endif
- template<std::size_t N>
- using static_u16string =
- basic_static_string<N, char16_t, std::char_traits<char16_t>>;
- template<std::size_t N>
- using static_u32string =
- basic_static_string<N, char32_t, std::char_traits<char32_t>>;
- #ifdef __cpp_char8_t
- template<std::size_t N>
- using static_u8string =
- basic_static_string<N, char8_t, std::char_traits<char8_t>>;
- #endif
- //--------------------------------------------------------------------------
- //
- // Detail
- //
- //--------------------------------------------------------------------------
- namespace detail {
- // Find the smallest width integral type that can hold a value as large as N (Glen Fernandes)
- template<std::size_t N>
- using smallest_width =
- typename std::conditional<(N <= (std::numeric_limits<unsigned char>::max)()), unsigned char,
- typename std::conditional<(N <= (std::numeric_limits<unsigned short>::max)()), unsigned short,
- typename std::conditional<(N <= (std::numeric_limits<unsigned int>::max)()), unsigned int,
- typename std::conditional<(N <= (std::numeric_limits<unsigned long>::max)()), unsigned long,
- typename std::conditional<(N <= (std::numeric_limits<unsigned long long>::max)()), unsigned long long,
- std::size_t>::type>::type>::type>::type>::type;
- // std::is_nothrow_convertible is C++20
- template<typename To>
- void is_nothrow_convertible_helper(To) noexcept;
- // MSVC is unable to parse this as a single expression, so a helper is needed
- template<typename From, typename To, typename =
- decltype(is_nothrow_convertible_helper<To>(std::declval<From>()))>
- struct is_nothrow_convertible_msvc_helper
- {
- static const bool value =
- noexcept(is_nothrow_convertible_helper<To>(std::declval<From>()));
- };
- template<typename From, typename To, typename = void>
- struct is_nothrow_convertible
- : std::false_type { };
- template<typename From, typename To>
- struct is_nothrow_convertible<From, To, typename std::enable_if<
- is_nothrow_convertible_msvc_helper<From, To>::value>::type>
- : std::true_type { };
- // GCC 4.8, 4.9 workaround for void_t to make the defining-type-id dependant
- template<typename...>
- struct void_t_helper
- {
- using type = void;
- };
- // void_t for c++11
- template<typename... Ts>
- using void_t = typename void_t_helper<Ts...>::type;
- template <class T, typename CharT, typename = void>
- struct is_string_like : std::false_type {};
- template<typename T, typename CharT>
- struct is_string_like<
- T, CharT,
- void_t<
- decltype(std::declval<CharT const*&>() = std::declval<T>().data()),
- decltype(std::declval<std::size_t&>() = std::declval<T>().size())>>
- : std::true_type
- {};
- // Check if a type can be used for templated
- // overloads string_view_type
- // This will be used by overloads that accept the string_view types
- // directly and other convertible types such as std::string.
- // When no string_view type is available, then we check for the
- // data and size member functions, and use them directly for assignments.
- // Types convertible to basic_static_string are not considered viewable
- // to prevent any ambiguity during overload resolution.
- template<std::size_t N, typename T, typename CharT, typename Traits, typename = void>
- struct enable_if_viewable { };
- template<std::size_t N, typename T, typename CharT, typename Traits>
- struct enable_if_viewable<N, T, CharT, Traits,
- typename std::enable_if<
- #if !defined(BOOST_STATIC_STRING_HAS_ANY_STRING_VIEW)
- is_string_like<T, CharT>::value &&
- !std::is_convertible<const T&, const basic_static_string<N, CharT, Traits>&>::value
- #elif defined(BOOST_STATIC_STRING_STANDALONE)
- std::is_convertible<const T&, std::basic_string_view<CharT, Traits>>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string<N, CharT, Traits>&>::value
- #else
- (
- std::is_convertible<const T&, basic_string_view<CharT, Traits>>::value ||
- std::is_convertible<const T&, core::basic_string_view<CharT>>::value
- ) &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string<N, CharT, Traits>&>::value
- #endif
- >::type>
- {
- using type = void;
- };
- template<std::size_t N, typename T, typename CharT, typename Traits>
- using enable_if_viewable_t = typename enable_if_viewable<N, T, CharT, Traits>::type;
- // The common string_view type used in private operations with enable_if_viewable_t
- // - T const& itself when no string_view type is available
- // - basic_string_view (boost::string_view or std::string_view) when in
- // standalone because core::detail::string_view is unavailable
- // - core::detail::basic_string_view otherwise because it's convertible
- // to and from most types, including std::string_view
- // After converting a parameter to a common_string_view_type reference, we
- // can use the data() and size() member functions.
- #if !defined(BOOST_STATIC_STRING_HAS_ANY_STRING_VIEW)
- template<typename T, typename CharT, typename Traits>
- using common_string_view_type = T const&;
- #elif defined(BOOST_STATIC_STRING_STANDALONE)
- template<typename T, typename CharT, typename Traits>
- using common_string_view_type = basic_string_view<CharT, Traits>;
- #else
- template <class T, typename CharT, typename Traits, typename = void>
- struct common_string_view_type_impl {};
- template<typename T, typename CharT, typename Traits>
- struct common_string_view_type_impl<
- T, CharT, Traits,
- typename std::enable_if<
- is_string_like<T, CharT>::value &&
- !std::is_convertible<const T&, basic_string_view<CharT, Traits>>::value &&
- !std::is_convertible<const T&, core::basic_string_view<CharT>>::value>::type>
- {
- using type = T const&;
- };
- template<typename T, typename CharT, typename Traits>
- struct common_string_view_type_impl<
- T, CharT, Traits,
- typename std::enable_if<
- std::is_convertible<const T&, basic_string_view<CharT, Traits>>::value &&
- !std::is_convertible<const T&, core::basic_string_view<CharT>>::value>::type>
- {
- using type = basic_string_view<CharT, Traits>;
- };
- template<typename T, typename CharT, typename Traits>
- struct common_string_view_type_impl<
- T, CharT, Traits,
- typename std::enable_if<
- std::is_convertible<const T&, core::basic_string_view<CharT>>::value>::type>
- {
- using type = core::basic_string_view<CharT>;
- };
- template<typename T, typename CharT, typename Traits>
- using common_string_view_type = typename common_string_view_type_impl<T, CharT, Traits>::type;
- #endif
- // Simplified check for if a type is an iterator
- template<typename T, typename = void>
- struct is_iterator : std::false_type { };
- template<typename T>
- struct is_iterator<T,
- typename std::enable_if<std::is_class<T>::value,
- void_t<typename T::iterator_category>>::type>
- : std::true_type { };
- template<typename T>
- struct is_iterator<T*, void>
- : std::true_type { };
- template<typename T, typename = void>
- struct is_input_iterator : std::false_type { };
- template<typename T>
- struct is_input_iterator<T, typename std::enable_if<is_iterator<T>::value &&
- std::is_convertible<typename std::iterator_traits<T>::iterator_category,
- std::input_iterator_tag>::value>::type>
- : std::true_type { };
- template<typename T, typename = void>
- struct is_forward_iterator : std::false_type { };
- template<typename T>
- struct is_forward_iterator<T, typename std::enable_if<is_iterator<T>::value &&
- std::is_convertible<typename std::iterator_traits<T>::iterator_category,
- std::forward_iterator_tag>::value>::type>
- : std::true_type { };
- template<typename T, typename = void>
- struct is_subtractable
- : std::false_type { };
- template<typename T>
- struct is_subtractable<T, void_t<decltype(std::declval<T&>() - std::declval<T&>())>>
- : std::true_type { };
- // constexpr distance for c++14
- template<
- typename ForwardIt,
- typename std::enable_if<!is_subtractable<ForwardIt>::value>::type* = nullptr>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- std::size_t
- distance(ForwardIt first, ForwardIt last)
- {
- std::size_t dist = 0;
- for (; first != last; ++first, ++dist);
- return dist;
- }
- template<
- typename RandomIt,
- typename std::enable_if<is_subtractable<RandomIt>::value>::type* = nullptr>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- std::size_t
- distance(RandomIt first, RandomIt last)
- {
- return last - first;
- }
- // Copy using traits, respecting iterator rules
- template<typename Traits, typename InputIt, typename CharT>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- copy_with_traits(
- InputIt first,
- InputIt last,
- CharT* out)
- {
- for (; first != last; ++first, ++out)
- Traits::assign(*out, *first);
- }
- // Optimization for using the smallest possible type
- template<std::size_t N, typename CharT, typename Traits>
- class static_string_base
- {
- private:
- using size_type = smallest_width<N>;
- using value_type = typename Traits::char_type;
- using pointer = value_type*;
- using const_pointer = const value_type*;
- public:
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- static_string_base() noexcept { };
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- pointer
- data_impl() noexcept
- {
- return data_;
- }
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_pointer
- data_impl() const noexcept
- {
- return data_;
- }
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- std::size_t
- size_impl() const noexcept
- {
- return size_;
- }
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- std::size_t
- set_size(std::size_t n) noexcept
- {
- // Functions that set size will throw
- // if the new size would exceed max_size()
- // therefore we can guarantee that this will
- // not lose data.
- return size_ = size_type(n);
- }
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- term_impl() noexcept
- {
- Traits::assign(data_[size_], value_type());
- }
- size_type size_ = 0;
- value_type data_[N + 1]{};
- };
- // Optimization for when the size is 0
- template<typename CharT, typename Traits>
- class static_string_base<0, CharT, Traits>
- {
- private:
- using value_type = typename Traits::char_type;
- using pointer = value_type*;
- public:
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- static_string_base() noexcept { }
- // Modifying the null terminator is UB
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- pointer
- data_impl() const noexcept
- {
- return const_cast<pointer>(&null_);
- }
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- std::size_t
- size_impl() const noexcept
- {
- return 0;
- }
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- std::size_t
- set_size(std::size_t) const noexcept
- {
- return 0;
- }
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- term_impl() const noexcept { }
- private:
- static constexpr const value_type null_{};
- };
- // This is only needed in C++14 and lower.
- // see http://eel.is/c++draft/depr.static.constexpr
- #ifndef BOOST_STATIC_STRING_CPP17
- template<typename CharT, typename Traits>
- constexpr
- const
- typename static_string_base<0, CharT, Traits>::value_type
- static_string_base<0, CharT, Traits>::
- null_;
- #endif
- template<typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- int
- lexicographical_compare(
- const CharT* s1,
- std::size_t n1,
- const CharT* s2,
- std::size_t n2) noexcept
- {
- if(n1 < n2)
- return Traits::compare(
- s1, s2, n1) <= 0 ? -1 : 1;
- if(n1 > n2)
- return Traits::compare(
- s1, s2, n2) >= 0 ? 1 : -1;
- return Traits::compare(s1, s2, n1);
- }
- template<typename Traits, typename Integer>
- inline
- char*
- integer_to_string(
- char* str_end,
- Integer value,
- std::true_type) noexcept
- {
- if (value == 0)
- {
- Traits::assign(*--str_end, '0');
- return str_end;
- }
- if (value < 0)
- {
- const bool is_min = value == (std::numeric_limits<Integer>::min)();
- // negation of a min value cannot be represented
- if (is_min)
- value = (std::numeric_limits<Integer>::max)();
- else
- value = -value;
- const auto last_char = str_end - 1;
- for (; value > 0; value /= 10)
- Traits::assign(*--str_end, "0123456789"[value % 10]);
- // minimum values are powers of 2, so it will
- // never terminate with a 9.
- if (is_min)
- Traits::assign(*last_char, Traits::to_char_type(
- Traits::to_int_type(*last_char) + 1));
- Traits::assign(*--str_end, '-');
- return str_end;
- }
- for (; value > 0; value /= 10)
- Traits::assign(*--str_end, "0123456789"[value % 10]);
- return str_end;
- }
- template<typename Traits, typename Integer>
- inline
- char*
- integer_to_string(
- char* str_end,
- Integer value,
- std::false_type) noexcept
- {
- if (value == 0)
- {
- Traits::assign(*--str_end, '0');
- return str_end;
- }
- for (; value > 0; value /= 10)
- Traits::assign(*--str_end, "0123456789"[value % 10]);
- return str_end;
- }
- template<typename Traits, typename Integer>
- inline
- wchar_t*
- integer_to_wstring(
- wchar_t* str_end,
- Integer value,
- std::true_type) noexcept
- {
- if (value == 0)
- {
- Traits::assign(*--str_end, L'0');
- return str_end;
- }
- if (value < 0)
- {
- const bool is_min = value == (std::numeric_limits<Integer>::min)();
- // negation of a min value cannot be represented
- if (is_min)
- value = (std::numeric_limits<Integer>::max)();
- else
- value = -value;
- const auto last_char = str_end - 1;
- for (; value > 0; value /= 10)
- Traits::assign(*--str_end, L"0123456789"[value % 10]);
- // minimum values are powers of 2, so it will
- // never terminate with a 9.
- if (is_min)
- Traits::assign(*last_char, Traits::to_char_type(
- Traits::to_int_type(*last_char) + 1));
- Traits::assign(*--str_end, L'-');
- return str_end;
- }
- for (; value > 0; value /= 10)
- Traits::assign(*--str_end, L"0123456789"[value % 10]);
- return str_end;
- }
- template<typename Traits, typename Integer>
- inline
- wchar_t*
- integer_to_wstring(
- wchar_t* str_end,
- Integer value,
- std::false_type) noexcept
- {
- if (value == 0)
- {
- Traits::assign(*--str_end, L'0');
- return str_end;
- }
- for (; value > 0; value /= 10)
- Traits::assign(*--str_end, L"0123456789"[value % 10]);
- return str_end;
- }
- template<std::size_t N, typename Integer>
- inline
- static_string<N>
- to_static_string_int_impl(Integer value) noexcept
- {
- char buffer[N];
- const auto digits_end = std::end(buffer);
- const auto digits_begin = integer_to_string<std::char_traits<char>, Integer>(
- digits_end, value, std::is_signed<Integer>{});
- return static_string<N>(digits_begin, std::distance(digits_begin, digits_end));
- }
- #ifdef BOOST_STATIC_STRING_HAS_WCHAR
- template<std::size_t N, typename Integer>
- inline
- static_wstring<N>
- to_static_wstring_int_impl(Integer value) noexcept
- {
- wchar_t buffer[N];
- const auto digits_end = std::end(buffer);
- const auto digits_begin = integer_to_wstring<std::char_traits<wchar_t>, Integer>(
- digits_end, value, std::is_signed<Integer>{});
- return static_wstring<N>(digits_begin, std::distance(digits_begin, digits_end));
- }
- #endif
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- inline
- int
- count_digits(std::size_t value)
- {
- return value < 10 ? 1 : count_digits(value / 10) + 1;
- }
- // Ignore -Wformat-truncation, we know what
- // we are doing here. The version check does
- // not need to be extremely precise.
- #if defined(__GNUC__) && __GNUC__ >= 7
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wformat-truncation"
- #endif
- template<std::size_t N>
- inline
- static_string<N>
- to_static_string_float_impl(double value) noexcept
- {
- // we have to assume here that no reasonable implementation
- // will require more than 2^63 chars to represent a float value.
- const long long narrow =
- static_cast<long long>(N);
- // extra one needed for null terminator
- char buffer[N + 1];
- // we know that a formatting error will not occur, so
- // we assume that the result is always positive
- if (std::size_t(std::snprintf(buffer, N + 1, "%f", value)) > N)
- {
- // the + 4 is for the decimal, 'e',
- // its sign, and the sign of the integral portion
- const int reserved_count =
- (std::max)(2, count_digits(
- std::numeric_limits<double>::max_exponent10)) + 4;
- const int precision = narrow > reserved_count ?
- N - reserved_count : 0;
- // switch to scientific notation
- std::snprintf(buffer, N + 1, "%.*e", precision, value);
- }
- // this will not throw
- return static_string<N>(buffer);
- }
- template<std::size_t N>
- inline
- static_string<N>
- to_static_string_float_impl(long double value) noexcept
- {
- // we have to assume here that no reasonable implementation
- // will require more than 2^63 chars to represent a float value.
- const long long narrow =
- static_cast<long long>(N);
- // extra one needed for null terminator
- char buffer[N + 1];
- // snprintf returns the number of characters
- // that would have been written
- // we know that a formatting error will not occur, so
- // we assume that the result is always positive
- if (std::size_t(std::snprintf(buffer, N + 1, "%Lf", value)) > N)
- {
- // the + 4 is for the decimal, 'e',
- // its sign, and the sign of the integral portion
- const int reserved_count =
- (std::max)(2, count_digits(
- std::numeric_limits<long double>::max_exponent10)) + 4;
- const int precision = narrow > reserved_count ?
- N - reserved_count : 0;
- // switch to scientific notation
- std::snprintf(buffer, N + 1, "%.*Le", precision, value);
- }
- // this will not throw
- return static_string<N>(buffer);
- }
- #ifdef BOOST_STATIC_STRING_HAS_WCHAR
- template<std::size_t N>
- inline
- static_wstring<N>
- to_static_wstring_float_impl(double value) noexcept
- {
- // we have to assume here that no reasonable implementation
- // will require more than 2^63 chars to represent a float value.
- const long long narrow =
- static_cast<long long>(N);
- // extra one needed for null terminator
- wchar_t buffer[N + 1];
- // swprintf returns a negative number if it can't
- // fit all the characters in the buffer.
- // mingw has a non-standard swprintf, so
- // this just covers all the bases. short
- // circuit evaluation will ensure that the
- // second operand is not evaluated on conforming
- // implementations.
- const long long num_written =
- std::swprintf(buffer, N + 1, L"%f", value);
- if (num_written < 0 ||
- num_written > narrow)
- {
- // the + 4 is for the decimal, 'e',
- // its sign, and the sign of the integral portion
- const int reserved_count =
- (std::max)(2, count_digits(
- std::numeric_limits<double>::max_exponent10)) + 4;
- const int precision = narrow > reserved_count ?
- N - reserved_count : 0;
- // switch to scientific notation
- std::swprintf(buffer, N + 1, L"%.*e", precision, value);
- }
- // this will not throw
- return static_wstring<N>(buffer);
- }
- template<std::size_t N>
- inline
- static_wstring<N>
- to_static_wstring_float_impl(long double value) noexcept
- {
- // we have to assume here that no reasonable implementation
- // will require more than 2^63 chars to represent a float value.
- const long long narrow =
- static_cast<long long>(N);
- // extra one needed for null terminator
- wchar_t buffer[N + 1];
- // swprintf returns a negative number if it can't
- // fit all the characters in the buffer.
- // mingw has a non-standard swprintf, so
- // this just covers all the bases. short
- // circuit evaluation will ensure that the
- // second operand is not evaluated on conforming
- // implementations.
- const long long num_written =
- std::swprintf(buffer, N + 1, L"%Lf", value);
- if (num_written < 0 ||
- num_written > narrow)
- {
- // the + 4 is for the decimal, 'e',
- // its sign, and the sign of the integral portion
- const int reserved_count =
- (std::max)(2, count_digits(
- std::numeric_limits<long double>::max_exponent10)) + 4;
- const int precision = narrow > reserved_count ?
- N - reserved_count : 0;
- // switch to scientific notation
- std::swprintf(buffer, N + 1, L"%.*Le", precision, value);
- }
- // this will not throw
- return static_wstring<N>(buffer);
- }
- #endif
- #if defined(__GNUC__) && __GNUC__ >= 7
- #pragma GCC diagnostic pop
- #endif
- template<typename Traits, typename CharT, typename ForwardIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- ForwardIterator
- find_not_of(
- ForwardIterator first,
- ForwardIterator last,
- const CharT* str,
- std::size_t n) noexcept
- {
- for (; first != last; ++first)
- if (!Traits::find(str, n, *first))
- return first;
- return last;
- }
- // constexpr search for C++14
- template<typename ForwardIt1, typename ForwardIt2, typename BinaryPredicate>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- ForwardIt1
- search(
- ForwardIt1 first,
- ForwardIt1 last,
- ForwardIt2 s_first,
- ForwardIt2 s_last,
- BinaryPredicate p)
- {
- for (; ; ++first)
- {
- ForwardIt1 it = first;
- for (ForwardIt2 s_it = s_first; ; ++it, ++s_it)
- {
- if (s_it == s_last)
- return first;
- if (it == last)
- return last;
- if (!p(*it, *s_it))
- break;
- }
- }
- }
- template<typename InputIt, typename ForwardIt, typename BinaryPredicate>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- InputIt
- find_first_of(
- InputIt first,
- InputIt last,
- ForwardIt s_first,
- ForwardIt s_last,
- BinaryPredicate p)
- {
- for (; first != last; ++first)
- for (ForwardIt it = s_first; it != s_last; ++it)
- if (p(*first, *it))
- return first;
- return last;
- }
- // KRYSTIAN TODO: add a constexpr rotate
- // Check if a pointer lies within the range {src_first, src_last)
- // without unspecified behavior, allowing it to be used
- // in a constant evaluation.
- template<typename T>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- ptr_in_range(
- const T* src_first,
- const T* src_last,
- const T* ptr)
- {
- #if defined(BOOST_STATIC_STRING_CPP14) && \
- defined(BOOST_STATIC_STRING_IS_CONST_EVAL)
- // Our second best option is to use is_constant_evaluated
- // and a loop that checks for equality, since equality for
- // pointer to object types is never unspecified in this case.
- if (BOOST_STATIC_STRING_IS_CONST_EVAL)
- {
- for (; src_first != src_last; ++src_first)
- if (ptr == src_first)
- return true;
- return false;
- }
- #endif
- // We want to make this usable in constant expressions as much as possible
- // while retaining the guarentee that the comparison has a strict total ordering.
- // We also want this to be fast. Since different compilers have differing levels
- // of conformance, we will settle for the best option that is available.
- // We don't care about this in C++11, since this function would have
- // no applications in constant expressions.
- #if defined(BOOST_STATIC_STRING_CPP14) && \
- defined(BOOST_STATIC_STRING_NO_PTR_COMP_FUNCTIONS)
- // If library comparison functions don't work,
- // we can use try builtin comparison operators instead.
- return ptr >= src_first && ptr < src_last;
- #else
- // Use the library comparison functions if we can't use
- // is_constant_evaluated or if we don't need to.
- return std::greater_equal<const T*>()(ptr, src_first) &&
- std::less<const T*>()(ptr, src_last);
- #endif
- }
- // This workaround is for gcc 5,
- // which prohibits throw expressions in constexpr
- // functions, but for some reason permits them in
- // constructors.
- #ifdef BOOST_STATIC_STRING_GCC5_BAD_CONSTEXPR
- template<typename Exception>
- struct throw_exception
- {
- BOOST_STATIC_STRING_NORETURN
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- throw_exception(const char* msg)
- {
- BOOST_STATIC_STRING_THROW(Exception(msg));
- }
- };
- #else
- template<typename Exception>
- BOOST_STATIC_STRING_NORETURN
- inline
- void
- throw_exception(const char* msg)
- {
- BOOST_STATIC_STRING_THROW(Exception(msg));
- }
- #endif
- } // detail
- #endif
- //--------------------------------------------------------------------------
- //
- // static_string
- //
- //--------------------------------------------------------------------------
- /** A fixed-capacity string.
- These objects behave like `std::string` except that the storage
- is not dynamically allocated but rather fixed in size, and
- stored in the object itself.
- These strings offer performance advantages when an algorithm
- can execute with a reasonable upper limit on the size of a value.
- @par Aliases
- The following alias templates are provided for convenience:
- @code
- template<std::size_t N>
- using static_string =
- basic_static_string<N, char, std::char_traits<char>>;
- @endcode
- @code
- template<std::size_t N>
- using static_wstring =
- basic_static_string<N, wchar_t, std::char_traits<wchar_t>>;
- @endcode
- @code
- template<std::size_t N>
- using static_u16string =
- basic_static_string<N, char16_t, std::char_traits<char16_t>>;
- @endcode
- @code
- template<std::size_t N>
- using static_u32string =
- basic_static_string<N, char32_t, std::char_traits<char32_t>>;
- @endcode
- Addtionally, the alias template `static_u8string` is provided in C++20
- @code
- template<std::size_t N>
- using static_u8string =
- basic_static_string<N, char8_t, std::char_traits<char8_t>>;
- @endcode
- @see to_static_string
- */
- template<std::size_t N, typename CharT,
- typename Traits = std::char_traits<CharT>>
- class basic_static_string
- #ifndef BOOST_STATIC_STRING_DOCS
- : private detail::static_string_base<N, CharT, Traits>
- #endif
- {
- private:
- template<std::size_t, class, class>
- friend class basic_static_string;
- public:
- //--------------------------------------------------------------------------
- //
- // Member types
- //
- //--------------------------------------------------------------------------
- /// The traits type.
- using traits_type = Traits;
- /// The character type.
- using value_type = typename traits_type::char_type;
- /// The size type.
- using size_type = std::size_t;
- /// The difference type.
- using difference_type = std::ptrdiff_t;
- /// The pointer type.
- using pointer = value_type*;
- /// The reference type.
- using reference = value_type&;
- /// The constant pointer type.
- using const_pointer = const value_type*;
- /// The constant reference type.
- using const_reference = const value_type&;
- /// The iterator type.
- using iterator = value_type*;
- /// The constant iterator type.
- using const_iterator = const value_type*;
- /// The reverse iterator type.
- using reverse_iterator =
- std::reverse_iterator<iterator>;
- /// The constant reverse iterator type.
- using const_reverse_iterator =
- std::reverse_iterator<const_iterator>;
- #ifdef BOOST_STATIC_STRING_HAS_ANY_STRING_VIEW
- /// The string view type.
- using string_view_type =
- basic_string_view<value_type, traits_type>;
- #endif
- //--------------------------------------------------------------------------
- //
- // Constants
- //
- //--------------------------------------------------------------------------
- /// Maximum size of the string excluding any null terminator
- static constexpr size_type static_capacity = N;
- /// A special index
- static constexpr size_type npos = size_type(-1);
- //--------------------------------------------------------------------------
- //
- // Construction
- //
- //--------------------------------------------------------------------------
- /** Constructor.
- Construct an empty string
- */
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- basic_static_string() noexcept
- {
- #ifdef BOOST_STATIC_STRING_CPP20
- term();
- #endif
- }
- /** Constructor.
- Construct the string with `count` copies of character `ch`.
- The behavior is undefined if `count >= npos`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(
- size_type count,
- value_type ch)
- {
- assign(count, ch);
- }
- /** Constructor.
- Construct with a substring (pos, other.size()) of `other`.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(
- const basic_static_string<M, CharT, Traits>& other,
- size_type pos)
- {
- assign(other, pos);
- }
- /** Constructor.
- Construct with a substring (pos, count) of `other`.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(
- const basic_static_string<M, CharT, Traits>& other,
- size_type pos,
- size_type count)
- {
- assign(other, pos, count);
- }
- /** Constructor.
- Construct with the first `count` characters of `s`, including nulls.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(
- const_pointer s,
- size_type count)
- {
- assign(s, count);
- }
- /** Constructor.
- Construct from a null terminated string.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(const_pointer s)
- {
- assign(s);
- }
- /** Constructor.
- Construct from a range of characters
- */
- template<typename InputIterator
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename std::enable_if<
- detail::is_input_iterator<InputIterator>
- ::value>::type* = nullptr
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(
- InputIterator first,
- InputIterator last)
- {
- // KRYSTIAN TODO: we can use a better algorithm if this is a forward iterator
- assign(first, last);
- }
- /** Constructor.
- Copy constructor.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(const basic_static_string& other) noexcept
- {
- assign(other);
- }
- /** Constructor.
- Copy constructor.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(
- const basic_static_string<M, CharT, Traits>& other)
- {
- assign(other);
- }
- /** Constructor.
- Construct from an initializer list
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(std::initializer_list<value_type> init)
- {
- assign(init.begin(), init.size());
- }
- /** Constructor.
- Construct from a object convertible to `string_view_type`
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- explicit
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(const T& t)
- {
- assign(t);
- }
- /** Constructor.
- Construct from any object convertible to `string_view_type`.
- The range (pos, n) is extracted from the value
- obtained by converting `t` to `string_view_type`,
- and used to construct the string.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string(
- const T& t,
- size_type pos,
- size_type n)
- {
- assign(t, pos, n);
- }
- //--------------------------------------------------------------------------
- //
- // Assignment
- //
- //--------------------------------------------------------------------------
- /** Assign to the string.
- Replaces the contents with those of
- the string `s`.
- @par Complexity
- Linear in `s.size()`.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param s The string to replace
- the contents with.
- @throw std::length_error `s.size() > max_size()`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator=(const basic_static_string& s)
- {
- return assign(s);
- }
- /** Assign to the string.
- Replaces the contents with those of
- the string `s`.
- @par Complexity
- Linear in `s.size()`.
- @par Exception Safety
- Strong guarantee.
- @tparam M The size of the other string.
- @return `*this`
- @param s The string to replace
- the contents with.
- @throw std::length_error `s.size() > max_size()`.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator=(const basic_static_string<M, CharT, Traits>& s)
- {
- return assign(s);
- }
- /** Assign to the string.
- Replaces the contents with those of
- `{s, s + traits_type::length(s))`.
- @par Complexity
- Linear in `count`.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param s A pointer to the string to copy from.
- @throw std::length_error `traits_type::length(s) > max_size()`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator=(const_pointer s)
- {
- return assign(s);
- }
- /** Assign to the string.
- Replaces the contents with a single copy of
- the character `ch`.
- @par Complexity
- Constant.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param ch The character to assign to.
- @throw std::length_error `count > max_size()`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator=(value_type ch)
- {
- return assign_char(ch,
- std::integral_constant<bool, (N > 0)>{});
- }
- /** Assign to the string.
- Replaces the contents with those of the
- initializer list `ilist`.
- @par Complexity
- Linear in `init.size()`.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param ilist The initializer list to copy from.
- @throw std::length_error `ilist.size() > max_size()`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator=(std::initializer_list<value_type> ilist)
- {
- return assign(ilist);
- }
- /** Assign to the string.
- Replaces the contents with those of
- `sv`, where `sv` is `string_view_type(t)`.
- @par Complexity
- Linear in `sv.size()`.
- @par Exception Safety
- Strong guarantee.
- @note
- The view can contain null characters.
- @tparam T A type convertible to `string_view_type`.
- @par Constraints
- @code
- std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value
- @endcode
- @return `*this`
- @param t The object to assign from.
- @throw std::length_error `sv.size() > max_size()`.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator=(const T& t)
- {
- return assign(t);
- }
- /** Assign to the string.
- Replaces the contents with `count` copies of
- character `ch`.
- @par Complexity
- Linear in `count`.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param count The size of the resulting string.
- @param ch The value to initialize characters
- of the string with.
- @throw std::length_error `count > max_size()`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign(
- size_type count,
- value_type ch);
- /** Assign to the string.
- Replaces the contents with those of
- the string `s`.
- @par Complexity
- Linear in `s.size()`.
- @par Exception Safety
- Strong guarantee.
- @tparam M The size of the other string.
- @return `*this`
- @param s The string to replace
- the contents with.
- @throw std::length_error `s.size() > max_size()`.
- */
- template<std::size_t M
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename std::enable_if<(M < N)>::type* = nullptr
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign(const basic_static_string<M, CharT, Traits>& s)
- {
- return assign_unchecked(s.data(), s.size());
- }
- #ifndef BOOST_STATIC_STRING_DOCS
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign(const basic_static_string& s) noexcept
- {
- if (data() == s.data())
- return *this;
- return assign_unchecked(s.data(), s.size());
- }
- template<std::size_t M,
- typename std::enable_if<(M > N)>::type* = nullptr>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign(const basic_static_string<M, CharT, Traits>& s)
- {
- return assign(s.data(), s.size());
- }
- #endif
- /** Assign to the string.
- Replaces the contents with those of the string `sub`,
- where `sub` is `s.substr(pos, count)`.
- @par Complexity
- Linear in `sub.size()`.
- @par Exception Safety
- Strong guarantee.
- @tparam M The capacity of the other string.
- @return `*this`
- @param s The string to replace
- the contents with.
- @param pos The index at which to begin the substring.
- @param count The size of the substring. The default
- argument for this parameter is @ref npos.
- @throw std::length_error `sub.size() > max_size()`.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign(
- const basic_static_string<M, CharT, Traits>& s,
- size_type pos,
- size_type count = npos)
- {
- return assign(s.data() + pos, s.capped_length(pos, count));
- }
- /** Assign to the string.
- Replaces the contents with those of `{s, s + count)`.
- @par Complexity
- Linear in `count`.
- @par Exception Safety
- Strong guarantee.
- @note
- The range can contain null characters.
- @return `*this`
- @param count The number of characters to copy.
- @param s A pointer to the string to copy from.
- @throw std::length_error `count > max_size()`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign(
- const_pointer s,
- size_type count);
- /** Assign to the string.
- Replaces the contents with those of
- `{s, s + traits_type::length(s))`.
- @par Complexity
- Linear in `count`.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param s A pointer to the string to copy from.
- @throw std::length_error `traits_type::length(s) > max_size()`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign(const_pointer s)
- {
- return assign(s, traits_type::length(s));
- }
- /** Assign to the string.
- Replaces the contents with the characters
- in the range `{first, last)`.
- @par Complexity
- Linear in `std::distance(first, last)`.
- @par Exception Safety
- Strong guarantee.
- @tparam InputIterator The type of the iterators.
- @par Constraints
- `InputIterator` satisfies __InputIterator__.
- @return `*this`
- @param first An iterator referring to the
- first character to assign.
- @param last An iterator past the end
- of the range to assign from.
- @throw std::length_error `std::distance(first, last) > max_size()`.
- */
- template<typename InputIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- #ifdef BOOST_STATIC_STRING_DOCS
- basic_static_string&
- #else
- typename std::enable_if<
- detail::is_input_iterator<InputIterator>::value,
- basic_static_string&>::type
- #endif
- assign(
- InputIterator first,
- InputIterator last);
- /** Assign to the string.
- Replaces the contents with those of the
- initializer list `ilist`.
- @par Complexity
- Linear in `init.size()`.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param ilist The initializer list to copy from.
- @throw std::length_error `ilist.size() > max_size()`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign(
- std::initializer_list<value_type> ilist)
- {
- return assign(ilist.begin(), ilist.end());
- }
- /** Assign to the string.
- Replaces the contents with those of
- `sv`, where `sv` is `string_view_type(t)`.
- @par Complexity
- Linear in `sv.size()`.
- @par Exception Safety
- Strong guarantee.
- @note
- The view can contain null characters.
- @tparam T A type convertible to `string_view_type`.
- @par Constraints
- @code
- std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value
- @endcode
- @return `*this`
- @param t The object to assign from.
- @throw std::length_error `sv.size() > max_size()`.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign(const T& t)
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return assign(sv.data(), sv.size());
- }
- /** Assign to the string.
- Replaces the contents with those of the substring `sv`,
- where `sv` is `string_view_type(t).substr(pos, count)`.
- @par Complexity
- Linear in `sv.size()`.
- @par Exception Safety
- Strong guarantee.
- @note
- The view can contain null characters.
- @tparam T A type convertible to `string_view_type`.
- @par Constraints
- @code
- std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value
- @endcode
- @return `*this`
- @param t The object to assign from.
- @param pos The index at which to begin the substring.
- @param count The size of the substring. The default
- argument for this parameter is @ref npos.
- @throw std::length_error `sv.size() > max_size()`.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- basic_static_string&
- assign(
- const T& t,
- size_type pos,
- size_type count = npos)
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- if( pos > sv.size() )
- detail::throw_exception<std::out_of_range>(
- "pos >= t.size()");
- std::size_t rlen = (std::min)( count, sv.size() - pos );
- return assign(sv.data() + pos, rlen);
- }
- //--------------------------------------------------------------------------
- //
- // Element access
- //
- //--------------------------------------------------------------------------
- /** Access a character with bounds checking.
- Returns a reference to the character at
- index `pos`.
- @par Complexity
- Constant.
- @par Exception Safety
- Strong guarantee.
- @param pos The index to access.
- @throw std::out_of_range `pos >= size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- reference
- at(size_type pos)
- {
- if (pos >= size())
- detail::throw_exception<std::out_of_range>(
- "pos >= size()");
- return data()[pos];
- }
- /** Access a character with bounds checking.
- Returns a reference to the character at
- index `pos`.
- @par Complexity
- Constant.
- @par Exception Safety
- Strong guarantee.
- @param pos The index to access.
- @throw std::out_of_range `pos >= size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_reference
- at(size_type pos) const
- {
- if (pos >= size())
- detail::throw_exception<std::out_of_range>(
- "pos >= size()");
- return data()[pos];
- }
- /** Access a character.
- Returns a reference to the character at
- index `pos`.
- @par Complexity
- Constant.
- @par Precondition
- `pos >= size`
- @param pos The index to access.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- reference
- operator[](size_type pos) noexcept
- {
- return data()[pos];
- }
- /** Access a character.
- Returns a reference to the character at
- index `pos`.
- @par Complexity
- Constant.
- @par Precondition
- `pos >= size`
- @param pos The index to access.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_reference
- operator[](size_type pos) const noexcept
- {
- return data()[pos];
- }
- /** Return the first character.
- Returns a reference to the first character.
- @par Complexity
- Constant.
- @par Precondition
- `not empty()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- reference
- front() noexcept
- {
- return data()[0];
- }
- /** Return the first character.
- Returns a reference to the first character.
- @par Complexity
- Constant.
- @par Precondition
- `not empty()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_reference
- front() const noexcept
- {
- return data()[0];
- }
- /** Return the last character.
- Returns a reference to the last character.
- @par Complexity
- Constant.
- @par Precondition
- `not empty()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- reference
- back() noexcept
- {
- return data()[size() - 1];
- }
- /** Return the last character.
- Returns a reference to the last character.
- @par Complexity
- Constant.
- @par Precondition
- `not empty()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_reference
- back() const noexcept
- {
- return data()[size() - 1];
- }
- /** Return a pointer to the string.
- Returns a pointer to the underlying array
- serving as storage. The value returned is such that
- the range `{data(), data() + size())` is always a
- valid range, even if the container is empty.
- @par Complexity
- Constant.
- @note The value returned from this function
- is never never a null pointer value.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- pointer
- data() noexcept
- {
- return this->data_impl();
- }
- /** Return a pointer to the string.
- Returns a pointer to the underlying array
- serving as storage. The value returned is such that
- the range `{data(), data() + size())` is always a
- valid range, even if the container is empty.
- @par Complexity
- Constant.
- @note The value returned from this function
- is never never a null pointer value.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_pointer
- data() const noexcept
- {
- return this->data_impl();
- }
- /** Return a pointer to the string.
- Returns a pointer to the underlying array
- serving as storage. The value returned is such that
- the range `{c_str(), c_str() + size())` is always a
- valid range, even if the container is empty.
- @par Complexity
- Constant.
- @note The value returned from this function
- is never never a null pointer value.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_pointer
- c_str() const noexcept
- {
- return data();
- }
- #ifdef BOOST_STATIC_STRING_DOCS
- /** Convert to a string view referring to the string.
- Returns a string view referring to the
- underlying character string.
- @par Complexity
- Constant.
- */
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- operator string_view_type() const noexcept
- {
- return string_view_type(data(), size());
- }
- #else
- #ifdef BOOST_STATIC_STRING_HAS_STD_STRING_VIEW
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- operator std::basic_string_view<CharT, Traits>() const noexcept
- {
- return std::basic_string_view<CharT, Traits>(data(), size());
- }
- #endif
- #ifndef BOOST_STATIC_STRING_STANDALONE
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- operator ::boost::basic_string_view<CharT, Traits>() const noexcept
- {
- return ::boost::basic_string_view<CharT, Traits>(data(), size());
- }
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- operator ::boost::core::basic_string_view<CharT>() const noexcept
- {
- return ::boost::core::basic_string_view<CharT>(data(), size());
- }
- #endif
- #endif
- //--------------------------------------------------------------------------
- //
- // Iterators
- //
- //--------------------------------------------------------------------------
- /// Return an iterator to the beginning.
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- iterator
- begin() noexcept
- {
- return data();
- }
- /// Return an iterator to the beginning.
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_iterator
- begin() const noexcept
- {
- return data();
- }
- /// Return an iterator to the beginning.
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_iterator
- cbegin() const noexcept
- {
- return data();
- }
- /// Return an iterator to the end.
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- iterator
- end() noexcept
- {
- return data() + size();
- }
- /// Return an iterator to the end.
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_iterator
- end() const noexcept
- {
- return data() + size();
- }
- /// Return an iterator to the end.
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- const_iterator
- cend() const noexcept
- {
- return data() + size();
- }
- /// Return a reverse iterator to the beginning.
- BOOST_STATIC_STRING_CPP17_CONSTEXPR
- reverse_iterator
- rbegin() noexcept
- {
- return reverse_iterator{end()};
- }
- /// Return a reverse iterator to the beginning.
- BOOST_STATIC_STRING_CPP17_CONSTEXPR
- const_reverse_iterator
- rbegin() const noexcept
- {
- return const_reverse_iterator{cend()};
- }
- /// Return a reverse iterator to the beginning.
- BOOST_STATIC_STRING_CPP17_CONSTEXPR
- const_reverse_iterator
- crbegin() const noexcept
- {
- return const_reverse_iterator{cend()};
- }
- /// Return a reverse iterator to the end.
- BOOST_STATIC_STRING_CPP17_CONSTEXPR
- reverse_iterator
- rend() noexcept
- {
- return reverse_iterator{begin()};
- }
- /// Return a reverse iterator to the end.
- BOOST_STATIC_STRING_CPP17_CONSTEXPR
- const_reverse_iterator
- rend() const noexcept
- {
- return const_reverse_iterator{cbegin()};
- }
- /// Return a reverse iterator to the end.
- BOOST_STATIC_STRING_CPP17_CONSTEXPR
- const_reverse_iterator
- crend() const noexcept
- {
- return const_reverse_iterator{cbegin()};
- }
- //--------------------------------------------------------------------------
- //
- // Capacity
- //
- //--------------------------------------------------------------------------
- /** Return if the string is empty.
- Returns whether the string contains no characters.
- @par Complexity
- Constant.
- @return `size() == 0`
- */
- BOOST_STATIC_STRING_NODISCARD
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- bool
- empty() const noexcept
- {
- return size() == 0;
- }
- /** Return the size of the string.
- Returns the number of characters stored in the
- string, excluding the null terminator.
- @par Complexity
- Constant.
- */
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- size_type
- size() const noexcept
- {
- return this->size_impl();
- }
- /** Return the size of the string.
- Returns the number of characters stored in the
- string, excluding the null terminator.
- @par Complexity
- Constant.
- */
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- size_type
- length() const noexcept
- {
- return size();
- }
- /** Return the number of characters that can be stored.
- Returns the maximum size of the string, excluding the
- null terminator. The returned value is always `N`.
- @par Complexity
- Constant.
- */
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- size_type
- max_size() const noexcept
- {
- return N;
- }
- /** Increase the capacity.
- This function has no effect.
- @throw std::length_error `n > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- reserve(size_type n)
- {
- if (n > max_size())
- detail::throw_exception<std::length_error>(
- "n > max_size()");
- }
- /** Return the number of characters that can be stored.
- Returns the maximum size of the string, excluding the
- null terminator. The returned value is always `N`.
- @par Complexity
- Constant.
- */
- BOOST_STATIC_STRING_CPP11_CONSTEXPR
- size_type
- capacity() const noexcept
- {
- return max_size();
- }
- /** Request the removal of unused capacity.
- This function has no effect.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- shrink_to_fit() noexcept { }
- //--------------------------------------------------------------------------
- //
- // Operations
- //
- //--------------------------------------------------------------------------
- /** Clear the contents.
- Erases all characters from the string. After this
- call, @ref size() returns zero.
- @par Complexity
- Linear in @ref size().
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- clear() noexcept
- {
- this->set_size(0);
- term();
- }
- /** Insert into the string.
- Inserts `count` copies of `ch` at the position `index`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param index The index to insert at.
- @param count The number of characters to insert.
- @param ch The character to insert.
- @throw std::length_error `size() + count > max_size()`
- @throw std::out_of_range `index > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert(
- size_type index,
- size_type count,
- value_type ch)
- {
- if (index > size())
- detail::throw_exception<std::out_of_range>(
- "index > size()");
- insert(begin() + index, count, ch);
- return *this;
- }
- /** Insert into the string.
- Inserts the null-terminated character string pointed to by `s`
- of length `count` at the position `index` where `count`
- is `traits_type::length(s)`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param index The index to insert at.
- @param s The string to insert.
- @throw std::length_error `size() + count > max_size()`
- @throw std::out_of_range `index > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert(
- size_type index,
- const_pointer s)
- {
- return insert(index, s, traits_type::length(s));
- }
- /** Insert into the string.
- Inserts `count` characters of the string pointed to by `s`
- at the position `index`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param index The index to insert at.
- @param s The string to insert.
- @param count The length of the string to insert.
- @throw std::length_error `size() + count > max_size()`
- @throw std::out_of_range `index > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert(
- size_type index,
- const_pointer s,
- size_type count)
- {
- if (index > size())
- detail::throw_exception<std::out_of_range>(
- "index > size()");
- insert(data() + index, s, s + count);
- return *this;
- }
- /** Insert into the string.
- Inserts the string `str`
- at the position `index`.
- @par Exception Safety
- Strong guarantee.
- @note The insertion is done unchecked when
- the capacity of `str` differs from that of the
- string the function is called on.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam M The size of the input string.
- @return `*this`
- @param index The index to insert at.
- @param str The string to insert.
- @throw std::length_error `size() + str.size() > max_size()`
- @throw std::out_of_range `index > size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert(
- size_type index,
- const basic_static_string<M, CharT, Traits>& str)
- {
- return insert_unchecked(index, str.data(), str.size());
- }
- #ifndef BOOST_STATIC_STRING_DOCS
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert(
- size_type index,
- const basic_static_string& str)
- {
- return insert(index, str.data(), str.size());
- }
- #endif
- /** Insert into the string.
- Inserts a string, obtained by `str.substr(index_str, count)`
- at the position `index`.
- @par Exception Safety
- Strong guarantee.
- @note The insertion is done unchecked when
- the capacity of `str` differs from that of the
- string the function is called on.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam M The size of the input string.
- @return `*this`
- @param index The index to insert at.
- @param str The string from which to insert.
- @param index_str The index in `str` to start inserting from.
- @param count The number of characters to insert.
- The default argument for this parameter is @ref npos.
- @throw std::length_error `size() + str.substr(index_str, count).size() > max_size()`
- @throw std::out_of_range `index > size()`
- @throw std::out_of_range `index_str > str.size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert(
- size_type index,
- const basic_static_string<M, CharT, Traits>& str,
- size_type index_str,
- size_type count = npos)
- {
- return insert_unchecked(index, str.data() + index_str, str.capped_length(index_str, count));
- }
- #ifndef BOOST_STATIC_STRING_DOCS
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert(
- size_type index,
- const basic_static_string& str,
- size_type index_str,
- size_type count = npos)
- {
- return insert(index, str.data() + index_str, str.capped_length(index_str, count));
- }
- #endif
- /** Insert into the string.
- Inserts the character `ch` before the character pointed by `pos`.
- @par Precondition
- `pos` shall be vaild within `{data(), data() + size()}`
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return An iterator which refers to the first inserted character
- or `pos` if no characters were inserted
- @param pos The index to insert at.
- @param ch The character to insert.
- @throw std::length_error `size() + 1 > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- iterator
- insert(
- const_iterator pos,
- value_type ch)
- {
- return insert(pos, 1, ch);
- }
- /** Insert into the string.
- Inserts `count` copies of `ch` before the character pointed by `pos`.
- @par Precondition
- `pos` shall be valid within `{data(), data() + size()}`
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return An iterator which refers to the first inserted character
- or `pos` if no characters were inserted
- @param pos The position to insert at.
- @param count The number of characters to insert.
- @param ch The character to insert.
- @throw std::length_error `size() + count > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- iterator
- insert(
- const_iterator pos,
- size_type count,
- value_type ch);
- /** Insert into the string.
- Inserts characters from the range `{first, last)` before the
- character pointed to by `pos`.
- @par Precondition
- `pos` shall be valid within `{data(), data() + size()}`,
- `{first, last)` shall be a valid range
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam InputIterator The type of the iterators.
- @par Constraints
- `InputIterator` satisfies __InputIterator__ and does not
- satisfy __ForwardIterator__.
- @return An iterator which refers to the first inserted character
- or `pos` if no characters were inserted
- @param pos The position to insert at.
- @param first An iterator representing the first character to insert.
- @param last An iterator representing one past the last character to insert.
- @throw std::length_error `size() + insert_count > max_size()`
- */
- template<typename InputIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- #ifdef BOOST_STATIC_STRING_DOCS
- iterator
- #else
- typename std::enable_if<
- detail::is_input_iterator<
- InputIterator>::value &&
- !detail::is_forward_iterator<
- InputIterator>::value, iterator>::type
- #endif
- insert(
- const_iterator pos,
- InputIterator first,
- InputIterator last);
- #ifndef BOOST_STATIC_STRING_DOCS
- template<typename ForwardIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- typename std::enable_if<
- detail::is_forward_iterator<
- ForwardIterator>::value,
- iterator>::type
- insert(
- const_iterator pos,
- ForwardIterator first,
- ForwardIterator last);
- #endif
- /** Insert into the string.
- Inserts characters from `ilist` before `pos`.
- @par Precondition
- `pos` shall be valid within `{data(), data() + size()}`
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return An iterator which refers to the first inserted character
- or `pos` if no characters were inserted
- @param pos The position to insert at.
- @param ilist The initializer list from which to insert.
- @throw std::length_error `size() + ilist.size() > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- iterator
- insert(
- const_iterator pos,
- std::initializer_list<value_type> ilist)
- {
- return insert_unchecked(pos, ilist.begin(), ilist.size());
- }
- /** Insert into the string.
- Constructs a temporary `string_view_type` object `sv` from `t` and
- inserts `{sv.begin(), sv.end())` at `index`.
- @par Precondition
- `index` shall be valid within `{data(), data() + size()}`
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @param index The index to insert at.
- @param t The string to insert from.
- @throw std::length_error `size() + sv.size() > max_size()`
- @throw std::out_of_range `index > size()`
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert(
- size_type index,
- const T& t)
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return insert(index, sv.data(), sv.size());
- }
- /** Insert into the string.
- Constructs a temporary `string_view_type` object `sv` from `t`
- and inserts `sv.substr(index_str, count)` at `index`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const_pointer>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return `*this`
- @param index The index to insert at.
- @param t The string to insert from.
- @param index_str The index in the temporary `string_view_type` object
- to start the substring from.
- @param count The number of characters to insert.
- @throw std::length_error `size() + sv.size() > max_size()`
- @throw std::out_of_range `index > size()`
- @throw std::out_of_range `index_str > sv.size()`
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert(
- size_type index,
- const T& t,
- size_type index_str,
- size_type count = npos)
- {
- detail::common_string_view_type<T, CharT, Traits> sv(t);
- if ( index_str > sv.size() )
- detail::throw_exception<std::out_of_range>("index_str > t.size()");
- return insert(index, sv.data() + index_str, (std::min)(sv.size() - index_str, count));
- }
- /** Erase from the string.
- Erases `num` characters from the string, starting at `index`.
- `num` is determined as the smaller of `count` and `size() - index`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param index The index to erase at.
- The default argument for this parameter is `0`.
- @param count The number of characters to erase.
- The default argument for this parameter is @ref npos.
- @throw std::out_of_range `index > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- erase(
- size_type index = 0,
- size_type count = npos)
- {
- erase(data() + index, data() + index + capped_length(index, count));
- return *this;
- }
- /** Erase from the string.
- Erases the character at `pos`.
- @par Preconditions
- `pos` shall be valid within `{data(), data() + size()}`
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return An iterator referring to character immediately following
- the erased character, or @ref end() if one does not exist.
- @param pos An iterator referring to the character to erase.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- iterator
- erase(const_iterator pos)
- {
- BOOST_STATIC_STRING_ASSERT(!empty());
- return erase(pos, pos + 1);
- }
- /** Erase from the string.
- Erases the characters in the range `{first, last)`.
- @par Precondition
- `{first, last}` shall be valid within `{data(), data() + size()}`
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return An iterator referring to the character `last`
- previously referred to, or @ref end() if one does not exist.
- @param first An iterator referring to the first character to erase.
- @param last An iterator past the last character to erase.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- iterator
- erase(
- const_iterator first,
- const_iterator last);
- /** Append a character.
- Appends a character to the end of the string.
- @par Exception Safety
- Strong guarantee.
- @param ch The character to append.
- @throw std::length_error `size() >= max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- push_back(value_type ch);
- /** Remove the last character.
- Removes a character from the end of the string.
- @par Precondition
- `not empty()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- pop_back() noexcept
- {
- BOOST_STATIC_STRING_ASSERT(!empty());
- this->set_size(size() - 1);
- term();
- }
- /** Append to the string.
- Appends `count` copies of `ch` to the end of the string.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param count The number of characters to append.
- @param ch The character to append.
- @throw std::length_error `size() + count > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- append(
- size_type count,
- value_type ch);
- /** Append to the string.
- Appends `s` to the end of the string.
- @par Exception Safety
- Strong guarantee.
- @tparam M The size of the string to append.
- @return `*this`
- @param s The string to append.
- @throw std::length_error `size() + s.size() > max_size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- append(
- const basic_static_string<M, CharT, Traits>& s)
- {
- return append(s.data(), s.size());
- }
- /** Append to the string.
- Appends the substring `sub` to the end of the string,
- where `sub` is `s.substr(pos, count)`.
- @par Exception Safety
- Strong guarantee.
- @tparam M The size of the string to append.
- @return `*this`
- @param s The string to append.
- @param pos The index at which to begin the substring.
- @param count The size of the substring. The default
- argument for this parameter is @ref npos.
- @throw std::length_error `size() + sub.size() > max_size()`
- @throw std::out_of_range `pos > s.size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- append(
- const basic_static_string<M, CharT, Traits>& s,
- size_type pos,
- size_type count = npos)
- {
- return append(s.data() + pos, s.capped_length(pos, count));
- }
- /** Append to the string.
- Appends `count` characters from the string pointed
- to by `s` to the end of the string.
- @par Exception Safety
- Strong guarantee.
- @note The string can contain null characters.
- @return `*this`
- @param s The string to append.
- @param count The number of characters to append.
- @throw std::length_error `size() + count > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- append(
- const_pointer s,
- size_type count);
- /** Append to the string.
- Appends `count` characters from the string pointed
- to by `s` to the end of the string, where `count`
- is `traits_type::length(s)`.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param s The string to append.
- @throw std::length_error `size() + count > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- append(const_pointer s)
- {
- return append(s, traits_type::length(s));
- }
- // KRYSTIAN TODO: change exception safety
- /** Append to the string.
- Appends characters from the range `{first, last)`
- to the end of the string.
- @par Precondition
- `{first, last)` shall be a valid range
- @par Exception Safety
- Strong guarantee.
- @tparam InputIterator The type of the iterators.
- @par Constraints
- `InputIterator` satisfies __InputIterator__.
- @return `*this`
- @param first An iterator referring to the
- first character to append.
- @param last An iterator past the end of
- last character to append.
- @throw std::length_error `size() + std::distance(first, last) > max_size()`
- */
- template<typename InputIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- #ifdef BOOST_STATIC_STRING_DOCS
- basic_static_string&
- #else
- typename std::enable_if<
- detail::is_input_iterator<InputIterator>::value,
- basic_static_string&>::type
- #endif
- append(
- InputIterator first,
- InputIterator last)
- {
- this->set_size(size() + read_back(true, first, last));
- return term();
- }
- /** Append to the string.
- Appends the characters from `ilist` to the
- end of the string.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param ilist The initializer list to append.
- @throw std::length_error `size() + ilist.size() > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- append(
- std::initializer_list<value_type> ilist)
- {
- return append(ilist.begin(), ilist.size());
- }
- /** Append to the string.
- Appends `sv` to the end of the string,
- where `sv` is `string_view_type(t)`.
- @par Exception Safety
- Strong guarantee.
- @tparam T The type of the object to convert.
- @par Constraints
- @code
- std::is_convertible<T const&, string_view>::value &&
- !std::is_convertible<T const&, char const*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value
- @endcode
- @return `*this`
- @param t The string to append.
- @throw std::length_error `size() + sv.size() > max_size()`
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- append(const T& t)
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return append(sv.data(), sv.size());
- }
- /** Append to the string.
- Appends the substring `sv` to the end of the string,
- where `sv` is `string_view_type(t).substr(pos, count)`.
- @par Exception Safety
- Strong guarantee.
- @tparam T The type of the object to convert.
- @par Constraints
- @code
- std::is_convertible<T const&, string_view>::value &&
- !std::is_convertible<T const&, char const*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value
- @endcode
- @return `*this`
- @param t The object to append.
- @param pos The index at which to begin the substring.
- @param count The size of the substring. The default
- argument for this parameter is @ref npos.
- @throw std::length_error `size() + sv.size() > max_size()`
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- append(
- const T& t,
- size_type pos,
- size_type count = npos)
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- if ( pos > sv.size() )
- detail::throw_exception<std::out_of_range>("pos > t.size()");
- return append(sv.data() + pos, (std::min)(sv.size() - pos, count));
- }
- /** Append to the string.
- Appends `s` to the end of the string.
- @par Exception Safety
- Strong guarantee.
- @tparam M The size of the string to append.
- @return `*this`
- @param s The string to append.
- @throw std::length_error `size() + s.size() > max_size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator+=(
- const basic_static_string<M, CharT, Traits>& s)
- {
- return append(s);
- }
- /** Append to the string.
- Appends a character to the end of the string.
- @par Exception Safety
- Strong guarantee.
- @param ch The character to append.
- @throw std::length_error `size() >= max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator+=(value_type ch)
- {
- push_back(ch);
- return *this;
- }
- /** Append to the string.
- Appends `count` characters from the string pointed
- to by `s` to the end of the string, where `count`
- is `traits_type::length(s)`.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param s The string to append.
- @throw std::length_error `size() + count > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator+=(const_pointer s)
- {
- return append(s);
- }
- /** Append to the string.
- Appends the characters from `ilist` to the
- end of the string.
- @par Exception Safety
- Strong guarantee.
- @return `*this`
- @param ilist The initializer list to append.
- @throw std::length_error `size() + ilist.size() > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator+=(
- std::initializer_list<value_type> ilist)
- {
- return append(ilist);
- }
- /** Append to the string.
- Appends `sv` to the end of the string,
- where `sv` is `string_view_type(t)`.
- @par Exception Safety
- Strong guarantee.
- @tparam T The type of the object to convert.
- @par Constraints
- @code
- std::is_convertible<T const&, string_view>::value &&
- !std::is_convertible<T const&, char const*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value
- @endcode
- @return `*this`
- @param t The string to append.
- @throw std::length_error `size() + sv.size() > max_size()`
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- operator+=(const T& t)
- {
- return append(t);
- }
- /** Compare a string with the string.
- Let `comp` be `traits_type::compare(data(), s.data(), std::min(size(), s.size())`.
- If `comp != 0`, then the result is `comp`. Otherwise, the result is
- `0` if `size() == s.size()`, `-1` if `size() < s.size()`, and `1`
- otherwise.
- @par Complexity
- Linear.
- @return The result of lexicographically comparing `s` and the string.
- @tparam M The size of the string to compare with.
- @param s The string to compare.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- int
- compare(
- const basic_static_string<M, CharT, Traits>& s) const noexcept
- {
- return detail::lexicographical_compare<CharT, Traits>(
- data(), size(), s.data(), s.size());
- }
- /** Compare a string with the string.
- Let `sub` be `substr(pos1, count1)` and `comp` be
- `traits_type::compare(sub.data(), s.data(), std::min(sub.size(), s.size())`.
- If `comp != 0`, then the result is `comp`. Otherwise, the result is
- `0` if `sub.size() == s.size()`, `-1` if `sub.size() < s.size()`, and `1`
- otherwise.
- @par Complexity
- Linear.
- @par Exception Safety
- Strong guarantee.
- @return The result of lexicographically comparing `sub` and `s`.
- @tparam M The size of the string to compare with.
- @param pos1 The index at which to begin the substring.
- @param count1 The size of the substring.
- @param s The string to compare.
- @throw std::out_of_range `pos1 > size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- int
- compare(
- size_type pos1,
- size_type count1,
- const basic_static_string<M, CharT, Traits>& s) const
- {
- return detail::lexicographical_compare<CharT, Traits>(
- data() + pos1, capped_length(pos1, count1), s.data(), s.size());
- }
- /** Compare a string with the string.
- Let `sub1` be `substr(pos1, count1)`, `sub2` be
- `s.substr(pos2, count2)`, and `comp` be
- `traits_type::compare(sub1.data(), sub2.data(), std::min(sub1.size(), sub2.size())`.
- If `comp != 0`, then the result is `comp`. Otherwise, the result is
- `0` if `sub1.size() == sub2.size()`, `-1` if `sub1.size() < sub2.size()`, and `1`
- otherwise.
- @par Complexity
- Linear.
- @par Exception Safety
- Strong guarantee.
- @return The result of lexicographically comparing `sub1` and `sub2`.
- @param pos1 The index at which to begin the substring.
- @param count1 The size of the substring.
- @param s The string to compare.
- @param pos2 The index at which to begin the substring to compare.
- @param count2 The size of the substring to compare.
- @throw std::out_of_range `pos1 > size()`
- @throw std::out_of_range `pos2 > s.size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- int
- compare(
- size_type pos1,
- size_type count1,
- const basic_static_string<M, CharT, Traits>& s,
- size_type pos2,
- size_type count2 = npos) const
- {
- return detail::lexicographical_compare<CharT, Traits>(
- data() + pos1, capped_length(pos1, count1),
- s.data() + pos2, s.capped_length(pos2, count2));
- }
- /** Compare a string with the string.
- Let `len` be `traits_type::length(s)` and `comp` be
- `traits_type::compare(data(), s, std::min(size(), len)`.
- If `comp != 0`, then the result is `comp`. Otherwise, the result is
- `0` if `size() == len`, `-1` if `size() < len`, and `1`
- otherwise.
- @par Complexity
- Linear.
- @return The result of lexicographically comparing `s` and the string.
- @param s The string to compare.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- int
- compare(const_pointer s) const noexcept
- {
- return detail::lexicographical_compare<CharT, Traits>(
- data(), size(), s, traits_type::length(s));
- }
- /** Compare a string with the string.
- Let `sub` be `substr(pos1, count1)`, `len` be
- `traits_type::length(s)`, and `comp` be
- `traits_type::compare(sub.data(), s, std::min(size(), len)`.
- If `comp != 0`, then the result is `comp`. Otherwise, the result is
- `0` if `sub.size() == len`, `-1` if `sub.size() < len`, and `1`
- otherwise.
- @par Complexity
- Linear.
- @par Exception Safety
- Strong guarantee.
- @return The result of lexicographically comparing `s` and `sub`.
- @param pos1 The index at which to begin the substring.
- @param count1 The size of the substring.
- @param s The string to compare.
- @throw std::out_of_range `pos1 > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- int
- compare(
- size_type pos1,
- size_type count1,
- const_pointer s) const
- {
- return detail::lexicographical_compare<CharT, Traits>(
- data() + pos1, capped_length(pos1, count1), s, traits_type::length(s));
- }
- /** Compare a string with the string.
- Let `sub` be `substr(pos1, count1)`, and `comp` be
- `traits_type::compare(sub.data(), s, std::min(size(), count2)`.
- If `comp != 0`, then the result is `comp`. Otherwise, the result is
- `0` if `sub.size() == count2`, `-1` if `sub.size() < count2`, and `1`
- otherwise.
- @par Complexity
- Linear.
- @par Exception Safety
- Strong guarantee.
- @return The result of lexicographically comparing `s` and `sub`.
- @param pos1 The index at which to begin the substring.
- @param count1 The size of the substring.
- @param s The string to compare.
- @param count2 The length of the string to compare.
- @throw std::out_of_range `pos1 > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- int
- compare(
- size_type pos1,
- size_type count1,
- const_pointer s,
- size_type count2) const
- {
- return detail::lexicographical_compare<CharT, Traits>(
- data() + pos1, capped_length(pos1, count1), s, count2);
- }
- /** Compare a string with the string.
- Let `s` be `string_view_type(t)` and `comp` be
- `traits_type::compare(data(), s.data(), std::min(size(), s.size())`.
- If `comp != 0`, then the result is `comp`. Otherwise, the result is
- `0` if `size() == s.size()`, `-1` if `size() < s.size()`, and `1`
- otherwise.
- @par Complexity
- Linear.
- @par Exception Safety
- Strong guarantee.
- @tparam T The type of the object to convert.
- @par Constraints
- @code
- std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const_pointer>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value.
- @endcode
- @return The result of lexicographically comparing `s` and the string.
- @param t The string to compare.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- int
- compare(const T& t) const noexcept
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return detail::lexicographical_compare<CharT, Traits>(
- data(), size(), sv.data(), sv.size());
- }
- /** Compare a string with the string.
- Let `s` be `string_view_type(t)`, `sub` be
- `substr(pos1, count1)`, and `comp` be
- `traits_type::compare(sub.data(), s.data(), std::min(sub.size(), s.size())`.
- If `comp != 0`, then the result is `comp`. Otherwise, the result is
- `0` if `sub.size() == s.size()`, `-1` if `sub.size() < s.size()`, and `1`
- otherwise.
- @par Complexity
- Linear.
- @par Exception Safety
- Strong guarantee.
- @tparam T The type of the object to convert.
- @par Constraints
- @code
- std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const_pointer>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value.
- @endcode
- @return The result of lexicographically comparing `s` and `sub`.
- @param pos1 The index at which to begin the substring.
- @param count1 The length of the substring.
- @param t The string to compare.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- int
- compare(
- size_type pos1,
- size_type count1,
- const T& t) const
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return detail::lexicographical_compare<CharT, Traits>(
- data() + pos1, capped_length(pos1, count1), sv.data(), sv.size());
- }
- /** Compare a string with the string.
- Let `sub1` be `substr(pos1, count1)`, `sub2` be
- `string_view_type(t).substr(pos2, count2)`, and `comp` be
- `traits_type::compare(sub1.data(), sub2.data(), std::min(sub1.size(), sub2.size())`.
- If `comp != 0`, then the result is `comp`. Otherwise, the result is
- `0` if `sub1.size() == sub2.size()`, `-1` if `sub1.size() < sub2.size()`, and `1`
- otherwise.
- @par Complexity
- Linear.
- @par Exception Safety
- Strong guarantee.
- @tparam T The type of the object to convert.
- @par Constraints
- @code
- std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const_pointer>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value.
- @endcode
- @return The result of lexicographically comparing `sub1` and `sub2`.
- @param pos1 The index at which to begin the substring in the string.
- @param count1 The length of the substring in the string.
- @param t The string to compare.
- @param pos2 The index at which to begin the substring in the string view.
- @param count2 The length of the substring in the string view.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- int
- compare(
- size_type pos1,
- size_type count1,
- const T& t,
- size_type pos2,
- size_type count2 = npos) const
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- if ( pos2 > sv.size())
- detail::throw_exception<std::out_of_range>("pos2 > sv.size()");
- return compare(
- pos1, count1, sv.data() + pos2,
- (std::min)(sv.size() - pos2, count2));
- }
- /** Return a substring.
- Returns a substring of the string.
- @par Exception Safety
- Strong guarantee.
- @return A string object containing the characters
- `{data() + pos, std::min(count, size() - pos))`.
- @param pos The index to being the substring at. The
- default arugment for this parameter is `0`.
- @param count The length of the substring. The default arugment
- for this parameter is @ref npos.
- @throw std::out_of_range `pos > size()`
- */
- #ifndef BOOST_STATIC_STRING_GCC5_BAD_CONSTEXPR
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- #endif
- basic_static_string
- substr(
- size_type pos = 0,
- size_type count = npos) const
- {
- return basic_static_string(
- data() + pos, capped_length(pos, count));
- }
- #ifdef BOOST_STATIC_STRING_HAS_ANY_STRING_VIEW
- /** Return a string view of a substring.
- Returns a view of a substring.
- @par Exception Safety
- Strong guarantee.
- @return A `string_view_type` object referring
- to `{data() + pos, std::min(count, size() - pos))`.
- @param pos The index to being the substring at. The
- default arugment for this parameter is `0`.
- @param count The length of the substring. The default arugment
- for this parameter is @ref npos.
- @throw std::out_of_range `pos > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- string_view_type
- subview(
- size_type pos = 0,
- size_type count = npos) const
- {
- return string_view_type(
- data() + pos, capped_length(pos, count));
- }
- #endif
- /** Copy a substring to another string.
- Copies `std::min(count, size() - pos)` characters starting at
- index `pos` to the string pointed to by `dest`.
- @note The resulting string is not null terminated.
- @return The number of characters copied.
- @param count The number of characters to copy.
- @param dest The string to copy to.
- @param pos The index to begin copying from. The
- default argument for this parameter is `0`.
- @throw std::out_of_range `pos > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- copy(
- pointer dest,
- size_type count,
- size_type pos = 0) const
- {
- const auto num_copied = capped_length(pos, count);
- traits_type::copy(dest, data() + pos, num_copied);
- return num_copied;
- }
- /** Change the size of the string.
- Resizes the string to contain `n` characters. If
- `n > size()`, characters with the value `CharT()` are
- appended. Otherwise, `size()` is reduced to `n`.
- @param n The size to resize the string to.
- @throw std::out_of_range `n > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- resize(size_type n)
- {
- resize(n, value_type());
- }
- /** Change the size of the string.
- Resizes the string to contain `n` characters. If
- `n > size()`, copies of `c` are
- appended. Otherwise, `size()` is reduced to `n`.
- @param n The size to resize the string to.
- @param c The characters to append if the size
- increases.
- @throw std::out_of_range `n > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- resize(
- size_type n,
- value_type c);
- /** Swap two strings.
- Swaps the contents of the string and `s`.
- @par Exception Safety
- Strong guarantee.
- @note
- All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @param s The string to swap with.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- swap(basic_static_string& s) noexcept;
- /** Swap two strings.
- Swaps the contents of the string and `s`.
- @par Exception Safety
- Strong guarantee.
- @note
- All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam M The size of the string to swap with.
- @param s The string to swap with.
- @throw std::length_error `s.size() > max_size() || size() > s.max_size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- swap(basic_static_string<M, CharT, Traits>& s);
- /** Replace a part of the string.
- Replaces `rcount` characters starting at index `pos1` with those
- of `str`, where `rcount` is `std::min(n1, size() - pos1)`.
- @par Exception Safety
- Strong guarantee.
- @note The replacement is done unchecked when
- the capacity of `str` differs from that of the
- string the function is called on.
- All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam M The size of the input string.
- @return `*this`
- @param pos1 The index to replace at.
- @param n1 The number of characters to replace.
- @param str The string to replace with.
- @throw std::length_error `size() + (str.size() - rcount) > max_size()`
- @throw std::out_of_range `pos1 > size()`
- */
- template<size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- size_type pos1,
- size_type n1,
- const basic_static_string<M, CharT, Traits>& str)
- {
- return replace_unchecked(pos1, n1, str.data(), str.size());
- }
- #ifndef BOOST_STATIC_STRING_DOCS
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- size_type pos1,
- size_type n1,
- const basic_static_string& str)
- {
- return replace(pos1, n1, str.data(), str.size());
- }
- #endif
- /** Replace a part of the string.
- Replaces `rcount` characters starting at index `pos1` with those of
- `str.subview(pos2, n2)`, where `rcount` is `std::min(n1, size() - pos1)`.
- @par Exception Safety
- Strong guarantee.
- @note The replacement is done unchecked when
- the capacity of `str` differs from that of the
- string the function is called on.
- All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param pos1 The index to replace at.
- @param n1 The number of characters to replace.
- @param str The string to replace with.
- @param pos2 The index to begin the substring.
- @param n2 The length of the substring.
- The default argument for this parameter is @ref npos.
- @throw std::length_error `size() + (std::min(str.size(), n2) - rcount) > max_size()`
- @throw std::out_of_range `pos1 > size()`
- @throw std::out_of_range `pos2 > str.size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- size_type pos1,
- size_type n1,
- const basic_static_string<M, CharT, Traits>& str,
- size_type pos2,
- size_type n2 = npos)
- {
- return replace_unchecked(pos1, n1, str.data() + pos2, str.capped_length(pos2, n2));
- }
- #ifndef BOOST_STATIC_STRING_DOCS
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- size_type pos1,
- size_type n1,
- const basic_static_string& str,
- size_type pos2,
- size_type n2 = npos)
- {
- return replace(pos1, n1, str.data() + pos2, str.capped_length(pos2, n2));
- }
- #endif
- /** Replace a part of the string.
- Constructs a temporary `string_view_type` object `sv` from `t`, and
- replaces `rcount` characters starting at index `pos1` with those
- of `sv`, where `rcount` is `std::min(n1, size() - pos1)`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return `*this`
- @param pos1 The index to replace at.
- @param n1 The number of characters to replace.
- @param t The object to replace with.
- @throw std::length_error `size() + (sv.size() - rcount) > max_size()`
- @throw std::out_of_range `pos1 > size()`
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- size_type pos1,
- size_type n1,
- const T& t)
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return replace(pos1, n1, sv.data(), sv.size());
- }
- /** Replace a part of the string.
- Constructs a temporary `string_view_type` object `sv` from `t`, and
- replaces `rcount` characters starting at index `pos1` with those
- of `sv.substr(pos2, n2)`, where `rcount` is `std::min(n1, size() - pos)`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return `*this`
- @param pos1 The index to replace at.
- @param n1 The number of characters to replace.
- @param t The object to replace with.
- @param pos2 The index to begin the substring.
- @param n2 The length of the substring.
- The default argument for this parameter is @ref npos.
- @throw std::length_error `size() + (std::min(n2, sv.size()) - rcount) > max_size()`
- @throw std::out_of_range `pos1 > size()`
- @throw std::out_of_range `pos2 > sv.size()`
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- size_type pos1,
- size_type n1,
- const T& t,
- size_type pos2,
- size_type n2 = npos)
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- if ( pos2 > sv.size())
- detail::throw_exception<std::out_of_range>("pos2 > t.size()");
- return replace(
- pos1, n1, sv.data() + pos2,
- (std::min)(sv.size() - pos2, n2));
- }
- /** Replace a part of the string.
- Replaces `rcount` characters starting at index `pos` with those of
- `{s, s + n2)`, where `rcount` is `std::min(n1, size() - pos)`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param pos The index to replace at.
- @param n1 The number of characters to replace.
- @param s The string to replace with.
- @param n2 The length of the string to replace with.
- @throw std::length_error `size() + (n2 - rcount) > max_size()`
- @throw std::out_of_range `pos > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- size_type pos,
- size_type n1,
- const_pointer s,
- size_type n2)
- {
- return replace(data() + pos, data() + pos + capped_length(pos, n1), s, n2);
- }
- /** Replace a part of the string.
- Replaces `rcount` characters starting at index `pos` with those of
- `{s, s + len)`, where the length of the string `len` is `traits_type::length(s)` and `rcount`
- is `std::min(n1, size() - pos)`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param pos The index to replace at.
- @param n1 The number of characters to replace.
- @param s The string to replace with.
- @throw std::length_error `size() + (len - rcount) > max_size()`
- @throw std::out_of_range `pos > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- size_type pos,
- size_type n1,
- const_pointer s)
- {
- return replace(pos, n1, s, traits_type::length(s));
- }
- /** Replace a part of the string.
- Replaces `rcount` characters starting at index `pos` with `n2` copies
- of `c`, where `rcount` is `std::min(n1, size() - pos)`.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param pos The index to replace at.
- @param n1 The number of characters to replace.
- @param n2 The number of characters to replace with.
- @param c The character to replace with.
- @throw std::length_error `size() + (n2 - rcount) > max_size()`
- @throw std::out_of_range `pos > size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- size_type pos,
- size_type n1,
- size_type n2,
- value_type c)
- {
- return replace(data() + pos, data() + pos + capped_length(pos, n1), n2, c);
- }
- /** Replace a part of the string.
- Replaces the characters in the range `{i1, i2)`
- with those of `str`.
- @par Precondition
- `{i1, i2)` is a valid range.
- @par Exception Safety
- Strong guarantee.
- @note The replacement is done unchecked when
- the capacity of `str` differs from that of the
- string the function is called on.
- All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam M The size of the input string.
- @return `*this`
- @param i1 An iterator referring to the first character to replace.
- @param i2 An iterator referring past the end of
- the last character to replace.
- @param str The string to replace with.
- @throw std::length_error `size() + (str.size() - std::distance(i1, i2)) > max_size()`
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- const_iterator i1,
- const_iterator i2,
- const basic_static_string<M, CharT, Traits>& str)
- {
- return replace_unchecked(i1, i2, str.data(), str.size());
- }
- #ifndef BOOST_STATIC_STRING_DOCS
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- const_iterator i1,
- const_iterator i2,
- const basic_static_string& str)
- {
- return replace(i1, i2, str.data(), str.size());
- }
- #endif
- /** Replace a part of the string.
- Constructs a temporary `string_view_type` object `sv` from `t`, and
- replaces the characters in the range `{i1, i2)` with those
- of `sv`.
- @par Precondition
- `{i1, i2)` is a valid range.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return `*this`
- @param i1 An iterator referring to the first character to replace.
- @param i2 An iterator referring past the end of
- the last character to replace.
- @param t The object to replace with.
- @throw std::length_error `size() + (sv.size() - std::distance(i1, i2)) > max_size()`
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- const_iterator i1,
- const_iterator i2,
- const T& t)
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return replace(i1, i2, sv.data(), sv.data() + sv.size());
- }
- /** Replace a part of the string.
- Replaces the characters in the range `{i1, i2)` with those of
- `{s, s + n)`.
- @par Precondition
- `{i1, i2)` is a valid range.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param i1 An iterator referring to the first character to replace.
- @param i2 An iterator referring past the end of
- the last character to replace.
- @param s The string to replace with.
- @param n The length of the string to replace with.
- @throw std::length_error `size() + (n - std::distance(i1, i2)) > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- const_iterator i1,
- const_iterator i2,
- const_pointer s,
- size_type n)
- {
- return replace(i1, i2, s, s + n);
- }
- /** Replace a part of the string.
- Replaces the characters in the range `{i1, i2)` with those of
- `{s, s + len)`, where the length of the string `len` is `traits_type::length(s)`.
- @par Precondition
- `{i1, i2)` shall be a valid range.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param i1 An iterator referring to the first character to replace.
- @param i2 An iterator referring past the end of
- the last character to replace.
- @param s The string to replace with.
- @throw std::length_error `size() + (len - std::distance(i1, i2)) > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- const_iterator i1,
- const_iterator i2,
- const_pointer s)
- {
- return replace(i1, i2, s, traits_type::length(s));
- }
- /** Replace a part of the string.
- Replaces the characters in the range `{i1, i2)` with
- `n` copies of `c`.
- @par Precondition
- `{i1, i2)` is a valid range.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param i1 An iterator referring to the first character to replace.
- @param i2 An iterator past the end of
- the last character to replace.
- @param n The number of characters to replace with.
- @param c The character to replace with.
- @throw std::length_error `size() + (n - std::distance(i1, i2)) > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- const_iterator i1,
- const_iterator i2,
- size_type n,
- value_type c);
- /** Replace a part of the string.
- Replaces the characters in the range `{i1, i2)`
- with those of `{j1, j2)`.
- @par Precondition
- `{i1, i2)` is a valid range.
- `{j1, j2)` is a valid range.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @tparam InputIterator The type of the iterators.
- @par Constraints
- `InputIterator` satisfies __InputIterator__ and does not
- satisfy __ForwardIterator__.
- @return `*this`
- @param i1 An iterator referring to the first character to replace.
- @param i2 An iterator referring past the end of
- the last character to replace.
- @param j1 An iterator referring to the first character to replace with.
- @param j2 An iterator referring past the end of
- the last character to replace with.
- @throw std::length_error `size() + (inserted - std::distance(i1, i2)) > max_size()`
- */
- template<typename InputIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- #ifdef BOOST_STATIC_STRING_DOCS
- basic_static_string&
- #else
- typename std::enable_if<
- detail::is_input_iterator<
- InputIterator>::value &&
- !detail::is_forward_iterator<
- InputIterator>::value,
- basic_static_string<N, CharT, Traits>&>::type
- #endif
- replace(
- const_iterator i1,
- const_iterator i2,
- InputIterator j1,
- InputIterator j2);
- #ifndef BOOST_STATIC_STRING_DOCS
- template<typename ForwardIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- typename std::enable_if<
- detail::is_forward_iterator<
- ForwardIterator>::value,
- basic_static_string<N, CharT, Traits>&>::type
- replace(
- const_iterator i1,
- const_iterator i2,
- ForwardIterator j1,
- ForwardIterator j2);
- #endif
- /** Replace a part of the string.
- Replaces the characters in the range `{i1, i2)`
- with those of contained in the initializer list `il`.
- @par Precondition
- `{i1, i2)` is a valid range.
- @par Exception Safety
- Strong guarantee.
- @note All references, pointers, or iterators
- referring to contained elements are invalidated. Any
- past-the-end iterators are also invalidated.
- @return `*this`
- @param i1 An iterator referring to the first character to replace.
- @param i2 An iterator past the end of
- the last character to replace.
- @param il The initializer list to replace with.
- @throw std::length_error `size() + (il.size() - std::distance(i1, i2)) > max_size()`
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace(
- const_iterator i1,
- const_iterator i2,
- std::initializer_list<value_type> il)
- {
- return replace_unchecked(i1, i2, il.begin(), il.size());
- }
- //--------------------------------------------------------------------------
- //
- // Search
- //
- //--------------------------------------------------------------------------
- /** Find the first occurrence of a string within the string.
- Constructs a temporary `string_view_type` object `sv` from `t`, and finds
- the first occurrence of `sv` within the string starting at the index `pos`.
- @par Complexity
- Linear.
- @note An empty string is always found.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return The lowest index `idx` greater than or equal to `pos`
- where each element of `{sv.begin(), sv.end())` is equal to
- that of `{begin() + idx, begin() + idx + count)` if one exists,
- and @ref npos otherwise.
- @param t The string to search for.
- @param pos The index to start searching at. The default argument
- for this parameter is `0`.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find(
- const T& t,
- size_type pos = 0) const
- #ifdef BOOST_STATIC_STRING_DOCS
- noexcept(detail::is_nothrow_convertible<const T&, string_view_type>::value)
- #else
- noexcept(detail::is_nothrow_convertible<const T&, detail::common_string_view_type<T, CharT, Traits>>::value)
- #endif
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return find(sv.data(), pos, sv.size());
- }
- /** Find the first occurrence of a string within the string.
- Finds the first occurrence of `str` within the
- string starting at the index `pos`.
- @par Complexity
- Linear.
- @return The lowest index `idx` greater than or equal to `pos`
- where each element of `str` is equal to that of
- `{begin() + idx, begin() + idx + str.size())`
- if one exists, and @ref npos otherwise.
- @param str The string to search for.
- @param pos The index to start searching at. The default argument for
- this parameter is `0`.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find(
- const basic_static_string<M, CharT, Traits>& str,
- size_type pos = 0) const noexcept
- {
- return find(str.data(), pos, str.size());
- }
- /** Find the first occurrence of a string within the string.
- Finds the first occurrence of the string pointed to
- by `s` within the string starting at the index `pos`.
- @par Complexity
- Linear.
- @note An empty string is always found.
- @return The lowest index `idx` greater than or equal to `pos`
- where each element of `{s, s + n)` is equal to that of
- `{begin() + idx, begin() + idx + n)` if one exists,
- and @ref npos otherwise.
- @param s The string to search for.
- @param pos The index to start searching at.
- @param n The length of the string to search for.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept;
- /** Find the first occurrence of a string within the string.
- Finds the first occurrence of the string pointed to by `s`
- of length `count` within the string starting at the index `pos`,
- where `count` is `traits_type::length(s)`.
- @par Complexity
- Linear.
- @note An empty string is always found.
- @return The lowest index `idx` greater than or equal to `pos`
- where each element of `{s, s + count)` is equal to that of
- `{begin() + idx, begin() + idx + count)` if one exists,
- and @ref npos otherwise.
- @param s The string to search for.
- @param pos The index to start searching at. The default argument
- for this parameter is `0`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find(
- const_pointer s,
- size_type pos = 0) const noexcept
- {
- return find(s, pos, traits_type::length(s));
- }
- /** Find the first occurrence of a character within the string.
- Finds the first occurrence of `c` within the string
- starting at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the first occurrence of `c` within
- `{begin() + pos, end())` if it exists, and @ref npos otherwise.
- @param c The character to search for.
- @param pos The index to start searching at. The default argument
- for this parameter is `0`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find(
- value_type c,
- size_type pos = 0) const noexcept
- {
- return find(&c, pos, 1);
- }
- /** Find the last occurrence of a string within the string.
- Constructs a temporary `string_view_type` object `sv` from `t`, and finds
- the last occurrence of `sv` within the string starting before or at
- the index `pos`.
- @par Complexity
- Linear.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return The highest index `idx` less than or equal to `pos`
- where each element of `{sv.begin(), sv.end())` is equal to
- that of `{begin() + idx, begin() + idx + count)` if one exists,
- and @ref npos otherwise.
- @param t The string to search for.
- @param pos The index to start searching at. The default argument
- for this parameter is @ref npos.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- rfind(
- const T& t,
- size_type pos = npos) const
- #ifdef BOOST_STATIC_STRING_DOCS
- noexcept(detail::is_nothrow_convertible<const T&, string_view_type>::value)
- #else
- noexcept(detail::is_nothrow_convertible<const T&, detail::common_string_view_type<T, CharT, Traits>>::value)
- #endif
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return rfind(sv.data(), pos, sv.size());
- }
- /** Find the last occurrence of a string within the string.
- Finds the last occurrence of `str` within the string
- starting before or at the index `pos`.
- @par Complexity
- Linear.
- @return The highest index `idx` less than or equal to `pos`
- where each element of `str` is equal to that
- of `{begin() + idx, begin() + idx + str.size())`
- if one exists, and @ref npos otherwise.
- @param str The string to search for.
- @param pos The index to start searching at. The default argument for
- this parameter is @ref npos.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- rfind(
- const basic_static_string<M, CharT, Traits>& str,
- size_type pos = npos) const noexcept
- {
- return rfind(str.data(), pos, str.size());
- }
- /** Find the last occurrence of a string within the string.
- Finds the last occurrence of the string pointed to
- by `s` within the string starting before or at
- the index `pos`.
- @par Complexity
- Linear.
- @return The highest index `idx` less than or equal to `pos`
- where each element of `{s, s + n)` is equal to that of
- `{begin() + idx, begin() + idx + n)` if one exists,
- and @ref npos otherwise.
- @param s The string to search for.
- @param pos The index to start searching at.
- @param n The length of the string to search for.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- rfind(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept;
- /** Find the last occurrence of a string within the string.
- Finds the last occurrence of the string pointed to by `s`
- of length `count` within the string starting before or at the
- index `pos`, where `count` is `traits_type::length(s)`.
- @par Complexity
- Linear.
- @return The highest index `idx` less than or equal to `pos`
- where each element of `{s, s + count)` is equal to that of
- `{begin() + idx, begin() + idx + count)` if one exists,
- and @ref npos otherwise.
- @param s The string to search for.
- @param pos The index to stop searching at. The default argument
- for this parameter is @ref npos.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- rfind(
- const_pointer s,
- size_type pos = npos) const noexcept
- {
- return rfind(s, pos, traits_type::length(s));
- }
- /** Find the last occurrence of a character within the string.
- Finds the last occurrence of `c` within the string
- starting before or at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the last occurrence of `c` within
- `{begin(), begin() + pos}` if it exists, and @ref npos otherwise.
- @param c The character to search for.
- @param pos The index to stop searching at. The default argument
- for this parameter is @ref npos.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- rfind(
- value_type c,
- size_type pos = npos) const noexcept
- {
- return rfind(&c, pos, 1);
- }
- /** Find the first occurrence of any of the characters within the string.
- Constructs a temporary `string_view_type` object `sv` from `t`, and finds
- the first occurrence of any of the characters in `sv`
- within the string starting at the index `pos`.
- @par Complexity
- Linear.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return The index corrosponding to the first occurrence of
- any of the characters in `{sv.begin(), sv.end())` within
- `{begin() + pos, end())` if it exists, and @ref npos otherwise.
- @param t The characters to search for.
- @param pos The index to start searching at. The default argument
- for this parameter is `0`.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_of(
- const T& t,
- size_type pos = 0) const
- #ifdef BOOST_STATIC_STRING_DOCS
- noexcept(detail::is_nothrow_convertible<const T&, string_view_type>::value)
- #else
- noexcept(detail::is_nothrow_convertible<const T&, detail::common_string_view_type<T, CharT, Traits>>::value)
- #endif
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return find_first_of(sv.data(), pos, sv.size());
- }
- /** Find the first occurrence of any of the characters within the string.
- Finds the first occurrence of any of the characters within `str` within the
- string starting at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the first occurrence of any of the characters
- of `str` within `{begin() + pos, end())` if it exists, and @ref npos otherwise.
- @param str The characters to search for.
- @param pos The index to start searching at. The default argument for
- this parameter is `0`.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_of(
- const basic_static_string<M, CharT, Traits>& str,
- size_type pos = 0) const noexcept
- {
- return find_first_of(str.data(), pos, str.size());
- }
- /** Find the first occurrence of any of the characters within the string.
- Finds the first occurrence of any of the characters within the string pointed to
- by `s` within the string starting at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the first occurrence
- of any of the characters in `{s, s + n)` within `{begin() + pos, end())`
- if it exists, and @ref npos otherwise.
- @param s The characters to search for.
- @param pos The index to start searching at.
- @param n The length of the string to search for.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_of(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept;
- /** Find the first occurrence of any of the characters within the string.
- Finds the first occurrence of the any of the characters within string
- pointed to by `s` of length `count` within the string starting at the
- index `pos`, where `count` is `traits_type::length(s)`.
- @par Complexity
- Linear.
- @return The index corrosponding to the first occurrence of any of
- the characters in `{s, s + count)` within
- `{begin() + pos, end())` if it exists, and @ref npos otherwise.
- @param s The characters to search for.
- @param pos The index to start searching at. The default argument
- for this parameter is `0`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_of(
- const_pointer s,
- size_type pos = 0) const noexcept
- {
- return find_first_of(s, pos, traits_type::length(s));
- }
- /** Find the first occurrence of a character within the string.
- Finds the first occurrence of `c` within the string
- starting at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the first occurrence of `c` within
- `{begin() + pos, end())` if it exists, and @ref npos otherwise.
- @param c The character to search for.
- @param pos The index to start searching at. The default argument
- for this parameter is `0`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_of(
- value_type c,
- size_type pos = 0) const noexcept
- {
- return find_first_of(&c, pos, 1);
- }
- /** Find the last occurrence of any of the characters within the string.
- Constructs a temporary `string_view_type` object `sv` from `t`, and finds
- the last occurrence of any of the characters in `sv`
- within the string before or at the index `pos`.
- @par Complexity
- Linear.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return The index corrosponding to the last occurrence of
- any of the characters in `{sv.begin(), sv.end())` within
- `{begin(), begin() + pos}` if it exists, and @ref npos otherwise.
- @param t The characters to search for.
- @param pos The index to stop searching at. The default argument
- for this parameter is @ref npos.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_of(
- const T& t,
- size_type pos = npos) const
- #ifdef BOOST_STATIC_STRING_DOCS
- noexcept(detail::is_nothrow_convertible<const T&, string_view_type>::value)
- #else
- noexcept(detail::is_nothrow_convertible<const T&, detail::common_string_view_type<T, CharT, Traits>>::value)
- #endif
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return find_last_of(sv.data(), pos, sv.size());
- }
- /** Find the last occurrence of any of the characters within the string.
- Finds the last occurrence of any of the characters within `str` within the
- string starting before or at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the last occurrence of any of the characters
- of `str` within `{begin(), begin() + pos}` if it exists, and @ref npos otherwise.
- @param str The characters to search for.
- @param pos The index to stop searching at. The default argument for
- this parameter is @ref npos.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_of(
- const basic_static_string<M, CharT, Traits>& str,
- size_type pos = npos) const noexcept
- {
- return find_last_of(str.data(), pos, str.size());
- }
- /** Find the last occurrence of any of the characters within the string.
- Finds the last occurrence of any of the characters within the string pointed to
- by `s` within the string before or at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the last occurrence
- of any of the characters in `{s, s + n)` within `{begin(), begin() + pos}`
- if it exists, and @ref npos otherwise.
- @param s The characters to search for.
- @param pos The index to stop searching at.
- @param n The length of the string to search for.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_of(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept;
- /** Find the last occurrence of any of the characters within the string.
- Finds the last occurrence of any of the characters within the string pointed to
- by `s` of length `count` within the string before or at the index `pos`,
- where `count` is `traits_type::length(s)`.
- @par Complexity
- Linear.
- @return The index corrosponding to the last occurrence
- of any of the characters in `{s, s + count)` within `{begin(), begin() + pos}`
- if it exists, and @ref npos otherwise.
- @param s The characters to search for.
- @param pos The index to stop searching at. The default argument for
- this parameter is @ref npos.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_of(
- const_pointer s,
- size_type pos = npos) const noexcept
- {
- return find_last_of(s, pos, traits_type::length(s));
- }
- /** Find the last occurrence of a character within the string.
- Finds the last occurrence of `c` within the string
- before or at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the last occurrence of `c` within
- `{begin(), begin() + pos}` if it exists, and @ref npos otherwise.
- @param c The character to search for.
- @param pos The index to stop searching at. The default argument
- for this parameter is @ref npos.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_of(
- value_type c,
- size_type pos = npos) const noexcept
- {
- return find_last_of(&c, pos, 1);
- }
- /** Find the first occurrence of a character not within the string.
- Constructs a temporary `string_view_type` object `sv` from `t`, and finds
- the first character that is not within `sv`, starting at the index `pos`.
- @par Complexity
- Linear.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return The index corrosponding to the first occurrence of
- a character that is not in `{sv.begin(), sv.end())` within
- `{begin() + pos, end())` if it exists, and @ref npos otherwise.
- @param t The characters to ignore.
- @param pos The index to start searching at. The default argument
- for this parameter is `0`.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_not_of(
- const T& t,
- size_type pos = 0) const
- #ifdef BOOST_STATIC_STRING_DOCS
- noexcept(detail::is_nothrow_convertible<const T&, string_view_type>::value)
- #else
- noexcept(detail::is_nothrow_convertible<const T&, detail::common_string_view_type<T, CharT, Traits>>::value)
- #endif
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return find_first_not_of(sv.data(), pos, sv.size());
- }
- /** Find the first occurrence of any of the characters not within the string.
- Finds the first occurrence of a character that is not within `str`
- within the string starting at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the first character of `{begin() + pos, end())`
- that is not within `str` if it exists, and @ref npos otherwise.
- @param str The characters to ignore.
- @param pos The index to start searching at. The default argument for
- this parameter is `0`.
- */
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_not_of(
- const basic_static_string<M, CharT, Traits>& str,
- size_type pos = 0) const noexcept
- {
- return find_first_not_of(str.data(), pos, str.size());
- }
- /** Find the first occurrence of any of the characters not within the string.
- Finds the first occurrence of a character that is not within the string
- pointed to by `s` within the string starting at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the first character of `{begin() + pos, end())`
- that is not within `{s, s + n)` if it exists, and @ref npos otherwise.
- @param s The characters to ignore.
- @param pos The index to start searching at. The default argument for
- this parameter is `0`.
- @param n The length of the characters to ignore.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_not_of(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept;
- /** Find the first occurrence of any of the characters not within the string.
- Finds the first occurrence of a character that is not within the string
- pointed to by `s` of length `count` within the string starting
- at the index `pos`, where `count` is `traits_type::length(s)`.
- @par Complexity
- Linear.
- @return The index corrosponding to the first character of `{begin() + pos, end())`
- that is not within `{s, s + count)` if it exists, and @ref npos otherwise.
- @param s The characters to ignore.
- @param pos The index to start searching at. The default argument for
- this parameter is `0`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_not_of(
- const_pointer s,
- size_type pos = 0) const noexcept
- {
- return find_first_not_of(s, pos, traits_type::length(s));
- }
- /** Find the first occurrence of a character not equal to `c`.
- Finds the first occurrence of a character that is not equal
- to `c`.
- @par Complexity
- Linear.
- @return The index corrosponding to the first character of `{begin() + pos, end())`
- that is not equal to `c` if it exists, and @ref npos otherwise.
- @param c The character to ignore.
- @param pos The index to start searching at. The default argument for
- this parameter is `0`.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_first_not_of(
- value_type c,
- size_type pos = 0) const noexcept
- {
- return find_first_not_of(&c, pos, 1);
- }
- /** Find the last occurrence of a character not within the string.
- Constructs a temporary `string_view_type` object `sv` from `t`, and finds
- the last character that is not within `sv`, starting at the index `pos`.
- @par Complexity
- Linear.
- @tparam T The type of the object to convert.
- @par Constraints
- `std::is_convertible<const T&, string_view>::value &&
- !std::is_convertible<const T&, const CharT*>::value &&
- !std::is_convertible<const T&, const basic_static_string&>::value`.
- @return The index corrosponding to the last occurrence of
- a character that is not in `{sv.begin(), sv.end())` within
- `{begin(), begin() + pos}` if it exists, and @ref npos otherwise.
- @param t The characters to ignore.
- @param pos The index to start searching at. The default argument
- for this parameter is @ref npos.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_not_of(
- const T& t,
- size_type pos = npos) const
- #ifdef BOOST_STATIC_STRING_DOCS
- noexcept(detail::is_nothrow_convertible<const T&, string_view_type>::value)
- #else
- noexcept(detail::is_nothrow_convertible<const T&, detail::common_string_view_type<T, CharT, Traits>>::value)
- #endif
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- return find_last_not_of(sv.data(), pos, sv.size());
- }
- /** Find the last occurrence of a character not within the string.
- Finds the last occurrence of a character that is not within `str`
- within the string before or at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the last character of `{begin(), begin() + pos}`
- that is not within `str` if it exists, and @ref npos otherwise.
- @param str The characters to ignore.
- @param pos The index to stop searching at. The default argument for
- this parameter is @ref npos.
- */
- template<size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_not_of(
- const basic_static_string<M, CharT, Traits>& str,
- size_type pos = npos) const noexcept
- {
- return find_last_not_of(str.data(), pos, str.size());
- }
- /** Find the last occurrence of a character not within the string.
- Finds the last occurrence of a character that is not within the
- string pointed to by `s` within the string before or at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the last character of `{begin(), begin() + pos}`
- that is not within `{s, s + n)` if it exists, and @ref npos otherwise.
- @param s The characters to ignore.
- @param pos The index to stop searching at. The default argument for
- this parameter is @ref npos.
- @param n The length of the characters to ignore.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_not_of(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept;
- /** Find the last occurrence of a character not within the string.
- Finds the last occurrence of a character that is not within the
- string pointed to by `s` of length `count` within the string
- before or at the index `pos`, where `count` is `traits_type::length(s)`.
- @par Complexity
- Linear.
- @return The index corrosponding to the last character of `{begin(), begin() + pos}`
- that is not within `{s, s + count)` if it exists, and @ref npos otherwise.
- @param s The characters to ignore.
- @param pos The index to stop searching at. The default argument for
- this parameter is @ref npos.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_not_of(
- const_pointer s,
- size_type pos = npos) const noexcept
- {
- return find_last_not_of(s, pos, traits_type::length(s));
- }
- /** Find the last occurrence of a character not equal to `c`.
- Finds the last occurrence of a character that is not equal
- to `c` before or at the index `pos`.
- @par Complexity
- Linear.
- @return The index corrosponding to the last character of `{begin(), begin() + pos}`
- that is not equal to `c` if it exists, and @ref npos otherwise.
- @param c The character to ignore.
- @param pos The index to start searching at. The default argument for
- this parameter is @ref npos.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- find_last_not_of(
- value_type c,
- size_type pos = npos) const noexcept
- {
- return find_last_not_of(&c, pos, 1);
- }
- /** Return whether the string begins with a string.
- Returns `true` if the string begins with `s`, and `false` otherwise.
- @par Complexity
- Linear.
- @param t The string view to check for.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- bool
- starts_with(
- T const& t) const noexcept
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- const size_type len = sv.size();
- return size() >= len && !traits_type::compare(data(), sv.data(), len);
- }
- /** Return whether the string begins with a character.
- Returns `true` if the string begins with `c`, and `false` otherwise.
- @par Complexity
- Constant.
- @param c The character to check for.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- bool
- starts_with(
- value_type c) const noexcept
- {
- return !empty() && traits_type::eq(front(), c);
- }
- /** Return whether the string begins with a string.
- Returns `true` if the string begins with the string
- pointed to be `s` of length `traits_type::length(s)`,
- and `false` otherwise.
- @par Complexity
- Linear.
- @param s The string to check for.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- bool
- starts_with(
- const_pointer s) const noexcept
- {
- const size_type len = traits_type::length(s);
- return size() >= len && !traits_type::compare(data(), s, len);
- }
- /** Return whether the string ends with a string.
- Returns `true` if the string ends with `s`, and `false` otherwise.
- @par Complexity
- Linear.
- @param t The string view to check for.
- */
- template<typename T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- bool
- ends_with(
- T const& t) const noexcept
- {
- detail::common_string_view_type<T, CharT, Traits> sv = t;
- const size_type len = sv.size();
- return size() >= len && !traits_type::compare(data() + (size() - len), sv.data(), len);
- }
- /** Return whether the string ends with a character.
- Returns `true` if the string ends with `c`, and `false` otherwise.
- @par Complexity
- Constant.
- @param c The character to check for.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- bool
- ends_with(
- value_type c) const noexcept
- {
- return !empty() && traits_type::eq(back(), c);
- }
- /** Return whether the string ends with a string.
- Returns `true` if the string ends with the string
- pointed to be `s` of length `traits_type::length(s)`,
- and `false` otherwise.
- @par Complexity
- Linear.
- @param s The string to check for.
- */
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- bool
- ends_with(
- const_pointer s) const noexcept
- {
- const size_type len = traits_type::length(s);
- return size() >= len && !traits_type::compare(data() + (size() - len), s, len);
- }
- private:
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- term() noexcept
- {
- this->term_impl();
- return *this;
- }
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign_char(value_type ch, std::true_type) noexcept
- {
- this->set_size(1);
- traits_type::assign(data()[0], ch);
- return term();
- }
- BOOST_STATIC_STRING_NORETURN
- basic_static_string&
- assign_char(value_type, std::false_type)
- {
- detail::throw_exception<std::length_error>("max_size() == 0");
- // This eliminates any potential warnings
- #ifdef BOOST_STATIC_STRING_NO_NORETURN
- return *this;
- #endif
- }
- // Returns the size of data read from input iterator. Read data begins at data() + size() + 1.
- template<typename InputIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- read_back(
- bool overwrite_null,
- InputIterator first,
- InputIterator last);
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace_unchecked(
- size_type pos,
- size_type n1,
- const_pointer s,
- size_type n2)
- {
- if (pos > size())
- detail::throw_exception<std::out_of_range>(
- "pos > size()");
- return replace_unchecked(data() + pos, data() + pos + capped_length(pos, n1), s, n2);
- }
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- replace_unchecked(
- const_iterator i1,
- const_iterator i2,
- const_pointer s,
- size_type n2);
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- insert_unchecked(
- size_type index,
- const_pointer s,
- size_type count)
- {
- if (index > size())
- detail::throw_exception<std::out_of_range>(
- "index > size()");
- insert_unchecked(data() + index, s, count);
- return *this;
- }
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- iterator
- insert_unchecked(
- const_iterator pos,
- const_pointer s,
- size_type count);
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- basic_static_string&
- assign_unchecked(
- const_pointer s,
- size_type count) noexcept
- {
- this->set_size(count);
- traits_type::copy(data(), s, size() + 1);
- return *this;
- }
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- size_type
- capped_length(
- size_type index,
- size_type length) const
- {
- if (index > size())
- detail::throw_exception<std::out_of_range>(
- "index > size()");
- return (std::min)(size() - index, length);
- }
- };
- //------------------------------------------------------------------------------
- //
- // Non-member functions
- //
- //------------------------------------------------------------------------------
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator==(
- const basic_static_string<N, CharT, Traits>& lhs,
- const basic_static_string<M, CharT, Traits>& rhs)
- {
- return lhs.compare(rhs) == 0;
- }
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator!=(
- const basic_static_string<N, CharT, Traits>& lhs,
- const basic_static_string<M, CharT, Traits>& rhs)
- {
- return lhs.compare(rhs) != 0;
- }
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<(
- const basic_static_string<N, CharT, Traits>& lhs,
- const basic_static_string<M, CharT, Traits>& rhs)
- {
- return lhs.compare(rhs) < 0;
- }
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<=(
- const basic_static_string<N, CharT, Traits>& lhs,
- const basic_static_string<M, CharT, Traits>& rhs)
- {
- return lhs.compare(rhs) <= 0;
- }
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>(
- const basic_static_string<N, CharT, Traits>& lhs,
- const basic_static_string<M, CharT, Traits>& rhs)
- {
- return lhs.compare(rhs) > 0;
- }
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>=(
- const basic_static_string<N, CharT, Traits>& lhs,
- const basic_static_string<M, CharT, Traits>& rhs)
- {
- return lhs.compare(rhs) >= 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator==(
- const CharT* lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs, Traits::length(lhs),
- rhs.data(), rhs.size()) == 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator==(
- const basic_static_string<N, CharT, Traits>& lhs,
- const CharT* rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhs, Traits::length(rhs)) == 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator==(
- const T& lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> lhsv = lhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhsv.data(), lhsv.size(),
- rhs.data(), rhs.size()) == 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator==(
- const basic_static_string<N, CharT, Traits>& lhs,
- const T& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> rhsv = rhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhsv.data(), rhsv.size()) == 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator!=(
- const CharT* lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs, Traits::length(lhs),
- rhs.data(), rhs.size()) != 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator!=(
- const basic_static_string<N, CharT, Traits>& lhs,
- const CharT* rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhs, Traits::length(rhs)) != 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator!=(
- const T& lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> lhsv = lhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhsv.data(), lhsv.size(),
- rhs.data(), rhs.size()) != 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator!=(
- const basic_static_string<N, CharT, Traits>& lhs,
- const T& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> rhsv = rhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhsv.data(), rhsv.size()) != 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<(
- const CharT* lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs, Traits::length(lhs),
- rhs.data(), rhs.size()) < 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<(
- const basic_static_string<N, CharT, Traits>& lhs,
- const CharT* rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhs, Traits::length(rhs)) < 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<(
- const T& lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> lhsv = lhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhsv.data(), lhsv.size(),
- rhs.data(), rhs.size()) < 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<(
- const basic_static_string<N, CharT, Traits>& lhs,
- const T& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> rhsv = rhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhsv.data(), rhsv.size()) < 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<=(
- const CharT* lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs, Traits::length(lhs),
- rhs.data(), rhs.size()) <= 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<=(
- const basic_static_string<N, CharT, Traits>& lhs,
- const CharT* rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhs, Traits::length(rhs)) <= 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<=(
- const T& lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> lhsv = lhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhsv.data(), lhsv.size(),
- rhs.data(), rhs.size()) <= 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator<=(
- const basic_static_string<N, CharT, Traits>& lhs,
- const T& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> rhsv = rhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhsv.data(), rhsv.size()) <= 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>(
- const CharT* lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs, Traits::length(lhs),
- rhs.data(), rhs.size()) > 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>(
- const basic_static_string<N, CharT, Traits>& lhs,
- const CharT* rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhs, Traits::length(rhs)) > 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>(
- const T& lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> lhsv = lhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhsv.data(), lhsv.size(),
- rhs.data(), rhs.size()) > 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>(
- const basic_static_string<N, CharT, Traits>& lhs,
- const T& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> rhsv = rhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhsv.data(), rhsv.size()) > 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>=(
- const CharT* lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs, Traits::length(lhs),
- rhs.data(), rhs.size()) >= 0;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>=(
- const basic_static_string<N, CharT, Traits>& lhs,
- const CharT* rhs)
- {
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhs, Traits::length(rhs)) >= 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>=(
- const T& lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> lhsv = lhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhsv.data(), lhsv.size(),
- rhs.data(), rhs.size()) >= 0;
- }
- template<std::size_t N, typename CharT, typename Traits, class T
- #ifndef BOOST_STATIC_STRING_DOCS
- , typename = detail::enable_if_viewable_t<N, T, CharT, Traits>
- #endif
- >
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- bool
- operator>=(
- const basic_static_string<N, CharT, Traits>& lhs,
- const T& rhs)
- {
- detail::common_string_view_type<T, CharT, Traits> rhsv = rhs;
- return detail::lexicographical_compare<CharT, Traits>(
- lhs.data(), lhs.size(),
- rhsv.data(), rhsv.size()) >= 0;
- }
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- basic_static_string<N + M, CharT, Traits>
- operator+(
- const basic_static_string<N, CharT, Traits>& lhs,
- const basic_static_string<M, CharT, Traits>& rhs)
- {
- return basic_static_string<N + M, CharT, Traits>(lhs) += rhs;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- basic_static_string<N + 1, CharT, Traits>
- operator+(
- const basic_static_string<N, CharT, Traits>& lhs,
- CharT rhs)
- {
- return basic_static_string<N + 1, CharT, Traits>(lhs) += rhs;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- basic_static_string<N + 1, CharT, Traits>
- operator+(
- CharT lhs,
- const basic_static_string<N, CharT, Traits>& rhs)
- {
- // The cast to std::size_t is needed here since 0 is a null pointer constant
- return basic_static_string<N + 1, CharT, Traits>(rhs).insert(
- std::size_t(0), 1, lhs);
- }
- // Add a null terminated character array to a string.
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- basic_static_string<N + M, CharT, Traits>
- operator+(
- const basic_static_string<N, CharT, Traits>& lhs,
- const CharT(&rhs)[M])
- {
- return basic_static_string<N + M, CharT, Traits>(lhs).append(+rhs);
- }
- // Add a string to a null terminated character array.
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- basic_static_string<N + M, CharT, Traits>
- operator+(
- const CharT(&lhs)[N],
- const basic_static_string<M, CharT, Traits>& rhs)
- {
- // The cast to std::size_t is needed here since 0 is a null pointer constant
- return basic_static_string<N + M, CharT, Traits>(rhs).insert(
- std::size_t(0), +lhs);
- }
- //------------------------------------------------------------------------------
- //
- // erase_if
- //
- //------------------------------------------------------------------------------
- template<
- std::size_t N, typename CharT,
- typename Traits, typename UnaryPredicate>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- typename
- basic_static_string<N, CharT, Traits>::size_type
- erase_if(
- basic_static_string<N, CharT, Traits>& str,
- UnaryPredicate pred)
- {
- auto first = str.begin();
- for (auto it = first; it != str.end(); ++it)
- if (!pred(*it))
- *first++ = std::move(*it);
- const auto count = str.end() - first;
- str.erase(first, str.end());
- return count;
- }
- //------------------------------------------------------------------------------
- //
- // swap
- //
- //------------------------------------------------------------------------------
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- void
- swap(
- basic_static_string<N, CharT, Traits>& lhs,
- basic_static_string<N, CharT, Traits>& rhs)
- {
- lhs.swap(rhs);
- }
- template<
- std::size_t N, std::size_t M,
- typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- inline
- void
- swap(
- basic_static_string<N, CharT, Traits>& lhs,
- basic_static_string<M, CharT, Traits>& rhs)
- {
- lhs.swap(rhs);
- }
- //------------------------------------------------------------------------------
- //
- // Input/Output
- //
- //------------------------------------------------------------------------------
- template<std::size_t N, typename CharT, typename Traits>
- inline
- std::basic_ostream<CharT, Traits>&
- operator<<(
- std::basic_ostream<CharT, Traits>& os,
- const basic_static_string<N, CharT, Traits>& s)
- {
- #ifdef BOOST_STATIC_STRING_HAS_ANY_STRING_VIEW
- return os << basic_string_view<CharT, Traits>(s.data(), s.size());
- #else
- for (auto c: s)
- os << c;
- return os;
- #endif
- }
- //------------------------------------------------------------------------------
- //
- // Numeric conversions
- //
- //------------------------------------------------------------------------------
- // Signed overloads have a + 2, one for the missing digit,
- // and one for the sign.
- // Unsigned overloads have a + 1, for the missing digit.
- // Floating point overloads have a + 4, for the sign
- // of the integral part, sign of the exponent, the 'e',
- // and the decimal.
- /// Converts `value` to a `static_string`
- static_string<std::numeric_limits<int>::digits10 + 2>
- inline
- to_static_string(int value) noexcept
- {
- return detail::to_static_string_int_impl<
- std::numeric_limits<int>::digits10 + 2>(value);
- }
- /// Converts `value` to a `static_string`
- static_string<std::numeric_limits<long>::digits10 + 2>
- inline
- to_static_string(long value) noexcept
- {
- return detail::to_static_string_int_impl<
- std::numeric_limits<long>::digits10 + 2>(value);
- }
- /// Converts `value` to a `static_string`
- static_string<std::numeric_limits<long long>::digits10 + 2>
- inline
- to_static_string(long long value) noexcept
- {
- return detail::to_static_string_int_impl<
- std::numeric_limits<long long>::digits10 + 2>(value);
- }
- /// Converts `value` to a `static_string`
- static_string<std::numeric_limits<unsigned int>::digits10 + 1>
- inline
- to_static_string(unsigned int value) noexcept
- {
- return detail::to_static_string_int_impl<
- std::numeric_limits<unsigned int>::digits10 + 1>(value);
- }
- /// Converts `value` to a `static_string`
- static_string<std::numeric_limits<unsigned long>::digits10 + 1>
- inline
- to_static_string(unsigned long value) noexcept
- {
- return detail::to_static_string_int_impl<
- std::numeric_limits<unsigned long>::digits10 + 1>(value);
- }
- /// Converts `value` to a `static_string`
- static_string<std::numeric_limits<unsigned long long>::digits10 + 1>
- inline
- to_static_string(unsigned long long value) noexcept
- {
- return detail::to_static_string_int_impl<
- std::numeric_limits<unsigned long long>::digits10 + 1>(value);
- }
- /// Converts `value` to a `static_string`
- static_string<std::numeric_limits<float>::max_digits10 + 4>
- inline
- to_static_string(float value) noexcept
- {
- return detail::to_static_string_float_impl<
- std::numeric_limits<float>::max_digits10 + 4>(value);
- }
- /// Converts `value` to a `static_string`
- static_string<std::numeric_limits<double>::max_digits10 + 4>
- inline
- to_static_string(double value) noexcept
- {
- return detail::to_static_string_float_impl<
- std::numeric_limits<double>::max_digits10 + 4>(value);
- }
- /// Converts `value` to a `static_string`
- static_string<std::numeric_limits<long double>::max_digits10 + 4>
- inline
- to_static_string(long double value) noexcept
- {
- return detail::to_static_string_float_impl<
- std::numeric_limits<long double>::max_digits10 + 4>(value);
- }
- #ifdef BOOST_STATIC_STRING_HAS_WCHAR
- /// Converts `value` to a `static_wstring`
- static_wstring<std::numeric_limits<int>::digits10 + 2>
- inline
- to_static_wstring(int value) noexcept
- {
- return detail::to_static_wstring_int_impl<
- std::numeric_limits<int>::digits10 + 2>(value);
- }
- /// Converts `value` to a `static_wstring`
- static_wstring<std::numeric_limits<long>::digits10 + 2>
- inline
- to_static_wstring(long value) noexcept
- {
- return detail::to_static_wstring_int_impl<
- std::numeric_limits<long>::digits10 + 2>(value);
- }
- /// Converts `value` to a `static_wstring`
- static_wstring<std::numeric_limits<long long>::digits10 + 2>
- inline
- to_static_wstring(long long value) noexcept
- {
- return detail::to_static_wstring_int_impl<
- std::numeric_limits<long long>::digits10 + 2>(value);
- }
- /// Converts `value` to a `static_wstring`
- static_wstring<std::numeric_limits<unsigned int>::digits10 + 1>
- inline
- to_static_wstring(unsigned int value) noexcept
- {
- return detail::to_static_wstring_int_impl<
- std::numeric_limits<unsigned int>::digits10 + 1>(value);
- }
- /// Converts `value` to a `static_wstring`
- static_wstring<std::numeric_limits<unsigned long>::digits10 + 1>
- inline
- to_static_wstring(unsigned long value) noexcept
- {
- return detail::to_static_wstring_int_impl<
- std::numeric_limits<unsigned long>::digits10 + 1>(value);
- }
- /// Converts `value` to a `static_wstring`
- static_wstring<std::numeric_limits<unsigned long long>::digits10 + 1>
- inline
- to_static_wstring(unsigned long long value) noexcept
- {
- return detail::to_static_wstring_int_impl<
- std::numeric_limits<unsigned long long>::digits10 + 1>(value);
- }
- /// Converts `value` to a `static_wstring`
- static_wstring<std::numeric_limits<float>::max_digits10 + 4>
- inline
- to_static_wstring(float value) noexcept
- {
- return detail::to_static_wstring_float_impl<
- std::numeric_limits<float>::max_digits10 + 4>(value);
- }
- /// Converts `value` to a `static_wstring`
- static_wstring<std::numeric_limits<double>::max_digits10 + 4>
- inline
- to_static_wstring(double value) noexcept
- {
- return detail::to_static_wstring_float_impl<
- std::numeric_limits<double>::max_digits10 + 4>(value);
- }
- /// Converts `value` to a `static_wstring`
- static_wstring<std::numeric_limits<long double>::max_digits10 + 4>
- inline
- to_static_wstring(long double value) noexcept
- {
- return detail::to_static_wstring_float_impl<
- std::numeric_limits<long double>::max_digits10 + 4>(value);
- }
- #endif
- //------------------------------------------------------------------------------
- //
- // Deduction Guides
- //
- //------------------------------------------------------------------------------
- #ifdef BOOST_STATIC_STRING_USE_DEDUCT
- template<std::size_t N, typename CharT>
- basic_static_string(const CharT(&)[N]) ->
- basic_static_string<N, CharT, std::char_traits<CharT>>;
- #endif
- //------------------------------------------------------------------------------
- //
- // Hashing
- //
- //------------------------------------------------------------------------------
- #ifndef BOOST_STATIC_STRING_STANDALONE
- /// hash_value overload for Boost.Container_Hash
- template <std::size_t N,
- typename CharT,
- typename Traits>
- std::size_t
- hash_value(
- const basic_static_string<N, CharT, Traits>& str)
- {
- return boost::hash_range(str.begin(), str.end());
- }
- #endif
- } // static_strings
- //------------------------------------------------------------------------------
- //
- // using Declarations
- //
- //------------------------------------------------------------------------------
- using static_strings::static_string;
- #ifdef BOOST_STATIC_STRING_HAS_WCHAR
- using static_strings::static_wstring;
- #endif
- using static_strings::static_u16string;
- using static_strings::static_u32string;
- } // boost
- /// std::hash partial specialization for basic_static_string
- namespace std {
- template<std::size_t N, typename CharT, typename Traits>
- struct hash<
- #ifdef BOOST_STATIC_STRING_DOCS
- basic_static_string
- #else
- boost::static_strings::basic_static_string<N, CharT, Traits>
- #endif
- >
- {
- std::size_t
- operator()(
- const boost::static_strings::basic_static_string<N, CharT, Traits>& str) const noexcept
- {
- #if !defined(BOOST_STATIC_STRING_STANDALONE)
- return boost::hash_range(str.begin(), str.end());
- #elif defined(BOOST_STATIC_STRING_HAS_ANY_STRING_VIEW)
- using view_type = typename
- boost::static_strings::basic_string_view<CharT, Traits>;
- return std::hash<view_type>()(view_type(str.data(), str.size()));
- #else
- std::size_t seed = 0;
- for (CharT const& c : str)
- {
- #if BOOST_STATIC_STRING_ARCH == 64
- seed += 0x9e3779b9 + std::hash<CharT>()( c );
- std::size_t const m = (std::size_t(0xe9846af) << 32) + 0x9b1a615d;
- seed ^= seed >> 32;
- seed *= m;
- seed ^= seed >> 32;
- seed *= m;
- seed ^= seed >> 28;
- #elif BOOST_STATIC_STRING_ARCH == 32
- seed += 0x9e3779b9 + std::hash<CharT>()( c );
- std::size_t const m1 = 0x21f0aaad;
- std::size_t const m2 = 0x735a2d97;
- seed ^= seed >> 16;
- seed *= m1;
- seed ^= seed >> 15;
- seed *= m2;
- seed ^= seed >> 15;
- #endif
- }
- return seed;
- #endif
- }
- };
- } // std
- //--------------------------------------------------------------------------
- //
- // Implementation
- //
- //--------------------------------------------------------------------------
- #ifndef BOOST_STATIC_STRING_DOCS
- namespace boost {
- namespace static_strings {
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- assign(
- size_type count,
- value_type ch) ->
- basic_static_string&
- {
- if (count > max_size())
- detail::throw_exception<std::length_error>(
- "count > max_size()");
- this->set_size(count);
- traits_type::assign(data(), size(), ch);
- return term();
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- assign(
- const_pointer s,
- size_type count) ->
- basic_static_string&
- {
- if (count > max_size())
- detail::throw_exception<std::length_error>(
- "count > max_size()");
- this->set_size(count);
- traits_type::move(data(), s, size());
- return term();
- }
- template<std::size_t N, typename CharT, typename Traits>
- template<typename InputIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- assign(
- InputIterator first,
- InputIterator last) ->
- typename std::enable_if<
- detail::is_input_iterator<InputIterator>::value,
- basic_static_string&>::type
- {
- auto ptr = data();
- for (std::size_t i = 0; first != last; ++first, ++ptr, ++i)
- {
- if (i >= max_size())
- {
- this->set_size(i);
- term();
- detail::throw_exception<std::length_error>("n > max_size()");
- }
- traits_type::assign(*ptr, *first);
- }
- this->set_size(ptr - data());
- return term();
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- insert(
- const_iterator pos,
- size_type count,
- value_type ch) ->
- iterator
- {
- const auto curr_size = size();
- const auto curr_data = data();
- if (count > max_size() - curr_size)
- detail::throw_exception<std::length_error>(
- "count > max_size() - curr_size");
- const auto index = pos - curr_data;
- traits_type::move(&curr_data[index + count], &curr_data[index], curr_size - index + 1);
- traits_type::assign(&curr_data[index], count, ch);
- this->set_size(curr_size + count);
- return &curr_data[index];
- }
- template<std::size_t N, typename CharT, typename Traits>
- template<typename ForwardIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- insert(
- const_iterator pos,
- ForwardIterator first,
- ForwardIterator last) ->
- typename std::enable_if<
- detail::is_forward_iterator<
- ForwardIterator>::value, iterator>::type
- {
- // input
- const std::size_t count = detail::distance(first, last);
- const auto first_addr = &*first;
- const auto last_addr = first_addr + count;
- // output
- const auto curr_size = size();
- const auto curr_data = data();
- const std::size_t index = pos - curr_data;
- auto dest = &curr_data[index];
- if (count > max_size() - curr_size)
- detail::throw_exception<std::length_error>(
- "count > max_size() - curr_size");
- traits_type::move(dest + count, dest, curr_size - index + 1);
- const bool inside = detail::ptr_in_range(curr_data, curr_data + curr_size, first_addr);
- if (!inside || last_addr <= pos)
- {
- detail::copy_with_traits<Traits>(first, last, dest);
- }
- else /* if (inside) */
- {
- const size_type offset = first_addr - curr_data;
- if (offset < index)
- {
- const size_type diff = index - offset;
- traits_type::copy(dest, &curr_data[offset], diff);
- traits_type::copy(&curr_data[index + diff], dest + count, count - diff);
- }
- else
- {
- auto src = &curr_data[offset + count];
- traits_type::copy(dest, src, count);
- }
- }
- this->set_size(curr_size + count);
- return curr_data + index;
- }
- template<std::size_t N, typename CharT, typename Traits>
- template<typename InputIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- insert(
- const_iterator pos,
- InputIterator first,
- InputIterator last) ->
- typename std::enable_if<
- detail::is_input_iterator<
- InputIterator>::value &&
- !detail::is_forward_iterator<
- InputIterator>::value, iterator>::type
- {
- const auto curr_size = size();
- const auto curr_data = data();
- const auto count = read_back(false, first, last);
- const std::size_t index = pos - curr_data;
- std::rotate(&curr_data[index], &curr_data[curr_size + 1], &curr_data[curr_size + count + 1]);
- this->set_size(curr_size + count);
- return curr_data + index;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- erase(
- const_iterator first,
- const_iterator last) ->
- iterator
- {
- const auto curr_data = data();
- const std::size_t index = first - curr_data;
- traits_type::move(&curr_data[index], last, (end() - last) + 1);
- this->set_size(size() - std::size_t(last - first));
- return curr_data + index;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- basic_static_string<N, CharT, Traits>::
- push_back(
- value_type ch)
- {
- const auto curr_size = size();
- if (curr_size >= max_size())
- detail::throw_exception<std::length_error>(
- "curr_size >= max_size()");
- traits_type::assign(data()[curr_size], ch);
- this->set_size(curr_size + 1);
- term();
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- append(
- size_type count,
- value_type ch) ->
- basic_static_string&
- {
- const auto curr_size = size();
- if (count > max_size() - curr_size)
- detail::throw_exception<std::length_error>(
- "count > max_size() - size()");
- traits_type::assign(end(), count, ch);
- this->set_size(curr_size + count);
- return term();
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- append(
- const_pointer s,
- size_type count) ->
- basic_static_string&
- {
- const auto curr_size = size();
- if (count > max_size() - curr_size)
- detail::throw_exception<std::length_error>(
- "count > max_size() - size()");
- traits_type::copy(end(), s, count);
- this->set_size(curr_size + count);
- return term();
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- basic_static_string<N, CharT, Traits>::
- resize(size_type n, value_type c)
- {
- if (n > max_size())
- detail::throw_exception<std::length_error>(
- "n > max_size()");
- const auto curr_size = size();
- if(n > curr_size)
- traits_type::assign(data() + curr_size, n - curr_size, c);
- this->set_size(n);
- term();
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- basic_static_string<N, CharT, Traits>::
- swap(basic_static_string& s) noexcept
- {
- const auto curr_size = size();
- basic_static_string tmp(s);
- s.set_size(curr_size);
- traits_type::copy(&s.data()[0], data(), curr_size + 1);
- this->set_size(tmp.size());
- traits_type::copy(data(), tmp.data(), size() + 1);
- }
- template<std::size_t N, typename CharT, typename Traits>
- template<std::size_t M>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- void
- basic_static_string<N, CharT, Traits>::
- swap(basic_static_string<M, CharT, Traits>& s)
- {
- const auto curr_size = size();
- if (curr_size > s.max_size())
- detail::throw_exception<std::length_error>(
- "curr_size > s.max_size()");
- if (s.size() > max_size())
- detail::throw_exception<std::length_error>(
- "s.size() > max_size()");
- basic_static_string tmp(s);
- s.set_size(curr_size);
- traits_type::copy(&s.data()[0], data(), curr_size + 1);
- this->set_size(tmp.size());
- traits_type::copy(data(), &tmp.data()[0], size() + 1);
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- replace(
- const_iterator i1,
- const_iterator i2,
- size_type n,
- value_type c) ->
- basic_static_string<N, CharT, Traits>&
- {
- const auto curr_size = size();
- const auto curr_data = data();
- const std::size_t n1 = i2 - i1;
- if (n > max_size() || curr_size - n1 >= max_size() - n)
- detail::throw_exception<std::length_error>(
- "replaced string exceeds max_size()");
- const auto pos = i1 - curr_data;
- traits_type::move(&curr_data[pos + n], i2, (end() - i2) + 1);
- traits_type::assign(&curr_data[pos], n, c);
- this->set_size((curr_size - n1) + n);
- return *this;
- }
- template<std::size_t N, typename CharT, typename Traits>
- template<typename ForwardIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- replace(
- const_iterator i1,
- const_iterator i2,
- ForwardIterator j1,
- ForwardIterator j2) ->
- typename std::enable_if<
- detail::is_forward_iterator<ForwardIterator>::value,
- basic_static_string<N, CharT, Traits>&>::type
- {
- const auto curr_size = size();
- const auto curr_data = data();
- const auto first_addr = &*j1;
- const std::size_t n1 = i2 - i1;
- const std::size_t n2 = detail::distance(j1, j2);
- const std::size_t pos = i1 - curr_data;
- if (n2 > max_size() || curr_size - (std::min)(n1, curr_size - pos) >= max_size() - n2)
- detail::throw_exception<std::length_error>(
- "replaced string exceeds max_size()");
- const bool inside = detail::ptr_in_range(curr_data, curr_data + curr_size, first_addr);
- if (inside && first_addr == i1 && n1 == n2)
- return *this;
- // Short circuit evaluation ensures that the pointer arithmetic is valid
- if (!inside || (inside && (first_addr + n2 <= i1)))
- {
- // source outside
- traits_type::move(&curr_data[pos + n2], &curr_data[pos + n1], curr_size - pos - n1 + 1);
- detail::copy_with_traits<Traits>(j1, j2, &curr_data[pos]);
- }
- else
- {
- // source inside
- const size_type offset = first_addr - curr_data;
- if (n2 >= n1)
- {
- // grow/unchanged
- const size_type diff = offset <= pos + n1 ? (std::min)((pos + n1) - offset, n2) : 0;
- // shift all right of splice point by n2 - n1 to the right
- traits_type::move(&curr_data[pos + n2], &curr_data[pos + n1], curr_size - pos - n1 + 1);
- // copy all before splice point
- traits_type::move(&curr_data[pos], &curr_data[offset], diff);
- // copy all after splice point
- traits_type::move(&curr_data[pos + diff], &curr_data[(offset - n1) + n2 + diff], n2 - diff);
- }
- else
- {
- // shrink
- // copy all elements into place
- traits_type::move(&curr_data[pos], &curr_data[offset], n2);
- // shift all elements after splice point left
- traits_type::move(&curr_data[pos + n2], &curr_data[pos + n1], curr_size - pos - n1 + 1);
- }
- }
- this->set_size((curr_size - n1) + n2);
- return *this;
- }
- template<std::size_t N, typename CharT, typename Traits>
- template<typename InputIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- replace(
- const_iterator i1,
- const_iterator i2,
- InputIterator j1,
- InputIterator j2) ->
- typename std::enable_if<
- detail::is_input_iterator<
- InputIterator>::value &&
- !detail::is_forward_iterator<
- InputIterator>::value,
- basic_static_string<N, CharT, Traits>&>::type
- {
- const auto curr_size = size();
- const auto curr_data = data();
- const std::size_t n1 = detail::distance(i1, i2);
- const std::size_t n2 = read_back(false, j1, j2);
- const std::size_t pos = i1 - curr_data;
- // Rotate to the correct order. [i2, end] will now start with the replaced string,
- // continue to the existing string not being replaced, and end with a null terminator
- std::rotate(&curr_data[pos], &curr_data[curr_size + 1], &curr_data[curr_size + n2 + 1]);
- // Move everything from the end of the splice point to the end of the rotated string to
- // the begining of the splice point
- traits_type::move(&curr_data[pos + n2], &curr_data[pos + n2 + n1], ((curr_size - n1) + n2) - pos);
- this->set_size((curr_size - n1) + n2);
- return *this;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- find(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept ->
- size_type
- {
- const auto curr_size = size();
- if (pos > curr_size || n > curr_size - pos)
- return npos;
- if (!n)
- return pos;
- const auto res = detail::search(data() + pos, data() + curr_size, s, s + n, traits_type::eq);
- return res == end() ? npos : detail::distance(data(), res);
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- rfind(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept ->
- size_type
- {
- const auto curr_size = size();
- const auto curr_data = data();
- if (curr_size < n)
- return npos;
- if (pos > curr_size - n)
- pos = curr_size - n;
- if (!n)
- return pos;
- for (auto sub = &curr_data[pos]; sub >= curr_data; --sub)
- if (!traits_type::compare(sub, s, n))
- return detail::distance(curr_data, sub);
- return npos;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- find_first_of(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept ->
- size_type
- {
- const auto curr_data = data();
- if (pos >= size() || !n)
- return npos;
- const auto res = detail::find_first_of(&curr_data[pos], &curr_data[size()], s, &s[n], traits_type::eq);
- return res == end() ? npos : detail::distance(curr_data, res);
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- find_last_of(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept ->
- size_type
- {
- const auto curr_size = size();
- if (!n)
- return npos;
- if (pos >= curr_size)
- pos = 0;
- else
- pos = curr_size - (pos + 1);
- const auto res = detail::find_first_of(rbegin() + pos, rend(), s, &s[n], traits_type::eq);
- return res == rend() ? npos : curr_size - 1 - detail::distance(rbegin(), res);
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- find_first_not_of(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept ->
- size_type
- {
- if (pos >= size())
- return npos;
- if (!n)
- return pos;
- const auto res = detail::find_not_of<Traits>(data() + pos, data() + size(), s, n);
- return res == end() ? npos : detail::distance(data(), res);
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- find_last_not_of(
- const_pointer s,
- size_type pos,
- size_type n) const noexcept ->
- size_type
- {
- const auto curr_size = size();
- if (pos >= curr_size)
- pos = curr_size - 1;
- if (!n)
- return pos;
- pos = curr_size - (pos + 1);
- const auto res = detail::find_not_of<Traits>(rbegin() + pos, rend(), s, n);
- return res == rend() ? npos : curr_size - 1 - detail::distance(rbegin(), res);
- }
- template<std::size_t N, typename CharT, typename Traits>
- template<typename InputIterator>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- read_back(
- bool overwrite_null,
- InputIterator first,
- InputIterator last) ->
- size_type
- {
- const auto curr_data = data();
- auto new_size = size();
- for (; first != last; ++first)
- {
- if (new_size >= max_size())
- {
- // if we overwrote the null terminator,
- // put it back
- if (overwrite_null)
- term();
- detail::throw_exception<std::length_error>(
- "count > max_size() - size()");
- }
- traits_type::assign(curr_data[new_size++ + (!overwrite_null)], *first);
- }
- return new_size - size();
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- replace_unchecked(
- const_iterator i1,
- const_iterator i2,
- const_pointer s,
- size_type n2) ->
- basic_static_string&
- {
- const auto curr_data = data();
- const auto curr_size = size();
- const std::size_t pos = i1 - curr_data;
- const std::size_t n1 = i2 - i1;
- if (n2 > max_size() || curr_size - (std::min)(n1, curr_size - pos) >= max_size() - n2)
- detail::throw_exception<std::length_error>(
- "replaced string exceeds max_size()");
- traits_type::move(&curr_data[pos + n2], i2, (end() - i2) + 1);
- traits_type::copy(&curr_data[pos], s, n2);
- this->set_size((curr_size - n1) + n2);
- return *this;
- }
- template<std::size_t N, typename CharT, typename Traits>
- BOOST_STATIC_STRING_CPP14_CONSTEXPR
- auto
- basic_static_string<N, CharT, Traits>::
- insert_unchecked(
- const_iterator pos,
- const_pointer s,
- size_type count) ->
- iterator
- {
- const auto curr_data = data();
- const auto curr_size = size();
- if (count > max_size() - curr_size)
- detail::throw_exception<std::length_error>(
- "count > max_size() - curr_size");
- const std::size_t index = pos - curr_data;
- traits_type::move(&curr_data[index + count], pos, (end() - pos) + 1);
- traits_type::copy(&curr_data[index], s, count);
- this->set_size(curr_size + count);
- return curr_data + index;
- }
- } // static_strings
- } // boost
- #if defined(__GNUC__) && __GNUC__ >= 7
- #pragma GCC diagnostic pop
- #endif
- #if defined(__GNUC__) && __GNUC__ >= 8
- #pragma GCC diagnostic pop
- #endif
- #endif
- #endif
|