12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447 |
- #ifndef INCLUDE_NLOHMANN_JSON_HPP_
- #define INCLUDE_NLOHMANN_JSON_HPP_
- #define NLOHMANN_JSON_VERSION_MAJOR 3
- #define NLOHMANN_JSON_VERSION_MINOR 9
- #define NLOHMANN_JSON_VERSION_PATCH 1
- #include <algorithm> // all_of, find, for_each
- #include <cstddef> // nullptr_t, ptrdiff_t, size_t
- #include <functional> // hash, less
- #include <initializer_list> // initializer_list
- #include <iosfwd> // istream, ostream
- #include <iterator> // random_access_iterator_tag
- #include <memory> // unique_ptr
- #include <numeric> // accumulate
- #include <string> // string, stoi, to_string
- #include <utility> // declval, forward, move, pair, swap
- #include <vector> // vector
- #include <utility>
- #include <algorithm> // transform
- #include <array> // array
- #include <forward_list> // forward_list
- #include <iterator> // inserter, front_inserter, end
- #include <map> // map
- #include <string> // string
- #include <tuple> // tuple, make_tuple
- #include <type_traits> // is_arithmetic, is_same, is_enum, underlying_type, is_convertible
- #include <unordered_map> // unordered_map
- #include <utility> // pair, declval
- #include <valarray> // valarray
- #include <exception> // exception
- #include <stdexcept> // runtime_error
- #include <string> // to_string
- #include <cstddef> // size_t
- namespace nlohmann
- {
- namespace detail
- {
- struct position_t
- {
-
- std::size_t chars_read_total = 0;
-
- std::size_t chars_read_current_line = 0;
-
- std::size_t lines_read = 0;
-
- constexpr operator size_t() const
- {
- return chars_read_total;
- }
- };
- }
- }
- #include <utility> // pair
- #if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 13)
- #if defined(JSON_HEDLEY_VERSION)
- #undef JSON_HEDLEY_VERSION
- #endif
- #define JSON_HEDLEY_VERSION 13
- #if defined(JSON_HEDLEY_STRINGIFY_EX)
- #undef JSON_HEDLEY_STRINGIFY_EX
- #endif
- #define JSON_HEDLEY_STRINGIFY_EX(x) #x
- #if defined(JSON_HEDLEY_STRINGIFY)
- #undef JSON_HEDLEY_STRINGIFY
- #endif
- #define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x)
- #if defined(JSON_HEDLEY_CONCAT_EX)
- #undef JSON_HEDLEY_CONCAT_EX
- #endif
- #define JSON_HEDLEY_CONCAT_EX(a,b) a##b
- #if defined(JSON_HEDLEY_CONCAT)
- #undef JSON_HEDLEY_CONCAT
- #endif
- #define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b)
- #if defined(JSON_HEDLEY_CONCAT3_EX)
- #undef JSON_HEDLEY_CONCAT3_EX
- #endif
- #define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c
- #if defined(JSON_HEDLEY_CONCAT3)
- #undef JSON_HEDLEY_CONCAT3
- #endif
- #define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c)
- #if defined(JSON_HEDLEY_VERSION_ENCODE)
- #undef JSON_HEDLEY_VERSION_ENCODE
- #endif
- #define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision))
- #if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR)
- #undef JSON_HEDLEY_VERSION_DECODE_MAJOR
- #endif
- #define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000)
- #if defined(JSON_HEDLEY_VERSION_DECODE_MINOR)
- #undef JSON_HEDLEY_VERSION_DECODE_MINOR
- #endif
- #define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000)
- #if defined(JSON_HEDLEY_VERSION_DECODE_REVISION)
- #undef JSON_HEDLEY_VERSION_DECODE_REVISION
- #endif
- #define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000)
- #if defined(JSON_HEDLEY_GNUC_VERSION)
- #undef JSON_HEDLEY_GNUC_VERSION
- #endif
- #if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)
- #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
- #elif defined(__GNUC__)
- #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0)
- #endif
- #if defined(JSON_HEDLEY_GNUC_VERSION_CHECK)
- #undef JSON_HEDLEY_GNUC_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_GNUC_VERSION)
- #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_MSVC_VERSION)
- #undef JSON_HEDLEY_MSVC_VERSION
- #endif
- #if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000)
- #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100)
- #elif defined(_MSC_FULL_VER)
- #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10)
- #elif defined(_MSC_VER)
- #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0)
- #endif
- #if defined(JSON_HEDLEY_MSVC_VERSION_CHECK)
- #undef JSON_HEDLEY_MSVC_VERSION_CHECK
- #endif
- #if !defined(_MSC_VER)
- #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0)
- #elif defined(_MSC_VER) && (_MSC_VER >= 1400)
- #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch)))
- #elif defined(_MSC_VER) && (_MSC_VER >= 1200)
- #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch)))
- #else
- #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor)))
- #endif
- #if defined(JSON_HEDLEY_INTEL_VERSION)
- #undef JSON_HEDLEY_INTEL_VERSION
- #endif
- #if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE)
- #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE)
- #elif defined(__INTEL_COMPILER)
- #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)
- #endif
- #if defined(JSON_HEDLEY_INTEL_VERSION_CHECK)
- #undef JSON_HEDLEY_INTEL_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_INTEL_VERSION)
- #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_PGI_VERSION)
- #undef JSON_HEDLEY_PGI_VERSION
- #endif
- #if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)
- #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)
- #endif
- #if defined(JSON_HEDLEY_PGI_VERSION_CHECK)
- #undef JSON_HEDLEY_PGI_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_PGI_VERSION)
- #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_SUNPRO_VERSION)
- #undef JSON_HEDLEY_SUNPRO_VERSION
- #endif
- #if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000)
- #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10)
- #elif defined(__SUNPRO_C)
- #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf)
- #elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000)
- #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10)
- #elif defined(__SUNPRO_CC)
- #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf)
- #endif
- #if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK)
- #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_SUNPRO_VERSION)
- #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)
- #undef JSON_HEDLEY_EMSCRIPTEN_VERSION
- #endif
- #if defined(__EMSCRIPTEN__)
- #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__)
- #endif
- #if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK)
- #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)
- #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_ARM_VERSION)
- #undef JSON_HEDLEY_ARM_VERSION
- #endif
- #if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION)
- #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100)
- #elif defined(__CC_ARM) && defined(__ARMCC_VERSION)
- #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100)
- #endif
- #if defined(JSON_HEDLEY_ARM_VERSION_CHECK)
- #undef JSON_HEDLEY_ARM_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_ARM_VERSION)
- #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_IBM_VERSION)
- #undef JSON_HEDLEY_IBM_VERSION
- #endif
- #if defined(__ibmxl__)
- #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__)
- #elif defined(__xlC__) && defined(__xlC_ver__)
- #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff)
- #elif defined(__xlC__)
- #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0)
- #endif
- #if defined(JSON_HEDLEY_IBM_VERSION_CHECK)
- #undef JSON_HEDLEY_IBM_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_IBM_VERSION)
- #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_TI_VERSION)
- #undef JSON_HEDLEY_TI_VERSION
- #endif
- #if \
- defined(__TI_COMPILER_VERSION__) && \
- ( \
- defined(__TMS470__) || defined(__TI_ARM__) || \
- defined(__MSP430__) || \
- defined(__TMS320C2000__) \
- )
- #if (__TI_COMPILER_VERSION__ >= 16000000)
- #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
- #endif
- #endif
- #if defined(JSON_HEDLEY_TI_VERSION_CHECK)
- #undef JSON_HEDLEY_TI_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_TI_VERSION)
- #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_TI_CL2000_VERSION)
- #undef JSON_HEDLEY_TI_CL2000_VERSION
- #endif
- #if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__)
- #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
- #endif
- #if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK)
- #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_TI_CL2000_VERSION)
- #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_TI_CL430_VERSION)
- #undef JSON_HEDLEY_TI_CL430_VERSION
- #endif
- #if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__)
- #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
- #endif
- #if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK)
- #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_TI_CL430_VERSION)
- #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_TI_ARMCL_VERSION)
- #undef JSON_HEDLEY_TI_ARMCL_VERSION
- #endif
- #if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__))
- #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
- #endif
- #if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK)
- #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_TI_ARMCL_VERSION)
- #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_TI_CL6X_VERSION)
- #undef JSON_HEDLEY_TI_CL6X_VERSION
- #endif
- #if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__)
- #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
- #endif
- #if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK)
- #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_TI_CL6X_VERSION)
- #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_TI_CL7X_VERSION)
- #undef JSON_HEDLEY_TI_CL7X_VERSION
- #endif
- #if defined(__TI_COMPILER_VERSION__) && defined(__C7000__)
- #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
- #endif
- #if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK)
- #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_TI_CL7X_VERSION)
- #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_TI_CLPRU_VERSION)
- #undef JSON_HEDLEY_TI_CLPRU_VERSION
- #endif
- #if defined(__TI_COMPILER_VERSION__) && defined(__PRU__)
- #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
- #endif
- #if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK)
- #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_TI_CLPRU_VERSION)
- #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_CRAY_VERSION)
- #undef JSON_HEDLEY_CRAY_VERSION
- #endif
- #if defined(_CRAYC)
- #if defined(_RELEASE_PATCHLEVEL)
- #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL)
- #else
- #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0)
- #endif
- #endif
- #if defined(JSON_HEDLEY_CRAY_VERSION_CHECK)
- #undef JSON_HEDLEY_CRAY_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_CRAY_VERSION)
- #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_IAR_VERSION)
- #undef JSON_HEDLEY_IAR_VERSION
- #endif
- #if defined(__IAR_SYSTEMS_ICC__)
- #if __VER__ > 1000
- #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000))
- #else
- #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(VER / 100, __VER__ % 100, 0)
- #endif
- #endif
- #if defined(JSON_HEDLEY_IAR_VERSION_CHECK)
- #undef JSON_HEDLEY_IAR_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_IAR_VERSION)
- #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_TINYC_VERSION)
- #undef JSON_HEDLEY_TINYC_VERSION
- #endif
- #if defined(__TINYC__)
- #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100)
- #endif
- #if defined(JSON_HEDLEY_TINYC_VERSION_CHECK)
- #undef JSON_HEDLEY_TINYC_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_TINYC_VERSION)
- #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_DMC_VERSION)
- #undef JSON_HEDLEY_DMC_VERSION
- #endif
- #if defined(__DMC__)
- #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf)
- #endif
- #if defined(JSON_HEDLEY_DMC_VERSION_CHECK)
- #undef JSON_HEDLEY_DMC_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_DMC_VERSION)
- #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_COMPCERT_VERSION)
- #undef JSON_HEDLEY_COMPCERT_VERSION
- #endif
- #if defined(__COMPCERT_VERSION__)
- #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100)
- #endif
- #if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK)
- #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_COMPCERT_VERSION)
- #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_PELLES_VERSION)
- #undef JSON_HEDLEY_PELLES_VERSION
- #endif
- #if defined(__POCC__)
- #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0)
- #endif
- #if defined(JSON_HEDLEY_PELLES_VERSION_CHECK)
- #undef JSON_HEDLEY_PELLES_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_PELLES_VERSION)
- #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_GCC_VERSION)
- #undef JSON_HEDLEY_GCC_VERSION
- #endif
- #if \
- defined(JSON_HEDLEY_GNUC_VERSION) && \
- !defined(__clang__) && \
- !defined(JSON_HEDLEY_INTEL_VERSION) && \
- !defined(JSON_HEDLEY_PGI_VERSION) && \
- !defined(JSON_HEDLEY_ARM_VERSION) && \
- !defined(JSON_HEDLEY_TI_VERSION) && \
- !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \
- !defined(JSON_HEDLEY_TI_CL430_VERSION) && \
- !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \
- !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \
- !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \
- !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \
- !defined(__COMPCERT__)
- #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION
- #endif
- #if defined(JSON_HEDLEY_GCC_VERSION_CHECK)
- #undef JSON_HEDLEY_GCC_VERSION_CHECK
- #endif
- #if defined(JSON_HEDLEY_GCC_VERSION)
- #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
- #else
- #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0)
- #endif
- #if defined(JSON_HEDLEY_HAS_ATTRIBUTE)
- #undef JSON_HEDLEY_HAS_ATTRIBUTE
- #endif
- #if defined(__has_attribute)
- #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute)
- #else
- #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0)
- #endif
- #if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE)
- #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE
- #endif
- #if defined(__has_attribute)
- #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute)
- #else
- #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE)
- #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE
- #endif
- #if defined(__has_attribute)
- #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute)
- #else
- #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE)
- #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE
- #endif
- #if \
- defined(__has_cpp_attribute) && \
- defined(__cplusplus) && \
- (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0))
- #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute)
- #else
- #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0)
- #endif
- #if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS)
- #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS
- #endif
- #if !defined(__cplusplus) || !defined(__has_cpp_attribute)
- #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)
- #elif \
- !defined(JSON_HEDLEY_PGI_VERSION) && \
- !defined(JSON_HEDLEY_IAR_VERSION) && \
- (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \
- (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0))
- #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute)
- #else
- #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)
- #endif
- #if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE)
- #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
- #endif
- #if defined(__has_cpp_attribute) && defined(__cplusplus)
- #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)
- #else
- #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE)
- #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE
- #endif
- #if defined(__has_cpp_attribute) && defined(__cplusplus)
- #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)
- #else
- #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_HAS_BUILTIN)
- #undef JSON_HEDLEY_HAS_BUILTIN
- #endif
- #if defined(__has_builtin)
- #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin)
- #else
- #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0)
- #endif
- #if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN)
- #undef JSON_HEDLEY_GNUC_HAS_BUILTIN
- #endif
- #if defined(__has_builtin)
- #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)
- #else
- #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_GCC_HAS_BUILTIN)
- #undef JSON_HEDLEY_GCC_HAS_BUILTIN
- #endif
- #if defined(__has_builtin)
- #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)
- #else
- #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_HAS_FEATURE)
- #undef JSON_HEDLEY_HAS_FEATURE
- #endif
- #if defined(__has_feature)
- #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature)
- #else
- #define JSON_HEDLEY_HAS_FEATURE(feature) (0)
- #endif
- #if defined(JSON_HEDLEY_GNUC_HAS_FEATURE)
- #undef JSON_HEDLEY_GNUC_HAS_FEATURE
- #endif
- #if defined(__has_feature)
- #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)
- #else
- #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_GCC_HAS_FEATURE)
- #undef JSON_HEDLEY_GCC_HAS_FEATURE
- #endif
- #if defined(__has_feature)
- #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)
- #else
- #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_HAS_EXTENSION)
- #undef JSON_HEDLEY_HAS_EXTENSION
- #endif
- #if defined(__has_extension)
- #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension)
- #else
- #define JSON_HEDLEY_HAS_EXTENSION(extension) (0)
- #endif
- #if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION)
- #undef JSON_HEDLEY_GNUC_HAS_EXTENSION
- #endif
- #if defined(__has_extension)
- #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)
- #else
- #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_GCC_HAS_EXTENSION)
- #undef JSON_HEDLEY_GCC_HAS_EXTENSION
- #endif
- #if defined(__has_extension)
- #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)
- #else
- #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE)
- #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE
- #endif
- #if defined(__has_declspec_attribute)
- #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute)
- #else
- #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0)
- #endif
- #if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE)
- #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
- #endif
- #if defined(__has_declspec_attribute)
- #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)
- #else
- #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE)
- #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
- #endif
- #if defined(__has_declspec_attribute)
- #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)
- #else
- #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_HAS_WARNING)
- #undef JSON_HEDLEY_HAS_WARNING
- #endif
- #if defined(__has_warning)
- #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning)
- #else
- #define JSON_HEDLEY_HAS_WARNING(warning) (0)
- #endif
- #if defined(JSON_HEDLEY_GNUC_HAS_WARNING)
- #undef JSON_HEDLEY_GNUC_HAS_WARNING
- #endif
- #if defined(__has_warning)
- #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)
- #else
- #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_GCC_HAS_WARNING)
- #undef JSON_HEDLEY_GCC_HAS_WARNING
- #endif
- #if defined(__has_warning)
- #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)
- #else
- #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
- #endif
- #if defined(__cplusplus)
- # if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat")
- # if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions")
- # define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
- _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \
- xpr \
- JSON_HEDLEY_DIAGNOSTIC_POP
- # else
- # define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
- xpr \
- JSON_HEDLEY_DIAGNOSTIC_POP
- # endif
- # endif
- #endif
- #if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x
- #endif
- #if defined(JSON_HEDLEY_CONST_CAST)
- #undef JSON_HEDLEY_CONST_CAST
- #endif
- #if defined(__cplusplus)
- # define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast<T>(expr))
- #elif \
- JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- # define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \
- ((T) (expr)); \
- JSON_HEDLEY_DIAGNOSTIC_POP \
- }))
- #else
- # define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr))
- #endif
- #if defined(JSON_HEDLEY_REINTERPRET_CAST)
- #undef JSON_HEDLEY_REINTERPRET_CAST
- #endif
- #if defined(__cplusplus)
- #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast<T>(expr))
- #else
- #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr))
- #endif
- #if defined(JSON_HEDLEY_STATIC_CAST)
- #undef JSON_HEDLEY_STATIC_CAST
- #endif
- #if defined(__cplusplus)
- #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast<T>(expr))
- #else
- #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr))
- #endif
- #if defined(JSON_HEDLEY_CPP_CAST)
- #undef JSON_HEDLEY_CPP_CAST
- #endif
- #if defined(__cplusplus)
- # if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast")
- # define JSON_HEDLEY_CPP_CAST(T, expr) \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \
- ((T) (expr)) \
- JSON_HEDLEY_DIAGNOSTIC_POP
- # elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0)
- # define JSON_HEDLEY_CPP_CAST(T, expr) \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- _Pragma("diag_suppress=Pe137") \
- JSON_HEDLEY_DIAGNOSTIC_POP \
- # else
- # define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr))
- # endif
- #else
- # define JSON_HEDLEY_CPP_CAST(T, expr) (expr)
- #endif
- #if \
- (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
- defined(__clang__) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \
- JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
- JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \
- JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \
- (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR))
- #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value)
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
- #define JSON_HEDLEY_PRAGMA(value) __pragma(value)
- #else
- #define JSON_HEDLEY_PRAGMA(value)
- #endif
- #if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH)
- #undef JSON_HEDLEY_DIAGNOSTIC_PUSH
- #endif
- #if defined(JSON_HEDLEY_DIAGNOSTIC_POP)
- #undef JSON_HEDLEY_DIAGNOSTIC_POP
- #endif
- #if defined(__clang__)
- #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push")
- #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop")
- #elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
- #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
- #elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)
- #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
- #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push))
- #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop))
- #elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0)
- #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push")
- #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop")
- #elif \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
- #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push")
- #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop")
- #elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)
- #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
- #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
- #else
- #define JSON_HEDLEY_DIAGNOSTIC_PUSH
- #define JSON_HEDLEY_DIAGNOSTIC_POP
- #endif
- #if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED)
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
- #endif
- #if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations")
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
- #elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)")
- #elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444")
- #elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996))
- #elif \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718")
- #elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)")
- #elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)")
- #elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215")
- #elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)")
- #else
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
- #endif
- #if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS)
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
- #endif
- #if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"")
- #elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)")
- #elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675")
- #elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))
- #elif \
- JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
- #elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
- #elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161")
- #else
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
- #endif
- #if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES)
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
- #endif
- #if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes")
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"")
- #elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
- #elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)")
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030))
- #elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097")
- #elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)")
- #elif \
- JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173")
- #elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097")
- #else
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
- #endif
- #if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL)
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
- #endif
- #if JSON_HEDLEY_HAS_WARNING("-Wcast-qual")
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"")
- #elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)")
- #elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0)
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"")
- #else
- #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
- #endif
- #if defined(JSON_HEDLEY_DEPRECATED)
- #undef JSON_HEDLEY_DEPRECATED
- #endif
- #if defined(JSON_HEDLEY_DEPRECATED_FOR)
- #undef JSON_HEDLEY_DEPRECATED_FOR
- #endif
- #if JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0)
- #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since))
- #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement))
- #elif defined(__cplusplus) && (__cplusplus >= 201402L)
- #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]])
- #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]])
- #elif \
- JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \
- JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)
- #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since)))
- #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement)))
- #elif \
- JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
- #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))
- #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))
- #elif \
- JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
- JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0)
- #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated)
- #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)
- #elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
- #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated")
- #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated")
- #else
- #define JSON_HEDLEY_DEPRECATED(since)
- #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement)
- #endif
- #if defined(JSON_HEDLEY_UNAVAILABLE)
- #undef JSON_HEDLEY_UNAVAILABLE
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since)))
- #else
- #define JSON_HEDLEY_UNAVAILABLE(available_since)
- #endif
- #if defined(JSON_HEDLEY_WARN_UNUSED_RESULT)
- #undef JSON_HEDLEY_WARN_UNUSED_RESULT
- #endif
- #if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG)
- #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG
- #endif
- #if (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L)
- #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
- #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]])
- #elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard)
- #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
- #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
- #elif \
- JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
- (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \
- JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
- #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
- #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__))
- #elif defined(_Check_return_)
- #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_
- #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_
- #else
- #define JSON_HEDLEY_WARN_UNUSED_RESULT
- #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg)
- #endif
- #if defined(JSON_HEDLEY_SENTINEL)
- #undef JSON_HEDLEY_SENTINEL
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0)
- #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position)))
- #else
- #define JSON_HEDLEY_SENTINEL(position)
- #endif
- #if defined(JSON_HEDLEY_NO_RETURN)
- #undef JSON_HEDLEY_NO_RETURN
- #endif
- #if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
- #define JSON_HEDLEY_NO_RETURN __noreturn
- #elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))
- #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
- #define JSON_HEDLEY_NO_RETURN _Noreturn
- #elif defined(__cplusplus) && (__cplusplus >= 201103L)
- #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]])
- #elif \
- JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
- #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))
- #elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
- #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return")
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0)
- #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)
- #elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)
- #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;")
- #elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)
- #define JSON_HEDLEY_NO_RETURN __attribute((noreturn))
- #elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)
- #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)
- #else
- #define JSON_HEDLEY_NO_RETURN
- #endif
- #if defined(JSON_HEDLEY_NO_ESCAPE)
- #undef JSON_HEDLEY_NO_ESCAPE
- #endif
- #if JSON_HEDLEY_HAS_ATTRIBUTE(noescape)
- #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__))
- #else
- #define JSON_HEDLEY_NO_ESCAPE
- #endif
- #if defined(JSON_HEDLEY_UNREACHABLE)
- #undef JSON_HEDLEY_UNREACHABLE
- #endif
- #if defined(JSON_HEDLEY_UNREACHABLE_RETURN)
- #undef JSON_HEDLEY_UNREACHABLE_RETURN
- #endif
- #if defined(JSON_HEDLEY_ASSUME)
- #undef JSON_HEDLEY_ASSUME
- #endif
- #if \
- JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- #define JSON_HEDLEY_ASSUME(expr) __assume(expr)
- #elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume)
- #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr)
- #elif \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)
- #if defined(__cplusplus)
- #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr)
- #else
- #define JSON_HEDLEY_ASSUME(expr) _nassert(expr)
- #endif
- #endif
- #if \
- (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \
- JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5)
- #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable()
- #elif defined(JSON_HEDLEY_ASSUME)
- #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)
- #endif
- #if !defined(JSON_HEDLEY_ASSUME)
- #if defined(JSON_HEDLEY_UNREACHABLE)
- #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1)))
- #else
- #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr)
- #endif
- #endif
- #if defined(JSON_HEDLEY_UNREACHABLE)
- #if \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)
- #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value))
- #else
- #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE()
- #endif
- #else
- #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value)
- #endif
- #if !defined(JSON_HEDLEY_UNREACHABLE)
- #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)
- #endif
- JSON_HEDLEY_DIAGNOSTIC_PUSH
- #if JSON_HEDLEY_HAS_WARNING("-Wpedantic")
- #pragma clang diagnostic ignored "-Wpedantic"
- #endif
- #if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus)
- #pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
- #endif
- #if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0)
- #if defined(__clang__)
- #pragma clang diagnostic ignored "-Wvariadic-macros"
- #elif defined(JSON_HEDLEY_GCC_VERSION)
- #pragma GCC diagnostic ignored "-Wvariadic-macros"
- #endif
- #endif
- #if defined(JSON_HEDLEY_NON_NULL)
- #undef JSON_HEDLEY_NON_NULL
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)
- #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))
- #else
- #define JSON_HEDLEY_NON_NULL(...)
- #endif
- JSON_HEDLEY_DIAGNOSTIC_POP
- #if defined(JSON_HEDLEY_PRINTF_FORMAT)
- #undef JSON_HEDLEY_PRINTF_FORMAT
- #endif
- #if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO)
- #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check)))
- #elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO)
- #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check)))
- #elif \
- JSON_HEDLEY_HAS_ATTRIBUTE(format) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
- #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check)))
- #elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0)
- #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check))
- #else
- #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check)
- #endif
- #if defined(JSON_HEDLEY_CONSTEXPR)
- #undef JSON_HEDLEY_CONSTEXPR
- #endif
- #if defined(__cplusplus)
- #if __cplusplus >= 201103L
- #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr)
- #endif
- #endif
- #if !defined(JSON_HEDLEY_CONSTEXPR)
- #define JSON_HEDLEY_CONSTEXPR
- #endif
- #if defined(JSON_HEDLEY_PREDICT)
- #undef JSON_HEDLEY_PREDICT
- #endif
- #if defined(JSON_HEDLEY_LIKELY)
- #undef JSON_HEDLEY_LIKELY
- #endif
- #if defined(JSON_HEDLEY_UNLIKELY)
- #undef JSON_HEDLEY_UNLIKELY
- #endif
- #if defined(JSON_HEDLEY_UNPREDICTABLE)
- #undef JSON_HEDLEY_UNPREDICTABLE
- #endif
- #if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable)
- #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr))
- #endif
- #if \
- JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0)
- # define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability))
- # define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability))
- # define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability))
- # define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 )
- # define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 )
- #elif \
- JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
- JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \
- JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0)
- # define JSON_HEDLEY_PREDICT(expr, expected, probability) \
- (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)))
- # define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \
- (__extension__ ({ \
- double hedley_probability_ = (probability); \
- ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \
- }))
- # define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \
- (__extension__ ({ \
- double hedley_probability_ = (probability); \
- ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \
- }))
- # define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1)
- # define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
- #else
- # define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))
- # define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr))
- # define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr))
- # define JSON_HEDLEY_LIKELY(expr) (!!(expr))
- # define JSON_HEDLEY_UNLIKELY(expr) (!!(expr))
- #endif
- #if !defined(JSON_HEDLEY_UNPREDICTABLE)
- #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5)
- #endif
- #if defined(JSON_HEDLEY_MALLOC)
- #undef JSON_HEDLEY_MALLOC
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
- #define JSON_HEDLEY_MALLOC __attribute__((__malloc__))
- #elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
- #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory")
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(14, 0, 0)
- #define JSON_HEDLEY_MALLOC __declspec(restrict)
- #else
- #define JSON_HEDLEY_MALLOC
- #endif
- #if defined(JSON_HEDLEY_PURE)
- #undef JSON_HEDLEY_PURE
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
- JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
- # define JSON_HEDLEY_PURE __attribute__((__pure__))
- #elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
- # define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data")
- #elif defined(__cplusplus) && \
- ( \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \
- )
- # define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;")
- #else
- # define JSON_HEDLEY_PURE
- #endif
- #if defined(JSON_HEDLEY_CONST)
- #undef JSON_HEDLEY_CONST
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(const) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
- JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
- #define JSON_HEDLEY_CONST __attribute__((__const__))
- #elif \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
- #define JSON_HEDLEY_CONST _Pragma("no_side_effect")
- #else
- #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE
- #endif
- #if defined(JSON_HEDLEY_RESTRICT)
- #undef JSON_HEDLEY_RESTRICT
- #endif
- #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus)
- #define JSON_HEDLEY_RESTRICT restrict
- #elif \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
- JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
- JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \
- JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \
- defined(__clang__)
- #define JSON_HEDLEY_RESTRICT __restrict
- #elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus)
- #define JSON_HEDLEY_RESTRICT _Restrict
- #else
- #define JSON_HEDLEY_RESTRICT
- #endif
- #if defined(JSON_HEDLEY_INLINE)
- #undef JSON_HEDLEY_INLINE
- #endif
- #if \
- (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
- (defined(__cplusplus) && (__cplusplus >= 199711L))
- #define JSON_HEDLEY_INLINE inline
- #elif \
- defined(JSON_HEDLEY_GCC_VERSION) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0)
- #define JSON_HEDLEY_INLINE __inline__
- #elif \
- JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
- #define JSON_HEDLEY_INLINE __inline
- #else
- #define JSON_HEDLEY_INLINE
- #endif
- #if defined(JSON_HEDLEY_ALWAYS_INLINE)
- #undef JSON_HEDLEY_ALWAYS_INLINE
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
- # define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0)
- # define JSON_HEDLEY_ALWAYS_INLINE __forceinline
- #elif defined(__cplusplus) && \
- ( \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \
- )
- # define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;")
- #elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
- # define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced")
- #else
- # define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE
- #endif
- #if defined(JSON_HEDLEY_NEVER_INLINE)
- #undef JSON_HEDLEY_NEVER_INLINE
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
- JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
- (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
- (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
- (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
- JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
- JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
- #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__))
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0)
- #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)
- #elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0)
- #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline")
- #elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)
- #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;")
- #elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
- #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never")
- #elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)
- #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline))
- #elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)
- #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)
- #else
- #define JSON_HEDLEY_NEVER_INLINE
- #endif
- #if defined(JSON_HEDLEY_PRIVATE)
- #undef JSON_HEDLEY_PRIVATE
- #endif
- #if defined(JSON_HEDLEY_PUBLIC)
- #undef JSON_HEDLEY_PUBLIC
- #endif
- #if defined(JSON_HEDLEY_IMPORT)
- #undef JSON_HEDLEY_IMPORT
- #endif
- #if defined(_WIN32) || defined(__CYGWIN__)
- # define JSON_HEDLEY_PRIVATE
- # define JSON_HEDLEY_PUBLIC __declspec(dllexport)
- # define JSON_HEDLEY_IMPORT __declspec(dllimport)
- #else
- # if \
- JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
- JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
- ( \
- defined(__TI_EABI__) && \
- ( \
- (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \
- ) \
- )
- # define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden")))
- # define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default")))
- # else
- # define JSON_HEDLEY_PRIVATE
- # define JSON_HEDLEY_PUBLIC
- # endif
- # define JSON_HEDLEY_IMPORT extern
- #endif
- #if defined(JSON_HEDLEY_NO_THROW)
- #undef JSON_HEDLEY_NO_THROW
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__))
- #elif \
- JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)
- #define JSON_HEDLEY_NO_THROW __declspec(nothrow)
- #else
- #define JSON_HEDLEY_NO_THROW
- #endif
- #if defined(JSON_HEDLEY_FALL_THROUGH)
- #undef JSON_HEDLEY_FALL_THROUGH
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0)
- #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__))
- #elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough)
- #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]])
- #elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough)
- #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]])
- #elif defined(__fallthrough)
- #define JSON_HEDLEY_FALL_THROUGH __fallthrough
- #else
- #define JSON_HEDLEY_FALL_THROUGH
- #endif
- #if defined(JSON_HEDLEY_RETURNS_NON_NULL)
- #undef JSON_HEDLEY_RETURNS_NON_NULL
- #endif
- #if \
- JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
- #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__))
- #elif defined(_Ret_notnull_)
- #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_
- #else
- #define JSON_HEDLEY_RETURNS_NON_NULL
- #endif
- #if defined(JSON_HEDLEY_ARRAY_PARAM)
- #undef JSON_HEDLEY_ARRAY_PARAM
- #endif
- #if \
- defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
- !defined(__STDC_NO_VLA__) && \
- !defined(__cplusplus) && \
- !defined(JSON_HEDLEY_PGI_VERSION) && \
- !defined(JSON_HEDLEY_TINYC_VERSION)
- #define JSON_HEDLEY_ARRAY_PARAM(name) (name)
- #else
- #define JSON_HEDLEY_ARRAY_PARAM(name)
- #endif
- #if defined(JSON_HEDLEY_IS_CONSTANT)
- #undef JSON_HEDLEY_IS_CONSTANT
- #endif
- #if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR)
- #undef JSON_HEDLEY_REQUIRE_CONSTEXPR
- #endif
- #if defined(JSON_HEDLEY_IS_CONSTEXPR_)
- #undef JSON_HEDLEY_IS_CONSTEXPR_
- #endif
- #if \
- JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
- JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
- (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \
- JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0)
- #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr)
- #endif
- #if !defined(__cplusplus)
- # if \
- JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
- JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \
- JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24)
- #if defined(__INTPTR_TYPE__)
- #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*)
- #else
- #include <stdint.h>
- #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*)
- #endif
- # elif \
- ( \
- defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \
- !defined(JSON_HEDLEY_SUNPRO_VERSION) && \
- !defined(JSON_HEDLEY_PGI_VERSION) && \
- !defined(JSON_HEDLEY_IAR_VERSION)) || \
- JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \
- JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \
- JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0)
- #if defined(__INTPTR_TYPE__)
- #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0)
- #else
- #include <stdint.h>
- #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0)
- #endif
- # elif \
- defined(JSON_HEDLEY_GCC_VERSION) || \
- defined(JSON_HEDLEY_INTEL_VERSION) || \
- defined(JSON_HEDLEY_TINYC_VERSION) || \
- defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \
- JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \
- defined(JSON_HEDLEY_TI_CL2000_VERSION) || \
- defined(JSON_HEDLEY_TI_CL6X_VERSION) || \
- defined(JSON_HEDLEY_TI_CL7X_VERSION) || \
- defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \
- defined(__clang__)
- # define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \
- sizeof(void) != \
- sizeof(*( \
- 1 ? \
- ((void*) ((expr) * 0L) ) : \
- ((struct { char v[sizeof(void) * 2]; } *) 1) \
- ) \
- ) \
- )
- # endif
- #endif
- #if defined(JSON_HEDLEY_IS_CONSTEXPR_)
- #if !defined(JSON_HEDLEY_IS_CONSTANT)
- #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr)
- #endif
- #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1))
- #else
- #if !defined(JSON_HEDLEY_IS_CONSTANT)
- #define JSON_HEDLEY_IS_CONSTANT(expr) (0)
- #endif
- #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr)
- #endif
- #if defined(JSON_HEDLEY_BEGIN_C_DECLS)
- #undef JSON_HEDLEY_BEGIN_C_DECLS
- #endif
- #if defined(JSON_HEDLEY_END_C_DECLS)
- #undef JSON_HEDLEY_END_C_DECLS
- #endif
- #if defined(JSON_HEDLEY_C_DECL)
- #undef JSON_HEDLEY_C_DECL
- #endif
- #if defined(__cplusplus)
- #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" {
- #define JSON_HEDLEY_END_C_DECLS }
- #define JSON_HEDLEY_C_DECL extern "C"
- #else
- #define JSON_HEDLEY_BEGIN_C_DECLS
- #define JSON_HEDLEY_END_C_DECLS
- #define JSON_HEDLEY_C_DECL
- #endif
- #if defined(JSON_HEDLEY_STATIC_ASSERT)
- #undef JSON_HEDLEY_STATIC_ASSERT
- #endif
- #if \
- !defined(__cplusplus) && ( \
- (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \
- JSON_HEDLEY_HAS_FEATURE(c_static_assert) || \
- JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
- defined(_Static_assert) \
- )
- # define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message)
- #elif \
- (defined(__cplusplus) && (__cplusplus >= 201103L)) || \
- JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0)
- # define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message))
- #else
- # define JSON_HEDLEY_STATIC_ASSERT(expr, message)
- #endif
- #if defined(JSON_HEDLEY_NULL)
- #undef JSON_HEDLEY_NULL
- #endif
- #if defined(__cplusplus)
- #if __cplusplus >= 201103L
- #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr)
- #elif defined(NULL)
- #define JSON_HEDLEY_NULL NULL
- #else
- #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0)
- #endif
- #elif defined(NULL)
- #define JSON_HEDLEY_NULL NULL
- #else
- #define JSON_HEDLEY_NULL ((void*) 0)
- #endif
- #if defined(JSON_HEDLEY_MESSAGE)
- #undef JSON_HEDLEY_MESSAGE
- #endif
- #if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
- # define JSON_HEDLEY_MESSAGE(msg) \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
- JSON_HEDLEY_PRAGMA(message msg) \
- JSON_HEDLEY_DIAGNOSTIC_POP
- #elif \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- # define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg)
- #elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0)
- # define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg)
- #elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
- # define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))
- #elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0)
- # define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))
- #else
- # define JSON_HEDLEY_MESSAGE(msg)
- #endif
- #if defined(JSON_HEDLEY_WARNING)
- #undef JSON_HEDLEY_WARNING
- #endif
- #if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
- # define JSON_HEDLEY_WARNING(msg) \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
- JSON_HEDLEY_PRAGMA(clang warning msg) \
- JSON_HEDLEY_DIAGNOSTIC_POP
- #elif \
- JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \
- JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \
- JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
- # define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg)
- #elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
- # define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg))
- #else
- # define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg)
- #endif
- #if defined(JSON_HEDLEY_REQUIRE)
- #undef JSON_HEDLEY_REQUIRE
- #endif
- #if defined(JSON_HEDLEY_REQUIRE_MSG)
- #undef JSON_HEDLEY_REQUIRE_MSG
- #endif
- #if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if)
- # if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat")
- # define JSON_HEDLEY_REQUIRE(expr) \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
- __attribute__((diagnose_if(!(expr), #expr, "error"))) \
- JSON_HEDLEY_DIAGNOSTIC_POP
- # define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
- __attribute__((diagnose_if(!(expr), msg, "error"))) \
- JSON_HEDLEY_DIAGNOSTIC_POP
- # else
- # define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error")))
- # define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error")))
- # endif
- #else
- # define JSON_HEDLEY_REQUIRE(expr)
- # define JSON_HEDLEY_REQUIRE_MSG(expr,msg)
- #endif
- #if defined(JSON_HEDLEY_FLAGS)
- #undef JSON_HEDLEY_FLAGS
- #endif
- #if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum)
- #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__))
- #endif
- #if defined(JSON_HEDLEY_FLAGS_CAST)
- #undef JSON_HEDLEY_FLAGS_CAST
- #endif
- #if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0)
- # define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \
- JSON_HEDLEY_DIAGNOSTIC_PUSH \
- _Pragma("warning(disable:188)") \
- ((T) (expr)); \
- JSON_HEDLEY_DIAGNOSTIC_POP \
- }))
- #else
- # define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr)
- #endif
- #if defined(JSON_HEDLEY_EMPTY_BASES)
- #undef JSON_HEDLEY_EMPTY_BASES
- #endif
- #if JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)
- #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases)
- #else
- #define JSON_HEDLEY_EMPTY_BASES
- #endif
- #if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK)
- #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
- #endif
- #if defined(__clang__)
- #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0)
- #else
- #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
- #endif
- #if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE)
- #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE
- #endif
- #define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)
- #if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE)
- #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
- #endif
- #define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute)
- #if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN)
- #undef JSON_HEDLEY_CLANG_HAS_BUILTIN
- #endif
- #define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin)
- #if defined(JSON_HEDLEY_CLANG_HAS_FEATURE)
- #undef JSON_HEDLEY_CLANG_HAS_FEATURE
- #endif
- #define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature)
- #if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION)
- #undef JSON_HEDLEY_CLANG_HAS_EXTENSION
- #endif
- #define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension)
- #if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE)
- #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
- #endif
- #define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute)
- #if defined(JSON_HEDLEY_CLANG_HAS_WARNING)
- #undef JSON_HEDLEY_CLANG_HAS_WARNING
- #endif
- #define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning)
- #endif
- #if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
- #if defined(__clang__)
- #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
- #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
- #endif
- #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
- #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
- #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
- #endif
- #endif
- #endif
- #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
- #define JSON_HAS_CPP_20
- #define JSON_HAS_CPP_17
- #define JSON_HAS_CPP_14
- #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1)
- #define JSON_HAS_CPP_17
- #define JSON_HAS_CPP_14
- #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
- #define JSON_HAS_CPP_14
- #endif
- #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wfloat-equal"
- #endif
- #if defined(__clang__)
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wdocumentation"
- #endif
- #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
- #define JSON_THROW(exception) throw exception
- #define JSON_TRY try
- #define JSON_CATCH(exception) catch(exception)
- #define JSON_INTERNAL_CATCH(exception) catch(exception)
- #else
- #include <cstdlib>
- #define JSON_THROW(exception) std::abort()
- #define JSON_TRY if(true)
- #define JSON_CATCH(exception) if(false)
- #define JSON_INTERNAL_CATCH(exception) if(false)
- #endif
- #if defined(JSON_THROW_USER)
- #undef JSON_THROW
- #define JSON_THROW JSON_THROW_USER
- #endif
- #if defined(JSON_TRY_USER)
- #undef JSON_TRY
- #define JSON_TRY JSON_TRY_USER
- #endif
- #if defined(JSON_CATCH_USER)
- #undef JSON_CATCH
- #define JSON_CATCH JSON_CATCH_USER
- #undef JSON_INTERNAL_CATCH
- #define JSON_INTERNAL_CATCH JSON_CATCH_USER
- #endif
- #if defined(JSON_INTERNAL_CATCH_USER)
- #undef JSON_INTERNAL_CATCH
- #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER
- #endif
- #if !defined(JSON_ASSERT)
- #include <cassert> // assert
- #define JSON_ASSERT(x) assert(x)
- #endif
- #define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \
- template<typename BasicJsonType> \
- inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \
- { \
- static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
- static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
- auto it = std::find_if(std::begin(m), std::end(m), \
- [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
- { \
- return ej_pair.first == e; \
- }); \
- j = ((it != std::end(m)) ? it : std::begin(m))->second; \
- } \
- template<typename BasicJsonType> \
- inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \
- { \
- static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
- static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
- auto it = std::find_if(std::begin(m), std::end(m), \
- [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
- { \
- return ej_pair.second == j; \
- }); \
- e = ((it != std::end(m)) ? it : std::begin(m))->first; \
- }
- #define NLOHMANN_BASIC_JSON_TPL_DECLARATION \
- template<template<typename, typename, typename...> class ObjectType, \
- template<typename, typename...> class ArrayType, \
- class StringType, class BooleanType, class NumberIntegerType, \
- class NumberUnsignedType, class NumberFloatType, \
- template<typename> class AllocatorType, \
- template<typename, typename = void> class JSONSerializer, \
- class BinaryType>
- #define NLOHMANN_BASIC_JSON_TPL \
- basic_json<ObjectType, ArrayType, StringType, BooleanType, \
- NumberIntegerType, NumberUnsignedType, NumberFloatType, \
- AllocatorType, JSONSerializer, BinaryType>
- #define NLOHMANN_JSON_EXPAND( x ) x
- #define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME
- #define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \
- NLOHMANN_JSON_PASTE64, \
- NLOHMANN_JSON_PASTE63, \
- NLOHMANN_JSON_PASTE62, \
- NLOHMANN_JSON_PASTE61, \
- NLOHMANN_JSON_PASTE60, \
- NLOHMANN_JSON_PASTE59, \
- NLOHMANN_JSON_PASTE58, \
- NLOHMANN_JSON_PASTE57, \
- NLOHMANN_JSON_PASTE56, \
- NLOHMANN_JSON_PASTE55, \
- NLOHMANN_JSON_PASTE54, \
- NLOHMANN_JSON_PASTE53, \
- NLOHMANN_JSON_PASTE52, \
- NLOHMANN_JSON_PASTE51, \
- NLOHMANN_JSON_PASTE50, \
- NLOHMANN_JSON_PASTE49, \
- NLOHMANN_JSON_PASTE48, \
- NLOHMANN_JSON_PASTE47, \
- NLOHMANN_JSON_PASTE46, \
- NLOHMANN_JSON_PASTE45, \
- NLOHMANN_JSON_PASTE44, \
- NLOHMANN_JSON_PASTE43, \
- NLOHMANN_JSON_PASTE42, \
- NLOHMANN_JSON_PASTE41, \
- NLOHMANN_JSON_PASTE40, \
- NLOHMANN_JSON_PASTE39, \
- NLOHMANN_JSON_PASTE38, \
- NLOHMANN_JSON_PASTE37, \
- NLOHMANN_JSON_PASTE36, \
- NLOHMANN_JSON_PASTE35, \
- NLOHMANN_JSON_PASTE34, \
- NLOHMANN_JSON_PASTE33, \
- NLOHMANN_JSON_PASTE32, \
- NLOHMANN_JSON_PASTE31, \
- NLOHMANN_JSON_PASTE30, \
- NLOHMANN_JSON_PASTE29, \
- NLOHMANN_JSON_PASTE28, \
- NLOHMANN_JSON_PASTE27, \
- NLOHMANN_JSON_PASTE26, \
- NLOHMANN_JSON_PASTE25, \
- NLOHMANN_JSON_PASTE24, \
- NLOHMANN_JSON_PASTE23, \
- NLOHMANN_JSON_PASTE22, \
- NLOHMANN_JSON_PASTE21, \
- NLOHMANN_JSON_PASTE20, \
- NLOHMANN_JSON_PASTE19, \
- NLOHMANN_JSON_PASTE18, \
- NLOHMANN_JSON_PASTE17, \
- NLOHMANN_JSON_PASTE16, \
- NLOHMANN_JSON_PASTE15, \
- NLOHMANN_JSON_PASTE14, \
- NLOHMANN_JSON_PASTE13, \
- NLOHMANN_JSON_PASTE12, \
- NLOHMANN_JSON_PASTE11, \
- NLOHMANN_JSON_PASTE10, \
- NLOHMANN_JSON_PASTE9, \
- NLOHMANN_JSON_PASTE8, \
- NLOHMANN_JSON_PASTE7, \
- NLOHMANN_JSON_PASTE6, \
- NLOHMANN_JSON_PASTE5, \
- NLOHMANN_JSON_PASTE4, \
- NLOHMANN_JSON_PASTE3, \
- NLOHMANN_JSON_PASTE2, \
- NLOHMANN_JSON_PASTE1)(__VA_ARGS__))
- #define NLOHMANN_JSON_PASTE2(func, v1) func(v1)
- #define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2)
- #define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3)
- #define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4)
- #define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5)
- #define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6)
- #define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7)
- #define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8)
- #define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9)
- #define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10)
- #define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)
- #define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)
- #define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)
- #define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14)
- #define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)
- #define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16)
- #define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17)
- #define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18)
- #define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19)
- #define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20)
- #define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21)
- #define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22)
- #define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)
- #define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24)
- #define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25)
- #define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26)
- #define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27)
- #define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28)
- #define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29)
- #define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30)
- #define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31)
- #define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32)
- #define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33)
- #define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34)
- #define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35)
- #define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36)
- #define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37)
- #define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38)
- #define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39)
- #define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40)
- #define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41)
- #define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42)
- #define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43)
- #define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)
- #define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45)
- #define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46)
- #define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47)
- #define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48)
- #define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49)
- #define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50)
- #define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51)
- #define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52)
- #define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53)
- #define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54)
- #define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)
- #define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)
- #define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)
- #define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)
- #define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59)
- #define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60)
- #define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61)
- #define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62)
- #define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63)
- #define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1;
- #define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1);
- #define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \
- friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
- friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
- #define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \
- inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
- inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
- #ifndef JSON_USE_IMPLICIT_CONVERSIONS
- #define JSON_USE_IMPLICIT_CONVERSIONS 1
- #endif
- #if JSON_USE_IMPLICIT_CONVERSIONS
- #define JSON_EXPLICIT
- #else
- #define JSON_EXPLICIT explicit
- #endif
- namespace nlohmann
- {
- namespace detail
- {
- class exception : public std::exception
- {
- public:
-
- JSON_HEDLEY_RETURNS_NON_NULL
- const char* what() const noexcept override
- {
- return m.what();
- }
-
- const int id;
- protected:
- JSON_HEDLEY_NON_NULL(3)
- exception(int id_, const char* what_arg) : id(id_), m(what_arg) {}
- static std::string name(const std::string& ename, int id_)
- {
- return "[json.exception." + ename + "." + std::to_string(id_) + "] ";
- }
- private:
-
- std::runtime_error m;
- };
- class parse_error : public exception
- {
- public:
-
- static parse_error create(int id_, const position_t& pos, const std::string& what_arg)
- {
- std::string w = exception::name("parse_error", id_) + "parse error" +
- position_string(pos) + ": " + what_arg;
- return parse_error(id_, pos.chars_read_total, w.c_str());
- }
- static parse_error create(int id_, std::size_t byte_, const std::string& what_arg)
- {
- std::string w = exception::name("parse_error", id_) + "parse error" +
- (byte_ != 0 ? (" at byte " + std::to_string(byte_)) : "") +
- ": " + what_arg;
- return parse_error(id_, byte_, w.c_str());
- }
-
- const std::size_t byte;
- private:
- parse_error(int id_, std::size_t byte_, const char* what_arg)
- : exception(id_, what_arg), byte(byte_) {}
- static std::string position_string(const position_t& pos)
- {
- return " at line " + std::to_string(pos.lines_read + 1) +
- ", column " + std::to_string(pos.chars_read_current_line);
- }
- };
- class invalid_iterator : public exception
- {
- public:
- static invalid_iterator create(int id_, const std::string& what_arg)
- {
- std::string w = exception::name("invalid_iterator", id_) + what_arg;
- return invalid_iterator(id_, w.c_str());
- }
- private:
- JSON_HEDLEY_NON_NULL(3)
- invalid_iterator(int id_, const char* what_arg)
- : exception(id_, what_arg) {}
- };
- class type_error : public exception
- {
- public:
- static type_error create(int id_, const std::string& what_arg)
- {
- std::string w = exception::name("type_error", id_) + what_arg;
- return type_error(id_, w.c_str());
- }
- private:
- JSON_HEDLEY_NON_NULL(3)
- type_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
- };
- class out_of_range : public exception
- {
- public:
- static out_of_range create(int id_, const std::string& what_arg)
- {
- std::string w = exception::name("out_of_range", id_) + what_arg;
- return out_of_range(id_, w.c_str());
- }
- private:
- JSON_HEDLEY_NON_NULL(3)
- out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {}
- };
- class other_error : public exception
- {
- public:
- static other_error create(int id_, const std::string& what_arg)
- {
- std::string w = exception::name("other_error", id_) + what_arg;
- return other_error(id_, w.c_str());
- }
- private:
- JSON_HEDLEY_NON_NULL(3)
- other_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
- };
- }
- }
- #include <cstddef> // size_t
- #include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type
- namespace nlohmann
- {
- namespace detail
- {
- template<bool B, typename T = void>
- using enable_if_t = typename std::enable_if<B, T>::type;
- template<typename T>
- using uncvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
- template<std::size_t... Ints>
- struct index_sequence
- {
- using type = index_sequence;
- using value_type = std::size_t;
- static constexpr std::size_t size() noexcept
- {
- return sizeof...(Ints);
- }
- };
- template<class Sequence1, class Sequence2>
- struct merge_and_renumber;
- template<std::size_t... I1, std::size_t... I2>
- struct merge_and_renumber<index_sequence<I1...>, index_sequence<I2...>>
- : index_sequence < I1..., (sizeof...(I1) + I2)... > {};
- template<std::size_t N>
- struct make_index_sequence
- : merge_and_renumber < typename make_index_sequence < N / 2 >::type,
- typename make_index_sequence < N - N / 2 >::type > {};
- template<> struct make_index_sequence<0> : index_sequence<> {};
- template<> struct make_index_sequence<1> : index_sequence<0> {};
- template<typename... Ts>
- using index_sequence_for = make_index_sequence<sizeof...(Ts)>;
- template<unsigned N> struct priority_tag : priority_tag < N - 1 > {};
- template<> struct priority_tag<0> {};
- template<typename T>
- struct static_const
- {
- static constexpr T value{};
- };
- template<typename T>
- constexpr T static_const<T>::value;
- }
- }
- #include <limits> // numeric_limits
- #include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type
- #include <utility> // declval
- #include <iterator> // random_access_iterator_tag
- namespace nlohmann
- {
- namespace detail
- {
- template<typename ...Ts> struct make_void
- {
- using type = void;
- };
- template<typename ...Ts> using void_t = typename make_void<Ts...>::type;
- }
- }
- namespace nlohmann
- {
- namespace detail
- {
- template<typename It, typename = void>
- struct iterator_types {};
- template<typename It>
- struct iterator_types <
- It,
- void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
- typename It::reference, typename It::iterator_category >>
- {
- using difference_type = typename It::difference_type;
- using value_type = typename It::value_type;
- using pointer = typename It::pointer;
- using reference = typename It::reference;
- using iterator_category = typename It::iterator_category;
- };
- template<typename T, typename = void>
- struct iterator_traits
- {
- };
- template<typename T>
- struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
- : iterator_types<T>
- {
- };
- template<typename T>
- struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
- {
- using iterator_category = std::random_access_iterator_tag;
- using value_type = T;
- using difference_type = ptrdiff_t;
- using pointer = T*;
- using reference = T&;
- };
- }
- }
- #include <type_traits>
- namespace nlohmann
- {
- namespace detail
- {
- struct nonesuch
- {
- nonesuch() = delete;
- ~nonesuch() = delete;
- nonesuch(nonesuch const&) = delete;
- nonesuch(nonesuch const&&) = delete;
- void operator=(nonesuch const&) = delete;
- void operator=(nonesuch&&) = delete;
- };
- template<class Default,
- class AlwaysVoid,
- template<class...> class Op,
- class... Args>
- struct detector
- {
- using value_t = std::false_type;
- using type = Default;
- };
- template<class Default, template<class...> class Op, class... Args>
- struct detector<Default, void_t<Op<Args...>>, Op, Args...>
- {
- using value_t = std::true_type;
- using type = Op<Args...>;
- };
- template<template<class...> class Op, class... Args>
- using is_detected = typename detector<nonesuch, void, Op, Args...>::value_t;
- template<template<class...> class Op, class... Args>
- using detected_t = typename detector<nonesuch, void, Op, Args...>::type;
- template<class Default, template<class...> class Op, class... Args>
- using detected_or = detector<Default, void, Op, Args...>;
- template<class Default, template<class...> class Op, class... Args>
- using detected_or_t = typename detected_or<Default, Op, Args...>::type;
- template<class Expected, template<class...> class Op, class... Args>
- using is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;
- template<class To, template<class...> class Op, class... Args>
- using is_detected_convertible =
- std::is_convertible<detected_t<Op, Args...>, To>;
- }
- }
- #ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_
- #define INCLUDE_NLOHMANN_JSON_FWD_HPP_
- #include <cstdint> // int64_t, uint64_t
- #include <map> // map
- #include <memory> // allocator
- #include <string> // string
- #include <vector> // vector
- namespace nlohmann
- {
- template<typename T = void, typename SFINAE = void>
- struct adl_serializer;
- template<template<typename U, typename V, typename... Args> class ObjectType =
- std::map,
- template<typename U, typename... Args> class ArrayType = std::vector,
- class StringType = std::string, class BooleanType = bool,
- class NumberIntegerType = std::int64_t,
- class NumberUnsignedType = std::uint64_t,
- class NumberFloatType = double,
- template<typename U> class AllocatorType = std::allocator,
- template<typename T, typename SFINAE = void> class JSONSerializer =
- adl_serializer,
- class BinaryType = std::vector<std::uint8_t>>
- class basic_json;
- template<typename BasicJsonType>
- class json_pointer;
- using json = basic_json<>;
- template<class Key, class T, class IgnoredLess, class Allocator>
- struct ordered_map;
- using ordered_json = basic_json<nlohmann::ordered_map>;
- }
- #endif
- namespace nlohmann
- {
- namespace detail
- {
- template<typename> struct is_basic_json : std::false_type {};
- NLOHMANN_BASIC_JSON_TPL_DECLARATION
- struct is_basic_json<NLOHMANN_BASIC_JSON_TPL> : std::true_type {};
- template<typename>
- class json_ref;
- template<typename>
- struct is_json_ref : std::false_type {};
- template<typename T>
- struct is_json_ref<json_ref<T>> : std::true_type {};
- template<typename T>
- using mapped_type_t = typename T::mapped_type;
- template<typename T>
- using key_type_t = typename T::key_type;
- template<typename T>
- using value_type_t = typename T::value_type;
- template<typename T>
- using difference_type_t = typename T::difference_type;
- template<typename T>
- using pointer_t = typename T::pointer;
- template<typename T>
- using reference_t = typename T::reference;
- template<typename T>
- using iterator_category_t = typename T::iterator_category;
- template<typename T>
- using iterator_t = typename T::iterator;
- template<typename T, typename... Args>
- using to_json_function = decltype(T::to_json(std::declval<Args>()...));
- template<typename T, typename... Args>
- using from_json_function = decltype(T::from_json(std::declval<Args>()...));
- template<typename T, typename U>
- using get_template_function = decltype(std::declval<T>().template get<U>());
- template<typename BasicJsonType, typename T, typename = void>
- struct has_from_json : std::false_type {};
- template <typename BasicJsonType, typename T>
- struct is_getable
- {
- static constexpr bool value = is_detected<get_template_function, const BasicJsonType&, T>::value;
- };
- template<typename BasicJsonType, typename T>
- struct has_from_json < BasicJsonType, T,
- enable_if_t < !is_basic_json<T>::value >>
- {
- using serializer = typename BasicJsonType::template json_serializer<T, void>;
- static constexpr bool value =
- is_detected_exact<void, from_json_function, serializer,
- const BasicJsonType&, T&>::value;
- };
- template<typename BasicJsonType, typename T, typename = void>
- struct has_non_default_from_json : std::false_type {};
- template<typename BasicJsonType, typename T>
- struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>
- {
- using serializer = typename BasicJsonType::template json_serializer<T, void>;
- static constexpr bool value =
- is_detected_exact<T, from_json_function, serializer,
- const BasicJsonType&>::value;
- };
- template<typename BasicJsonType, typename T, typename = void>
- struct has_to_json : std::false_type {};
- template<typename BasicJsonType, typename T>
- struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >>
- {
- using serializer = typename BasicJsonType::template json_serializer<T, void>;
- static constexpr bool value =
- is_detected_exact<void, to_json_function, serializer, BasicJsonType&,
- T>::value;
- };
- template<typename T, typename = void>
- struct is_iterator_traits : std::false_type {};
- template<typename T>
- struct is_iterator_traits<iterator_traits<T>>
- {
- private:
- using traits = iterator_traits<T>;
- public:
- static constexpr auto value =
- is_detected<value_type_t, traits>::value &&
- is_detected<difference_type_t, traits>::value &&
- is_detected<pointer_t, traits>::value &&
- is_detected<iterator_category_t, traits>::value &&
- is_detected<reference_t, traits>::value;
- };
- template<typename T, typename = void>
- struct is_complete_type : std::false_type {};
- template<typename T>
- struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {};
- template<typename BasicJsonType, typename CompatibleObjectType,
- typename = void>
- struct is_compatible_object_type_impl : std::false_type {};
- template<typename BasicJsonType, typename CompatibleObjectType>
- struct is_compatible_object_type_impl <
- BasicJsonType, CompatibleObjectType,
- enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&
- is_detected<key_type_t, CompatibleObjectType>::value >>
- {
- using object_t = typename BasicJsonType::object_t;
-
- static constexpr bool value =
- std::is_constructible<typename object_t::key_type,
- typename CompatibleObjectType::key_type>::value &&
- std::is_constructible<typename object_t::mapped_type,
- typename CompatibleObjectType::mapped_type>::value;
- };
- template<typename BasicJsonType, typename CompatibleObjectType>
- struct is_compatible_object_type
- : is_compatible_object_type_impl<BasicJsonType, CompatibleObjectType> {};
- template<typename BasicJsonType, typename ConstructibleObjectType,
- typename = void>
- struct is_constructible_object_type_impl : std::false_type {};
- template<typename BasicJsonType, typename ConstructibleObjectType>
- struct is_constructible_object_type_impl <
- BasicJsonType, ConstructibleObjectType,
- enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&
- is_detected<key_type_t, ConstructibleObjectType>::value >>
- {
- using object_t = typename BasicJsonType::object_t;
- static constexpr bool value =
- (std::is_default_constructible<ConstructibleObjectType>::value &&
- (std::is_move_assignable<ConstructibleObjectType>::value ||
- std::is_copy_assignable<ConstructibleObjectType>::value) &&
- (std::is_constructible<typename ConstructibleObjectType::key_type,
- typename object_t::key_type>::value &&
- std::is_same <
- typename object_t::mapped_type,
- typename ConstructibleObjectType::mapped_type >::value)) ||
- (has_from_json<BasicJsonType,
- typename ConstructibleObjectType::mapped_type>::value ||
- has_non_default_from_json <
- BasicJsonType,
- typename ConstructibleObjectType::mapped_type >::value);
- };
- template<typename BasicJsonType, typename ConstructibleObjectType>
- struct is_constructible_object_type
- : is_constructible_object_type_impl<BasicJsonType,
- ConstructibleObjectType> {};
- template<typename BasicJsonType, typename CompatibleStringType,
- typename = void>
- struct is_compatible_string_type_impl : std::false_type {};
- template<typename BasicJsonType, typename CompatibleStringType>
- struct is_compatible_string_type_impl <
- BasicJsonType, CompatibleStringType,
- enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,
- value_type_t, CompatibleStringType>::value >>
- {
- static constexpr auto value =
- std::is_constructible<typename BasicJsonType::string_t, CompatibleStringType>::value;
- };
- template<typename BasicJsonType, typename ConstructibleStringType>
- struct is_compatible_string_type
- : is_compatible_string_type_impl<BasicJsonType, ConstructibleStringType> {};
- template<typename BasicJsonType, typename ConstructibleStringType,
- typename = void>
- struct is_constructible_string_type_impl : std::false_type {};
- template<typename BasicJsonType, typename ConstructibleStringType>
- struct is_constructible_string_type_impl <
- BasicJsonType, ConstructibleStringType,
- enable_if_t<is_detected_exact<typename BasicJsonType::string_t::value_type,
- value_type_t, ConstructibleStringType>::value >>
- {
- static constexpr auto value =
- std::is_constructible<ConstructibleStringType,
- typename BasicJsonType::string_t>::value;
- };
- template<typename BasicJsonType, typename ConstructibleStringType>
- struct is_constructible_string_type
- : is_constructible_string_type_impl<BasicJsonType, ConstructibleStringType> {};
- template<typename BasicJsonType, typename CompatibleArrayType, typename = void>
- struct is_compatible_array_type_impl : std::false_type {};
- template<typename BasicJsonType, typename CompatibleArrayType>
- struct is_compatible_array_type_impl <
- BasicJsonType, CompatibleArrayType,
- enable_if_t < is_detected<value_type_t, CompatibleArrayType>::value&&
- is_detected<iterator_t, CompatibleArrayType>::value&&
- !is_iterator_traits <
- iterator_traits<CompatibleArrayType >>::value >>
- {
- static constexpr bool value =
- std::is_constructible<BasicJsonType,
- typename CompatibleArrayType::value_type>::value;
- };
- template<typename BasicJsonType, typename CompatibleArrayType>
- struct is_compatible_array_type
- : is_compatible_array_type_impl<BasicJsonType, CompatibleArrayType> {};
- template<typename BasicJsonType, typename ConstructibleArrayType, typename = void>
- struct is_constructible_array_type_impl : std::false_type {};
- template<typename BasicJsonType, typename ConstructibleArrayType>
- struct is_constructible_array_type_impl <
- BasicJsonType, ConstructibleArrayType,
- enable_if_t<std::is_same<ConstructibleArrayType,
- typename BasicJsonType::value_type>::value >>
- : std::true_type {};
- template<typename BasicJsonType, typename ConstructibleArrayType>
- struct is_constructible_array_type_impl <
- BasicJsonType, ConstructibleArrayType,
- enable_if_t < !std::is_same<ConstructibleArrayType,
- typename BasicJsonType::value_type>::value&&
- std::is_default_constructible<ConstructibleArrayType>::value&&
- (std::is_move_assignable<ConstructibleArrayType>::value ||
- std::is_copy_assignable<ConstructibleArrayType>::value)&&
- is_detected<value_type_t, ConstructibleArrayType>::value&&
- is_detected<iterator_t, ConstructibleArrayType>::value&&
- is_complete_type <
- detected_t<value_type_t, ConstructibleArrayType >>::value >>
- {
- static constexpr bool value =
-
-
-
-
-
- !is_iterator_traits<iterator_traits<ConstructibleArrayType>>::value &&
- (std::is_same<typename ConstructibleArrayType::value_type,
- typename BasicJsonType::array_t::value_type>::value ||
- has_from_json<BasicJsonType,
- typename ConstructibleArrayType::value_type>::value ||
- has_non_default_from_json <
- BasicJsonType, typename ConstructibleArrayType::value_type >::value);
- };
- template<typename BasicJsonType, typename ConstructibleArrayType>
- struct is_constructible_array_type
- : is_constructible_array_type_impl<BasicJsonType, ConstructibleArrayType> {};
- template<typename RealIntegerType, typename CompatibleNumberIntegerType,
- typename = void>
- struct is_compatible_integer_type_impl : std::false_type {};
- template<typename RealIntegerType, typename CompatibleNumberIntegerType>
- struct is_compatible_integer_type_impl <
- RealIntegerType, CompatibleNumberIntegerType,
- enable_if_t < std::is_integral<RealIntegerType>::value&&
- std::is_integral<CompatibleNumberIntegerType>::value&&
- !std::is_same<bool, CompatibleNumberIntegerType>::value >>
- {
-
- using RealLimits = std::numeric_limits<RealIntegerType>;
- using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>;
- static constexpr auto value =
- std::is_constructible<RealIntegerType,
- CompatibleNumberIntegerType>::value &&
- CompatibleLimits::is_integer &&
- RealLimits::is_signed == CompatibleLimits::is_signed;
- };
- template<typename RealIntegerType, typename CompatibleNumberIntegerType>
- struct is_compatible_integer_type
- : is_compatible_integer_type_impl<RealIntegerType,
- CompatibleNumberIntegerType> {};
- template<typename BasicJsonType, typename CompatibleType, typename = void>
- struct is_compatible_type_impl: std::false_type {};
- template<typename BasicJsonType, typename CompatibleType>
- struct is_compatible_type_impl <
- BasicJsonType, CompatibleType,
- enable_if_t<is_complete_type<CompatibleType>::value >>
- {
- static constexpr bool value =
- has_to_json<BasicJsonType, CompatibleType>::value;
- };
- template<typename BasicJsonType, typename CompatibleType>
- struct is_compatible_type
- : is_compatible_type_impl<BasicJsonType, CompatibleType> {};
- template<class...> struct conjunction : std::true_type { };
- template<class B1> struct conjunction<B1> : B1 { };
- template<class B1, class... Bn>
- struct conjunction<B1, Bn...>
- : std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};
- template<typename T1, typename T2>
- struct is_constructible_tuple : std::false_type {};
- template<typename T1, typename... Args>
- struct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<std::is_constructible<T1, Args>...> {};
- }
- }
- #include <array> // array
- #include <cstddef> // size_t
- #include <cstdint> // uint8_t
- #include <string> // string
- namespace nlohmann
- {
- namespace detail
- {
- enum class value_t : std::uint8_t
- {
- null,
- object,
- array,
- string,
- boolean,
- number_integer,
- number_unsigned,
- number_float,
- binary,
- discarded
- };
- inline bool operator<(const value_t lhs, const value_t rhs) noexcept
- {
- static constexpr std::array<std::uint8_t, 9> order = {{
- 0 , 3 , 4 , 5 ,
- 1 , 2 , 2 , 2 ,
- 6
- }
- };
- const auto l_index = static_cast<std::size_t>(lhs);
- const auto r_index = static_cast<std::size_t>(rhs);
- return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index];
- }
- }
- }
- namespace nlohmann
- {
- namespace detail
- {
- template<typename BasicJsonType>
- void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_null()))
- {
- JSON_THROW(type_error::create(302, "type must be null, but is " + std::string(j.type_name())));
- }
- n = nullptr;
- }
- template < typename BasicJsonType, typename ArithmeticType,
- enable_if_t < std::is_arithmetic<ArithmeticType>::value&&
- !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,
- int > = 0 >
- void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
- {
- switch (static_cast<value_t>(j))
- {
- case value_t::number_unsigned:
- {
- val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
- break;
- }
- case value_t::number_integer:
- {
- val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
- break;
- }
- case value_t::number_float:
- {
- val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
- break;
- }
- default:
- JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name())));
- }
- }
- template<typename BasicJsonType>
- void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_boolean()))
- {
- JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(j.type_name())));
- }
- b = *j.template get_ptr<const typename BasicJsonType::boolean_t*>();
- }
- template<typename BasicJsonType>
- void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_string()))
- {
- JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name())));
- }
- s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
- }
- template <
- typename BasicJsonType, typename ConstructibleStringType,
- enable_if_t <
- is_constructible_string_type<BasicJsonType, ConstructibleStringType>::value&&
- !std::is_same<typename BasicJsonType::string_t,
- ConstructibleStringType>::value,
- int > = 0 >
- void from_json(const BasicJsonType& j, ConstructibleStringType& s)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_string()))
- {
- JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name())));
- }
- s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
- }
- template<typename BasicJsonType>
- void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val)
- {
- get_arithmetic_value(j, val);
- }
- template<typename BasicJsonType>
- void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val)
- {
- get_arithmetic_value(j, val);
- }
- template<typename BasicJsonType>
- void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val)
- {
- get_arithmetic_value(j, val);
- }
- template<typename BasicJsonType, typename EnumType,
- enable_if_t<std::is_enum<EnumType>::value, int> = 0>
- void from_json(const BasicJsonType& j, EnumType& e)
- {
- typename std::underlying_type<EnumType>::type val;
- get_arithmetic_value(j, val);
- e = static_cast<EnumType>(val);
- }
- template<typename BasicJsonType, typename T, typename Allocator,
- enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>
- void from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
- {
- JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name())));
- }
- l.clear();
- std::transform(j.rbegin(), j.rend(),
- std::front_inserter(l), [](const BasicJsonType & i)
- {
- return i.template get<T>();
- });
- }
- template<typename BasicJsonType, typename T,
- enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>
- void from_json(const BasicJsonType& j, std::valarray<T>& l)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
- {
- JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name())));
- }
- l.resize(j.size());
- std::transform(j.begin(), j.end(), std::begin(l),
- [](const BasicJsonType & elem)
- {
- return elem.template get<T>();
- });
- }
- template<typename BasicJsonType, typename T, std::size_t N>
- auto from_json(const BasicJsonType& j, T (&arr)[N])
- -> decltype(j.template get<T>(), void())
- {
- for (std::size_t i = 0; i < N; ++i)
- {
- arr[i] = j.at(i).template get<T>();
- }
- }
- template<typename BasicJsonType>
- void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> )
- {
- arr = *j.template get_ptr<const typename BasicJsonType::array_t*>();
- }
- template<typename BasicJsonType, typename T, std::size_t N>
- auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& arr,
- priority_tag<2> )
- -> decltype(j.template get<T>(), void())
- {
- for (std::size_t i = 0; i < N; ++i)
- {
- arr[i] = j.at(i).template get<T>();
- }
- }
- template<typename BasicJsonType, typename ConstructibleArrayType>
- auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> )
- -> decltype(
- arr.reserve(std::declval<typename ConstructibleArrayType::size_type>()),
- j.template get<typename ConstructibleArrayType::value_type>(),
- void())
- {
- using std::end;
- ConstructibleArrayType ret;
- ret.reserve(j.size());
- std::transform(j.begin(), j.end(),
- std::inserter(ret, end(ret)), [](const BasicJsonType & i)
- {
-
-
- return i.template get<typename ConstructibleArrayType::value_type>();
- });
- arr = std::move(ret);
- }
- template<typename BasicJsonType, typename ConstructibleArrayType>
- void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr,
- priority_tag<0> )
- {
- using std::end;
- ConstructibleArrayType ret;
- std::transform(
- j.begin(), j.end(), std::inserter(ret, end(ret)),
- [](const BasicJsonType & i)
- {
-
-
- return i.template get<typename ConstructibleArrayType::value_type>();
- });
- arr = std::move(ret);
- }
- template < typename BasicJsonType, typename ConstructibleArrayType,
- enable_if_t <
- is_constructible_array_type<BasicJsonType, ConstructibleArrayType>::value&&
- !is_constructible_object_type<BasicJsonType, ConstructibleArrayType>::value&&
- !is_constructible_string_type<BasicJsonType, ConstructibleArrayType>::value&&
- !std::is_same<ConstructibleArrayType, typename BasicJsonType::binary_t>::value&&
- !is_basic_json<ConstructibleArrayType>::value,
- int > = 0 >
- auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
- -> decltype(from_json_array_impl(j, arr, priority_tag<3> {}),
- j.template get<typename ConstructibleArrayType::value_type>(),
- void())
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
- {
- JSON_THROW(type_error::create(302, "type must be array, but is " +
- std::string(j.type_name())));
- }
- from_json_array_impl(j, arr, priority_tag<3> {});
- }
- template<typename BasicJsonType>
- void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_binary()))
- {
- JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(j.type_name())));
- }
- bin = *j.template get_ptr<const typename BasicJsonType::binary_t*>();
- }
- template<typename BasicJsonType, typename ConstructibleObjectType,
- enable_if_t<is_constructible_object_type<BasicJsonType, ConstructibleObjectType>::value, int> = 0>
- void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_object()))
- {
- JSON_THROW(type_error::create(302, "type must be object, but is " + std::string(j.type_name())));
- }
- ConstructibleObjectType ret;
- auto inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>();
- using value_type = typename ConstructibleObjectType::value_type;
- std::transform(
- inner_object->begin(), inner_object->end(),
- std::inserter(ret, ret.begin()),
- [](typename BasicJsonType::object_t::value_type const & p)
- {
- return value_type(p.first, p.second.template get<typename ConstructibleObjectType::mapped_type>());
- });
- obj = std::move(ret);
- }
- template < typename BasicJsonType, typename ArithmeticType,
- enable_if_t <
- std::is_arithmetic<ArithmeticType>::value&&
- !std::is_same<ArithmeticType, typename BasicJsonType::number_unsigned_t>::value&&
- !std::is_same<ArithmeticType, typename BasicJsonType::number_integer_t>::value&&
- !std::is_same<ArithmeticType, typename BasicJsonType::number_float_t>::value&&
- !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,
- int > = 0 >
- void from_json(const BasicJsonType& j, ArithmeticType& val)
- {
- switch (static_cast<value_t>(j))
- {
- case value_t::number_unsigned:
- {
- val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
- break;
- }
- case value_t::number_integer:
- {
- val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
- break;
- }
- case value_t::number_float:
- {
- val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
- break;
- }
- case value_t::boolean:
- {
- val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>());
- break;
- }
- default:
- JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name())));
- }
- }
- template<typename BasicJsonType, typename A1, typename A2>
- void from_json(const BasicJsonType& j, std::pair<A1, A2>& p)
- {
- p = {j.at(0).template get<A1>(), j.at(1).template get<A2>()};
- }
- template<typename BasicJsonType, typename Tuple, std::size_t... Idx>
- void from_json_tuple_impl(const BasicJsonType& j, Tuple& t, index_sequence<Idx...> )
- {
- t = std::make_tuple(j.at(Idx).template get<typename std::tuple_element<Idx, Tuple>::type>()...);
- }
- template<typename BasicJsonType, typename... Args>
- void from_json(const BasicJsonType& j, std::tuple<Args...>& t)
- {
- from_json_tuple_impl(j, t, index_sequence_for<Args...> {});
- }
- template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator,
- typename = enable_if_t < !std::is_constructible <
- typename BasicJsonType::string_t, Key >::value >>
- void from_json(const BasicJsonType& j, std::map<Key, Value, Compare, Allocator>& m)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
- {
- JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name())));
- }
- m.clear();
- for (const auto& p : j)
- {
- if (JSON_HEDLEY_UNLIKELY(!p.is_array()))
- {
- JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name())));
- }
- m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());
- }
- }
- template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator,
- typename = enable_if_t < !std::is_constructible <
- typename BasicJsonType::string_t, Key >::value >>
- void from_json(const BasicJsonType& j, std::unordered_map<Key, Value, Hash, KeyEqual, Allocator>& m)
- {
- if (JSON_HEDLEY_UNLIKELY(!j.is_array()))
- {
- JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name())));
- }
- m.clear();
- for (const auto& p : j)
- {
- if (JSON_HEDLEY_UNLIKELY(!p.is_array()))
- {
- JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name())));
- }
- m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());
- }
- }
- struct from_json_fn
- {
- template<typename BasicJsonType, typename T>
- auto operator()(const BasicJsonType& j, T& val) const
- noexcept(noexcept(from_json(j, val)))
- -> decltype(from_json(j, val), void())
- {
- return from_json(j, val);
- }
- };
- }
- namespace
- {
- constexpr const auto& from_json = detail::static_const<detail::from_json_fn>::value;
- }
- }
- #include <algorithm> // copy
- #include <iterator> // begin, end
- #include <string> // string
- #include <tuple> // tuple, get
- #include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type
- #include <utility> // move, forward, declval, pair
- #include <valarray> // valarray
- #include <vector> // vector
- #include <cstddef> // size_t
- #include <iterator> // input_iterator_tag
- #include <string> // string, to_string
- #include <tuple> // tuple_size, get, tuple_element
- namespace nlohmann
- {
- namespace detail
- {
- template<typename string_type>
- void int_to_string( string_type& target, std::size_t value )
- {
-
- using std::to_string;
- target = to_string(value);
- }
- template<typename IteratorType> class iteration_proxy_value
- {
- public:
- using difference_type = std::ptrdiff_t;
- using value_type = iteration_proxy_value;
- using pointer = value_type * ;
- using reference = value_type & ;
- using iterator_category = std::input_iterator_tag;
- using string_type = typename std::remove_cv< typename std::remove_reference<decltype( std::declval<IteratorType>().key() ) >::type >::type;
- private:
-
- IteratorType anchor;
-
- std::size_t array_index = 0;
-
- mutable std::size_t array_index_last = 0;
-
- mutable string_type array_index_str = "0";
-
- const string_type empty_str = "";
- public:
- explicit iteration_proxy_value(IteratorType it) noexcept : anchor(it) {}
-
- iteration_proxy_value& operator*()
- {
- return *this;
- }
-
- iteration_proxy_value& operator++()
- {
- ++anchor;
- ++array_index;
- return *this;
- }
-
- bool operator==(const iteration_proxy_value& o) const
- {
- return anchor == o.anchor;
- }
-
- bool operator!=(const iteration_proxy_value& o) const
- {
- return anchor != o.anchor;
- }
-
- const string_type& key() const
- {
- JSON_ASSERT(anchor.m_object != nullptr);
- switch (anchor.m_object->type())
- {
-
- case value_t::array:
- {
- if (array_index != array_index_last)
- {
- int_to_string( array_index_str, array_index );
- array_index_last = array_index;
- }
- return array_index_str;
- }
-
- case value_t::object:
- return anchor.key();
-
- default:
- return empty_str;
- }
- }
-
- typename IteratorType::reference value() const
- {
- return anchor.value();
- }
- };
- template<typename IteratorType> class iteration_proxy
- {
- private:
-
- typename IteratorType::reference container;
- public:
-
- explicit iteration_proxy(typename IteratorType::reference cont) noexcept
- : container(cont) {}
-
- iteration_proxy_value<IteratorType> begin() noexcept
- {
- return iteration_proxy_value<IteratorType>(container.begin());
- }
-
- iteration_proxy_value<IteratorType> end() noexcept
- {
- return iteration_proxy_value<IteratorType>(container.end());
- }
- };
- template<std::size_t N, typename IteratorType, enable_if_t<N == 0, int> = 0>
- auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.key())
- {
- return i.key();
- }
- template<std::size_t N, typename IteratorType, enable_if_t<N == 1, int> = 0>
- auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.value())
- {
- return i.value();
- }
- }
- }
- namespace std
- {
- #if defined(__clang__)
-
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wmismatched-tags"
- #endif
- template<typename IteratorType>
- class tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>>
- : public std::integral_constant<std::size_t, 2> {};
- template<std::size_t N, typename IteratorType>
- class tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >>
- {
- public:
- using type = decltype(
- get<N>(std::declval <
- ::nlohmann::detail::iteration_proxy_value<IteratorType >> ()));
- };
- #if defined(__clang__)
- #pragma clang diagnostic pop
- #endif
- }
- namespace nlohmann
- {
- namespace detail
- {
- template<value_t> struct external_constructor;
- template<>
- struct external_constructor<value_t::boolean>
- {
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept
- {
- j.m_type = value_t::boolean;
- j.m_value = b;
- j.assert_invariant();
- }
- };
- template<>
- struct external_constructor<value_t::string>
- {
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s)
- {
- j.m_type = value_t::string;
- j.m_value = s;
- j.assert_invariant();
- }
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s)
- {
- j.m_type = value_t::string;
- j.m_value = std::move(s);
- j.assert_invariant();
- }
- template < typename BasicJsonType, typename CompatibleStringType,
- enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,
- int > = 0 >
- static void construct(BasicJsonType& j, const CompatibleStringType& str)
- {
- j.m_type = value_t::string;
- j.m_value.string = j.template create<typename BasicJsonType::string_t>(str);
- j.assert_invariant();
- }
- };
- template<>
- struct external_constructor<value_t::binary>
- {
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b)
- {
- j.m_type = value_t::binary;
- typename BasicJsonType::binary_t value{b};
- j.m_value = value;
- j.assert_invariant();
- }
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b)
- {
- j.m_type = value_t::binary;
- typename BasicJsonType::binary_t value{std::move(b)};
- j.m_value = value;
- j.assert_invariant();
- }
- };
- template<>
- struct external_constructor<value_t::number_float>
- {
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept
- {
- j.m_type = value_t::number_float;
- j.m_value = val;
- j.assert_invariant();
- }
- };
- template<>
- struct external_constructor<value_t::number_unsigned>
- {
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept
- {
- j.m_type = value_t::number_unsigned;
- j.m_value = val;
- j.assert_invariant();
- }
- };
- template<>
- struct external_constructor<value_t::number_integer>
- {
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept
- {
- j.m_type = value_t::number_integer;
- j.m_value = val;
- j.assert_invariant();
- }
- };
- template<>
- struct external_constructor<value_t::array>
- {
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr)
- {
- j.m_type = value_t::array;
- j.m_value = arr;
- j.assert_invariant();
- }
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
- {
- j.m_type = value_t::array;
- j.m_value = std::move(arr);
- j.assert_invariant();
- }
- template < typename BasicJsonType, typename CompatibleArrayType,
- enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,
- int > = 0 >
- static void construct(BasicJsonType& j, const CompatibleArrayType& arr)
- {
- using std::begin;
- using std::end;
- j.m_type = value_t::array;
- j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
- j.assert_invariant();
- }
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, const std::vector<bool>& arr)
- {
- j.m_type = value_t::array;
- j.m_value = value_t::array;
- j.m_value.array->reserve(arr.size());
- for (const bool x : arr)
- {
- j.m_value.array->push_back(x);
- }
- j.assert_invariant();
- }
- template<typename BasicJsonType, typename T,
- enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>
- static void construct(BasicJsonType& j, const std::valarray<T>& arr)
- {
- j.m_type = value_t::array;
- j.m_value = value_t::array;
- j.m_value.array->resize(arr.size());
- if (arr.size() > 0)
- {
- std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
- }
- j.assert_invariant();
- }
- };
- template<>
- struct external_constructor<value_t::object>
- {
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj)
- {
- j.m_type = value_t::object;
- j.m_value = obj;
- j.assert_invariant();
- }
- template<typename BasicJsonType>
- static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
- {
- j.m_type = value_t::object;
- j.m_value = std::move(obj);
- j.assert_invariant();
- }
- template < typename BasicJsonType, typename CompatibleObjectType,
- enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value, int > = 0 >
- static void construct(BasicJsonType& j, const CompatibleObjectType& obj)
- {
- using std::begin;
- using std::end;
- j.m_type = value_t::object;
- j.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
- j.assert_invariant();
- }
- };
- template<typename BasicJsonType, typename T,
- enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value, int> = 0>
- void to_json(BasicJsonType& j, T b) noexcept
- {
- external_constructor<value_t::boolean>::construct(j, b);
- }
- template<typename BasicJsonType, typename CompatibleString,
- enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value, int> = 0>
- void to_json(BasicJsonType& j, const CompatibleString& s)
- {
- external_constructor<value_t::string>::construct(j, s);
- }
- template<typename BasicJsonType>
- void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s)
- {
- external_constructor<value_t::string>::construct(j, std::move(s));
- }
- template<typename BasicJsonType, typename FloatType,
- enable_if_t<std::is_floating_point<FloatType>::value, int> = 0>
- void to_json(BasicJsonType& j, FloatType val) noexcept
- {
- external_constructor<value_t::number_float>::construct(j, static_cast<typename BasicJsonType::number_float_t>(val));
- }
- template<typename BasicJsonType, typename CompatibleNumberUnsignedType,
- enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value, int> = 0>
- void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept
- {
- external_constructor<value_t::number_unsigned>::construct(j, static_cast<typename BasicJsonType::number_unsigned_t>(val));
- }
- template<typename BasicJsonType, typename CompatibleNumberIntegerType,
- enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value, int> = 0>
- void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept
- {
- external_constructor<value_t::number_integer>::construct(j, static_cast<typename BasicJsonType::number_integer_t>(val));
- }
- template<typename BasicJsonType, typename EnumType,
- enable_if_t<std::is_enum<EnumType>::value, int> = 0>
- void to_json(BasicJsonType& j, EnumType e) noexcept
- {
- using underlying_type = typename std::underlying_type<EnumType>::type;
- external_constructor<value_t::number_integer>::construct(j, static_cast<underlying_type>(e));
- }
- template<typename BasicJsonType>
- void to_json(BasicJsonType& j, const std::vector<bool>& e)
- {
- external_constructor<value_t::array>::construct(j, e);
- }
- template < typename BasicJsonType, typename CompatibleArrayType,
- enable_if_t < is_compatible_array_type<BasicJsonType,
- CompatibleArrayType>::value&&
- !is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value&&
- !is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value&&
- !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value&&
- !is_basic_json<CompatibleArrayType>::value,
- int > = 0 >
- void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
- {
- external_constructor<value_t::array>::construct(j, arr);
- }
- template<typename BasicJsonType>
- void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin)
- {
- external_constructor<value_t::binary>::construct(j, bin);
- }
- template<typename BasicJsonType, typename T,
- enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>
- void to_json(BasicJsonType& j, const std::valarray<T>& arr)
- {
- external_constructor<value_t::array>::construct(j, std::move(arr));
- }
- template<typename BasicJsonType>
- void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr)
- {
- external_constructor<value_t::array>::construct(j, std::move(arr));
- }
- template < typename BasicJsonType, typename CompatibleObjectType,
- enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value&& !is_basic_json<CompatibleObjectType>::value, int > = 0 >
- void to_json(BasicJsonType& j, const CompatibleObjectType& obj)
- {
- external_constructor<value_t::object>::construct(j, obj);
- }
- template<typename BasicJsonType>
- void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj)
- {
- external_constructor<value_t::object>::construct(j, std::move(obj));
- }
- template <
- typename BasicJsonType, typename T, std::size_t N,
- enable_if_t < !std::is_constructible<typename BasicJsonType::string_t,
- const T(&)[N]>::value,
- int > = 0 >
- void to_json(BasicJsonType& j, const T(&arr)[N])
- {
- external_constructor<value_t::array>::construct(j, arr);
- }
- template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value, int > = 0 >
- void to_json(BasicJsonType& j, const std::pair<T1, T2>& p)
- {
- j = { p.first, p.second };
- }
- template<typename BasicJsonType, typename T,
- enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value, int> = 0>
- void to_json(BasicJsonType& j, const T& b)
- {
- j = { {b.key(), b.value()} };
- }
- template<typename BasicJsonType, typename Tuple, std::size_t... Idx>
- void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<Idx...> )
- {
- j = { std::get<Idx>(t)... };
- }
- template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>
- void to_json(BasicJsonType& j, const T& t)
- {
- to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});
- }
- struct to_json_fn
- {
- template<typename BasicJsonType, typename T>
- auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward<T>(val))))
- -> decltype(to_json(j, std::forward<T>(val)), void())
- {
- return to_json(j, std::forward<T>(val));
- }
- };
- }
- namespace
- {
- constexpr const auto& to_json = detail::static_const<detail::to_json_fn>::value;
- }
- }
- namespace nlohmann
- {
- template<typename, typename>
- struct adl_serializer
- {
-
- template<typename BasicJsonType, typename ValueType>
- static auto from_json(BasicJsonType&& j, ValueType& val) noexcept(
- noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val)))
- -> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), val), void())
- {
- ::nlohmann::from_json(std::forward<BasicJsonType>(j), val);
- }
-
- template<typename BasicJsonType, typename ValueType>
- static auto to_json(BasicJsonType& j, ValueType&& val) noexcept(
- noexcept(::nlohmann::to_json(j, std::forward<ValueType>(val))))
- -> decltype(::nlohmann::to_json(j, std::forward<ValueType>(val)), void())
- {
- ::nlohmann::to_json(j, std::forward<ValueType>(val));
- }
- };
- }
- #include <cstdint> // uint8_t
- #include <tuple> // tie
- #include <utility> // move
- namespace nlohmann
- {
- template<typename BinaryType>
- class byte_container_with_subtype : public BinaryType
- {
- public:
-
- using container_type = BinaryType;
- byte_container_with_subtype() noexcept(noexcept(container_type()))
- : container_type()
- {}
- byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b)))
- : container_type(b)
- {}
- byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b))))
- : container_type(std::move(b))
- {}
- byte_container_with_subtype(const container_type& b, std::uint8_t subtype) noexcept(noexcept(container_type(b)))
- : container_type(b)
- , m_subtype(subtype)
- , m_has_subtype(true)
- {}
- byte_container_with_subtype(container_type&& b, std::uint8_t subtype) noexcept(noexcept(container_type(std::move(b))))
- : container_type(std::move(b))
- , m_subtype(subtype)
- , m_has_subtype(true)
- {}
- bool operator==(const byte_container_with_subtype& rhs) const
- {
- return std::tie(static_cast<const BinaryType&>(*this), m_subtype, m_has_subtype) ==
- std::tie(static_cast<const BinaryType&>(rhs), rhs.m_subtype, rhs.m_has_subtype);
- }
- bool operator!=(const byte_container_with_subtype& rhs) const
- {
- return !(rhs == *this);
- }
-
- void set_subtype(std::uint8_t subtype) noexcept
- {
- m_subtype = subtype;
- m_has_subtype = true;
- }
-
- constexpr std::uint8_t subtype() const noexcept
- {
- return m_subtype;
- }
-
- constexpr bool has_subtype() const noexcept
- {
- return m_has_subtype;
- }
-
- void clear_subtype() noexcept
- {
- m_subtype = 0;
- m_has_subtype = false;
- }
- private:
- std::uint8_t m_subtype = 0;
- bool m_has_subtype = false;
- };
- }
- #include <cstddef> // size_t, uint8_t
- #include <functional> // hash
- namespace nlohmann
- {
- namespace detail
- {
- inline std::size_t combine(std::size_t seed, std::size_t h) noexcept
- {
- seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U);
- return seed;
- }
- template<typename BasicJsonType>
- std::size_t hash(const BasicJsonType& j)
- {
- using string_t = typename BasicJsonType::string_t;
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- const auto type = static_cast<std::size_t>(j.type());
- switch (j.type())
- {
- case BasicJsonType::value_t::null:
- case BasicJsonType::value_t::discarded:
- {
- return combine(type, 0);
- }
- case BasicJsonType::value_t::object:
- {
- auto seed = combine(type, j.size());
- for (const auto& element : j.items())
- {
- const auto h = std::hash<string_t> {}(element.key());
- seed = combine(seed, h);
- seed = combine(seed, hash(element.value()));
- }
- return seed;
- }
- case BasicJsonType::value_t::array:
- {
- auto seed = combine(type, j.size());
- for (const auto& element : j)
- {
- seed = combine(seed, hash(element));
- }
- return seed;
- }
- case BasicJsonType::value_t::string:
- {
- const auto h = std::hash<string_t> {}(j.template get_ref<const string_t&>());
- return combine(type, h);
- }
- case BasicJsonType::value_t::boolean:
- {
- const auto h = std::hash<bool> {}(j.template get<bool>());
- return combine(type, h);
- }
- case BasicJsonType::value_t::number_integer:
- {
- const auto h = std::hash<number_integer_t> {}(j.template get<number_integer_t>());
- return combine(type, h);
- }
- case nlohmann::detail::value_t::number_unsigned:
- {
- const auto h = std::hash<number_unsigned_t> {}(j.template get<number_unsigned_t>());
- return combine(type, h);
- }
- case nlohmann::detail::value_t::number_float:
- {
- const auto h = std::hash<number_float_t> {}(j.template get<number_float_t>());
- return combine(type, h);
- }
- case nlohmann::detail::value_t::binary:
- {
- auto seed = combine(type, j.get_binary().size());
- const auto h = std::hash<bool> {}(j.get_binary().has_subtype());
- seed = combine(seed, h);
- seed = combine(seed, j.get_binary().subtype());
- for (const auto byte : j.get_binary())
- {
- seed = combine(seed, std::hash<std::uint8_t> {}(byte));
- }
- return seed;
- }
- default:
- JSON_ASSERT(false);
- }
- }
- }
- }
- #include <algorithm> // generate_n
- #include <array> // array
- #include <cmath> // ldexp
- #include <cstddef> // size_t
- #include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t
- #include <cstdio> // snprintf
- #include <cstring> // memcpy
- #include <iterator> // back_inserter
- #include <limits> // numeric_limits
- #include <string> // char_traits, string
- #include <utility> // make_pair, move
- #include <array> // array
- #include <cstddef> // size_t
- #include <cstdio> //FILE *
- #include <cstring> // strlen
- #include <istream> // istream
- #include <iterator> // begin, end, iterator_traits, random_access_iterator_tag, distance, next
- #include <memory> // shared_ptr, make_shared, addressof
- #include <numeric> // accumulate
- #include <string> // string, char_traits
- #include <type_traits> // enable_if, is_base_of, is_pointer, is_integral, remove_pointer
- #include <utility> // pair, declval
- namespace nlohmann
- {
- namespace detail
- {
- enum class input_format_t { json, cbor, msgpack, ubjson, bson };
- class file_input_adapter
- {
- public:
- using char_type = char;
- JSON_HEDLEY_NON_NULL(2)
- explicit file_input_adapter(std::FILE* f) noexcept
- : m_file(f)
- {}
-
- file_input_adapter(const file_input_adapter&) = delete;
- file_input_adapter(file_input_adapter&&) = default;
- file_input_adapter& operator=(const file_input_adapter&) = delete;
- file_input_adapter& operator=(file_input_adapter&&) = delete;
- std::char_traits<char>::int_type get_character() noexcept
- {
- return std::fgetc(m_file);
- }
- private:
-
- std::FILE* m_file;
- };
- class input_stream_adapter
- {
- public:
- using char_type = char;
- ~input_stream_adapter()
- {
-
-
- if (is != nullptr)
- {
- is->clear(is->rdstate() & std::ios::eofbit);
- }
- }
- explicit input_stream_adapter(std::istream& i)
- : is(&i), sb(i.rdbuf())
- {}
-
- input_stream_adapter(const input_stream_adapter&) = delete;
- input_stream_adapter& operator=(input_stream_adapter&) = delete;
- input_stream_adapter& operator=(input_stream_adapter&& rhs) = delete;
- input_stream_adapter(input_stream_adapter&& rhs) noexcept : is(rhs.is), sb(rhs.sb)
- {
- rhs.is = nullptr;
- rhs.sb = nullptr;
- }
-
-
-
- std::char_traits<char>::int_type get_character()
- {
- auto res = sb->sbumpc();
-
- if (JSON_HEDLEY_UNLIKELY(res == EOF))
- {
- is->clear(is->rdstate() | std::ios::eofbit);
- }
- return res;
- }
- private:
-
- std::istream* is = nullptr;
- std::streambuf* sb = nullptr;
- };
- template<typename IteratorType>
- class iterator_input_adapter
- {
- public:
- using char_type = typename std::iterator_traits<IteratorType>::value_type;
- iterator_input_adapter(IteratorType first, IteratorType last)
- : current(std::move(first)), end(std::move(last)) {}
- typename std::char_traits<char_type>::int_type get_character()
- {
- if (JSON_HEDLEY_LIKELY(current != end))
- {
- auto result = std::char_traits<char_type>::to_int_type(*current);
- std::advance(current, 1);
- return result;
- }
- else
- {
- return std::char_traits<char_type>::eof();
- }
- }
- private:
- IteratorType current;
- IteratorType end;
- template<typename BaseInputAdapter, size_t T>
- friend struct wide_string_input_helper;
- bool empty() const
- {
- return current == end;
- }
- };
- template<typename BaseInputAdapter, size_t T>
- struct wide_string_input_helper;
- template<typename BaseInputAdapter>
- struct wide_string_input_helper<BaseInputAdapter, 4>
- {
-
- static void fill_buffer(BaseInputAdapter& input,
- std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
- size_t& utf8_bytes_index,
- size_t& utf8_bytes_filled)
- {
- utf8_bytes_index = 0;
- if (JSON_HEDLEY_UNLIKELY(input.empty()))
- {
- utf8_bytes[0] = std::char_traits<char>::eof();
- utf8_bytes_filled = 1;
- }
- else
- {
-
- const auto wc = input.get_character();
-
- if (wc < 0x80)
- {
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
- utf8_bytes_filled = 1;
- }
- else if (wc <= 0x7FF)
- {
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u) & 0x1Fu));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
- utf8_bytes_filled = 2;
- }
- else if (wc <= 0xFFFF)
- {
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u) & 0x0Fu));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
- utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
- utf8_bytes_filled = 3;
- }
- else if (wc <= 0x10FFFF)
- {
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | ((static_cast<unsigned int>(wc) >> 18u) & 0x07u));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 12u) & 0x3Fu));
- utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
- utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
- utf8_bytes_filled = 4;
- }
- else
- {
-
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
- utf8_bytes_filled = 1;
- }
- }
- }
- };
- template<typename BaseInputAdapter>
- struct wide_string_input_helper<BaseInputAdapter, 2>
- {
-
- static void fill_buffer(BaseInputAdapter& input,
- std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
- size_t& utf8_bytes_index,
- size_t& utf8_bytes_filled)
- {
- utf8_bytes_index = 0;
- if (JSON_HEDLEY_UNLIKELY(input.empty()))
- {
- utf8_bytes[0] = std::char_traits<char>::eof();
- utf8_bytes_filled = 1;
- }
- else
- {
-
- const auto wc = input.get_character();
-
- if (wc < 0x80)
- {
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
- utf8_bytes_filled = 1;
- }
- else if (wc <= 0x7FF)
- {
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u)));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
- utf8_bytes_filled = 2;
- }
- else if (0xD800 > wc || wc >= 0xE000)
- {
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u)));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
- utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
- utf8_bytes_filled = 3;
- }
- else
- {
- if (JSON_HEDLEY_UNLIKELY(!input.empty()))
- {
- const auto wc2 = static_cast<unsigned int>(input.get_character());
- const auto charcode = 0x10000u + (((static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu));
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | (charcode >> 18u));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu));
- utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu));
- utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (charcode & 0x3Fu));
- utf8_bytes_filled = 4;
- }
- else
- {
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
- utf8_bytes_filled = 1;
- }
- }
- }
- }
- };
- template<typename BaseInputAdapter, typename WideCharType>
- class wide_string_input_adapter
- {
- public:
- using char_type = char;
- wide_string_input_adapter(BaseInputAdapter base)
- : base_adapter(base) {}
- typename std::char_traits<char>::int_type get_character() noexcept
- {
-
- if (utf8_bytes_index == utf8_bytes_filled)
- {
- fill_buffer<sizeof(WideCharType)>();
- JSON_ASSERT(utf8_bytes_filled > 0);
- JSON_ASSERT(utf8_bytes_index == 0);
- }
-
- JSON_ASSERT(utf8_bytes_filled > 0);
- JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled);
- return utf8_bytes[utf8_bytes_index++];
- }
- private:
- BaseInputAdapter base_adapter;
- template<size_t T>
- void fill_buffer()
- {
- wide_string_input_helper<BaseInputAdapter, T>::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
- }
-
- std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
-
- std::size_t utf8_bytes_index = 0;
-
- std::size_t utf8_bytes_filled = 0;
- };
- template<typename IteratorType, typename Enable = void>
- struct iterator_input_adapter_factory
- {
- using iterator_type = IteratorType;
- using char_type = typename std::iterator_traits<iterator_type>::value_type;
- using adapter_type = iterator_input_adapter<iterator_type>;
- static adapter_type create(IteratorType first, IteratorType last)
- {
- return adapter_type(std::move(first), std::move(last));
- }
- };
- template<typename T>
- struct is_iterator_of_multibyte
- {
- using value_type = typename std::iterator_traits<T>::value_type;
- enum
- {
- value = sizeof(value_type) > 1
- };
- };
- template<typename IteratorType>
- struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>>
- {
- using iterator_type = IteratorType;
- using char_type = typename std::iterator_traits<iterator_type>::value_type;
- using base_adapter_type = iterator_input_adapter<iterator_type>;
- using adapter_type = wide_string_input_adapter<base_adapter_type, char_type>;
- static adapter_type create(IteratorType first, IteratorType last)
- {
- return adapter_type(base_adapter_type(std::move(first), std::move(last)));
- }
- };
- template<typename IteratorType>
- typename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapter(IteratorType first, IteratorType last)
- {
- using factory_type = iterator_input_adapter_factory<IteratorType>;
- return factory_type::create(first, last);
- }
- template<typename ContainerType>
- auto input_adapter(const ContainerType& container) -> decltype(input_adapter(begin(container), end(container)))
- {
-
- using std::begin;
- using std::end;
- return input_adapter(begin(container), end(container));
- }
- inline file_input_adapter input_adapter(std::FILE* file)
- {
- return file_input_adapter(file);
- }
- inline input_stream_adapter input_adapter(std::istream& stream)
- {
- return input_stream_adapter(stream);
- }
- inline input_stream_adapter input_adapter(std::istream&& stream)
- {
- return input_stream_adapter(stream);
- }
- using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval<const char*>(), std::declval<const char*>()));
- template < typename CharT,
- typename std::enable_if <
- std::is_pointer<CharT>::value&&
- !std::is_array<CharT>::value&&
- std::is_integral<typename std::remove_pointer<CharT>::type>::value&&
- sizeof(typename std::remove_pointer<CharT>::type) == 1,
- int >::type = 0 >
- contiguous_bytes_input_adapter input_adapter(CharT b)
- {
- auto length = std::strlen(reinterpret_cast<const char*>(b));
- const auto* ptr = reinterpret_cast<const char*>(b);
- return input_adapter(ptr, ptr + length);
- }
- template<typename T, std::size_t N>
- auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N))
- {
- return input_adapter(array, array + N);
- }
- class span_input_adapter
- {
- public:
- template < typename CharT,
- typename std::enable_if <
- std::is_pointer<CharT>::value&&
- std::is_integral<typename std::remove_pointer<CharT>::type>::value&&
- sizeof(typename std::remove_pointer<CharT>::type) == 1,
- int >::type = 0 >
- span_input_adapter(CharT b, std::size_t l)
- : ia(reinterpret_cast<const char*>(b), reinterpret_cast<const char*>(b) + l) {}
- template<class IteratorType,
- typename std::enable_if<
- std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value,
- int>::type = 0>
- span_input_adapter(IteratorType first, IteratorType last)
- : ia(input_adapter(first, last)) {}
- contiguous_bytes_input_adapter&& get()
- {
- return std::move(ia);
- }
- private:
- contiguous_bytes_input_adapter ia;
- };
- }
- }
- #include <cstddef>
- #include <string> // string
- #include <utility> // move
- #include <vector> // vector
- namespace nlohmann
- {
- template<typename BasicJsonType>
- struct json_sax
- {
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
- using binary_t = typename BasicJsonType::binary_t;
-
- virtual bool null() = 0;
-
- virtual bool boolean(bool val) = 0;
-
- virtual bool number_integer(number_integer_t val) = 0;
-
- virtual bool number_unsigned(number_unsigned_t val) = 0;
-
- virtual bool number_float(number_float_t val, const string_t& s) = 0;
-
- virtual bool string(string_t& val) = 0;
-
- virtual bool binary(binary_t& val) = 0;
-
- virtual bool start_object(std::size_t elements) = 0;
-
- virtual bool key(string_t& val) = 0;
-
- virtual bool end_object() = 0;
-
- virtual bool start_array(std::size_t elements) = 0;
-
- virtual bool end_array() = 0;
-
- virtual bool parse_error(std::size_t position,
- const std::string& last_token,
- const detail::exception& ex) = 0;
- virtual ~json_sax() = default;
- };
- namespace detail
- {
- template<typename BasicJsonType>
- class json_sax_dom_parser
- {
- public:
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
- using binary_t = typename BasicJsonType::binary_t;
-
- explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true)
- : root(r), allow_exceptions(allow_exceptions_)
- {}
-
- json_sax_dom_parser(const json_sax_dom_parser&) = delete;
- json_sax_dom_parser(json_sax_dom_parser&&) = default;
- json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
- json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;
- ~json_sax_dom_parser() = default;
- bool null()
- {
- handle_value(nullptr);
- return true;
- }
- bool boolean(bool val)
- {
- handle_value(val);
- return true;
- }
- bool number_integer(number_integer_t val)
- {
- handle_value(val);
- return true;
- }
- bool number_unsigned(number_unsigned_t val)
- {
- handle_value(val);
- return true;
- }
- bool number_float(number_float_t val, const string_t& )
- {
- handle_value(val);
- return true;
- }
- bool string(string_t& val)
- {
- handle_value(val);
- return true;
- }
- bool binary(binary_t& val)
- {
- handle_value(std::move(val));
- return true;
- }
- bool start_object(std::size_t len)
- {
- ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
- if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
- {
- JSON_THROW(out_of_range::create(408,
- "excessive object size: " + std::to_string(len)));
- }
- return true;
- }
- bool key(string_t& val)
- {
-
- object_element = &(ref_stack.back()->m_value.object->operator[](val));
- return true;
- }
- bool end_object()
- {
- ref_stack.pop_back();
- return true;
- }
- bool start_array(std::size_t len)
- {
- ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
- if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
- {
- JSON_THROW(out_of_range::create(408,
- "excessive array size: " + std::to_string(len)));
- }
- return true;
- }
- bool end_array()
- {
- ref_stack.pop_back();
- return true;
- }
- template<class Exception>
- bool parse_error(std::size_t , const std::string& ,
- const Exception& ex)
- {
- errored = true;
- static_cast<void>(ex);
- if (allow_exceptions)
- {
- JSON_THROW(ex);
- }
- return false;
- }
- constexpr bool is_errored() const
- {
- return errored;
- }
- private:
-
- template<typename Value>
- JSON_HEDLEY_RETURNS_NON_NULL
- BasicJsonType* handle_value(Value&& v)
- {
- if (ref_stack.empty())
- {
- root = BasicJsonType(std::forward<Value>(v));
- return &root;
- }
- JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
- if (ref_stack.back()->is_array())
- {
- ref_stack.back()->m_value.array->emplace_back(std::forward<Value>(v));
- return &(ref_stack.back()->m_value.array->back());
- }
- JSON_ASSERT(ref_stack.back()->is_object());
- JSON_ASSERT(object_element);
- *object_element = BasicJsonType(std::forward<Value>(v));
- return object_element;
- }
-
- BasicJsonType& root;
-
- std::vector<BasicJsonType*> ref_stack {};
-
- BasicJsonType* object_element = nullptr;
-
- bool errored = false;
-
- const bool allow_exceptions = true;
- };
- template<typename BasicJsonType>
- class json_sax_dom_callback_parser
- {
- public:
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
- using binary_t = typename BasicJsonType::binary_t;
- using parser_callback_t = typename BasicJsonType::parser_callback_t;
- using parse_event_t = typename BasicJsonType::parse_event_t;
- json_sax_dom_callback_parser(BasicJsonType& r,
- const parser_callback_t cb,
- const bool allow_exceptions_ = true)
- : root(r), callback(cb), allow_exceptions(allow_exceptions_)
- {
- keep_stack.push_back(true);
- }
-
- json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete;
- json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default;
- json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete;
- json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default;
- ~json_sax_dom_callback_parser() = default;
- bool null()
- {
- handle_value(nullptr);
- return true;
- }
- bool boolean(bool val)
- {
- handle_value(val);
- return true;
- }
- bool number_integer(number_integer_t val)
- {
- handle_value(val);
- return true;
- }
- bool number_unsigned(number_unsigned_t val)
- {
- handle_value(val);
- return true;
- }
- bool number_float(number_float_t val, const string_t& )
- {
- handle_value(val);
- return true;
- }
- bool string(string_t& val)
- {
- handle_value(val);
- return true;
- }
- bool binary(binary_t& val)
- {
- handle_value(std::move(val));
- return true;
- }
- bool start_object(std::size_t len)
- {
-
- const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::object_start, discarded);
- keep_stack.push_back(keep);
- auto val = handle_value(BasicJsonType::value_t::object, true);
- ref_stack.push_back(val.second);
-
- if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
- {
- JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len)));
- }
- return true;
- }
- bool key(string_t& val)
- {
- BasicJsonType k = BasicJsonType(val);
-
- const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::key, k);
- key_keep_stack.push_back(keep);
-
- if (keep && ref_stack.back())
- {
- object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded);
- }
- return true;
- }
- bool end_object()
- {
- if (ref_stack.back() && !callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()))
- {
-
- *ref_stack.back() = discarded;
- }
- JSON_ASSERT(!ref_stack.empty());
- JSON_ASSERT(!keep_stack.empty());
- ref_stack.pop_back();
- keep_stack.pop_back();
- if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())
- {
-
- for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)
- {
- if (it->is_discarded())
- {
- ref_stack.back()->erase(it);
- break;
- }
- }
- }
- return true;
- }
- bool start_array(std::size_t len)
- {
- const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::array_start, discarded);
- keep_stack.push_back(keep);
- auto val = handle_value(BasicJsonType::value_t::array, true);
- ref_stack.push_back(val.second);
-
- if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
- {
- JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len)));
- }
- return true;
- }
- bool end_array()
- {
- bool keep = true;
- if (ref_stack.back())
- {
- keep = callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());
- if (!keep)
- {
-
- *ref_stack.back() = discarded;
- }
- }
- JSON_ASSERT(!ref_stack.empty());
- JSON_ASSERT(!keep_stack.empty());
- ref_stack.pop_back();
- keep_stack.pop_back();
-
- if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())
- {
- ref_stack.back()->m_value.array->pop_back();
- }
- return true;
- }
- template<class Exception>
- bool parse_error(std::size_t , const std::string& ,
- const Exception& ex)
- {
- errored = true;
- static_cast<void>(ex);
- if (allow_exceptions)
- {
- JSON_THROW(ex);
- }
- return false;
- }
- constexpr bool is_errored() const
- {
- return errored;
- }
- private:
-
- template<typename Value>
- std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false)
- {
- JSON_ASSERT(!keep_stack.empty());
-
-
- if (!keep_stack.back())
- {
- return {false, nullptr};
- }
-
- auto value = BasicJsonType(std::forward<Value>(v));
-
- const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value);
-
- if (!keep)
- {
- return {false, nullptr};
- }
- if (ref_stack.empty())
- {
- root = std::move(value);
- return {true, &root};
- }
-
-
- if (!ref_stack.back())
- {
- return {false, nullptr};
- }
-
- JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
-
- if (ref_stack.back()->is_array())
- {
- ref_stack.back()->m_value.array->push_back(std::move(value));
- return {true, &(ref_stack.back()->m_value.array->back())};
- }
-
- JSON_ASSERT(ref_stack.back()->is_object());
-
- JSON_ASSERT(!key_keep_stack.empty());
- const bool store_element = key_keep_stack.back();
- key_keep_stack.pop_back();
- if (!store_element)
- {
- return {false, nullptr};
- }
- JSON_ASSERT(object_element);
- *object_element = std::move(value);
- return {true, object_element};
- }
-
- BasicJsonType& root;
-
- std::vector<BasicJsonType*> ref_stack {};
-
- std::vector<bool> keep_stack {};
-
- std::vector<bool> key_keep_stack {};
-
- BasicJsonType* object_element = nullptr;
-
- bool errored = false;
-
- const parser_callback_t callback = nullptr;
-
- const bool allow_exceptions = true;
-
- BasicJsonType discarded = BasicJsonType::value_t::discarded;
- };
- template<typename BasicJsonType>
- class json_sax_acceptor
- {
- public:
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
- using binary_t = typename BasicJsonType::binary_t;
- bool null()
- {
- return true;
- }
- bool boolean(bool )
- {
- return true;
- }
- bool number_integer(number_integer_t )
- {
- return true;
- }
- bool number_unsigned(number_unsigned_t )
- {
- return true;
- }
- bool number_float(number_float_t , const string_t& )
- {
- return true;
- }
- bool string(string_t& )
- {
- return true;
- }
- bool binary(binary_t& )
- {
- return true;
- }
- bool start_object(std::size_t = std::size_t(-1))
- {
- return true;
- }
- bool key(string_t& )
- {
- return true;
- }
- bool end_object()
- {
- return true;
- }
- bool start_array(std::size_t = std::size_t(-1))
- {
- return true;
- }
- bool end_array()
- {
- return true;
- }
- bool parse_error(std::size_t , const std::string& , const detail::exception& )
- {
- return false;
- }
- };
- }
- }
- #include <array> // array
- #include <clocale> // localeconv
- #include <cstddef> // size_t
- #include <cstdio> // snprintf
- #include <cstdlib> // strtof, strtod, strtold, strtoll, strtoull
- #include <initializer_list> // initializer_list
- #include <string> // char_traits, string
- #include <utility> // move
- #include <vector> // vector
- namespace nlohmann
- {
- namespace detail
- {
- template<typename BasicJsonType>
- class lexer_base
- {
- public:
-
- enum class token_type
- {
- uninitialized,
- literal_true,
- literal_false,
- literal_null,
- value_string,
- value_unsigned,
- value_integer,
- value_float,
- begin_array,
- begin_object,
- end_array,
- end_object,
- name_separator,
- value_separator,
- parse_error,
- end_of_input,
- literal_or_value
- };
-
- JSON_HEDLEY_RETURNS_NON_NULL
- JSON_HEDLEY_CONST
- static const char* token_type_name(const token_type t) noexcept
- {
- switch (t)
- {
- case token_type::uninitialized:
- return "<uninitialized>";
- case token_type::literal_true:
- return "true literal";
- case token_type::literal_false:
- return "false literal";
- case token_type::literal_null:
- return "null literal";
- case token_type::value_string:
- return "string literal";
- case token_type::value_unsigned:
- case token_type::value_integer:
- case token_type::value_float:
- return "number literal";
- case token_type::begin_array:
- return "'['";
- case token_type::begin_object:
- return "'{'";
- case token_type::end_array:
- return "']'";
- case token_type::end_object:
- return "'}'";
- case token_type::name_separator:
- return "':'";
- case token_type::value_separator:
- return "','";
- case token_type::parse_error:
- return "<parse error>";
- case token_type::end_of_input:
- return "end of input";
- case token_type::literal_or_value:
- return "'[', '{', or a literal";
-
- default:
- return "unknown token";
-
- }
- }
- };
- template<typename BasicJsonType, typename InputAdapterType>
- class lexer : public lexer_base<BasicJsonType>
- {
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
- using char_type = typename InputAdapterType::char_type;
- using char_int_type = typename std::char_traits<char_type>::int_type;
- public:
- using token_type = typename lexer_base<BasicJsonType>::token_type;
- explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false)
- : ia(std::move(adapter))
- , ignore_comments(ignore_comments_)
- , decimal_point_char(static_cast<char_int_type>(get_decimal_point()))
- {}
-
- lexer(const lexer&) = delete;
- lexer(lexer&&) = default;
- lexer& operator=(lexer&) = delete;
- lexer& operator=(lexer&&) = default;
- ~lexer() = default;
- private:
-
-
-
-
- JSON_HEDLEY_PURE
- static char get_decimal_point() noexcept
- {
- const auto* loc = localeconv();
- JSON_ASSERT(loc != nullptr);
- return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point);
- }
-
-
-
-
- int get_codepoint()
- {
-
- JSON_ASSERT(current == 'u');
- int codepoint = 0;
- const auto factors = { 12u, 8u, 4u, 0u };
- for (const auto factor : factors)
- {
- get();
- if (current >= '0' && current <= '9')
- {
- codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x30u) << factor);
- }
- else if (current >= 'A' && current <= 'F')
- {
- codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x37u) << factor);
- }
- else if (current >= 'a' && current <= 'f')
- {
- codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x57u) << factor);
- }
- else
- {
- return -1;
- }
- }
- JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF);
- return codepoint;
- }
-
- bool next_byte_in_range(std::initializer_list<char_int_type> ranges)
- {
- JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6);
- add(current);
- for (auto range = ranges.begin(); range != ranges.end(); ++range)
- {
- get();
- if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range)))
- {
- add(current);
- }
- else
- {
- error_message = "invalid string: ill-formed UTF-8 byte";
- return false;
- }
- }
- return true;
- }
-
- token_type scan_string()
- {
-
- reset();
-
- JSON_ASSERT(current == '\"');
- while (true)
- {
-
- switch (get())
- {
-
- case std::char_traits<char_type>::eof():
- {
- error_message = "invalid string: missing closing quote";
- return token_type::parse_error;
- }
-
- case '\"':
- {
- return token_type::value_string;
- }
-
- case '\\':
- {
- switch (get())
- {
-
- case '\"':
- add('\"');
- break;
-
- case '\\':
- add('\\');
- break;
-
- case '/':
- add('/');
- break;
-
- case 'b':
- add('\b');
- break;
-
- case 'f':
- add('\f');
- break;
-
- case 'n':
- add('\n');
- break;
-
- case 'r':
- add('\r');
- break;
-
- case 't':
- add('\t');
- break;
-
- case 'u':
- {
- const int codepoint1 = get_codepoint();
- int codepoint = codepoint1;
- if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1))
- {
- error_message = "invalid string: '\\u' must be followed by 4 hex digits";
- return token_type::parse_error;
- }
-
- if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF)
- {
-
- if (JSON_HEDLEY_LIKELY(get() == '\\' && get() == 'u'))
- {
- const int codepoint2 = get_codepoint();
- if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1))
- {
- error_message = "invalid string: '\\u' must be followed by 4 hex digits";
- return token_type::parse_error;
- }
-
- if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF))
- {
-
- codepoint = static_cast<int>(
-
- (static_cast<unsigned int>(codepoint1) << 10u)
-
- + static_cast<unsigned int>(codepoint2)
-
-
-
- - 0x35FDC00u);
- }
- else
- {
- error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
- return token_type::parse_error;
- }
- }
- else
- {
- error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
- return token_type::parse_error;
- }
- }
- else
- {
- if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF))
- {
- error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF";
- return token_type::parse_error;
- }
- }
-
- JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF);
-
- if (codepoint < 0x80)
- {
-
- add(static_cast<char_int_type>(codepoint));
- }
- else if (codepoint <= 0x7FF)
- {
-
- add(static_cast<char_int_type>(0xC0u | (static_cast<unsigned int>(codepoint) >> 6u)));
- add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
- }
- else if (codepoint <= 0xFFFF)
- {
-
- add(static_cast<char_int_type>(0xE0u | (static_cast<unsigned int>(codepoint) >> 12u)));
- add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
- add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
- }
- else
- {
-
- add(static_cast<char_int_type>(0xF0u | (static_cast<unsigned int>(codepoint) >> 18u)));
- add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu)));
- add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
- add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
- }
- break;
- }
-
- default:
- error_message = "invalid string: forbidden character after backslash";
- return token_type::parse_error;
- }
- break;
- }
-
- case 0x00:
- {
- error_message = "invalid string: control character U+0000 (NUL) must be escaped to \\u0000";
- return token_type::parse_error;
- }
- case 0x01:
- {
- error_message = "invalid string: control character U+0001 (SOH) must be escaped to \\u0001";
- return token_type::parse_error;
- }
- case 0x02:
- {
- error_message = "invalid string: control character U+0002 (STX) must be escaped to \\u0002";
- return token_type::parse_error;
- }
- case 0x03:
- {
- error_message = "invalid string: control character U+0003 (ETX) must be escaped to \\u0003";
- return token_type::parse_error;
- }
- case 0x04:
- {
- error_message = "invalid string: control character U+0004 (EOT) must be escaped to \\u0004";
- return token_type::parse_error;
- }
- case 0x05:
- {
- error_message = "invalid string: control character U+0005 (ENQ) must be escaped to \\u0005";
- return token_type::parse_error;
- }
- case 0x06:
- {
- error_message = "invalid string: control character U+0006 (ACK) must be escaped to \\u0006";
- return token_type::parse_error;
- }
- case 0x07:
- {
- error_message = "invalid string: control character U+0007 (BEL) must be escaped to \\u0007";
- return token_type::parse_error;
- }
- case 0x08:
- {
- error_message = "invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b";
- return token_type::parse_error;
- }
- case 0x09:
- {
- error_message = "invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t";
- return token_type::parse_error;
- }
- case 0x0A:
- {
- error_message = "invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n";
- return token_type::parse_error;
- }
- case 0x0B:
- {
- error_message = "invalid string: control character U+000B (VT) must be escaped to \\u000B";
- return token_type::parse_error;
- }
- case 0x0C:
- {
- error_message = "invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f";
- return token_type::parse_error;
- }
- case 0x0D:
- {
- error_message = "invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r";
- return token_type::parse_error;
- }
- case 0x0E:
- {
- error_message = "invalid string: control character U+000E (SO) must be escaped to \\u000E";
- return token_type::parse_error;
- }
- case 0x0F:
- {
- error_message = "invalid string: control character U+000F (SI) must be escaped to \\u000F";
- return token_type::parse_error;
- }
- case 0x10:
- {
- error_message = "invalid string: control character U+0010 (DLE) must be escaped to \\u0010";
- return token_type::parse_error;
- }
- case 0x11:
- {
- error_message = "invalid string: control character U+0011 (DC1) must be escaped to \\u0011";
- return token_type::parse_error;
- }
- case 0x12:
- {
- error_message = "invalid string: control character U+0012 (DC2) must be escaped to \\u0012";
- return token_type::parse_error;
- }
- case 0x13:
- {
- error_message = "invalid string: control character U+0013 (DC3) must be escaped to \\u0013";
- return token_type::parse_error;
- }
- case 0x14:
- {
- error_message = "invalid string: control character U+0014 (DC4) must be escaped to \\u0014";
- return token_type::parse_error;
- }
- case 0x15:
- {
- error_message = "invalid string: control character U+0015 (NAK) must be escaped to \\u0015";
- return token_type::parse_error;
- }
- case 0x16:
- {
- error_message = "invalid string: control character U+0016 (SYN) must be escaped to \\u0016";
- return token_type::parse_error;
- }
- case 0x17:
- {
- error_message = "invalid string: control character U+0017 (ETB) must be escaped to \\u0017";
- return token_type::parse_error;
- }
- case 0x18:
- {
- error_message = "invalid string: control character U+0018 (CAN) must be escaped to \\u0018";
- return token_type::parse_error;
- }
- case 0x19:
- {
- error_message = "invalid string: control character U+0019 (EM) must be escaped to \\u0019";
- return token_type::parse_error;
- }
- case 0x1A:
- {
- error_message = "invalid string: control character U+001A (SUB) must be escaped to \\u001A";
- return token_type::parse_error;
- }
- case 0x1B:
- {
- error_message = "invalid string: control character U+001B (ESC) must be escaped to \\u001B";
- return token_type::parse_error;
- }
- case 0x1C:
- {
- error_message = "invalid string: control character U+001C (FS) must be escaped to \\u001C";
- return token_type::parse_error;
- }
- case 0x1D:
- {
- error_message = "invalid string: control character U+001D (GS) must be escaped to \\u001D";
- return token_type::parse_error;
- }
- case 0x1E:
- {
- error_message = "invalid string: control character U+001E (RS) must be escaped to \\u001E";
- return token_type::parse_error;
- }
- case 0x1F:
- {
- error_message = "invalid string: control character U+001F (US) must be escaped to \\u001F";
- return token_type::parse_error;
- }
-
- case 0x20:
- case 0x21:
- case 0x23:
- case 0x24:
- case 0x25:
- case 0x26:
- case 0x27:
- case 0x28:
- case 0x29:
- case 0x2A:
- case 0x2B:
- case 0x2C:
- case 0x2D:
- case 0x2E:
- case 0x2F:
- case 0x30:
- case 0x31:
- case 0x32:
- case 0x33:
- case 0x34:
- case 0x35:
- case 0x36:
- case 0x37:
- case 0x38:
- case 0x39:
- case 0x3A:
- case 0x3B:
- case 0x3C:
- case 0x3D:
- case 0x3E:
- case 0x3F:
- case 0x40:
- case 0x41:
- case 0x42:
- case 0x43:
- case 0x44:
- case 0x45:
- case 0x46:
- case 0x47:
- case 0x48:
- case 0x49:
- case 0x4A:
- case 0x4B:
- case 0x4C:
- case 0x4D:
- case 0x4E:
- case 0x4F:
- case 0x50:
- case 0x51:
- case 0x52:
- case 0x53:
- case 0x54:
- case 0x55:
- case 0x56:
- case 0x57:
- case 0x58:
- case 0x59:
- case 0x5A:
- case 0x5B:
- case 0x5D:
- case 0x5E:
- case 0x5F:
- case 0x60:
- case 0x61:
- case 0x62:
- case 0x63:
- case 0x64:
- case 0x65:
- case 0x66:
- case 0x67:
- case 0x68:
- case 0x69:
- case 0x6A:
- case 0x6B:
- case 0x6C:
- case 0x6D:
- case 0x6E:
- case 0x6F:
- case 0x70:
- case 0x71:
- case 0x72:
- case 0x73:
- case 0x74:
- case 0x75:
- case 0x76:
- case 0x77:
- case 0x78:
- case 0x79:
- case 0x7A:
- case 0x7B:
- case 0x7C:
- case 0x7D:
- case 0x7E:
- case 0x7F:
- {
- add(current);
- break;
- }
-
- case 0xC2:
- case 0xC3:
- case 0xC4:
- case 0xC5:
- case 0xC6:
- case 0xC7:
- case 0xC8:
- case 0xC9:
- case 0xCA:
- case 0xCB:
- case 0xCC:
- case 0xCD:
- case 0xCE:
- case 0xCF:
- case 0xD0:
- case 0xD1:
- case 0xD2:
- case 0xD3:
- case 0xD4:
- case 0xD5:
- case 0xD6:
- case 0xD7:
- case 0xD8:
- case 0xD9:
- case 0xDA:
- case 0xDB:
- case 0xDC:
- case 0xDD:
- case 0xDE:
- case 0xDF:
- {
- if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF})))
- {
- return token_type::parse_error;
- }
- break;
- }
-
- case 0xE0:
- {
- if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF}))))
- {
- return token_type::parse_error;
- }
- break;
- }
-
-
- case 0xE1:
- case 0xE2:
- case 0xE3:
- case 0xE4:
- case 0xE5:
- case 0xE6:
- case 0xE7:
- case 0xE8:
- case 0xE9:
- case 0xEA:
- case 0xEB:
- case 0xEC:
- case 0xEE:
- case 0xEF:
- {
- if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF}))))
- {
- return token_type::parse_error;
- }
- break;
- }
-
- case 0xED:
- {
- if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF}))))
- {
- return token_type::parse_error;
- }
- break;
- }
-
- case 0xF0:
- {
- if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))
- {
- return token_type::parse_error;
- }
- break;
- }
-
- case 0xF1:
- case 0xF2:
- case 0xF3:
- {
- if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))
- {
- return token_type::parse_error;
- }
- break;
- }
-
- case 0xF4:
- {
- if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF}))))
- {
- return token_type::parse_error;
- }
- break;
- }
-
- default:
- {
- error_message = "invalid string: ill-formed UTF-8 byte";
- return token_type::parse_error;
- }
- }
- }
- }
-
- bool scan_comment()
- {
- switch (get())
- {
-
- case '/':
- {
- while (true)
- {
- switch (get())
- {
- case '\n':
- case '\r':
- case std::char_traits<char_type>::eof():
- case '\0':
- return true;
- default:
- break;
- }
- }
- }
-
- case '*':
- {
- while (true)
- {
- switch (get())
- {
- case std::char_traits<char_type>::eof():
- case '\0':
- {
- error_message = "invalid comment; missing closing '*/'";
- return false;
- }
- case '*':
- {
- switch (get())
- {
- case '/':
- return true;
- default:
- {
- unget();
- continue;
- }
- }
- }
- default:
- continue;
- }
- }
- }
-
- default:
- {
- error_message = "invalid comment; expecting '/' or '*' after '/'";
- return false;
- }
- }
- }
- JSON_HEDLEY_NON_NULL(2)
- static void strtof(float& f, const char* str, char** endptr) noexcept
- {
- f = std::strtof(str, endptr);
- }
- JSON_HEDLEY_NON_NULL(2)
- static void strtof(double& f, const char* str, char** endptr) noexcept
- {
- f = std::strtod(str, endptr);
- }
- JSON_HEDLEY_NON_NULL(2)
- static void strtof(long double& f, const char* str, char** endptr) noexcept
- {
- f = std::strtold(str, endptr);
- }
-
- token_type scan_number()
- {
-
- reset();
-
-
- token_type number_type = token_type::value_unsigned;
-
- switch (current)
- {
- case '-':
- {
- add(current);
- goto scan_number_minus;
- }
- case '0':
- {
- add(current);
- goto scan_number_zero;
- }
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- add(current);
- goto scan_number_any1;
- }
-
- default:
- JSON_ASSERT(false);
- }
- scan_number_minus:
-
- number_type = token_type::value_integer;
- switch (get())
- {
- case '0':
- {
- add(current);
- goto scan_number_zero;
- }
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- add(current);
- goto scan_number_any1;
- }
- default:
- {
- error_message = "invalid number; expected digit after '-'";
- return token_type::parse_error;
- }
- }
- scan_number_zero:
-
- switch (get())
- {
- case '.':
- {
- add(decimal_point_char);
- goto scan_number_decimal1;
- }
- case 'e':
- case 'E':
- {
- add(current);
- goto scan_number_exponent;
- }
- default:
- goto scan_number_done;
- }
- scan_number_any1:
-
- switch (get())
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- add(current);
- goto scan_number_any1;
- }
- case '.':
- {
- add(decimal_point_char);
- goto scan_number_decimal1;
- }
- case 'e':
- case 'E':
- {
- add(current);
- goto scan_number_exponent;
- }
- default:
- goto scan_number_done;
- }
- scan_number_decimal1:
-
- number_type = token_type::value_float;
- switch (get())
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- add(current);
- goto scan_number_decimal2;
- }
- default:
- {
- error_message = "invalid number; expected digit after '.'";
- return token_type::parse_error;
- }
- }
- scan_number_decimal2:
-
- switch (get())
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- add(current);
- goto scan_number_decimal2;
- }
- case 'e':
- case 'E':
- {
- add(current);
- goto scan_number_exponent;
- }
- default:
- goto scan_number_done;
- }
- scan_number_exponent:
-
- number_type = token_type::value_float;
- switch (get())
- {
- case '+':
- case '-':
- {
- add(current);
- goto scan_number_sign;
- }
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- add(current);
- goto scan_number_any2;
- }
- default:
- {
- error_message =
- "invalid number; expected '+', '-', or digit after exponent";
- return token_type::parse_error;
- }
- }
- scan_number_sign:
-
- switch (get())
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- add(current);
- goto scan_number_any2;
- }
- default:
- {
- error_message = "invalid number; expected digit after exponent sign";
- return token_type::parse_error;
- }
- }
- scan_number_any2:
-
- switch (get())
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- {
- add(current);
- goto scan_number_any2;
- }
- default:
- goto scan_number_done;
- }
- scan_number_done:
-
-
- unget();
- char* endptr = nullptr;
- errno = 0;
-
- if (number_type == token_type::value_unsigned)
- {
- const auto x = std::strtoull(token_buffer.data(), &endptr, 10);
-
- JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());
- if (errno == 0)
- {
- value_unsigned = static_cast<number_unsigned_t>(x);
- if (value_unsigned == x)
- {
- return token_type::value_unsigned;
- }
- }
- }
- else if (number_type == token_type::value_integer)
- {
- const auto x = std::strtoll(token_buffer.data(), &endptr, 10);
-
- JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());
- if (errno == 0)
- {
- value_integer = static_cast<number_integer_t>(x);
- if (value_integer == x)
- {
- return token_type::value_integer;
- }
- }
- }
-
-
- strtof(value_float, token_buffer.data(), &endptr);
-
- JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());
- return token_type::value_float;
- }
-
- JSON_HEDLEY_NON_NULL(2)
- token_type scan_literal(const char_type* literal_text, const std::size_t length,
- token_type return_type)
- {
- JSON_ASSERT(std::char_traits<char_type>::to_char_type(current) == literal_text[0]);
- for (std::size_t i = 1; i < length; ++i)
- {
- if (JSON_HEDLEY_UNLIKELY(std::char_traits<char_type>::to_char_type(get()) != literal_text[i]))
- {
- error_message = "invalid literal";
- return token_type::parse_error;
- }
- }
- return return_type;
- }
-
-
-
-
- void reset() noexcept
- {
- token_buffer.clear();
- token_string.clear();
- token_string.push_back(std::char_traits<char_type>::to_char_type(current));
- }
-
- char_int_type get()
- {
- ++position.chars_read_total;
- ++position.chars_read_current_line;
- if (next_unget)
- {
-
- next_unget = false;
- }
- else
- {
- current = ia.get_character();
- }
- if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))
- {
- token_string.push_back(std::char_traits<char_type>::to_char_type(current));
- }
- if (current == '\n')
- {
- ++position.lines_read;
- position.chars_read_current_line = 0;
- }
- return current;
- }
-
- void unget()
- {
- next_unget = true;
- --position.chars_read_total;
-
- if (position.chars_read_current_line == 0)
- {
- if (position.lines_read > 0)
- {
- --position.lines_read;
- }
- }
- else
- {
- --position.chars_read_current_line;
- }
- if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))
- {
- JSON_ASSERT(!token_string.empty());
- token_string.pop_back();
- }
- }
-
- void add(char_int_type c)
- {
- token_buffer.push_back(static_cast<typename string_t::value_type>(c));
- }
- public:
-
-
-
-
- constexpr number_integer_t get_number_integer() const noexcept
- {
- return value_integer;
- }
-
- constexpr number_unsigned_t get_number_unsigned() const noexcept
- {
- return value_unsigned;
- }
-
- constexpr number_float_t get_number_float() const noexcept
- {
- return value_float;
- }
-
- string_t& get_string()
- {
- return token_buffer;
- }
-
-
-
-
- constexpr position_t get_position() const noexcept
- {
- return position;
- }
-
-
-
- std::string get_token_string() const
- {
-
- std::string result;
- for (const auto c : token_string)
- {
- if (static_cast<unsigned char>(c) <= '\x1F')
- {
-
- std::array<char, 9> cs{{}};
- (std::snprintf)(cs.data(), cs.size(), "<U+%.4X>", static_cast<unsigned char>(c));
- result += cs.data();
- }
- else
- {
-
- result.push_back(static_cast<std::string::value_type>(c));
- }
- }
- return result;
- }
-
- JSON_HEDLEY_RETURNS_NON_NULL
- constexpr const char* get_error_message() const noexcept
- {
- return error_message;
- }
-
-
-
-
- bool skip_bom()
- {
- if (get() == 0xEF)
- {
-
- return get() == 0xBB && get() == 0xBF;
- }
-
-
- unget();
- return true;
- }
- void skip_whitespace()
- {
- do
- {
- get();
- }
- while (current == ' ' || current == '\t' || current == '\n' || current == '\r');
- }
- token_type scan()
- {
-
- if (position.chars_read_total == 0 && !skip_bom())
- {
- error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given";
- return token_type::parse_error;
- }
-
- skip_whitespace();
-
- while (ignore_comments && current == '/')
- {
- if (!scan_comment())
- {
- return token_type::parse_error;
- }
-
- skip_whitespace();
- }
- switch (current)
- {
-
- case '[':
- return token_type::begin_array;
- case ']':
- return token_type::end_array;
- case '{':
- return token_type::begin_object;
- case '}':
- return token_type::end_object;
- case ':':
- return token_type::name_separator;
- case ',':
- return token_type::value_separator;
-
- case 't':
- {
- std::array<char_type, 4> true_literal = {{'t', 'r', 'u', 'e'}};
- return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true);
- }
- case 'f':
- {
- std::array<char_type, 5> false_literal = {{'f', 'a', 'l', 's', 'e'}};
- return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false);
- }
- case 'n':
- {
- std::array<char_type, 4> null_literal = {{'n', 'u', 'l', 'l'}};
- return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null);
- }
-
- case '\"':
- return scan_string();
-
- case '-':
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- return scan_number();
-
-
- case '\0':
- case std::char_traits<char_type>::eof():
- return token_type::end_of_input;
-
- default:
- error_message = "invalid literal";
- return token_type::parse_error;
- }
- }
- private:
-
- InputAdapterType ia;
-
- const bool ignore_comments = false;
-
- char_int_type current = std::char_traits<char_type>::eof();
-
- bool next_unget = false;
-
- position_t position {};
-
- std::vector<char_type> token_string {};
-
- string_t token_buffer {};
-
- const char* error_message = "";
-
- number_integer_t value_integer = 0;
- number_unsigned_t value_unsigned = 0;
- number_float_t value_float = 0;
-
- const char_int_type decimal_point_char = '.';
- };
- }
- }
- #include <cstdint> // size_t
- #include <utility> // declval
- #include <string> // string
- namespace nlohmann
- {
- namespace detail
- {
- template<typename T>
- using null_function_t = decltype(std::declval<T&>().null());
- template<typename T>
- using boolean_function_t =
- decltype(std::declval<T&>().boolean(std::declval<bool>()));
- template<typename T, typename Integer>
- using number_integer_function_t =
- decltype(std::declval<T&>().number_integer(std::declval<Integer>()));
- template<typename T, typename Unsigned>
- using number_unsigned_function_t =
- decltype(std::declval<T&>().number_unsigned(std::declval<Unsigned>()));
- template<typename T, typename Float, typename String>
- using number_float_function_t = decltype(std::declval<T&>().number_float(
- std::declval<Float>(), std::declval<const String&>()));
- template<typename T, typename String>
- using string_function_t =
- decltype(std::declval<T&>().string(std::declval<String&>()));
- template<typename T, typename Binary>
- using binary_function_t =
- decltype(std::declval<T&>().binary(std::declval<Binary&>()));
- template<typename T>
- using start_object_function_t =
- decltype(std::declval<T&>().start_object(std::declval<std::size_t>()));
- template<typename T, typename String>
- using key_function_t =
- decltype(std::declval<T&>().key(std::declval<String&>()));
- template<typename T>
- using end_object_function_t = decltype(std::declval<T&>().end_object());
- template<typename T>
- using start_array_function_t =
- decltype(std::declval<T&>().start_array(std::declval<std::size_t>()));
- template<typename T>
- using end_array_function_t = decltype(std::declval<T&>().end_array());
- template<typename T, typename Exception>
- using parse_error_function_t = decltype(std::declval<T&>().parse_error(
- std::declval<std::size_t>(), std::declval<const std::string&>(),
- std::declval<const Exception&>()));
- template<typename SAX, typename BasicJsonType>
- struct is_sax
- {
- private:
- static_assert(is_basic_json<BasicJsonType>::value,
- "BasicJsonType must be of type basic_json<...>");
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
- using binary_t = typename BasicJsonType::binary_t;
- using exception_t = typename BasicJsonType::exception;
- public:
- static constexpr bool value =
- is_detected_exact<bool, null_function_t, SAX>::value &&
- is_detected_exact<bool, boolean_function_t, SAX>::value &&
- is_detected_exact<bool, number_integer_function_t, SAX, number_integer_t>::value &&
- is_detected_exact<bool, number_unsigned_function_t, SAX, number_unsigned_t>::value &&
- is_detected_exact<bool, number_float_function_t, SAX, number_float_t, string_t>::value &&
- is_detected_exact<bool, string_function_t, SAX, string_t>::value &&
- is_detected_exact<bool, binary_function_t, SAX, binary_t>::value &&
- is_detected_exact<bool, start_object_function_t, SAX>::value &&
- is_detected_exact<bool, key_function_t, SAX, string_t>::value &&
- is_detected_exact<bool, end_object_function_t, SAX>::value &&
- is_detected_exact<bool, start_array_function_t, SAX>::value &&
- is_detected_exact<bool, end_array_function_t, SAX>::value &&
- is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value;
- };
- template<typename SAX, typename BasicJsonType>
- struct is_sax_static_asserts
- {
- private:
- static_assert(is_basic_json<BasicJsonType>::value,
- "BasicJsonType must be of type basic_json<...>");
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
- using binary_t = typename BasicJsonType::binary_t;
- using exception_t = typename BasicJsonType::exception;
- public:
- static_assert(is_detected_exact<bool, null_function_t, SAX>::value,
- "Missing/invalid function: bool null()");
- static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,
- "Missing/invalid function: bool boolean(bool)");
- static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,
- "Missing/invalid function: bool boolean(bool)");
- static_assert(
- is_detected_exact<bool, number_integer_function_t, SAX,
- number_integer_t>::value,
- "Missing/invalid function: bool number_integer(number_integer_t)");
- static_assert(
- is_detected_exact<bool, number_unsigned_function_t, SAX,
- number_unsigned_t>::value,
- "Missing/invalid function: bool number_unsigned(number_unsigned_t)");
- static_assert(is_detected_exact<bool, number_float_function_t, SAX,
- number_float_t, string_t>::value,
- "Missing/invalid function: bool number_float(number_float_t, const string_t&)");
- static_assert(
- is_detected_exact<bool, string_function_t, SAX, string_t>::value,
- "Missing/invalid function: bool string(string_t&)");
- static_assert(
- is_detected_exact<bool, binary_function_t, SAX, binary_t>::value,
- "Missing/invalid function: bool binary(binary_t&)");
- static_assert(is_detected_exact<bool, start_object_function_t, SAX>::value,
- "Missing/invalid function: bool start_object(std::size_t)");
- static_assert(is_detected_exact<bool, key_function_t, SAX, string_t>::value,
- "Missing/invalid function: bool key(string_t&)");
- static_assert(is_detected_exact<bool, end_object_function_t, SAX>::value,
- "Missing/invalid function: bool end_object()");
- static_assert(is_detected_exact<bool, start_array_function_t, SAX>::value,
- "Missing/invalid function: bool start_array(std::size_t)");
- static_assert(is_detected_exact<bool, end_array_function_t, SAX>::value,
- "Missing/invalid function: bool end_array()");
- static_assert(
- is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value,
- "Missing/invalid function: bool parse_error(std::size_t, const "
- "std::string&, const exception&)");
- };
- }
- }
- namespace nlohmann
- {
- namespace detail
- {
- enum class cbor_tag_handler_t
- {
- error,
- ignore
- };
- static inline bool little_endianess(int num = 1) noexcept
- {
- return *reinterpret_cast<char*>(&num) == 1;
- }
- template<typename BasicJsonType, typename InputAdapterType, typename SAX = json_sax_dom_parser<BasicJsonType>>
- class binary_reader
- {
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
- using binary_t = typename BasicJsonType::binary_t;
- using json_sax_t = SAX;
- using char_type = typename InputAdapterType::char_type;
- using char_int_type = typename std::char_traits<char_type>::int_type;
- public:
-
- explicit binary_reader(InputAdapterType&& adapter) : ia(std::move(adapter))
- {
- (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};
- }
-
- binary_reader(const binary_reader&) = delete;
- binary_reader(binary_reader&&) = default;
- binary_reader& operator=(const binary_reader&) = delete;
- binary_reader& operator=(binary_reader&&) = default;
- ~binary_reader() = default;
-
- JSON_HEDLEY_NON_NULL(3)
- bool sax_parse(const input_format_t format,
- json_sax_t* sax_,
- const bool strict = true,
- const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)
- {
- sax = sax_;
- bool result = false;
- switch (format)
- {
- case input_format_t::bson:
- result = parse_bson_internal();
- break;
- case input_format_t::cbor:
- result = parse_cbor_internal(true, tag_handler);
- break;
- case input_format_t::msgpack:
- result = parse_msgpack_internal();
- break;
- case input_format_t::ubjson:
- result = parse_ubjson_internal();
- break;
- default:
- JSON_ASSERT(false);
- }
-
- if (result && strict)
- {
- if (format == input_format_t::ubjson)
- {
- get_ignore_noop();
- }
- else
- {
- get();
- }
- if (JSON_HEDLEY_UNLIKELY(current != std::char_traits<char_type>::eof()))
- {
- return sax->parse_error(chars_read, get_token_string(),
- parse_error::create(110, chars_read, exception_message(format, "expected end of input; last byte: 0x" + get_token_string(), "value")));
- }
- }
- return result;
- }
- private:
-
-
-
-
- bool parse_bson_internal()
- {
- std::int32_t document_size{};
- get_number<std::int32_t, true>(input_format_t::bson, document_size);
- if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1))))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(false)))
- {
- return false;
- }
- return sax->end_object();
- }
-
- bool get_bson_cstr(string_t& result)
- {
- auto out = std::back_inserter(result);
- while (true)
- {
- get();
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "cstring")))
- {
- return false;
- }
- if (current == 0x00)
- {
- return true;
- }
- *out++ = static_cast<typename string_t::value_type>(current);
- }
- }
-
- template<typename NumberType>
- bool get_bson_string(const NumberType len, string_t& result)
- {
- if (JSON_HEDLEY_UNLIKELY(len < 1))
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "string length must be at least 1, is " + std::to_string(len), "string")));
- }
- return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) && get() != std::char_traits<char_type>::eof();
- }
-
- template<typename NumberType>
- bool get_bson_binary(const NumberType len, binary_t& result)
- {
- if (JSON_HEDLEY_UNLIKELY(len < 0))
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "byte array length cannot be negative, is " + std::to_string(len), "binary")));
- }
-
- std::uint8_t subtype{};
- get_number<std::uint8_t>(input_format_t::bson, subtype);
- result.set_subtype(subtype);
- return get_binary(input_format_t::bson, len, result);
- }
-
- bool parse_bson_element_internal(const char_int_type element_type,
- const std::size_t element_type_parse_position)
- {
- switch (element_type)
- {
- case 0x01:
- {
- double number{};
- return get_number<double, true>(input_format_t::bson, number) && sax->number_float(static_cast<number_float_t>(number), "");
- }
- case 0x02:
- {
- std::int32_t len{};
- string_t value;
- return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value);
- }
- case 0x03:
- {
- return parse_bson_internal();
- }
- case 0x04:
- {
- return parse_bson_array();
- }
- case 0x05:
- {
- std::int32_t len{};
- binary_t value;
- return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value);
- }
- case 0x08:
- {
- return sax->boolean(get() != 0);
- }
- case 0x0A:
- {
- return sax->null();
- }
- case 0x10:
- {
- std::int32_t value{};
- return get_number<std::int32_t, true>(input_format_t::bson, value) && sax->number_integer(value);
- }
- case 0x12:
- {
- std::int64_t value{};
- return get_number<std::int64_t, true>(input_format_t::bson, value) && sax->number_integer(value);
- }
- default:
- {
- std::array<char, 3> cr{{}};
- (std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(element_type));
- return sax->parse_error(element_type_parse_position, std::string(cr.data()), parse_error::create(114, element_type_parse_position, "Unsupported BSON record type 0x" + std::string(cr.data())));
- }
- }
- }
-
- bool parse_bson_element_list(const bool is_array)
- {
- string_t key;
- while (auto element_type = get())
- {
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "element list")))
- {
- return false;
- }
- const std::size_t element_type_parse_position = chars_read;
- if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key)))
- {
- return false;
- }
- if (!is_array && !sax->key(key))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position)))
- {
- return false;
- }
-
- key.clear();
- }
- return true;
- }
-
- bool parse_bson_array()
- {
- std::int32_t document_size{};
- get_number<std::int32_t, true>(input_format_t::bson, document_size);
- if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1))))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(true)))
- {
- return false;
- }
- return sax->end_array();
- }
-
-
-
-
- bool parse_cbor_internal(const bool get_char,
- const cbor_tag_handler_t tag_handler)
- {
- switch (get_char ? get() : current)
- {
-
- case std::char_traits<char_type>::eof():
- return unexpect_eof(input_format_t::cbor, "value");
-
- case 0x00:
- case 0x01:
- case 0x02:
- case 0x03:
- case 0x04:
- case 0x05:
- case 0x06:
- case 0x07:
- case 0x08:
- case 0x09:
- case 0x0A:
- case 0x0B:
- case 0x0C:
- case 0x0D:
- case 0x0E:
- case 0x0F:
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- return sax->number_unsigned(static_cast<number_unsigned_t>(current));
- case 0x18:
- {
- std::uint8_t number{};
- return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);
- }
- case 0x19:
- {
- std::uint16_t number{};
- return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);
- }
- case 0x1A:
- {
- std::uint32_t number{};
- return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);
- }
- case 0x1B:
- {
- std::uint64_t number{};
- return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);
- }
-
- case 0x20:
- case 0x21:
- case 0x22:
- case 0x23:
- case 0x24:
- case 0x25:
- case 0x26:
- case 0x27:
- case 0x28:
- case 0x29:
- case 0x2A:
- case 0x2B:
- case 0x2C:
- case 0x2D:
- case 0x2E:
- case 0x2F:
- case 0x30:
- case 0x31:
- case 0x32:
- case 0x33:
- case 0x34:
- case 0x35:
- case 0x36:
- case 0x37:
- return sax->number_integer(static_cast<std::int8_t>(0x20 - 1 - current));
- case 0x38:
- {
- std::uint8_t number{};
- return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);
- }
- case 0x39:
- {
- std::uint16_t number{};
- return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);
- }
- case 0x3A:
- {
- std::uint32_t number{};
- return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1) - number);
- }
- case 0x3B:
- {
- std::uint64_t number{};
- return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast<number_integer_t>(-1)
- - static_cast<number_integer_t>(number));
- }
-
- case 0x40:
- case 0x41:
- case 0x42:
- case 0x43:
- case 0x44:
- case 0x45:
- case 0x46:
- case 0x47:
- case 0x48:
- case 0x49:
- case 0x4A:
- case 0x4B:
- case 0x4C:
- case 0x4D:
- case 0x4E:
- case 0x4F:
- case 0x50:
- case 0x51:
- case 0x52:
- case 0x53:
- case 0x54:
- case 0x55:
- case 0x56:
- case 0x57:
- case 0x58:
- case 0x59:
- case 0x5A:
- case 0x5B:
- case 0x5F:
- {
- binary_t b;
- return get_cbor_binary(b) && sax->binary(b);
- }
-
- case 0x60:
- case 0x61:
- case 0x62:
- case 0x63:
- case 0x64:
- case 0x65:
- case 0x66:
- case 0x67:
- case 0x68:
- case 0x69:
- case 0x6A:
- case 0x6B:
- case 0x6C:
- case 0x6D:
- case 0x6E:
- case 0x6F:
- case 0x70:
- case 0x71:
- case 0x72:
- case 0x73:
- case 0x74:
- case 0x75:
- case 0x76:
- case 0x77:
- case 0x78:
- case 0x79:
- case 0x7A:
- case 0x7B:
- case 0x7F:
- {
- string_t s;
- return get_cbor_string(s) && sax->string(s);
- }
-
- case 0x80:
- case 0x81:
- case 0x82:
- case 0x83:
- case 0x84:
- case 0x85:
- case 0x86:
- case 0x87:
- case 0x88:
- case 0x89:
- case 0x8A:
- case 0x8B:
- case 0x8C:
- case 0x8D:
- case 0x8E:
- case 0x8F:
- case 0x90:
- case 0x91:
- case 0x92:
- case 0x93:
- case 0x94:
- case 0x95:
- case 0x96:
- case 0x97:
- return get_cbor_array(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);
- case 0x98:
- {
- std::uint8_t len{};
- return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);
- }
- case 0x99:
- {
- std::uint16_t len{};
- return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);
- }
- case 0x9A:
- {
- std::uint32_t len{};
- return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);
- }
- case 0x9B:
- {
- std::uint64_t len{};
- return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);
- }
- case 0x9F:
- return get_cbor_array(std::size_t(-1), tag_handler);
-
- case 0xA0:
- case 0xA1:
- case 0xA2:
- case 0xA3:
- case 0xA4:
- case 0xA5:
- case 0xA6:
- case 0xA7:
- case 0xA8:
- case 0xA9:
- case 0xAA:
- case 0xAB:
- case 0xAC:
- case 0xAD:
- case 0xAE:
- case 0xAF:
- case 0xB0:
- case 0xB1:
- case 0xB2:
- case 0xB3:
- case 0xB4:
- case 0xB5:
- case 0xB6:
- case 0xB7:
- return get_cbor_object(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);
- case 0xB8:
- {
- std::uint8_t len{};
- return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);
- }
- case 0xB9:
- {
- std::uint16_t len{};
- return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);
- }
- case 0xBA:
- {
- std::uint32_t len{};
- return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);
- }
- case 0xBB:
- {
- std::uint64_t len{};
- return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);
- }
- case 0xBF:
- return get_cbor_object(std::size_t(-1), tag_handler);
- case 0xC6:
- case 0xC7:
- case 0xC8:
- case 0xC9:
- case 0xCA:
- case 0xCB:
- case 0xCC:
- case 0xCD:
- case 0xCE:
- case 0xCF:
- case 0xD0:
- case 0xD1:
- case 0xD2:
- case 0xD3:
- case 0xD4:
- case 0xD8:
- case 0xD9:
- case 0xDA:
- case 0xDB:
- {
- switch (tag_handler)
- {
- case cbor_tag_handler_t::error:
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value")));
- }
- case cbor_tag_handler_t::ignore:
- {
- switch (current)
- {
- case 0xD8:
- {
- std::uint8_t len{};
- get_number(input_format_t::cbor, len);
- break;
- }
- case 0xD9:
- {
- std::uint16_t len{};
- get_number(input_format_t::cbor, len);
- break;
- }
- case 0xDA:
- {
- std::uint32_t len{};
- get_number(input_format_t::cbor, len);
- break;
- }
- case 0xDB:
- {
- std::uint64_t len{};
- get_number(input_format_t::cbor, len);
- break;
- }
- default:
- break;
- }
- return parse_cbor_internal(true, tag_handler);
- }
- default:
- JSON_ASSERT(false);
- }
- }
- case 0xF4:
- return sax->boolean(false);
- case 0xF5:
- return sax->boolean(true);
- case 0xF6:
- return sax->null();
- case 0xF9:
- {
- const auto byte1_raw = get();
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number")))
- {
- return false;
- }
- const auto byte2_raw = get();
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number")))
- {
- return false;
- }
- const auto byte1 = static_cast<unsigned char>(byte1_raw);
- const auto byte2 = static_cast<unsigned char>(byte2_raw);
-
-
-
-
-
-
-
-
- const auto half = static_cast<unsigned int>((byte1 << 8u) + byte2);
- const double val = [&half]
- {
- const int exp = (half >> 10u) & 0x1Fu;
- const unsigned int mant = half & 0x3FFu;
- JSON_ASSERT(0 <= exp&& exp <= 32);
- JSON_ASSERT(mant <= 1024);
- switch (exp)
- {
- case 0:
- return std::ldexp(mant, -24);
- case 31:
- return (mant == 0)
- ? std::numeric_limits<double>::infinity()
- : std::numeric_limits<double>::quiet_NaN();
- default:
- return std::ldexp(mant + 1024, exp - 25);
- }
- }();
- return sax->number_float((half & 0x8000u) != 0
- ? static_cast<number_float_t>(-val)
- : static_cast<number_float_t>(val), "");
- }
- case 0xFA:
- {
- float number{};
- return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), "");
- }
- case 0xFB:
- {
- double number{};
- return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), "");
- }
- default:
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value")));
- }
- }
- }
-
- bool get_cbor_string(string_t& result)
- {
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "string")))
- {
- return false;
- }
- switch (current)
- {
-
- case 0x60:
- case 0x61:
- case 0x62:
- case 0x63:
- case 0x64:
- case 0x65:
- case 0x66:
- case 0x67:
- case 0x68:
- case 0x69:
- case 0x6A:
- case 0x6B:
- case 0x6C:
- case 0x6D:
- case 0x6E:
- case 0x6F:
- case 0x70:
- case 0x71:
- case 0x72:
- case 0x73:
- case 0x74:
- case 0x75:
- case 0x76:
- case 0x77:
- {
- return get_string(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);
- }
- case 0x78:
- {
- std::uint8_t len{};
- return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);
- }
- case 0x79:
- {
- std::uint16_t len{};
- return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);
- }
- case 0x7A:
- {
- std::uint32_t len{};
- return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);
- }
- case 0x7B:
- {
- std::uint64_t len{};
- return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);
- }
- case 0x7F:
- {
- while (get() != 0xFF)
- {
- string_t chunk;
- if (!get_cbor_string(chunk))
- {
- return false;
- }
- result.append(chunk);
- }
- return true;
- }
- default:
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x" + last_token, "string")));
- }
- }
- }
-
- bool get_cbor_binary(binary_t& result)
- {
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "binary")))
- {
- return false;
- }
- switch (current)
- {
-
- case 0x40:
- case 0x41:
- case 0x42:
- case 0x43:
- case 0x44:
- case 0x45:
- case 0x46:
- case 0x47:
- case 0x48:
- case 0x49:
- case 0x4A:
- case 0x4B:
- case 0x4C:
- case 0x4D:
- case 0x4E:
- case 0x4F:
- case 0x50:
- case 0x51:
- case 0x52:
- case 0x53:
- case 0x54:
- case 0x55:
- case 0x56:
- case 0x57:
- {
- return get_binary(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);
- }
- case 0x58:
- {
- std::uint8_t len{};
- return get_number(input_format_t::cbor, len) &&
- get_binary(input_format_t::cbor, len, result);
- }
- case 0x59:
- {
- std::uint16_t len{};
- return get_number(input_format_t::cbor, len) &&
- get_binary(input_format_t::cbor, len, result);
- }
- case 0x5A:
- {
- std::uint32_t len{};
- return get_number(input_format_t::cbor, len) &&
- get_binary(input_format_t::cbor, len, result);
- }
- case 0x5B:
- {
- std::uint64_t len{};
- return get_number(input_format_t::cbor, len) &&
- get_binary(input_format_t::cbor, len, result);
- }
- case 0x5F:
- {
- while (get() != 0xFF)
- {
- binary_t chunk;
- if (!get_cbor_binary(chunk))
- {
- return false;
- }
- result.insert(result.end(), chunk.begin(), chunk.end());
- }
- return true;
- }
- default:
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x" + last_token, "binary")));
- }
- }
- }
-
- bool get_cbor_array(const std::size_t len,
- const cbor_tag_handler_t tag_handler)
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len)))
- {
- return false;
- }
- if (len != std::size_t(-1))
- {
- for (std::size_t i = 0; i < len; ++i)
- {
- if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))
- {
- return false;
- }
- }
- }
- else
- {
- while (get() != 0xFF)
- {
- if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler)))
- {
- return false;
- }
- }
- }
- return sax->end_array();
- }
-
- bool get_cbor_object(const std::size_t len,
- const cbor_tag_handler_t tag_handler)
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))
- {
- return false;
- }
- string_t key;
- if (len != std::size_t(-1))
- {
- for (std::size_t i = 0; i < len; ++i)
- {
- get();
- if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key)))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))
- {
- return false;
- }
- key.clear();
- }
- }
- else
- {
- while (get() != 0xFF)
- {
- if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key)))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler)))
- {
- return false;
- }
- key.clear();
- }
- }
- return sax->end_object();
- }
-
-
-
-
- bool parse_msgpack_internal()
- {
- switch (get())
- {
-
- case std::char_traits<char_type>::eof():
- return unexpect_eof(input_format_t::msgpack, "value");
-
- case 0x00:
- case 0x01:
- case 0x02:
- case 0x03:
- case 0x04:
- case 0x05:
- case 0x06:
- case 0x07:
- case 0x08:
- case 0x09:
- case 0x0A:
- case 0x0B:
- case 0x0C:
- case 0x0D:
- case 0x0E:
- case 0x0F:
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13:
- case 0x14:
- case 0x15:
- case 0x16:
- case 0x17:
- case 0x18:
- case 0x19:
- case 0x1A:
- case 0x1B:
- case 0x1C:
- case 0x1D:
- case 0x1E:
- case 0x1F:
- case 0x20:
- case 0x21:
- case 0x22:
- case 0x23:
- case 0x24:
- case 0x25:
- case 0x26:
- case 0x27:
- case 0x28:
- case 0x29:
- case 0x2A:
- case 0x2B:
- case 0x2C:
- case 0x2D:
- case 0x2E:
- case 0x2F:
- case 0x30:
- case 0x31:
- case 0x32:
- case 0x33:
- case 0x34:
- case 0x35:
- case 0x36:
- case 0x37:
- case 0x38:
- case 0x39:
- case 0x3A:
- case 0x3B:
- case 0x3C:
- case 0x3D:
- case 0x3E:
- case 0x3F:
- case 0x40:
- case 0x41:
- case 0x42:
- case 0x43:
- case 0x44:
- case 0x45:
- case 0x46:
- case 0x47:
- case 0x48:
- case 0x49:
- case 0x4A:
- case 0x4B:
- case 0x4C:
- case 0x4D:
- case 0x4E:
- case 0x4F:
- case 0x50:
- case 0x51:
- case 0x52:
- case 0x53:
- case 0x54:
- case 0x55:
- case 0x56:
- case 0x57:
- case 0x58:
- case 0x59:
- case 0x5A:
- case 0x5B:
- case 0x5C:
- case 0x5D:
- case 0x5E:
- case 0x5F:
- case 0x60:
- case 0x61:
- case 0x62:
- case 0x63:
- case 0x64:
- case 0x65:
- case 0x66:
- case 0x67:
- case 0x68:
- case 0x69:
- case 0x6A:
- case 0x6B:
- case 0x6C:
- case 0x6D:
- case 0x6E:
- case 0x6F:
- case 0x70:
- case 0x71:
- case 0x72:
- case 0x73:
- case 0x74:
- case 0x75:
- case 0x76:
- case 0x77:
- case 0x78:
- case 0x79:
- case 0x7A:
- case 0x7B:
- case 0x7C:
- case 0x7D:
- case 0x7E:
- case 0x7F:
- return sax->number_unsigned(static_cast<number_unsigned_t>(current));
-
- case 0x80:
- case 0x81:
- case 0x82:
- case 0x83:
- case 0x84:
- case 0x85:
- case 0x86:
- case 0x87:
- case 0x88:
- case 0x89:
- case 0x8A:
- case 0x8B:
- case 0x8C:
- case 0x8D:
- case 0x8E:
- case 0x8F:
- return get_msgpack_object(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));
-
- case 0x90:
- case 0x91:
- case 0x92:
- case 0x93:
- case 0x94:
- case 0x95:
- case 0x96:
- case 0x97:
- case 0x98:
- case 0x99:
- case 0x9A:
- case 0x9B:
- case 0x9C:
- case 0x9D:
- case 0x9E:
- case 0x9F:
- return get_msgpack_array(static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));
-
- case 0xA0:
- case 0xA1:
- case 0xA2:
- case 0xA3:
- case 0xA4:
- case 0xA5:
- case 0xA6:
- case 0xA7:
- case 0xA8:
- case 0xA9:
- case 0xAA:
- case 0xAB:
- case 0xAC:
- case 0xAD:
- case 0xAE:
- case 0xAF:
- case 0xB0:
- case 0xB1:
- case 0xB2:
- case 0xB3:
- case 0xB4:
- case 0xB5:
- case 0xB6:
- case 0xB7:
- case 0xB8:
- case 0xB9:
- case 0xBA:
- case 0xBB:
- case 0xBC:
- case 0xBD:
- case 0xBE:
- case 0xBF:
- case 0xD9:
- case 0xDA:
- case 0xDB:
- {
- string_t s;
- return get_msgpack_string(s) && sax->string(s);
- }
- case 0xC0:
- return sax->null();
- case 0xC2:
- return sax->boolean(false);
- case 0xC3:
- return sax->boolean(true);
- case 0xC4:
- case 0xC5:
- case 0xC6:
- case 0xC7:
- case 0xC8:
- case 0xC9:
- case 0xD4:
- case 0xD5:
- case 0xD6:
- case 0xD7:
- case 0xD8:
- {
- binary_t b;
- return get_msgpack_binary(b) && sax->binary(b);
- }
- case 0xCA:
- {
- float number{};
- return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), "");
- }
- case 0xCB:
- {
- double number{};
- return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), "");
- }
- case 0xCC:
- {
- std::uint8_t number{};
- return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);
- }
- case 0xCD:
- {
- std::uint16_t number{};
- return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);
- }
- case 0xCE:
- {
- std::uint32_t number{};
- return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);
- }
- case 0xCF:
- {
- std::uint64_t number{};
- return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);
- }
- case 0xD0:
- {
- std::int8_t number{};
- return get_number(input_format_t::msgpack, number) && sax->number_integer(number);
- }
- case 0xD1:
- {
- std::int16_t number{};
- return get_number(input_format_t::msgpack, number) && sax->number_integer(number);
- }
- case 0xD2:
- {
- std::int32_t number{};
- return get_number(input_format_t::msgpack, number) && sax->number_integer(number);
- }
- case 0xD3:
- {
- std::int64_t number{};
- return get_number(input_format_t::msgpack, number) && sax->number_integer(number);
- }
- case 0xDC:
- {
- std::uint16_t len{};
- return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast<std::size_t>(len));
- }
- case 0xDD:
- {
- std::uint32_t len{};
- return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast<std::size_t>(len));
- }
- case 0xDE:
- {
- std::uint16_t len{};
- return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast<std::size_t>(len));
- }
- case 0xDF:
- {
- std::uint32_t len{};
- return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast<std::size_t>(len));
- }
-
- case 0xE0:
- case 0xE1:
- case 0xE2:
- case 0xE3:
- case 0xE4:
- case 0xE5:
- case 0xE6:
- case 0xE7:
- case 0xE8:
- case 0xE9:
- case 0xEA:
- case 0xEB:
- case 0xEC:
- case 0xED:
- case 0xEE:
- case 0xEF:
- case 0xF0:
- case 0xF1:
- case 0xF2:
- case 0xF3:
- case 0xF4:
- case 0xF5:
- case 0xF6:
- case 0xF7:
- case 0xF8:
- case 0xF9:
- case 0xFA:
- case 0xFB:
- case 0xFC:
- case 0xFD:
- case 0xFE:
- case 0xFF:
- return sax->number_integer(static_cast<std::int8_t>(current));
- default:
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::msgpack, "invalid byte: 0x" + last_token, "value")));
- }
- }
- }
-
- bool get_msgpack_string(string_t& result)
- {
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, "string")))
- {
- return false;
- }
- switch (current)
- {
-
- case 0xA0:
- case 0xA1:
- case 0xA2:
- case 0xA3:
- case 0xA4:
- case 0xA5:
- case 0xA6:
- case 0xA7:
- case 0xA8:
- case 0xA9:
- case 0xAA:
- case 0xAB:
- case 0xAC:
- case 0xAD:
- case 0xAE:
- case 0xAF:
- case 0xB0:
- case 0xB1:
- case 0xB2:
- case 0xB3:
- case 0xB4:
- case 0xB5:
- case 0xB6:
- case 0xB7:
- case 0xB8:
- case 0xB9:
- case 0xBA:
- case 0xBB:
- case 0xBC:
- case 0xBD:
- case 0xBE:
- case 0xBF:
- {
- return get_string(input_format_t::msgpack, static_cast<unsigned int>(current) & 0x1Fu, result);
- }
- case 0xD9:
- {
- std::uint8_t len{};
- return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);
- }
- case 0xDA:
- {
- std::uint16_t len{};
- return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);
- }
- case 0xDB:
- {
- std::uint32_t len{};
- return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);
- }
- default:
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::msgpack, "expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x" + last_token, "string")));
- }
- }
- }
-
- bool get_msgpack_binary(binary_t& result)
- {
-
- auto assign_and_return_true = [&result](std::int8_t subtype)
- {
- result.set_subtype(static_cast<std::uint8_t>(subtype));
- return true;
- };
- switch (current)
- {
- case 0xC4:
- {
- std::uint8_t len{};
- return get_number(input_format_t::msgpack, len) &&
- get_binary(input_format_t::msgpack, len, result);
- }
- case 0xC5:
- {
- std::uint16_t len{};
- return get_number(input_format_t::msgpack, len) &&
- get_binary(input_format_t::msgpack, len, result);
- }
- case 0xC6:
- {
- std::uint32_t len{};
- return get_number(input_format_t::msgpack, len) &&
- get_binary(input_format_t::msgpack, len, result);
- }
- case 0xC7:
- {
- std::uint8_t len{};
- std::int8_t subtype{};
- return get_number(input_format_t::msgpack, len) &&
- get_number(input_format_t::msgpack, subtype) &&
- get_binary(input_format_t::msgpack, len, result) &&
- assign_and_return_true(subtype);
- }
- case 0xC8:
- {
- std::uint16_t len{};
- std::int8_t subtype{};
- return get_number(input_format_t::msgpack, len) &&
- get_number(input_format_t::msgpack, subtype) &&
- get_binary(input_format_t::msgpack, len, result) &&
- assign_and_return_true(subtype);
- }
- case 0xC9:
- {
- std::uint32_t len{};
- std::int8_t subtype{};
- return get_number(input_format_t::msgpack, len) &&
- get_number(input_format_t::msgpack, subtype) &&
- get_binary(input_format_t::msgpack, len, result) &&
- assign_and_return_true(subtype);
- }
- case 0xD4:
- {
- std::int8_t subtype{};
- return get_number(input_format_t::msgpack, subtype) &&
- get_binary(input_format_t::msgpack, 1, result) &&
- assign_and_return_true(subtype);
- }
- case 0xD5:
- {
- std::int8_t subtype{};
- return get_number(input_format_t::msgpack, subtype) &&
- get_binary(input_format_t::msgpack, 2, result) &&
- assign_and_return_true(subtype);
- }
- case 0xD6:
- {
- std::int8_t subtype{};
- return get_number(input_format_t::msgpack, subtype) &&
- get_binary(input_format_t::msgpack, 4, result) &&
- assign_and_return_true(subtype);
- }
- case 0xD7:
- {
- std::int8_t subtype{};
- return get_number(input_format_t::msgpack, subtype) &&
- get_binary(input_format_t::msgpack, 8, result) &&
- assign_and_return_true(subtype);
- }
- case 0xD8:
- {
- std::int8_t subtype{};
- return get_number(input_format_t::msgpack, subtype) &&
- get_binary(input_format_t::msgpack, 16, result) &&
- assign_and_return_true(subtype);
- }
- default:
- return false;
- }
- }
-
- bool get_msgpack_array(const std::size_t len)
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len)))
- {
- return false;
- }
- for (std::size_t i = 0; i < len; ++i)
- {
- if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal()))
- {
- return false;
- }
- }
- return sax->end_array();
- }
-
- bool get_msgpack_object(const std::size_t len)
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))
- {
- return false;
- }
- string_t key;
- for (std::size_t i = 0; i < len; ++i)
- {
- get();
- if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key)))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal()))
- {
- return false;
- }
- key.clear();
- }
- return sax->end_object();
- }
-
-
-
-
- bool parse_ubjson_internal(const bool get_char = true)
- {
- return get_ubjson_value(get_char ? get_ignore_noop() : current);
- }
-
- bool get_ubjson_string(string_t& result, const bool get_char = true)
- {
- if (get_char)
- {
- get();
- }
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value")))
- {
- return false;
- }
- switch (current)
- {
- case 'U':
- {
- std::uint8_t len{};
- return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);
- }
- case 'i':
- {
- std::int8_t len{};
- return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);
- }
- case 'I':
- {
- std::int16_t len{};
- return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);
- }
- case 'l':
- {
- std::int32_t len{};
- return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);
- }
- case 'L':
- {
- std::int64_t len{};
- return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result);
- }
- default:
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L); last byte: 0x" + last_token, "string")));
- }
- }
-
- bool get_ubjson_size_value(std::size_t& result)
- {
- switch (get_ignore_noop())
- {
- case 'U':
- {
- std::uint8_t number{};
- if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))
- {
- return false;
- }
- result = static_cast<std::size_t>(number);
- return true;
- }
- case 'i':
- {
- std::int8_t number{};
- if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))
- {
- return false;
- }
- result = static_cast<std::size_t>(number);
- return true;
- }
- case 'I':
- {
- std::int16_t number{};
- if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))
- {
- return false;
- }
- result = static_cast<std::size_t>(number);
- return true;
- }
- case 'l':
- {
- std::int32_t number{};
- if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))
- {
- return false;
- }
- result = static_cast<std::size_t>(number);
- return true;
- }
- case 'L':
- {
- std::int64_t number{};
- if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number)))
- {
- return false;
- }
- result = static_cast<std::size_t>(number);
- return true;
- }
- default:
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token, "size")));
- }
- }
- }
-
- bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& result)
- {
- result.first = string_t::npos;
- result.second = 0;
- get_ignore_noop();
- if (current == '$')
- {
- result.second = get();
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "type")))
- {
- return false;
- }
- get_ignore_noop();
- if (JSON_HEDLEY_UNLIKELY(current != '#'))
- {
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value")))
- {
- return false;
- }
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "expected '#' after type information; last byte: 0x" + last_token, "size")));
- }
- return get_ubjson_size_value(result.first);
- }
- if (current == '#')
- {
- return get_ubjson_size_value(result.first);
- }
- return true;
- }
-
- bool get_ubjson_value(const char_int_type prefix)
- {
- switch (prefix)
- {
- case std::char_traits<char_type>::eof():
- return unexpect_eof(input_format_t::ubjson, "value");
- case 'T':
- return sax->boolean(true);
- case 'F':
- return sax->boolean(false);
- case 'Z':
- return sax->null();
- case 'U':
- {
- std::uint8_t number{};
- return get_number(input_format_t::ubjson, number) && sax->number_unsigned(number);
- }
- case 'i':
- {
- std::int8_t number{};
- return get_number(input_format_t::ubjson, number) && sax->number_integer(number);
- }
- case 'I':
- {
- std::int16_t number{};
- return get_number(input_format_t::ubjson, number) && sax->number_integer(number);
- }
- case 'l':
- {
- std::int32_t number{};
- return get_number(input_format_t::ubjson, number) && sax->number_integer(number);
- }
- case 'L':
- {
- std::int64_t number{};
- return get_number(input_format_t::ubjson, number) && sax->number_integer(number);
- }
- case 'd':
- {
- float number{};
- return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast<number_float_t>(number), "");
- }
- case 'D':
- {
- double number{};
- return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast<number_float_t>(number), "");
- }
- case 'H':
- {
- return get_ubjson_high_precision_number();
- }
- case 'C':
- {
- get();
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "char")))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(current > 127))
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token, "char")));
- }
- string_t s(1, static_cast<typename string_t::value_type>(current));
- return sax->string(s);
- }
- case 'S':
- {
- string_t s;
- return get_ubjson_string(s) && sax->string(s);
- }
- case '[':
- return get_ubjson_array();
- case '{':
- return get_ubjson_object();
- default:
- {
- auto last_token = get_token_string();
- return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "invalid byte: 0x" + last_token, "value")));
- }
- }
- }
-
- bool get_ubjson_array()
- {
- std::pair<std::size_t, char_int_type> size_and_type;
- if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type)))
- {
- return false;
- }
- if (size_and_type.first != string_t::npos)
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first)))
- {
- return false;
- }
- if (size_and_type.second != 0)
- {
- if (size_and_type.second != 'N')
- {
- for (std::size_t i = 0; i < size_and_type.first; ++i)
- {
- if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second)))
- {
- return false;
- }
- }
- }
- }
- else
- {
- for (std::size_t i = 0; i < size_and_type.first; ++i)
- {
- if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))
- {
- return false;
- }
- }
- }
- }
- else
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1))))
- {
- return false;
- }
- while (current != ']')
- {
- if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false)))
- {
- return false;
- }
- get_ignore_noop();
- }
- }
- return sax->end_array();
- }
-
- bool get_ubjson_object()
- {
- std::pair<std::size_t, char_int_type> size_and_type;
- if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type)))
- {
- return false;
- }
- string_t key;
- if (size_and_type.first != string_t::npos)
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first)))
- {
- return false;
- }
- if (size_and_type.second != 0)
- {
- for (std::size_t i = 0; i < size_and_type.first; ++i)
- {
- if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key)))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second)))
- {
- return false;
- }
- key.clear();
- }
- }
- else
- {
- for (std::size_t i = 0; i < size_and_type.first; ++i)
- {
- if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key)))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))
- {
- return false;
- }
- key.clear();
- }
- }
- }
- else
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1))))
- {
- return false;
- }
- while (current != '}')
- {
- if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key)))
- {
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal()))
- {
- return false;
- }
- get_ignore_noop();
- key.clear();
- }
- }
- return sax->end_object();
- }
-
-
- bool get_ubjson_high_precision_number()
- {
-
- std::size_t size{};
- auto res = get_ubjson_size_value(size);
- if (JSON_HEDLEY_UNLIKELY(!res))
- {
- return res;
- }
-
- std::vector<char> number_vector;
- for (std::size_t i = 0; i < size; ++i)
- {
- get();
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "number")))
- {
- return false;
- }
- number_vector.push_back(static_cast<char>(current));
- }
-
- auto number_ia = detail::input_adapter(std::forward<decltype(number_vector)>(number_vector));
- auto number_lexer = detail::lexer<BasicJsonType, decltype(number_ia)>(std::move(number_ia), false);
- const auto result_number = number_lexer.scan();
- const auto number_string = number_lexer.get_token_string();
- const auto result_remainder = number_lexer.scan();
- using token_type = typename detail::lexer_base<BasicJsonType>::token_type;
- if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input))
- {
- return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number")));
- }
- switch (result_number)
- {
- case token_type::value_integer:
- return sax->number_integer(number_lexer.get_number_integer());
- case token_type::value_unsigned:
- return sax->number_unsigned(number_lexer.get_number_unsigned());
- case token_type::value_float:
- return sax->number_float(number_lexer.get_number_float(), std::move(number_string));
- default:
- return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number")));
- }
- }
-
-
-
-
- char_int_type get()
- {
- ++chars_read;
- return current = ia.get_character();
- }
-
- char_int_type get_ignore_noop()
- {
- do
- {
- get();
- }
- while (current == 'N');
- return current;
- }
-
- template<typename NumberType, bool InputIsLittleEndian = false>
- bool get_number(const input_format_t format, NumberType& result)
- {
-
- std::array<std::uint8_t, sizeof(NumberType)> vec;
- for (std::size_t i = 0; i < sizeof(NumberType); ++i)
- {
- get();
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "number")))
- {
- return false;
- }
-
- if (is_little_endian != InputIsLittleEndian)
- {
- vec[sizeof(NumberType) - i - 1] = static_cast<std::uint8_t>(current);
- }
- else
- {
- vec[i] = static_cast<std::uint8_t>(current);
- }
- }
-
- std::memcpy(&result, vec.data(), sizeof(NumberType));
- return true;
- }
-
- template<typename NumberType>
- bool get_string(const input_format_t format,
- const NumberType len,
- string_t& result)
- {
- bool success = true;
- for (NumberType i = 0; i < len; i++)
- {
- get();
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string")))
- {
- success = false;
- break;
- }
- result.push_back(static_cast<typename string_t::value_type>(current));
- };
- return success;
- }
-
- template<typename NumberType>
- bool get_binary(const input_format_t format,
- const NumberType len,
- binary_t& result)
- {
- bool success = true;
- for (NumberType i = 0; i < len; i++)
- {
- get();
- if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary")))
- {
- success = false;
- break;
- }
- result.push_back(static_cast<std::uint8_t>(current));
- }
- return success;
- }
-
- JSON_HEDLEY_NON_NULL(3)
- bool unexpect_eof(const input_format_t format, const char* context) const
- {
- if (JSON_HEDLEY_UNLIKELY(current == std::char_traits<char_type>::eof()))
- {
- return sax->parse_error(chars_read, "<end of file>",
- parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context)));
- }
- return true;
- }
-
- std::string get_token_string() const
- {
- std::array<char, 3> cr{{}};
- (std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(current));
- return std::string{cr.data()};
- }
-
- std::string exception_message(const input_format_t format,
- const std::string& detail,
- const std::string& context) const
- {
- std::string error_msg = "syntax error while parsing ";
- switch (format)
- {
- case input_format_t::cbor:
- error_msg += "CBOR";
- break;
- case input_format_t::msgpack:
- error_msg += "MessagePack";
- break;
- case input_format_t::ubjson:
- error_msg += "UBJSON";
- break;
- case input_format_t::bson:
- error_msg += "BSON";
- break;
- default:
- JSON_ASSERT(false);
- }
- return error_msg + " " + context + ": " + detail;
- }
- private:
-
- InputAdapterType ia;
-
- char_int_type current = std::char_traits<char_type>::eof();
-
- std::size_t chars_read = 0;
-
- const bool is_little_endian = little_endianess();
-
- json_sax_t* sax = nullptr;
- };
- }
- }
- #include <cmath> // isfinite
- #include <cstdint> // uint8_t
- #include <functional> // function
- #include <string> // string
- #include <utility> // move
- #include <vector> // vector
- namespace nlohmann
- {
- namespace detail
- {
- enum class parse_event_t : uint8_t
- {
-
- object_start,
-
- object_end,
-
- array_start,
-
- array_end,
-
- key,
-
- value
- };
- template<typename BasicJsonType>
- using parser_callback_t =
- std::function<bool(int depth, parse_event_t event, BasicJsonType& parsed)>;
- template<typename BasicJsonType, typename InputAdapterType>
- class parser
- {
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
- using lexer_t = lexer<BasicJsonType, InputAdapterType>;
- using token_type = typename lexer_t::token_type;
- public:
-
- explicit parser(InputAdapterType&& adapter,
- const parser_callback_t<BasicJsonType> cb = nullptr,
- const bool allow_exceptions_ = true,
- const bool skip_comments = false)
- : callback(cb)
- , m_lexer(std::move(adapter), skip_comments)
- , allow_exceptions(allow_exceptions_)
- {
-
- get_token();
- }
-
- void parse(const bool strict, BasicJsonType& result)
- {
- if (callback)
- {
- json_sax_dom_callback_parser<BasicJsonType> sdp(result, callback, allow_exceptions);
- sax_parse_internal(&sdp);
- result.assert_invariant();
-
- if (strict && (get_token() != token_type::end_of_input))
- {
- sdp.parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::end_of_input, "value")));
- }
-
- if (sdp.is_errored())
- {
- result = value_t::discarded;
- return;
- }
-
-
- if (result.is_discarded())
- {
- result = nullptr;
- }
- }
- else
- {
- json_sax_dom_parser<BasicJsonType> sdp(result, allow_exceptions);
- sax_parse_internal(&sdp);
- result.assert_invariant();
-
- if (strict && (get_token() != token_type::end_of_input))
- {
- sdp.parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::end_of_input, "value")));
- }
-
- if (sdp.is_errored())
- {
- result = value_t::discarded;
- return;
- }
- }
- }
-
- bool accept(const bool strict = true)
- {
- json_sax_acceptor<BasicJsonType> sax_acceptor;
- return sax_parse(&sax_acceptor, strict);
- }
- template<typename SAX>
- JSON_HEDLEY_NON_NULL(2)
- bool sax_parse(SAX* sax, const bool strict = true)
- {
- (void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};
- const bool result = sax_parse_internal(sax);
-
- if (result && strict && (get_token() != token_type::end_of_input))
- {
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::end_of_input, "value")));
- }
- return result;
- }
- private:
- template<typename SAX>
- JSON_HEDLEY_NON_NULL(2)
- bool sax_parse_internal(SAX* sax)
- {
-
-
- std::vector<bool> states;
-
- bool skip_to_state_evaluation = false;
- while (true)
- {
- if (!skip_to_state_evaluation)
- {
-
- switch (last_token)
- {
- case token_type::begin_object:
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1))))
- {
- return false;
- }
-
- if (get_token() == token_type::end_object)
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))
- {
- return false;
- }
- break;
- }
-
- if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string))
- {
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::value_string, "object key")));
- }
- if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))
- {
- return false;
- }
-
- if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))
- {
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::name_separator, "object separator")));
- }
-
- states.push_back(false);
-
- get_token();
- continue;
- }
- case token_type::begin_array:
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1))))
- {
- return false;
- }
-
- if (get_token() == token_type::end_array)
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))
- {
- return false;
- }
- break;
- }
-
- states.push_back(true);
-
- continue;
- }
- case token_type::value_float:
- {
- const auto res = m_lexer.get_number_float();
- if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res)))
- {
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'"));
- }
- if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string())))
- {
- return false;
- }
- break;
- }
- case token_type::literal_false:
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false)))
- {
- return false;
- }
- break;
- }
- case token_type::literal_null:
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->null()))
- {
- return false;
- }
- break;
- }
- case token_type::literal_true:
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true)))
- {
- return false;
- }
- break;
- }
- case token_type::value_integer:
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer())))
- {
- return false;
- }
- break;
- }
- case token_type::value_string:
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string())))
- {
- return false;
- }
- break;
- }
- case token_type::value_unsigned:
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned())))
- {
- return false;
- }
- break;
- }
- case token_type::parse_error:
- {
-
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::uninitialized, "value")));
- }
- default:
- {
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::literal_or_value, "value")));
- }
- }
- }
- else
- {
- skip_to_state_evaluation = false;
- }
-
- if (states.empty())
- {
-
- return true;
- }
- if (states.back())
- {
-
- if (get_token() == token_type::value_separator)
- {
-
- get_token();
- continue;
- }
-
- if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array))
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->end_array()))
- {
- return false;
- }
-
-
-
-
- JSON_ASSERT(!states.empty());
- states.pop_back();
- skip_to_state_evaluation = true;
- continue;
- }
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::end_array, "array")));
- }
- else
- {
-
- if (get_token() == token_type::value_separator)
- {
-
- if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string))
- {
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::value_string, "object key")));
- }
- if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string())))
- {
- return false;
- }
-
- if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))
- {
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::name_separator, "object separator")));
- }
-
- get_token();
- continue;
- }
-
- if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object))
- {
- if (JSON_HEDLEY_UNLIKELY(!sax->end_object()))
- {
- return false;
- }
-
-
-
-
- JSON_ASSERT(!states.empty());
- states.pop_back();
- skip_to_state_evaluation = true;
- continue;
- }
- return sax->parse_error(m_lexer.get_position(),
- m_lexer.get_token_string(),
- parse_error::create(101, m_lexer.get_position(),
- exception_message(token_type::end_object, "object")));
- }
- }
- }
-
- token_type get_token()
- {
- return last_token = m_lexer.scan();
- }
- std::string exception_message(const token_type expected, const std::string& context)
- {
- std::string error_msg = "syntax error ";
- if (!context.empty())
- {
- error_msg += "while parsing " + context + " ";
- }
- error_msg += "- ";
- if (last_token == token_type::parse_error)
- {
- error_msg += std::string(m_lexer.get_error_message()) + "; last read: '" +
- m_lexer.get_token_string() + "'";
- }
- else
- {
- error_msg += "unexpected " + std::string(lexer_t::token_type_name(last_token));
- }
- if (expected != token_type::uninitialized)
- {
- error_msg += "; expected " + std::string(lexer_t::token_type_name(expected));
- }
- return error_msg;
- }
- private:
-
- const parser_callback_t<BasicJsonType> callback = nullptr;
-
- token_type last_token = token_type::uninitialized;
-
- lexer_t m_lexer;
-
- const bool allow_exceptions = true;
- };
- }
- }
- #include <cstddef> // ptrdiff_t
- #include <limits> // numeric_limits
- namespace nlohmann
- {
- namespace detail
- {
- class primitive_iterator_t
- {
- private:
- using difference_type = std::ptrdiff_t;
- static constexpr difference_type begin_value = 0;
- static constexpr difference_type end_value = begin_value + 1;
-
- difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
- public:
- constexpr difference_type get_value() const noexcept
- {
- return m_it;
- }
-
- void set_begin() noexcept
- {
- m_it = begin_value;
- }
-
- void set_end() noexcept
- {
- m_it = end_value;
- }
-
- constexpr bool is_begin() const noexcept
- {
- return m_it == begin_value;
- }
-
- constexpr bool is_end() const noexcept
- {
- return m_it == end_value;
- }
- friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
- {
- return lhs.m_it == rhs.m_it;
- }
- friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
- {
- return lhs.m_it < rhs.m_it;
- }
- primitive_iterator_t operator+(difference_type n) noexcept
- {
- auto result = *this;
- result += n;
- return result;
- }
- friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
- {
- return lhs.m_it - rhs.m_it;
- }
- primitive_iterator_t& operator++() noexcept
- {
- ++m_it;
- return *this;
- }
- primitive_iterator_t const operator++(int) noexcept
- {
- auto result = *this;
- ++m_it;
- return result;
- }
- primitive_iterator_t& operator--() noexcept
- {
- --m_it;
- return *this;
- }
- primitive_iterator_t const operator--(int) noexcept
- {
- auto result = *this;
- --m_it;
- return result;
- }
- primitive_iterator_t& operator+=(difference_type n) noexcept
- {
- m_it += n;
- return *this;
- }
- primitive_iterator_t& operator-=(difference_type n) noexcept
- {
- m_it -= n;
- return *this;
- }
- };
- }
- }
- namespace nlohmann
- {
- namespace detail
- {
- template<typename BasicJsonType> struct internal_iterator
- {
-
- typename BasicJsonType::object_t::iterator object_iterator {};
-
- typename BasicJsonType::array_t::iterator array_iterator {};
-
- primitive_iterator_t primitive_iterator {};
- };
- }
- }
- #include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next
- #include <type_traits> // conditional, is_const, remove_const
- namespace nlohmann
- {
- namespace detail
- {
- template<typename IteratorType> class iteration_proxy;
- template<typename IteratorType> class iteration_proxy_value;
- template<typename BasicJsonType>
- class iter_impl
- {
-
- friend iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>;
- friend BasicJsonType;
- friend iteration_proxy<iter_impl>;
- friend iteration_proxy_value<iter_impl>;
- using object_t = typename BasicJsonType::object_t;
- using array_t = typename BasicJsonType::array_t;
-
- static_assert(is_basic_json<typename std::remove_const<BasicJsonType>::type>::value,
- "iter_impl only accepts (const) basic_json");
- public:
-
-
-
-
-
- using iterator_category = std::bidirectional_iterator_tag;
-
- using value_type = typename BasicJsonType::value_type;
-
- using difference_type = typename BasicJsonType::difference_type;
-
- using pointer = typename std::conditional<std::is_const<BasicJsonType>::value,
- typename BasicJsonType::const_pointer,
- typename BasicJsonType::pointer>::type;
-
- using reference =
- typename std::conditional<std::is_const<BasicJsonType>::value,
- typename BasicJsonType::const_reference,
- typename BasicJsonType::reference>::type;
-
- iter_impl() = default;
-
- explicit iter_impl(pointer object) noexcept : m_object(object)
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- {
- m_it.object_iterator = typename object_t::iterator();
- break;
- }
- case value_t::array:
- {
- m_it.array_iterator = typename array_t::iterator();
- break;
- }
- default:
- {
- m_it.primitive_iterator = primitive_iterator_t();
- break;
- }
- }
- }
-
-
- iter_impl(const iter_impl<const BasicJsonType>& other) noexcept
- : m_object(other.m_object), m_it(other.m_it)
- {}
-
- iter_impl& operator=(const iter_impl<const BasicJsonType>& other) noexcept
- {
- m_object = other.m_object;
- m_it = other.m_it;
- return *this;
- }
-
- iter_impl(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept
- : m_object(other.m_object), m_it(other.m_it)
- {}
-
- iter_impl& operator=(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept
- {
- m_object = other.m_object;
- m_it = other.m_it;
- return *this;
- }
- private:
-
- void set_begin() noexcept
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- {
- m_it.object_iterator = m_object->m_value.object->begin();
- break;
- }
- case value_t::array:
- {
- m_it.array_iterator = m_object->m_value.array->begin();
- break;
- }
- case value_t::null:
- {
-
- m_it.primitive_iterator.set_end();
- break;
- }
- default:
- {
- m_it.primitive_iterator.set_begin();
- break;
- }
- }
- }
-
- void set_end() noexcept
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- {
- m_it.object_iterator = m_object->m_value.object->end();
- break;
- }
- case value_t::array:
- {
- m_it.array_iterator = m_object->m_value.array->end();
- break;
- }
- default:
- {
- m_it.primitive_iterator.set_end();
- break;
- }
- }
- }
- public:
-
- reference operator*() const
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- {
- JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end());
- return m_it.object_iterator->second;
- }
- case value_t::array:
- {
- JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end());
- return *m_it.array_iterator;
- }
- case value_t::null:
- JSON_THROW(invalid_iterator::create(214, "cannot get value"));
- default:
- {
- if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))
- {
- return *m_object;
- }
- JSON_THROW(invalid_iterator::create(214, "cannot get value"));
- }
- }
- }
-
- pointer operator->() const
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- {
- JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end());
- return &(m_it.object_iterator->second);
- }
- case value_t::array:
- {
- JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end());
- return &*m_it.array_iterator;
- }
- default:
- {
- if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))
- {
- return m_object;
- }
- JSON_THROW(invalid_iterator::create(214, "cannot get value"));
- }
- }
- }
-
- iter_impl const operator++(int)
- {
- auto result = *this;
- ++(*this);
- return result;
- }
-
- iter_impl& operator++()
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- {
- std::advance(m_it.object_iterator, 1);
- break;
- }
- case value_t::array:
- {
- std::advance(m_it.array_iterator, 1);
- break;
- }
- default:
- {
- ++m_it.primitive_iterator;
- break;
- }
- }
- return *this;
- }
-
- iter_impl const operator--(int)
- {
- auto result = *this;
- --(*this);
- return result;
- }
-
- iter_impl& operator--()
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- {
- std::advance(m_it.object_iterator, -1);
- break;
- }
- case value_t::array:
- {
- std::advance(m_it.array_iterator, -1);
- break;
- }
- default:
- {
- --m_it.primitive_iterator;
- break;
- }
- }
- return *this;
- }
-
- bool operator==(const iter_impl& other) const
- {
-
- if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
- {
- JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers"));
- }
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- return (m_it.object_iterator == other.m_it.object_iterator);
- case value_t::array:
- return (m_it.array_iterator == other.m_it.array_iterator);
- default:
- return (m_it.primitive_iterator == other.m_it.primitive_iterator);
- }
- }
-
- bool operator!=(const iter_impl& other) const
- {
- return !operator==(other);
- }
-
- bool operator<(const iter_impl& other) const
- {
-
- if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
- {
- JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers"));
- }
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators"));
- case value_t::array:
- return (m_it.array_iterator < other.m_it.array_iterator);
- default:
- return (m_it.primitive_iterator < other.m_it.primitive_iterator);
- }
- }
-
- bool operator<=(const iter_impl& other) const
- {
- return !other.operator < (*this);
- }
-
- bool operator>(const iter_impl& other) const
- {
- return !operator<=(other);
- }
-
- bool operator>=(const iter_impl& other) const
- {
- return !operator<(other);
- }
-
- iter_impl& operator+=(difference_type i)
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators"));
- case value_t::array:
- {
- std::advance(m_it.array_iterator, i);
- break;
- }
- default:
- {
- m_it.primitive_iterator += i;
- break;
- }
- }
- return *this;
- }
-
- iter_impl& operator-=(difference_type i)
- {
- return operator+=(-i);
- }
-
- iter_impl operator+(difference_type i) const
- {
- auto result = *this;
- result += i;
- return result;
- }
-
- friend iter_impl operator+(difference_type i, const iter_impl& it)
- {
- auto result = it;
- result += i;
- return result;
- }
-
- iter_impl operator-(difference_type i) const
- {
- auto result = *this;
- result -= i;
- return result;
- }
-
- difference_type operator-(const iter_impl& other) const
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators"));
- case value_t::array:
- return m_it.array_iterator - other.m_it.array_iterator;
- default:
- return m_it.primitive_iterator - other.m_it.primitive_iterator;
- }
- }
-
- reference operator[](difference_type n) const
- {
- JSON_ASSERT(m_object != nullptr);
- switch (m_object->m_type)
- {
- case value_t::object:
- JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators"));
- case value_t::array:
- return *std::next(m_it.array_iterator, n);
- case value_t::null:
- JSON_THROW(invalid_iterator::create(214, "cannot get value"));
- default:
- {
- if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n))
- {
- return *m_object;
- }
- JSON_THROW(invalid_iterator::create(214, "cannot get value"));
- }
- }
- }
-
- const typename object_t::key_type& key() const
- {
- JSON_ASSERT(m_object != nullptr);
- if (JSON_HEDLEY_LIKELY(m_object->is_object()))
- {
- return m_it.object_iterator->first;
- }
- JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators"));
- }
-
- reference value() const
- {
- return operator*();
- }
- private:
-
- pointer m_object = nullptr;
-
- internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {};
- };
- }
- }
- #include <cstddef> // ptrdiff_t
- #include <iterator> // reverse_iterator
- #include <utility> // declval
- namespace nlohmann
- {
- namespace detail
- {
- template<typename Base>
- class json_reverse_iterator : public std::reverse_iterator<Base>
- {
- public:
- using difference_type = std::ptrdiff_t;
-
- using base_iterator = std::reverse_iterator<Base>;
-
- using reference = typename Base::reference;
-
- explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
- : base_iterator(it) {}
-
- explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
-
- json_reverse_iterator const operator++(int)
- {
- return static_cast<json_reverse_iterator>(base_iterator::operator++(1));
- }
-
- json_reverse_iterator& operator++()
- {
- return static_cast<json_reverse_iterator&>(base_iterator::operator++());
- }
-
- json_reverse_iterator const operator--(int)
- {
- return static_cast<json_reverse_iterator>(base_iterator::operator--(1));
- }
-
- json_reverse_iterator& operator--()
- {
- return static_cast<json_reverse_iterator&>(base_iterator::operator--());
- }
-
- json_reverse_iterator& operator+=(difference_type i)
- {
- return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));
- }
-
- json_reverse_iterator operator+(difference_type i) const
- {
- return static_cast<json_reverse_iterator>(base_iterator::operator+(i));
- }
-
- json_reverse_iterator operator-(difference_type i) const
- {
- return static_cast<json_reverse_iterator>(base_iterator::operator-(i));
- }
-
- difference_type operator-(const json_reverse_iterator& other) const
- {
- return base_iterator(*this) - base_iterator(other);
- }
-
- reference operator[](difference_type n) const
- {
- return *(this->operator+(n));
- }
-
- auto key() const -> decltype(std::declval<Base>().key())
- {
- auto it = --this->base();
- return it.key();
- }
-
- reference value() const
- {
- auto it = --this->base();
- return it.operator * ();
- }
- };
- }
- }
- #include <algorithm> // all_of
- #include <cctype> // isdigit
- #include <limits> // max
- #include <numeric> // accumulate
- #include <string> // string
- #include <utility> // move
- #include <vector> // vector
- namespace nlohmann
- {
- template<typename BasicJsonType>
- class json_pointer
- {
-
- NLOHMANN_BASIC_JSON_TPL_DECLARATION
- friend class basic_json;
- public:
-
- explicit json_pointer(const std::string& s = "")
- : reference_tokens(split(s))
- {}
-
- std::string to_string() const
- {
- return std::accumulate(reference_tokens.begin(), reference_tokens.end(),
- std::string{},
- [](const std::string & a, const std::string & b)
- {
- return a + "/" + escape(b);
- });
- }
-
- operator std::string() const
- {
- return to_string();
- }
-
- json_pointer& operator/=(const json_pointer& ptr)
- {
- reference_tokens.insert(reference_tokens.end(),
- ptr.reference_tokens.begin(),
- ptr.reference_tokens.end());
- return *this;
- }
-
- json_pointer& operator/=(std::string token)
- {
- push_back(std::move(token));
- return *this;
- }
-
- json_pointer& operator/=(std::size_t array_idx)
- {
- return *this /= std::to_string(array_idx);
- }
-
- friend json_pointer operator/(const json_pointer& lhs,
- const json_pointer& rhs)
- {
- return json_pointer(lhs) /= rhs;
- }
-
- friend json_pointer operator/(const json_pointer& ptr, std::string token)
- {
- return json_pointer(ptr) /= std::move(token);
- }
-
- friend json_pointer operator/(const json_pointer& ptr, std::size_t array_idx)
- {
- return json_pointer(ptr) /= array_idx;
- }
-
- json_pointer parent_pointer() const
- {
- if (empty())
- {
- return *this;
- }
- json_pointer res = *this;
- res.pop_back();
- return res;
- }
-
- void pop_back()
- {
- if (JSON_HEDLEY_UNLIKELY(empty()))
- {
- JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent"));
- }
- reference_tokens.pop_back();
- }
-
- const std::string& back() const
- {
- if (JSON_HEDLEY_UNLIKELY(empty()))
- {
- JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent"));
- }
- return reference_tokens.back();
- }
-
- void push_back(const std::string& token)
- {
- reference_tokens.push_back(token);
- }
-
- void push_back(std::string&& token)
- {
- reference_tokens.push_back(std::move(token));
- }
-
- bool empty() const noexcept
- {
- return reference_tokens.empty();
- }
- private:
-
- static typename BasicJsonType::size_type array_index(const std::string& s)
- {
- using size_type = typename BasicJsonType::size_type;
-
- if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0'))
- {
- JSON_THROW(detail::parse_error::create(106, 0,
- "array index '" + s +
- "' must not begin with '0'"));
- }
-
- if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9')))
- {
- JSON_THROW(detail::parse_error::create(109, 0, "array index '" + s + "' is not a number"));
- }
- std::size_t processed_chars = 0;
- unsigned long long res = 0;
- JSON_TRY
- {
- res = std::stoull(s, &processed_chars);
- }
- JSON_CATCH(std::out_of_range&)
- {
- JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'"));
- }
-
- if (JSON_HEDLEY_UNLIKELY(processed_chars != s.size()))
- {
- JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'"));
- }
-
-
- if (res >= static_cast<unsigned long long>((std::numeric_limits<size_type>::max)()))
- {
- JSON_THROW(detail::out_of_range::create(410, "array index " + s + " exceeds size_type"));
- }
- return static_cast<size_type>(res);
- }
- json_pointer top() const
- {
- if (JSON_HEDLEY_UNLIKELY(empty()))
- {
- JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent"));
- }
- json_pointer result = *this;
- result.reference_tokens = {reference_tokens[0]};
- return result;
- }
-
- BasicJsonType& get_and_create(BasicJsonType& j) const
- {
- auto result = &j;
-
-
- for (const auto& reference_token : reference_tokens)
- {
- switch (result->type())
- {
- case detail::value_t::null:
- {
- if (reference_token == "0")
- {
-
- result = &result->operator[](0);
- }
- else
- {
-
- result = &result->operator[](reference_token);
- }
- break;
- }
- case detail::value_t::object:
- {
-
- result = &result->operator[](reference_token);
- break;
- }
- case detail::value_t::array:
- {
-
- result = &result->operator[](array_index(reference_token));
- break;
- }
-
- default:
- JSON_THROW(detail::type_error::create(313, "invalid value to unflatten"));
- }
- }
- return *result;
- }
-
- BasicJsonType& get_unchecked(BasicJsonType* ptr) const
- {
- for (const auto& reference_token : reference_tokens)
- {
-
- if (ptr->is_null())
- {
-
- const bool nums =
- std::all_of(reference_token.begin(), reference_token.end(),
- [](const unsigned char x)
- {
- return std::isdigit(x);
- });
-
- *ptr = (nums || reference_token == "-")
- ? detail::value_t::array
- : detail::value_t::object;
- }
- switch (ptr->type())
- {
- case detail::value_t::object:
- {
-
- ptr = &ptr->operator[](reference_token);
- break;
- }
- case detail::value_t::array:
- {
- if (reference_token == "-")
- {
-
- ptr = &ptr->operator[](ptr->m_value.array->size());
- }
- else
- {
-
- ptr = &ptr->operator[](array_index(reference_token));
- }
- break;
- }
- default:
- JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'"));
- }
- }
- return *ptr;
- }
-
- BasicJsonType& get_checked(BasicJsonType* ptr) const
- {
- for (const auto& reference_token : reference_tokens)
- {
- switch (ptr->type())
- {
- case detail::value_t::object:
- {
-
- ptr = &ptr->at(reference_token);
- break;
- }
- case detail::value_t::array:
- {
- if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
- {
-
- JSON_THROW(detail::out_of_range::create(402,
- "array index '-' (" + std::to_string(ptr->m_value.array->size()) +
- ") is out of range"));
- }
-
- ptr = &ptr->at(array_index(reference_token));
- break;
- }
- default:
- JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'"));
- }
- }
- return *ptr;
- }
-
- const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const
- {
- for (const auto& reference_token : reference_tokens)
- {
- switch (ptr->type())
- {
- case detail::value_t::object:
- {
-
- ptr = &ptr->operator[](reference_token);
- break;
- }
- case detail::value_t::array:
- {
- if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
- {
-
- JSON_THROW(detail::out_of_range::create(402,
- "array index '-' (" + std::to_string(ptr->m_value.array->size()) +
- ") is out of range"));
- }
-
- ptr = &ptr->operator[](array_index(reference_token));
- break;
- }
- default:
- JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'"));
- }
- }
- return *ptr;
- }
-
- const BasicJsonType& get_checked(const BasicJsonType* ptr) const
- {
- for (const auto& reference_token : reference_tokens)
- {
- switch (ptr->type())
- {
- case detail::value_t::object:
- {
-
- ptr = &ptr->at(reference_token);
- break;
- }
- case detail::value_t::array:
- {
- if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
- {
-
- JSON_THROW(detail::out_of_range::create(402,
- "array index '-' (" + std::to_string(ptr->m_value.array->size()) +
- ") is out of range"));
- }
-
- ptr = &ptr->at(array_index(reference_token));
- break;
- }
- default:
- JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'"));
- }
- }
- return *ptr;
- }
-
- bool contains(const BasicJsonType* ptr) const
- {
- for (const auto& reference_token : reference_tokens)
- {
- switch (ptr->type())
- {
- case detail::value_t::object:
- {
- if (!ptr->contains(reference_token))
- {
-
- return false;
- }
- ptr = &ptr->operator[](reference_token);
- break;
- }
- case detail::value_t::array:
- {
- if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
- {
-
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9")))
- {
-
- return false;
- }
- if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1))
- {
- if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9')))
- {
-
- return false;
- }
- for (std::size_t i = 1; i < reference_token.size(); i++)
- {
- if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9')))
- {
-
- return false;
- }
- }
- }
- const auto idx = array_index(reference_token);
- if (idx >= ptr->size())
- {
-
- return false;
- }
- ptr = &ptr->operator[](idx);
- break;
- }
- default:
- {
-
-
- return false;
- }
- }
- }
-
- return true;
- }
-
- static std::vector<std::string> split(const std::string& reference_string)
- {
- std::vector<std::string> result;
-
- if (reference_string.empty())
- {
- return result;
- }
-
- if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/'))
- {
- JSON_THROW(detail::parse_error::create(107, 1,
- "JSON pointer must be empty or begin with '/' - was: '" +
- reference_string + "'"));
- }
-
-
-
- for (
-
- std::size_t slash = reference_string.find_first_of('/', 1),
-
- start = 1;
-
- start != 0;
-
-
- start = (slash == std::string::npos) ? 0 : slash + 1,
-
- slash = reference_string.find_first_of('/', start))
- {
-
-
- auto reference_token = reference_string.substr(start, slash - start);
-
- for (std::size_t pos = reference_token.find_first_of('~');
- pos != std::string::npos;
- pos = reference_token.find_first_of('~', pos + 1))
- {
- JSON_ASSERT(reference_token[pos] == '~');
-
- if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 ||
- (reference_token[pos + 1] != '0' &&
- reference_token[pos + 1] != '1')))
- {
- JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'"));
- }
- }
-
- unescape(reference_token);
- result.push_back(reference_token);
- }
- return result;
- }
-
- static void replace_substring(std::string& s, const std::string& f,
- const std::string& t)
- {
- JSON_ASSERT(!f.empty());
- for (auto pos = s.find(f);
- pos != std::string::npos;
- s.replace(pos, f.size(), t),
- pos = s.find(f, pos + t.size()))
- {}
- }
-
- static std::string escape(std::string s)
- {
- replace_substring(s, "~", "~0");
- replace_substring(s, "/", "~1");
- return s;
- }
-
- static void unescape(std::string& s)
- {
- replace_substring(s, "~1", "/");
- replace_substring(s, "~0", "~");
- }
-
- static void flatten(const std::string& reference_string,
- const BasicJsonType& value,
- BasicJsonType& result)
- {
- switch (value.type())
- {
- case detail::value_t::array:
- {
- if (value.m_value.array->empty())
- {
-
- result[reference_string] = nullptr;
- }
- else
- {
-
- for (std::size_t i = 0; i < value.m_value.array->size(); ++i)
- {
- flatten(reference_string + "/" + std::to_string(i),
- value.m_value.array->operator[](i), result);
- }
- }
- break;
- }
- case detail::value_t::object:
- {
- if (value.m_value.object->empty())
- {
-
- result[reference_string] = nullptr;
- }
- else
- {
-
- for (const auto& element : *value.m_value.object)
- {
- flatten(reference_string + "/" + escape(element.first), element.second, result);
- }
- }
- break;
- }
- default:
- {
-
- result[reference_string] = value;
- break;
- }
- }
- }
-
- static BasicJsonType
- unflatten(const BasicJsonType& value)
- {
- if (JSON_HEDLEY_UNLIKELY(!value.is_object()))
- {
- JSON_THROW(detail::type_error::create(314, "only objects can be unflattened"));
- }
- BasicJsonType result;
-
- for (const auto& element : *value.m_value.object)
- {
- if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive()))
- {
- JSON_THROW(detail::type_error::create(315, "values in object must be primitive"));
- }
-
-
-
-
- json_pointer(element.first).get_and_create(result) = element.second;
- }
- return result;
- }
-
- friend bool operator==(json_pointer const& lhs,
- json_pointer const& rhs) noexcept
- {
- return lhs.reference_tokens == rhs.reference_tokens;
- }
-
- friend bool operator!=(json_pointer const& lhs,
- json_pointer const& rhs) noexcept
- {
- return !(lhs == rhs);
- }
-
- std::vector<std::string> reference_tokens;
- };
- }
- #include <initializer_list>
- #include <utility>
- namespace nlohmann
- {
- namespace detail
- {
- template<typename BasicJsonType>
- class json_ref
- {
- public:
- using value_type = BasicJsonType;
- json_ref(value_type&& value)
- : owned_value(std::move(value))
- , value_ref(&owned_value)
- , is_rvalue(true)
- {}
- json_ref(const value_type& value)
- : value_ref(const_cast<value_type*>(&value))
- , is_rvalue(false)
- {}
- json_ref(std::initializer_list<json_ref> init)
- : owned_value(init)
- , value_ref(&owned_value)
- , is_rvalue(true)
- {}
- template <
- class... Args,
- enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >
- json_ref(Args && ... args)
- : owned_value(std::forward<Args>(args)...)
- , value_ref(&owned_value)
- , is_rvalue(true)
- {}
-
- json_ref(json_ref&&) = default;
- json_ref(const json_ref&) = delete;
- json_ref& operator=(const json_ref&) = delete;
- json_ref& operator=(json_ref&&) = delete;
- ~json_ref() = default;
- value_type moved_or_copied() const
- {
- if (is_rvalue)
- {
- return std::move(*value_ref);
- }
- return *value_ref;
- }
- value_type const& operator*() const
- {
- return *static_cast<value_type const*>(value_ref);
- }
- value_type const* operator->() const
- {
- return static_cast<value_type const*>(value_ref);
- }
- private:
- mutable value_type owned_value = nullptr;
- value_type* value_ref = nullptr;
- const bool is_rvalue = true;
- };
- }
- }
- #include <algorithm> // reverse
- #include <array> // array
- #include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t
- #include <cstring> // memcpy
- #include <limits> // numeric_limits
- #include <string> // string
- #include <cmath> // isnan, isinf
- #include <algorithm> // copy
- #include <cstddef> // size_t
- #include <ios> // streamsize
- #include <iterator> // back_inserter
- #include <memory> // shared_ptr, make_shared
- #include <ostream> // basic_ostream
- #include <string> // basic_string
- #include <vector> // vector
- namespace nlohmann
- {
- namespace detail
- {
- template<typename CharType> struct output_adapter_protocol
- {
- virtual void write_character(CharType c) = 0;
- virtual void write_characters(const CharType* s, std::size_t length) = 0;
- virtual ~output_adapter_protocol() = default;
- };
- template<typename CharType>
- using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>;
- template<typename CharType>
- class output_vector_adapter : public output_adapter_protocol<CharType>
- {
- public:
- explicit output_vector_adapter(std::vector<CharType>& vec) noexcept
- : v(vec)
- {}
- void write_character(CharType c) override
- {
- v.push_back(c);
- }
- JSON_HEDLEY_NON_NULL(2)
- void write_characters(const CharType* s, std::size_t length) override
- {
- std::copy(s, s + length, std::back_inserter(v));
- }
- private:
- std::vector<CharType>& v;
- };
- template<typename CharType>
- class output_stream_adapter : public output_adapter_protocol<CharType>
- {
- public:
- explicit output_stream_adapter(std::basic_ostream<CharType>& s) noexcept
- : stream(s)
- {}
- void write_character(CharType c) override
- {
- stream.put(c);
- }
- JSON_HEDLEY_NON_NULL(2)
- void write_characters(const CharType* s, std::size_t length) override
- {
- stream.write(s, static_cast<std::streamsize>(length));
- }
- private:
- std::basic_ostream<CharType>& stream;
- };
- template<typename CharType, typename StringType = std::basic_string<CharType>>
- class output_string_adapter : public output_adapter_protocol<CharType>
- {
- public:
- explicit output_string_adapter(StringType& s) noexcept
- : str(s)
- {}
- void write_character(CharType c) override
- {
- str.push_back(c);
- }
- JSON_HEDLEY_NON_NULL(2)
- void write_characters(const CharType* s, std::size_t length) override
- {
- str.append(s, length);
- }
- private:
- StringType& str;
- };
- template<typename CharType, typename StringType = std::basic_string<CharType>>
- class output_adapter
- {
- public:
- output_adapter(std::vector<CharType>& vec)
- : oa(std::make_shared<output_vector_adapter<CharType>>(vec)) {}
- output_adapter(std::basic_ostream<CharType>& s)
- : oa(std::make_shared<output_stream_adapter<CharType>>(s)) {}
- output_adapter(StringType& s)
- : oa(std::make_shared<output_string_adapter<CharType, StringType>>(s)) {}
- operator output_adapter_t<CharType>()
- {
- return oa;
- }
- private:
- output_adapter_t<CharType> oa = nullptr;
- };
- }
- }
- namespace nlohmann
- {
- namespace detail
- {
- template<typename BasicJsonType, typename CharType>
- class binary_writer
- {
- using string_t = typename BasicJsonType::string_t;
- using binary_t = typename BasicJsonType::binary_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- public:
-
- explicit binary_writer(output_adapter_t<CharType> adapter) : oa(adapter)
- {
- JSON_ASSERT(oa);
- }
-
- void write_bson(const BasicJsonType& j)
- {
- switch (j.type())
- {
- case value_t::object:
- {
- write_bson_object(*j.m_value.object);
- break;
- }
- default:
- {
- JSON_THROW(type_error::create(317, "to serialize to BSON, top-level type must be object, but is " + std::string(j.type_name())));
- }
- }
- }
-
- void write_cbor(const BasicJsonType& j)
- {
- switch (j.type())
- {
- case value_t::null:
- {
- oa->write_character(to_char_type(0xF6));
- break;
- }
- case value_t::boolean:
- {
- oa->write_character(j.m_value.boolean
- ? to_char_type(0xF5)
- : to_char_type(0xF4));
- break;
- }
- case value_t::number_integer:
- {
- if (j.m_value.number_integer >= 0)
- {
-
-
-
- if (j.m_value.number_integer <= 0x17)
- {
- write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())
- {
- oa->write_character(to_char_type(0x18));
- write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())
- {
- oa->write_character(to_char_type(0x19));
- write_number(static_cast<std::uint16_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())
- {
- oa->write_character(to_char_type(0x1A));
- write_number(static_cast<std::uint32_t>(j.m_value.number_integer));
- }
- else
- {
- oa->write_character(to_char_type(0x1B));
- write_number(static_cast<std::uint64_t>(j.m_value.number_integer));
- }
- }
- else
- {
-
-
- const auto positive_number = -1 - j.m_value.number_integer;
- if (j.m_value.number_integer >= -24)
- {
- write_number(static_cast<std::uint8_t>(0x20 + positive_number));
- }
- else if (positive_number <= (std::numeric_limits<std::uint8_t>::max)())
- {
- oa->write_character(to_char_type(0x38));
- write_number(static_cast<std::uint8_t>(positive_number));
- }
- else if (positive_number <= (std::numeric_limits<std::uint16_t>::max)())
- {
- oa->write_character(to_char_type(0x39));
- write_number(static_cast<std::uint16_t>(positive_number));
- }
- else if (positive_number <= (std::numeric_limits<std::uint32_t>::max)())
- {
- oa->write_character(to_char_type(0x3A));
- write_number(static_cast<std::uint32_t>(positive_number));
- }
- else
- {
- oa->write_character(to_char_type(0x3B));
- write_number(static_cast<std::uint64_t>(positive_number));
- }
- }
- break;
- }
- case value_t::number_unsigned:
- {
- if (j.m_value.number_unsigned <= 0x17)
- {
- write_number(static_cast<std::uint8_t>(j.m_value.number_unsigned));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
- {
- oa->write_character(to_char_type(0x18));
- write_number(static_cast<std::uint8_t>(j.m_value.number_unsigned));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
- {
- oa->write_character(to_char_type(0x19));
- write_number(static_cast<std::uint16_t>(j.m_value.number_unsigned));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
- {
- oa->write_character(to_char_type(0x1A));
- write_number(static_cast<std::uint32_t>(j.m_value.number_unsigned));
- }
- else
- {
- oa->write_character(to_char_type(0x1B));
- write_number(static_cast<std::uint64_t>(j.m_value.number_unsigned));
- }
- break;
- }
- case value_t::number_float:
- {
- if (std::isnan(j.m_value.number_float))
- {
-
- oa->write_character(to_char_type(0xF9));
- oa->write_character(to_char_type(0x7E));
- oa->write_character(to_char_type(0x00));
- }
- else if (std::isinf(j.m_value.number_float))
- {
-
- oa->write_character(to_char_type(0xf9));
- oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC));
- oa->write_character(to_char_type(0x00));
- }
- else
- {
- write_compact_float(j.m_value.number_float, detail::input_format_t::cbor);
- }
- break;
- }
- case value_t::string:
- {
-
- const auto N = j.m_value.string->size();
- if (N <= 0x17)
- {
- write_number(static_cast<std::uint8_t>(0x60 + N));
- }
- else if (N <= (std::numeric_limits<std::uint8_t>::max)())
- {
- oa->write_character(to_char_type(0x78));
- write_number(static_cast<std::uint8_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint16_t>::max)())
- {
- oa->write_character(to_char_type(0x79));
- write_number(static_cast<std::uint16_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint32_t>::max)())
- {
- oa->write_character(to_char_type(0x7A));
- write_number(static_cast<std::uint32_t>(N));
- }
-
- else if (N <= (std::numeric_limits<std::uint64_t>::max)())
- {
- oa->write_character(to_char_type(0x7B));
- write_number(static_cast<std::uint64_t>(N));
- }
-
-
- oa->write_characters(
- reinterpret_cast<const CharType*>(j.m_value.string->c_str()),
- j.m_value.string->size());
- break;
- }
- case value_t::array:
- {
-
- const auto N = j.m_value.array->size();
- if (N <= 0x17)
- {
- write_number(static_cast<std::uint8_t>(0x80 + N));
- }
- else if (N <= (std::numeric_limits<std::uint8_t>::max)())
- {
- oa->write_character(to_char_type(0x98));
- write_number(static_cast<std::uint8_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint16_t>::max)())
- {
- oa->write_character(to_char_type(0x99));
- write_number(static_cast<std::uint16_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint32_t>::max)())
- {
- oa->write_character(to_char_type(0x9A));
- write_number(static_cast<std::uint32_t>(N));
- }
-
- else if (N <= (std::numeric_limits<std::uint64_t>::max)())
- {
- oa->write_character(to_char_type(0x9B));
- write_number(static_cast<std::uint64_t>(N));
- }
-
-
- for (const auto& el : *j.m_value.array)
- {
- write_cbor(el);
- }
- break;
- }
- case value_t::binary:
- {
- if (j.m_value.binary->has_subtype())
- {
- write_number(static_cast<std::uint8_t>(0xd8));
- write_number(j.m_value.binary->subtype());
- }
-
- const auto N = j.m_value.binary->size();
- if (N <= 0x17)
- {
- write_number(static_cast<std::uint8_t>(0x40 + N));
- }
- else if (N <= (std::numeric_limits<std::uint8_t>::max)())
- {
- oa->write_character(to_char_type(0x58));
- write_number(static_cast<std::uint8_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint16_t>::max)())
- {
- oa->write_character(to_char_type(0x59));
- write_number(static_cast<std::uint16_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint32_t>::max)())
- {
- oa->write_character(to_char_type(0x5A));
- write_number(static_cast<std::uint32_t>(N));
- }
-
- else if (N <= (std::numeric_limits<std::uint64_t>::max)())
- {
- oa->write_character(to_char_type(0x5B));
- write_number(static_cast<std::uint64_t>(N));
- }
-
-
- oa->write_characters(
- reinterpret_cast<const CharType*>(j.m_value.binary->data()),
- N);
- break;
- }
- case value_t::object:
- {
-
- const auto N = j.m_value.object->size();
- if (N <= 0x17)
- {
- write_number(static_cast<std::uint8_t>(0xA0 + N));
- }
- else if (N <= (std::numeric_limits<std::uint8_t>::max)())
- {
- oa->write_character(to_char_type(0xB8));
- write_number(static_cast<std::uint8_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint16_t>::max)())
- {
- oa->write_character(to_char_type(0xB9));
- write_number(static_cast<std::uint16_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint32_t>::max)())
- {
- oa->write_character(to_char_type(0xBA));
- write_number(static_cast<std::uint32_t>(N));
- }
-
- else if (N <= (std::numeric_limits<std::uint64_t>::max)())
- {
- oa->write_character(to_char_type(0xBB));
- write_number(static_cast<std::uint64_t>(N));
- }
-
-
- for (const auto& el : *j.m_value.object)
- {
- write_cbor(el.first);
- write_cbor(el.second);
- }
- break;
- }
- default:
- break;
- }
- }
-
- void write_msgpack(const BasicJsonType& j)
- {
- switch (j.type())
- {
- case value_t::null:
- {
- oa->write_character(to_char_type(0xC0));
- break;
- }
- case value_t::boolean:
- {
- oa->write_character(j.m_value.boolean
- ? to_char_type(0xC3)
- : to_char_type(0xC2));
- break;
- }
- case value_t::number_integer:
- {
- if (j.m_value.number_integer >= 0)
- {
-
-
-
- if (j.m_value.number_unsigned < 128)
- {
-
- write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
- {
-
- oa->write_character(to_char_type(0xCC));
- write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
- {
-
- oa->write_character(to_char_type(0xCD));
- write_number(static_cast<std::uint16_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
- {
-
- oa->write_character(to_char_type(0xCE));
- write_number(static_cast<std::uint32_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
- {
-
- oa->write_character(to_char_type(0xCF));
- write_number(static_cast<std::uint64_t>(j.m_value.number_integer));
- }
- }
- else
- {
- if (j.m_value.number_integer >= -32)
- {
-
- write_number(static_cast<std::int8_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() &&
- j.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())
- {
-
- oa->write_character(to_char_type(0xD0));
- write_number(static_cast<std::int8_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() &&
- j.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())
- {
-
- oa->write_character(to_char_type(0xD1));
- write_number(static_cast<std::int16_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() &&
- j.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())
- {
-
- oa->write_character(to_char_type(0xD2));
- write_number(static_cast<std::int32_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() &&
- j.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())
- {
-
- oa->write_character(to_char_type(0xD3));
- write_number(static_cast<std::int64_t>(j.m_value.number_integer));
- }
- }
- break;
- }
- case value_t::number_unsigned:
- {
- if (j.m_value.number_unsigned < 128)
- {
-
- write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
- {
-
- oa->write_character(to_char_type(0xCC));
- write_number(static_cast<std::uint8_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)())
- {
-
- oa->write_character(to_char_type(0xCD));
- write_number(static_cast<std::uint16_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)())
- {
-
- oa->write_character(to_char_type(0xCE));
- write_number(static_cast<std::uint32_t>(j.m_value.number_integer));
- }
- else if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)())
- {
-
- oa->write_character(to_char_type(0xCF));
- write_number(static_cast<std::uint64_t>(j.m_value.number_integer));
- }
- break;
- }
- case value_t::number_float:
- {
- write_compact_float(j.m_value.number_float, detail::input_format_t::msgpack);
- break;
- }
- case value_t::string:
- {
-
- const auto N = j.m_value.string->size();
- if (N <= 31)
- {
-
- write_number(static_cast<std::uint8_t>(0xA0 | N));
- }
- else if (N <= (std::numeric_limits<std::uint8_t>::max)())
- {
-
- oa->write_character(to_char_type(0xD9));
- write_number(static_cast<std::uint8_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint16_t>::max)())
- {
-
- oa->write_character(to_char_type(0xDA));
- write_number(static_cast<std::uint16_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint32_t>::max)())
- {
-
- oa->write_character(to_char_type(0xDB));
- write_number(static_cast<std::uint32_t>(N));
- }
-
- oa->write_characters(
- reinterpret_cast<const CharType*>(j.m_value.string->c_str()),
- j.m_value.string->size());
- break;
- }
- case value_t::array:
- {
-
- const auto N = j.m_value.array->size();
- if (N <= 15)
- {
-
- write_number(static_cast<std::uint8_t>(0x90 | N));
- }
- else if (N <= (std::numeric_limits<std::uint16_t>::max)())
- {
-
- oa->write_character(to_char_type(0xDC));
- write_number(static_cast<std::uint16_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint32_t>::max)())
- {
-
- oa->write_character(to_char_type(0xDD));
- write_number(static_cast<std::uint32_t>(N));
- }
-
- for (const auto& el : *j.m_value.array)
- {
- write_msgpack(el);
- }
- break;
- }
- case value_t::binary:
- {
-
-
- const bool use_ext = j.m_value.binary->has_subtype();
-
- const auto N = j.m_value.binary->size();
- if (N <= (std::numeric_limits<std::uint8_t>::max)())
- {
- std::uint8_t output_type{};
- bool fixed = true;
- if (use_ext)
- {
- switch (N)
- {
- case 1:
- output_type = 0xD4;
- break;
- case 2:
- output_type = 0xD5;
- break;
- case 4:
- output_type = 0xD6;
- break;
- case 8:
- output_type = 0xD7;
- break;
- case 16:
- output_type = 0xD8;
- break;
- default:
- output_type = 0xC7;
- fixed = false;
- break;
- }
- }
- else
- {
- output_type = 0xC4;
- fixed = false;
- }
- oa->write_character(to_char_type(output_type));
- if (!fixed)
- {
- write_number(static_cast<std::uint8_t>(N));
- }
- }
- else if (N <= (std::numeric_limits<std::uint16_t>::max)())
- {
- std::uint8_t output_type = use_ext
- ? 0xC8
- : 0xC5;
- oa->write_character(to_char_type(output_type));
- write_number(static_cast<std::uint16_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint32_t>::max)())
- {
- std::uint8_t output_type = use_ext
- ? 0xC9
- : 0xC6;
- oa->write_character(to_char_type(output_type));
- write_number(static_cast<std::uint32_t>(N));
- }
-
- if (use_ext)
- {
- write_number(static_cast<std::int8_t>(j.m_value.binary->subtype()));
- }
-
- oa->write_characters(
- reinterpret_cast<const CharType*>(j.m_value.binary->data()),
- N);
- break;
- }
- case value_t::object:
- {
-
- const auto N = j.m_value.object->size();
- if (N <= 15)
- {
-
- write_number(static_cast<std::uint8_t>(0x80 | (N & 0xF)));
- }
- else if (N <= (std::numeric_limits<std::uint16_t>::max)())
- {
-
- oa->write_character(to_char_type(0xDE));
- write_number(static_cast<std::uint16_t>(N));
- }
- else if (N <= (std::numeric_limits<std::uint32_t>::max)())
- {
-
- oa->write_character(to_char_type(0xDF));
- write_number(static_cast<std::uint32_t>(N));
- }
-
- for (const auto& el : *j.m_value.object)
- {
- write_msgpack(el.first);
- write_msgpack(el.second);
- }
- break;
- }
- default:
- break;
- }
- }
-
- void write_ubjson(const BasicJsonType& j, const bool use_count,
- const bool use_type, const bool add_prefix = true)
- {
- switch (j.type())
- {
- case value_t::null:
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('Z'));
- }
- break;
- }
- case value_t::boolean:
- {
- if (add_prefix)
- {
- oa->write_character(j.m_value.boolean
- ? to_char_type('T')
- : to_char_type('F'));
- }
- break;
- }
- case value_t::number_integer:
- {
- write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix);
- break;
- }
- case value_t::number_unsigned:
- {
- write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix);
- break;
- }
- case value_t::number_float:
- {
- write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix);
- break;
- }
- case value_t::string:
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('S'));
- }
- write_number_with_ubjson_prefix(j.m_value.string->size(), true);
- oa->write_characters(
- reinterpret_cast<const CharType*>(j.m_value.string->c_str()),
- j.m_value.string->size());
- break;
- }
- case value_t::array:
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('['));
- }
- bool prefix_required = true;
- if (use_type && !j.m_value.array->empty())
- {
- JSON_ASSERT(use_count);
- const CharType first_prefix = ubjson_prefix(j.front());
- const bool same_prefix = std::all_of(j.begin() + 1, j.end(),
- [this, first_prefix](const BasicJsonType & v)
- {
- return ubjson_prefix(v) == first_prefix;
- });
- if (same_prefix)
- {
- prefix_required = false;
- oa->write_character(to_char_type('$'));
- oa->write_character(first_prefix);
- }
- }
- if (use_count)
- {
- oa->write_character(to_char_type('#'));
- write_number_with_ubjson_prefix(j.m_value.array->size(), true);
- }
- for (const auto& el : *j.m_value.array)
- {
- write_ubjson(el, use_count, use_type, prefix_required);
- }
- if (!use_count)
- {
- oa->write_character(to_char_type(']'));
- }
- break;
- }
- case value_t::binary:
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('['));
- }
- if (use_type && !j.m_value.binary->empty())
- {
- JSON_ASSERT(use_count);
- oa->write_character(to_char_type('$'));
- oa->write_character('U');
- }
- if (use_count)
- {
- oa->write_character(to_char_type('#'));
- write_number_with_ubjson_prefix(j.m_value.binary->size(), true);
- }
- if (use_type)
- {
- oa->write_characters(
- reinterpret_cast<const CharType*>(j.m_value.binary->data()),
- j.m_value.binary->size());
- }
- else
- {
- for (size_t i = 0; i < j.m_value.binary->size(); ++i)
- {
- oa->write_character(to_char_type('U'));
- oa->write_character(j.m_value.binary->data()[i]);
- }
- }
- if (!use_count)
- {
- oa->write_character(to_char_type(']'));
- }
- break;
- }
- case value_t::object:
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('{'));
- }
- bool prefix_required = true;
- if (use_type && !j.m_value.object->empty())
- {
- JSON_ASSERT(use_count);
- const CharType first_prefix = ubjson_prefix(j.front());
- const bool same_prefix = std::all_of(j.begin(), j.end(),
- [this, first_prefix](const BasicJsonType & v)
- {
- return ubjson_prefix(v) == first_prefix;
- });
- if (same_prefix)
- {
- prefix_required = false;
- oa->write_character(to_char_type('$'));
- oa->write_character(first_prefix);
- }
- }
- if (use_count)
- {
- oa->write_character(to_char_type('#'));
- write_number_with_ubjson_prefix(j.m_value.object->size(), true);
- }
- for (const auto& el : *j.m_value.object)
- {
- write_number_with_ubjson_prefix(el.first.size(), true);
- oa->write_characters(
- reinterpret_cast<const CharType*>(el.first.c_str()),
- el.first.size());
- write_ubjson(el.second, use_count, use_type, prefix_required);
- }
- if (!use_count)
- {
- oa->write_character(to_char_type('}'));
- }
- break;
- }
- default:
- break;
- }
- }
- private:
-
-
-
-
- static std::size_t calc_bson_entry_header_size(const string_t& name)
- {
- const auto it = name.find(static_cast<typename string_t::value_type>(0));
- if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos))
- {
- JSON_THROW(out_of_range::create(409,
- "BSON key cannot contain code point U+0000 (at byte " + std::to_string(it) + ")"));
- }
- return 1ul + name.size() + 1u;
- }
-
- void write_bson_entry_header(const string_t& name,
- const std::uint8_t element_type)
- {
- oa->write_character(to_char_type(element_type));
- oa->write_characters(
- reinterpret_cast<const CharType*>(name.c_str()),
- name.size() + 1u);
- }
-
- void write_bson_boolean(const string_t& name,
- const bool value)
- {
- write_bson_entry_header(name, 0x08);
- oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00));
- }
-
- void write_bson_double(const string_t& name,
- const double value)
- {
- write_bson_entry_header(name, 0x01);
- write_number<double, true>(value);
- }
-
- static std::size_t calc_bson_string_size(const string_t& value)
- {
- return sizeof(std::int32_t) + value.size() + 1ul;
- }
-
- void write_bson_string(const string_t& name,
- const string_t& value)
- {
- write_bson_entry_header(name, 0x02);
- write_number<std::int32_t, true>(static_cast<std::int32_t>(value.size() + 1ul));
- oa->write_characters(
- reinterpret_cast<const CharType*>(value.c_str()),
- value.size() + 1);
- }
-
- void write_bson_null(const string_t& name)
- {
- write_bson_entry_header(name, 0x0A);
- }
-
- static std::size_t calc_bson_integer_size(const std::int64_t value)
- {
- return (std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)()
- ? sizeof(std::int32_t)
- : sizeof(std::int64_t);
- }
-
- void write_bson_integer(const string_t& name,
- const std::int64_t value)
- {
- if ((std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)())
- {
- write_bson_entry_header(name, 0x10);
- write_number<std::int32_t, true>(static_cast<std::int32_t>(value));
- }
- else
- {
- write_bson_entry_header(name, 0x12);
- write_number<std::int64_t, true>(static_cast<std::int64_t>(value));
- }
- }
-
- static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept
- {
- return (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
- ? sizeof(std::int32_t)
- : sizeof(std::int64_t);
- }
-
- void write_bson_unsigned(const string_t& name,
- const std::uint64_t value)
- {
- if (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
- {
- write_bson_entry_header(name, 0x10 );
- write_number<std::int32_t, true>(static_cast<std::int32_t>(value));
- }
- else if (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))
- {
- write_bson_entry_header(name, 0x12 );
- write_number<std::int64_t, true>(static_cast<std::int64_t>(value));
- }
- else
- {
- JSON_THROW(out_of_range::create(407, "integer number " + std::to_string(value) + " cannot be represented by BSON as it does not fit int64"));
- }
- }
-
- void write_bson_object_entry(const string_t& name,
- const typename BasicJsonType::object_t& value)
- {
- write_bson_entry_header(name, 0x03);
- write_bson_object(value);
- }
-
- static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value)
- {
- std::size_t array_index = 0ul;
- const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), std::size_t(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el)
- {
- return result + calc_bson_element_size(std::to_string(array_index++), el);
- });
- return sizeof(std::int32_t) + embedded_document_size + 1ul;
- }
-
- static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value)
- {
- return sizeof(std::int32_t) + value.size() + 1ul;
- }
-
- void write_bson_array(const string_t& name,
- const typename BasicJsonType::array_t& value)
- {
- write_bson_entry_header(name, 0x04);
- write_number<std::int32_t, true>(static_cast<std::int32_t>(calc_bson_array_size(value)));
- std::size_t array_index = 0ul;
- for (const auto& el : value)
- {
- write_bson_element(std::to_string(array_index++), el);
- }
- oa->write_character(to_char_type(0x00));
- }
-
- void write_bson_binary(const string_t& name,
- const binary_t& value)
- {
- write_bson_entry_header(name, 0x05);
- write_number<std::int32_t, true>(static_cast<std::int32_t>(value.size()));
- write_number(value.has_subtype() ? value.subtype() : std::uint8_t(0x00));
- oa->write_characters(reinterpret_cast<const CharType*>(value.data()), value.size());
- }
-
- static std::size_t calc_bson_element_size(const string_t& name,
- const BasicJsonType& j)
- {
- const auto header_size = calc_bson_entry_header_size(name);
- switch (j.type())
- {
- case value_t::object:
- return header_size + calc_bson_object_size(*j.m_value.object);
- case value_t::array:
- return header_size + calc_bson_array_size(*j.m_value.array);
- case value_t::binary:
- return header_size + calc_bson_binary_size(*j.m_value.binary);
- case value_t::boolean:
- return header_size + 1ul;
- case value_t::number_float:
- return header_size + 8ul;
- case value_t::number_integer:
- return header_size + calc_bson_integer_size(j.m_value.number_integer);
- case value_t::number_unsigned:
- return header_size + calc_bson_unsigned_size(j.m_value.number_unsigned);
- case value_t::string:
- return header_size + calc_bson_string_size(*j.m_value.string);
- case value_t::null:
- return header_size + 0ul;
-
- default:
- JSON_ASSERT(false);
- return 0ul;
-
- }
- }
-
- void write_bson_element(const string_t& name,
- const BasicJsonType& j)
- {
- switch (j.type())
- {
- case value_t::object:
- return write_bson_object_entry(name, *j.m_value.object);
- case value_t::array:
- return write_bson_array(name, *j.m_value.array);
- case value_t::binary:
- return write_bson_binary(name, *j.m_value.binary);
- case value_t::boolean:
- return write_bson_boolean(name, j.m_value.boolean);
- case value_t::number_float:
- return write_bson_double(name, j.m_value.number_float);
- case value_t::number_integer:
- return write_bson_integer(name, j.m_value.number_integer);
- case value_t::number_unsigned:
- return write_bson_unsigned(name, j.m_value.number_unsigned);
- case value_t::string:
- return write_bson_string(name, *j.m_value.string);
- case value_t::null:
- return write_bson_null(name);
-
- default:
- JSON_ASSERT(false);
- return;
-
- }
- }
-
- static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)
- {
- std::size_t document_size = std::accumulate(value.begin(), value.end(), std::size_t(0),
- [](size_t result, const typename BasicJsonType::object_t::value_type & el)
- {
- return result += calc_bson_element_size(el.first, el.second);
- });
- return sizeof(std::int32_t) + document_size + 1ul;
- }
-
- void write_bson_object(const typename BasicJsonType::object_t& value)
- {
- write_number<std::int32_t, true>(static_cast<std::int32_t>(calc_bson_object_size(value)));
- for (const auto& el : value)
- {
- write_bson_element(el.first, el.second);
- }
- oa->write_character(to_char_type(0x00));
- }
-
-
-
- static constexpr CharType get_cbor_float_prefix(float )
- {
- return to_char_type(0xFA);
- }
- static constexpr CharType get_cbor_float_prefix(double )
- {
- return to_char_type(0xFB);
- }
-
-
-
- static constexpr CharType get_msgpack_float_prefix(float )
- {
- return to_char_type(0xCA);
- }
- static constexpr CharType get_msgpack_float_prefix(double )
- {
- return to_char_type(0xCB);
- }
-
-
-
-
- template<typename NumberType, typename std::enable_if<
- std::is_floating_point<NumberType>::value, int>::type = 0>
- void write_number_with_ubjson_prefix(const NumberType n,
- const bool add_prefix)
- {
- if (add_prefix)
- {
- oa->write_character(get_ubjson_float_prefix(n));
- }
- write_number(n);
- }
-
- template<typename NumberType, typename std::enable_if<
- std::is_unsigned<NumberType>::value, int>::type = 0>
- void write_number_with_ubjson_prefix(const NumberType n,
- const bool add_prefix)
- {
- if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('i'));
- }
- write_number(static_cast<std::uint8_t>(n));
- }
- else if (n <= (std::numeric_limits<std::uint8_t>::max)())
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('U'));
- }
- write_number(static_cast<std::uint8_t>(n));
- }
- else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('I'));
- }
- write_number(static_cast<std::int16_t>(n));
- }
- else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('l'));
- }
- write_number(static_cast<std::int32_t>(n));
- }
- else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('L'));
- }
- write_number(static_cast<std::int64_t>(n));
- }
- else
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('H'));
- }
- const auto number = BasicJsonType(n).dump();
- write_number_with_ubjson_prefix(number.size(), true);
- for (std::size_t i = 0; i < number.size(); ++i)
- {
- oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));
- }
- }
- }
-
- template < typename NumberType, typename std::enable_if <
- std::is_signed<NumberType>::value&&
- !std::is_floating_point<NumberType>::value, int >::type = 0 >
- void write_number_with_ubjson_prefix(const NumberType n,
- const bool add_prefix)
- {
- if ((std::numeric_limits<std::int8_t>::min)() <= n && n <= (std::numeric_limits<std::int8_t>::max)())
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('i'));
- }
- write_number(static_cast<std::int8_t>(n));
- }
- else if (static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::max)()))
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('U'));
- }
- write_number(static_cast<std::uint8_t>(n));
- }
- else if ((std::numeric_limits<std::int16_t>::min)() <= n && n <= (std::numeric_limits<std::int16_t>::max)())
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('I'));
- }
- write_number(static_cast<std::int16_t>(n));
- }
- else if ((std::numeric_limits<std::int32_t>::min)() <= n && n <= (std::numeric_limits<std::int32_t>::max)())
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('l'));
- }
- write_number(static_cast<std::int32_t>(n));
- }
- else if ((std::numeric_limits<std::int64_t>::min)() <= n && n <= (std::numeric_limits<std::int64_t>::max)())
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('L'));
- }
- write_number(static_cast<std::int64_t>(n));
- }
-
- else
- {
- if (add_prefix)
- {
- oa->write_character(to_char_type('H'));
- }
- const auto number = BasicJsonType(n).dump();
- write_number_with_ubjson_prefix(number.size(), true);
- for (std::size_t i = 0; i < number.size(); ++i)
- {
- oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));
- }
- }
-
- }
-
- CharType ubjson_prefix(const BasicJsonType& j) const noexcept
- {
- switch (j.type())
- {
- case value_t::null:
- return 'Z';
- case value_t::boolean:
- return j.m_value.boolean ? 'T' : 'F';
- case value_t::number_integer:
- {
- if ((std::numeric_limits<std::int8_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)())
- {
- return 'i';
- }
- if ((std::numeric_limits<std::uint8_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)())
- {
- return 'U';
- }
- if ((std::numeric_limits<std::int16_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)())
- {
- return 'I';
- }
- if ((std::numeric_limits<std::int32_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)())
- {
- return 'l';
- }
- if ((std::numeric_limits<std::int64_t>::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)())
- {
- return 'L';
- }
-
- return 'H';
- }
- case value_t::number_unsigned:
- {
- if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))
- {
- return 'i';
- }
- if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint8_t>::max)()))
- {
- return 'U';
- }
- if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))
- {
- return 'I';
- }
- if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
- {
- return 'l';
- }
- if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)()))
- {
- return 'L';
- }
-
- return 'H';
- }
- case value_t::number_float:
- return get_ubjson_float_prefix(j.m_value.number_float);
- case value_t::string:
- return 'S';
- case value_t::array:
- case value_t::binary:
- return '[';
- case value_t::object:
- return '{';
- default:
- return 'N';
- }
- }
- static constexpr CharType get_ubjson_float_prefix(float )
- {
- return 'd';
- }
- static constexpr CharType get_ubjson_float_prefix(double )
- {
- return 'D';
- }
-
-
-
-
- template<typename NumberType, bool OutputIsLittleEndian = false>
- void write_number(const NumberType n)
- {
-
- std::array<CharType, sizeof(NumberType)> vec;
- std::memcpy(vec.data(), &n, sizeof(NumberType));
-
- if (is_little_endian != OutputIsLittleEndian)
- {
-
- std::reverse(vec.begin(), vec.end());
- }
- oa->write_characters(vec.data(), sizeof(NumberType));
- }
- void write_compact_float(const number_float_t n, detail::input_format_t format)
- {
- if (static_cast<double>(n) >= static_cast<double>(std::numeric_limits<float>::lowest()) &&
- static_cast<double>(n) <= static_cast<double>((std::numeric_limits<float>::max)()) &&
- static_cast<double>(static_cast<float>(n)) == static_cast<double>(n))
- {
- oa->write_character(format == detail::input_format_t::cbor
- ? get_cbor_float_prefix(static_cast<float>(n))
- : get_msgpack_float_prefix(static_cast<float>(n)));
- write_number(static_cast<float>(n));
- }
- else
- {
- oa->write_character(format == detail::input_format_t::cbor
- ? get_cbor_float_prefix(n)
- : get_msgpack_float_prefix(n));
- write_number(n);
- }
- }
- public:
-
-
-
-
- template < typename C = CharType,
- enable_if_t < std::is_signed<C>::value && std::is_signed<char>::value > * = nullptr >
- static constexpr CharType to_char_type(std::uint8_t x) noexcept
- {
- return *reinterpret_cast<char*>(&x);
- }
- template < typename C = CharType,
- enable_if_t < std::is_signed<C>::value && std::is_unsigned<char>::value > * = nullptr >
- static CharType to_char_type(std::uint8_t x) noexcept
- {
- static_assert(sizeof(std::uint8_t) == sizeof(CharType), "size of CharType must be equal to std::uint8_t");
- static_assert(std::is_trivial<CharType>::value, "CharType must be trivial");
- CharType result;
- std::memcpy(&result, &x, sizeof(x));
- return result;
- }
- template<typename C = CharType,
- enable_if_t<std::is_unsigned<C>::value>* = nullptr>
- static constexpr CharType to_char_type(std::uint8_t x) noexcept
- {
- return x;
- }
- template < typename InputCharType, typename C = CharType,
- enable_if_t <
- std::is_signed<C>::value &&
- std::is_signed<char>::value &&
- std::is_same<char, typename std::remove_cv<InputCharType>::type>::value
- > * = nullptr >
- static constexpr CharType to_char_type(InputCharType x) noexcept
- {
- return x;
- }
- private:
-
- const bool is_little_endian = little_endianess();
-
- output_adapter_t<CharType> oa = nullptr;
- };
- }
- }
- #include <algorithm> // reverse, remove, fill, find, none_of
- #include <array> // array
- #include <clocale> // localeconv, lconv
- #include <cmath> // labs, isfinite, isnan, signbit
- #include <cstddef> // size_t, ptrdiff_t
- #include <cstdint> // uint8_t
- #include <cstdio> // snprintf
- #include <limits> // numeric_limits
- #include <string> // string, char_traits
- #include <type_traits> // is_same
- #include <utility> // move
- #include <array> // array
- #include <cmath> // signbit, isfinite
- #include <cstdint> // intN_t, uintN_t
- #include <cstring> // memcpy, memmove
- #include <limits> // numeric_limits
- #include <type_traits> // conditional
- namespace nlohmann
- {
- namespace detail
- {
- namespace dtoa_impl
- {
- template<typename Target, typename Source>
- Target reinterpret_bits(const Source source)
- {
- static_assert(sizeof(Target) == sizeof(Source), "size mismatch");
- Target target;
- std::memcpy(&target, &source, sizeof(Source));
- return target;
- }
- struct diyfp
- {
- static constexpr int kPrecision = 64;
- std::uint64_t f = 0;
- int e = 0;
- constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {}
-
- static diyfp sub(const diyfp& x, const diyfp& y) noexcept
- {
- JSON_ASSERT(x.e == y.e);
- JSON_ASSERT(x.f >= y.f);
- return {x.f - y.f, x.e};
- }
-
- static diyfp mul(const diyfp& x, const diyfp& y) noexcept
- {
- static_assert(kPrecision == 64, "internal error");
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;
- const std::uint64_t u_hi = x.f >> 32u;
- const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;
- const std::uint64_t v_hi = y.f >> 32u;
- const std::uint64_t p0 = u_lo * v_lo;
- const std::uint64_t p1 = u_lo * v_hi;
- const std::uint64_t p2 = u_hi * v_lo;
- const std::uint64_t p3 = u_hi * v_hi;
- const std::uint64_t p0_hi = p0 >> 32u;
- const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu;
- const std::uint64_t p1_hi = p1 >> 32u;
- const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu;
- const std::uint64_t p2_hi = p2 >> 32u;
- std::uint64_t Q = p0_hi + p1_lo + p2_lo;
-
-
-
-
-
-
-
-
- Q += std::uint64_t{1} << (64u - 32u - 1u);
- const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u);
- return {h, x.e + y.e + 64};
- }
-
- static diyfp normalize(diyfp x) noexcept
- {
- JSON_ASSERT(x.f != 0);
- while ((x.f >> 63u) == 0)
- {
- x.f <<= 1u;
- x.e--;
- }
- return x;
- }
-
- static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept
- {
- const int delta = x.e - target_exponent;
- JSON_ASSERT(delta >= 0);
- JSON_ASSERT(((x.f << delta) >> delta) == x.f);
- return {x.f << delta, target_exponent};
- }
- };
- struct boundaries
- {
- diyfp w;
- diyfp minus;
- diyfp plus;
- };
- template<typename FloatType>
- boundaries compute_boundaries(FloatType value)
- {
- JSON_ASSERT(std::isfinite(value));
- JSON_ASSERT(value > 0);
-
-
-
-
-
-
- static_assert(std::numeric_limits<FloatType>::is_iec559,
- "internal error: dtoa_short requires an IEEE-754 floating-point implementation");
- constexpr int kPrecision = std::numeric_limits<FloatType>::digits;
- constexpr int kBias = std::numeric_limits<FloatType>::max_exponent - 1 + (kPrecision - 1);
- constexpr int kMinExp = 1 - kBias;
- constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1);
- using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;
- const std::uint64_t bits = reinterpret_bits<bits_type>(value);
- const std::uint64_t E = bits >> (kPrecision - 1);
- const std::uint64_t F = bits & (kHiddenBit - 1);
- const bool is_denormal = E == 0;
- const diyfp v = is_denormal
- ? diyfp(F, kMinExp)
- : diyfp(F + kHiddenBit, static_cast<int>(E) - kBias);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- const bool lower_boundary_is_closer = F == 0 && E > 1;
- const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1);
- const diyfp m_minus = lower_boundary_is_closer
- ? diyfp(4 * v.f - 1, v.e - 2)
- : diyfp(2 * v.f - 1, v.e - 1);
-
- const diyfp w_plus = diyfp::normalize(m_plus);
-
- const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e);
- return {diyfp::normalize(v), w_minus, w_plus};
- }
- constexpr int kAlpha = -60;
- constexpr int kGamma = -32;
- struct cached_power
- {
- std::uint64_t f;
- int e;
- int k;
- };
- inline cached_power get_cached_power_for_binary_exponent(int e)
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- constexpr int kCachedPowersMinDecExp = -300;
- constexpr int kCachedPowersDecStep = 8;
- static constexpr std::array<cached_power, 79> kCachedPowers =
- {
- {
- { 0xAB70FE17C79AC6CA, -1060, -300 },
- { 0xFF77B1FCBEBCDC4F, -1034, -292 },
- { 0xBE5691EF416BD60C, -1007, -284 },
- { 0x8DD01FAD907FFC3C, -980, -276 },
- { 0xD3515C2831559A83, -954, -268 },
- { 0x9D71AC8FADA6C9B5, -927, -260 },
- { 0xEA9C227723EE8BCB, -901, -252 },
- { 0xAECC49914078536D, -874, -244 },
- { 0x823C12795DB6CE57, -847, -236 },
- { 0xC21094364DFB5637, -821, -228 },
- { 0x9096EA6F3848984F, -794, -220 },
- { 0xD77485CB25823AC7, -768, -212 },
- { 0xA086CFCD97BF97F4, -741, -204 },
- { 0xEF340A98172AACE5, -715, -196 },
- { 0xB23867FB2A35B28E, -688, -188 },
- { 0x84C8D4DFD2C63F3B, -661, -180 },
- { 0xC5DD44271AD3CDBA, -635, -172 },
- { 0x936B9FCEBB25C996, -608, -164 },
- { 0xDBAC6C247D62A584, -582, -156 },
- { 0xA3AB66580D5FDAF6, -555, -148 },
- { 0xF3E2F893DEC3F126, -529, -140 },
- { 0xB5B5ADA8AAFF80B8, -502, -132 },
- { 0x87625F056C7C4A8B, -475, -124 },
- { 0xC9BCFF6034C13053, -449, -116 },
- { 0x964E858C91BA2655, -422, -108 },
- { 0xDFF9772470297EBD, -396, -100 },
- { 0xA6DFBD9FB8E5B88F, -369, -92 },
- { 0xF8A95FCF88747D94, -343, -84 },
- { 0xB94470938FA89BCF, -316, -76 },
- { 0x8A08F0F8BF0F156B, -289, -68 },
- { 0xCDB02555653131B6, -263, -60 },
- { 0x993FE2C6D07B7FAC, -236, -52 },
- { 0xE45C10C42A2B3B06, -210, -44 },
- { 0xAA242499697392D3, -183, -36 },
- { 0xFD87B5F28300CA0E, -157, -28 },
- { 0xBCE5086492111AEB, -130, -20 },
- { 0x8CBCCC096F5088CC, -103, -12 },
- { 0xD1B71758E219652C, -77, -4 },
- { 0x9C40000000000000, -50, 4 },
- { 0xE8D4A51000000000, -24, 12 },
- { 0xAD78EBC5AC620000, 3, 20 },
- { 0x813F3978F8940984, 30, 28 },
- { 0xC097CE7BC90715B3, 56, 36 },
- { 0x8F7E32CE7BEA5C70, 83, 44 },
- { 0xD5D238A4ABE98068, 109, 52 },
- { 0x9F4F2726179A2245, 136, 60 },
- { 0xED63A231D4C4FB27, 162, 68 },
- { 0xB0DE65388CC8ADA8, 189, 76 },
- { 0x83C7088E1AAB65DB, 216, 84 },
- { 0xC45D1DF942711D9A, 242, 92 },
- { 0x924D692CA61BE758, 269, 100 },
- { 0xDA01EE641A708DEA, 295, 108 },
- { 0xA26DA3999AEF774A, 322, 116 },
- { 0xF209787BB47D6B85, 348, 124 },
- { 0xB454E4A179DD1877, 375, 132 },
- { 0x865B86925B9BC5C2, 402, 140 },
- { 0xC83553C5C8965D3D, 428, 148 },
- { 0x952AB45CFA97A0B3, 455, 156 },
- { 0xDE469FBD99A05FE3, 481, 164 },
- { 0xA59BC234DB398C25, 508, 172 },
- { 0xF6C69A72A3989F5C, 534, 180 },
- { 0xB7DCBF5354E9BECE, 561, 188 },
- { 0x88FCF317F22241E2, 588, 196 },
- { 0xCC20CE9BD35C78A5, 614, 204 },
- { 0x98165AF37B2153DF, 641, 212 },
- { 0xE2A0B5DC971F303A, 667, 220 },
- { 0xA8D9D1535CE3B396, 694, 228 },
- { 0xFB9B7CD9A4A7443C, 720, 236 },
- { 0xBB764C4CA7A44410, 747, 244 },
- { 0x8BAB8EEFB6409C1A, 774, 252 },
- { 0xD01FEF10A657842C, 800, 260 },
- { 0x9B10A4E5E9913129, 827, 268 },
- { 0xE7109BFBA19C0C9D, 853, 276 },
- { 0xAC2820D9623BF429, 880, 284 },
- { 0x80444B5E7AA7CF85, 907, 292 },
- { 0xBF21E44003ACDD2D, 933, 300 },
- { 0x8E679C2F5E44FF8F, 960, 308 },
- { 0xD433179D9C8CB841, 986, 316 },
- { 0x9E19DB92B4E31BA9, 1013, 324 },
- }
- };
-
-
-
-
- JSON_ASSERT(e >= -1500);
- JSON_ASSERT(e <= 1500);
- const int f = kAlpha - e - 1;
- const int k = (f * 78913) / (1 << 18) + static_cast<int>(f > 0);
- const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep;
- JSON_ASSERT(index >= 0);
- JSON_ASSERT(static_cast<std::size_t>(index) < kCachedPowers.size());
- const cached_power cached = kCachedPowers[static_cast<std::size_t>(index)];
- JSON_ASSERT(kAlpha <= cached.e + e + 64);
- JSON_ASSERT(kGamma >= cached.e + e + 64);
- return cached;
- }
- inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10)
- {
-
- if (n >= 1000000000)
- {
- pow10 = 1000000000;
- return 10;
- }
-
- else if (n >= 100000000)
- {
- pow10 = 100000000;
- return 9;
- }
- else if (n >= 10000000)
- {
- pow10 = 10000000;
- return 8;
- }
- else if (n >= 1000000)
- {
- pow10 = 1000000;
- return 7;
- }
- else if (n >= 100000)
- {
- pow10 = 100000;
- return 6;
- }
- else if (n >= 10000)
- {
- pow10 = 10000;
- return 5;
- }
- else if (n >= 1000)
- {
- pow10 = 1000;
- return 4;
- }
- else if (n >= 100)
- {
- pow10 = 100;
- return 3;
- }
- else if (n >= 10)
- {
- pow10 = 10;
- return 2;
- }
- else
- {
- pow10 = 1;
- return 1;
- }
- }
- inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta,
- std::uint64_t rest, std::uint64_t ten_k)
- {
- JSON_ASSERT(len >= 1);
- JSON_ASSERT(dist <= delta);
- JSON_ASSERT(rest <= delta);
- JSON_ASSERT(ten_k > 0);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- while (rest < dist
- && delta - rest >= ten_k
- && (rest + ten_k < dist || dist - rest > rest + ten_k - dist))
- {
- JSON_ASSERT(buf[len - 1] != '0');
- buf[len - 1]--;
- rest += ten_k;
- }
- }
- inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent,
- diyfp M_minus, diyfp w, diyfp M_plus)
- {
- static_assert(kAlpha >= -60, "internal error");
- static_assert(kGamma <= -32, "internal error");
-
-
-
-
-
-
-
-
-
-
-
- JSON_ASSERT(M_plus.e >= kAlpha);
- JSON_ASSERT(M_plus.e <= kGamma);
- std::uint64_t delta = diyfp::sub(M_plus, M_minus).f;
- std::uint64_t dist = diyfp::sub(M_plus, w ).f;
-
-
-
-
-
-
- const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e);
- auto p1 = static_cast<std::uint32_t>(M_plus.f >> -one.e);
- std::uint64_t p2 = M_plus.f & (one.f - 1);
-
-
-
- JSON_ASSERT(p1 > 0);
- std::uint32_t pow10;
- const int k = find_largest_pow10(p1, pow10);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int n = k;
- while (n > 0)
- {
-
-
-
-
- const std::uint32_t d = p1 / pow10;
- const std::uint32_t r = p1 % pow10;
-
-
-
-
- JSON_ASSERT(d <= 9);
- buffer[length++] = static_cast<char>('0' + d);
-
-
-
- p1 = r;
- n--;
-
-
-
-
-
-
-
-
-
-
-
-
- const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2;
- if (rest <= delta)
- {
-
- decimal_exponent += n;
-
-
-
-
-
-
-
-
-
- const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e;
- grisu2_round(buffer, length, dist, delta, rest, ten_n);
- return;
- }
- pow10 /= 10;
-
-
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- JSON_ASSERT(p2 > delta);
- int m = 0;
- for (;;)
- {
-
-
-
-
-
-
- JSON_ASSERT(p2 <= (std::numeric_limits<std::uint64_t>::max)() / 10);
- p2 *= 10;
- const std::uint64_t d = p2 >> -one.e;
- const std::uint64_t r = p2 & (one.f - 1);
-
-
-
-
-
- JSON_ASSERT(d <= 9);
- buffer[length++] = static_cast<char>('0' + d);
-
-
-
- p2 = r;
- m++;
-
-
-
-
-
-
-
-
- delta *= 10;
- dist *= 10;
- if (p2 <= delta)
- {
- break;
- }
- }
-
- decimal_exponent -= m;
-
-
-
-
-
-
- const std::uint64_t ten_m = one.f;
- grisu2_round(buffer, length, dist, delta, p2, ten_m);
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
- JSON_HEDLEY_NON_NULL(1)
- inline void grisu2(char* buf, int& len, int& decimal_exponent,
- diyfp m_minus, diyfp v, diyfp m_plus)
- {
- JSON_ASSERT(m_plus.e == m_minus.e);
- JSON_ASSERT(m_plus.e == v.e);
-
-
-
-
-
-
-
-
- const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e);
- const diyfp c_minus_k(cached.f, cached.e);
-
- const diyfp w = diyfp::mul(v, c_minus_k);
- const diyfp w_minus = diyfp::mul(m_minus, c_minus_k);
- const diyfp w_plus = diyfp::mul(m_plus, c_minus_k);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- const diyfp M_minus(w_minus.f + 1, w_minus.e);
- const diyfp M_plus (w_plus.f - 1, w_plus.e );
- decimal_exponent = -cached.k;
- grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus);
- }
- template<typename FloatType>
- JSON_HEDLEY_NON_NULL(1)
- void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value)
- {
- static_assert(diyfp::kPrecision >= std::numeric_limits<FloatType>::digits + 3,
- "internal error: not enough precision");
- JSON_ASSERT(std::isfinite(value));
- JSON_ASSERT(value > 0);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #if 0
- const boundaries w = compute_boundaries(static_cast<double>(value));
- #else
- const boundaries w = compute_boundaries(value);
- #endif
- grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus);
- }
- JSON_HEDLEY_NON_NULL(1)
- JSON_HEDLEY_RETURNS_NON_NULL
- inline char* append_exponent(char* buf, int e)
- {
- JSON_ASSERT(e > -1000);
- JSON_ASSERT(e < 1000);
- if (e < 0)
- {
- e = -e;
- *buf++ = '-';
- }
- else
- {
- *buf++ = '+';
- }
- auto k = static_cast<std::uint32_t>(e);
- if (k < 10)
- {
-
-
- *buf++ = '0';
- *buf++ = static_cast<char>('0' + k);
- }
- else if (k < 100)
- {
- *buf++ = static_cast<char>('0' + k / 10);
- k %= 10;
- *buf++ = static_cast<char>('0' + k);
- }
- else
- {
- *buf++ = static_cast<char>('0' + k / 100);
- k %= 100;
- *buf++ = static_cast<char>('0' + k / 10);
- k %= 10;
- *buf++ = static_cast<char>('0' + k);
- }
- return buf;
- }
- JSON_HEDLEY_NON_NULL(1)
- JSON_HEDLEY_RETURNS_NON_NULL
- inline char* format_buffer(char* buf, int len, int decimal_exponent,
- int min_exp, int max_exp)
- {
- JSON_ASSERT(min_exp < 0);
- JSON_ASSERT(max_exp > 0);
- const int k = len;
- const int n = len + decimal_exponent;
-
-
-
- if (k <= n && n <= max_exp)
- {
-
-
- std::memset(buf + k, '0', static_cast<size_t>(n) - static_cast<size_t>(k));
-
- buf[n + 0] = '.';
- buf[n + 1] = '0';
- return buf + (static_cast<size_t>(n) + 2);
- }
- if (0 < n && n <= max_exp)
- {
-
-
- JSON_ASSERT(k > n);
- std::memmove(buf + (static_cast<size_t>(n) + 1), buf + n, static_cast<size_t>(k) - static_cast<size_t>(n));
- buf[n] = '.';
- return buf + (static_cast<size_t>(k) + 1U);
- }
- if (min_exp < n && n <= 0)
- {
-
-
- std::memmove(buf + (2 + static_cast<size_t>(-n)), buf, static_cast<size_t>(k));
- buf[0] = '0';
- buf[1] = '.';
- std::memset(buf + 2, '0', static_cast<size_t>(-n));
- return buf + (2U + static_cast<size_t>(-n) + static_cast<size_t>(k));
- }
- if (k == 1)
- {
-
-
- buf += 1;
- }
- else
- {
-
-
- std::memmove(buf + 2, buf + 1, static_cast<size_t>(k) - 1);
- buf[1] = '.';
- buf += 1 + static_cast<size_t>(k);
- }
- *buf++ = 'e';
- return append_exponent(buf, n - 1);
- }
- }
- template<typename FloatType>
- JSON_HEDLEY_NON_NULL(1, 2)
- JSON_HEDLEY_RETURNS_NON_NULL
- char* to_chars(char* first, const char* last, FloatType value)
- {
- static_cast<void>(last);
- JSON_ASSERT(std::isfinite(value));
-
- if (std::signbit(value))
- {
- value = -value;
- *first++ = '-';
- }
- if (value == 0)
- {
- *first++ = '0';
-
- *first++ = '.';
- *first++ = '0';
- return first;
- }
- JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10);
-
-
-
-
- int len = 0;
- int decimal_exponent = 0;
- dtoa_impl::grisu2(first, len, decimal_exponent, value);
- JSON_ASSERT(len <= std::numeric_limits<FloatType>::max_digits10);
-
- constexpr int kMinExp = -4;
-
- constexpr int kMaxExp = std::numeric_limits<FloatType>::digits10;
- JSON_ASSERT(last - first >= kMaxExp + 2);
- JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits<FloatType>::max_digits10);
- JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10 + 6);
- return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp);
- }
- }
- }
- namespace nlohmann
- {
- namespace detail
- {
- enum class error_handler_t
- {
- strict,
- replace,
- ignore
- };
- template<typename BasicJsonType>
- class serializer
- {
- using string_t = typename BasicJsonType::string_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using binary_char_t = typename BasicJsonType::binary_t::value_type;
- static constexpr std::uint8_t UTF8_ACCEPT = 0;
- static constexpr std::uint8_t UTF8_REJECT = 1;
- public:
-
- serializer(output_adapter_t<char> s, const char ichar,
- error_handler_t error_handler_ = error_handler_t::strict)
- : o(std::move(s))
- , loc(std::localeconv())
- , thousands_sep(loc->thousands_sep == nullptr ? '\0' : std::char_traits<char>::to_char_type(* (loc->thousands_sep)))
- , decimal_point(loc->decimal_point == nullptr ? '\0' : std::char_traits<char>::to_char_type(* (loc->decimal_point)))
- , indent_char(ichar)
- , indent_string(512, indent_char)
- , error_handler(error_handler_)
- {}
-
- serializer(const serializer&) = delete;
- serializer& operator=(const serializer&) = delete;
- serializer(serializer&&) = delete;
- serializer& operator=(serializer&&) = delete;
- ~serializer() = default;
-
- void dump(const BasicJsonType& val,
- const bool pretty_print,
- const bool ensure_ascii,
- const unsigned int indent_step,
- const unsigned int current_indent = 0)
- {
- switch (val.m_type)
- {
- case value_t::object:
- {
- if (val.m_value.object->empty())
- {
- o->write_characters("{}", 2);
- return;
- }
- if (pretty_print)
- {
- o->write_characters("{\n", 2);
-
- const auto new_indent = current_indent + indent_step;
- if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
- {
- indent_string.resize(indent_string.size() * 2, ' ');
- }
-
- auto i = val.m_value.object->cbegin();
- for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)
- {
- o->write_characters(indent_string.c_str(), new_indent);
- o->write_character('\"');
- dump_escaped(i->first, ensure_ascii);
- o->write_characters("\": ", 3);
- dump(i->second, true, ensure_ascii, indent_step, new_indent);
- o->write_characters(",\n", 2);
- }
-
- JSON_ASSERT(i != val.m_value.object->cend());
- JSON_ASSERT(std::next(i) == val.m_value.object->cend());
- o->write_characters(indent_string.c_str(), new_indent);
- o->write_character('\"');
- dump_escaped(i->first, ensure_ascii);
- o->write_characters("\": ", 3);
- dump(i->second, true, ensure_ascii, indent_step, new_indent);
- o->write_character('\n');
- o->write_characters(indent_string.c_str(), current_indent);
- o->write_character('}');
- }
- else
- {
- o->write_character('{');
-
- auto i = val.m_value.object->cbegin();
- for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)
- {
- o->write_character('\"');
- dump_escaped(i->first, ensure_ascii);
- o->write_characters("\":", 2);
- dump(i->second, false, ensure_ascii, indent_step, current_indent);
- o->write_character(',');
- }
-
- JSON_ASSERT(i != val.m_value.object->cend());
- JSON_ASSERT(std::next(i) == val.m_value.object->cend());
- o->write_character('\"');
- dump_escaped(i->first, ensure_ascii);
- o->write_characters("\":", 2);
- dump(i->second, false, ensure_ascii, indent_step, current_indent);
- o->write_character('}');
- }
- return;
- }
- case value_t::array:
- {
- if (val.m_value.array->empty())
- {
- o->write_characters("[]", 2);
- return;
- }
- if (pretty_print)
- {
- o->write_characters("[\n", 2);
-
- const auto new_indent = current_indent + indent_step;
- if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
- {
- indent_string.resize(indent_string.size() * 2, ' ');
- }
-
- for (auto i = val.m_value.array->cbegin();
- i != val.m_value.array->cend() - 1; ++i)
- {
- o->write_characters(indent_string.c_str(), new_indent);
- dump(*i, true, ensure_ascii, indent_step, new_indent);
- o->write_characters(",\n", 2);
- }
-
- JSON_ASSERT(!val.m_value.array->empty());
- o->write_characters(indent_string.c_str(), new_indent);
- dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent);
- o->write_character('\n');
- o->write_characters(indent_string.c_str(), current_indent);
- o->write_character(']');
- }
- else
- {
- o->write_character('[');
-
- for (auto i = val.m_value.array->cbegin();
- i != val.m_value.array->cend() - 1; ++i)
- {
- dump(*i, false, ensure_ascii, indent_step, current_indent);
- o->write_character(',');
- }
-
- JSON_ASSERT(!val.m_value.array->empty());
- dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent);
- o->write_character(']');
- }
- return;
- }
- case value_t::string:
- {
- o->write_character('\"');
- dump_escaped(*val.m_value.string, ensure_ascii);
- o->write_character('\"');
- return;
- }
- case value_t::binary:
- {
- if (pretty_print)
- {
- o->write_characters("{\n", 2);
-
- const auto new_indent = current_indent + indent_step;
- if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
- {
- indent_string.resize(indent_string.size() * 2, ' ');
- }
- o->write_characters(indent_string.c_str(), new_indent);
- o->write_characters("\"bytes\": [", 10);
- if (!val.m_value.binary->empty())
- {
- for (auto i = val.m_value.binary->cbegin();
- i != val.m_value.binary->cend() - 1; ++i)
- {
- dump_integer(*i);
- o->write_characters(", ", 2);
- }
- dump_integer(val.m_value.binary->back());
- }
- o->write_characters("],\n", 3);
- o->write_characters(indent_string.c_str(), new_indent);
- o->write_characters("\"subtype\": ", 11);
- if (val.m_value.binary->has_subtype())
- {
- dump_integer(val.m_value.binary->subtype());
- }
- else
- {
- o->write_characters("null", 4);
- }
- o->write_character('\n');
- o->write_characters(indent_string.c_str(), current_indent);
- o->write_character('}');
- }
- else
- {
- o->write_characters("{\"bytes\":[", 10);
- if (!val.m_value.binary->empty())
- {
- for (auto i = val.m_value.binary->cbegin();
- i != val.m_value.binary->cend() - 1; ++i)
- {
- dump_integer(*i);
- o->write_character(',');
- }
- dump_integer(val.m_value.binary->back());
- }
- o->write_characters("],\"subtype\":", 12);
- if (val.m_value.binary->has_subtype())
- {
- dump_integer(val.m_value.binary->subtype());
- o->write_character('}');
- }
- else
- {
- o->write_characters("null}", 5);
- }
- }
- return;
- }
- case value_t::boolean:
- {
- if (val.m_value.boolean)
- {
- o->write_characters("true", 4);
- }
- else
- {
- o->write_characters("false", 5);
- }
- return;
- }
- case value_t::number_integer:
- {
- dump_integer(val.m_value.number_integer);
- return;
- }
- case value_t::number_unsigned:
- {
- dump_integer(val.m_value.number_unsigned);
- return;
- }
- case value_t::number_float:
- {
- dump_float(val.m_value.number_float);
- return;
- }
- case value_t::discarded:
- {
- o->write_characters("<discarded>", 11);
- return;
- }
- case value_t::null:
- {
- o->write_characters("null", 4);
- return;
- }
- default:
- JSON_ASSERT(false);
- }
- }
- private:
-
- void dump_escaped(const string_t& s, const bool ensure_ascii)
- {
- std::uint32_t codepoint;
- std::uint8_t state = UTF8_ACCEPT;
- std::size_t bytes = 0;
-
- std::size_t bytes_after_last_accept = 0;
- std::size_t undumped_chars = 0;
- for (std::size_t i = 0; i < s.size(); ++i)
- {
- const auto byte = static_cast<uint8_t>(s[i]);
- switch (decode(state, codepoint, byte))
- {
- case UTF8_ACCEPT:
- {
- switch (codepoint)
- {
- case 0x08:
- {
- string_buffer[bytes++] = '\\';
- string_buffer[bytes++] = 'b';
- break;
- }
- case 0x09:
- {
- string_buffer[bytes++] = '\\';
- string_buffer[bytes++] = 't';
- break;
- }
- case 0x0A:
- {
- string_buffer[bytes++] = '\\';
- string_buffer[bytes++] = 'n';
- break;
- }
- case 0x0C:
- {
- string_buffer[bytes++] = '\\';
- string_buffer[bytes++] = 'f';
- break;
- }
- case 0x0D:
- {
- string_buffer[bytes++] = '\\';
- string_buffer[bytes++] = 'r';
- break;
- }
- case 0x22:
- {
- string_buffer[bytes++] = '\\';
- string_buffer[bytes++] = '\"';
- break;
- }
- case 0x5C:
- {
- string_buffer[bytes++] = '\\';
- string_buffer[bytes++] = '\\';
- break;
- }
- default:
- {
-
-
- if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F)))
- {
- if (codepoint <= 0xFFFF)
- {
- (std::snprintf)(string_buffer.data() + bytes, 7, "\\u%04x",
- static_cast<std::uint16_t>(codepoint));
- bytes += 6;
- }
- else
- {
- (std::snprintf)(string_buffer.data() + bytes, 13, "\\u%04x\\u%04x",
- static_cast<std::uint16_t>(0xD7C0u + (codepoint >> 10u)),
- static_cast<std::uint16_t>(0xDC00u + (codepoint & 0x3FFu)));
- bytes += 12;
- }
- }
- else
- {
-
-
- string_buffer[bytes++] = s[i];
- }
- break;
- }
- }
-
-
-
- if (string_buffer.size() - bytes < 13)
- {
- o->write_characters(string_buffer.data(), bytes);
- bytes = 0;
- }
-
- bytes_after_last_accept = bytes;
- undumped_chars = 0;
- break;
- }
- case UTF8_REJECT:
- {
- switch (error_handler)
- {
- case error_handler_t::strict:
- {
- std::string sn(3, '\0');
- (std::snprintf)(&sn[0], sn.size(), "%.2X", byte);
- JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + sn));
- }
- case error_handler_t::ignore:
- case error_handler_t::replace:
- {
-
-
-
-
- if (undumped_chars > 0)
- {
- --i;
- }
-
-
- bytes = bytes_after_last_accept;
- if (error_handler == error_handler_t::replace)
- {
-
- if (ensure_ascii)
- {
- string_buffer[bytes++] = '\\';
- string_buffer[bytes++] = 'u';
- string_buffer[bytes++] = 'f';
- string_buffer[bytes++] = 'f';
- string_buffer[bytes++] = 'f';
- string_buffer[bytes++] = 'd';
- }
- else
- {
- string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\xEF');
- string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\xBF');
- string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\xBD');
- }
-
-
-
- if (string_buffer.size() - bytes < 13)
- {
- o->write_characters(string_buffer.data(), bytes);
- bytes = 0;
- }
- bytes_after_last_accept = bytes;
- }
- undumped_chars = 0;
-
- state = UTF8_ACCEPT;
- break;
- }
- default:
- JSON_ASSERT(false);
- }
- break;
- }
- default:
- {
- if (!ensure_ascii)
- {
-
- string_buffer[bytes++] = s[i];
- }
- ++undumped_chars;
- break;
- }
- }
- }
-
- if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT))
- {
-
- if (bytes > 0)
- {
- o->write_characters(string_buffer.data(), bytes);
- }
- }
- else
- {
-
- switch (error_handler)
- {
- case error_handler_t::strict:
- {
- std::string sn(3, '\0');
- (std::snprintf)(&sn[0], sn.size(), "%.2X", static_cast<std::uint8_t>(s.back()));
- JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + sn));
- }
- case error_handler_t::ignore:
- {
-
- o->write_characters(string_buffer.data(), bytes_after_last_accept);
- break;
- }
- case error_handler_t::replace:
- {
-
- o->write_characters(string_buffer.data(), bytes_after_last_accept);
-
- if (ensure_ascii)
- {
- o->write_characters("\\ufffd", 6);
- }
- else
- {
- o->write_characters("\xEF\xBF\xBD", 3);
- }
- break;
- }
- default:
- JSON_ASSERT(false);
- }
- }
- }
-
- inline unsigned int count_digits(number_unsigned_t x) noexcept
- {
- unsigned int n_digits = 1;
- for (;;)
- {
- if (x < 10)
- {
- return n_digits;
- }
- if (x < 100)
- {
- return n_digits + 1;
- }
- if (x < 1000)
- {
- return n_digits + 2;
- }
- if (x < 10000)
- {
- return n_digits + 3;
- }
- x = x / 10000u;
- n_digits += 4;
- }
- }
-
- template < typename NumberType, detail::enable_if_t <
- std::is_same<NumberType, number_unsigned_t>::value ||
- std::is_same<NumberType, number_integer_t>::value ||
- std::is_same<NumberType, binary_char_t>::value,
- int > = 0 >
- void dump_integer(NumberType x)
- {
- static constexpr std::array<std::array<char, 2>, 100> digits_to_99
- {
- {
- {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}},
- {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}},
- {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}},
- {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}},
- {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}},
- {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}},
- {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}},
- {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}},
- {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}},
- {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}},
- }
- };
-
- if (x == 0)
- {
- o->write_character('0');
- return;
- }
-
- auto buffer_ptr = number_buffer.begin();
- const bool is_negative = std::is_same<NumberType, number_integer_t>::value && !(x >= 0);
- number_unsigned_t abs_value;
- unsigned int n_chars;
- if (is_negative)
- {
- *buffer_ptr = '-';
- abs_value = remove_sign(static_cast<number_integer_t>(x));
-
- n_chars = 1 + count_digits(abs_value);
- }
- else
- {
- abs_value = static_cast<number_unsigned_t>(x);
- n_chars = count_digits(abs_value);
- }
-
- JSON_ASSERT(n_chars < number_buffer.size() - 1);
-
-
- buffer_ptr += n_chars;
-
-
- while (abs_value >= 100)
- {
- const auto digits_index = static_cast<unsigned>((abs_value % 100));
- abs_value /= 100;
- *(--buffer_ptr) = digits_to_99[digits_index][1];
- *(--buffer_ptr) = digits_to_99[digits_index][0];
- }
- if (abs_value >= 10)
- {
- const auto digits_index = static_cast<unsigned>(abs_value);
- *(--buffer_ptr) = digits_to_99[digits_index][1];
- *(--buffer_ptr) = digits_to_99[digits_index][0];
- }
- else
- {
- *(--buffer_ptr) = static_cast<char>('0' + abs_value);
- }
- o->write_characters(number_buffer.data(), n_chars);
- }
-
- void dump_float(number_float_t x)
- {
-
- if (!std::isfinite(x))
- {
- o->write_characters("null", 4);
- return;
- }
-
-
-
-
-
- static constexpr bool is_ieee_single_or_double
- = (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 24 && std::numeric_limits<number_float_t>::max_exponent == 128) ||
- (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 53 && std::numeric_limits<number_float_t>::max_exponent == 1024);
- dump_float(x, std::integral_constant<bool, is_ieee_single_or_double>());
- }
- void dump_float(number_float_t x, std::true_type )
- {
- char* begin = number_buffer.data();
- char* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x);
- o->write_characters(begin, static_cast<size_t>(end - begin));
- }
- void dump_float(number_float_t x, std::false_type )
- {
-
- static constexpr auto d = std::numeric_limits<number_float_t>::max_digits10;
-
- std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), "%.*g", d, x);
-
- JSON_ASSERT(len > 0);
-
- JSON_ASSERT(static_cast<std::size_t>(len) < number_buffer.size());
-
- if (thousands_sep != '\0')
- {
- const auto end = std::remove(number_buffer.begin(),
- number_buffer.begin() + len, thousands_sep);
- std::fill(end, number_buffer.end(), '\0');
- JSON_ASSERT((end - number_buffer.begin()) <= len);
- len = (end - number_buffer.begin());
- }
-
- if (decimal_point != '\0' && decimal_point != '.')
- {
- const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point);
- if (dec_pos != number_buffer.end())
- {
- *dec_pos = '.';
- }
- }
- o->write_characters(number_buffer.data(), static_cast<std::size_t>(len));
-
- const bool value_is_int_like =
- std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1,
- [](char c)
- {
- return c == '.' || c == 'e';
- });
- if (value_is_int_like)
- {
- o->write_characters(".0", 2);
- }
- }
-
- static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept
- {
- static const std::array<std::uint8_t, 400> utf8d =
- {
- {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3,
- 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8,
- 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
- 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1,
- 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- }
- };
- const std::uint8_t type = utf8d[byte];
- codep = (state != UTF8_ACCEPT)
- ? (byte & 0x3fu) | (codep << 6u)
- : (0xFFu >> type) & (byte);
- std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);
- JSON_ASSERT(index < 400);
- state = utf8d[index];
- return state;
- }
-
- number_unsigned_t remove_sign(number_unsigned_t x)
- {
- JSON_ASSERT(false);
- return x;
- }
-
- inline number_unsigned_t remove_sign(number_integer_t x) noexcept
- {
- JSON_ASSERT(x < 0 && x < (std::numeric_limits<number_integer_t>::max)());
- return static_cast<number_unsigned_t>(-(x + 1)) + 1;
- }
- private:
-
- output_adapter_t<char> o = nullptr;
-
- std::array<char, 64> number_buffer{{}};
-
- const std::lconv* loc = nullptr;
-
- const char thousands_sep = '\0';
-
- const char decimal_point = '\0';
-
- std::array<char, 512> string_buffer{{}};
-
- const char indent_char;
-
- string_t indent_string;
-
- const error_handler_t error_handler;
- };
- }
- }
- #include <functional> // less
- #include <memory> // allocator
- #include <utility> // pair
- #include <vector> // vector
- namespace nlohmann
- {
- template <class Key, class T, class IgnoredLess = std::less<Key>,
- class Allocator = std::allocator<std::pair<const Key, T>>>
- struct ordered_map : std::vector<std::pair<const Key, T>, Allocator>
- {
- using key_type = Key;
- using mapped_type = T;
- using Container = std::vector<std::pair<const Key, T>, Allocator>;
- using typename Container::iterator;
- using typename Container::const_iterator;
- using typename Container::size_type;
- using typename Container::value_type;
-
-
- ordered_map(const Allocator& alloc = Allocator()) : Container{alloc} {}
- template <class It>
- ordered_map(It first, It last, const Allocator& alloc = Allocator())
- : Container{first, last, alloc} {}
- ordered_map(std::initializer_list<T> init, const Allocator& alloc = Allocator() )
- : Container{init, alloc} {}
- std::pair<iterator, bool> emplace(const key_type& key, T&& t)
- {
- for (auto it = this->begin(); it != this->end(); ++it)
- {
- if (it->first == key)
- {
- return {it, false};
- }
- }
- Container::emplace_back(key, t);
- return {--this->end(), true};
- }
- T& operator[](const Key& key)
- {
- return emplace(key, T{}).first->second;
- }
- const T& operator[](const Key& key) const
- {
- return at(key);
- }
- T& at(const Key& key)
- {
- for (auto it = this->begin(); it != this->end(); ++it)
- {
- if (it->first == key)
- {
- return it->second;
- }
- }
- throw std::out_of_range("key not found");
- }
- const T& at(const Key& key) const
- {
- for (auto it = this->begin(); it != this->end(); ++it)
- {
- if (it->first == key)
- {
- return it->second;
- }
- }
- throw std::out_of_range("key not found");
- }
- size_type erase(const Key& key)
- {
- for (auto it = this->begin(); it != this->end(); ++it)
- {
- if (it->first == key)
- {
-
- for (auto next = it; ++next != this->end(); ++it)
- {
- it->~value_type();
- new (&*it) value_type{std::move(*next)};
- }
- Container::pop_back();
- return 1;
- }
- }
- return 0;
- }
- iterator erase(iterator pos)
- {
- auto it = pos;
-
- for (auto next = it; ++next != this->end(); ++it)
- {
- it->~value_type();
- new (&*it) value_type{std::move(*next)};
- }
- Container::pop_back();
- return pos;
- }
- size_type count(const Key& key) const
- {
- for (auto it = this->begin(); it != this->end(); ++it)
- {
- if (it->first == key)
- {
- return 1;
- }
- }
- return 0;
- }
- iterator find(const Key& key)
- {
- for (auto it = this->begin(); it != this->end(); ++it)
- {
- if (it->first == key)
- {
- return it;
- }
- }
- return Container::end();
- }
- const_iterator find(const Key& key) const
- {
- for (auto it = this->begin(); it != this->end(); ++it)
- {
- if (it->first == key)
- {
- return it;
- }
- }
- return Container::end();
- }
- std::pair<iterator, bool> insert( value_type&& value )
- {
- return emplace(value.first, std::move(value.second));
- }
- std::pair<iterator, bool> insert( const value_type& value )
- {
- for (auto it = this->begin(); it != this->end(); ++it)
- {
- if (it->first == value.first)
- {
- return {it, false};
- }
- }
- Container::push_back(value);
- return {--this->end(), true};
- }
- };
- }
- namespace nlohmann
- {
- NLOHMANN_BASIC_JSON_TPL_DECLARATION
- class basic_json
- {
- private:
- template<detail::value_t> friend struct detail::external_constructor;
- friend ::nlohmann::json_pointer<basic_json>;
- template<typename BasicJsonType, typename InputType>
- friend class ::nlohmann::detail::parser;
- friend ::nlohmann::detail::serializer<basic_json>;
- template<typename BasicJsonType>
- friend class ::nlohmann::detail::iter_impl;
- template<typename BasicJsonType, typename CharType>
- friend class ::nlohmann::detail::binary_writer;
- template<typename BasicJsonType, typename InputType, typename SAX>
- friend class ::nlohmann::detail::binary_reader;
- template<typename BasicJsonType>
- friend class ::nlohmann::detail::json_sax_dom_parser;
- template<typename BasicJsonType>
- friend class ::nlohmann::detail::json_sax_dom_callback_parser;
-
- using basic_json_t = NLOHMANN_BASIC_JSON_TPL;
-
- using lexer = ::nlohmann::detail::lexer_base<basic_json>;
- template<typename InputAdapterType>
- static ::nlohmann::detail::parser<basic_json, InputAdapterType> parser(
- InputAdapterType adapter,
- detail::parser_callback_t<basic_json>cb = nullptr,
- const bool allow_exceptions = true,
- const bool ignore_comments = false
- )
- {
- return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter),
- std::move(cb), allow_exceptions, ignore_comments);
- }
- using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t;
- template<typename BasicJsonType>
- using internal_iterator = ::nlohmann::detail::internal_iterator<BasicJsonType>;
- template<typename BasicJsonType>
- using iter_impl = ::nlohmann::detail::iter_impl<BasicJsonType>;
- template<typename Iterator>
- using iteration_proxy = ::nlohmann::detail::iteration_proxy<Iterator>;
- template<typename Base> using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator<Base>;
- template<typename CharType>
- using output_adapter_t = ::nlohmann::detail::output_adapter_t<CharType>;
- template<typename InputType>
- using binary_reader = ::nlohmann::detail::binary_reader<basic_json, InputType>;
- template<typename CharType> using binary_writer = ::nlohmann::detail::binary_writer<basic_json, CharType>;
- using serializer = ::nlohmann::detail::serializer<basic_json>;
- public:
- using value_t = detail::value_t;
-
- using json_pointer = ::nlohmann::json_pointer<basic_json>;
- template<typename T, typename SFINAE>
- using json_serializer = JSONSerializer<T, SFINAE>;
-
- using error_handler_t = detail::error_handler_t;
-
- using cbor_tag_handler_t = detail::cbor_tag_handler_t;
-
- using initializer_list_t = std::initializer_list<detail::json_ref<basic_json>>;
- using input_format_t = detail::input_format_t;
-
- using json_sax_t = json_sax<basic_json>;
-
-
-
-
-
-
-
- using exception = detail::exception;
-
- using parse_error = detail::parse_error;
-
- using invalid_iterator = detail::invalid_iterator;
-
- using type_error = detail::type_error;
-
- using out_of_range = detail::out_of_range;
-
- using other_error = detail::other_error;
-
-
-
-
-
-
-
-
-
- using value_type = basic_json;
-
- using reference = value_type&;
-
- using const_reference = const value_type&;
-
- using difference_type = std::ptrdiff_t;
-
- using size_type = std::size_t;
-
- using allocator_type = AllocatorType<basic_json>;
-
- using pointer = typename std::allocator_traits<allocator_type>::pointer;
-
- using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer;
-
- using iterator = iter_impl<basic_json>;
-
- using const_iterator = iter_impl<const basic_json>;
-
- using reverse_iterator = json_reverse_iterator<typename basic_json::iterator>;
-
- using const_reverse_iterator = json_reverse_iterator<typename basic_json::const_iterator>;
-
-
- static allocator_type get_allocator()
- {
- return allocator_type();
- }
-
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json meta()
- {
- basic_json result;
- result["copyright"] = "(C) 2013-2020 Niels Lohmann";
- result["name"] = "JSON for Modern C++";
- result["url"] = "https://github.com/nlohmann/json";
- result["version"]["string"] =
- std::to_string(NLOHMANN_JSON_VERSION_MAJOR) + "." +
- std::to_string(NLOHMANN_JSON_VERSION_MINOR) + "." +
- std::to_string(NLOHMANN_JSON_VERSION_PATCH);
- result["version"]["major"] = NLOHMANN_JSON_VERSION_MAJOR;
- result["version"]["minor"] = NLOHMANN_JSON_VERSION_MINOR;
- result["version"]["patch"] = NLOHMANN_JSON_VERSION_PATCH;
- #ifdef _WIN32
- result["platform"] = "win32";
- #elif defined __linux__
- result["platform"] = "linux";
- #elif defined __APPLE__
- result["platform"] = "apple";
- #elif defined __unix__
- result["platform"] = "unix";
- #else
- result["platform"] = "unknown";
- #endif
- #if defined(__ICC) || defined(__INTEL_COMPILER)
- result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}};
- #elif defined(__clang__)
- result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}};
- #elif defined(__GNUC__) || defined(__GNUG__)
- result["compiler"] = {{"family", "gcc"}, {"version", std::to_string(__GNUC__) + "." + std::to_string(__GNUC_MINOR__) + "." + std::to_string(__GNUC_PATCHLEVEL__)}};
- #elif defined(__HP_cc) || defined(__HP_aCC)
- result["compiler"] = "hp"
- #elif defined(__IBMCPP__)
- result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}};
- #elif defined(_MSC_VER)
- result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}};
- #elif defined(__PGI)
- result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}};
- #elif defined(__SUNPRO_CC)
- result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}};
- #else
- result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}};
- #endif
- #ifdef __cplusplus
- result["compiler"]["c++"] = std::to_string(__cplusplus);
- #else
- result["compiler"]["c++"] = "unknown";
- #endif
- return result;
- }
-
-
-
-
-
-
-
- #if defined(JSON_HAS_CPP_14)
-
-
- using object_comparator_t = std::less<>;
- #else
- using object_comparator_t = std::less<StringType>;
- #endif
-
- using object_t = ObjectType<StringType,
- basic_json,
- object_comparator_t,
- AllocatorType<std::pair<const StringType,
- basic_json>>>;
-
- using array_t = ArrayType<basic_json, AllocatorType<basic_json>>;
-
- using string_t = StringType;
-
- using boolean_t = BooleanType;
-
- using number_integer_t = NumberIntegerType;
-
- using number_unsigned_t = NumberUnsignedType;
-
- using number_float_t = NumberFloatType;
-
- using binary_t = nlohmann::byte_container_with_subtype<BinaryType>;
-
- private:
-
- template<typename T, typename... Args>
- JSON_HEDLEY_RETURNS_NON_NULL
- static T* create(Args&& ... args)
- {
- AllocatorType<T> alloc;
- using AllocatorTraits = std::allocator_traits<AllocatorType<T>>;
- auto deleter = [&](T * object)
- {
- AllocatorTraits::deallocate(alloc, object, 1);
- };
- std::unique_ptr<T, decltype(deleter)> object(AllocatorTraits::allocate(alloc, 1), deleter);
- AllocatorTraits::construct(alloc, object.get(), std::forward<Args>(args)...);
- JSON_ASSERT(object != nullptr);
- return object.release();
- }
-
-
-
-
- union json_value
- {
-
- object_t* object;
-
- array_t* array;
-
- string_t* string;
-
- binary_t* binary;
-
- boolean_t boolean;
-
- number_integer_t number_integer;
-
- number_unsigned_t number_unsigned;
-
- number_float_t number_float;
-
- json_value() = default;
-
- json_value(boolean_t v) noexcept : boolean(v) {}
-
- json_value(number_integer_t v) noexcept : number_integer(v) {}
-
- json_value(number_unsigned_t v) noexcept : number_unsigned(v) {}
-
- json_value(number_float_t v) noexcept : number_float(v) {}
-
- json_value(value_t t)
- {
- switch (t)
- {
- case value_t::object:
- {
- object = create<object_t>();
- break;
- }
- case value_t::array:
- {
- array = create<array_t>();
- break;
- }
- case value_t::string:
- {
- string = create<string_t>("");
- break;
- }
- case value_t::binary:
- {
- binary = create<binary_t>();
- break;
- }
- case value_t::boolean:
- {
- boolean = boolean_t(false);
- break;
- }
- case value_t::number_integer:
- {
- number_integer = number_integer_t(0);
- break;
- }
- case value_t::number_unsigned:
- {
- number_unsigned = number_unsigned_t(0);
- break;
- }
- case value_t::number_float:
- {
- number_float = number_float_t(0.0);
- break;
- }
- case value_t::null:
- {
- object = nullptr;
- break;
- }
- default:
- {
- object = nullptr;
- if (JSON_HEDLEY_UNLIKELY(t == value_t::null))
- {
- JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.9.1"));
- }
- break;
- }
- }
- }
-
- json_value(const string_t& value)
- {
- string = create<string_t>(value);
- }
-
- json_value(string_t&& value)
- {
- string = create<string_t>(std::move(value));
- }
-
- json_value(const object_t& value)
- {
- object = create<object_t>(value);
- }
-
- json_value(object_t&& value)
- {
- object = create<object_t>(std::move(value));
- }
-
- json_value(const array_t& value)
- {
- array = create<array_t>(value);
- }
-
- json_value(array_t&& value)
- {
- array = create<array_t>(std::move(value));
- }
-
- json_value(const typename binary_t::container_type& value)
- {
- binary = create<binary_t>(value);
- }
-
- json_value(typename binary_t::container_type&& value)
- {
- binary = create<binary_t>(std::move(value));
- }
-
- json_value(const binary_t& value)
- {
- binary = create<binary_t>(value);
- }
-
- json_value(binary_t&& value)
- {
- binary = create<binary_t>(std::move(value));
- }
- void destroy(value_t t) noexcept
- {
-
- std::vector<basic_json> stack;
-
- if (t == value_t::array)
- {
- stack.reserve(array->size());
- std::move(array->begin(), array->end(), std::back_inserter(stack));
- }
- else if (t == value_t::object)
- {
- stack.reserve(object->size());
- for (auto&& it : *object)
- {
- stack.push_back(std::move(it.second));
- }
- }
- while (!stack.empty())
- {
-
- basic_json current_item(std::move(stack.back()));
- stack.pop_back();
-
-
- if (current_item.is_array())
- {
- std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(),
- std::back_inserter(stack));
- current_item.m_value.array->clear();
- }
- else if (current_item.is_object())
- {
- for (auto&& it : *current_item.m_value.object)
- {
- stack.push_back(std::move(it.second));
- }
- current_item.m_value.object->clear();
- }
-
-
- }
- switch (t)
- {
- case value_t::object:
- {
- AllocatorType<object_t> alloc;
- std::allocator_traits<decltype(alloc)>::destroy(alloc, object);
- std::allocator_traits<decltype(alloc)>::deallocate(alloc, object, 1);
- break;
- }
- case value_t::array:
- {
- AllocatorType<array_t> alloc;
- std::allocator_traits<decltype(alloc)>::destroy(alloc, array);
- std::allocator_traits<decltype(alloc)>::deallocate(alloc, array, 1);
- break;
- }
- case value_t::string:
- {
- AllocatorType<string_t> alloc;
- std::allocator_traits<decltype(alloc)>::destroy(alloc, string);
- std::allocator_traits<decltype(alloc)>::deallocate(alloc, string, 1);
- break;
- }
- case value_t::binary:
- {
- AllocatorType<binary_t> alloc;
- std::allocator_traits<decltype(alloc)>::destroy(alloc, binary);
- std::allocator_traits<decltype(alloc)>::deallocate(alloc, binary, 1);
- break;
- }
- default:
- {
- break;
- }
- }
- }
- };
-
- void assert_invariant() const noexcept
- {
- JSON_ASSERT(m_type != value_t::object || m_value.object != nullptr);
- JSON_ASSERT(m_type != value_t::array || m_value.array != nullptr);
- JSON_ASSERT(m_type != value_t::string || m_value.string != nullptr);
- JSON_ASSERT(m_type != value_t::binary || m_value.binary != nullptr);
- }
- public:
-
-
-
-
- using parse_event_t = detail::parse_event_t;
-
- using parser_callback_t = detail::parser_callback_t<basic_json>;
-
-
-
-
-
-
-
-
- basic_json(const value_t v)
- : m_type(v), m_value(v)
- {
- assert_invariant();
- }
-
- basic_json(std::nullptr_t = nullptr) noexcept
- : basic_json(value_t::null)
- {
- assert_invariant();
- }
-
- template < typename CompatibleType,
- typename U = detail::uncvref_t<CompatibleType>,
- detail::enable_if_t <
- !detail::is_basic_json<U>::value && detail::is_compatible_type<basic_json_t, U>::value, int > = 0 >
- basic_json(CompatibleType && val) noexcept(noexcept(
- JSONSerializer<U>::to_json(std::declval<basic_json_t&>(),
- std::forward<CompatibleType>(val))))
- {
- JSONSerializer<U>::to_json(*this, std::forward<CompatibleType>(val));
- assert_invariant();
- }
-
- template < typename BasicJsonType,
- detail::enable_if_t <
- detail::is_basic_json<BasicJsonType>::value&& !std::is_same<basic_json, BasicJsonType>::value, int > = 0 >
- basic_json(const BasicJsonType& val)
- {
- using other_boolean_t = typename BasicJsonType::boolean_t;
- using other_number_float_t = typename BasicJsonType::number_float_t;
- using other_number_integer_t = typename BasicJsonType::number_integer_t;
- using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using other_string_t = typename BasicJsonType::string_t;
- using other_object_t = typename BasicJsonType::object_t;
- using other_array_t = typename BasicJsonType::array_t;
- using other_binary_t = typename BasicJsonType::binary_t;
- switch (val.type())
- {
- case value_t::boolean:
- JSONSerializer<other_boolean_t>::to_json(*this, val.template get<other_boolean_t>());
- break;
- case value_t::number_float:
- JSONSerializer<other_number_float_t>::to_json(*this, val.template get<other_number_float_t>());
- break;
- case value_t::number_integer:
- JSONSerializer<other_number_integer_t>::to_json(*this, val.template get<other_number_integer_t>());
- break;
- case value_t::number_unsigned:
- JSONSerializer<other_number_unsigned_t>::to_json(*this, val.template get<other_number_unsigned_t>());
- break;
- case value_t::string:
- JSONSerializer<other_string_t>::to_json(*this, val.template get_ref<const other_string_t&>());
- break;
- case value_t::object:
- JSONSerializer<other_object_t>::to_json(*this, val.template get_ref<const other_object_t&>());
- break;
- case value_t::array:
- JSONSerializer<other_array_t>::to_json(*this, val.template get_ref<const other_array_t&>());
- break;
- case value_t::binary:
- JSONSerializer<other_binary_t>::to_json(*this, val.template get_ref<const other_binary_t&>());
- break;
- case value_t::null:
- *this = nullptr;
- break;
- case value_t::discarded:
- m_type = value_t::discarded;
- break;
- default:
- JSON_ASSERT(false);
- }
- assert_invariant();
- }
-
- basic_json(initializer_list_t init,
- bool type_deduction = true,
- value_t manual_type = value_t::array)
- {
-
-
- bool is_an_object = std::all_of(init.begin(), init.end(),
- [](const detail::json_ref<basic_json>& element_ref)
- {
- return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[0].is_string();
- });
-
- if (!type_deduction)
- {
-
- if (manual_type == value_t::array)
- {
- is_an_object = false;
- }
-
- if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object))
- {
- JSON_THROW(type_error::create(301, "cannot create object from initializer list"));
- }
- }
- if (is_an_object)
- {
-
- m_type = value_t::object;
- m_value = value_t::object;
- std::for_each(init.begin(), init.end(), [this](const detail::json_ref<basic_json>& element_ref)
- {
- auto element = element_ref.moved_or_copied();
- m_value.object->emplace(
- std::move(*((*element.m_value.array)[0].m_value.string)),
- std::move((*element.m_value.array)[1]));
- });
- }
- else
- {
-
- m_type = value_t::array;
- m_value.array = create<array_t>(init.begin(), init.end());
- }
- assert_invariant();
- }
-
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json binary(const typename binary_t::container_type& init)
- {
- auto res = basic_json();
- res.m_type = value_t::binary;
- res.m_value = init;
- return res;
- }
-
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json binary(const typename binary_t::container_type& init, std::uint8_t subtype)
- {
- auto res = basic_json();
- res.m_type = value_t::binary;
- res.m_value = binary_t(init, subtype);
- return res;
- }
-
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json binary(typename binary_t::container_type&& init)
- {
- auto res = basic_json();
- res.m_type = value_t::binary;
- res.m_value = std::move(init);
- return res;
- }
-
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json binary(typename binary_t::container_type&& init, std::uint8_t subtype)
- {
- auto res = basic_json();
- res.m_type = value_t::binary;
- res.m_value = binary_t(std::move(init), subtype);
- return res;
- }
-
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json array(initializer_list_t init = {})
- {
- return basic_json(init, false, value_t::array);
- }
-
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json object(initializer_list_t init = {})
- {
- return basic_json(init, false, value_t::object);
- }
-
- basic_json(size_type cnt, const basic_json& val)
- : m_type(value_t::array)
- {
- m_value.array = create<array_t>(cnt, val);
- assert_invariant();
- }
-
- template < class InputIT, typename std::enable_if <
- std::is_same<InputIT, typename basic_json_t::iterator>::value ||
- std::is_same<InputIT, typename basic_json_t::const_iterator>::value, int >::type = 0 >
- basic_json(InputIT first, InputIT last)
- {
- JSON_ASSERT(first.m_object != nullptr);
- JSON_ASSERT(last.m_object != nullptr);
-
- if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))
- {
- JSON_THROW(invalid_iterator::create(201, "iterators are not compatible"));
- }
-
- m_type = first.m_object->m_type;
-
- switch (m_type)
- {
- case value_t::boolean:
- case value_t::number_float:
- case value_t::number_integer:
- case value_t::number_unsigned:
- case value_t::string:
- {
- if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin()
- || !last.m_it.primitive_iterator.is_end()))
- {
- JSON_THROW(invalid_iterator::create(204, "iterators out of range"));
- }
- break;
- }
- default:
- break;
- }
- switch (m_type)
- {
- case value_t::number_integer:
- {
- m_value.number_integer = first.m_object->m_value.number_integer;
- break;
- }
- case value_t::number_unsigned:
- {
- m_value.number_unsigned = first.m_object->m_value.number_unsigned;
- break;
- }
- case value_t::number_float:
- {
- m_value.number_float = first.m_object->m_value.number_float;
- break;
- }
- case value_t::boolean:
- {
- m_value.boolean = first.m_object->m_value.boolean;
- break;
- }
- case value_t::string:
- {
- m_value = *first.m_object->m_value.string;
- break;
- }
- case value_t::object:
- {
- m_value.object = create<object_t>(first.m_it.object_iterator,
- last.m_it.object_iterator);
- break;
- }
- case value_t::array:
- {
- m_value.array = create<array_t>(first.m_it.array_iterator,
- last.m_it.array_iterator);
- break;
- }
- case value_t::binary:
- {
- m_value = *first.m_object->m_value.binary;
- break;
- }
- default:
- JSON_THROW(invalid_iterator::create(206, "cannot construct with iterators from " +
- std::string(first.m_object->type_name())));
- }
- assert_invariant();
- }
-
-
-
- template<typename JsonRef,
- detail::enable_if_t<detail::conjunction<detail::is_json_ref<JsonRef>,
- std::is_same<typename JsonRef::value_type, basic_json>>::value, int> = 0 >
- basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {}
-
- basic_json(const basic_json& other)
- : m_type(other.m_type)
- {
-
- other.assert_invariant();
- switch (m_type)
- {
- case value_t::object:
- {
- m_value = *other.m_value.object;
- break;
- }
- case value_t::array:
- {
- m_value = *other.m_value.array;
- break;
- }
- case value_t::string:
- {
- m_value = *other.m_value.string;
- break;
- }
- case value_t::boolean:
- {
- m_value = other.m_value.boolean;
- break;
- }
- case value_t::number_integer:
- {
- m_value = other.m_value.number_integer;
- break;
- }
- case value_t::number_unsigned:
- {
- m_value = other.m_value.number_unsigned;
- break;
- }
- case value_t::number_float:
- {
- m_value = other.m_value.number_float;
- break;
- }
- case value_t::binary:
- {
- m_value = *other.m_value.binary;
- break;
- }
- default:
- break;
- }
- assert_invariant();
- }
-
- basic_json(basic_json&& other) noexcept
- : m_type(std::move(other.m_type)),
- m_value(std::move(other.m_value))
- {
-
- other.assert_invariant();
-
- other.m_type = value_t::null;
- other.m_value = {};
- assert_invariant();
- }
-
- basic_json& operator=(basic_json other) noexcept (
- std::is_nothrow_move_constructible<value_t>::value&&
- std::is_nothrow_move_assignable<value_t>::value&&
- std::is_nothrow_move_constructible<json_value>::value&&
- std::is_nothrow_move_assignable<json_value>::value
- )
- {
-
- other.assert_invariant();
- using std::swap;
- swap(m_type, other.m_type);
- swap(m_value, other.m_value);
- assert_invariant();
- return *this;
- }
-
- ~basic_json() noexcept
- {
- assert_invariant();
- m_value.destroy(m_type);
- }
-
- public:
-
-
-
-
-
-
-
- string_t dump(const int indent = -1,
- const char indent_char = ' ',
- const bool ensure_ascii = false,
- const error_handler_t error_handler = error_handler_t::strict) const
- {
- string_t result;
- serializer s(detail::output_adapter<char, string_t>(result), indent_char, error_handler);
- if (indent >= 0)
- {
- s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent));
- }
- else
- {
- s.dump(*this, false, ensure_ascii, 0);
- }
- return result;
- }
-
- constexpr value_t type() const noexcept
- {
- return m_type;
- }
-
- constexpr bool is_primitive() const noexcept
- {
- return is_null() || is_string() || is_boolean() || is_number() || is_binary();
- }
-
- constexpr bool is_structured() const noexcept
- {
- return is_array() || is_object();
- }
-
- constexpr bool is_null() const noexcept
- {
- return m_type == value_t::null;
- }
-
- constexpr bool is_boolean() const noexcept
- {
- return m_type == value_t::boolean;
- }
-
- constexpr bool is_number() const noexcept
- {
- return is_number_integer() || is_number_float();
- }
-
- constexpr bool is_number_integer() const noexcept
- {
- return m_type == value_t::number_integer || m_type == value_t::number_unsigned;
- }
-
- constexpr bool is_number_unsigned() const noexcept
- {
- return m_type == value_t::number_unsigned;
- }
-
- constexpr bool is_number_float() const noexcept
- {
- return m_type == value_t::number_float;
- }
-
- constexpr bool is_object() const noexcept
- {
- return m_type == value_t::object;
- }
-
- constexpr bool is_array() const noexcept
- {
- return m_type == value_t::array;
- }
-
- constexpr bool is_string() const noexcept
- {
- return m_type == value_t::string;
- }
-
- constexpr bool is_binary() const noexcept
- {
- return m_type == value_t::binary;
- }
-
- constexpr bool is_discarded() const noexcept
- {
- return m_type == value_t::discarded;
- }
-
- constexpr operator value_t() const noexcept
- {
- return m_type;
- }
-
- private:
-
-
-
-
- boolean_t get_impl(boolean_t* ) const
- {
- if (JSON_HEDLEY_LIKELY(is_boolean()))
- {
- return m_value.boolean;
- }
- JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(type_name())));
- }
-
- object_t* get_impl_ptr(object_t* ) noexcept
- {
- return is_object() ? m_value.object : nullptr;
- }
-
- constexpr const object_t* get_impl_ptr(const object_t* ) const noexcept
- {
- return is_object() ? m_value.object : nullptr;
- }
-
- array_t* get_impl_ptr(array_t* ) noexcept
- {
- return is_array() ? m_value.array : nullptr;
- }
-
- constexpr const array_t* get_impl_ptr(const array_t* ) const noexcept
- {
- return is_array() ? m_value.array : nullptr;
- }
-
- string_t* get_impl_ptr(string_t* ) noexcept
- {
- return is_string() ? m_value.string : nullptr;
- }
-
- constexpr const string_t* get_impl_ptr(const string_t* ) const noexcept
- {
- return is_string() ? m_value.string : nullptr;
- }
-
- boolean_t* get_impl_ptr(boolean_t* ) noexcept
- {
- return is_boolean() ? &m_value.boolean : nullptr;
- }
-
- constexpr const boolean_t* get_impl_ptr(const boolean_t* ) const noexcept
- {
- return is_boolean() ? &m_value.boolean : nullptr;
- }
-
- number_integer_t* get_impl_ptr(number_integer_t* ) noexcept
- {
- return is_number_integer() ? &m_value.number_integer : nullptr;
- }
-
- constexpr const number_integer_t* get_impl_ptr(const number_integer_t* ) const noexcept
- {
- return is_number_integer() ? &m_value.number_integer : nullptr;
- }
-
- number_unsigned_t* get_impl_ptr(number_unsigned_t* ) noexcept
- {
- return is_number_unsigned() ? &m_value.number_unsigned : nullptr;
- }
-
- constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* ) const noexcept
- {
- return is_number_unsigned() ? &m_value.number_unsigned : nullptr;
- }
-
- number_float_t* get_impl_ptr(number_float_t* ) noexcept
- {
- return is_number_float() ? &m_value.number_float : nullptr;
- }
-
- constexpr const number_float_t* get_impl_ptr(const number_float_t* ) const noexcept
- {
- return is_number_float() ? &m_value.number_float : nullptr;
- }
-
- binary_t* get_impl_ptr(binary_t* ) noexcept
- {
- return is_binary() ? m_value.binary : nullptr;
- }
-
- constexpr const binary_t* get_impl_ptr(const binary_t* ) const noexcept
- {
- return is_binary() ? m_value.binary : nullptr;
- }
-
- template<typename ReferenceType, typename ThisType>
- static ReferenceType get_ref_impl(ThisType& obj)
- {
-
- auto ptr = obj.template get_ptr<typename std::add_pointer<ReferenceType>::type>();
- if (JSON_HEDLEY_LIKELY(ptr != nullptr))
- {
- return *ptr;
- }
- JSON_THROW(type_error::create(303, "incompatible ReferenceType for get_ref, actual type is " + std::string(obj.type_name())));
- }
- public:
-
-
-
-
- template<typename BasicJsonType, detail::enable_if_t<
- std::is_same<typename std::remove_const<BasicJsonType>::type, basic_json_t>::value,
- int> = 0>
- basic_json get() const
- {
- return *this;
- }
-
- template < typename BasicJsonType, detail::enable_if_t <
- !std::is_same<BasicJsonType, basic_json>::value&&
- detail::is_basic_json<BasicJsonType>::value, int > = 0 >
- BasicJsonType get() const
- {
- return *this;
- }
-
- template < typename ValueTypeCV, typename ValueType = detail::uncvref_t<ValueTypeCV>,
- detail::enable_if_t <
- !detail::is_basic_json<ValueType>::value &&
- detail::has_from_json<basic_json_t, ValueType>::value &&
- !detail::has_non_default_from_json<basic_json_t, ValueType>::value,
- int > = 0 >
- ValueType get() const noexcept(noexcept(
- JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), std::declval<ValueType&>())))
- {
-
-
-
- static_assert(!std::is_reference<ValueTypeCV>::value,
- "get() cannot be used with reference types, you might want to use get_ref()");
- static_assert(std::is_default_constructible<ValueType>::value,
- "types must be DefaultConstructible when used with get()");
- ValueType ret;
- JSONSerializer<ValueType>::from_json(*this, ret);
- return ret;
- }
-
- template < typename ValueTypeCV, typename ValueType = detail::uncvref_t<ValueTypeCV>,
- detail::enable_if_t < !std::is_same<basic_json_t, ValueType>::value &&
- detail::has_non_default_from_json<basic_json_t, ValueType>::value,
- int > = 0 >
- ValueType get() const noexcept(noexcept(
- JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>())))
- {
- static_assert(!std::is_reference<ValueTypeCV>::value,
- "get() cannot be used with reference types, you might want to use get_ref()");
- return JSONSerializer<ValueType>::from_json(*this);
- }
-
- template < typename ValueType,
- detail::enable_if_t <
- !detail::is_basic_json<ValueType>::value&&
- detail::has_from_json<basic_json_t, ValueType>::value,
- int > = 0 >
- ValueType & get_to(ValueType& v) const noexcept(noexcept(
- JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), v)))
- {
- JSONSerializer<ValueType>::from_json(*this, v);
- return v;
- }
-
-
- template<typename ValueType,
- detail::enable_if_t <
- detail::is_basic_json<ValueType>::value,
- int> = 0>
- ValueType & get_to(ValueType& v) const
- {
- v = *this;
- return v;
- }
- template <
- typename T, std::size_t N,
- typename Array = T (&)[N],
- detail::enable_if_t <
- detail::has_from_json<basic_json_t, Array>::value, int > = 0 >
- Array get_to(T (&v)[N]) const
- noexcept(noexcept(JSONSerializer<Array>::from_json(
- std::declval<const basic_json_t&>(), v)))
- {
- JSONSerializer<Array>::from_json(*this, v);
- return v;
- }
-
- template<typename PointerType, typename std::enable_if<
- std::is_pointer<PointerType>::value, int>::type = 0>
- auto get_ptr() noexcept -> decltype(std::declval<basic_json_t&>().get_impl_ptr(std::declval<PointerType>()))
- {
-
- return get_impl_ptr(static_cast<PointerType>(nullptr));
- }
-
- template < typename PointerType, typename std::enable_if <
- std::is_pointer<PointerType>::value&&
- std::is_const<typename std::remove_pointer<PointerType>::type>::value, int >::type = 0 >
- constexpr auto get_ptr() const noexcept -> decltype(std::declval<const basic_json_t&>().get_impl_ptr(std::declval<PointerType>()))
- {
-
- return get_impl_ptr(static_cast<PointerType>(nullptr));
- }
-
- template<typename PointerType, typename std::enable_if<
- std::is_pointer<PointerType>::value, int>::type = 0>
- auto get() noexcept -> decltype(std::declval<basic_json_t&>().template get_ptr<PointerType>())
- {
-
- return get_ptr<PointerType>();
- }
-
- template<typename PointerType, typename std::enable_if<
- std::is_pointer<PointerType>::value, int>::type = 0>
- constexpr auto get() const noexcept -> decltype(std::declval<const basic_json_t&>().template get_ptr<PointerType>())
- {
-
- return get_ptr<PointerType>();
- }
-
- template<typename ReferenceType, typename std::enable_if<
- std::is_reference<ReferenceType>::value, int>::type = 0>
- ReferenceType get_ref()
- {
-
- return get_ref_impl<ReferenceType>(*this);
- }
-
- template < typename ReferenceType, typename std::enable_if <
- std::is_reference<ReferenceType>::value&&
- std::is_const<typename std::remove_reference<ReferenceType>::type>::value, int >::type = 0 >
- ReferenceType get_ref() const
- {
-
- return get_ref_impl<ReferenceType>(*this);
- }
-
- template < typename ValueType, typename std::enable_if <
- !std::is_pointer<ValueType>::value&&
- !std::is_same<ValueType, detail::json_ref<basic_json>>::value&&
- !std::is_same<ValueType, typename string_t::value_type>::value&&
- !detail::is_basic_json<ValueType>::value
- && !std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value
- #if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))
- && !std::is_same<ValueType, typename std::string_view>::value
- #endif
- && detail::is_detected<detail::get_template_function, const basic_json_t&, ValueType>::value
- , int >::type = 0 >
- JSON_EXPLICIT operator ValueType() const
- {
-
- return get<ValueType>();
- }
-
- binary_t& get_binary()
- {
- if (!is_binary())
- {
- JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name())));
- }
- return *get_ptr<binary_t*>();
- }
-
- const binary_t& get_binary() const
- {
- if (!is_binary())
- {
- JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name())));
- }
- return *get_ptr<const binary_t*>();
- }
-
-
-
-
-
-
-
-
- reference at(size_type idx)
- {
-
- if (JSON_HEDLEY_LIKELY(is_array()))
- {
- JSON_TRY
- {
- return m_value.array->at(idx);
- }
- JSON_CATCH (std::out_of_range&)
- {
-
- JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range"));
- }
- }
- else
- {
- JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name())));
- }
- }
-
- const_reference at(size_type idx) const
- {
-
- if (JSON_HEDLEY_LIKELY(is_array()))
- {
- JSON_TRY
- {
- return m_value.array->at(idx);
- }
- JSON_CATCH (std::out_of_range&)
- {
-
- JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range"));
- }
- }
- else
- {
- JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name())));
- }
- }
-
- reference at(const typename object_t::key_type& key)
- {
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
- JSON_TRY
- {
- return m_value.object->at(key);
- }
- JSON_CATCH (std::out_of_range&)
- {
-
- JSON_THROW(out_of_range::create(403, "key '" + key + "' not found"));
- }
- }
- else
- {
- JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name())));
- }
- }
-
- const_reference at(const typename object_t::key_type& key) const
- {
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
- JSON_TRY
- {
- return m_value.object->at(key);
- }
- JSON_CATCH (std::out_of_range&)
- {
-
- JSON_THROW(out_of_range::create(403, "key '" + key + "' not found"));
- }
- }
- else
- {
- JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name())));
- }
- }
-
- reference operator[](size_type idx)
- {
-
- if (is_null())
- {
- m_type = value_t::array;
- m_value.array = create<array_t>();
- assert_invariant();
- }
-
- if (JSON_HEDLEY_LIKELY(is_array()))
- {
-
- if (idx >= m_value.array->size())
- {
- m_value.array->insert(m_value.array->end(),
- idx - m_value.array->size() + 1,
- basic_json());
- }
- return m_value.array->operator[](idx);
- }
- JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name())));
- }
-
- const_reference operator[](size_type idx) const
- {
-
- if (JSON_HEDLEY_LIKELY(is_array()))
- {
- return m_value.array->operator[](idx);
- }
- JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name())));
- }
-
- reference operator[](const typename object_t::key_type& key)
- {
-
- if (is_null())
- {
- m_type = value_t::object;
- m_value.object = create<object_t>();
- assert_invariant();
- }
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
- return m_value.object->operator[](key);
- }
- JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name())));
- }
-
- const_reference operator[](const typename object_t::key_type& key) const
- {
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
- JSON_ASSERT(m_value.object->find(key) != m_value.object->end());
- return m_value.object->find(key)->second;
- }
- JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name())));
- }
-
- template<typename T>
- JSON_HEDLEY_NON_NULL(2)
- reference operator[](T* key)
- {
-
- if (is_null())
- {
- m_type = value_t::object;
- m_value = value_t::object;
- assert_invariant();
- }
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
- return m_value.object->operator[](key);
- }
- JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name())));
- }
-
- template<typename T>
- JSON_HEDLEY_NON_NULL(2)
- const_reference operator[](T* key) const
- {
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
- JSON_ASSERT(m_value.object->find(key) != m_value.object->end());
- return m_value.object->find(key)->second;
- }
- JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name())));
- }
-
-
- template < class ValueType, typename std::enable_if <
- detail::is_getable<basic_json_t, ValueType>::value
- && !std::is_same<value_t, ValueType>::value, int >::type = 0 >
- ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const
- {
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
-
- const auto it = find(key);
- if (it != end())
- {
- return it->template get<ValueType>();
- }
- return default_value;
- }
- JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name())));
- }
-
- string_t value(const typename object_t::key_type& key, const char* default_value) const
- {
- return value(key, string_t(default_value));
- }
-
- template<class ValueType, typename std::enable_if<
- detail::is_getable<basic_json_t, ValueType>::value, int>::type = 0>
- ValueType value(const json_pointer& ptr, const ValueType& default_value) const
- {
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
-
- JSON_TRY
- {
- return ptr.get_checked(this).template get<ValueType>();
- }
- JSON_INTERNAL_CATCH (out_of_range&)
- {
- return default_value;
- }
- }
- JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name())));
- }
-
- JSON_HEDLEY_NON_NULL(3)
- string_t value(const json_pointer& ptr, const char* default_value) const
- {
- return value(ptr, string_t(default_value));
- }
-
- reference front()
- {
- return *begin();
- }
-
- const_reference front() const
- {
- return *cbegin();
- }
-
- reference back()
- {
- auto tmp = end();
- --tmp;
- return *tmp;
- }
-
- const_reference back() const
- {
- auto tmp = cend();
- --tmp;
- return *tmp;
- }
-
- template < class IteratorType, typename std::enable_if <
- std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
- std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int >::type
- = 0 >
- IteratorType erase(IteratorType pos)
- {
-
- if (JSON_HEDLEY_UNLIKELY(this != pos.m_object))
- {
- JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
- }
- IteratorType result = end();
- switch (m_type)
- {
- case value_t::boolean:
- case value_t::number_float:
- case value_t::number_integer:
- case value_t::number_unsigned:
- case value_t::string:
- case value_t::binary:
- {
- if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin()))
- {
- JSON_THROW(invalid_iterator::create(205, "iterator out of range"));
- }
- if (is_string())
- {
- AllocatorType<string_t> alloc;
- std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);
- std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);
- m_value.string = nullptr;
- }
- else if (is_binary())
- {
- AllocatorType<binary_t> alloc;
- std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);
- std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);
- m_value.binary = nullptr;
- }
- m_type = value_t::null;
- assert_invariant();
- break;
- }
- case value_t::object:
- {
- result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator);
- break;
- }
- case value_t::array:
- {
- result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator);
- break;
- }
- default:
- JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name())));
- }
- return result;
- }
-
- template < class IteratorType, typename std::enable_if <
- std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
- std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int >::type
- = 0 >
- IteratorType erase(IteratorType first, IteratorType last)
- {
-
- if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object))
- {
- JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value"));
- }
- IteratorType result = end();
- switch (m_type)
- {
- case value_t::boolean:
- case value_t::number_float:
- case value_t::number_integer:
- case value_t::number_unsigned:
- case value_t::string:
- case value_t::binary:
- {
- if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin()
- || !last.m_it.primitive_iterator.is_end()))
- {
- JSON_THROW(invalid_iterator::create(204, "iterators out of range"));
- }
- if (is_string())
- {
- AllocatorType<string_t> alloc;
- std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);
- std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);
- m_value.string = nullptr;
- }
- else if (is_binary())
- {
- AllocatorType<binary_t> alloc;
- std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);
- std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);
- m_value.binary = nullptr;
- }
- m_type = value_t::null;
- assert_invariant();
- break;
- }
- case value_t::object:
- {
- result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator,
- last.m_it.object_iterator);
- break;
- }
- case value_t::array:
- {
- result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator,
- last.m_it.array_iterator);
- break;
- }
- default:
- JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name())));
- }
- return result;
- }
-
- size_type erase(const typename object_t::key_type& key)
- {
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
- return m_value.object->erase(key);
- }
- JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name())));
- }
-
- void erase(const size_type idx)
- {
-
- if (JSON_HEDLEY_LIKELY(is_array()))
- {
- if (JSON_HEDLEY_UNLIKELY(idx >= size()))
- {
- JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range"));
- }
- m_value.array->erase(m_value.array->begin() + static_cast<difference_type>(idx));
- }
- else
- {
- JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name())));
- }
- }
-
-
-
-
-
-
-
- template<typename KeyT>
- iterator find(KeyT&& key)
- {
- auto result = end();
- if (is_object())
- {
- result.m_it.object_iterator = m_value.object->find(std::forward<KeyT>(key));
- }
- return result;
- }
-
- template<typename KeyT>
- const_iterator find(KeyT&& key) const
- {
- auto result = cend();
- if (is_object())
- {
- result.m_it.object_iterator = m_value.object->find(std::forward<KeyT>(key));
- }
- return result;
- }
-
- template<typename KeyT>
- size_type count(KeyT&& key) const
- {
-
- return is_object() ? m_value.object->count(std::forward<KeyT>(key)) : 0;
- }
-
- template < typename KeyT, typename std::enable_if <
- !std::is_same<typename std::decay<KeyT>::type, json_pointer>::value, int >::type = 0 >
- bool contains(KeyT && key) const
- {
- return is_object() && m_value.object->find(std::forward<KeyT>(key)) != m_value.object->end();
- }
-
- bool contains(const json_pointer& ptr) const
- {
- return ptr.contains(this);
- }
-
-
-
-
-
-
-
- iterator begin() noexcept
- {
- iterator result(this);
- result.set_begin();
- return result;
- }
-
- const_iterator begin() const noexcept
- {
- return cbegin();
- }
-
- const_iterator cbegin() const noexcept
- {
- const_iterator result(this);
- result.set_begin();
- return result;
- }
-
- iterator end() noexcept
- {
- iterator result(this);
- result.set_end();
- return result;
- }
-
- const_iterator end() const noexcept
- {
- return cend();
- }
-
- const_iterator cend() const noexcept
- {
- const_iterator result(this);
- result.set_end();
- return result;
- }
-
- reverse_iterator rbegin() noexcept
- {
- return reverse_iterator(end());
- }
-
- const_reverse_iterator rbegin() const noexcept
- {
- return crbegin();
- }
-
- reverse_iterator rend() noexcept
- {
- return reverse_iterator(begin());
- }
-
- const_reverse_iterator rend() const noexcept
- {
- return crend();
- }
-
- const_reverse_iterator crbegin() const noexcept
- {
- return const_reverse_iterator(cend());
- }
-
- const_reverse_iterator crend() const noexcept
- {
- return const_reverse_iterator(cbegin());
- }
- public:
-
- JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())
- static iteration_proxy<iterator> iterator_wrapper(reference ref) noexcept
- {
- return ref.items();
- }
-
- JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())
- static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) noexcept
- {
- return ref.items();
- }
-
- iteration_proxy<iterator> items() noexcept
- {
- return iteration_proxy<iterator>(*this);
- }
-
- iteration_proxy<const_iterator> items() const noexcept
- {
- return iteration_proxy<const_iterator>(*this);
- }
-
-
-
-
-
-
-
- bool empty() const noexcept
- {
- switch (m_type)
- {
- case value_t::null:
- {
-
- return true;
- }
- case value_t::array:
- {
-
- return m_value.array->empty();
- }
- case value_t::object:
- {
-
- return m_value.object->empty();
- }
- default:
- {
-
- return false;
- }
- }
- }
-
- size_type size() const noexcept
- {
- switch (m_type)
- {
- case value_t::null:
- {
-
- return 0;
- }
- case value_t::array:
- {
-
- return m_value.array->size();
- }
- case value_t::object:
- {
-
- return m_value.object->size();
- }
- default:
- {
-
- return 1;
- }
- }
- }
-
- size_type max_size() const noexcept
- {
- switch (m_type)
- {
- case value_t::array:
- {
-
- return m_value.array->max_size();
- }
- case value_t::object:
- {
-
- return m_value.object->max_size();
- }
- default:
- {
-
- return size();
- }
- }
- }
-
-
-
-
-
-
-
- void clear() noexcept
- {
- switch (m_type)
- {
- case value_t::number_integer:
- {
- m_value.number_integer = 0;
- break;
- }
- case value_t::number_unsigned:
- {
- m_value.number_unsigned = 0;
- break;
- }
- case value_t::number_float:
- {
- m_value.number_float = 0.0;
- break;
- }
- case value_t::boolean:
- {
- m_value.boolean = false;
- break;
- }
- case value_t::string:
- {
- m_value.string->clear();
- break;
- }
- case value_t::binary:
- {
- m_value.binary->clear();
- break;
- }
- case value_t::array:
- {
- m_value.array->clear();
- break;
- }
- case value_t::object:
- {
- m_value.object->clear();
- break;
- }
- default:
- break;
- }
- }
-
- void push_back(basic_json&& val)
- {
-
- if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))
- {
- JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name())));
- }
-
- if (is_null())
- {
- m_type = value_t::array;
- m_value = value_t::array;
- assert_invariant();
- }
-
- m_value.array->push_back(std::move(val));
-
- }
-
- reference operator+=(basic_json&& val)
- {
- push_back(std::move(val));
- return *this;
- }
-
- void push_back(const basic_json& val)
- {
-
- if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))
- {
- JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name())));
- }
-
- if (is_null())
- {
- m_type = value_t::array;
- m_value = value_t::array;
- assert_invariant();
- }
-
- m_value.array->push_back(val);
- }
-
- reference operator+=(const basic_json& val)
- {
- push_back(val);
- return *this;
- }
-
- void push_back(const typename object_t::value_type& val)
- {
-
- if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object())))
- {
- JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name())));
- }
-
- if (is_null())
- {
- m_type = value_t::object;
- m_value = value_t::object;
- assert_invariant();
- }
-
- m_value.object->insert(val);
- }
-
- reference operator+=(const typename object_t::value_type& val)
- {
- push_back(val);
- return *this;
- }
-
- void push_back(initializer_list_t init)
- {
- if (is_object() && init.size() == 2 && (*init.begin())->is_string())
- {
- basic_json&& key = init.begin()->moved_or_copied();
- push_back(typename object_t::value_type(
- std::move(key.get_ref<string_t&>()), (init.begin() + 1)->moved_or_copied()));
- }
- else
- {
- push_back(basic_json(init));
- }
- }
-
- reference operator+=(initializer_list_t init)
- {
- push_back(init);
- return *this;
- }
-
- template<class... Args>
- reference emplace_back(Args&& ... args)
- {
-
- if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array())))
- {
- JSON_THROW(type_error::create(311, "cannot use emplace_back() with " + std::string(type_name())));
- }
-
- if (is_null())
- {
- m_type = value_t::array;
- m_value = value_t::array;
- assert_invariant();
- }
-
- #ifdef JSON_HAS_CPP_17
- return m_value.array->emplace_back(std::forward<Args>(args)...);
- #else
- m_value.array->emplace_back(std::forward<Args>(args)...);
- return m_value.array->back();
- #endif
- }
-
- template<class... Args>
- std::pair<iterator, bool> emplace(Args&& ... args)
- {
-
- if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object())))
- {
- JSON_THROW(type_error::create(311, "cannot use emplace() with " + std::string(type_name())));
- }
-
- if (is_null())
- {
- m_type = value_t::object;
- m_value = value_t::object;
- assert_invariant();
- }
-
- auto res = m_value.object->emplace(std::forward<Args>(args)...);
-
- auto it = begin();
- it.m_it.object_iterator = res.first;
-
- return {it, res.second};
- }
-
-
-
- template<typename... Args>
- iterator insert_iterator(const_iterator pos, Args&& ... args)
- {
- iterator result(this);
- JSON_ASSERT(m_value.array != nullptr);
- auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator);
- m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);
- result.m_it.array_iterator = m_value.array->begin() + insert_pos;
-
-
-
- return result;
- }
-
- iterator insert(const_iterator pos, const basic_json& val)
- {
-
- if (JSON_HEDLEY_LIKELY(is_array()))
- {
-
- if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))
- {
- JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
- }
-
- return insert_iterator(pos, val);
- }
- JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
- }
-
- iterator insert(const_iterator pos, basic_json&& val)
- {
- return insert(pos, val);
- }
-
- iterator insert(const_iterator pos, size_type cnt, const basic_json& val)
- {
-
- if (JSON_HEDLEY_LIKELY(is_array()))
- {
-
- if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))
- {
- JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
- }
-
- return insert_iterator(pos, cnt, val);
- }
- JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
- }
-
- iterator insert(const_iterator pos, const_iterator first, const_iterator last)
- {
-
- if (JSON_HEDLEY_UNLIKELY(!is_array()))
- {
- JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
- }
-
- if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))
- {
- JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
- }
-
- if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))
- {
- JSON_THROW(invalid_iterator::create(210, "iterators do not fit"));
- }
- if (JSON_HEDLEY_UNLIKELY(first.m_object == this))
- {
- JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container"));
- }
-
- return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator);
- }
-
- iterator insert(const_iterator pos, initializer_list_t ilist)
- {
-
- if (JSON_HEDLEY_UNLIKELY(!is_array()))
- {
- JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
- }
-
- if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))
- {
- JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
- }
-
- return insert_iterator(pos, ilist.begin(), ilist.end());
- }
-
- void insert(const_iterator first, const_iterator last)
- {
-
- if (JSON_HEDLEY_UNLIKELY(!is_object()))
- {
- JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
- }
-
- if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))
- {
- JSON_THROW(invalid_iterator::create(210, "iterators do not fit"));
- }
-
- if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object()))
- {
- JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects"));
- }
- m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);
- }
-
- void update(const_reference j)
- {
-
- if (is_null())
- {
- m_type = value_t::object;
- m_value.object = create<object_t>();
- assert_invariant();
- }
- if (JSON_HEDLEY_UNLIKELY(!is_object()))
- {
- JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name())));
- }
- if (JSON_HEDLEY_UNLIKELY(!j.is_object()))
- {
- JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(j.type_name())));
- }
- for (auto it = j.cbegin(); it != j.cend(); ++it)
- {
- m_value.object->operator[](it.key()) = it.value();
- }
- }
-
- void update(const_iterator first, const_iterator last)
- {
-
- if (is_null())
- {
- m_type = value_t::object;
- m_value.object = create<object_t>();
- assert_invariant();
- }
- if (JSON_HEDLEY_UNLIKELY(!is_object()))
- {
- JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name())));
- }
-
- if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))
- {
- JSON_THROW(invalid_iterator::create(210, "iterators do not fit"));
- }
-
- if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object()
- || !last.m_object->is_object()))
- {
- JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects"));
- }
- for (auto it = first; it != last; ++it)
- {
- m_value.object->operator[](it.key()) = it.value();
- }
- }
-
- void swap(reference other) noexcept (
- std::is_nothrow_move_constructible<value_t>::value&&
- std::is_nothrow_move_assignable<value_t>::value&&
- std::is_nothrow_move_constructible<json_value>::value&&
- std::is_nothrow_move_assignable<json_value>::value
- )
- {
- std::swap(m_type, other.m_type);
- std::swap(m_value, other.m_value);
- assert_invariant();
- }
-
- friend void swap(reference left, reference right) noexcept (
- std::is_nothrow_move_constructible<value_t>::value&&
- std::is_nothrow_move_assignable<value_t>::value&&
- std::is_nothrow_move_constructible<json_value>::value&&
- std::is_nothrow_move_assignable<json_value>::value
- )
- {
- left.swap(right);
- }
-
- void swap(array_t& other)
- {
-
- if (JSON_HEDLEY_LIKELY(is_array()))
- {
- std::swap(*(m_value.array), other);
- }
- else
- {
- JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name())));
- }
- }
-
- void swap(object_t& other)
- {
-
- if (JSON_HEDLEY_LIKELY(is_object()))
- {
- std::swap(*(m_value.object), other);
- }
- else
- {
- JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name())));
- }
- }
-
- void swap(string_t& other)
- {
-
- if (JSON_HEDLEY_LIKELY(is_string()))
- {
- std::swap(*(m_value.string), other);
- }
- else
- {
- JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name())));
- }
- }
-
- void swap(binary_t& other)
- {
-
- if (JSON_HEDLEY_LIKELY(is_binary()))
- {
- std::swap(*(m_value.binary), other);
- }
- else
- {
- JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name())));
- }
- }
-
- void swap(typename binary_t::container_type& other)
- {
-
- if (JSON_HEDLEY_LIKELY(is_binary()))
- {
- std::swap(*(m_value.binary), other);
- }
- else
- {
- JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name())));
- }
- }
-
- public:
-
-
-
-
-
-
- friend bool operator==(const_reference lhs, const_reference rhs) noexcept
- {
- const auto lhs_type = lhs.type();
- const auto rhs_type = rhs.type();
- if (lhs_type == rhs_type)
- {
- switch (lhs_type)
- {
- case value_t::array:
- return *lhs.m_value.array == *rhs.m_value.array;
- case value_t::object:
- return *lhs.m_value.object == *rhs.m_value.object;
- case value_t::null:
- return true;
- case value_t::string:
- return *lhs.m_value.string == *rhs.m_value.string;
- case value_t::boolean:
- return lhs.m_value.boolean == rhs.m_value.boolean;
- case value_t::number_integer:
- return lhs.m_value.number_integer == rhs.m_value.number_integer;
- case value_t::number_unsigned:
- return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned;
- case value_t::number_float:
- return lhs.m_value.number_float == rhs.m_value.number_float;
- case value_t::binary:
- return *lhs.m_value.binary == *rhs.m_value.binary;
- default:
- return false;
- }
- }
- else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float)
- {
- return static_cast<number_float_t>(lhs.m_value.number_integer) == rhs.m_value.number_float;
- }
- else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer)
- {
- return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_integer);
- }
- else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float)
- {
- return static_cast<number_float_t>(lhs.m_value.number_unsigned) == rhs.m_value.number_float;
- }
- else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned)
- {
- return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_unsigned);
- }
- else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer)
- {
- return static_cast<number_integer_t>(lhs.m_value.number_unsigned) == rhs.m_value.number_integer;
- }
- else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned)
- {
- return lhs.m_value.number_integer == static_cast<number_integer_t>(rhs.m_value.number_unsigned);
- }
- return false;
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator==(const_reference lhs, const ScalarType rhs) noexcept
- {
- return lhs == basic_json(rhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator==(const ScalarType lhs, const_reference rhs) noexcept
- {
- return basic_json(lhs) == rhs;
- }
-
- friend bool operator!=(const_reference lhs, const_reference rhs) noexcept
- {
- return !(lhs == rhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator!=(const_reference lhs, const ScalarType rhs) noexcept
- {
- return lhs != basic_json(rhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator!=(const ScalarType lhs, const_reference rhs) noexcept
- {
- return basic_json(lhs) != rhs;
- }
-
- friend bool operator<(const_reference lhs, const_reference rhs) noexcept
- {
- const auto lhs_type = lhs.type();
- const auto rhs_type = rhs.type();
- if (lhs_type == rhs_type)
- {
- switch (lhs_type)
- {
- case value_t::array:
-
-
- return (*lhs.m_value.array) < (*rhs.m_value.array);
- case value_t::object:
- return (*lhs.m_value.object) < (*rhs.m_value.object);
- case value_t::null:
- return false;
- case value_t::string:
- return (*lhs.m_value.string) < (*rhs.m_value.string);
- case value_t::boolean:
- return (lhs.m_value.boolean) < (rhs.m_value.boolean);
- case value_t::number_integer:
- return (lhs.m_value.number_integer) < (rhs.m_value.number_integer);
- case value_t::number_unsigned:
- return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned);
- case value_t::number_float:
- return (lhs.m_value.number_float) < (rhs.m_value.number_float);
- case value_t::binary:
- return (*lhs.m_value.binary) < (*rhs.m_value.binary);
- default:
- return false;
- }
- }
- else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float)
- {
- return static_cast<number_float_t>(lhs.m_value.number_integer) < rhs.m_value.number_float;
- }
- else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer)
- {
- return lhs.m_value.number_float < static_cast<number_float_t>(rhs.m_value.number_integer);
- }
- else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float)
- {
- return static_cast<number_float_t>(lhs.m_value.number_unsigned) < rhs.m_value.number_float;
- }
- else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned)
- {
- return lhs.m_value.number_float < static_cast<number_float_t>(rhs.m_value.number_unsigned);
- }
- else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned)
- {
- return lhs.m_value.number_integer < static_cast<number_integer_t>(rhs.m_value.number_unsigned);
- }
- else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer)
- {
- return static_cast<number_integer_t>(lhs.m_value.number_unsigned) < rhs.m_value.number_integer;
- }
-
-
-
- return operator<(lhs_type, rhs_type);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator<(const_reference lhs, const ScalarType rhs) noexcept
- {
- return lhs < basic_json(rhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator<(const ScalarType lhs, const_reference rhs) noexcept
- {
- return basic_json(lhs) < rhs;
- }
-
- friend bool operator<=(const_reference lhs, const_reference rhs) noexcept
- {
- return !(rhs < lhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator<=(const_reference lhs, const ScalarType rhs) noexcept
- {
- return lhs <= basic_json(rhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator<=(const ScalarType lhs, const_reference rhs) noexcept
- {
- return basic_json(lhs) <= rhs;
- }
-
- friend bool operator>(const_reference lhs, const_reference rhs) noexcept
- {
- return !(lhs <= rhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator>(const_reference lhs, const ScalarType rhs) noexcept
- {
- return lhs > basic_json(rhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator>(const ScalarType lhs, const_reference rhs) noexcept
- {
- return basic_json(lhs) > rhs;
- }
-
- friend bool operator>=(const_reference lhs, const_reference rhs) noexcept
- {
- return !(lhs < rhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator>=(const_reference lhs, const ScalarType rhs) noexcept
- {
- return lhs >= basic_json(rhs);
- }
-
- template<typename ScalarType, typename std::enable_if<
- std::is_scalar<ScalarType>::value, int>::type = 0>
- friend bool operator>=(const ScalarType lhs, const_reference rhs) noexcept
- {
- return basic_json(lhs) >= rhs;
- }
-
-
-
-
-
-
-
- friend std::ostream& operator<<(std::ostream& o, const basic_json& j)
- {
-
- const bool pretty_print = o.width() > 0;
- const auto indentation = pretty_print ? o.width() : 0;
-
- o.width(0);
-
- serializer s(detail::output_adapter<char>(o), o.fill());
- s.dump(j, pretty_print, false, static_cast<unsigned int>(indentation));
- return o;
- }
-
- JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&))
- friend std::ostream& operator>>(const basic_json& j, std::ostream& o)
- {
- return o << j;
- }
-
-
-
-
-
-
-
- template<typename InputType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json parse(InputType&& i,
- const parser_callback_t cb = nullptr,
- const bool allow_exceptions = true,
- const bool ignore_comments = false)
- {
- basic_json result;
- parser(detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions, ignore_comments).parse(true, result);
- return result;
- }
-
- template<typename IteratorType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json parse(IteratorType first,
- IteratorType last,
- const parser_callback_t cb = nullptr,
- const bool allow_exceptions = true,
- const bool ignore_comments = false)
- {
- basic_json result;
- parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result);
- return result;
- }
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len))
- static basic_json parse(detail::span_input_adapter&& i,
- const parser_callback_t cb = nullptr,
- const bool allow_exceptions = true,
- const bool ignore_comments = false)
- {
- basic_json result;
- parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result);
- return result;
- }
-
- template<typename InputType>
- static bool accept(InputType&& i,
- const bool ignore_comments = false)
- {
- return parser(detail::input_adapter(std::forward<InputType>(i)), nullptr, false, ignore_comments).accept(true);
- }
- template<typename IteratorType>
- static bool accept(IteratorType first, IteratorType last,
- const bool ignore_comments = false)
- {
- return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true);
- }
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len))
- static bool accept(detail::span_input_adapter&& i,
- const bool ignore_comments = false)
- {
- return parser(i.get(), nullptr, false, ignore_comments).accept(true);
- }
-
- template <typename InputType, typename SAX>
- JSON_HEDLEY_NON_NULL(2)
- static bool sax_parse(InputType&& i, SAX* sax,
- input_format_t format = input_format_t::json,
- const bool strict = true,
- const bool ignore_comments = false)
- {
- auto ia = detail::input_adapter(std::forward<InputType>(i));
- return format == input_format_t::json
- ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)
- : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);
- }
- template<class IteratorType, class SAX>
- JSON_HEDLEY_NON_NULL(3)
- static bool sax_parse(IteratorType first, IteratorType last, SAX* sax,
- input_format_t format = input_format_t::json,
- const bool strict = true,
- const bool ignore_comments = false)
- {
- auto ia = detail::input_adapter(std::move(first), std::move(last));
- return format == input_format_t::json
- ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)
- : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);
- }
- template <typename SAX>
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...))
- JSON_HEDLEY_NON_NULL(2)
- static bool sax_parse(detail::span_input_adapter&& i, SAX* sax,
- input_format_t format = input_format_t::json,
- const bool strict = true,
- const bool ignore_comments = false)
- {
- auto ia = i.get();
- return format == input_format_t::json
- ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict)
- : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);
- }
-
- JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&))
- friend std::istream& operator<<(basic_json& j, std::istream& i)
- {
- return operator>>(i, j);
- }
-
- friend std::istream& operator>>(std::istream& i, basic_json& j)
- {
- parser(detail::input_adapter(i)).parse(false, j);
- return i;
- }
-
-
-
-
-
- JSON_HEDLEY_RETURNS_NON_NULL
- const char* type_name() const noexcept
- {
- {
- switch (m_type)
- {
- case value_t::null:
- return "null";
- case value_t::object:
- return "object";
- case value_t::array:
- return "array";
- case value_t::string:
- return "string";
- case value_t::boolean:
- return "boolean";
- case value_t::binary:
- return "binary";
- case value_t::discarded:
- return "discarded";
- default:
- return "number";
- }
- }
- }
- private:
-
-
-
-
- value_t m_type = value_t::null;
-
- json_value m_value = {};
-
-
-
-
-
- public:
-
- static std::vector<uint8_t> to_cbor(const basic_json& j)
- {
- std::vector<uint8_t> result;
- to_cbor(j, result);
- return result;
- }
- static void to_cbor(const basic_json& j, detail::output_adapter<uint8_t> o)
- {
- binary_writer<uint8_t>(o).write_cbor(j);
- }
- static void to_cbor(const basic_json& j, detail::output_adapter<char> o)
- {
- binary_writer<char>(o).write_cbor(j);
- }
-
- static std::vector<uint8_t> to_msgpack(const basic_json& j)
- {
- std::vector<uint8_t> result;
- to_msgpack(j, result);
- return result;
- }
- static void to_msgpack(const basic_json& j, detail::output_adapter<uint8_t> o)
- {
- binary_writer<uint8_t>(o).write_msgpack(j);
- }
- static void to_msgpack(const basic_json& j, detail::output_adapter<char> o)
- {
- binary_writer<char>(o).write_msgpack(j);
- }
-
- static std::vector<uint8_t> to_ubjson(const basic_json& j,
- const bool use_size = false,
- const bool use_type = false)
- {
- std::vector<uint8_t> result;
- to_ubjson(j, result, use_size, use_type);
- return result;
- }
- static void to_ubjson(const basic_json& j, detail::output_adapter<uint8_t> o,
- const bool use_size = false, const bool use_type = false)
- {
- binary_writer<uint8_t>(o).write_ubjson(j, use_size, use_type);
- }
- static void to_ubjson(const basic_json& j, detail::output_adapter<char> o,
- const bool use_size = false, const bool use_type = false)
- {
- binary_writer<char>(o).write_ubjson(j, use_size, use_type);
- }
-
- static std::vector<uint8_t> to_bson(const basic_json& j)
- {
- std::vector<uint8_t> result;
- to_bson(j, result);
- return result;
- }
-
- static void to_bson(const basic_json& j, detail::output_adapter<uint8_t> o)
- {
- binary_writer<uint8_t>(o).write_bson(j);
- }
-
- static void to_bson(const basic_json& j, detail::output_adapter<char> o)
- {
- binary_writer<char>(o).write_bson(j);
- }
-
- template<typename InputType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json from_cbor(InputType&& i,
- const bool strict = true,
- const bool allow_exceptions = true,
- const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = detail::input_adapter(std::forward<InputType>(i));
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
- return res ? result : basic_json(value_t::discarded);
- }
-
- template<typename IteratorType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json from_cbor(IteratorType first, IteratorType last,
- const bool strict = true,
- const bool allow_exceptions = true,
- const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = detail::input_adapter(std::move(first), std::move(last));
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
- return res ? result : basic_json(value_t::discarded);
- }
- template<typename T>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))
- static basic_json from_cbor(const T* ptr, std::size_t len,
- const bool strict = true,
- const bool allow_exceptions = true,
- const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)
- {
- return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);
- }
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))
- static basic_json from_cbor(detail::span_input_adapter&& i,
- const bool strict = true,
- const bool allow_exceptions = true,
- const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = i.get();
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler);
- return res ? result : basic_json(value_t::discarded);
- }
-
- template<typename InputType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json from_msgpack(InputType&& i,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = detail::input_adapter(std::forward<InputType>(i));
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);
- return res ? result : basic_json(value_t::discarded);
- }
-
- template<typename IteratorType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json from_msgpack(IteratorType first, IteratorType last,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = detail::input_adapter(std::move(first), std::move(last));
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);
- return res ? result : basic_json(value_t::discarded);
- }
- template<typename T>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))
- static basic_json from_msgpack(const T* ptr, std::size_t len,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- return from_msgpack(ptr, ptr + len, strict, allow_exceptions);
- }
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))
- static basic_json from_msgpack(detail::span_input_adapter&& i,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = i.get();
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);
- return res ? result : basic_json(value_t::discarded);
- }
-
- template<typename InputType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json from_ubjson(InputType&& i,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = detail::input_adapter(std::forward<InputType>(i));
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);
- return res ? result : basic_json(value_t::discarded);
- }
-
- template<typename IteratorType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json from_ubjson(IteratorType first, IteratorType last,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = detail::input_adapter(std::move(first), std::move(last));
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);
- return res ? result : basic_json(value_t::discarded);
- }
- template<typename T>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))
- static basic_json from_ubjson(const T* ptr, std::size_t len,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- return from_ubjson(ptr, ptr + len, strict, allow_exceptions);
- }
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))
- static basic_json from_ubjson(detail::span_input_adapter&& i,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = i.get();
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);
- return res ? result : basic_json(value_t::discarded);
- }
-
- template<typename InputType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json from_bson(InputType&& i,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = detail::input_adapter(std::forward<InputType>(i));
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);
- return res ? result : basic_json(value_t::discarded);
- }
-
- template<typename IteratorType>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json from_bson(IteratorType first, IteratorType last,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = detail::input_adapter(std::move(first), std::move(last));
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);
- return res ? result : basic_json(value_t::discarded);
- }
- template<typename T>
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))
- static basic_json from_bson(const T* ptr, std::size_t len,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- return from_bson(ptr, ptr + len, strict, allow_exceptions);
- }
- JSON_HEDLEY_WARN_UNUSED_RESULT
- JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))
- static basic_json from_bson(detail::span_input_adapter&& i,
- const bool strict = true,
- const bool allow_exceptions = true)
- {
- basic_json result;
- detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- auto ia = i.get();
- const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);
- return res ? result : basic_json(value_t::discarded);
- }
-
-
-
-
-
-
-
- reference operator[](const json_pointer& ptr)
- {
- return ptr.get_unchecked(this);
- }
-
- const_reference operator[](const json_pointer& ptr) const
- {
- return ptr.get_unchecked(this);
- }
-
- reference at(const json_pointer& ptr)
- {
- return ptr.get_checked(this);
- }
-
- const_reference at(const json_pointer& ptr) const
- {
- return ptr.get_checked(this);
- }
-
- basic_json flatten() const
- {
- basic_json result(value_t::object);
- json_pointer::flatten("", *this, result);
- return result;
- }
-
- basic_json unflatten() const
- {
- return json_pointer::unflatten(*this);
- }
-
-
-
-
-
-
-
- basic_json patch(const basic_json& json_patch) const
- {
-
- basic_json result = *this;
-
- enum class patch_operations {add, remove, replace, move, copy, test, invalid};
- const auto get_op = [](const std::string & op)
- {
- if (op == "add")
- {
- return patch_operations::add;
- }
- if (op == "remove")
- {
- return patch_operations::remove;
- }
- if (op == "replace")
- {
- return patch_operations::replace;
- }
- if (op == "move")
- {
- return patch_operations::move;
- }
- if (op == "copy")
- {
- return patch_operations::copy;
- }
- if (op == "test")
- {
- return patch_operations::test;
- }
- return patch_operations::invalid;
- };
-
- const auto operation_add = [&result](json_pointer & ptr, basic_json val)
- {
-
- if (ptr.empty())
- {
- result = val;
- return;
- }
-
- json_pointer top_pointer = ptr.top();
- if (top_pointer != ptr)
- {
- result.at(top_pointer);
- }
-
- const auto last_path = ptr.back();
- ptr.pop_back();
- basic_json& parent = result[ptr];
- switch (parent.m_type)
- {
- case value_t::null:
- case value_t::object:
- {
-
- parent[last_path] = val;
- break;
- }
- case value_t::array:
- {
- if (last_path == "-")
- {
-
- parent.push_back(val);
- }
- else
- {
- const auto idx = json_pointer::array_index(last_path);
- if (JSON_HEDLEY_UNLIKELY(idx > parent.size()))
- {
-
- JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range"));
- }
-
- parent.insert(parent.begin() + static_cast<difference_type>(idx), val);
- }
- break;
- }
-
- default:
- JSON_ASSERT(false);
- }
- };
-
- const auto operation_remove = [&result](json_pointer & ptr)
- {
-
- const auto last_path = ptr.back();
- ptr.pop_back();
- basic_json& parent = result.at(ptr);
-
- if (parent.is_object())
- {
-
- auto it = parent.find(last_path);
- if (JSON_HEDLEY_LIKELY(it != parent.end()))
- {
- parent.erase(it);
- }
- else
- {
- JSON_THROW(out_of_range::create(403, "key '" + last_path + "' not found"));
- }
- }
- else if (parent.is_array())
- {
-
- parent.erase(json_pointer::array_index(last_path));
- }
- };
-
- if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array()))
- {
- JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects"));
- }
-
- for (const auto& val : json_patch)
- {
-
- const auto get_value = [&val](const std::string & op,
- const std::string & member,
- bool string_type) -> basic_json &
- {
-
- auto it = val.m_value.object->find(member);
-
- const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'";
-
- if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end()))
- {
- JSON_THROW(parse_error::create(105, 0, error_msg + " must have member '" + member + "'"));
- }
-
- if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string()))
- {
- JSON_THROW(parse_error::create(105, 0, error_msg + " must have string member '" + member + "'"));
- }
-
- return it->second;
- };
-
- if (JSON_HEDLEY_UNLIKELY(!val.is_object()))
- {
- JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects"));
- }
-
- const auto op = get_value("op", "op", true).template get<std::string>();
- const auto path = get_value(op, "path", true).template get<std::string>();
- json_pointer ptr(path);
- switch (get_op(op))
- {
- case patch_operations::add:
- {
- operation_add(ptr, get_value("add", "value", false));
- break;
- }
- case patch_operations::remove:
- {
- operation_remove(ptr);
- break;
- }
- case patch_operations::replace:
- {
-
- result.at(ptr) = get_value("replace", "value", false);
- break;
- }
- case patch_operations::move:
- {
- const auto from_path = get_value("move", "from", true).template get<std::string>();
- json_pointer from_ptr(from_path);
-
- basic_json v = result.at(from_ptr);
-
-
-
-
- operation_remove(from_ptr);
- operation_add(ptr, v);
- break;
- }
- case patch_operations::copy:
- {
- const auto from_path = get_value("copy", "from", true).template get<std::string>();
- const json_pointer from_ptr(from_path);
-
- basic_json v = result.at(from_ptr);
-
-
-
- operation_add(ptr, v);
- break;
- }
- case patch_operations::test:
- {
- bool success = false;
- JSON_TRY
- {
-
-
- success = (result.at(ptr) == get_value("test", "value", false));
- }
- JSON_INTERNAL_CATCH (out_of_range&)
- {
-
- }
-
- if (JSON_HEDLEY_UNLIKELY(!success))
- {
- JSON_THROW(other_error::create(501, "unsuccessful: " + val.dump()));
- }
- break;
- }
- default:
- {
-
-
- JSON_THROW(parse_error::create(105, 0, "operation value '" + op + "' is invalid"));
- }
- }
- }
- return result;
- }
-
- JSON_HEDLEY_WARN_UNUSED_RESULT
- static basic_json diff(const basic_json& source, const basic_json& target,
- const std::string& path = "")
- {
-
- basic_json result(value_t::array);
-
- if (source == target)
- {
- return result;
- }
- if (source.type() != target.type())
- {
-
- result.push_back(
- {
- {"op", "replace"}, {"path", path}, {"value", target}
- });
- return result;
- }
- switch (source.type())
- {
- case value_t::array:
- {
-
- std::size_t i = 0;
- while (i < source.size() && i < target.size())
- {
-
- auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i));
- result.insert(result.end(), temp_diff.begin(), temp_diff.end());
- ++i;
- }
-
-
-
- const auto end_index = static_cast<difference_type>(result.size());
- while (i < source.size())
- {
-
-
- result.insert(result.begin() + end_index, object(
- {
- {"op", "remove"},
- {"path", path + "/" + std::to_string(i)}
- }));
- ++i;
- }
-
- while (i < target.size())
- {
- result.push_back(
- {
- {"op", "add"},
- {"path", path + "/-"},
- {"value", target[i]}
- });
- ++i;
- }
- break;
- }
- case value_t::object:
- {
-
- for (auto it = source.cbegin(); it != source.cend(); ++it)
- {
-
- const auto key = json_pointer::escape(it.key());
- if (target.find(it.key()) != target.end())
- {
-
- auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key);
- result.insert(result.end(), temp_diff.begin(), temp_diff.end());
- }
- else
- {
-
- result.push_back(object(
- {
- {"op", "remove"}, {"path", path + "/" + key}
- }));
- }
- }
-
- for (auto it = target.cbegin(); it != target.cend(); ++it)
- {
- if (source.find(it.key()) == source.end())
- {
-
- const auto key = json_pointer::escape(it.key());
- result.push_back(
- {
- {"op", "add"}, {"path", path + "/" + key},
- {"value", it.value()}
- });
- }
- }
- break;
- }
- default:
- {
-
- result.push_back(
- {
- {"op", "replace"}, {"path", path}, {"value", target}
- });
- break;
- }
- }
- return result;
- }
-
-
-
-
-
-
-
- void merge_patch(const basic_json& apply_patch)
- {
- if (apply_patch.is_object())
- {
- if (!is_object())
- {
- *this = object();
- }
- for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it)
- {
- if (it.value().is_null())
- {
- erase(it.key());
- }
- else
- {
- operator[](it.key()).merge_patch(it.value());
- }
- }
- }
- else
- {
- *this = apply_patch;
- }
- }
-
- };
- NLOHMANN_BASIC_JSON_TPL_DECLARATION
- std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j)
- {
- return j.dump();
- }
- }
- namespace std
- {
- template<>
- struct hash<nlohmann::json>
- {
-
- std::size_t operator()(const nlohmann::json& j) const
- {
- return nlohmann::detail::hash(j);
- }
- };
- template<>
- struct less<::nlohmann::detail::value_t>
- {
-
- bool operator()(nlohmann::detail::value_t lhs,
- nlohmann::detail::value_t rhs) const noexcept
- {
- return nlohmann::detail::operator<(lhs, rhs);
- }
- };
- #ifndef JSON_HAS_CPP_20
- template<>
- inline void swap<nlohmann::json>(nlohmann::json& j1, nlohmann::json& j2) noexcept(
- is_nothrow_move_constructible<nlohmann::json>::value&&
- is_nothrow_move_assignable<nlohmann::json>::value
- )
- {
- j1.swap(j2);
- }
- #endif
- }
- JSON_HEDLEY_NON_NULL(1)
- inline nlohmann::json operator "" _json(const char* s, std::size_t n)
- {
- return nlohmann::json::parse(s, s + n);
- }
- JSON_HEDLEY_NON_NULL(1)
- inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n)
- {
- return nlohmann::json::json_pointer(std::string(s, n));
- }
- #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
- #pragma GCC diagnostic pop
- #endif
- #if defined(__clang__)
- #pragma GCC diagnostic pop
- #endif
- #undef JSON_ASSERT
- #undef JSON_INTERNAL_CATCH
- #undef JSON_CATCH
- #undef JSON_THROW
- #undef JSON_TRY
- #undef JSON_HAS_CPP_14
- #undef JSON_HAS_CPP_17
- #undef NLOHMANN_BASIC_JSON_TPL_DECLARATION
- #undef NLOHMANN_BASIC_JSON_TPL
- #undef JSON_EXPLICIT
- #undef JSON_HEDLEY_ALWAYS_INLINE
- #undef JSON_HEDLEY_ARM_VERSION
- #undef JSON_HEDLEY_ARM_VERSION_CHECK
- #undef JSON_HEDLEY_ARRAY_PARAM
- #undef JSON_HEDLEY_ASSUME
- #undef JSON_HEDLEY_BEGIN_C_DECLS
- #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE
- #undef JSON_HEDLEY_CLANG_HAS_BUILTIN
- #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
- #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
- #undef JSON_HEDLEY_CLANG_HAS_EXTENSION
- #undef JSON_HEDLEY_CLANG_HAS_FEATURE
- #undef JSON_HEDLEY_CLANG_HAS_WARNING
- #undef JSON_HEDLEY_COMPCERT_VERSION
- #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK
- #undef JSON_HEDLEY_CONCAT
- #undef JSON_HEDLEY_CONCAT3
- #undef JSON_HEDLEY_CONCAT3_EX
- #undef JSON_HEDLEY_CONCAT_EX
- #undef JSON_HEDLEY_CONST
- #undef JSON_HEDLEY_CONSTEXPR
- #undef JSON_HEDLEY_CONST_CAST
- #undef JSON_HEDLEY_CPP_CAST
- #undef JSON_HEDLEY_CRAY_VERSION
- #undef JSON_HEDLEY_CRAY_VERSION_CHECK
- #undef JSON_HEDLEY_C_DECL
- #undef JSON_HEDLEY_DEPRECATED
- #undef JSON_HEDLEY_DEPRECATED_FOR
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
- #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
- #undef JSON_HEDLEY_DIAGNOSTIC_POP
- #undef JSON_HEDLEY_DIAGNOSTIC_PUSH
- #undef JSON_HEDLEY_DMC_VERSION
- #undef JSON_HEDLEY_DMC_VERSION_CHECK
- #undef JSON_HEDLEY_EMPTY_BASES
- #undef JSON_HEDLEY_EMSCRIPTEN_VERSION
- #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK
- #undef JSON_HEDLEY_END_C_DECLS
- #undef JSON_HEDLEY_FLAGS
- #undef JSON_HEDLEY_FLAGS_CAST
- #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE
- #undef JSON_HEDLEY_GCC_HAS_BUILTIN
- #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE
- #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
- #undef JSON_HEDLEY_GCC_HAS_EXTENSION
- #undef JSON_HEDLEY_GCC_HAS_FEATURE
- #undef JSON_HEDLEY_GCC_HAS_WARNING
- #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
- #undef JSON_HEDLEY_GCC_VERSION
- #undef JSON_HEDLEY_GCC_VERSION_CHECK
- #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE
- #undef JSON_HEDLEY_GNUC_HAS_BUILTIN
- #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
- #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
- #undef JSON_HEDLEY_GNUC_HAS_EXTENSION
- #undef JSON_HEDLEY_GNUC_HAS_FEATURE
- #undef JSON_HEDLEY_GNUC_HAS_WARNING
- #undef JSON_HEDLEY_GNUC_VERSION
- #undef JSON_HEDLEY_GNUC_VERSION_CHECK
- #undef JSON_HEDLEY_HAS_ATTRIBUTE
- #undef JSON_HEDLEY_HAS_BUILTIN
- #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE
- #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS
- #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE
- #undef JSON_HEDLEY_HAS_EXTENSION
- #undef JSON_HEDLEY_HAS_FEATURE
- #undef JSON_HEDLEY_HAS_WARNING
- #undef JSON_HEDLEY_IAR_VERSION
- #undef JSON_HEDLEY_IAR_VERSION_CHECK
- #undef JSON_HEDLEY_IBM_VERSION
- #undef JSON_HEDLEY_IBM_VERSION_CHECK
- #undef JSON_HEDLEY_IMPORT
- #undef JSON_HEDLEY_INLINE
- #undef JSON_HEDLEY_INTEL_VERSION
- #undef JSON_HEDLEY_INTEL_VERSION_CHECK
- #undef JSON_HEDLEY_IS_CONSTANT
- #undef JSON_HEDLEY_IS_CONSTEXPR_
- #undef JSON_HEDLEY_LIKELY
- #undef JSON_HEDLEY_MALLOC
- #undef JSON_HEDLEY_MESSAGE
- #undef JSON_HEDLEY_MSVC_VERSION
- #undef JSON_HEDLEY_MSVC_VERSION_CHECK
- #undef JSON_HEDLEY_NEVER_INLINE
- #undef JSON_HEDLEY_NON_NULL
- #undef JSON_HEDLEY_NO_ESCAPE
- #undef JSON_HEDLEY_NO_RETURN
- #undef JSON_HEDLEY_NO_THROW
- #undef JSON_HEDLEY_NULL
- #undef JSON_HEDLEY_PELLES_VERSION
- #undef JSON_HEDLEY_PELLES_VERSION_CHECK
- #undef JSON_HEDLEY_PGI_VERSION
- #undef JSON_HEDLEY_PGI_VERSION_CHECK
- #undef JSON_HEDLEY_PREDICT
- #undef JSON_HEDLEY_PRINTF_FORMAT
- #undef JSON_HEDLEY_PRIVATE
- #undef JSON_HEDLEY_PUBLIC
- #undef JSON_HEDLEY_PURE
- #undef JSON_HEDLEY_REINTERPRET_CAST
- #undef JSON_HEDLEY_REQUIRE
- #undef JSON_HEDLEY_REQUIRE_CONSTEXPR
- #undef JSON_HEDLEY_REQUIRE_MSG
- #undef JSON_HEDLEY_RESTRICT
- #undef JSON_HEDLEY_RETURNS_NON_NULL
- #undef JSON_HEDLEY_SENTINEL
- #undef JSON_HEDLEY_STATIC_ASSERT
- #undef JSON_HEDLEY_STATIC_CAST
- #undef JSON_HEDLEY_STRINGIFY
- #undef JSON_HEDLEY_STRINGIFY_EX
- #undef JSON_HEDLEY_SUNPRO_VERSION
- #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK
- #undef JSON_HEDLEY_TINYC_VERSION
- #undef JSON_HEDLEY_TINYC_VERSION_CHECK
- #undef JSON_HEDLEY_TI_ARMCL_VERSION
- #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK
- #undef JSON_HEDLEY_TI_CL2000_VERSION
- #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK
- #undef JSON_HEDLEY_TI_CL430_VERSION
- #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK
- #undef JSON_HEDLEY_TI_CL6X_VERSION
- #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK
- #undef JSON_HEDLEY_TI_CL7X_VERSION
- #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK
- #undef JSON_HEDLEY_TI_CLPRU_VERSION
- #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK
- #undef JSON_HEDLEY_TI_VERSION
- #undef JSON_HEDLEY_TI_VERSION_CHECK
- #undef JSON_HEDLEY_UNAVAILABLE
- #undef JSON_HEDLEY_UNLIKELY
- #undef JSON_HEDLEY_UNPREDICTABLE
- #undef JSON_HEDLEY_UNREACHABLE
- #undef JSON_HEDLEY_UNREACHABLE_RETURN
- #undef JSON_HEDLEY_VERSION
- #undef JSON_HEDLEY_VERSION_DECODE_MAJOR
- #undef JSON_HEDLEY_VERSION_DECODE_MINOR
- #undef JSON_HEDLEY_VERSION_DECODE_REVISION
- #undef JSON_HEDLEY_VERSION_ENCODE
- #undef JSON_HEDLEY_WARNING
- #undef JSON_HEDLEY_WARN_UNUSED_RESULT
- #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG
- #undef JSON_HEDLEY_FALL_THROUGH
- #endif
|