NamedTuple.h 135 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464
  1. //
  2. // NamedTuple.h
  3. //
  4. // $Id: //poco/1.4/Foundation/include/Poco/NamedTuple.h#1 $
  5. //
  6. // Library: Foundation
  7. // Package: Core
  8. // Module: NamedTuple
  9. //
  10. // Definition of the NamedTuple class.
  11. //
  12. // Copyright (c) 2007, Applied Informatics Software Engineering GmbH.
  13. // and Contributors.
  14. //
  15. // SPDX-License-Identifier: BSL-1.0
  16. //
  17. #ifndef Foundation_NamedTuple_INCLUDED
  18. #define Foundation_NamedTuple_INCLUDED
  19. #include "Poco/Foundation.h"
  20. #include "Poco/Tuple.h"
  21. #include "Poco/TypeList.h"
  22. #include "Poco/DynamicAny.h"
  23. #include "Poco/SharedPtr.h"
  24. #include "Poco/Format.h"
  25. namespace Poco {
  26. template<class T0,
  27. class T1 = NullTypeList,
  28. class T2 = NullTypeList,
  29. class T3 = NullTypeList,
  30. class T4 = NullTypeList,
  31. class T5 = NullTypeList,
  32. class T6 = NullTypeList,
  33. class T7 = NullTypeList,
  34. class T8 = NullTypeList,
  35. class T9 = NullTypeList,
  36. class T10 = NullTypeList,
  37. class T11 = NullTypeList,
  38. class T12 = NullTypeList,
  39. class T13 = NullTypeList,
  40. class T14 = NullTypeList,
  41. class T15 = NullTypeList,
  42. class T16 = NullTypeList,
  43. class T17 = NullTypeList,
  44. class T18 = NullTypeList,
  45. class T19 = NullTypeList>
  46. struct NamedTuple: public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19>
  47. {
  48. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19> TupleType;
  49. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19>::Type Type;
  50. typedef std::vector<std::string> NameVec;
  51. typedef SharedPtr<NameVec> NameVecPtr;
  52. NamedTuple(): _pNames(0)
  53. {
  54. init();
  55. }
  56. NamedTuple(const NameVecPtr& rNames)
  57. {
  58. if (rNames->size() != TupleType::length)
  59. throw InvalidArgumentException("Wrong names vector length.");
  60. _pNames = rNames;
  61. }
  62. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  63. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  64. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  65. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  66. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  67. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  68. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  69. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  70. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  71. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  72. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  73. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  74. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  75. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  76. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  77. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  78. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
  79. typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
  80. typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18),
  81. typename TypeWrapper<T19>::CONSTTYPE& t19 = POCO_TYPEWRAPPER_DEFAULTVALUE(T19)):
  82. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19),
  83. _pNames(0)
  84. {
  85. init();
  86. }
  87. NamedTuple(const NameVecPtr& rNames,
  88. typename TypeWrapper<T0>::CONSTTYPE& t0,
  89. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  90. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  91. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  92. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  93. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  94. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  95. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  96. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  97. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  98. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  99. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  100. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  101. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  102. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  103. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  104. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
  105. typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
  106. typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18),
  107. typename TypeWrapper<T19>::CONSTTYPE& t19 = POCO_TYPEWRAPPER_DEFAULTVALUE(T19)):
  108. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19)
  109. {
  110. if (rNames->size() != TupleType::length)
  111. throw InvalidArgumentException("Wrong names vector length.");
  112. _pNames = rNames;
  113. }
  114. NamedTuple(const std::string& n0,
  115. typename TypeWrapper<T0>::CONSTTYPE& t0,
  116. const std::string& n1 = "B",
  117. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  118. const std::string& n2 = "C",
  119. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  120. const std::string& n3 = "D",
  121. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  122. const std::string& n4 = "E",
  123. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  124. const std::string& n5 = "F",
  125. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  126. const std::string& n6 = "G",
  127. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  128. const std::string& n7 = "H",
  129. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  130. const std::string& n8 = "I",
  131. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  132. const std::string& n9 = "J",
  133. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  134. const std::string& n10 = "K",
  135. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  136. const std::string& n11 = "L",
  137. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  138. const std::string& n12 = "M",
  139. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  140. const std::string& n13 = "N",
  141. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  142. const std::string& n14 = "O",
  143. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  144. const std::string& n15 = "P",
  145. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  146. const std::string& n16 = "Q",
  147. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
  148. const std::string& n17 = "R",
  149. typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
  150. const std::string& n18 = "S",
  151. typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18),
  152. const std::string& n19 = "T",
  153. typename TypeWrapper<T19>::CONSTTYPE& t19 = POCO_TYPEWRAPPER_DEFAULTVALUE(T19)):
  154. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19),
  155. _pNames(0)
  156. {
  157. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19);
  158. }
  159. const DynamicAny get(const std::string& name) const
  160. {
  161. NameVec::const_iterator it = _pNames->begin();
  162. NameVec::const_iterator itEnd = _pNames->end();
  163. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  164. {
  165. if (name == *it)
  166. {
  167. switch (counter)
  168. {
  169. case 0: return TupleType::template get<0>();
  170. case 1: return TupleType::template get<1>();
  171. case 2: return TupleType::template get<2>();
  172. case 3: return TupleType::template get<3>();
  173. case 4: return TupleType::template get<4>();
  174. case 5: return TupleType::template get<5>();
  175. case 6: return TupleType::template get<6>();
  176. case 7: return TupleType::template get<7>();
  177. case 8: return TupleType::template get<8>();
  178. case 9: return TupleType::template get<9>();
  179. case 10: return TupleType::template get<10>();
  180. case 11: return TupleType::template get<11>();
  181. case 12: return TupleType::template get<12>();
  182. case 13: return TupleType::template get<13>();
  183. case 14: return TupleType::template get<14>();
  184. case 15: return TupleType::template get<15>();
  185. case 16: return TupleType::template get<16>();
  186. case 17: return TupleType::template get<17>();
  187. case 18: return TupleType::template get<18>();
  188. case 19: return TupleType::template get<19>();
  189. default: throw RangeException();
  190. }
  191. }
  192. }
  193. throw NotFoundException("Name not found: " + name);
  194. }
  195. const DynamicAny operator [] (const std::string& name) const
  196. {
  197. return get(name);
  198. }
  199. template<int N>
  200. typename TypeGetter<N, Type>::ConstHeadType& get() const
  201. {
  202. return TupleType::template get<N>();
  203. }
  204. template<int N>
  205. typename TypeGetter<N, Type>::HeadType& get()
  206. {
  207. return TupleType::template get<N>();
  208. }
  209. template<int N>
  210. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  211. {
  212. return TupleType::template set<N>(val);
  213. }
  214. const NameVecPtr& names()
  215. {
  216. return _pNames;
  217. }
  218. void setName(std::size_t index, const std::string& name)
  219. {
  220. if (index >= _pNames->size())
  221. throw InvalidArgumentException(format("Invalid index: %z", index));
  222. (*_pNames)[index] = name;
  223. }
  224. const std::string& getName(std::size_t index)
  225. {
  226. if (index >= _pNames->size())
  227. throw InvalidArgumentException(format("Invalid index: %z", index));
  228. return (*_pNames)[index];
  229. }
  230. bool operator == (const NamedTuple& other) const
  231. {
  232. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  233. }
  234. bool operator != (const NamedTuple& other) const
  235. {
  236. return !(*this == other);
  237. }
  238. bool operator < (const NamedTuple& other) const
  239. {
  240. TupleType th(*this);
  241. TupleType oth(other);
  242. return (th < oth && _pNames == other._pNames) ||
  243. (th == oth && _pNames < other._pNames) ||
  244. (th < oth && _pNames < other._pNames);
  245. }
  246. private:
  247. void init(const std::string& n0 = "A",
  248. const std::string& n1 = "B",
  249. const std::string& n2 = "C",
  250. const std::string& n3 = "D",
  251. const std::string& n4 = "E",
  252. const std::string& n5 = "F",
  253. const std::string& n6 = "G",
  254. const std::string& n7 = "H",
  255. const std::string& n8 = "I",
  256. const std::string& n9 = "J",
  257. const std::string& n10 = "K",
  258. const std::string& n11 = "L",
  259. const std::string& n12 = "M",
  260. const std::string& n13 = "N",
  261. const std::string& n14 = "O",
  262. const std::string& n15 = "P",
  263. const std::string& n16 = "Q",
  264. const std::string& n17 = "R",
  265. const std::string& n18 = "S",
  266. const std::string& n19 = "T")
  267. {
  268. if (!_pNames)
  269. {
  270. _pNames = new NameVec;
  271. _pNames->push_back(n0);
  272. _pNames->push_back(n1);
  273. _pNames->push_back(n2);
  274. _pNames->push_back(n3);
  275. _pNames->push_back(n4);
  276. _pNames->push_back(n5);
  277. _pNames->push_back(n6);
  278. _pNames->push_back(n7);
  279. _pNames->push_back(n8);
  280. _pNames->push_back(n9);
  281. _pNames->push_back(n10);
  282. _pNames->push_back(n11);
  283. _pNames->push_back(n12);
  284. _pNames->push_back(n13);
  285. _pNames->push_back(n14);
  286. _pNames->push_back(n15);
  287. _pNames->push_back(n16);
  288. _pNames->push_back(n17);
  289. _pNames->push_back(n18);
  290. _pNames->push_back(n19);
  291. }
  292. }
  293. NameVecPtr _pNames;
  294. };
  295. template<class T0,
  296. class T1,
  297. class T2,
  298. class T3,
  299. class T4,
  300. class T5,
  301. class T6,
  302. class T7,
  303. class T8,
  304. class T9,
  305. class T10,
  306. class T11,
  307. class T12,
  308. class T13,
  309. class T14,
  310. class T15,
  311. class T16,
  312. class T17,
  313. class T18>
  314. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,NullTypeList>:
  315. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18>
  316. {
  317. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18> TupleType;
  318. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18>::Type Type;
  319. typedef std::vector<std::string> NameVec;
  320. typedef SharedPtr<NameVec> NameVecPtr;
  321. NamedTuple(): _pNames(0)
  322. {
  323. init();
  324. }
  325. NamedTuple(const NameVecPtr& rNames)
  326. {
  327. if (rNames->size() != TupleType::length)
  328. throw InvalidArgumentException("Wrong names vector length.");
  329. _pNames = rNames;
  330. }
  331. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  332. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  333. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  334. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  335. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  336. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  337. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  338. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  339. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  340. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  341. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  342. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  343. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  344. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  345. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  346. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  347. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
  348. typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
  349. typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18)):
  350. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18),
  351. _pNames(0)
  352. {
  353. init();
  354. }
  355. NamedTuple(const NameVecPtr& rNames,
  356. typename TypeWrapper<T0>::CONSTTYPE& t0,
  357. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  358. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  359. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  360. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  361. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  362. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  363. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  364. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  365. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  366. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  367. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  368. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  369. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  370. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  371. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  372. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
  373. typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
  374. typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18)):
  375. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18)
  376. {
  377. if (rNames->size() != TupleType::length)
  378. throw InvalidArgumentException("Wrong names vector length.");
  379. _pNames = rNames;
  380. }
  381. NamedTuple(const std::string& n0,
  382. typename TypeWrapper<T0>::CONSTTYPE& t0,
  383. const std::string& n1 = "B",
  384. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  385. const std::string& n2 = "C",
  386. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  387. const std::string& n3 = "D",
  388. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  389. const std::string& n4 = "E",
  390. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  391. const std::string& n5 = "F",
  392. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  393. const std::string& n6 = "G",
  394. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  395. const std::string& n7 = "H",
  396. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  397. const std::string& n8 = "I",
  398. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  399. const std::string& n9 = "J",
  400. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  401. const std::string& n10 = "K",
  402. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  403. const std::string& n11 = "L",
  404. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  405. const std::string& n12 = "M",
  406. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  407. const std::string& n13 = "N",
  408. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  409. const std::string& n14 = "O",
  410. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  411. const std::string& n15 = "P",
  412. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  413. const std::string& n16 = "Q",
  414. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
  415. const std::string& n17 = "R",
  416. typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17),
  417. const std::string& n18 = "S",
  418. typename TypeWrapper<T18>::CONSTTYPE& t18 = POCO_TYPEWRAPPER_DEFAULTVALUE(T18)):
  419. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18),
  420. _pNames(0)
  421. {
  422. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18);
  423. }
  424. const DynamicAny get(const std::string& name) const
  425. {
  426. NameVec::const_iterator it = _pNames->begin();
  427. NameVec::const_iterator itEnd = _pNames->end();
  428. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  429. {
  430. if (name == *it)
  431. {
  432. switch (counter)
  433. {
  434. case 0: return TupleType::template get<0>();
  435. case 1: return TupleType::template get<1>();
  436. case 2: return TupleType::template get<2>();
  437. case 3: return TupleType::template get<3>();
  438. case 4: return TupleType::template get<4>();
  439. case 5: return TupleType::template get<5>();
  440. case 6: return TupleType::template get<6>();
  441. case 7: return TupleType::template get<7>();
  442. case 8: return TupleType::template get<8>();
  443. case 9: return TupleType::template get<9>();
  444. case 10: return TupleType::template get<10>();
  445. case 11: return TupleType::template get<11>();
  446. case 12: return TupleType::template get<12>();
  447. case 13: return TupleType::template get<13>();
  448. case 14: return TupleType::template get<14>();
  449. case 15: return TupleType::template get<15>();
  450. case 16: return TupleType::template get<16>();
  451. case 17: return TupleType::template get<17>();
  452. case 18: return TupleType::template get<18>();
  453. default: throw RangeException();
  454. }
  455. }
  456. }
  457. throw NotFoundException("Name not found: " + name);
  458. }
  459. const DynamicAny operator [] (const std::string& name) const
  460. {
  461. return get(name);
  462. }
  463. template<int N>
  464. typename TypeGetter<N, Type>::ConstHeadType& get() const
  465. {
  466. return TupleType::template get<N>();
  467. }
  468. template<int N>
  469. typename TypeGetter<N, Type>::HeadType& get()
  470. {
  471. return TupleType::template get<N>();
  472. }
  473. template<int N>
  474. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  475. {
  476. return TupleType::template set<N>(val);
  477. }
  478. const NameVecPtr& names()
  479. {
  480. return _pNames;
  481. }
  482. void setName(std::size_t index, const std::string& name)
  483. {
  484. if (index >= _pNames->size())
  485. throw InvalidArgumentException(format("Invalid index: %z", index));
  486. (*_pNames)[index] = name;
  487. }
  488. const std::string& getName(std::size_t index)
  489. {
  490. if (index >= _pNames->size())
  491. throw InvalidArgumentException(format("Invalid index: %z", index));
  492. return (*_pNames)[index];
  493. }
  494. bool operator == (const NamedTuple& other) const
  495. {
  496. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  497. }
  498. bool operator != (const NamedTuple& other) const
  499. {
  500. return !(*this == other);
  501. }
  502. bool operator < (const NamedTuple& other) const
  503. {
  504. TupleType th(*this);
  505. TupleType oth(other);
  506. return (th < oth && _pNames == other._pNames) ||
  507. (th == oth && _pNames < other._pNames) ||
  508. (th < oth && _pNames < other._pNames);
  509. }
  510. private:
  511. void init(const std::string& n0 = "A",
  512. const std::string& n1 = "B",
  513. const std::string& n2 = "C",
  514. const std::string& n3 = "D",
  515. const std::string& n4 = "E",
  516. const std::string& n5 = "F",
  517. const std::string& n6 = "G",
  518. const std::string& n7 = "H",
  519. const std::string& n8 = "I",
  520. const std::string& n9 = "J",
  521. const std::string& n10 = "K",
  522. const std::string& n11 = "L",
  523. const std::string& n12 = "M",
  524. const std::string& n13 = "N",
  525. const std::string& n14 = "O",
  526. const std::string& n15 = "P",
  527. const std::string& n16 = "Q",
  528. const std::string& n17 = "R",
  529. const std::string& n18 = "S")
  530. {
  531. if (!_pNames)
  532. {
  533. _pNames = new NameVec;
  534. _pNames->push_back(n0);
  535. _pNames->push_back(n1);
  536. _pNames->push_back(n2);
  537. _pNames->push_back(n3);
  538. _pNames->push_back(n4);
  539. _pNames->push_back(n5);
  540. _pNames->push_back(n6);
  541. _pNames->push_back(n7);
  542. _pNames->push_back(n8);
  543. _pNames->push_back(n9);
  544. _pNames->push_back(n10);
  545. _pNames->push_back(n11);
  546. _pNames->push_back(n12);
  547. _pNames->push_back(n13);
  548. _pNames->push_back(n14);
  549. _pNames->push_back(n15);
  550. _pNames->push_back(n16);
  551. _pNames->push_back(n17);
  552. _pNames->push_back(n18);
  553. }
  554. }
  555. NameVecPtr _pNames;
  556. };
  557. template<class T0,
  558. class T1,
  559. class T2,
  560. class T3,
  561. class T4,
  562. class T5,
  563. class T6,
  564. class T7,
  565. class T8,
  566. class T9,
  567. class T10,
  568. class T11,
  569. class T12,
  570. class T13,
  571. class T14,
  572. class T15,
  573. class T16,
  574. class T17>
  575. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,NullTypeList>:
  576. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17>
  577. {
  578. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17> TupleType;
  579. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17>::Type Type;
  580. typedef std::vector<std::string> NameVec;
  581. typedef SharedPtr<NameVec> NameVecPtr;
  582. NamedTuple(): _pNames(0)
  583. {
  584. init();
  585. }
  586. NamedTuple(const NameVecPtr& rNames)
  587. {
  588. if (rNames->size() != TupleType::length)
  589. throw InvalidArgumentException("Wrong names vector length.");
  590. _pNames = rNames;
  591. }
  592. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  593. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  594. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  595. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  596. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  597. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  598. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  599. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  600. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  601. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  602. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  603. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  604. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  605. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  606. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  607. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  608. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
  609. typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17)):
  610. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17),
  611. _pNames(0)
  612. {
  613. init();
  614. }
  615. NamedTuple(const NameVecPtr& rNames,
  616. typename TypeWrapper<T0>::CONSTTYPE& t0,
  617. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  618. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  619. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  620. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  621. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  622. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  623. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  624. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  625. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  626. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  627. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  628. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  629. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  630. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  631. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  632. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
  633. typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17)):
  634. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17)
  635. {
  636. if (rNames->size() != TupleType::length)
  637. throw InvalidArgumentException("Wrong names vector length.");
  638. _pNames = rNames;
  639. }
  640. NamedTuple(const std::string& n0,
  641. typename TypeWrapper<T0>::CONSTTYPE& t0,
  642. const std::string& n1 = "B",
  643. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  644. const std::string& n2 = "C",
  645. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  646. const std::string& n3 = "D",
  647. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  648. const std::string& n4 = "E",
  649. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  650. const std::string& n5 = "F",
  651. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  652. const std::string& n6 = "G",
  653. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  654. const std::string& n7 = "H",
  655. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  656. const std::string& n8 = "I",
  657. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  658. const std::string& n9 = "J",
  659. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  660. const std::string& n10 = "K",
  661. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  662. const std::string& n11 = "L",
  663. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  664. const std::string& n12 = "M",
  665. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  666. const std::string& n13 = "N",
  667. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  668. const std::string& n14 = "O",
  669. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  670. const std::string& n15 = "P",
  671. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  672. const std::string& n16 = "Q",
  673. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16),
  674. const std::string& n17 = "R",
  675. typename TypeWrapper<T17>::CONSTTYPE& t17 = POCO_TYPEWRAPPER_DEFAULTVALUE(T17)):
  676. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17),
  677. _pNames(0)
  678. {
  679. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17);
  680. }
  681. const DynamicAny get(const std::string& name) const
  682. {
  683. NameVec::const_iterator it = _pNames->begin();
  684. NameVec::const_iterator itEnd = _pNames->end();
  685. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  686. {
  687. if (name == *it)
  688. {
  689. switch (counter)
  690. {
  691. case 0: return TupleType::template get<0>();
  692. case 1: return TupleType::template get<1>();
  693. case 2: return TupleType::template get<2>();
  694. case 3: return TupleType::template get<3>();
  695. case 4: return TupleType::template get<4>();
  696. case 5: return TupleType::template get<5>();
  697. case 6: return TupleType::template get<6>();
  698. case 7: return TupleType::template get<7>();
  699. case 8: return TupleType::template get<8>();
  700. case 9: return TupleType::template get<9>();
  701. case 10: return TupleType::template get<10>();
  702. case 11: return TupleType::template get<11>();
  703. case 12: return TupleType::template get<12>();
  704. case 13: return TupleType::template get<13>();
  705. case 14: return TupleType::template get<14>();
  706. case 15: return TupleType::template get<15>();
  707. case 16: return TupleType::template get<16>();
  708. case 17: return TupleType::template get<17>();
  709. default: throw RangeException();
  710. }
  711. }
  712. }
  713. throw NotFoundException("Name not found: " + name);
  714. }
  715. const DynamicAny operator [] (const std::string& name) const
  716. {
  717. return get(name);
  718. }
  719. template<int N>
  720. typename TypeGetter<N, Type>::ConstHeadType& get() const
  721. {
  722. return TupleType::template get<N>();
  723. }
  724. template<int N>
  725. typename TypeGetter<N, Type>::HeadType& get()
  726. {
  727. return TupleType::template get<N>();
  728. }
  729. template<int N>
  730. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  731. {
  732. return TupleType::template set<N>(val);
  733. }
  734. const NameVecPtr& names()
  735. {
  736. return _pNames;
  737. }
  738. void setName(std::size_t index, const std::string& name)
  739. {
  740. if (index >= _pNames->size())
  741. throw InvalidArgumentException(format("Invalid index: %z", index));
  742. (*_pNames)[index] = name;
  743. }
  744. const std::string& getName(std::size_t index)
  745. {
  746. if (index >= _pNames->size())
  747. throw InvalidArgumentException(format("Invalid index: %z", index));
  748. return (*_pNames)[index];
  749. }
  750. bool operator == (const NamedTuple& other) const
  751. {
  752. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  753. }
  754. bool operator != (const NamedTuple& other) const
  755. {
  756. return !(*this == other);
  757. }
  758. bool operator < (const NamedTuple& other) const
  759. {
  760. TupleType th(*this);
  761. TupleType oth(other);
  762. return (th < oth && _pNames == other._pNames) ||
  763. (th == oth && _pNames < other._pNames) ||
  764. (th < oth && _pNames < other._pNames);
  765. }
  766. private:
  767. void init(const std::string& n0 = "A",
  768. const std::string& n1 = "B",
  769. const std::string& n2 = "C",
  770. const std::string& n3 = "D",
  771. const std::string& n4 = "E",
  772. const std::string& n5 = "F",
  773. const std::string& n6 = "G",
  774. const std::string& n7 = "H",
  775. const std::string& n8 = "I",
  776. const std::string& n9 = "J",
  777. const std::string& n10 = "K",
  778. const std::string& n11 = "L",
  779. const std::string& n12 = "M",
  780. const std::string& n13 = "N",
  781. const std::string& n14 = "O",
  782. const std::string& n15 = "P",
  783. const std::string& n16 = "Q",
  784. const std::string& n17 = "R")
  785. {
  786. if (!_pNames)
  787. {
  788. _pNames = new NameVec;
  789. _pNames->push_back(n0);
  790. _pNames->push_back(n1);
  791. _pNames->push_back(n2);
  792. _pNames->push_back(n3);
  793. _pNames->push_back(n4);
  794. _pNames->push_back(n5);
  795. _pNames->push_back(n6);
  796. _pNames->push_back(n7);
  797. _pNames->push_back(n8);
  798. _pNames->push_back(n9);
  799. _pNames->push_back(n10);
  800. _pNames->push_back(n11);
  801. _pNames->push_back(n12);
  802. _pNames->push_back(n13);
  803. _pNames->push_back(n14);
  804. _pNames->push_back(n15);
  805. _pNames->push_back(n16);
  806. _pNames->push_back(n17);
  807. }
  808. }
  809. NameVecPtr _pNames;
  810. };
  811. template<class T0,
  812. class T1,
  813. class T2,
  814. class T3,
  815. class T4,
  816. class T5,
  817. class T6,
  818. class T7,
  819. class T8,
  820. class T9,
  821. class T10,
  822. class T11,
  823. class T12,
  824. class T13,
  825. class T14,
  826. class T15,
  827. class T16>
  828. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,NullTypeList>:
  829. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>
  830. {
  831. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16> TupleType;
  832. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>::Type Type;
  833. typedef std::vector<std::string> NameVec;
  834. typedef SharedPtr<NameVec> NameVecPtr;
  835. NamedTuple(): _pNames(0)
  836. {
  837. init();
  838. }
  839. NamedTuple(const NameVecPtr& rNames)
  840. {
  841. if (rNames->size() != TupleType::length)
  842. throw InvalidArgumentException("Wrong names vector length.");
  843. _pNames = rNames;
  844. }
  845. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  846. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  847. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  848. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  849. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  850. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  851. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  852. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  853. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  854. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  855. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  856. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  857. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  858. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  859. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  860. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  861. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16)):
  862. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16),
  863. _pNames(0)
  864. {
  865. init();
  866. }
  867. NamedTuple(const NameVecPtr& rNames,
  868. typename TypeWrapper<T0>::CONSTTYPE& t0,
  869. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  870. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  871. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  872. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  873. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  874. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  875. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  876. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  877. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  878. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  879. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  880. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  881. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  882. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  883. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  884. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16)):
  885. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16)
  886. {
  887. if (rNames->size() != TupleType::length)
  888. throw InvalidArgumentException("Wrong names vector length.");
  889. _pNames = rNames;
  890. }
  891. NamedTuple(const std::string& n0,
  892. typename TypeWrapper<T0>::CONSTTYPE& t0,
  893. const std::string& n1 = "B",
  894. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  895. const std::string& n2 = "C",
  896. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  897. const std::string& n3 = "D",
  898. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  899. const std::string& n4 = "E",
  900. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  901. const std::string& n5 = "F",
  902. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  903. const std::string& n6 = "G",
  904. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  905. const std::string& n7 = "H",
  906. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  907. const std::string& n8 = "I",
  908. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  909. const std::string& n9 = "J",
  910. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  911. const std::string& n10 = "K",
  912. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  913. const std::string& n11 = "L",
  914. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  915. const std::string& n12 = "M",
  916. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  917. const std::string& n13 = "N",
  918. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  919. const std::string& n14 = "O",
  920. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  921. const std::string& n15 = "P",
  922. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15),
  923. const std::string& n16 = "Q",
  924. typename TypeWrapper<T16>::CONSTTYPE& t16 = POCO_TYPEWRAPPER_DEFAULTVALUE(T16)):
  925. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16),
  926. _pNames(0)
  927. {
  928. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16);
  929. }
  930. const DynamicAny get(const std::string& name) const
  931. {
  932. NameVec::const_iterator it = _pNames->begin();
  933. NameVec::const_iterator itEnd = _pNames->end();
  934. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  935. {
  936. if (name == *it)
  937. {
  938. switch (counter)
  939. {
  940. case 0: return TupleType::template get<0>();
  941. case 1: return TupleType::template get<1>();
  942. case 2: return TupleType::template get<2>();
  943. case 3: return TupleType::template get<3>();
  944. case 4: return TupleType::template get<4>();
  945. case 5: return TupleType::template get<5>();
  946. case 6: return TupleType::template get<6>();
  947. case 7: return TupleType::template get<7>();
  948. case 8: return TupleType::template get<8>();
  949. case 9: return TupleType::template get<9>();
  950. case 10: return TupleType::template get<10>();
  951. case 11: return TupleType::template get<11>();
  952. case 12: return TupleType::template get<12>();
  953. case 13: return TupleType::template get<13>();
  954. case 14: return TupleType::template get<14>();
  955. case 15: return TupleType::template get<15>();
  956. case 16: return TupleType::template get<16>();
  957. default: throw RangeException();
  958. }
  959. }
  960. }
  961. throw NotFoundException("Name not found: " + name);
  962. }
  963. const DynamicAny operator [] (const std::string& name) const
  964. {
  965. return get(name);
  966. }
  967. template<int N>
  968. typename TypeGetter<N, Type>::ConstHeadType& get() const
  969. {
  970. return TupleType::template get<N>();
  971. }
  972. template<int N>
  973. typename TypeGetter<N, Type>::HeadType& get()
  974. {
  975. return TupleType::template get<N>();
  976. }
  977. template<int N>
  978. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  979. {
  980. return TupleType::template set<N>(val);
  981. }
  982. const NameVecPtr& names()
  983. {
  984. return _pNames;
  985. }
  986. void setName(std::size_t index, const std::string& name)
  987. {
  988. if (index >= _pNames->size())
  989. throw InvalidArgumentException(format("Invalid index: %z", index));
  990. (*_pNames)[index] = name;
  991. }
  992. const std::string& getName(std::size_t index)
  993. {
  994. if (index >= _pNames->size())
  995. throw InvalidArgumentException(format("Invalid index: %z", index));
  996. return (*_pNames)[index];
  997. }
  998. bool operator == (const NamedTuple& other) const
  999. {
  1000. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  1001. }
  1002. bool operator != (const NamedTuple& other) const
  1003. {
  1004. return !(*this == other);
  1005. }
  1006. bool operator < (const NamedTuple& other) const
  1007. {
  1008. TupleType th(*this);
  1009. TupleType oth(other);
  1010. return (th < oth && _pNames == other._pNames) ||
  1011. (th == oth && _pNames < other._pNames) ||
  1012. (th < oth && _pNames < other._pNames);
  1013. }
  1014. private:
  1015. void init(const std::string& n0 = "A",
  1016. const std::string& n1 = "B",
  1017. const std::string& n2 = "C",
  1018. const std::string& n3 = "D",
  1019. const std::string& n4 = "E",
  1020. const std::string& n5 = "F",
  1021. const std::string& n6 = "G",
  1022. const std::string& n7 = "H",
  1023. const std::string& n8 = "I",
  1024. const std::string& n9 = "J",
  1025. const std::string& n10 = "K",
  1026. const std::string& n11 = "L",
  1027. const std::string& n12 = "M",
  1028. const std::string& n13 = "N",
  1029. const std::string& n14 = "O",
  1030. const std::string& n15 = "P",
  1031. const std::string& n16 = "Q")
  1032. {
  1033. if (!_pNames)
  1034. {
  1035. _pNames = new NameVec;
  1036. _pNames->push_back(n0);
  1037. _pNames->push_back(n1);
  1038. _pNames->push_back(n2);
  1039. _pNames->push_back(n3);
  1040. _pNames->push_back(n4);
  1041. _pNames->push_back(n5);
  1042. _pNames->push_back(n6);
  1043. _pNames->push_back(n7);
  1044. _pNames->push_back(n8);
  1045. _pNames->push_back(n9);
  1046. _pNames->push_back(n10);
  1047. _pNames->push_back(n11);
  1048. _pNames->push_back(n12);
  1049. _pNames->push_back(n13);
  1050. _pNames->push_back(n14);
  1051. _pNames->push_back(n15);
  1052. _pNames->push_back(n16);
  1053. }
  1054. }
  1055. NameVecPtr _pNames;
  1056. };
  1057. template<class T0,
  1058. class T1,
  1059. class T2,
  1060. class T3,
  1061. class T4,
  1062. class T5,
  1063. class T6,
  1064. class T7,
  1065. class T8,
  1066. class T9,
  1067. class T10,
  1068. class T11,
  1069. class T12,
  1070. class T13,
  1071. class T14,
  1072. class T15>
  1073. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,NullTypeList>:
  1074. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>
  1075. {
  1076. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15> TupleType;
  1077. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>::Type Type;
  1078. typedef std::vector<std::string> NameVec;
  1079. typedef SharedPtr<NameVec> NameVecPtr;
  1080. NamedTuple(): _pNames(0)
  1081. {
  1082. init();
  1083. }
  1084. NamedTuple(const NameVecPtr& rNames)
  1085. {
  1086. if (rNames->size() != TupleType::length)
  1087. throw InvalidArgumentException("Wrong names vector length.");
  1088. _pNames = rNames;
  1089. }
  1090. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  1091. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1092. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1093. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1094. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1095. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1096. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1097. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1098. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1099. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1100. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1101. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1102. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  1103. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  1104. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  1105. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15)):
  1106. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15),
  1107. _pNames(0)
  1108. {
  1109. init();
  1110. }
  1111. NamedTuple(const NameVecPtr& rNames,
  1112. typename TypeWrapper<T0>::CONSTTYPE& t0,
  1113. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1114. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1115. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1116. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1117. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1118. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1119. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1120. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1121. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1122. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1123. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1124. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  1125. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  1126. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  1127. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15)):
  1128. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15)
  1129. {
  1130. if (rNames->size() != TupleType::length)
  1131. throw InvalidArgumentException("Wrong names vector length.");
  1132. _pNames = rNames;
  1133. }
  1134. NamedTuple(const std::string& n0,
  1135. typename TypeWrapper<T0>::CONSTTYPE& t0,
  1136. const std::string& n1 = "B",
  1137. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1138. const std::string& n2 = "C",
  1139. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1140. const std::string& n3 = "D",
  1141. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1142. const std::string& n4 = "E",
  1143. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1144. const std::string& n5 = "F",
  1145. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1146. const std::string& n6 = "G",
  1147. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1148. const std::string& n7 = "H",
  1149. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1150. const std::string& n8 = "I",
  1151. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1152. const std::string& n9 = "J",
  1153. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1154. const std::string& n10 = "K",
  1155. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1156. const std::string& n11 = "L",
  1157. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1158. const std::string& n12 = "M",
  1159. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  1160. const std::string& n13 = "N",
  1161. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  1162. const std::string& n14 = "O",
  1163. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14),
  1164. const std::string& n15 = "P",
  1165. typename TypeWrapper<T15>::CONSTTYPE& t15 = POCO_TYPEWRAPPER_DEFAULTVALUE(T15)):
  1166. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15),
  1167. _pNames(0)
  1168. {
  1169. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15);
  1170. }
  1171. const DynamicAny get(const std::string& name) const
  1172. {
  1173. NameVec::const_iterator it = _pNames->begin();
  1174. NameVec::const_iterator itEnd = _pNames->end();
  1175. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  1176. {
  1177. if (name == *it)
  1178. {
  1179. switch (counter)
  1180. {
  1181. case 0: return TupleType::template get<0>();
  1182. case 1: return TupleType::template get<1>();
  1183. case 2: return TupleType::template get<2>();
  1184. case 3: return TupleType::template get<3>();
  1185. case 4: return TupleType::template get<4>();
  1186. case 5: return TupleType::template get<5>();
  1187. case 6: return TupleType::template get<6>();
  1188. case 7: return TupleType::template get<7>();
  1189. case 8: return TupleType::template get<8>();
  1190. case 9: return TupleType::template get<9>();
  1191. case 10: return TupleType::template get<10>();
  1192. case 11: return TupleType::template get<11>();
  1193. case 12: return TupleType::template get<12>();
  1194. case 13: return TupleType::template get<13>();
  1195. case 14: return TupleType::template get<14>();
  1196. case 15: return TupleType::template get<15>();
  1197. default: throw RangeException();
  1198. }
  1199. }
  1200. }
  1201. throw NotFoundException("Name not found: " + name);
  1202. }
  1203. const DynamicAny operator [] (const std::string& name) const
  1204. {
  1205. return get(name);
  1206. }
  1207. template<int N>
  1208. typename TypeGetter<N, Type>::ConstHeadType& get() const
  1209. {
  1210. return TupleType::template get<N>();
  1211. }
  1212. template<int N>
  1213. typename TypeGetter<N, Type>::HeadType& get()
  1214. {
  1215. return TupleType::template get<N>();
  1216. }
  1217. template<int N>
  1218. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  1219. {
  1220. return TupleType::template set<N>(val);
  1221. }
  1222. const NameVecPtr& names()
  1223. {
  1224. return _pNames;
  1225. }
  1226. void setName(std::size_t index, const std::string& name)
  1227. {
  1228. if (index >= _pNames->size())
  1229. throw InvalidArgumentException(format("Invalid index: %z", index));
  1230. (*_pNames)[index] = name;
  1231. }
  1232. const std::string& getName(std::size_t index)
  1233. {
  1234. if (index >= _pNames->size())
  1235. throw InvalidArgumentException(format("Invalid index: %z", index));
  1236. return (*_pNames)[index];
  1237. }
  1238. bool operator == (const NamedTuple& other) const
  1239. {
  1240. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  1241. }
  1242. bool operator != (const NamedTuple& other) const
  1243. {
  1244. return !(*this == other);
  1245. }
  1246. bool operator < (const NamedTuple& other) const
  1247. {
  1248. TupleType th(*this);
  1249. TupleType oth(other);
  1250. return (th < oth && _pNames == other._pNames) ||
  1251. (th == oth && _pNames < other._pNames) ||
  1252. (th < oth && _pNames < other._pNames);
  1253. }
  1254. private:
  1255. void init(const std::string& n0 = "A",
  1256. const std::string& n1 = "B",
  1257. const std::string& n2 = "C",
  1258. const std::string& n3 = "D",
  1259. const std::string& n4 = "E",
  1260. const std::string& n5 = "F",
  1261. const std::string& n6 = "G",
  1262. const std::string& n7 = "H",
  1263. const std::string& n8 = "I",
  1264. const std::string& n9 = "J",
  1265. const std::string& n10 = "K",
  1266. const std::string& n11 = "L",
  1267. const std::string& n12 = "M",
  1268. const std::string& n13 = "N",
  1269. const std::string& n14 = "O",
  1270. const std::string& n15 = "P")
  1271. {
  1272. if (!_pNames)
  1273. {
  1274. _pNames = new NameVec;
  1275. _pNames->push_back(n0);
  1276. _pNames->push_back(n1);
  1277. _pNames->push_back(n2);
  1278. _pNames->push_back(n3);
  1279. _pNames->push_back(n4);
  1280. _pNames->push_back(n5);
  1281. _pNames->push_back(n6);
  1282. _pNames->push_back(n7);
  1283. _pNames->push_back(n8);
  1284. _pNames->push_back(n9);
  1285. _pNames->push_back(n10);
  1286. _pNames->push_back(n11);
  1287. _pNames->push_back(n12);
  1288. _pNames->push_back(n13);
  1289. _pNames->push_back(n14);
  1290. _pNames->push_back(n15);
  1291. }
  1292. }
  1293. NameVecPtr _pNames;
  1294. };
  1295. template<class T0,
  1296. class T1,
  1297. class T2,
  1298. class T3,
  1299. class T4,
  1300. class T5,
  1301. class T6,
  1302. class T7,
  1303. class T8,
  1304. class T9,
  1305. class T10,
  1306. class T11,
  1307. class T12,
  1308. class T13,
  1309. class T14>
  1310. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,NullTypeList>:
  1311. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>
  1312. {
  1313. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14> TupleType;
  1314. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>::Type Type;
  1315. typedef std::vector<std::string> NameVec;
  1316. typedef SharedPtr<NameVec> NameVecPtr;
  1317. NamedTuple(): _pNames(0)
  1318. {
  1319. init();
  1320. }
  1321. NamedTuple(const NameVecPtr& rNames)
  1322. {
  1323. if (rNames->size() != TupleType::length)
  1324. throw InvalidArgumentException("Wrong names vector length.");
  1325. _pNames = rNames;
  1326. }
  1327. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  1328. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1329. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1330. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1331. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1332. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1333. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1334. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1335. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1336. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1337. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1338. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1339. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  1340. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  1341. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14)):
  1342. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14),
  1343. _pNames(0)
  1344. {
  1345. init();
  1346. }
  1347. NamedTuple(const NameVecPtr& rNames,
  1348. typename TypeWrapper<T0>::CONSTTYPE& t0,
  1349. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1350. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1351. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1352. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1353. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1354. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1355. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1356. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1357. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1358. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1359. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1360. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  1361. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  1362. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14)):
  1363. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14)
  1364. {
  1365. if (rNames->size() != TupleType::length)
  1366. throw InvalidArgumentException("Wrong names vector length.");
  1367. _pNames = rNames;
  1368. }
  1369. NamedTuple(const std::string& n0,
  1370. typename TypeWrapper<T0>::CONSTTYPE& t0,
  1371. const std::string& n1 = "B",
  1372. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1373. const std::string& n2 = "C",
  1374. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1375. const std::string& n3 = "D",
  1376. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1377. const std::string& n4 = "E",
  1378. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1379. const std::string& n5 = "F",
  1380. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1381. const std::string& n6 = "G",
  1382. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1383. const std::string& n7 = "H",
  1384. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1385. const std::string& n8 = "I",
  1386. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1387. const std::string& n9 = "J",
  1388. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1389. const std::string& n10 = "K",
  1390. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1391. const std::string& n11 = "L",
  1392. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1393. const std::string& n12 = "M",
  1394. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  1395. const std::string& n13 = "N",
  1396. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13),
  1397. const std::string& n14 = "O",
  1398. typename TypeWrapper<T14>::CONSTTYPE& t14 = POCO_TYPEWRAPPER_DEFAULTVALUE(T14)):
  1399. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14),
  1400. _pNames(0)
  1401. {
  1402. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14);
  1403. }
  1404. const DynamicAny get(const std::string& name) const
  1405. {
  1406. NameVec::const_iterator it = _pNames->begin();
  1407. NameVec::const_iterator itEnd = _pNames->end();
  1408. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  1409. {
  1410. if (name == *it)
  1411. {
  1412. switch (counter)
  1413. {
  1414. case 0: return TupleType::template get<0>();
  1415. case 1: return TupleType::template get<1>();
  1416. case 2: return TupleType::template get<2>();
  1417. case 3: return TupleType::template get<3>();
  1418. case 4: return TupleType::template get<4>();
  1419. case 5: return TupleType::template get<5>();
  1420. case 6: return TupleType::template get<6>();
  1421. case 7: return TupleType::template get<7>();
  1422. case 8: return TupleType::template get<8>();
  1423. case 9: return TupleType::template get<9>();
  1424. case 10: return TupleType::template get<10>();
  1425. case 11: return TupleType::template get<11>();
  1426. case 12: return TupleType::template get<12>();
  1427. case 13: return TupleType::template get<13>();
  1428. case 14: return TupleType::template get<14>();
  1429. default: throw RangeException();
  1430. }
  1431. }
  1432. }
  1433. throw NotFoundException("Name not found: " + name);
  1434. }
  1435. const DynamicAny operator [] (const std::string& name) const
  1436. {
  1437. return get(name);
  1438. }
  1439. template<int N>
  1440. typename TypeGetter<N, Type>::ConstHeadType& get() const
  1441. {
  1442. return TupleType::template get<N>();
  1443. }
  1444. template<int N>
  1445. typename TypeGetter<N, Type>::HeadType& get()
  1446. {
  1447. return TupleType::template get<N>();
  1448. }
  1449. template<int N>
  1450. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  1451. {
  1452. return TupleType::template set<N>(val);
  1453. }
  1454. const NameVecPtr& names()
  1455. {
  1456. return _pNames;
  1457. }
  1458. void setName(std::size_t index, const std::string& name)
  1459. {
  1460. if (index >= _pNames->size())
  1461. throw InvalidArgumentException(format("Invalid index: %z", index));
  1462. (*_pNames)[index] = name;
  1463. }
  1464. const std::string& getName(std::size_t index)
  1465. {
  1466. if (index >= _pNames->size())
  1467. throw InvalidArgumentException(format("Invalid index: %z", index));
  1468. return (*_pNames)[index];
  1469. }
  1470. bool operator == (const NamedTuple& other) const
  1471. {
  1472. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  1473. }
  1474. bool operator != (const NamedTuple& other) const
  1475. {
  1476. return !(*this == other);
  1477. }
  1478. bool operator < (const NamedTuple& other) const
  1479. {
  1480. TupleType th(*this);
  1481. TupleType oth(other);
  1482. return (th < oth && _pNames == other._pNames) ||
  1483. (th == oth && _pNames < other._pNames) ||
  1484. (th < oth && _pNames < other._pNames);
  1485. }
  1486. private:
  1487. void init(const std::string& n0 = "A",
  1488. const std::string& n1 = "B",
  1489. const std::string& n2 = "C",
  1490. const std::string& n3 = "D",
  1491. const std::string& n4 = "E",
  1492. const std::string& n5 = "F",
  1493. const std::string& n6 = "G",
  1494. const std::string& n7 = "H",
  1495. const std::string& n8 = "I",
  1496. const std::string& n9 = "J",
  1497. const std::string& n10 = "K",
  1498. const std::string& n11 = "L",
  1499. const std::string& n12 = "M",
  1500. const std::string& n13 = "N",
  1501. const std::string& n14 = "O")
  1502. {
  1503. if (!_pNames)
  1504. {
  1505. _pNames = new NameVec;
  1506. _pNames->push_back(n0);
  1507. _pNames->push_back(n1);
  1508. _pNames->push_back(n2);
  1509. _pNames->push_back(n3);
  1510. _pNames->push_back(n4);
  1511. _pNames->push_back(n5);
  1512. _pNames->push_back(n6);
  1513. _pNames->push_back(n7);
  1514. _pNames->push_back(n8);
  1515. _pNames->push_back(n9);
  1516. _pNames->push_back(n10);
  1517. _pNames->push_back(n11);
  1518. _pNames->push_back(n12);
  1519. _pNames->push_back(n13);
  1520. _pNames->push_back(n14);
  1521. }
  1522. }
  1523. NameVecPtr _pNames;
  1524. };
  1525. template<class T0,
  1526. class T1,
  1527. class T2,
  1528. class T3,
  1529. class T4,
  1530. class T5,
  1531. class T6,
  1532. class T7,
  1533. class T8,
  1534. class T9,
  1535. class T10,
  1536. class T11,
  1537. class T12,
  1538. class T13>
  1539. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,NullTypeList>:
  1540. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>
  1541. {
  1542. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13> TupleType;
  1543. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>::Type Type;
  1544. typedef std::vector<std::string> NameVec;
  1545. typedef SharedPtr<NameVec> NameVecPtr;
  1546. NamedTuple(): _pNames(0)
  1547. {
  1548. init();
  1549. }
  1550. NamedTuple(const NameVecPtr& rNames)
  1551. {
  1552. if (rNames->size() != TupleType::length)
  1553. throw InvalidArgumentException("Wrong names vector length.");
  1554. _pNames = rNames;
  1555. }
  1556. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  1557. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1558. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1559. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1560. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1561. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1562. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1563. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1564. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1565. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1566. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1567. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1568. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  1569. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13)):
  1570. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13),
  1571. _pNames(0)
  1572. {
  1573. init();
  1574. }
  1575. NamedTuple(const NameVecPtr& rNames,
  1576. typename TypeWrapper<T0>::CONSTTYPE& t0,
  1577. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1578. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1579. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1580. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1581. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1582. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1583. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1584. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1585. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1586. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1587. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1588. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  1589. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13)):
  1590. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13)
  1591. {
  1592. if (rNames->size() != TupleType::length)
  1593. throw InvalidArgumentException("Wrong names vector length.");
  1594. _pNames = rNames;
  1595. }
  1596. NamedTuple(const std::string& n0,
  1597. typename TypeWrapper<T0>::CONSTTYPE& t0,
  1598. const std::string& n1 = "B",
  1599. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1600. const std::string& n2 = "C",
  1601. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1602. const std::string& n3 = "D",
  1603. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1604. const std::string& n4 = "E",
  1605. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1606. const std::string& n5 = "F",
  1607. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1608. const std::string& n6 = "G",
  1609. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1610. const std::string& n7 = "H",
  1611. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1612. const std::string& n8 = "I",
  1613. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1614. const std::string& n9 = "J",
  1615. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1616. const std::string& n10 = "K",
  1617. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1618. const std::string& n11 = "L",
  1619. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1620. const std::string& n12 = "M",
  1621. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12),
  1622. const std::string& n13 = "N",
  1623. typename TypeWrapper<T13>::CONSTTYPE& t13 = POCO_TYPEWRAPPER_DEFAULTVALUE(T13)):
  1624. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13),
  1625. _pNames(0)
  1626. {
  1627. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13);
  1628. }
  1629. const DynamicAny get(const std::string& name) const
  1630. {
  1631. NameVec::const_iterator it = _pNames->begin();
  1632. NameVec::const_iterator itEnd = _pNames->end();
  1633. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  1634. {
  1635. if (name == *it)
  1636. {
  1637. switch (counter)
  1638. {
  1639. case 0: return TupleType::template get<0>();
  1640. case 1: return TupleType::template get<1>();
  1641. case 2: return TupleType::template get<2>();
  1642. case 3: return TupleType::template get<3>();
  1643. case 4: return TupleType::template get<4>();
  1644. case 5: return TupleType::template get<5>();
  1645. case 6: return TupleType::template get<6>();
  1646. case 7: return TupleType::template get<7>();
  1647. case 8: return TupleType::template get<8>();
  1648. case 9: return TupleType::template get<9>();
  1649. case 10: return TupleType::template get<10>();
  1650. case 11: return TupleType::template get<11>();
  1651. case 12: return TupleType::template get<12>();
  1652. case 13: return TupleType::template get<13>();
  1653. default: throw RangeException();
  1654. }
  1655. }
  1656. }
  1657. throw NotFoundException("Name not found: " + name);
  1658. }
  1659. const DynamicAny operator [] (const std::string& name) const
  1660. {
  1661. return get(name);
  1662. }
  1663. template<int N>
  1664. typename TypeGetter<N, Type>::ConstHeadType& get() const
  1665. {
  1666. return TupleType::template get<N>();
  1667. }
  1668. template<int N>
  1669. typename TypeGetter<N, Type>::HeadType& get()
  1670. {
  1671. return TupleType::template get<N>();
  1672. }
  1673. template<int N>
  1674. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  1675. {
  1676. return TupleType::template set<N>(val);
  1677. }
  1678. const NameVecPtr& names()
  1679. {
  1680. return _pNames;
  1681. }
  1682. void setName(std::size_t index, const std::string& name)
  1683. {
  1684. if (index >= _pNames->size())
  1685. throw InvalidArgumentException(format("Invalid index: %z", index));
  1686. (*_pNames)[index] = name;
  1687. }
  1688. const std::string& getName(std::size_t index)
  1689. {
  1690. if (index >= _pNames->size())
  1691. throw InvalidArgumentException(format("Invalid index: %z", index));
  1692. return (*_pNames)[index];
  1693. }
  1694. bool operator == (const NamedTuple& other) const
  1695. {
  1696. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  1697. }
  1698. bool operator != (const NamedTuple& other) const
  1699. {
  1700. return !(*this == other);
  1701. }
  1702. bool operator < (const NamedTuple& other) const
  1703. {
  1704. TupleType th(*this);
  1705. TupleType oth(other);
  1706. return (th < oth && _pNames == other._pNames) ||
  1707. (th == oth && _pNames < other._pNames) ||
  1708. (th < oth && _pNames < other._pNames);
  1709. }
  1710. private:
  1711. void init(const std::string& n0 = "A",
  1712. const std::string& n1 = "B",
  1713. const std::string& n2 = "C",
  1714. const std::string& n3 = "D",
  1715. const std::string& n4 = "E",
  1716. const std::string& n5 = "F",
  1717. const std::string& n6 = "G",
  1718. const std::string& n7 = "H",
  1719. const std::string& n8 = "I",
  1720. const std::string& n9 = "J",
  1721. const std::string& n10 = "K",
  1722. const std::string& n11 = "L",
  1723. const std::string& n12 = "M",
  1724. const std::string& n13 = "N")
  1725. {
  1726. if (!_pNames)
  1727. {
  1728. _pNames = new NameVec;
  1729. _pNames->push_back(n0);
  1730. _pNames->push_back(n1);
  1731. _pNames->push_back(n2);
  1732. _pNames->push_back(n3);
  1733. _pNames->push_back(n4);
  1734. _pNames->push_back(n5);
  1735. _pNames->push_back(n6);
  1736. _pNames->push_back(n7);
  1737. _pNames->push_back(n8);
  1738. _pNames->push_back(n9);
  1739. _pNames->push_back(n10);
  1740. _pNames->push_back(n11);
  1741. _pNames->push_back(n12);
  1742. _pNames->push_back(n13);
  1743. }
  1744. }
  1745. NameVecPtr _pNames;
  1746. };
  1747. template<class T0,
  1748. class T1,
  1749. class T2,
  1750. class T3,
  1751. class T4,
  1752. class T5,
  1753. class T6,
  1754. class T7,
  1755. class T8,
  1756. class T9,
  1757. class T10,
  1758. class T11,
  1759. class T12>
  1760. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,NullTypeList>:
  1761. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>
  1762. {
  1763. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12> TupleType;
  1764. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>::Type Type;
  1765. typedef std::vector<std::string> NameVec;
  1766. typedef SharedPtr<NameVec> NameVecPtr;
  1767. NamedTuple(): _pNames(0)
  1768. {
  1769. init();
  1770. }
  1771. NamedTuple(const NameVecPtr& rNames)
  1772. {
  1773. if (rNames->size() != TupleType::length)
  1774. throw InvalidArgumentException("Wrong names vector length.");
  1775. _pNames = rNames;
  1776. }
  1777. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  1778. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1779. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1780. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1781. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1782. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1783. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1784. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1785. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1786. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1787. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1788. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1789. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12)):
  1790. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12),
  1791. _pNames(0)
  1792. {
  1793. init();
  1794. }
  1795. NamedTuple(const NameVecPtr& rNames,
  1796. typename TypeWrapper<T0>::CONSTTYPE& t0,
  1797. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1798. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1799. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1800. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1801. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1802. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1803. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1804. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1805. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1806. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1807. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1808. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12)):
  1809. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12)
  1810. {
  1811. if (rNames->size() != TupleType::length)
  1812. throw InvalidArgumentException("Wrong names vector length.");
  1813. _pNames = rNames;
  1814. }
  1815. NamedTuple(const std::string& n0,
  1816. typename TypeWrapper<T0>::CONSTTYPE& t0,
  1817. const std::string& n1 = "B",
  1818. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1819. const std::string& n2 = "C",
  1820. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1821. const std::string& n3 = "D",
  1822. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1823. const std::string& n4 = "E",
  1824. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1825. const std::string& n5 = "F",
  1826. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1827. const std::string& n6 = "G",
  1828. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1829. const std::string& n7 = "H",
  1830. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1831. const std::string& n8 = "I",
  1832. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1833. const std::string& n9 = "J",
  1834. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1835. const std::string& n10 = "K",
  1836. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  1837. const std::string& n11 = "L",
  1838. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11),
  1839. const std::string& n12 = "M",
  1840. typename TypeWrapper<T12>::CONSTTYPE& t12 = POCO_TYPEWRAPPER_DEFAULTVALUE(T12)):
  1841. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12), _pNames(0)
  1842. {
  1843. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12);
  1844. }
  1845. const DynamicAny get(const std::string& name) const
  1846. {
  1847. NameVec::const_iterator it = _pNames->begin();
  1848. NameVec::const_iterator itEnd = _pNames->end();
  1849. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  1850. {
  1851. if (name == *it)
  1852. {
  1853. switch (counter)
  1854. {
  1855. case 0: return TupleType::template get<0>();
  1856. case 1: return TupleType::template get<1>();
  1857. case 2: return TupleType::template get<2>();
  1858. case 3: return TupleType::template get<3>();
  1859. case 4: return TupleType::template get<4>();
  1860. case 5: return TupleType::template get<5>();
  1861. case 6: return TupleType::template get<6>();
  1862. case 7: return TupleType::template get<7>();
  1863. case 8: return TupleType::template get<8>();
  1864. case 9: return TupleType::template get<9>();
  1865. case 10: return TupleType::template get<10>();
  1866. case 11: return TupleType::template get<11>();
  1867. case 12: return TupleType::template get<12>();
  1868. default: throw RangeException();
  1869. }
  1870. }
  1871. }
  1872. throw NotFoundException("Name not found: " + name);
  1873. }
  1874. const DynamicAny operator [] (const std::string& name) const
  1875. {
  1876. return get(name);
  1877. }
  1878. template<int N>
  1879. typename TypeGetter<N, Type>::ConstHeadType& get() const
  1880. {
  1881. return TupleType::template get<N>();
  1882. }
  1883. template<int N>
  1884. typename TypeGetter<N, Type>::HeadType& get()
  1885. {
  1886. return TupleType::template get<N>();
  1887. }
  1888. template<int N>
  1889. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  1890. {
  1891. return TupleType::template set<N>(val);
  1892. }
  1893. const NameVecPtr& names()
  1894. {
  1895. return _pNames;
  1896. }
  1897. void setName(std::size_t index, const std::string& name)
  1898. {
  1899. if (index >= _pNames->size())
  1900. throw InvalidArgumentException(format("Invalid index: %z", index));
  1901. (*_pNames)[index] = name;
  1902. }
  1903. const std::string& getName(std::size_t index)
  1904. {
  1905. if (index >= _pNames->size())
  1906. throw InvalidArgumentException(format("Invalid index: %z", index));
  1907. return (*_pNames)[index];
  1908. }
  1909. bool operator == (const NamedTuple& other) const
  1910. {
  1911. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  1912. }
  1913. bool operator != (const NamedTuple& other) const
  1914. {
  1915. return !(*this == other);
  1916. }
  1917. bool operator < (const NamedTuple& other) const
  1918. {
  1919. TupleType th(*this);
  1920. TupleType oth(other);
  1921. return (th < oth && _pNames == other._pNames) ||
  1922. (th == oth && _pNames < other._pNames) ||
  1923. (th < oth && _pNames < other._pNames);
  1924. }
  1925. private:
  1926. void init(const std::string& n0 = "A",
  1927. const std::string& n1 = "B",
  1928. const std::string& n2 = "C",
  1929. const std::string& n3 = "D",
  1930. const std::string& n4 = "E",
  1931. const std::string& n5 = "F",
  1932. const std::string& n6 = "G",
  1933. const std::string& n7 = "H",
  1934. const std::string& n8 = "I",
  1935. const std::string& n9 = "J",
  1936. const std::string& n10 = "K",
  1937. const std::string& n11 = "L",
  1938. const std::string& n12 = "M")
  1939. {
  1940. if (!_pNames)
  1941. {
  1942. _pNames = new NameVec;
  1943. _pNames->push_back(n0);
  1944. _pNames->push_back(n1);
  1945. _pNames->push_back(n2);
  1946. _pNames->push_back(n3);
  1947. _pNames->push_back(n4);
  1948. _pNames->push_back(n5);
  1949. _pNames->push_back(n6);
  1950. _pNames->push_back(n7);
  1951. _pNames->push_back(n8);
  1952. _pNames->push_back(n9);
  1953. _pNames->push_back(n10);
  1954. _pNames->push_back(n11);
  1955. _pNames->push_back(n12);
  1956. }
  1957. }
  1958. NameVecPtr _pNames;
  1959. };
  1960. template<class T0,
  1961. class T1,
  1962. class T2,
  1963. class T3,
  1964. class T4,
  1965. class T5,
  1966. class T6,
  1967. class T7,
  1968. class T8,
  1969. class T9,
  1970. class T10,
  1971. class T11>
  1972. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,NullTypeList>:
  1973. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>
  1974. {
  1975. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11> TupleType;
  1976. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>::Type Type;
  1977. typedef std::vector<std::string> NameVec;
  1978. typedef SharedPtr<NameVec> NameVecPtr;
  1979. NamedTuple(): _pNames(0)
  1980. {
  1981. init();
  1982. }
  1983. NamedTuple(const NameVecPtr& rNames)
  1984. {
  1985. if (rNames->size() != TupleType::length)
  1986. throw InvalidArgumentException("Wrong names vector length.");
  1987. _pNames = rNames;
  1988. }
  1989. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  1990. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  1991. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  1992. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  1993. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  1994. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  1995. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  1996. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  1997. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  1998. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  1999. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  2000. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11)):
  2001. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11),
  2002. _pNames(0)
  2003. {
  2004. init();
  2005. }
  2006. NamedTuple(const NameVecPtr& rNames,
  2007. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2008. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2009. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2010. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2011. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2012. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2013. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2014. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2015. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  2016. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  2017. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  2018. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11)):
  2019. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11)
  2020. {
  2021. if (rNames->size() != TupleType::length)
  2022. throw InvalidArgumentException("Wrong names vector length.");
  2023. _pNames = rNames;
  2024. }
  2025. NamedTuple(const std::string& n0,
  2026. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2027. const std::string& n1 = "B",
  2028. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2029. const std::string& n2 = "C",
  2030. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2031. const std::string& n3 = "D",
  2032. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2033. const std::string& n4 = "E",
  2034. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2035. const std::string& n5 = "F",
  2036. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2037. const std::string& n6 = "G",
  2038. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2039. const std::string& n7 = "H",
  2040. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2041. const std::string& n8 = "I",
  2042. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  2043. const std::string& n9 = "J",
  2044. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  2045. const std::string& n10 = "K",
  2046. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10),
  2047. const std::string& n11 = "L",
  2048. typename TypeWrapper<T11>::CONSTTYPE& t11 = POCO_TYPEWRAPPER_DEFAULTVALUE(T11)):
  2049. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11),
  2050. _pNames(0)
  2051. {
  2052. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11);
  2053. }
  2054. const DynamicAny get(const std::string& name) const
  2055. {
  2056. NameVec::const_iterator it = _pNames->begin();
  2057. NameVec::const_iterator itEnd = _pNames->end();
  2058. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  2059. {
  2060. if (name == *it)
  2061. {
  2062. switch (counter)
  2063. {
  2064. case 0: return TupleType::template get<0>();
  2065. case 1: return TupleType::template get<1>();
  2066. case 2: return TupleType::template get<2>();
  2067. case 3: return TupleType::template get<3>();
  2068. case 4: return TupleType::template get<4>();
  2069. case 5: return TupleType::template get<5>();
  2070. case 6: return TupleType::template get<6>();
  2071. case 7: return TupleType::template get<7>();
  2072. case 8: return TupleType::template get<8>();
  2073. case 9: return TupleType::template get<9>();
  2074. case 10: return TupleType::template get<10>();
  2075. case 11: return TupleType::template get<11>();
  2076. default: throw RangeException();
  2077. }
  2078. }
  2079. }
  2080. throw NotFoundException("Name not found: " + name);
  2081. }
  2082. const DynamicAny operator [] (const std::string& name) const
  2083. {
  2084. return get(name);
  2085. }
  2086. template<int N>
  2087. typename TypeGetter<N, Type>::ConstHeadType& get() const
  2088. {
  2089. return TupleType::template get<N>();
  2090. }
  2091. template<int N>
  2092. typename TypeGetter<N, Type>::HeadType& get()
  2093. {
  2094. return TupleType::template get<N>();
  2095. }
  2096. template<int N>
  2097. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  2098. {
  2099. return TupleType::template set<N>(val);
  2100. }
  2101. const NameVecPtr& names()
  2102. {
  2103. return _pNames;
  2104. }
  2105. void setName(std::size_t index, const std::string& name)
  2106. {
  2107. if (index >= _pNames->size())
  2108. throw InvalidArgumentException(format("Invalid index: %z", index));
  2109. (*_pNames)[index] = name;
  2110. }
  2111. const std::string& getName(std::size_t index)
  2112. {
  2113. if (index >= _pNames->size())
  2114. throw InvalidArgumentException(format("Invalid index: %z", index));
  2115. return (*_pNames)[index];
  2116. }
  2117. bool operator == (const NamedTuple& other) const
  2118. {
  2119. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  2120. }
  2121. bool operator != (const NamedTuple& other) const
  2122. {
  2123. return !(*this == other);
  2124. }
  2125. bool operator < (const NamedTuple& other) const
  2126. {
  2127. TupleType th(*this);
  2128. TupleType oth(other);
  2129. return (th < oth && _pNames == other._pNames) ||
  2130. (th == oth && _pNames < other._pNames) ||
  2131. (th < oth && _pNames < other._pNames);
  2132. }
  2133. private:
  2134. void init(const std::string& n0 = "A",
  2135. const std::string& n1 = "B",
  2136. const std::string& n2 = "C",
  2137. const std::string& n3 = "D",
  2138. const std::string& n4 = "E",
  2139. const std::string& n5 = "F",
  2140. const std::string& n6 = "G",
  2141. const std::string& n7 = "H",
  2142. const std::string& n8 = "I",
  2143. const std::string& n9 = "J",
  2144. const std::string& n10 = "K",
  2145. const std::string& n11 = "L")
  2146. {
  2147. if (!_pNames)
  2148. {
  2149. _pNames = new NameVec;
  2150. _pNames->push_back(n0);
  2151. _pNames->push_back(n1);
  2152. _pNames->push_back(n2);
  2153. _pNames->push_back(n3);
  2154. _pNames->push_back(n4);
  2155. _pNames->push_back(n5);
  2156. _pNames->push_back(n6);
  2157. _pNames->push_back(n7);
  2158. _pNames->push_back(n8);
  2159. _pNames->push_back(n9);
  2160. _pNames->push_back(n10);
  2161. _pNames->push_back(n11);
  2162. }
  2163. }
  2164. NameVecPtr _pNames;
  2165. };
  2166. template<class T0,
  2167. class T1,
  2168. class T2,
  2169. class T3,
  2170. class T4,
  2171. class T5,
  2172. class T6,
  2173. class T7,
  2174. class T8,
  2175. class T9,
  2176. class T10>
  2177. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,NullTypeList>:
  2178. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>
  2179. {
  2180. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> TupleType;
  2181. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>::Type Type;
  2182. typedef std::vector<std::string> NameVec;
  2183. typedef SharedPtr<NameVec> NameVecPtr;
  2184. NamedTuple(): _pNames(0)
  2185. {
  2186. init();
  2187. }
  2188. NamedTuple(const NameVecPtr& rNames)
  2189. {
  2190. if (rNames->size() != TupleType::length)
  2191. throw InvalidArgumentException("Wrong names vector length.");
  2192. _pNames = rNames;
  2193. }
  2194. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  2195. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2196. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2197. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2198. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2199. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2200. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2201. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2202. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  2203. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  2204. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10)):
  2205. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),
  2206. _pNames(0)
  2207. {
  2208. init();
  2209. }
  2210. NamedTuple(const NameVecPtr& rNames,
  2211. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2212. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2213. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2214. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2215. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2216. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2217. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2218. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2219. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  2220. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  2221. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10)):
  2222. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
  2223. {
  2224. if (rNames->size() != TupleType::length)
  2225. throw InvalidArgumentException("Wrong names vector length.");
  2226. _pNames = rNames;
  2227. }
  2228. NamedTuple(const std::string& n0,
  2229. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2230. const std::string& n1 = "B",
  2231. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2232. const std::string& n2 = "C",
  2233. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2234. const std::string& n3 = "D",
  2235. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2236. const std::string& n4 = "E",
  2237. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2238. const std::string& n5 = "F",
  2239. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2240. const std::string& n6 = "G",
  2241. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2242. const std::string& n7 = "H",
  2243. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2244. const std::string& n8 = "I",
  2245. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  2246. const std::string& n9 = "J",
  2247. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9),
  2248. const std::string& n10 = "K",
  2249. typename TypeWrapper<T10>::CONSTTYPE& t10 = POCO_TYPEWRAPPER_DEFAULTVALUE(T10)):
  2250. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10), _pNames(0)
  2251. {
  2252. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10);
  2253. }
  2254. const DynamicAny get(const std::string& name) const
  2255. {
  2256. NameVec::const_iterator it = _pNames->begin();
  2257. NameVec::const_iterator itEnd = _pNames->end();
  2258. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  2259. {
  2260. if (name == *it)
  2261. {
  2262. switch (counter)
  2263. {
  2264. case 0: return TupleType::template get<0>();
  2265. case 1: return TupleType::template get<1>();
  2266. case 2: return TupleType::template get<2>();
  2267. case 3: return TupleType::template get<3>();
  2268. case 4: return TupleType::template get<4>();
  2269. case 5: return TupleType::template get<5>();
  2270. case 6: return TupleType::template get<6>();
  2271. case 7: return TupleType::template get<7>();
  2272. case 8: return TupleType::template get<8>();
  2273. case 9: return TupleType::template get<9>();
  2274. case 10: return TupleType::template get<10>();
  2275. default: throw RangeException();
  2276. }
  2277. }
  2278. }
  2279. throw NotFoundException("Name not found: " + name);
  2280. }
  2281. const DynamicAny operator [] (const std::string& name) const
  2282. {
  2283. return get(name);
  2284. }
  2285. template<int N>
  2286. typename TypeGetter<N, Type>::ConstHeadType& get() const
  2287. {
  2288. return TupleType::template get<N>();
  2289. }
  2290. template<int N>
  2291. typename TypeGetter<N, Type>::HeadType& get()
  2292. {
  2293. return TupleType::template get<N>();
  2294. }
  2295. template<int N>
  2296. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  2297. {
  2298. return TupleType::template set<N>(val);
  2299. }
  2300. const NameVecPtr& names()
  2301. {
  2302. return _pNames;
  2303. }
  2304. void setName(std::size_t index, const std::string& name)
  2305. {
  2306. if (index >= _pNames->size())
  2307. throw InvalidArgumentException(format("Invalid index: %z", index));
  2308. (*_pNames)[index] = name;
  2309. }
  2310. const std::string& getName(std::size_t index)
  2311. {
  2312. if (index >= _pNames->size())
  2313. throw InvalidArgumentException(format("Invalid index: %z", index));
  2314. return (*_pNames)[index];
  2315. }
  2316. bool operator == (const NamedTuple& other) const
  2317. {
  2318. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  2319. }
  2320. bool operator != (const NamedTuple& other) const
  2321. {
  2322. return !(*this == other);
  2323. }
  2324. bool operator < (const NamedTuple& other) const
  2325. {
  2326. TupleType th(*this);
  2327. TupleType oth(other);
  2328. return (th < oth && _pNames == other._pNames) ||
  2329. (th == oth && _pNames < other._pNames) ||
  2330. (th < oth && _pNames < other._pNames);
  2331. }
  2332. private:
  2333. void init(const std::string& n0 = "A",
  2334. const std::string& n1 = "B",
  2335. const std::string& n2 = "C",
  2336. const std::string& n3 = "D",
  2337. const std::string& n4 = "E",
  2338. const std::string& n5 = "F",
  2339. const std::string& n6 = "G",
  2340. const std::string& n7 = "H",
  2341. const std::string& n8 = "I",
  2342. const std::string& n9 = "J",
  2343. const std::string& n10 = "K")
  2344. {
  2345. if (!_pNames)
  2346. {
  2347. _pNames = new NameVec;
  2348. _pNames->push_back(n0);
  2349. _pNames->push_back(n1);
  2350. _pNames->push_back(n2);
  2351. _pNames->push_back(n3);
  2352. _pNames->push_back(n4);
  2353. _pNames->push_back(n5);
  2354. _pNames->push_back(n6);
  2355. _pNames->push_back(n7);
  2356. _pNames->push_back(n8);
  2357. _pNames->push_back(n9);
  2358. _pNames->push_back(n10);
  2359. }
  2360. }
  2361. NameVecPtr _pNames;
  2362. };
  2363. template<class T0,
  2364. class T1,
  2365. class T2,
  2366. class T3,
  2367. class T4,
  2368. class T5,
  2369. class T6,
  2370. class T7,
  2371. class T8,
  2372. class T9>
  2373. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,NullTypeList>:
  2374. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>
  2375. {
  2376. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9> TupleType;
  2377. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>::Type Type;
  2378. typedef std::vector<std::string> NameVec;
  2379. typedef SharedPtr<NameVec> NameVecPtr;
  2380. NamedTuple(): _pNames(0)
  2381. {
  2382. init();
  2383. }
  2384. NamedTuple(const NameVecPtr& rNames)
  2385. {
  2386. if (rNames->size() != TupleType::length)
  2387. throw InvalidArgumentException("Wrong names vector length.");
  2388. _pNames = rNames;
  2389. }
  2390. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  2391. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2392. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2393. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2394. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2395. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2396. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2397. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2398. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  2399. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9)):
  2400. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9),
  2401. _pNames(0)
  2402. {
  2403. init();
  2404. }
  2405. NamedTuple(const NameVecPtr& rNames,
  2406. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2407. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2408. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2409. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2410. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2411. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2412. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2413. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2414. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  2415. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9)):
  2416. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9)
  2417. {
  2418. if (rNames->size() != TupleType::length)
  2419. throw InvalidArgumentException("Wrong names vector length.");
  2420. _pNames = rNames;
  2421. }
  2422. NamedTuple(const std::string& n0,
  2423. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2424. const std::string& n1 = "B",
  2425. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2426. const std::string& n2 = "C",
  2427. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2428. const std::string& n3 = "D",
  2429. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2430. const std::string& n4 = "E",
  2431. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2432. const std::string& n5 = "F",
  2433. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2434. const std::string& n6 = "G",
  2435. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2436. const std::string& n7 = "H",
  2437. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2438. const std::string& n8 = "I",
  2439. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8),
  2440. const std::string& n9 = "J",
  2441. typename TypeWrapper<T9>::CONSTTYPE& t9 = POCO_TYPEWRAPPER_DEFAULTVALUE(T9)):
  2442. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8,t9),
  2443. _pNames(0)
  2444. {
  2445. init(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9);
  2446. }
  2447. const DynamicAny get(const std::string& name) const
  2448. {
  2449. NameVec::const_iterator it = _pNames->begin();
  2450. NameVec::const_iterator itEnd = _pNames->end();
  2451. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  2452. {
  2453. if (name == *it)
  2454. {
  2455. switch (counter)
  2456. {
  2457. case 0: return TupleType::template get<0>();
  2458. case 1: return TupleType::template get<1>();
  2459. case 2: return TupleType::template get<2>();
  2460. case 3: return TupleType::template get<3>();
  2461. case 4: return TupleType::template get<4>();
  2462. case 5: return TupleType::template get<5>();
  2463. case 6: return TupleType::template get<6>();
  2464. case 7: return TupleType::template get<7>();
  2465. case 8: return TupleType::template get<8>();
  2466. case 9: return TupleType::template get<9>();
  2467. default: throw RangeException();
  2468. }
  2469. }
  2470. }
  2471. throw NotFoundException("Name not found: " + name);
  2472. }
  2473. const DynamicAny operator [] (const std::string& name) const
  2474. {
  2475. return get(name);
  2476. }
  2477. template<int N>
  2478. typename TypeGetter<N, Type>::ConstHeadType& get() const
  2479. {
  2480. return TupleType::template get<N>();
  2481. }
  2482. template<int N>
  2483. typename TypeGetter<N, Type>::HeadType& get()
  2484. {
  2485. return TupleType::template get<N>();
  2486. }
  2487. template<int N>
  2488. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  2489. {
  2490. return TupleType::template set<N>(val);
  2491. }
  2492. const NameVecPtr& names()
  2493. {
  2494. return _pNames;
  2495. }
  2496. void setName(std::size_t index, const std::string& name)
  2497. {
  2498. if (index >= _pNames->size())
  2499. throw InvalidArgumentException(format("Invalid index: %z", index));
  2500. (*_pNames)[index] = name;
  2501. }
  2502. const std::string& getName(std::size_t index)
  2503. {
  2504. if (index >= _pNames->size())
  2505. throw InvalidArgumentException(format("Invalid index: %z", index));
  2506. return (*_pNames)[index];
  2507. }
  2508. bool operator == (const NamedTuple& other) const
  2509. {
  2510. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  2511. }
  2512. bool operator != (const NamedTuple& other) const
  2513. {
  2514. return !(*this == other);
  2515. }
  2516. bool operator < (const NamedTuple& other) const
  2517. {
  2518. TupleType th(*this);
  2519. TupleType oth(other);
  2520. return (th < oth && _pNames == other._pNames) ||
  2521. (th == oth && _pNames < other._pNames) ||
  2522. (th < oth && _pNames < other._pNames);
  2523. }
  2524. private:
  2525. void init(const std::string& n0 = "A",
  2526. const std::string& n1 = "B",
  2527. const std::string& n2 = "C",
  2528. const std::string& n3 = "D",
  2529. const std::string& n4 = "E",
  2530. const std::string& n5 = "F",
  2531. const std::string& n6 = "G",
  2532. const std::string& n7 = "H",
  2533. const std::string& n8 = "I",
  2534. const std::string& n9 = "J")
  2535. {
  2536. if (!_pNames)
  2537. {
  2538. _pNames = new NameVec;
  2539. _pNames->push_back(n0);
  2540. _pNames->push_back(n1);
  2541. _pNames->push_back(n2);
  2542. _pNames->push_back(n3);
  2543. _pNames->push_back(n4);
  2544. _pNames->push_back(n5);
  2545. _pNames->push_back(n6);
  2546. _pNames->push_back(n7);
  2547. _pNames->push_back(n8);
  2548. _pNames->push_back(n9);
  2549. }
  2550. }
  2551. NameVecPtr _pNames;
  2552. };
  2553. template<class T0,
  2554. class T1,
  2555. class T2,
  2556. class T3,
  2557. class T4,
  2558. class T5,
  2559. class T6,
  2560. class T7,
  2561. class T8>
  2562. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,T8,NullTypeList>:
  2563. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8>
  2564. {
  2565. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8> TupleType;
  2566. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7,T8>::Type Type;
  2567. typedef std::vector<std::string> NameVec;
  2568. typedef SharedPtr<NameVec> NameVecPtr;
  2569. NamedTuple(): _pNames(0)
  2570. {
  2571. init();
  2572. }
  2573. NamedTuple(const NameVecPtr& rNames)
  2574. {
  2575. if (rNames->size() != TupleType::length)
  2576. throw InvalidArgumentException("Wrong names vector length.");
  2577. _pNames = rNames;
  2578. }
  2579. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  2580. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2581. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2582. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2583. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2584. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2585. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2586. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2587. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8)):
  2588. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8),
  2589. _pNames(0)
  2590. {
  2591. init();
  2592. }
  2593. NamedTuple(const NameVecPtr& rNames,
  2594. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2595. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2596. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2597. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2598. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2599. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2600. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2601. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2602. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8)):
  2603. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8)
  2604. {
  2605. if (rNames->size() != TupleType::length)
  2606. throw InvalidArgumentException("Wrong names vector length.");
  2607. _pNames = rNames;
  2608. }
  2609. NamedTuple(const std::string& n0,
  2610. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2611. const std::string& n1 = "B",
  2612. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2613. const std::string& n2 = "C",
  2614. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2615. const std::string& n3 = "D",
  2616. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2617. const std::string& n4 = "E",
  2618. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2619. const std::string& n5 = "F",
  2620. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2621. const std::string& n6 = "G",
  2622. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2623. const std::string& n7 = "H",
  2624. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7),
  2625. const std::string& n8 = "I",
  2626. typename TypeWrapper<T8>::CONSTTYPE& t8 = POCO_TYPEWRAPPER_DEFAULTVALUE(T8)):
  2627. TupleType(t0,t1,t2,t3,t4,t5,t6,t7,t8),
  2628. _pNames(0)
  2629. {
  2630. init(n0,n1,n2,n3,n4,n5,n6,n7,n8);
  2631. }
  2632. const DynamicAny get(const std::string& name) const
  2633. {
  2634. NameVec::const_iterator it = _pNames->begin();
  2635. NameVec::const_iterator itEnd = _pNames->end();
  2636. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  2637. {
  2638. if (name == *it)
  2639. {
  2640. switch (counter)
  2641. {
  2642. case 0: return TupleType::template get<0>();
  2643. case 1: return TupleType::template get<1>();
  2644. case 2: return TupleType::template get<2>();
  2645. case 3: return TupleType::template get<3>();
  2646. case 4: return TupleType::template get<4>();
  2647. case 5: return TupleType::template get<5>();
  2648. case 6: return TupleType::template get<6>();
  2649. case 7: return TupleType::template get<7>();
  2650. case 8: return TupleType::template get<8>();
  2651. default: throw RangeException();
  2652. }
  2653. }
  2654. }
  2655. throw NotFoundException("Name not found: " + name);
  2656. }
  2657. const DynamicAny operator [] (const std::string& name) const
  2658. {
  2659. return get(name);
  2660. }
  2661. template<int N>
  2662. typename TypeGetter<N, Type>::ConstHeadType& get() const
  2663. {
  2664. return TupleType::template get<N>();
  2665. }
  2666. template<int N>
  2667. typename TypeGetter<N, Type>::HeadType& get()
  2668. {
  2669. return TupleType::template get<N>();
  2670. }
  2671. template<int N>
  2672. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  2673. {
  2674. return TupleType::template set<N>(val);
  2675. }
  2676. const NameVecPtr& names()
  2677. {
  2678. return _pNames;
  2679. }
  2680. void setName(std::size_t index, const std::string& name)
  2681. {
  2682. if (index >= _pNames->size())
  2683. throw InvalidArgumentException(format("Invalid index: %z", index));
  2684. (*_pNames)[index] = name;
  2685. }
  2686. const std::string& getName(std::size_t index)
  2687. {
  2688. if (index >= _pNames->size())
  2689. throw InvalidArgumentException(format("Invalid index: %z", index));
  2690. return (*_pNames)[index];
  2691. }
  2692. bool operator == (const NamedTuple& other) const
  2693. {
  2694. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  2695. }
  2696. bool operator != (const NamedTuple& other) const
  2697. {
  2698. return !(*this == other);
  2699. }
  2700. bool operator < (const NamedTuple& other) const
  2701. {
  2702. TupleType th(*this);
  2703. TupleType oth(other);
  2704. return (th < oth && _pNames == other._pNames) ||
  2705. (th == oth && _pNames < other._pNames) ||
  2706. (th < oth && _pNames < other._pNames);
  2707. }
  2708. private:
  2709. void init(const std::string& n0 = "A",
  2710. const std::string& n1 = "B",
  2711. const std::string& n2 = "C",
  2712. const std::string& n3 = "D",
  2713. const std::string& n4 = "E",
  2714. const std::string& n5 = "F",
  2715. const std::string& n6 = "G",
  2716. const std::string& n7 = "H",
  2717. const std::string& n8 = "I")
  2718. {
  2719. if (!_pNames)
  2720. {
  2721. _pNames = new NameVec;
  2722. _pNames->push_back(n0);
  2723. _pNames->push_back(n1);
  2724. _pNames->push_back(n2);
  2725. _pNames->push_back(n3);
  2726. _pNames->push_back(n4);
  2727. _pNames->push_back(n5);
  2728. _pNames->push_back(n6);
  2729. _pNames->push_back(n7);
  2730. _pNames->push_back(n8);
  2731. }
  2732. }
  2733. NameVecPtr _pNames;
  2734. };
  2735. template<class T0,
  2736. class T1,
  2737. class T2,
  2738. class T3,
  2739. class T4,
  2740. class T5,
  2741. class T6,
  2742. class T7>
  2743. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,T7,NullTypeList>:
  2744. public Tuple<T0,T1,T2,T3,T4,T5,T6,T7>
  2745. {
  2746. typedef Tuple<T0,T1,T2,T3,T4,T5,T6,T7> TupleType;
  2747. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6,T7>::Type Type;
  2748. typedef std::vector<std::string> NameVec;
  2749. typedef SharedPtr<NameVec> NameVecPtr;
  2750. NamedTuple(): _pNames(0)
  2751. {
  2752. init();
  2753. }
  2754. NamedTuple(const NameVecPtr& rNames)
  2755. {
  2756. if (rNames->size() != TupleType::length)
  2757. throw InvalidArgumentException("Wrong names vector length.");
  2758. _pNames = rNames;
  2759. }
  2760. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  2761. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2762. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2763. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2764. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2765. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2766. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2767. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7)):
  2768. TupleType(t0,t1,t2,t3,t4,t5,t6,t7),
  2769. _pNames(0)
  2770. {
  2771. init();
  2772. }
  2773. NamedTuple(const NameVecPtr& rNames,
  2774. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2775. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2776. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2777. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2778. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2779. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2780. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2781. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7)):
  2782. TupleType(t0,t1,t2,t3,t4,t5,t6,t7)
  2783. {
  2784. if (rNames->size() != TupleType::length)
  2785. throw InvalidArgumentException("Wrong names vector length.");
  2786. _pNames = rNames;
  2787. }
  2788. NamedTuple(const std::string& n0,
  2789. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2790. const std::string& n1 = "B",
  2791. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2792. const std::string& n2 = "C",
  2793. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2794. const std::string& n3 = "D",
  2795. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2796. const std::string& n4 = "E",
  2797. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2798. const std::string& n5 = "F",
  2799. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2800. const std::string& n6 = "G",
  2801. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6),
  2802. const std::string& n7 = "H",
  2803. typename TypeWrapper<T7>::CONSTTYPE& t7 = POCO_TYPEWRAPPER_DEFAULTVALUE(T7)):
  2804. TupleType(t0,t1,t2,t3,t4,t5,t6,t7),
  2805. _pNames(0)
  2806. {
  2807. init(n0,n1,n2,n3,n4,n5,n6,n7);
  2808. }
  2809. const DynamicAny get(const std::string& name) const
  2810. {
  2811. NameVec::const_iterator it = _pNames->begin();
  2812. NameVec::const_iterator itEnd = _pNames->end();
  2813. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  2814. {
  2815. if (name == *it)
  2816. {
  2817. switch (counter)
  2818. {
  2819. case 0: return TupleType::template get<0>();
  2820. case 1: return TupleType::template get<1>();
  2821. case 2: return TupleType::template get<2>();
  2822. case 3: return TupleType::template get<3>();
  2823. case 4: return TupleType::template get<4>();
  2824. case 5: return TupleType::template get<5>();
  2825. case 6: return TupleType::template get<6>();
  2826. case 7: return TupleType::template get<7>();
  2827. default: throw RangeException();
  2828. }
  2829. }
  2830. }
  2831. throw NotFoundException("Name not found: " + name);
  2832. }
  2833. const DynamicAny operator [] (const std::string& name) const
  2834. {
  2835. return get(name);
  2836. }
  2837. template<int N>
  2838. typename TypeGetter<N, Type>::ConstHeadType& get() const
  2839. {
  2840. return TupleType::template get<N>();
  2841. }
  2842. template<int N>
  2843. typename TypeGetter<N, Type>::HeadType& get()
  2844. {
  2845. return TupleType::template get<N>();
  2846. }
  2847. template<int N>
  2848. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  2849. {
  2850. return TupleType::template set<N>(val);
  2851. }
  2852. const NameVecPtr& names()
  2853. {
  2854. return _pNames;
  2855. }
  2856. void setName(std::size_t index, const std::string& name)
  2857. {
  2858. if (index >= _pNames->size())
  2859. throw InvalidArgumentException(format("Invalid index: %z", index));
  2860. (*_pNames)[index] = name;
  2861. }
  2862. const std::string& getName(std::size_t index)
  2863. {
  2864. if (index >= _pNames->size())
  2865. throw InvalidArgumentException(format("Invalid index: %z", index));
  2866. return (*_pNames)[index];
  2867. }
  2868. bool operator == (const NamedTuple& other) const
  2869. {
  2870. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  2871. }
  2872. bool operator != (const NamedTuple& other) const
  2873. {
  2874. return !(*this == other);
  2875. }
  2876. bool operator < (const NamedTuple& other) const
  2877. {
  2878. TupleType th(*this);
  2879. TupleType oth(other);
  2880. return (th < oth && _pNames == other._pNames) ||
  2881. (th == oth && _pNames < other._pNames) ||
  2882. (th < oth && _pNames < other._pNames);
  2883. }
  2884. private:
  2885. void init(const std::string& n0 = "A",
  2886. const std::string& n1 = "B",
  2887. const std::string& n2 = "C",
  2888. const std::string& n3 = "D",
  2889. const std::string& n4 = "E",
  2890. const std::string& n5 = "F",
  2891. const std::string& n6 = "G",
  2892. const std::string& n7 = "H")
  2893. {
  2894. if (!_pNames)
  2895. {
  2896. _pNames = new NameVec;
  2897. _pNames->push_back(n0);
  2898. _pNames->push_back(n1);
  2899. _pNames->push_back(n2);
  2900. _pNames->push_back(n3);
  2901. _pNames->push_back(n4);
  2902. _pNames->push_back(n5);
  2903. _pNames->push_back(n6);
  2904. _pNames->push_back(n7);
  2905. }
  2906. }
  2907. NameVecPtr _pNames;
  2908. };
  2909. template<class T0,
  2910. class T1,
  2911. class T2,
  2912. class T3,
  2913. class T4,
  2914. class T5,
  2915. class T6>
  2916. struct NamedTuple<T0,T1,T2,T3,T4,T5,T6,NullTypeList>:
  2917. public Tuple<T0,T1,T2,T3,T4,T5,T6>
  2918. {
  2919. typedef Tuple<T0,T1,T2,T3,T4,T5,T6> TupleType;
  2920. typedef typename Tuple<T0,T1,T2,T3,T4,T5,T6>::Type Type;
  2921. typedef std::vector<std::string> NameVec;
  2922. typedef SharedPtr<NameVec> NameVecPtr;
  2923. NamedTuple(): _pNames(0)
  2924. {
  2925. init();
  2926. }
  2927. NamedTuple(const NameVecPtr& rNames)
  2928. {
  2929. if (rNames->size() != TupleType::length)
  2930. throw InvalidArgumentException("Wrong names vector length.");
  2931. _pNames = rNames;
  2932. }
  2933. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  2934. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2935. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2936. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2937. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2938. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2939. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6)):
  2940. TupleType(t0,t1,t2,t3,t4,t5,t6), _pNames(0)
  2941. {
  2942. init();
  2943. }
  2944. NamedTuple(const NameVecPtr& rNames,
  2945. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2946. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2947. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2948. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2949. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2950. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2951. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6)):
  2952. TupleType(t0,t1,t2,t3,t4,t5,t6)
  2953. {
  2954. if (rNames->size() != TupleType::length)
  2955. throw InvalidArgumentException("Wrong names vector length.");
  2956. _pNames = rNames;
  2957. }
  2958. NamedTuple(const std::string& n0,
  2959. typename TypeWrapper<T0>::CONSTTYPE& t0,
  2960. const std::string& n1 = "B",
  2961. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  2962. const std::string& n2 = "C",
  2963. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  2964. const std::string& n3 = "D",
  2965. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  2966. const std::string& n4 = "E",
  2967. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  2968. const std::string& n5 = "F",
  2969. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5),
  2970. const std::string& n6 = "G",
  2971. typename TypeWrapper<T6>::CONSTTYPE& t6 = POCO_TYPEWRAPPER_DEFAULTVALUE(T6)):
  2972. TupleType(t0,t1,t2,t3,t4,t5,t6), _pNames(0)
  2973. {
  2974. init(n0,n1,n2,n3,n4,n5,n6);
  2975. }
  2976. const DynamicAny get(const std::string& name) const
  2977. {
  2978. NameVec::const_iterator it = _pNames->begin();
  2979. NameVec::const_iterator itEnd = _pNames->end();
  2980. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  2981. {
  2982. if (name == *it)
  2983. {
  2984. switch (counter)
  2985. {
  2986. case 0: return TupleType::template get<0>();
  2987. case 1: return TupleType::template get<1>();
  2988. case 2: return TupleType::template get<2>();
  2989. case 3: return TupleType::template get<3>();
  2990. case 4: return TupleType::template get<4>();
  2991. case 5: return TupleType::template get<5>();
  2992. case 6: return TupleType::template get<6>();
  2993. default: throw RangeException();
  2994. }
  2995. }
  2996. }
  2997. throw NotFoundException("Name not found: " + name);
  2998. }
  2999. const DynamicAny operator [] (const std::string& name) const
  3000. {
  3001. return get(name);
  3002. }
  3003. template<int N>
  3004. typename TypeGetter<N, Type>::ConstHeadType& get() const
  3005. {
  3006. return TupleType::template get<N>();
  3007. }
  3008. template<int N>
  3009. typename TypeGetter<N, Type>::HeadType& get()
  3010. {
  3011. return TupleType::template get<N>();
  3012. }
  3013. template<int N>
  3014. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  3015. {
  3016. return TupleType::template set<N>(val);
  3017. }
  3018. const NameVecPtr& names()
  3019. {
  3020. return _pNames;
  3021. }
  3022. void setName(std::size_t index, const std::string& name)
  3023. {
  3024. if (index >= _pNames->size())
  3025. throw InvalidArgumentException(format("Invalid index: %z", index));
  3026. (*_pNames)[index] = name;
  3027. }
  3028. const std::string& getName(std::size_t index)
  3029. {
  3030. if (index >= _pNames->size())
  3031. throw InvalidArgumentException(format("Invalid index: %z", index));
  3032. return (*_pNames)[index];
  3033. }
  3034. bool operator == (const NamedTuple& other) const
  3035. {
  3036. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  3037. }
  3038. bool operator != (const NamedTuple& other) const
  3039. {
  3040. return !(*this == other);
  3041. }
  3042. bool operator < (const NamedTuple& other) const
  3043. {
  3044. TupleType th(*this);
  3045. TupleType oth(other);
  3046. return (th < oth && _pNames == other._pNames) ||
  3047. (th == oth && _pNames < other._pNames) ||
  3048. (th < oth && _pNames < other._pNames);
  3049. }
  3050. private:
  3051. void init(const std::string& n0 = "A",
  3052. const std::string& n1 = "B",
  3053. const std::string& n2 = "C",
  3054. const std::string& n3 = "D",
  3055. const std::string& n4 = "E",
  3056. const std::string& n5 = "F",
  3057. const std::string& n6 = "G")
  3058. {
  3059. if (!_pNames)
  3060. {
  3061. _pNames = new NameVec;
  3062. _pNames->push_back(n0);
  3063. _pNames->push_back(n1);
  3064. _pNames->push_back(n2);
  3065. _pNames->push_back(n3);
  3066. _pNames->push_back(n4);
  3067. _pNames->push_back(n5);
  3068. _pNames->push_back(n6);
  3069. }
  3070. }
  3071. NameVecPtr _pNames;
  3072. };
  3073. template<class T0,
  3074. class T1,
  3075. class T2,
  3076. class T3,
  3077. class T4,
  3078. class T5>
  3079. struct NamedTuple<T0,T1,T2,T3,T4,T5,NullTypeList>:
  3080. public Tuple<T0,T1,T2,T3,T4,T5>
  3081. {
  3082. typedef Tuple<T0,T1,T2,T3,T4,T5> TupleType;
  3083. typedef typename Tuple<T0,T1,T2,T3,T4,T5>::Type Type;
  3084. typedef std::vector<std::string> NameVec;
  3085. typedef SharedPtr<NameVec> NameVecPtr;
  3086. NamedTuple(): _pNames(0)
  3087. {
  3088. init();
  3089. }
  3090. NamedTuple(const NameVecPtr& rNames)
  3091. {
  3092. if (rNames->size() != TupleType::length)
  3093. throw InvalidArgumentException("Wrong names vector length.");
  3094. _pNames = rNames;
  3095. }
  3096. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  3097. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3098. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  3099. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  3100. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  3101. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5)):
  3102. TupleType(t0,t1,t2,t3,t4,t5), _pNames(0)
  3103. {
  3104. init();
  3105. }
  3106. NamedTuple(const NameVecPtr& rNames,
  3107. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3108. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3109. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  3110. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  3111. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  3112. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5)):
  3113. TupleType(t0,t1,t2,t3,t4,t5)
  3114. {
  3115. if (rNames->size() != TupleType::length)
  3116. throw InvalidArgumentException("Wrong names vector length.");
  3117. _pNames = rNames;
  3118. }
  3119. NamedTuple(const std::string& n0,
  3120. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3121. const std::string& n1 = "B",
  3122. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3123. const std::string& n2 = "C",
  3124. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  3125. const std::string& n3 = "D",
  3126. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  3127. const std::string& n4 = "E",
  3128. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4),
  3129. const std::string& n5 = "F",
  3130. typename TypeWrapper<T5>::CONSTTYPE& t5 = POCO_TYPEWRAPPER_DEFAULTVALUE(T5)):
  3131. TupleType(t0,t1,t2,t3,t4,t5), _pNames(0)
  3132. {
  3133. init(n0,n1,n2,n3,n4,n5);
  3134. }
  3135. const DynamicAny get(const std::string& name) const
  3136. {
  3137. NameVec::const_iterator it = _pNames->begin();
  3138. NameVec::const_iterator itEnd = _pNames->end();
  3139. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  3140. {
  3141. if (name == *it)
  3142. {
  3143. switch (counter)
  3144. {
  3145. case 0: return TupleType::template get<0>();
  3146. case 1: return TupleType::template get<1>();
  3147. case 2: return TupleType::template get<2>();
  3148. case 3: return TupleType::template get<3>();
  3149. case 4: return TupleType::template get<4>();
  3150. case 5: return TupleType::template get<5>();
  3151. default: throw RangeException();
  3152. }
  3153. }
  3154. }
  3155. throw NotFoundException("Name not found: " + name);
  3156. }
  3157. const DynamicAny operator [] (const std::string& name) const
  3158. {
  3159. return get(name);
  3160. }
  3161. template<int N>
  3162. typename TypeGetter<N, Type>::ConstHeadType& get() const
  3163. {
  3164. return TupleType::template get<N>();
  3165. }
  3166. template<int N>
  3167. typename TypeGetter<N, Type>::HeadType& get()
  3168. {
  3169. return TupleType::template get<N>();
  3170. }
  3171. template<int N>
  3172. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  3173. {
  3174. return TupleType::template set<N>(val);
  3175. }
  3176. const NameVecPtr& names()
  3177. {
  3178. return _pNames;
  3179. }
  3180. void setName(std::size_t index, const std::string& name)
  3181. {
  3182. if (index >= _pNames->size())
  3183. throw InvalidArgumentException(format("Invalid index: %z", index));
  3184. (*_pNames)[index] = name;
  3185. }
  3186. const std::string& getName(std::size_t index)
  3187. {
  3188. if (index >= _pNames->size())
  3189. throw InvalidArgumentException(format("Invalid index: %z", index));
  3190. return (*_pNames)[index];
  3191. }
  3192. bool operator == (const NamedTuple& other) const
  3193. {
  3194. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  3195. }
  3196. bool operator != (const NamedTuple& other) const
  3197. {
  3198. return !(*this == other);
  3199. }
  3200. bool operator < (const NamedTuple& other) const
  3201. {
  3202. TupleType th(*this);
  3203. TupleType oth(other);
  3204. return (th < oth && _pNames == other._pNames) ||
  3205. (th == oth && _pNames < other._pNames) ||
  3206. (th < oth && _pNames < other._pNames);
  3207. }
  3208. private:
  3209. void init(const std::string& n0 = "A",
  3210. const std::string& n1 = "B",
  3211. const std::string& n2 = "C",
  3212. const std::string& n3 = "D",
  3213. const std::string& n4 = "E",
  3214. const std::string& n5 = "F")
  3215. {
  3216. if (!_pNames)
  3217. {
  3218. _pNames = new NameVec;
  3219. _pNames->push_back(n0);
  3220. _pNames->push_back(n1);
  3221. _pNames->push_back(n2);
  3222. _pNames->push_back(n3);
  3223. _pNames->push_back(n4);
  3224. _pNames->push_back(n5);
  3225. }
  3226. }
  3227. NameVecPtr _pNames;
  3228. };
  3229. template<class T0,
  3230. class T1,
  3231. class T2,
  3232. class T3,
  3233. class T4>
  3234. struct NamedTuple<T0,T1,T2,T3,T4,NullTypeList>:
  3235. public Tuple<T0,T1,T2,T3,T4>
  3236. {
  3237. typedef Tuple<T0,T1,T2,T3,T4> TupleType;
  3238. typedef typename Tuple<T0,T1,T2,T3,T4>::Type Type;
  3239. typedef std::vector<std::string> NameVec;
  3240. typedef SharedPtr<NameVec> NameVecPtr;
  3241. NamedTuple(): _pNames(0)
  3242. {
  3243. init();
  3244. }
  3245. NamedTuple(const NameVecPtr& rNames)
  3246. {
  3247. if (rNames->size() != TupleType::length)
  3248. throw InvalidArgumentException("Wrong names vector length.");
  3249. _pNames = rNames;
  3250. }
  3251. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  3252. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3253. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  3254. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  3255. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4)):
  3256. TupleType(t0,t1,t2,t3,t4),
  3257. _pNames(0)
  3258. {
  3259. init();
  3260. }
  3261. NamedTuple(const NameVecPtr& rNames,
  3262. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3263. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3264. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  3265. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  3266. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4)):
  3267. TupleType(t0,t1,t2,t3,t4)
  3268. {
  3269. if (rNames->size() != TupleType::length)
  3270. throw InvalidArgumentException("Wrong names vector length.");
  3271. _pNames = rNames;
  3272. }
  3273. NamedTuple(const std::string& n0,
  3274. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3275. const std::string& n1 = "B",
  3276. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3277. const std::string& n2 = "C",
  3278. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  3279. const std::string& n3 = "D",
  3280. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3),
  3281. const std::string& n4 = "E",
  3282. typename TypeWrapper<T4>::CONSTTYPE& t4 = POCO_TYPEWRAPPER_DEFAULTVALUE(T4)):
  3283. TupleType(t0,t1,t2,t3,t4),
  3284. _pNames(0)
  3285. {
  3286. init(n0,n1,n2,n3,n4);
  3287. }
  3288. const DynamicAny get(const std::string& name) const
  3289. {
  3290. NameVec::const_iterator it = _pNames->begin();
  3291. NameVec::const_iterator itEnd = _pNames->end();
  3292. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  3293. {
  3294. if (name == *it)
  3295. {
  3296. switch (counter)
  3297. {
  3298. case 0: return TupleType::template get<0>();
  3299. case 1: return TupleType::template get<1>();
  3300. case 2: return TupleType::template get<2>();
  3301. case 3: return TupleType::template get<3>();
  3302. case 4: return TupleType::template get<4>();
  3303. default: throw RangeException();
  3304. }
  3305. }
  3306. }
  3307. throw NotFoundException("Name not found: " + name);
  3308. }
  3309. const DynamicAny operator [] (const std::string& name) const
  3310. {
  3311. return get(name);
  3312. }
  3313. template<int N>
  3314. typename TypeGetter<N, Type>::ConstHeadType& get() const
  3315. {
  3316. return TupleType::template get<N>();
  3317. }
  3318. template<int N>
  3319. typename TypeGetter<N, Type>::HeadType& get()
  3320. {
  3321. return TupleType::template get<N>();
  3322. }
  3323. template<int N>
  3324. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  3325. {
  3326. return TupleType::template set<N>(val);
  3327. }
  3328. const NameVecPtr& names()
  3329. {
  3330. return _pNames;
  3331. }
  3332. void setName(std::size_t index, const std::string& name)
  3333. {
  3334. if (index >= _pNames->size())
  3335. throw InvalidArgumentException(format("Invalid index: %z", index));
  3336. (*_pNames)[index] = name;
  3337. }
  3338. const std::string& getName(std::size_t index)
  3339. {
  3340. if (index >= _pNames->size())
  3341. throw InvalidArgumentException(format("Invalid index: %z", index));
  3342. return (*_pNames)[index];
  3343. }
  3344. bool operator == (const NamedTuple& other) const
  3345. {
  3346. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  3347. }
  3348. bool operator != (const NamedTuple& other) const
  3349. {
  3350. return !(*this == other);
  3351. }
  3352. bool operator < (const NamedTuple& other) const
  3353. {
  3354. TupleType th(*this);
  3355. TupleType oth(other);
  3356. return (th < oth && _pNames == other._pNames) ||
  3357. (th == oth && _pNames < other._pNames) ||
  3358. (th < oth && _pNames < other._pNames);
  3359. }
  3360. private:
  3361. void init(const std::string& n0 = "A",
  3362. const std::string& n1 = "B",
  3363. const std::string& n2 = "C",
  3364. const std::string& n3 = "D",
  3365. const std::string& n4 = "E")
  3366. {
  3367. if (!_pNames)
  3368. {
  3369. _pNames = new NameVec;
  3370. _pNames->push_back(n0);
  3371. _pNames->push_back(n1);
  3372. _pNames->push_back(n2);
  3373. _pNames->push_back(n3);
  3374. _pNames->push_back(n4);
  3375. }
  3376. }
  3377. NameVecPtr _pNames;
  3378. };
  3379. template<class T0,
  3380. class T1,
  3381. class T2,
  3382. class T3>
  3383. struct NamedTuple<T0,T1,T2,T3,NullTypeList>:
  3384. public Tuple<T0,T1,T2,T3>
  3385. {
  3386. typedef Tuple<T0,T1,T2,T3> TupleType;
  3387. typedef typename Tuple<T0,T1,T2,T3>::Type Type;
  3388. typedef std::vector<std::string> NameVec;
  3389. typedef SharedPtr<NameVec> NameVecPtr;
  3390. NamedTuple(): _pNames(0)
  3391. {
  3392. init();
  3393. }
  3394. NamedTuple(const NameVecPtr& rNames)
  3395. {
  3396. if (rNames->size() != TupleType::length)
  3397. throw InvalidArgumentException("Wrong names vector length.");
  3398. _pNames = rNames;
  3399. }
  3400. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  3401. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3402. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  3403. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3)):
  3404. TupleType(t0,t1,t2,t3),
  3405. _pNames(0)
  3406. {
  3407. init();
  3408. }
  3409. NamedTuple(const NameVecPtr& rNames,
  3410. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3411. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3412. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  3413. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3)):
  3414. TupleType(t0,t1,t2,t3)
  3415. {
  3416. if (rNames->size() != TupleType::length)
  3417. throw InvalidArgumentException("Wrong names vector length.");
  3418. _pNames = rNames;
  3419. }
  3420. NamedTuple(const std::string& n0,
  3421. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3422. const std::string& n1 = "B",
  3423. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3424. const std::string& n2 = "C",
  3425. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2),
  3426. const std::string& n3 = "D",
  3427. typename TypeWrapper<T3>::CONSTTYPE& t3 = POCO_TYPEWRAPPER_DEFAULTVALUE(T3)):
  3428. TupleType(t0,t1,t2,t3), _pNames(0)
  3429. {
  3430. init(n0,n1,n2,n3);
  3431. }
  3432. const DynamicAny get(const std::string& name) const
  3433. {
  3434. NameVec::const_iterator it = _pNames->begin();
  3435. NameVec::const_iterator itEnd = _pNames->end();
  3436. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  3437. {
  3438. if (name == *it)
  3439. {
  3440. switch (counter)
  3441. {
  3442. case 0: return TupleType::template get<0>();
  3443. case 1: return TupleType::template get<1>();
  3444. case 2: return TupleType::template get<2>();
  3445. case 3: return TupleType::template get<3>();
  3446. default: throw RangeException();
  3447. }
  3448. }
  3449. }
  3450. throw NotFoundException("Name not found: " + name);
  3451. }
  3452. const DynamicAny operator [] (const std::string& name) const
  3453. {
  3454. return get(name);
  3455. }
  3456. template<int N>
  3457. typename TypeGetter<N, Type>::ConstHeadType& get() const
  3458. {
  3459. return TupleType::template get<N>();
  3460. }
  3461. template<int N>
  3462. typename TypeGetter<N, Type>::HeadType& get()
  3463. {
  3464. return TupleType::template get<N>();
  3465. }
  3466. template<int N>
  3467. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  3468. {
  3469. return TupleType::template set<N>(val);
  3470. }
  3471. const NameVecPtr& names()
  3472. {
  3473. return _pNames;
  3474. }
  3475. void setName(std::size_t index, const std::string& name)
  3476. {
  3477. if (index >= _pNames->size())
  3478. throw InvalidArgumentException(format("Invalid index: %z", index));
  3479. (*_pNames)[index] = name;
  3480. }
  3481. const std::string& getName(std::size_t index)
  3482. {
  3483. if (index >= _pNames->size())
  3484. throw InvalidArgumentException(format("Invalid index: %z", index));
  3485. return (*_pNames)[index];
  3486. }
  3487. bool operator == (const NamedTuple& other) const
  3488. {
  3489. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  3490. }
  3491. bool operator != (const NamedTuple& other) const
  3492. {
  3493. return !(*this == other);
  3494. }
  3495. bool operator < (const NamedTuple& other) const
  3496. {
  3497. TupleType th(*this);
  3498. TupleType oth(other);
  3499. return (th < oth && _pNames == other._pNames) ||
  3500. (th == oth && _pNames < other._pNames) ||
  3501. (th < oth && _pNames < other._pNames);
  3502. }
  3503. private:
  3504. void init(const std::string& n0 = "A",
  3505. const std::string& n1 = "B",
  3506. const std::string& n2 = "C",
  3507. const std::string& n3 = "D")
  3508. {
  3509. if (!_pNames)
  3510. {
  3511. _pNames = new NameVec;
  3512. _pNames->push_back(n0);
  3513. _pNames->push_back(n1);
  3514. _pNames->push_back(n2);
  3515. _pNames->push_back(n3);
  3516. }
  3517. }
  3518. NameVecPtr _pNames;
  3519. };
  3520. template<class T0,
  3521. class T1,
  3522. class T2>
  3523. struct NamedTuple<T0,T1,T2,NullTypeList>:
  3524. public Tuple<T0,T1,T2>
  3525. {
  3526. typedef Tuple<T0,T1,T2> TupleType;
  3527. typedef typename Tuple<T0,T1,T2>::Type Type;
  3528. typedef std::vector<std::string> NameVec;
  3529. typedef SharedPtr<NameVec> NameVecPtr;
  3530. NamedTuple(): _pNames(0)
  3531. {
  3532. init();
  3533. }
  3534. NamedTuple(const NameVecPtr& rNames)
  3535. {
  3536. if (rNames->size() != TupleType::length)
  3537. throw InvalidArgumentException("Wrong names vector length.");
  3538. _pNames = rNames;
  3539. }
  3540. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  3541. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3542. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2)):
  3543. TupleType(t0,t1,t2),
  3544. _pNames(0)
  3545. {
  3546. init();
  3547. }
  3548. NamedTuple(const NameVecPtr& rNames,
  3549. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3550. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3551. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2)):
  3552. TupleType(t0,t1,t2)
  3553. {
  3554. if (rNames->size() != TupleType::length)
  3555. throw InvalidArgumentException("Wrong names vector length.");
  3556. _pNames = rNames;
  3557. }
  3558. NamedTuple(const std::string& n0,
  3559. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3560. const std::string& n1 = "B",
  3561. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1),
  3562. const std::string& n2 = "C",
  3563. typename TypeWrapper<T2>::CONSTTYPE& t2 = POCO_TYPEWRAPPER_DEFAULTVALUE(T2)):
  3564. TupleType(t0,t1,t2),
  3565. _pNames(0)
  3566. {
  3567. init(n0,n1,n2);
  3568. }
  3569. const DynamicAny get(const std::string& name) const
  3570. {
  3571. NameVec::const_iterator it = _pNames->begin();
  3572. NameVec::const_iterator itEnd = _pNames->end();
  3573. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  3574. {
  3575. if (name == *it)
  3576. {
  3577. switch (counter)
  3578. {
  3579. case 0: return TupleType::template get<0>();
  3580. case 1: return TupleType::template get<1>();
  3581. case 2: return TupleType::template get<2>();
  3582. default: throw RangeException();
  3583. }
  3584. }
  3585. }
  3586. throw NotFoundException("Name not found: " + name);
  3587. }
  3588. const DynamicAny operator [] (const std::string& name) const
  3589. {
  3590. return get(name);
  3591. }
  3592. template<int N>
  3593. typename TypeGetter<N, Type>::ConstHeadType& get() const
  3594. {
  3595. return TupleType::template get<N>();
  3596. }
  3597. template<int N>
  3598. typename TypeGetter<N, Type>::HeadType& get()
  3599. {
  3600. return TupleType::template get<N>();
  3601. }
  3602. template<int N>
  3603. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  3604. {
  3605. return TupleType::template set<N>(val);
  3606. }
  3607. const NameVecPtr& names()
  3608. {
  3609. return _pNames;
  3610. }
  3611. void setName(std::size_t index, const std::string& name)
  3612. {
  3613. if (index >= _pNames->size())
  3614. throw InvalidArgumentException(format("Invalid index: %z", index));
  3615. (*_pNames)[index] = name;
  3616. }
  3617. const std::string& getName(std::size_t index)
  3618. {
  3619. if (index >= _pNames->size())
  3620. throw InvalidArgumentException(format("Invalid index: %z", index));
  3621. return (*_pNames)[index];
  3622. }
  3623. bool operator == (const NamedTuple& other) const
  3624. {
  3625. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  3626. }
  3627. bool operator != (const NamedTuple& other) const
  3628. {
  3629. return !(*this == other);
  3630. }
  3631. bool operator < (const NamedTuple& other) const
  3632. {
  3633. TupleType th(*this);
  3634. TupleType oth(other);
  3635. return (th < oth && _pNames == other._pNames) ||
  3636. (th == oth && _pNames < other._pNames) ||
  3637. (th < oth && _pNames < other._pNames);
  3638. }
  3639. private:
  3640. void init(const std::string& n0 = "A",
  3641. const std::string& n1 = "B",
  3642. const std::string& n2 = "C")
  3643. {
  3644. if (!_pNames)
  3645. {
  3646. _pNames = new NameVec;
  3647. _pNames->push_back(n0);
  3648. _pNames->push_back(n1);
  3649. _pNames->push_back(n2);
  3650. }
  3651. }
  3652. NameVecPtr _pNames;
  3653. };
  3654. template<class T0,
  3655. class T1>
  3656. struct NamedTuple<T0,T1,NullTypeList>:
  3657. public Tuple<T0,T1>
  3658. {
  3659. typedef Tuple<T0,T1> TupleType;
  3660. typedef typename Tuple<T0,T1>::Type Type;
  3661. typedef std::vector<std::string> NameVec;
  3662. typedef SharedPtr<NameVec> NameVecPtr;
  3663. NamedTuple(): _pNames(0)
  3664. {
  3665. init();
  3666. }
  3667. NamedTuple(const NameVecPtr& rNames)
  3668. {
  3669. if (rNames->size() != TupleType::length)
  3670. throw InvalidArgumentException("Wrong names vector length.");
  3671. _pNames = rNames;
  3672. }
  3673. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0,
  3674. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1)):
  3675. TupleType(t0,t1),
  3676. _pNames(0)
  3677. {
  3678. init();
  3679. }
  3680. NamedTuple(const NameVecPtr& rNames,
  3681. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3682. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1)):
  3683. TupleType(t0,t1)
  3684. {
  3685. if (rNames->size() != TupleType::length)
  3686. throw InvalidArgumentException("Wrong names vector length.");
  3687. _pNames = rNames;
  3688. }
  3689. NamedTuple(const std::string& n0,
  3690. typename TypeWrapper<T0>::CONSTTYPE& t0,
  3691. const std::string& n1 = "B",
  3692. typename TypeWrapper<T1>::CONSTTYPE& t1 = POCO_TYPEWRAPPER_DEFAULTVALUE(T1)):
  3693. TupleType(t0,t1),
  3694. _pNames(0)
  3695. {
  3696. init(n0,n1);
  3697. }
  3698. const DynamicAny get(const std::string& name) const
  3699. {
  3700. NameVec::const_iterator it = _pNames->begin();
  3701. NameVec::const_iterator itEnd = _pNames->end();
  3702. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  3703. {
  3704. if (name == *it)
  3705. {
  3706. switch (counter)
  3707. {
  3708. case 0: return TupleType::template get<0>();
  3709. case 1: return TupleType::template get<1>();
  3710. default: throw RangeException();
  3711. }
  3712. }
  3713. }
  3714. throw NotFoundException("Name not found: " + name);
  3715. }
  3716. const DynamicAny operator [] (const std::string& name) const
  3717. {
  3718. return get(name);
  3719. }
  3720. template<int N>
  3721. typename TypeGetter<N, Type>::ConstHeadType& get() const
  3722. {
  3723. return TupleType::template get<N>();
  3724. }
  3725. template<int N>
  3726. typename TypeGetter<N, Type>::HeadType& get()
  3727. {
  3728. return TupleType::template get<N>();
  3729. }
  3730. template<int N>
  3731. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  3732. {
  3733. return TupleType::template set<N>(val);
  3734. }
  3735. const NameVecPtr& names()
  3736. {
  3737. return _pNames;
  3738. }
  3739. void setName(std::size_t index, const std::string& name)
  3740. {
  3741. if (index >= _pNames->size())
  3742. throw InvalidArgumentException(format("Invalid index: %z", index));
  3743. (*_pNames)[index] = name;
  3744. }
  3745. const std::string& getName(std::size_t index)
  3746. {
  3747. if (index >= _pNames->size())
  3748. throw InvalidArgumentException(format("Invalid index: %z", index));
  3749. return (*_pNames)[index];
  3750. }
  3751. bool operator == (const NamedTuple& other) const
  3752. {
  3753. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  3754. }
  3755. bool operator != (const NamedTuple& other) const
  3756. {
  3757. return !(*this == other);
  3758. }
  3759. bool operator < (const NamedTuple& other) const
  3760. {
  3761. TupleType th(*this);
  3762. TupleType oth(other);
  3763. return (th < oth && _pNames == other._pNames) ||
  3764. (th == oth && _pNames < other._pNames) ||
  3765. (th < oth && _pNames < other._pNames);
  3766. }
  3767. private:
  3768. void init(const std::string& n0 = "A",
  3769. const std::string& n1 = "B")
  3770. {
  3771. if (!_pNames)
  3772. {
  3773. _pNames = new NameVec;
  3774. _pNames->push_back(n0);
  3775. _pNames->push_back(n1);
  3776. }
  3777. }
  3778. NameVecPtr _pNames;
  3779. };
  3780. template<class T0>
  3781. struct NamedTuple<T0,NullTypeList>:
  3782. public Tuple<T0>
  3783. {
  3784. typedef Tuple<T0> TupleType;
  3785. typedef typename Tuple<T0>::Type Type;
  3786. typedef std::vector<std::string> NameVec;
  3787. typedef SharedPtr<NameVec> NameVecPtr;
  3788. NamedTuple(): _pNames(0)
  3789. {
  3790. init();
  3791. }
  3792. NamedTuple(const NameVecPtr& rNames)
  3793. {
  3794. if (rNames->size() != TupleType::length)
  3795. throw InvalidArgumentException("Wrong names vector length.");
  3796. _pNames = rNames;
  3797. }
  3798. NamedTuple(typename TypeWrapper<T0>::CONSTTYPE& t0):
  3799. TupleType(t0),
  3800. _pNames(0)
  3801. {
  3802. init();
  3803. }
  3804. NamedTuple(const NameVecPtr& rNames,
  3805. typename TypeWrapper<T0>::CONSTTYPE& t0):
  3806. TupleType(t0)
  3807. {
  3808. if (rNames->size() != TupleType::length)
  3809. throw InvalidArgumentException("Wrong names vector length.");
  3810. _pNames = rNames;
  3811. }
  3812. NamedTuple(const std::string& n0, typename TypeWrapper<T0>::CONSTTYPE& t0):
  3813. TupleType(t0),
  3814. _pNames(0)
  3815. {
  3816. init(n0);
  3817. }
  3818. const DynamicAny get(const std::string& name) const
  3819. {
  3820. NameVec::const_iterator it = _pNames->begin();
  3821. NameVec::const_iterator itEnd = _pNames->end();
  3822. for(std::size_t counter = 0; it != itEnd; ++it, ++counter)
  3823. {
  3824. if (name == *it)
  3825. {
  3826. switch (counter)
  3827. {
  3828. case 0: return TupleType::template get<0>();
  3829. default: throw RangeException();
  3830. }
  3831. }
  3832. }
  3833. throw NotFoundException("Name not found: " + name);
  3834. }
  3835. const DynamicAny operator [] (const std::string& name) const
  3836. {
  3837. return get(name);
  3838. }
  3839. template<int N>
  3840. typename TypeGetter<N, Type>::ConstHeadType& get() const
  3841. {
  3842. return TupleType::template get<N>();
  3843. }
  3844. template<int N>
  3845. typename TypeGetter<N, Type>::HeadType& get()
  3846. {
  3847. return TupleType::template get<N>();
  3848. }
  3849. template<int N>
  3850. void set(typename TypeGetter<N, Type>::ConstHeadType& val)
  3851. {
  3852. return TupleType::template set<N>(val);
  3853. }
  3854. const NameVecPtr& names()
  3855. {
  3856. return _pNames;
  3857. }
  3858. void setName(std::size_t index, const std::string& name)
  3859. {
  3860. if (index >= _pNames->size())
  3861. throw InvalidArgumentException(format("Invalid index: %z", index));
  3862. (*_pNames)[index] = name;
  3863. }
  3864. const std::string& getName(std::size_t index)
  3865. {
  3866. if (index >= _pNames->size())
  3867. throw InvalidArgumentException(format("Invalid index: %z", index));
  3868. return (*_pNames)[index];
  3869. }
  3870. bool operator == (const NamedTuple& other) const
  3871. {
  3872. return TupleType(*this) == TupleType(other) && _pNames == other._pNames;
  3873. }
  3874. bool operator != (const NamedTuple& other) const
  3875. {
  3876. return !(*this == other);
  3877. }
  3878. bool operator < (const NamedTuple& other) const
  3879. {
  3880. TupleType th(*this);
  3881. TupleType oth(other);
  3882. return (th < oth && _pNames == other._pNames) ||
  3883. (th == oth && _pNames < other._pNames) ||
  3884. (th < oth && _pNames < other._pNames);
  3885. }
  3886. private:
  3887. void init(const std::string& n0 = "A")
  3888. {
  3889. if (!_pNames)
  3890. {
  3891. _pNames = new NameVec;
  3892. _pNames->push_back(n0);
  3893. }
  3894. }
  3895. NameVecPtr _pNames;
  3896. };
  3897. } // namespace Poco
  3898. #endif // Foundation_Tuple_INCLUDED