1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867 |
- //
- // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
- // Copyright (c) 2020 Krystian Stasiowski (sdkrystian@gmail.com)
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- //
- // Official repository: https://github.com/boostorg/json
- //
- #ifndef BOOST_JSON_VALUE_HPP
- #define BOOST_JSON_VALUE_HPP
- #include <boost/json/detail/config.hpp>
- #include <boost/json/array.hpp>
- #include <boost/json/kind.hpp>
- #include <boost/json/object.hpp>
- #include <boost/json/pilfer.hpp>
- #include <boost/json/set_pointer_options.hpp>
- #include <boost/json/storage_ptr.hpp>
- #include <boost/json/string.hpp>
- #include <boost/json/string_view.hpp>
- #include <boost/json/value_ref.hpp>
- #include <boost/json/detail/except.hpp>
- #include <boost/json/detail/value.hpp>
- #include <cstdlib>
- #include <cstring>
- #include <initializer_list>
- #include <iosfwd>
- #include <limits>
- #include <new>
- #include <type_traits>
- #include <utility>
- namespace boost {
- namespace json {
- //----------------------------------------------------------
- /** The type used to represent any JSON value
- This is a
- <a href="https://en.cppreference.com/w/cpp/concepts/regular"><em>Regular</em></a>
- type which works like
- a variant of the basic JSON data types: array,
- object, string, number, boolean, and null.
- @par Thread Safety
- Distinct instances may be accessed concurrently.
- Non-const member functions of a shared instance
- may not be called concurrently with any other
- member functions of that instance.
- */
- class value
- {
- #ifndef BOOST_JSON_DOCS
- using scalar = detail::scalar;
- union
- {
- storage_ptr sp_; // must come first
- array arr_;
- object obj_;
- string str_;
- scalar sca_;
- };
- #endif
- struct init_iter;
- #ifndef BOOST_JSON_DOCS
- // VFALCO doc toolchain incorrectly treats this as public
- friend struct detail::access;
- #endif
- explicit
- value(
- detail::unchecked_array&& ua)
- : arr_(std::move(ua))
- {
- }
- explicit
- value(
- detail::unchecked_object&& uo)
- : obj_(std::move(uo))
- {
- }
- value(
- detail::key_t const&,
- string_view s,
- storage_ptr sp)
- : str_(detail::key_t{}, s, std::move(sp))
- {
- }
- value(
- detail::key_t const&,
- string_view s1,
- string_view s2,
- storage_ptr sp)
- : str_(detail::key_t{}, s1, s2, std::move(sp))
- {
- }
- inline bool is_scalar() const noexcept
- {
- return sca_.k < json::kind::string;
- }
- public:
- /// Associated [Allocator](https://en.cppreference.com/w/cpp/named_req/Allocator)
- using allocator_type = container::pmr::polymorphic_allocator<value>;
- /** Destructor.
- The value and all of its contents are destroyed.
- Any dynamically allocated memory that was allocated
- internally is freed.
- @par Complexity
- Constant, or linear in size for array or object.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- ~value() noexcept;
- /** Default constructor.
- The constructed value is null,
- using the [default memory resource].
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- [default memory resource]: json/allocators/storage_ptr.html#json.allocators.storage_ptr.default_memory_resource
- */
- value() noexcept
- : sca_()
- {
- }
- /** Constructor.
- The constructed value is null, using the
- specified `boost::container::pmr::memory_resource`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- explicit
- value(storage_ptr sp) noexcept
- : sca_(std::move(sp))
- {
- }
- /** Pilfer constructor.
- The value is constructed by acquiring ownership
- of the contents of `other` using pilfer semantics.
- This is more efficient than move construction, when
- it is known that the moved-from object will be
- immediately destroyed afterwards.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param other The value to pilfer. After pilfer
- construction, `other` is not in a usable state
- and may only be destroyed.
- @see @ref pilfer,
- <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0308r0.html">
- Valueless Variants Considered Harmful</a>
- */
- value(pilfered<value> other) noexcept
- {
- relocate(this, other.get());
- ::new(&other.get().sca_) scalar();
- }
- /** Copy constructor.
- The value is constructed with a copy of the
- contents of `other`, using the same
- memory resource as `other`.
- @par Complexity
- Linear in the size of `other`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The value to copy.
- */
- value(value const& other)
- : value(other, other.storage())
- {
- }
- /** Copy constructor
- The value is constructed with a copy of the
- contents of `other`, using the
- specified memory resource.
- @par Complexity
- Linear in the size of `other`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The value to copy.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- BOOST_JSON_DECL
- value(
- value const& other,
- storage_ptr sp);
- /** Move constructor
- The value is constructed by acquiring ownership of
- the contents of `other` and shared ownership of
- `other`'s memory resource.
- @note
- After construction, the moved-from value becomes a
- null value with its current storage pointer.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param other The value to move.
- */
- BOOST_JSON_DECL
- value(value&& other) noexcept;
- /** Move constructor
- The value is constructed with the contents of
- `other` by move semantics, using the specified
- memory resource:
- @li If `*other.storage() == *sp`, ownership of
- the underlying memory is transferred in constant
- time, with no possibility of exceptions.
- After construction, the moved-from value becomes
- a null value with its current storage pointer.
- @li If `*other.storage() != *sp`, an
- element-wise copy is performed if
- `other.is_structured() == true`, which may throw.
- In this case, the moved-from value is not
- changed.
- @par Complexity
- Constant or linear in the size of `other`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The value to move.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- BOOST_JSON_DECL
- value(
- value&& other,
- storage_ptr sp);
- //------------------------------------------------------
- //
- // Conversion
- //
- //------------------------------------------------------
- /** Construct a null.
- A null value is a monostate.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- std::nullptr_t,
- storage_ptr sp = {}) noexcept
- : sca_(std::move(sp))
- {
- }
- /** Construct a bool.
- This constructs a `bool` value using
- the specified memory resource.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param b The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- #ifdef BOOST_JSON_DOCS
- value(
- bool b,
- storage_ptr sp = {}) noexcept;
- #else
- template<class T
- ,class = typename std::enable_if<
- std::is_same<T, bool>::value>::type
- >
- value(
- T b,
- storage_ptr sp = {}) noexcept
- : sca_(b, std::move(sp))
- {
- }
- #endif
- /** Construct a `std::int64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param i The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- signed char i,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::int64_t>(
- i), std::move(sp))
- {
- }
- /** Construct a `std::int64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param i The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- short i,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::int64_t>(
- i), std::move(sp))
- {
- }
- /** Construct a `std::int64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param i The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- int i,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::int64_t>(i),
- std::move(sp))
- {
- }
- /** Construct a `std::int64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param i The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- long i,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::int64_t>(i),
- std::move(sp))
- {
- }
- /** Construct a `std::int64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param i The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- long long i,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::int64_t>(i),
- std::move(sp))
- {
- }
- /** Construct a `std::uint64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param u The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- unsigned char u,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::uint64_t>(
- u), std::move(sp))
- {
- }
- /** Construct a `std::uint64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param u The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- unsigned short u,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::uint64_t>(u),
- std::move(sp))
- {
- }
- /** Construct a `std::uint64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param u The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- unsigned int u,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::uint64_t>(u),
- std::move(sp))
- {
- }
- /** Construct a `std::uint64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param u The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- unsigned long u,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::uint64_t>(u),
- std::move(sp))
- {
- }
- /** Construct a `std::uint64_t`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param u The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- unsigned long long u,
- storage_ptr sp = {}) noexcept
- : sca_(static_cast<std::uint64_t>(u),
- std::move(sp))
- {
- }
- /** Construct a `double`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param d The initial value.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- double d,
- storage_ptr sp = {}) noexcept
- : sca_(d, std::move(sp))
- {
- }
- /** Construct a @ref string.
- The string is constructed with a copy of the
- string view `s`, using the specified memory resource.
- @par Complexity
- Linear in `s.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param s The string view to construct with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- string_view s,
- storage_ptr sp = {})
- : str_(s, std::move(sp))
- {
- }
- /** Construct a @ref string.
- The string is constructed with a copy of the
- null-terminated string `s`, using the specified
- memory resource.
- @par Complexity
- Linear in `std::strlen(s)`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param s The null-terminated string to construct
- with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- char const* s,
- storage_ptr sp = {})
- : str_(s, std::move(sp))
- {
- }
- /** Construct a @ref string.
- The value is constructed from `other`, using the
- same memory resource. To transfer ownership, use `std::move`:
- @par Example
- @code
- string str = "The Boost C++ Library Collection";
- // transfer ownership
- value jv( std::move(str) );
- assert( str.empty() );
- assert( *str.storage() == *jv.storage() );
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param other The string to construct with.
- */
- value(
- string other) noexcept
- : str_(std::move(other))
- {
- }
- /** Construct a @ref string.
- The value is copy constructed from `other`,
- using the specified memory resource.
- @par Complexity
- Linear in `other.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The string to construct with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- string const& other,
- storage_ptr sp)
- : str_(
- other,
- std::move(sp))
- {
- }
- /** Construct a @ref string.
- The value is move constructed from `other`,
- using the specified memory resource.
- @par Complexity
- Constant or linear in `other.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The string to construct with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- string&& other,
- storage_ptr sp)
- : str_(
- std::move(other),
- std::move(sp))
- {
- }
- /** Construct a @ref string.
- This is the fastest way to construct
- an empty string, using the specified
- memory resource. The variable @ref string_kind
- may be passed as the first parameter
- to select this overload:
- @par Example
- @code
- // Construct an empty string
- value jv( string_kind );
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- @see @ref string_kind
- */
- value(
- string_kind_t,
- storage_ptr sp = {}) noexcept
- : str_(std::move(sp))
- {
- }
- /** Construct an @ref array.
- The value is constructed from `other`, using the
- same memory resource. To transfer ownership, use `std::move`:
- @par Example
- @code
- array arr( {1, 2, 3, 4, 5} );
- // transfer ownership
- value jv( std::move(arr) );
- assert( arr.empty() );
- assert( *arr.storage() == *jv.storage() );
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param other The array to construct with.
- */
- value(array other) noexcept
- : arr_(std::move(other))
- {
- }
- /** Construct an @ref array.
- The value is copy constructed from `other`,
- using the specified memory resource.
- @par Complexity
- Linear in `other.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The array to construct with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- array const& other,
- storage_ptr sp)
- : arr_(
- other,
- std::move(sp))
- {
- }
- /** Construct an @ref array.
- The value is move-constructed from `other`,
- using the specified memory resource.
- @par Complexity
- Constant or linear in `other.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The array to construct with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- array&& other,
- storage_ptr sp)
- : arr_(
- std::move(other),
- std::move(sp))
- {
- }
- /** Construct an @ref array.
- This is the fastest way to construct
- an empty array, using the specified
- memory resource. The variable @ref array_kind
- may be passed as the first parameter
- to select this overload:
- @par Example
- @code
- // Construct an empty array
- value jv( array_kind );
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- @see @ref array_kind
- */
- value(
- array_kind_t,
- storage_ptr sp = {}) noexcept
- : arr_(std::move(sp))
- {
- }
- /** Construct an @ref object.
- The value is constructed from `other`, using the
- same memory resource. To transfer ownership, use `std::move`:
- @par Example
- @code
- object obj( {{"a",1}, {"b",2}, {"c"},3}} );
- // transfer ownership
- value jv( std::move(obj) );
- assert( obj.empty() );
- assert( *obj.storage() == *jv.storage() );
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param other The object to construct with.
- */
- value(object other) noexcept
- : obj_(std::move(other))
- {
- }
- /** Construct an @ref object.
- The value is copy constructed from `other`,
- using the specified memory resource.
- @par Complexity
- Linear in `other.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The object to construct with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- object const& other,
- storage_ptr sp)
- : obj_(
- other,
- std::move(sp))
- {
- }
- /** Construct an @ref object.
- The value is move constructed from `other`,
- using the specified memory resource.
- @par Complexity
- Constant or linear in `other.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The object to construct with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- */
- value(
- object&& other,
- storage_ptr sp)
- : obj_(
- std::move(other),
- std::move(sp))
- {
- }
- /** Construct an @ref object.
- This is the fastest way to construct
- an empty object, using the specified
- memory resource. The variable @ref object_kind
- may be passed as the first parameter
- to select this overload:
- @par Example
- @code
- // Construct an empty object
- value jv( object_kind );
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- @see @ref object_kind
- */
- value(
- object_kind_t,
- storage_ptr sp = {}) noexcept
- : obj_(std::move(sp))
- {
- }
- /** Construct from an initializer-list
- @li If the initializer list consists of key/value
- pairs, an @ref object is created; otherwise,
- @li if the size of the initializer list is exactly 1, the object is
- constructed directly from that sole element; otherwise,
- @li an @ref array is created.
- The contents of the initializer list are copied to the newly
- constructed value using the specified memory resource.
- @par Complexity
- Linear in `init.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param init The initializer list to construct from.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The container will acquire shared ownership of the memory
- resource.
- @par Note
- The previous behavior of this constructor was to always
- construct either an @ref object or an @ref array. In practice though,
- several C++ implementations did not treat `value{x}` as a constructor
- from initializer list. This effectively resulted in different behavior
- on different implementations. <br>
- If you need the legacy behavior define macro
- `BOOST_JSON_LEGACY_INIT_LIST_BEHAVIOR` when you are building the
- library. The macro and the functionality will be deprecated in the
- future and then removed, so we urge you to change your code for the new
- behavior as soon as possible. The simplest way to create an @ref array
- with 1 element using an initializer list is via `array{x}`.
- */
- BOOST_JSON_DECL
- value(
- std::initializer_list<value_ref> init,
- storage_ptr sp = {});
- //------------------------------------------------------
- //
- // Assignment
- //
- //------------------------------------------------------
- /** Copy assignment.
- The contents of the value are replaced with an
- element-wise copy of the contents of `other`.
- @par Complexity
- Linear in the size of `*this` plus `other`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The value to copy.
- */
- BOOST_JSON_DECL
- value&
- operator=(value const& other);
- /** Move assignment.
- The contents of the value are replaced with the
- contents of `other` using move semantics:
- @li If `*other.storage() == *sp`, ownership of
- the underlying memory is transferred in constant
- time, with no possibility of exceptions.
- After assignment, the moved-from value becomes
- a null with its current storage pointer.
- @li If `*other.storage() != *sp`, an
- element-wise copy is performed if
- `other.is_structured() == true`, which may throw.
- In this case, the moved-from value is not
- changed.
- @par Complexity
- Constant, or linear in
- `this->size()` plus `other.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The value to assign from.
- */
- BOOST_JSON_DECL
- value&
- operator=(value&& other);
- /** Assignment.
- Replace `*this` with the value formed by
- constructing from `init` and `this->storage()`.
- If the initializer list consists of key/value
- pairs, the resulting @ref object is assigned.
- Otherwise an @ref array is assigned. The contents
- of the initializer list are moved to `*this`
- using the existing memory resource.
- @par Complexity
- Linear in `init.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param init The initializer list to assign from.
- */
- BOOST_JSON_DECL
- value&
- operator=(
- std::initializer_list<value_ref> init);
- /** Assignment.
- Replace `*this` with null.
- @par Exception Safety
- No-throw guarantee.
- @par Complexity
- Linear in the size of `*this`.
- */
- value&
- operator=(std::nullptr_t) noexcept
- {
- if(is_scalar())
- {
- sca_.k = json::kind::null;
- }
- else
- {
- ::new(&sca_) scalar(
- destroy());
- }
- return *this;
- }
- /** Assignment.
- Replace `*this` with `b`.
- @par Exception Safety
- No-throw guarantee.
- @par Complexity
- Linear in the size of `*this`.
- @param b The new value.
- */
- #ifdef BOOST_JSON_DOCS
- value& operator=(bool b) noexcept;
- #else
- template<class T
- ,class = typename std::enable_if<
- std::is_same<T, bool>::value>::type
- >
- value& operator=(T b) noexcept
- {
- if(is_scalar())
- {
- sca_.b = b;
- sca_.k = json::kind::bool_;
- }
- else
- {
- ::new(&sca_) scalar(
- b, destroy());
- }
- return *this;
- }
- #endif
- /** Assignment.
- Replace `*this` with `i`.
- @par Exception Safety
- No-throw guarantee.
- @par Complexity
- Linear in the size of `*this`.
- @param i The new value.
- */
- /** @{ */
- value& operator=(signed char i) noexcept
- {
- return operator=(
- static_cast<long long>(i));
- }
- value& operator=(short i) noexcept
- {
- return operator=(
- static_cast<long long>(i));
- }
- value& operator=(int i) noexcept
- {
- return operator=(
- static_cast<long long>(i));
- }
- value& operator=(long i) noexcept
- {
- return operator=(
- static_cast<long long>(i));
- }
- value& operator=(long long i) noexcept
- {
- if(is_scalar())
- {
- sca_.i = i;
- sca_.k = json::kind::int64;
- }
- else
- {
- ::new(&sca_) scalar(static_cast<
- std::int64_t>(i), destroy());
- }
- return *this;
- }
- /** @} */
- /** Assignment.
- Replace `*this` with `i`.
- @par Exception Safety
- No-throw guarantee.
- @par Complexity
- Linear in the size of `*this`.
- @param u The new value.
- */
- /** @{ */
- value& operator=(unsigned char u) noexcept
- {
- return operator=(static_cast<
- unsigned long long>(u));
- }
- value& operator=(unsigned short u) noexcept
- {
- return operator=(static_cast<
- unsigned long long>(u));
- }
- value& operator=(unsigned int u) noexcept
- {
- return operator=(static_cast<
- unsigned long long>(u));
- }
- value& operator=(unsigned long u) noexcept
- {
- return operator=(static_cast<
- unsigned long long>(u));
- }
- value& operator=(unsigned long long u) noexcept
- {
- if(is_scalar())
- {
- sca_.u = u;
- sca_.k = json::kind::uint64;
- }
- else
- {
- ::new(&sca_) scalar(static_cast<
- std::uint64_t>(u), destroy());
- }
- return *this;
- }
- /** @} */
- /** Assignment.
- Replace `*this` with `d`.
- @par Exception Safety
- No-throw guarantee.
- @par Complexity
- Linear in the size of `*this`.
- @param d The new value.
- */
- value& operator=(double d) noexcept
- {
- if(is_scalar())
- {
- sca_.d = d;
- sca_.k = json::kind::double_;
- }
- else
- {
- ::new(&sca_) scalar(
- d, destroy());
- }
- return *this;
- }
- /** Assignment.
- Replace `*this` with a copy of the string `s`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @par Complexity
- Linear in the sum of sizes of `*this` and `s`
- @param s The new string.
- */
- /** @{ */
- BOOST_JSON_DECL value& operator=(string_view s);
- BOOST_JSON_DECL value& operator=(char const* s);
- BOOST_JSON_DECL value& operator=(string const& s);
- /** @} */
- /** Assignment.
- The contents of the value are replaced with the
- contents of `s` using move semantics:
- @li If `*other.storage() == *this->storage()`,
- ownership of the underlying memory is transferred
- in constant time, with no possibility of exceptions.
- After assignment, the moved-from string becomes
- empty with its current storage pointer.
- @li If `*other.storage() != *this->storage()`, an
- element-wise copy is performed, which may throw.
- In this case, the moved-from string is not
- changed.
- @par Complexity
- Constant, or linear in the size of `*this` plus `s.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param s The string to move-assign from.
- */
- BOOST_JSON_DECL value& operator=(string&& s);
- /** Assignment.
- Replace `*this` with a copy of the array `arr`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @par Complexity
- Linear in the sum of sizes of `*this` and `arr`
- @param arr The new array.
- */
- BOOST_JSON_DECL value& operator=(array const& arr);
- /** Assignment.
- The contents of the value are replaced with the
- contents of `arr` using move semantics:
- @li If `*arr.storage() == *this->storage()`,
- ownership of the underlying memory is transferred
- in constant time, with no possibility of exceptions.
- After assignment, the moved-from array becomes
- empty with its current storage pointer.
- @li If `*arr.storage() != *this->storage()`, an
- element-wise copy is performed, which may throw.
- In this case, the moved-from array is not
- changed.
- @par Complexity
- Constant, or linear in the size of `*this` plus `arr.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param arr The array to move-assign from.
- */
- BOOST_JSON_DECL value& operator=(array&& arr);
- /** Assignment.
- Replace `*this` with a copy of the obect `obj`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @par Complexity
- Linear in the sum of sizes of `*this` and `obj`
- @param obj The new object.
- */
- BOOST_JSON_DECL value& operator=(object const& obj);
- /** Assignment.
- The contents of the value are replaced with the
- contents of `obj` using move semantics:
- @li If `*obj.storage() == *this->storage()`,
- ownership of the underlying memory is transferred
- in constant time, with no possibility of exceptions.
- After assignment, the moved-from object becomes
- empty with its current storage pointer.
- @li If `*obj.storage() != *this->storage()`, an
- element-wise copy is performed, which may throw.
- In this case, the moved-from object is not
- changed.
- @par Complexity
- Constant, or linear in the size of `*this` plus `obj.size()`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param obj The object to move-assign from.
- */
- BOOST_JSON_DECL value& operator=(object&& obj);
- //------------------------------------------------------
- //
- // Modifiers
- //
- //------------------------------------------------------
- /** Change the kind to null, discarding the previous contents.
- The value is replaced with a null,
- destroying the previous contents.
- @par Complexity
- Linear in the size of `*this`.
- @par Exception Safety
- No-throw guarantee.
- */
- void
- emplace_null() noexcept
- {
- *this = nullptr;
- }
- /** Return a reference to a `bool`, changing the kind and replacing the contents.
- The value is replaced with a `bool`
- initialized to `false`, destroying the
- previous contents.
- @par Complexity
- Linear in the size of `*this`.
- @par Exception Safety
- No-throw guarantee.
- */
- bool&
- emplace_bool() noexcept
- {
- *this = false;
- return sca_.b;
- }
- /** Return a reference to a `std::int64_t`, changing the kind and replacing the contents.
- The value is replaced with a `std::int64_t`
- initialized to zero, destroying the
- previous contents.
- @par Complexity
- Linear in the size of `*this`.
- @par Exception Safety
- No-throw guarantee.
- */
- std::int64_t&
- emplace_int64() noexcept
- {
- *this = std::int64_t{};
- return sca_.i;
- }
- /** Return a reference to a `std::uint64_t`, changing the kind and replacing the contents.
- The value is replaced with a `std::uint64_t`
- initialized to zero, destroying the
- previous contents.
- @par Complexity
- Linear in the size of `*this`.
- @par Exception Safety
- No-throw guarantee.
- */
- std::uint64_t&
- emplace_uint64() noexcept
- {
- *this = std::uint64_t{};
- return sca_.u;
- }
- /** Return a reference to a `double`, changing the kind and replacing the contents.
- The value is replaced with a `double`
- initialized to zero, destroying the
- previous contents.
- @par Complexity
- Linear in the size of `*this`.
- @par Exception Safety
- No-throw guarantee.
- */
- double&
- emplace_double() noexcept
- {
- *this = double{};
- return sca_.d;
- }
- /** Return a reference to a @ref string, changing the kind and replacing the contents.
- The value is replaced with an empty @ref string
- using the current memory resource, destroying the
- previous contents.
- @par Complexity
- Linear in the size of `*this`.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- string&
- emplace_string() noexcept;
- /** Return a reference to an @ref array, changing the kind and replacing the contents.
- The value is replaced with an empty @ref array
- using the current memory resource, destroying the
- previous contents.
- @par Complexity
- Linear in the size of `*this`.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- array&
- emplace_array() noexcept;
- /** Return a reference to an @ref object, changing the kind and replacing the contents.
- The contents are replaced with an empty @ref object using the current
- `boost::container::pmr::memory_resource`. All previously obtained
- iterators and references obtained beforehand are invalidated.
- @par Complexity
- Linear in the size of `*this`.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- object&
- emplace_object() noexcept;
- /** Swap the given values.
- Exchanges the contents of this value with another value. Ownership of
- the respective `boost::container::pmr::memory_resource` objects is not
- transferred:
- @li If `*other.storage() == *this->storage()`,
- ownership of the underlying memory is swapped in
- constant time, with no possibility of exceptions.
- All iterators and references remain valid.
- @li If `*other.storage() != *this->storage()`,
- the contents are logically swapped by making copies,
- which can throw. In this case all iterators and
- references are invalidated.
- @par Complexity
- Constant or linear in the sum of the sizes of
- the values.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The value to swap with.
- If `this == &other`, this function call has no effect.
- */
- BOOST_JSON_DECL
- void
- swap(value& other);
- /** Swap the given values.
- Exchanges the contents of value `lhs` with another value `rhs`.
- Ownership of the respective `boost::container::pmr::memory_resource`
- objects is not transferred.
- @li If `*lhs.storage() == *rhs.storage()`,
- ownership of the underlying memory is swapped in
- constant time, with no possibility of exceptions.
- All iterators and references remain valid.
- @li If `*lhs.storage() != *rhs.storage`,
- the contents are logically swapped by a copy,
- which can throw. In this case all iterators and
- references are invalidated.
- @par Effects
- @code
- lhs.swap( rhs );
- @endcode
- @par Complexity
- Constant or linear in the sum of the sizes of
- the values.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param lhs The value to exchange.
- @param rhs The value to exchange.
- If `&lhs == &rhs`, this function call has no effect.
- @see @ref value::swap
- */
- friend
- void
- swap(value& lhs, value& rhs)
- {
- lhs.swap(rhs);
- }
- //------------------------------------------------------
- //
- // Observers
- //
- //------------------------------------------------------
- /** Returns the kind of this JSON value.
- This function returns the discriminating
- enumeration constant of type @ref json::kind
- corresponding to the underlying representation
- stored in the container.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- json::kind
- kind() const noexcept
- {
- return static_cast<json::kind>(
- static_cast<unsigned char>(
- sca_.k) & 0x3f);
- }
- /** Return `true` if this is an array
- This function is used to determine if the underlying
- representation is a certain kind.
- @par Effects
- @code
- return this->kind() == kind::array;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_array() const noexcept
- {
- return kind() == json::kind::array;
- }
- /** Return `true` if this is an object
- This function is used to determine if the underlying
- representation is a certain kind.
- @par Effects
- @code
- return this->kind() == kind::object;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_object() const noexcept
- {
- return kind() == json::kind::object;
- }
- /** Return `true` if this is a string
- This function is used to determine if the underlying
- representation is a certain kind.
- @par Effects
- @code
- return this->kind() == kind::string;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_string() const noexcept
- {
- return kind() == json::kind::string;
- }
- /** Return `true` if this is a signed integer
- This function is used to determine if the underlying
- representation is a certain kind.
- @par Effects
- @code
- return this->kind() == kind::int64;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_int64() const noexcept
- {
- return kind() == json::kind::int64;
- }
- /** Return `true` if this is a unsigned integer
- This function is used to determine if the underlying
- representation is a certain kind.
- @par Effects
- @code
- return this->kind() == kind::uint64;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_uint64() const noexcept
- {
- return kind() == json::kind::uint64;
- }
- /** Return `true` if this is a double
- This function is used to determine if the underlying
- representation is a certain kind.
- @par Effects
- @code
- return this->kind() == kind::double_;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_double() const noexcept
- {
- return kind() == json::kind::double_;
- }
- /** Return `true` if this is a bool
- This function is used to determine if the underlying
- representation is a certain kind.
- @par Effects
- @code
- return this->kind() == kind::bool_;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_bool() const noexcept
- {
- return kind() == json::kind::bool_;
- }
- /** Returns true if this is a null.
- This function is used to determine if the underlying
- representation is a certain kind.
- @par Effects
- @code
- return this->kind() == kind::null;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_null() const noexcept
- {
- return kind() == json::kind::null;
- }
- /** Returns true if this is an array or object.
- This function returns `true` if
- @ref kind() is either `kind::object` or
- `kind::array`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_structured() const noexcept
- {
- // VFALCO Could use bit 0x20 for this
- return
- kind() == json::kind::object ||
- kind() == json::kind::array;
- }
- /** Returns true if this is not an array or object.
- This function returns `true` if
- @ref kind() is neither `kind::object` nor
- `kind::array`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_primitive() const noexcept
- {
- // VFALCO Could use bit 0x20 for this
- return
- sca_.k != json::kind::object &&
- sca_.k != json::kind::array;
- }
- /** Returns true if this is a number.
- This function returns `true` when
- @ref kind() is one of the following values:
- `kind::int64`, `kind::uint64`, or
- `kind::double_`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- is_number() const noexcept
- {
- // VFALCO Could use bit 0x40 for this
- return
- kind() == json::kind::int64 ||
- kind() == json::kind::uint64 ||
- kind() == json::kind::double_;
- }
- //------------------------------------------------------
- /** Return an @ref array pointer if this is an array, else return `nullptr`
- If `this->kind() == kind::array`, returns a pointer
- to the underlying array. Otherwise, returns `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_array() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- array const*
- if_array() const noexcept
- {
- if(kind() == json::kind::array)
- return &arr_;
- return nullptr;
- }
- /** Return an @ref array pointer if this is an array, else return `nullptr`
- If `this->kind() == kind::array`, returns a pointer
- to the underlying array. Otherwise, returns `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_array() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- array*
- if_array() noexcept
- {
- if(kind() == json::kind::array)
- return &arr_;
- return nullptr;
- }
- /** Return an @ref object pointer if this is an object, else return `nullptr`
- If `this->kind() == kind::object`, returns a pointer
- to the underlying object. Otherwise, returns `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_object() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- object const*
- if_object() const noexcept
- {
- if(kind() == json::kind::object)
- return &obj_;
- return nullptr;
- }
- /** Return an @ref object pointer if this is an object, else return `nullptr`
- If `this->kind() == kind::object`, returns a pointer
- to the underlying object. Otherwise, returns `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_object() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- object*
- if_object() noexcept
- {
- if(kind() == json::kind::object)
- return &obj_;
- return nullptr;
- }
- /** Return a @ref string pointer if this is a string, else return `nullptr`
- If `this->kind() == kind::string`, returns a pointer
- to the underlying object. Otherwise, returns `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_string() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- string const*
- if_string() const noexcept
- {
- if(kind() == json::kind::string)
- return &str_;
- return nullptr;
- }
- /** Return a @ref string pointer if this is a string, else return `nullptr`
- If `this->kind() == kind::string`, returns a pointer
- to the underlying object. Otherwise, returns `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_string() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- string*
- if_string() noexcept
- {
- if(kind() == json::kind::string)
- return &str_;
- return nullptr;
- }
- /** Return an `int64_t` pointer if this is a signed integer, else return `nullptr`
- If `this->kind() == kind::int64`, returns a pointer
- to the underlying integer. Otherwise, returns `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_int64() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- std::int64_t const*
- if_int64() const noexcept
- {
- if(kind() == json::kind::int64)
- return &sca_.i;
- return nullptr;
- }
- /** Return an `int64_t` pointer if this is a signed integer, else return `nullptr`
- If `this->kind() == kind::int64`, returns a pointer
- to the underlying integer. Otherwise, returns `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_int64() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- std::int64_t*
- if_int64() noexcept
- {
- if(kind() == json::kind::int64)
- return &sca_.i;
- return nullptr;
- }
- /** Return a `uint64_t` pointer if this is an unsigned integer, else return `nullptr`
- If `this->kind() == kind::uint64`, returns a pointer
- to the underlying unsigned integer. Otherwise, returns
- `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_uint64() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- std::uint64_t const*
- if_uint64() const noexcept
- {
- if(kind() == json::kind::uint64)
- return &sca_.u;
- return nullptr;
- }
- /** Return a `uint64_t` pointer if this is an unsigned integer, else return `nullptr`
- If `this->kind() == kind::uint64`, returns a pointer
- to the underlying unsigned integer. Otherwise, returns
- `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_uint64() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- std::uint64_t*
- if_uint64() noexcept
- {
- if(kind() == json::kind::uint64)
- return &sca_.u;
- return nullptr;
- }
- /** Return a `double` pointer if this is a double, else return `nullptr`
- If `this->kind() == kind::double_`, returns a pointer
- to the underlying double. Otherwise, returns
- `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_double() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- double const*
- if_double() const noexcept
- {
- if(kind() == json::kind::double_)
- return &sca_.d;
- return nullptr;
- }
- /** Return a `double` pointer if this is a double, else return `nullptr`
- If `this->kind() == kind::double_`, returns a pointer
- to the underlying double. Otherwise, returns
- `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_double() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- double*
- if_double() noexcept
- {
- if(kind() == json::kind::double_)
- return &sca_.d;
- return nullptr;
- }
- /** Return a `bool` pointer if this is a boolean, else return `nullptr`
- If `this->kind() == kind::bool_`, returns a pointer
- to the underlying boolean. Otherwise, returns
- `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_bool() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool const*
- if_bool() const noexcept
- {
- if(kind() == json::kind::bool_)
- return &sca_.b;
- return nullptr;
- }
- /** Return a `bool` pointer if this is a boolean, else return `nullptr`
- If `this->kind() == kind::bool_`, returns a pointer
- to the underlying boolean. Otherwise, returns
- `nullptr`.
- @par Example
- The return value is used in both a boolean context and
- to assign a variable:
- @code
- if( auto p = jv.if_bool() )
- return *p;
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool*
- if_bool() noexcept
- {
- if(kind() == json::kind::bool_)
- return &sca_.b;
- return nullptr;
- }
- //------------------------------------------------------
- /** Return the stored number cast to an arithmetic type.
- This function attempts to return the stored value
- converted to the arithmetic type `T` which may not
- be `bool`:
- @li If `T` is an integral type and the stored
- value is a number which can be losslessly converted,
- the conversion is performed without error and the
- converted number is returned.
- @li If `T` is an integral type and the stored value
- is a number which cannot be losslessly converted,
- then the operation fails with an error.
- @li If `T` is a floating point type and the stored
- value is a number, the conversion is performed
- without error. The converted number is returned,
- with a possible loss of precision.
- @li Otherwise, if the stored value is not a number;
- that is, if `this->is_number()` returns `false`, then
- the operation fails with an error.
- @par Constraints
- @code
- std::is_arithmetic< T >::value && ! std::is_same< T, bool >::value
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @return The converted number.
- @param ec Set to the error, if any occurred.
- */
- /** @{ */
- template<class T>
- #ifdef BOOST_JSON_DOCS
- T
- #else
- typename std::enable_if<
- std::is_arithmetic<T>::value &&
- ! std::is_same<T, bool>::value,
- T>::type
- #endif
- to_number(system::error_code& ec) const noexcept
- {
- error e;
- auto result = to_number<T>(e);
- BOOST_JSON_FAIL(ec, e);
- return result;
- }
- template<class T>
- #ifdef BOOST_JSON_DOCS
- T
- #else
- typename std::enable_if<
- std::is_arithmetic<T>::value &&
- ! std::is_same<T, bool>::value,
- T>::type
- #endif
- to_number(std::error_code& ec) const noexcept
- {
- system::error_code jec;
- auto result = to_number<T>(jec);
- ec = jec;
- return result;
- }
- /** @} */
- /** Return the stored number as `boost::system::result<T>`.
- This function attempts to return the stored value converted to the
- arithmetic type `T` which may not be `bool`:
- @li If `T` is an integral type and the stored value is a number which
- can be losslessly converted, the conversion is performed without
- error and `result<T>` containing the converted number is returned.
- @li If `T` is an integral type and the stored value is a number which
- cannot be losslessly converted, then `result<T>` containing the
- corresponding `error_code` is returned.
- @li If `T` is a floating point type and the stored value is a number,
- the conversion is performed without error. `result<T>` containing
- the converted number, with a possible loss of precision, is
- returned.
- @li Otherwise, if the stored value is not a number; that is, if
- `this->is_number()` returns `false`, then `result<T>` containing
- the corresponding `error_code` is returned.
- @par Constraints
- @code
- std::is_arithmetic< T >::value && ! std::is_same< T, bool >::value
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @return `boost::system::result<T>` with either the converted number or
- an `error_code`.
- */
- template<class T>
- #ifdef BOOST_JSON_DOCS
- system::result<T>
- #else
- typename std::enable_if<
- std::is_arithmetic<T>::value && ! std::is_same<T, bool>::value,
- system::result<T>
- >::type
- #endif
- try_to_number() const noexcept
- {
- system::error_code ec;
- T result = to_number<T>(ec);
- if( ec )
- return {system::in_place_error, ec};
- return {system::in_place_value, result};
- }
- /** Return the stored number cast to an arithmetic type.
- This function attempts to return the stored value
- converted to the arithmetic type `T` which may not
- be `bool`:
- @li If `T` is an integral type and the stored
- value is a number which can be losslessly converted,
- the conversion is performed without error and the
- converted number is returned.
- @li If `T` is an integral type and the stored value
- is a number which cannot be losslessly converted,
- then the operation fails with an error.
- @li If `T` is a floating point type and the stored
- value is a number, the conversion is performed
- without error. The converted number is returned,
- with a possible loss of precision.
- @li Otherwise, if the stored value is not a number;
- that is, if `this->is_number()` returns `false`, then
- the operation fails with an error.
- @par Constraints
- @code
- std::is_arithmetic< T >::value && ! std::is_same< T, bool >::value
- @endcode
- @par Complexity
- Constant.
- @return The converted number.
- @throw `boost::system::system_error` Thrown on error.
- */
- template<class T>
- #ifdef BOOST_JSON_DOCS
- T
- #else
- typename std::enable_if<
- std::is_arithmetic<T>::value &&
- ! std::is_same<T, bool>::value,
- T>::type
- #endif
- to_number() const
- {
- return try_to_number<T>().value();
- }
- //------------------------------------------------------
- //
- // Accessors
- //
- //------------------------------------------------------
- /** Return the associated memory resource.
- This function returns the `boost::container::pmr::memory_resource` used
- by the container.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- storage_ptr const&
- storage() const noexcept
- {
- return sp_;
- }
- /** Return the associated allocator.
- This function returns an instance of @ref allocator_type constructed
- from the associated `boost::container::pmr::memory_resource`.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- allocator_type
- get_allocator() const noexcept
- {
- return sp_.get();
- }
- //------------------------------------------------------
- /** Return `result` with a reference to the underlying @ref array
- If @ref is_array() is `true`, the result contains a reference to the
- underlying @ref array, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_array() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_array().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- /** @{ */
- BOOST_JSON_DECL
- system::result<array&>
- try_as_array() noexcept;
- BOOST_JSON_DECL
- system::result<array const&>
- try_as_array() const noexcept;
- /** @} */
- /** Return `result` with a reference to the underlying @ref object
- If @ref is_object() is `true`, the result contains a reference to the
- underlying @ref object, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_object() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_object().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- /** @{ */
- BOOST_JSON_DECL
- system::result<object&>
- try_as_object() noexcept;
- BOOST_JSON_DECL
- system::result<object const&>
- try_as_object() const noexcept;
- /** @} */
- /** Return `result` with a reference to the underlying @ref string
- If @ref is_string() is `true`, the result contains a reference to the
- underlying @ref string, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_string() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_string().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- /** @{ */
- BOOST_JSON_DECL
- system::result<string&>
- try_as_string() noexcept;
- BOOST_JSON_DECL
- system::result<string const&>
- try_as_string() const noexcept;
- /** @} */
- /** Return `result` with a reference to the underlying `std::int64_t`
- If @ref is_int64() is `true`, the result contains a reference to the
- underlying `std::int64_t`, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_int64() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_int64().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- system::result<std::int64_t&>
- try_as_int64() noexcept;
- /** Return `result` with the underlying `std::int64_t`
- If @ref is_int64() is `true`, the result contains a copy of the
- underlying `std::int64_t`, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_int64() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_int64().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- system::result<std::int64_t>
- try_as_int64() const noexcept;
- /** Return `result` with a reference to the underlying `std::uint64_t`
- If @ref is_uint64() is `true`, the result contains a reference to the
- underlying `std::uint64_t`, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_uint64() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_uint64().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- system::result<std::uint64_t&>
- try_as_uint64() noexcept;
- /** Return `result` with the underlying `std::uint64_t`
- If @ref is_uint64() is `true`, the result contains a copy of the
- underlying `std::uint64_t`, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_uint64() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_uint64().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- system::result<std::uint64_t>
- try_as_uint64() const noexcept;
- /** Return `result` with a reference to the underlying `double`
- If @ref is_double() is `true`, the result contains a reference to the
- underlying `double`, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_double() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_double().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- system::result<double&>
- try_as_double() noexcept;
- /** Return `result` with the underlying `double`
- If @ref is_double() is `true`, the result contains a copy of the
- underlying `double`, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_double() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_double().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- system::result<double>
- try_as_double() const noexcept;
- /** Return `result` with a reference to the underlying `bool`
- If @ref is_bool() is `true`, the result contains a reference to the
- underlying `bool`, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_bool() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_bool().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- system::result<bool&>
- try_as_bool() noexcept;
- /** Return `result` with the underlying `bool`
- If @ref is_bool() is `true`, the result contains a copy of the
- underlying `bool`, otherwise it contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_bool() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_bool().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- system::result<bool>
- try_as_bool() const noexcept;
- /** Return engaged `result` if the `value` is null
- If @ref is_null() is `true`, the result is engaged, otherwise it
- contains an `error_code`.
- @par Example
- The return value can be used in both a boolean context and
- to assign a variable:
- @code
- if( auto r = jv.try_as_null() )
- return *r;
- @endcode
- But can also be used to throw an exception on error:
- @code
- return jv.try_as_null().value();
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- BOOST_JSON_DECL
- system::result<std::nullptr_t>
- try_as_null() const noexcept;
- //------------------------------------------------------
- /** Return a reference to the underlying `object`, or throw an exception.
- If @ref is_object() is `true`, returns
- a reference to the underlying @ref object,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_object()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- */
- /** @{ */
- object&
- as_object(source_location const& loc = BOOST_CURRENT_LOCATION) &
- {
- auto& self = const_cast<value const&>(*this);
- return const_cast<object&>( self.as_object(loc) );
- }
- object&&
- as_object(source_location const& loc = BOOST_CURRENT_LOCATION) &&
- {
- return std::move( as_object(loc) );
- }
- BOOST_JSON_DECL
- object const&
- as_object(source_location const& loc = BOOST_CURRENT_LOCATION) const&;
- /** @} */
- /** Return a reference to the underlying @ref array, or throw an exception.
- If @ref is_array() is `true`, returns
- a reference to the underlying @ref array,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_array()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- */
- /** @{ */
- array&
- as_array(source_location const& loc = BOOST_CURRENT_LOCATION) &
- {
- auto& self = const_cast<value const&>(*this);
- return const_cast<array&>( self.as_array(loc) );
- }
- array&&
- as_array(source_location const& loc = BOOST_CURRENT_LOCATION) &&
- {
- return std::move( as_array(loc) );
- }
- BOOST_JSON_DECL
- array const&
- as_array(source_location const& loc = BOOST_CURRENT_LOCATION) const&;
- /** @} */
- /** Return a reference to the underlying `string`, or throw an exception.
- If @ref is_string() is `true`, returns
- a reference to the underlying @ref string,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_string()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- */
- string&
- as_string(source_location const& loc = BOOST_CURRENT_LOCATION) &
- {
- auto& self = const_cast<value const&>(*this);
- return const_cast<string&>( self.as_string(loc) );
- }
- /** Return a reference to the underlying `string`, or throw an exception.
- If @ref is_string() is `true`, returns
- a reference to the underlying @ref string,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_string()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- */
- /** @{ */
- string&&
- as_string(source_location const& loc = BOOST_CURRENT_LOCATION) &&
- {
- return std::move( as_string(loc) );
- }
- BOOST_JSON_DECL
- string const&
- as_string(source_location const& loc = BOOST_CURRENT_LOCATION) const&;
- BOOST_JSON_DECL
- std::int64_t&
- as_int64(source_location const& loc = BOOST_CURRENT_LOCATION);
- /** @} */
- /** Return the underlying `std::int64_t`, or throw an exception.
- If @ref is_int64() is `true`, returns
- the underlying `std::int64_t`,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_int64()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- @par Note
- This function is the const-qualified overload of @ref as_int64, which
- is intended for direct access to the underlying object, __if__ it has
- the type `std::int64_t`. It does not convert the underlying object to
- type `std::int64_t` even if a lossless conversion is possible. If you
- are not sure which kind your `value` has, and you only care about
- getting a `std::int64_t` number, consider using @ref to_number instead.
- */
- BOOST_JSON_DECL
- std::int64_t
- as_int64(source_location const& loc = BOOST_CURRENT_LOCATION) const;
- /** Return a reference to the underlying `std::uint64_t`, or throw an exception.
- If @ref is_uint64() is `true`, returns
- a reference to the underlying `std::uint64_t`,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_uint64()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- @par Note
- This function is intended for direct access to the underlying object,
- __if__ it has the type `std::uint64_t`. It does not convert the
- underlying object to type `std::uint64_t` even if a lossless conversion
- is possible. If you are not sure which kind your `value` has, and you
- only care about getting a `std::uint64_t` number, consider using
- @ref to_number instead.
- */
- BOOST_JSON_DECL
- std::uint64_t&
- as_uint64(source_location const& loc = BOOST_CURRENT_LOCATION);
- /** Return the underlying `std::uint64_t`, or throw an exception.
- If @ref is_uint64() is `true`, returns
- the underlying `std::uint64_t`,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_uint64()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- @par Note
- This function is the const-qualified overload of @ref as_uint64, which
- is intended for direct access to the underlying object, __if__ it has
- the type `std::uint64_t`. It does not convert the underlying object to
- type `std::uint64_t` even if a lossless conversion is possible. If you
- are not sure which kind your `value` has, and you only care about
- getting a `std::uint64_t` number, consider using
- @ref to_number instead.
- */
- BOOST_JSON_DECL
- std::uint64_t
- as_uint64(source_location const& loc = BOOST_CURRENT_LOCATION) const;
- /** Return a reference to the underlying `double`, or throw an exception.
- If @ref is_double() is `true`, returns
- a reference to the underlying `double`,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_double()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- @par Note
- This function is intended for direct access to the underlying object,
- __if__ it has the type `double`. It does not convert the underlying
- object to type `double` even if a lossless conversion is possible. If
- you are not sure which kind your `value` has, and you only care about
- getting a `double` number, consider using @ref to_number instead.
- */
- BOOST_JSON_DECL
- double&
- as_double(source_location const& loc = BOOST_CURRENT_LOCATION);
- /** Return the underlying `double`, or throw an exception.
- If @ref is_double() is `true`, returns
- the underlying `double`,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_double()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- @par Note
- This function is the const-qualified overload of @ref as_double, which
- is intended for direct access to the underlying object, __if__ it has
- the type `double`. It does not convert the underlying object to type
- `double` even if a lossless conversion is possible. If you are not sure
- which kind your `value` has, and you only care about getting a `double`
- number, consider using @ref to_number instead.
- */
- BOOST_JSON_DECL
- double
- as_double(source_location const& loc = BOOST_CURRENT_LOCATION) const;
- /** Return a reference to the underlying `bool`, or throw an exception.
- If @ref is_bool() is `true`, returns
- a reference to the underlying `bool`,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_bool()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- */
- BOOST_JSON_DECL
- bool&
- as_bool(source_location const& loc = BOOST_CURRENT_LOCATION);
- /** Return the underlying `bool`, or throw an exception.
- If @ref is_bool() is `true`, returns
- the underlying `bool`,
- otherwise throws an exception.
- @par Exception Safety
- Strong guarantee.
- @throw `boost::system::system_error` `! this->is_bool()`.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @par Complexity
- Constant.
- */
- BOOST_JSON_DECL
- bool
- as_bool(source_location const& loc = BOOST_CURRENT_LOCATION) const;
- //------------------------------------------------------
- /** Return a reference to the underlying `object`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_object()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- /** @{ */
- object&
- get_object() & noexcept
- {
- BOOST_ASSERT(is_object());
- return obj_;
- }
- object&&
- get_object() && noexcept
- {
- BOOST_ASSERT(is_object());
- return std::move(obj_);
- }
- object const&
- get_object() const& noexcept
- {
- BOOST_ASSERT(is_object());
- return obj_;
- }
- /** @} */
- /** Return a reference to the underlying `array`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_array()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- /** @{ */
- array&
- get_array() & noexcept
- {
- BOOST_ASSERT(is_array());
- return arr_;
- }
- array&&
- get_array() && noexcept
- {
- BOOST_ASSERT(is_array());
- return std::move(arr_);
- }
- array const&
- get_array() const& noexcept
- {
- BOOST_ASSERT(is_array());
- return arr_;
- }
- /** @} */
- /** Return a reference to the underlying `string`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_string()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- /** @{ */
- string&
- get_string() & noexcept
- {
- BOOST_ASSERT(is_string());
- return str_;
- }
- string&&
- get_string() && noexcept
- {
- BOOST_ASSERT(is_string());
- return std::move(str_);
- }
- string const&
- get_string() const& noexcept
- {
- BOOST_ASSERT(is_string());
- return str_;
- }
- /** @} */
- /** Return a reference to the underlying `std::int64_t`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_int64()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- std::int64_t&
- get_int64() noexcept
- {
- BOOST_ASSERT(is_int64());
- return sca_.i;
- }
- /** Return the underlying `std::int64_t`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_int64()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- std::int64_t
- get_int64() const noexcept
- {
- BOOST_ASSERT(is_int64());
- return sca_.i;
- }
- /** Return a reference to the underlying `std::uint64_t`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_uint64()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- std::uint64_t&
- get_uint64() noexcept
- {
- BOOST_ASSERT(is_uint64());
- return sca_.u;
- }
- /** Return the underlying `std::uint64_t`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_uint64()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- std::uint64_t
- get_uint64() const noexcept
- {
- BOOST_ASSERT(is_uint64());
- return sca_.u;
- }
- /** Return a reference to the underlying `double`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_double()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- double&
- get_double() noexcept
- {
- BOOST_ASSERT(is_double());
- return sca_.d;
- }
- /** Return the underlying `double`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_double()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- double
- get_double() const noexcept
- {
- BOOST_ASSERT(is_double());
- return sca_.d;
- }
- /** Return a reference to the underlying `bool`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_bool()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool&
- get_bool() noexcept
- {
- BOOST_ASSERT(is_bool());
- return sca_.b;
- }
- /** Return the underlying `bool`, without checking.
- This is the fastest way to access the underlying
- representation when the kind is known in advance.
- @par Preconditions
- @code
- this->is_bool()
- @endcode
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- bool
- get_bool() const noexcept
- {
- BOOST_ASSERT(is_bool());
- return sca_.b;
- }
- //------------------------------------------------------
- /** Access an element, with bounds checking.
- Returns `boost::system::result` containing a reference to the element
- of the underlying object, if `pos` is within its range. If `pos` is
- outside of that range, or the underlying value is not an object the
- result contains an `error_code`.
- @par Exception Safety
- No-throw guarantee.
- @param key The key of the element to find.
- @par Complexity
- Constant.
- */
- /** @{ */
- BOOST_JSON_DECL
- boost::system::result<value&>
- try_at(string_view key) noexcept;
- BOOST_JSON_DECL
- boost::system::result<value const&>
- try_at(string_view key) const noexcept;
- /** @} */
- /** Access an element, with bounds checking.
- This function is used to access elements of
- the underlying object, or throw an exception
- if the value is not an object.
- @par Complexity
- Constant.
- @par Exception Safety
- Strong guarantee.
- @param key The key of the element to find.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @return `this->as_object(loc).at( key, loc )`.
- */
- /** @{ */
- value&
- at(string_view key, source_location const& loc = BOOST_CURRENT_LOCATION) &
- {
- return as_object(loc).at(key, loc);
- }
- value&&
- at(string_view key, source_location const& loc = BOOST_CURRENT_LOCATION) &&
- {
- return std::move( as_object(loc) ).at(key, loc);
- }
- value const&
- at(
- string_view key,
- source_location const& loc = BOOST_CURRENT_LOCATION) const&
- {
- return as_object(loc).at(key, loc);
- }
- /** @} */
- /** Access an element, with bounds checking.
- Returns `boost::system::result` containing a reference to the element
- of the underlying array, if `pos` is within its range. If `pos` is
- outside of that range, or the underlying value is not an array the
- result contains an `error_code`.
- @par Exception Safety
- No-throw guarantee.
- @param pos A zero-based array index.
- @par Complexity
- Constant.
- */
- /** @{ */
- BOOST_JSON_DECL
- boost::system::result<value&>
- try_at(std::size_t pos) noexcept;
- BOOST_JSON_DECL
- boost::system::result<value const&>
- try_at(std::size_t pos) const noexcept;
- /** @} */
- /** Access an element, with bounds checking.
- This function is used to access elements of
- the underlying array, or throw an exception
- if the value is not an array.
- @par Complexity
- Constant.
- @par Exception Safety
- Strong guarantee.
- @param pos A zero-based array index.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @return `this->as_array(loc).at( pos, loc )`.
- */
- /** @{ */
- value &
- at(std::size_t pos, source_location const& loc = BOOST_CURRENT_LOCATION) &
- {
- return as_array(loc).at(pos, loc);
- }
- value&&
- at(std::size_t pos, source_location const& loc = BOOST_CURRENT_LOCATION) &&
- {
- return std::move( as_array(loc) ).at(pos, loc);
- }
- value const&
- at(
- std::size_t pos,
- source_location const& loc = BOOST_CURRENT_LOCATION) const&
- {
- return as_array(loc).at(pos, loc);
- }
- /** @} */
- /** Access an element via JSON Pointer.
- This function is used to access a (potentially nested) element of the
- value using a JSON Pointer string.
- @par Complexity
- Linear in the sizes of `ptr` and underlying array, object, or string.
- @par Exception Safety
- No-throw guarantee.
- @param ptr JSON Pointer string.
- @return `boost::system::result<value&>` containing either a reference
- to the element identified by `ptr` or a corresponding `error_code`.
- @see
- [RFC 6901 - JavaScript Object Notation (JSON) Pointer](https://datatracker.ietf.org/doc/html/rfc6901).
- */
- BOOST_JSON_DECL
- system::result<value const&>
- try_at_pointer(string_view ptr) const noexcept;
- /** Access an element via JSON Pointer.
- This function is used to access a (potentially nested) element of the
- value using a JSON Pointer string.
- @par Complexity
- Linear in the sizes of `ptr` and underlying array, object, or string.
- @par Exception Safety
- No-throw guarantee.
- @param ptr JSON Pointer string.
- @return `boost::system::result<value const&>` containing either a
- reference to the element identified by `ptr` or a corresponding
- `error_code`.
- @see
- [RFC 6901 - JavaScript Object Notation (JSON) Pointer](https://datatracker.ietf.org/doc/html/rfc6901).
- */
- BOOST_JSON_DECL
- system::result<value&>
- try_at_pointer(string_view ptr) noexcept;
- /** Access an element via JSON Pointer.
- This function is used to access a (potentially nested)
- element of the value using a JSON Pointer string.
- @par Complexity
- Linear in the sizes of `ptr` and underlying array, object, or string.
- @par Exception Safety
- Strong guarantee.
- @param ptr JSON Pointer string.
- @param loc `source_location` to use in thrown exception; the source
- location of the call site by default.
- @return reference to the element identified by `ptr`.
- @throw `boost::system::system_error` if an error occurs.
- @see
- <a href="https://datatracker.ietf.org/doc/html/rfc6901">
- RFC 6901 - JavaScript Object Notation (JSON) Pointer</a>
- */
- /** @{ */
- BOOST_JSON_DECL
- value const&
- at_pointer(
- string_view ptr,
- source_location const& loc = BOOST_CURRENT_LOCATION) const&;
- inline
- value&&
- at_pointer(
- string_view ptr,
- source_location const& loc = BOOST_CURRENT_LOCATION) &&;
- inline
- value&
- at_pointer(
- string_view ptr,
- source_location const& loc = BOOST_CURRENT_LOCATION) &;
- /** @} */
- /** Access an element via JSON Pointer.
- This function is used to access a (potentially nested)
- element of the value using a JSON Pointer string.
- @par Complexity
- Linear in the sizes of `ptr` and underlying array, object, or string.
- @par Exception Safety
- No-throw guarantee.
- @param ptr JSON Pointer string.
- @param ec Set to the error, if any occurred.
- @return pointer to the element identified by `ptr`.
- @see
- <a href="https://datatracker.ietf.org/doc/html/rfc6901">
- RFC 6901 - JavaScript Object Notation (JSON) Pointer</a>
- */
- /** @{ */
- BOOST_JSON_DECL
- value const*
- find_pointer(string_view ptr, system::error_code& ec) const noexcept;
- BOOST_JSON_DECL
- value*
- find_pointer(string_view ptr, system::error_code& ec) noexcept;
- BOOST_JSON_DECL
- value const*
- find_pointer(string_view ptr, std::error_code& ec) const noexcept;
- BOOST_JSON_DECL
- value*
- find_pointer(string_view ptr, std::error_code& ec) noexcept;
- /** @} */
- //------------------------------------------------------
- /** Set an element via JSON Pointer.
- This function is used to insert or assign to a potentially nested
- element of the value using a JSON Pointer string. The function may
- create intermediate elements corresponding to pointer segments.
- <br/>
- The particular conditions when and what kind of intermediate element
- is created is governed by the `ptr` parameter.
- Each pointer token is considered in sequence. For each token
- - if the containing value is an @ref object, then a new `null`
- element is created with key equal to unescaped token string;
- otherwise
- - if the containing value is an @ref array, and the token represents a
- past-the-end marker, then a `null` element is appended to the array;
- otherwise
- - if the containing value is an @ref array, and the token represents a
- number, then if the difference between the number and array's size
- is smaller than `opts.max_created_elements`, then the size of the
- array is increased, so that the number can reference an element in the
- array; otherwise
- - if the containing value is of different @ref kind and
- `opts.replace_any_scalar` is `true`, or the value is `null`, then
- - if `opts.create_arrays` is `true` and the token either represents
- past-the-end marker or a number, then the value is replaced with
- an empty array and the token is considered again; otherwise
- - if `opts.create_objects` is `true`, then the value is replaced
- with an empty object and the token is considered again; otherwise
- - an error is produced.
- @par Complexity
- Linear in the sum of size of `ptr`, size of underlying array, object,
- or string and `opts.max_created_elements`.
- @par Exception Safety
- Basic guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param sv JSON Pointer string.
- @param ref The value to assign to pointed element.
- @param opts The options for the algorithm.
- @return `boost::json::result<value&>` containing either a reference to
- the element identified by `ptr` or a corresponding `error_code`.
- @see
- @ref set_pointer_options,
- [RFC 6901 - JavaScript Object Notation (JSON) Pointer](https://datatracker.ietf.org/doc/html/rfc6901).
- */
- BOOST_JSON_DECL
- system::result<value&>
- try_set_at_pointer(
- string_view sv,
- value_ref ref,
- set_pointer_options const& opts = {} );
- /** Set an element via JSON Pointer.
- This function is used to insert or assign to a potentially nested
- element of the value using a JSON Pointer string. The function may
- create intermediate elements corresponding to pointer segments.
- <br/>
- The particular conditions when and what kind of intermediate element
- is created is governed by the `ptr` parameter.
- Each pointer token is considered in sequence. For each token
- - if the containing value is an @ref object, then a new `null`
- element is created with key equal to unescaped token string; otherwise
- - if the containing value is an @ref array, and the token represents a
- past-the-end marker, then a `null` element is appended to the array;
- otherwise
- - if the containing value is an @ref array, and the token represents a
- number, then if the difference between the number and array's size
- is smaller than `opts.max_created_elements`, then the size of the
- array is increased, so that the number can reference an element in the
- array; otherwise
- - if the containing value is of different @ref kind and
- `opts.replace_any_scalar` is `true`, or the value is `null`, then
- - if `opts.create_arrays` is `true` and the token either represents
- past-the-end marker or a number, then the value is replaced with
- an empty array and the token is considered again; otherwise
- - if `opts.create_objects` is `true`, then the value is replaced
- with an empty object and the token is considered again; otherwise
- - an error is produced.
- @par Complexity
- Linear in the sum of size of `ptr`, size of underlying array, object,
- or string and `opts.max_created_elements`.
- @par Exception Safety
- Basic guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param sv JSON Pointer string.
- @param ref The value to assign to pointed element.
- @param opts The options for the algorithm.
- @return Reference to the element identified by `ptr`.
- @see @ref set_pointer_options,
- <a href="https://datatracker.ietf.org/doc/html/rfc6901">
- RFC 6901 - JavaScript Object Notation (JSON) Pointer</a>.
- */
- BOOST_JSON_DECL
- value&
- set_at_pointer(
- string_view sv,
- value_ref ref,
- set_pointer_options const& opts = {} );
- /** Set an element via JSON Pointer.
- This function is used to insert or assign to a potentially nested
- element of the value using a JSON Pointer string. The function may
- create intermediate elements corresponding to pointer segments.
- <br/>
- The particular conditions when and what kind of intermediate element
- is created is governed by the `ptr` parameter.
- Each pointer token is considered in sequence. For each token
- - if the containing value is an @ref object, then a new `null`
- element is created with key equal to unescaped token string;
- otherwise
- - if the containing value is an @ref array, and the token represents a
- past-the-end marker, then a `null` element is appended to the array;
- otherwise
- - if the containing value is an @ref array, and the token represents a
- number, then if the difference between the number and array's size
- is smaller than `opts.max_created_elements`, then the size of the
- array is increased, so that the number can reference an element in the
- array; otherwise
- - if the containing value is of different @ref kind and
- `opts.replace_any_scalar` is `true`, or the value is `null`, then
- - if `opts.create_arrays` is `true` and the token either represents
- past-the-end marker or a number, then the value is replaced with
- an empty array and the token is considered again; otherwise
- - if `opts.create_objects` is `true`, then the value is replaced
- with an empty object and the token is considered again; otherwise
- - an error is produced.
- @par Complexity
- Linear in the sum of size of `ptr`, size of underlying array, object,
- or string and `opts.max_created_elements`.
- @par Exception Safety
- Basic guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param sv JSON Pointer string.
- @param ref The value to assign to pointed element.
- @param ec Set to the error, if any occurred.
- @param opts The options for the algorithm.
- @return Pointer to the element identified by `ptr`.
- @see @ref set_pointer_options,
- <a href="https://datatracker.ietf.org/doc/html/rfc6901">
- RFC 6901 - JavaScript Object Notation (JSON) Pointer</a>.
- */
- /** @{ */
- BOOST_JSON_DECL
- value*
- set_at_pointer(
- string_view sv,
- value_ref ref,
- system::error_code& ec,
- set_pointer_options const& opts = {} );
- BOOST_JSON_DECL
- value*
- set_at_pointer(
- string_view sv,
- value_ref ref,
- std::error_code& ec,
- set_pointer_options const& opts = {} );
- /** @} */
- //------------------------------------------------------
- /** Return `true` if two values are equal.
- Two values are equal when they are the
- same kind and their referenced values
- are equal, or when they are both integral
- types and their integral representations
- are equal.
- @par Complexity
- Constant or linear in the size of
- the array, object, or string.
- @par Exception Safety
- No-throw guarantee.
- */
- // inline friend speeds up overload resolution
- friend
- bool
- operator==(
- value const& lhs,
- value const& rhs) noexcept
- {
- return lhs.equal(rhs);
- }
- /** Return `true` if two values are not equal.
- Two values are equal when they are the
- same kind and their referenced values
- are equal, or when they are both integral
- types and their integral representations
- are equal.
- @par Complexity
- Constant or linear in the size of
- the array, object, or string.
- @par Exception Safety
- No-throw guarantee.
- */
- friend
- bool
- operator!=(
- value const& lhs,
- value const& rhs) noexcept
- {
- return ! (lhs == rhs);
- }
- /** Serialize @ref value to an output stream.
- This function serializes a `value` as JSON into the output stream.
- @return Reference to `os`.
- @par Complexity
- Constant or linear in the size of `jv`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param os The output stream to serialize to.
- @param jv The value to serialize.
- */
- BOOST_JSON_DECL
- friend
- std::ostream&
- operator<<(
- std::ostream& os,
- value const& jv);
- /** Parse @ref value from an input stream.
- This function parses JSON from an input stream into a `value`. If
- parsing fails, `std::ios_base::failbit` will be set for `is` and
- `jv` will be left unchanged. Regardless of whether `skipws` flag is set
- on `is`, consumes whitespace before and after JSON, because whitespace
- is considered a part of JSON. Behaves as
- [_FormattedInputFunction_](https://en.cppreference.com/w/cpp/named_req/FormattedInputFunction).
- Note: this operator cannot assume that the stream only contains a
- single JSON document, which may result in **very underwhelming
- performance**, if the stream isn't cooperative. If you know that your
- input consists of a single JSON document, consider using @ref parse
- function instead.
- @return Reference to `is`.
- @par Complexity
- Linear in the size of JSON data.
- @par Exception Safety
- Basic guarantee.
- Calls to `memory_resource::allocate` may throw.
- The stream may throw as configured by
- [`std::ios::exceptions`](https://en.cppreference.com/w/cpp/io/basic_ios/exceptions).
- @param is The input stream to parse from.
- @param jv The value to parse into.
- @see @ref parse.
- */
- BOOST_JSON_DECL
- friend
- std::istream&
- operator>>(
- std::istream& is,
- value& jv);
- /** Helper for `boost::hash` support
- Computes a hash value for `jv`. This function is used by
- `boost::hash<value>`. Similar overloads for @ref array, @ref object,
- and @ref string do not exist, because those types are supported by
- `boost::hash` out of the box.
- @return hash value for `jv`.
- @param jv `value` for which a hash is to be computed.
- @see [Boost.ContainerHash](https://boost.org/libs/container_hash).
- */
- #ifndef BOOST_JSON_DOCS
- template<
- class T,
- typename std::enable_if<
- std::is_same< detail::remove_cvref<T>, value >::value >::type*
- = nullptr>
- friend
- std::size_t
- hash_value( T const& jv ) noexcept
- #else
- friend
- inline
- std::size_t
- hash_value( value const& jv ) noexcept
- #endif
- {
- return detail::hash_value_impl(jv);
- }
- private:
- static
- void
- relocate(
- value* dest,
- value const& src) noexcept
- {
- std::memcpy(
- static_cast<void*>(dest),
- &src,
- sizeof(src));
- }
- BOOST_JSON_DECL
- storage_ptr
- destroy() noexcept;
- BOOST_JSON_DECL
- bool
- equal(value const& other) const noexcept;
- template<class T>
- auto
- to_number(error& e) const noexcept ->
- typename std::enable_if<
- std::is_signed<T>::value &&
- ! std::is_floating_point<T>::value,
- T>::type
- {
- if(sca_.k == json::kind::int64)
- {
- auto const i = sca_.i;
- if( i >= (std::numeric_limits<T>::min)() &&
- i <= (std::numeric_limits<T>::max)())
- {
- e = {};
- return static_cast<T>(i);
- }
- e = error::not_exact;
- }
- else if(sca_.k == json::kind::uint64)
- {
- auto const u = sca_.u;
- if(u <= static_cast<std::uint64_t>((
- std::numeric_limits<T>::max)()))
- {
- e = {};
- return static_cast<T>(u);
- }
- e = error::not_exact;
- }
- else if(sca_.k == json::kind::double_)
- {
- auto const d = sca_.d;
- if( d >= static_cast<double>(
- (detail::to_number_limit<T>::min)()) &&
- d <= static_cast<double>(
- (detail::to_number_limit<T>::max)()) &&
- static_cast<T>(d) == d)
- {
- e = {};
- return static_cast<T>(d);
- }
- e = error::not_exact;
- }
- else
- {
- e = error::not_number;
- }
- return T{};
- }
- template<class T>
- auto
- to_number(error& e) const noexcept ->
- typename std::enable_if<
- std::is_unsigned<T>::value &&
- ! std::is_same<T, bool>::value,
- T>::type
- {
- if(sca_.k == json::kind::int64)
- {
- auto const i = sca_.i;
- if( i >= 0 && static_cast<std::uint64_t>(i) <=
- (std::numeric_limits<T>::max)())
- {
- e = {};
- return static_cast<T>(i);
- }
- e = error::not_exact;
- }
- else if(sca_.k == json::kind::uint64)
- {
- auto const u = sca_.u;
- if(u <= (std::numeric_limits<T>::max)())
- {
- e = {};
- return static_cast<T>(u);
- }
- e = error::not_exact;
- }
- else if(sca_.k == json::kind::double_)
- {
- auto const d = sca_.d;
- if( d >= 0 &&
- d <= (detail::to_number_limit<T>::max)() &&
- static_cast<T>(d) == d)
- {
- e = {};
- return static_cast<T>(d);
- }
- e = error::not_exact;
- }
- else
- {
- e = error::not_number;
- }
- return T{};
- }
- template<class T>
- auto
- to_number(error& e) const noexcept ->
- typename std::enable_if<
- std::is_floating_point<
- T>::value, T>::type
- {
- if(sca_.k == json::kind::int64)
- {
- e = {};
- return static_cast<T>(sca_.i);
- }
- if(sca_.k == json::kind::uint64)
- {
- e = {};
- return static_cast<T>(sca_.u);
- }
- if(sca_.k == json::kind::double_)
- {
- e = {};
- return static_cast<T>(sca_.d);
- }
- e = error::not_number;
- return {};
- }
- };
- // Make sure things are as big as we think they should be
- #if BOOST_JSON_ARCH == 64
- BOOST_STATIC_ASSERT(sizeof(value) == 24);
- #elif BOOST_JSON_ARCH == 32
- BOOST_STATIC_ASSERT(sizeof(value) == 16);
- #else
- # error Unknown architecture
- #endif
- //----------------------------------------------------------
- /** A key/value pair.
- This is the type of element used by the @ref object
- container.
- */
- class key_value_pair
- {
- #ifndef BOOST_JSON_DOCS
- friend struct detail::access;
- using access = detail::access;
- #endif
- BOOST_JSON_DECL
- static char const empty_[1];
- inline
- key_value_pair(
- pilfered<json::value> k,
- pilfered<json::value> v) noexcept;
- public:
- /// Copy assignment (deleted).
- key_value_pair&
- operator=(key_value_pair const&) = delete;
- /** Destructor.
- The value is destroyed and all internally
- allocated memory is freed.
- */
- ~key_value_pair() noexcept
- {
- auto const& sp = value_.storage();
- if(sp.is_not_shared_and_deallocate_is_trivial())
- return;
- if(key_ == empty_)
- return;
- sp->deallocate(const_cast<char*>(key_),
- len_ + 1, alignof(char));
- }
- /** Copy constructor.
- This constructs a key/value pair with a
- copy of another key/value pair, using
- the same memory resource as `other`.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The key/value pair to copy.
- */
- key_value_pair(
- key_value_pair const& other)
- : key_value_pair(other,
- other.storage())
- {
- }
- /** Copy constructor.
- This constructs a key/value pair with a
- copy of another key/value pair, using
- the specified memory resource.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param other The key/value pair to copy.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The element will acquire shared ownership of the memory resource.
- */
- BOOST_JSON_DECL
- key_value_pair(
- key_value_pair const& other,
- storage_ptr sp);
- /** Move constructor.
- The pair is constructed by acquiring
- ownership of the contents of `other` and
- shared ownership of `other`'s memory resource.
- @note
- After construction, the moved-from pair holds an
- empty key, and a null value with its current
- storage pointer.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param other The pair to move.
- */
- key_value_pair(
- key_value_pair&& other) noexcept
- : value_(std::move(other.value_))
- , key_(detail::exchange(
- other.key_, empty_))
- , len_(detail::exchange(
- other.len_, 0))
- {
- }
- /** Pilfer constructor.
- The pair is constructed by acquiring ownership
- of the contents of `other` using pilfer semantics.
- This is more efficient than move construction, when
- it is known that the moved-from object will be
- immediately destroyed afterwards.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- @param other The value to pilfer. After pilfer
- construction, `other` is not in a usable state
- and may only be destroyed.
- @see @ref pilfer,
- <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0308r0.html">
- Valueless Variants Considered Harmful</a>
- */
- key_value_pair(
- pilfered<key_value_pair> other) noexcept
- : value_(pilfer(other.get().value_))
- , key_(detail::exchange(
- other.get().key_, empty_))
- , len_(detail::exchange(
- other.get().len_, 0))
- {
- }
- /** Constructor.
- This constructs a key/value pair.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param key The key string to use.
- @param args Optional arguments forwarded to
- the @ref value constructor.
- */
- template<class... Args>
- explicit
- key_value_pair(
- string_view key,
- Args&&... args)
- : value_(std::forward<Args>(args)...)
- {
- if(key.size() > string::max_size())
- {
- BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
- detail::throw_system_error( error::key_too_large, &loc );
- }
- auto s = reinterpret_cast<
- char*>(value_.storage()->
- allocate(key.size() + 1, alignof(char)));
- std::memcpy(s, key.data(), key.size());
- s[key.size()] = 0;
- key_ = s;
- len_ = static_cast<
- std::uint32_t>(key.size());
- }
- /** Constructor.
- This constructs a key/value pair. A
- copy of the specified value is made,
- using the specified memory resource.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param p A `std::pair` with the key
- string and @ref value to construct with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The element will acquire shared ownership of the memory resource.
- */
- explicit
- key_value_pair(
- std::pair<
- string_view,
- json::value> const& p,
- storage_ptr sp = {})
- : key_value_pair(
- p.first,
- p.second,
- std::move(sp))
- {
- }
- /** Constructor.
- This constructs a key/value pair.
- Ownership of the specified value is
- transferred by move construction.
- @par Exception Safety
- Strong guarantee.
- Calls to `memory_resource::allocate` may throw.
- @param p A `std::pair` with the key
- string and @ref value to construct with.
- @param sp A pointer to the `boost::container::pmr::memory_resource` to
- use. The element will acquire shared ownership of the memory resource.
- */
- explicit
- key_value_pair(
- std::pair<
- string_view,
- json::value>&& p,
- storage_ptr sp = {})
- : key_value_pair(
- p.first,
- std::move(p).second,
- std::move(sp))
- {
- }
- /** Return the associated memory resource.
- This returns a pointer to the memory
- resource used to construct the value.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- storage_ptr const&
- storage() const noexcept
- {
- return value_.storage();
- }
- /** Return the key of this element.
- After construction, the key may
- not be modified.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- string_view const
- key() const noexcept
- {
- return { key_, len_ };
- }
- /** Return the key of this element as a null-terminated string.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- char const*
- key_c_str() const noexcept
- {
- return key_;
- }
- /** Return the value of this element.
- @par Complexity
- Constant.
- @par Exception Safety
- No-throw guarantee.
- */
- /** @{ */
- json::value const&
- value() const& noexcept
- {
- return value_;
- }
- json::value&&
- value() && noexcept
- {
- return std::move( value() );
- }
- json::value&
- value() & noexcept
- {
- return value_;
- }
- /** @} */
- private:
- json::value value_;
- char const* key_;
- std::uint32_t len_;
- std::uint32_t next_;
- };
- //----------------------------------------------------------
- #ifdef BOOST_JSON_DOCS
- /** Tuple-like element access.
- This overload permits the key and value
- of a `key_value_pair` to be accessed
- by index. For example:
- @code
- key_value_pair kvp("num", 42);
- string_view key = get<0>(kvp);
- value& jv = get<1>(kvp);
- @endcode
- @par Structured Bindings
- When using C++17 or greater, objects of type
- @ref key_value_pair may be used to initialize
- structured bindings:
- @code
- key_value_pair kvp("num", 42);
- auto& [key, value] = kvp;
- @endcode
- Depending on the value of `I`, the return type will be:
- @li `string_view const` if `I == 0`, or
- @li `value&`, `value const&`, or `value&&` if `I == 1`.
- Any other value for `I` is ill-formed.
- @tparam I The element index to access.
- @par Constraints
- `std::is_same_v< std::remove_cvref_t<T>, key_value_pair >`
- @return `kvp.key()` if `I == 0`, or `kvp.value()`
- if `I == 1`.
- @param kvp The @ref key_value_pair object
- to access.
- */
- template<
- std::size_t I,
- class T>
- __see_below__
- get(T&& kvp) noexcept;
- #else
- template<std::size_t I>
- auto
- get(key_value_pair const&) noexcept ->
- typename std::conditional<I == 0,
- string_view const,
- value const&>::type
- {
- static_assert(I == 0,
- "key_value_pair index out of range");
- }
- template<std::size_t I>
- auto
- get(key_value_pair&) noexcept ->
- typename std::conditional<I == 0,
- string_view const,
- value&>::type
- {
- static_assert(I == 0,
- "key_value_pair index out of range");
- }
- template<std::size_t I>
- auto
- get(key_value_pair&&) noexcept ->
- typename std::conditional<I == 0,
- string_view const,
- value&&>::type
- {
- static_assert(I == 0,
- "key_value_pair index out of range");
- }
- /** Extracts a key_value_pair's key using tuple-like interface
- */
- template<>
- inline
- string_view const
- get<0>(key_value_pair const& kvp) noexcept
- {
- return kvp.key();
- }
- /** Extracts a key_value_pair's key using tuple-like interface
- */
- template<>
- inline
- string_view const
- get<0>(key_value_pair& kvp) noexcept
- {
- return kvp.key();
- }
- /** Extracts a key_value_pair's key using tuple-like interface
- */
- template<>
- inline
- string_view const
- get<0>(key_value_pair&& kvp) noexcept
- {
- return kvp.key();
- }
- /** Extracts a key_value_pair's value using tuple-like interface
- */
- template<>
- inline
- value const&
- get<1>(key_value_pair const& kvp) noexcept
- {
- return kvp.value();
- }
- /** Extracts a key_value_pair's value using tuple-like interface
- */
- template<>
- inline
- value&
- get<1>(key_value_pair& kvp) noexcept
- {
- return kvp.value();
- }
- /** Extracts a key_value_pair's value using tuple-like interface
- */
- template<>
- inline
- value&&
- get<1>(key_value_pair&& kvp) noexcept
- {
- return std::move(kvp.value());
- }
- #endif
- } // namespace json
- } // namespace boost
- #ifdef __clang__
- # pragma clang diagnostic push
- # pragma clang diagnostic ignored "-Wmismatched-tags"
- #endif
- #ifndef BOOST_JSON_DOCS
- namespace std {
- /** Tuple-like size access for key_value_pair
- */
- template<>
- struct tuple_size< ::boost::json::key_value_pair >
- : std::integral_constant<std::size_t, 2>
- {
- };
- /** Tuple-like access for the key type of key_value_pair
- */
- template<>
- struct tuple_element<0, ::boost::json::key_value_pair>
- {
- using type = ::boost::json::string_view const;
- };
- /** Tuple-like access for the value type of key_value_pair
- */
- template<>
- struct tuple_element<1, ::boost::json::key_value_pair>
- {
- using type = ::boost::json::value&;
- };
- /** Tuple-like access for the value type of key_value_pair
- */
- template<>
- struct tuple_element<1, ::boost::json::key_value_pair const>
- {
- using type = ::boost::json::value const&;
- };
- } // std
- #endif
- // std::hash specialization
- #ifndef BOOST_JSON_DOCS
- namespace std {
- template <>
- struct hash< ::boost::json::value > {
- BOOST_JSON_DECL
- std::size_t
- operator()(::boost::json::value const& jv) const noexcept;
- };
- } // std
- #endif
- #ifdef __clang__
- # pragma clang diagnostic pop
- #endif
- // These are here because value, array,
- // and object form cyclic references.
- #include <boost/json/detail/impl/array.hpp>
- #include <boost/json/impl/array.hpp>
- #include <boost/json/impl/object.hpp>
- #include <boost/json/impl/value.hpp>
- // These must come after array and object
- #include <boost/json/impl/value_ref.hpp>
- #endif
|