4#include "Stroika/Foundation/Characters/String2Int.h"
7#include "Stroika/Foundation/Containers/Support/ReserveTweaks.h"
8#include "Stroika/Foundation/DataExchange/BadFormatException.h"
20 class Registry::SimpleReader_ :
public IElementConsumer {
22 SimpleReader_ (T* intoVal)
29 virtual void Activated ([[maybe_unused]] Context& r)
override
33 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override
35 ThrowUnRecognizedStartElt (name);
37 virtual void HandleTextInside (
const String& text)
override
41 virtual void Deactivating ()
override;
49 return IElementConsumer::AsFactory<T, SimpleReader_> ();
53 Characters::StringBuilder<> fBuf_{};
57 void Registry::SimpleReader_<String>::Deactivating ();
59 void Registry::SimpleReader_<char>::Deactivating ();
61 void Registry::SimpleReader_<unsigned char>::Deactivating ();
63 void Registry::SimpleReader_<short>::Deactivating ();
65 void Registry::SimpleReader_<unsigned short>::Deactivating ();
67 void Registry::SimpleReader_<int>::Deactivating ();
69 void Registry::SimpleReader_<unsigned int>::Deactivating ();
71 void Registry::SimpleReader_<long int>::Deactivating ();
73 void Registry::SimpleReader_<unsigned long int>::Deactivating ();
75 void Registry::SimpleReader_<long long int>::Deactivating ();
77 void Registry::SimpleReader_<unsigned long long int>::Deactivating ();
79 void Registry::SimpleReader_<bool>::Deactivating ();
81 void Registry::SimpleReader_<float>::Deactivating ();
83 void Registry::SimpleReader_<double>::Deactivating ();
85 void Registry::SimpleReader_<long double>::Deactivating ();
87 void Registry::SimpleReader_<Time::DateTime>::Deactivating ();
89 void Registry::SimpleReader_<Time::Duration>::Deactivating ();
96 template <
typename TARGET_TYPE,
typename READER,
typename... ARGS>
99 return Registry::ConvertReaderToFactory<TARGET_TYPE, READER> (forward<ARGS> (args)...);
107 inline Context::Context (
const Registry& registry)
108 : fObjectReaderRegistry_{registry}
111 inline Context::Context (Context&& from) noexcept
112 : fObjectReaderRegistry_{from.fObjectReaderRegistry_}
113 , fStack_{move (from.fStack_)}
116 inline void Context::Push (
const shared_ptr<IElementConsumer>& elt)
118 using namespace Characters::Literals;
120#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
121 if (fTraceThisReader) {
122 DISABLE_COMPILER_CLANG_WARNING_START (
"clang diagnostic ignored \"-Wpotentially-evaluated-expression\"");
123 DbgTrace (
"{}Context::Push [{}]"_f, TraceLeader_ (), type_index{
typeid (*elt.get ())});
124 DISABLE_COMPILER_CLANG_WARNING_END (
"clang diagnostic ignored \"-Wpotentially-evaluated-expression\"");
127 Containers::Support::ReserveTweaks::Reserve4Add1 (fStack_);
128 fStack_.push_back (elt);
129 elt->Activated (*
this);
131 inline void Context::Pop ()
133 using namespace Characters::Literals;
134 fStack_.back ()->Deactivating ();
136#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
137 if (fTraceThisReader) {
138 if (fStack_.empty ()) {
139 DbgTrace (
"{}Context::Popped [empty stack]"_f, TraceLeader_ ());
142 DISABLE_COMPILER_CLANG_WARNING_START (
"clang diagnostic ignored \"-Wpotentially-evaluated-expression\"");
143 DbgTrace (L
"{}Context::Popped [back to: {}]"_f, TraceLeader_ (), type_index{
typeid (*GetTop ().get ())});
144 DISABLE_COMPILER_CLANG_WARNING_END (
"clang diagnostic ignored \"-Wpotentially-evaluated-expression\"");
149 inline shared_ptr<IElementConsumer> Context::GetTop ()
const
151 Require (not fStack_.empty ());
152 return fStack_.back ();
154 inline const Registry& Context::GetObjectReaderRegistry ()
const
156 return fObjectReaderRegistry_;
158 inline bool Context::empty ()
const
160 return fStack_.empty ();
168 inline IConsumerDelegateToContext::IConsumerDelegateToContext (Context&& r)
172 inline IConsumerDelegateToContext::IConsumerDelegateToContext (
const Registry& registry)
176 inline IConsumerDelegateToContext::IConsumerDelegateToContext (
const Registry& registry,
const shared_ptr<IElementConsumer>& initialTop)
177 : fContext{registry, initialTop}
186 inline StructFieldInfo::StructFieldInfo (
const Name& serializedFieldName,
const StructFieldMetaInfo& fieldMetaInfo,
187 const optional<ReaderFromVoidStarFactory>& typeMapper)
188 : fSerializedFieldName{serializedFieldName}
189 , fFieldMetaInfo{fieldMetaInfo}
190 , fOverrideTypeMapper{typeMapper}
199 template <
typename T>
200 ClassReader<T>::ClassReader (
const Traversal::Iterable<StructFieldInfo>& fieldDescriptions, T* vp)
201 : fFieldDescriptions_{fieldDescriptions}
205 for (
const StructFieldInfo& i : fieldDescriptions) {
206 if (i.fSerializedFieldName.fType == Name::eValue) {
207 fValueFieldMetaInfo_ = i.fFieldMetaInfo;
210 fFieldNameToTypeMap_.Add (i.fSerializedFieldName, i.fFieldMetaInfo);
214 template <
typename T>
215 void ClassReader<T>::Activated (Context& r)
217 Require (fActiveContext_ ==
nullptr);
218 fActiveContext_ = &r;
220 template <
typename T>
221 shared_ptr<IElementConsumer> ClassReader<T>::HandleChildStart (
const Name& name)
224 optional<StructFieldMetaInfo> ti = fFieldNameToTypeMap_.Lookup (name);
226 byte* operatingOnObjField = ti->GetAddressOfMember (this->fValuePtr_);
228 return factory (operatingOnObjField);
230 else if (fThrowOnUnrecongizedelts_) {
231 ThrowUnRecognizedStartElt (name);
234 return make_shared<IgnoreNodeReader> ();
237 template <
typename T>
238 void ClassReader<T>::HandleTextInside (
const String& text)
241 if (fValueFieldMetaInfo_) {
242 Assert (fValueFieldConsumer_ ==
nullptr);
243 byte* operatingOnObjField = fValueFieldMetaInfo_->GetAddressOfMember (this->fValuePtr_);
245 fValueFieldConsumer_ = (factory)(operatingOnObjField);
246 fValueFieldConsumer_->Activated (*fActiveContext_);
247 fValueFieldMetaInfo_ = nullopt;
249 if (fValueFieldConsumer_) {
250 fValueFieldConsumer_->HandleTextInside (text);
253 template <
typename T>
254 void ClassReader<T>::Deactivating ()
257 if (fValueFieldConsumer_) {
258 fValueFieldConsumer_->Deactivating ();
260 fActiveContext_ =
nullptr;
262 template <
typename T>
265 return IElementConsumer::AsFactory<T, ClassReader> ();
267 template <
typename T>
270 using namespace Characters::Literals;
272 for (
const StructFieldInfo& i : fFieldDescriptions_) {
273 if (i.fSerializedFieldName == name) {
274 if (i.fOverrideTypeMapper) {
275 return *i.fOverrideTypeMapper;
278 optional<ReaderFromVoidStarFactory> o = fActiveContext_->GetObjectReaderRegistry ().Lookup (i.fFieldMetaInfo.GetTypeInfo ());
280 if (not o.has_value ()) {
281 DbgTrace (
"(forTypeInfo = {}) - UnRegistered Type!"_f, i.fFieldMetaInfo);
298 template <
typename CONTAINER_OF_T>
299 inline ListOfObjectsReader<CONTAINER_OF_T>::ListOfObjectsReader (CONTAINER_OF_T* v)
304 template <
typename CONTAINER_OF_T>
305 inline ListOfObjectsReader<CONTAINER_OF_T>::ListOfObjectsReader (CONTAINER_OF_T* v,
const Name& memberElementName)
307 , fMemberElementName_ (memberElementName)
311 template <
typename CONTAINER_OF_T>
314 Require (fActiveContext_ ==
nullptr);
315 fActiveContext_ = &r;
317 template <
typename CONTAINER_OF_T>
321 if (not fMemberElementName_.has_value () or name == *fMemberElementName_) {
322 return make_shared<RepeatedElementReader<CONTAINER_OF_T>> (fValuePtr_);
324 else if (fThrowOnUnrecongizedelts_) {
325 ThrowUnRecognizedStartElt (name);
328 return make_shared<IgnoreNodeReader> ();
331 template <
typename CONTAINER_OF_T>
335 fActiveContext_ =
nullptr;
337 template <
typename CONTAINER_OF_T>
340 return IElementConsumer::AsFactory<CONTAINER_OF_T, ListOfObjectsReader> ();
342 template <
typename CONTAINER_OF_T>
345 return IElementConsumer::AsFactory<CONTAINER_OF_T, ListOfObjectsReader> (memberElementName);
353 template <
typename T,
typename TRAITS>
354 OptionalTypesReader<T, TRAITS>::OptionalTypesReader (optional<T>* intoVal)
359 template <
typename T,
typename TRAITS>
362 Assert (fActualReader_ ==
nullptr);
364 fActualReader_->Activated (r);
366 template <
typename T,
typename TRAITS>
370 return fActualReader_->HandleChildStart (name);
372 template <
typename T,
typename TRAITS>
376 fActualReader_->HandleTextInside (text);
378 template <
typename T,
typename TRAITS>
382 fActualReader_->Deactivating ();
383 fActualReader_.reset ();
384 *fValue_ = fProxyValue_;
386 template <
typename T,
typename TRAITS>
397 template <
typename T>
398 const function<
byte*(T*)> MixinReader<T>::MixinEltTraits::kDefaultAddressOfSubElementFetcher =
399 [] (T* b) {
return reinterpret_cast<byte*
> (b); };
400 template <
typename T>
401 inline MixinReader<T>::MixinEltTraits::MixinEltTraits (
const ReaderFromVoidStarFactory& readerFactory,
const function<
byte*(T*)>& addressOfSubEltFetcher)
402 : fReaderFactory{readerFactory}
403 , fAddressOfSubElementFetcher{addressOfSubEltFetcher}
406 template <
typename T>
408 const function<
bool (
const Name& name)>& readsName,
const function<
byte*(T*)>& addressOfSubEltFetcher)
409 : fReaderFactory{readerFactory}
410 , fReadsName{readsName}
411 , fAddressOfSubElementFetcher{addressOfSubEltFetcher}
414 template <
typename T>
415 inline MixinReader<T>::MixinEltTraits::MixinEltTraits (
const ReaderFromVoidStarFactory& readerFactory,
const function<
bool ()>& readsText,
416 const function<
byte*(T*)>& addressOfSubEltFetcher)
417 : fReaderFactory{readerFactory}
418 , fReadsText{readsText}
419 , fAddressOfSubElementFetcher{addressOfSubEltFetcher}
422 template <
typename T>
424 const function<
bool (
const Name& name)>& readsName,
425 const function<
bool ()>& readsText,
const function<
byte*(T*)>& addressOfSubEltFetcher)
426 : fReaderFactory{readerFactory}
427 , fReadsName{readsName}
428 , fReadsText{readsText}
429 , fAddressOfSubElementFetcher{addressOfSubEltFetcher}
433 template <
typename T>
434 MixinReader<T>::MixinReader (T* vp,
const Traversal::Iterable<MixinEltTraits>& mixins)
439 for (
const MixinEltTraits& m : mixins) {
440 fMixinReaders_ += m.fReaderFactory (m.fAddressOfSubElementFetcher (vp));
443 template <
typename T>
444 void MixinReader<T>::Activated (Context& r)
446 Require (fActiveContext_ ==
nullptr);
447 fActiveContext_ = &r;
449 template <
typename T>
450 shared_ptr<IElementConsumer> MixinReader<T>::HandleChildStart (
const Name& name)
454 for (
const MixinEltTraits& m : fMixins_) {
455 if (m.fReadsName (name)) {
456 shared_ptr<IElementConsumer> reader = fMixinReaders_[idx];
457 if (not fActivatedReaders_.Contains (reader)) {
458 reader->Activated (*fActiveContext_);
459 fActivatedReaders_.Add (reader);
461 return reader->HandleChildStart (name);
465 return make_shared<IgnoreNodeReader> ();
467 template <
typename T>
468 void MixinReader<T>::HandleTextInside (
const String& text)
472 for (
const MixinEltTraits& m : fMixins_) {
473 if (m.fReadsText ()) {
474 shared_ptr<IElementConsumer> reader = fMixinReaders_[idx];
475 if (not fActivatedReaders_.Contains (reader)) {
476 reader->Activated (*fActiveContext_);
477 fActivatedReaders_.Add (reader);
479 fMixinReaders_[idx]->HandleTextInside (text);
484 template <
typename T>
485 void MixinReader<T>::Deactivating ()
488 for (shared_ptr<IElementConsumer> reader : fActivatedReaders_) {
489 reader->Deactivating ();
491 fActiveContext_ =
nullptr;
493 template <
typename T>
496 return IElementConsumer::AsFactory<T, MixinReader> (mixins);
504 template <
typename T>
505 RangeReader<T>::RangeReader (T* intoVal,
const pair<Name, Name>& pairNames)
506 : fPairNames{pairNames}
511 template <
typename T>
514 Assert (fActualReader_ ==
nullptr);
515 fActualReader_ = Registry::MakeClassReader<RangeData_> ({
516 {fPairNames.first, &RangeData_::fLowerBound},
517 {fPairNames.second, &RangeData_::fUpperBound},
519 fActualReader_->Activated (r);
521 template <
typename T>
525 return fActualReader_->HandleChildStart (name);
527 template <
typename T>
531 fActualReader_->HandleTextInside (text);
533 template <
typename T>
537 fActualReader_->Deactivating ();
538 fActualReader_.reset ();
539 *fValue_ = T{fProxyValue_.fLowerBound, fProxyValue_.fUpperBound};
541 template <
typename T>
544 return Registry::ConvertReaderToFactory<T, RangeReader> (pairNames);
554 return [] (
void*) -> shared_ptr<IElementConsumer> {
return make_shared<IgnoreNodeReader> (); };
564 return [theUseReader] (
void* p) -> shared_ptr<IElementConsumer> {
return make_shared<ReadDownToReader> (theUseReader (p)); };
568 return [theUseReader, tagToHandOff] (
void* p) -> shared_ptr<IElementConsumer> {
569 return make_shared<ReadDownToReader> (theUseReader (p), tagToHandOff);
578 template <
typename T,
typename TRAITS>
579 inline RepeatedElementReader<T, TRAITS>::RepeatedElementReader (ContainerType* v)
583 template <
typename T,
typename TRAITS>
584 inline RepeatedElementReader<T, TRAITS>::RepeatedElementReader (ContainerType* pv,
const ReaderFromVoidStarFactory& actualElementFactory)
586 , fReaderRactory_{actualElementFactory}
589 template <
typename T,
typename TRAITS>
590 inline RepeatedElementReader<T, TRAITS>::RepeatedElementReader (ContainerType* v,
const Name& readonlyThisName,
593 , fReaderRactory_{actualElementFactory}
594 , fReadThisName_{[readonlyThisName] (const Name& n) {
return n == readonlyThisName; }}
597 template <
typename T,
typename TRAITS>
598 inline RepeatedElementReader<T, TRAITS>::RepeatedElementReader (ContainerType* v,
const Name& readonlyThisName)
600 , fReadThisName_{[readonlyThisName] (const Name& n) {
return n == readonlyThisName; }}
603 template <
typename T,
typename TRAITS>
604 void RepeatedElementReader<T, TRAITS>::Activated (Context& r)
606 Assert (fActiveSubReader_ ==
nullptr);
607 fActiveSubReader_ = fReaderRactory_ ? (*fReaderRactory_) (&fProxyValue_) : r.GetObjectReaderRegistry ().MakeContextReader (&fProxyValue_);
608 fActiveSubReader_->Activated (r);
610 template <
typename T,
typename TRAITS>
611 shared_ptr<IElementConsumer> RepeatedElementReader<T, TRAITS>::HandleChildStart (
const Name& name)
614 if (fReadThisName_ (name)) {
615 return fActiveSubReader_->HandleChildStart (name);
619 else if (fThrowOnUnrecongizedelts_) {
620 ThrowUnRecognizedStartElt (name);
624 return make_shared<IgnoreNodeReader> ();
627 template <
typename T,
typename TRAITS>
628 void RepeatedElementReader<T, TRAITS>::HandleTextInside (
const String& text)
631 fActiveSubReader_->HandleTextInside (text);
633 template <
typename T,
typename TRAITS>
634 void RepeatedElementReader<T, TRAITS>::Deactivating ()
637 fActiveSubReader_->Deactivating ();
638 fActiveSubReader_.reset ();
639 TRAITS::ContainerAdapterAdder::Add (fValuePtr_, fProxyValue_);
641 template <
typename T,
typename TRAITS>
644 return IElementConsumer::AsFactory<T, RepeatedElementReader> ();
646 template <
typename T,
typename TRAITS>
650 return IElementConsumer::AsFactory<T, RepeatedElementReader> (readonlyThisName, actualElementFactory);
652 template <
typename T,
typename TRAITS>
655 return IElementConsumer::AsFactory<T, RepeatedElementReader> (actualElementFactory);
657 template <
typename T,
typename TRAITS>
660 return IElementConsumer::AsFactory<T, RepeatedElementReader> (readonlyThisName);
670 fFactories_.
Add (forType, readerFactory);
672 template <
typename T>
673 void Registry::Add (
const ReaderFromTStarFactory<T>& readerFactory)
675 Add (
typeid (T), [readerFactory] (
void* data) {
return readerFactory (
reinterpret_cast<T*
> (data)); });
681 using namespace Characters;
683 "FAILED TO FIND READER! (forTypeInfo = {}) - Use of UnRegistered Type!"_f, ti};
687 return factory (destinationObject);
689 template <
typename T>
694 template <
typename T,
typename... ARGS>
697 Add<T> (MakeCommonReader<T> (forward<ARGS> (args)...));
699 inline optional<ReaderFromVoidStarFactory> Registry::Lookup (type_index t)
const
701 return fFactories_.
Lookup (t);
703 template <
typename CLASS>
707 for (
const auto& kv : fieldDescriptions) {
708 if (not kv.fOverrideTypeMapper.has_value () and not fFactories_.
ContainsKey (kv.fFieldMetaInfo.GetTypeInfo ())) {
709 using namespace Characters;
711 "CLASS={} field-TypeInfo-not-found = {}, for field named '{}' - UnRegistered Type!"_f,
712 type_index{
typeid (CLASS)}, kv.fFieldMetaInfo.GetTypeInfo (), kv.fSerializedFieldName};
717 Add<CLASS> (MakeClassReader<CLASS> (fieldDescriptions));
719 template <
typename CLASS>
722 return [fieldDescriptions] (
void* data) -> shared_ptr<IElementConsumer> {
723 return make_shared<ClassReader<CLASS>> (fieldDescriptions,
reinterpret_cast<CLASS*
> (data));
726 template <
typename T,
typename READER,
typename... ARGS>
729 ReaderFromTStarFactory<T> tmpFactory{
730 [args...] (T* o) -> shared_ptr<IElementConsumer> {
return make_shared<READER> (o, forward<ARGS> (args)...); }};
731 return [tmpFactory] (
void* data) {
return tmpFactory (
reinterpret_cast<T*
> (data)); };
733 template <
typename T>
736 return [tf] (
void* data) {
return tf (
reinterpret_cast<T*
> (data)); };
738 template <
typename T>
741 return cvtFactory_<T> ([] (T* o) -> shared_ptr<IElementConsumer> {
return make_shared<SimpleReader_<T>> (o); });
743 template <
typename ENUM_TYPE>
746 using namespace Characters::Literals;
747 struct myReader_ :
public IElementConsumer {
755 Characters::StringBuilder<> fBuf_{};
756 ENUM_TYPE* fValue_{};
757 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override
759 ThrowUnRecognizedStartElt (name);
761 virtual void HandleTextInside (
const String& text)
override
765 virtual void Deactivating ()
override
767 if (
auto optVal = fNameMap.
InverseLookup (fBuf_.str ())) [[likely]] {
771 DbgTrace (
"Enumeration ('{}') value '{}' out of range"_f, type_index{
typeid (ENUM_TYPE)}, fBuf_.str ());
772 static const auto kException_ = BadFormatException{
"Enumeration value out of range"sv};
773 Execution::Throw (kException_);
777 return cvtFactory_<ENUM_TYPE> (
778 [nameMap] (ENUM_TYPE* o) -> shared_ptr<IElementConsumer> {
return make_shared<myReader_> (nameMap, o); });
780 template <
typename ENUM_TYPE>
783 return MakeCommonReader_NamedEnumerations (Containers::Bijection<ENUM_TYPE, String> (nameMap));
785 template <
typename ENUM_TYPE>
788 Add<ENUM_TYPE> (MakeCommonReader_NamedEnumerations<ENUM_TYPE> (nameMap));
790 template <
typename ENUM_TYPE>
793 Add<ENUM_TYPE> (MakeCommonReader_NamedEnumerations<ENUM_TYPE> (nameMap));
795 template <
typename ENUM_TYPE>
798 using namespace Characters;
799 struct myReader_ :
public IElementConsumer {
800 myReader_ (ENUM_TYPE* intoVal)
805 Characters::StringBuilder<> fBuf_{};
806 ENUM_TYPE* fValue_{};
807 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override
809 ThrowUnRecognizedStartElt (name);
811 virtual void HandleTextInside (
const String& text)
override
815 virtual void Deactivating ()
override
817 using SerializeAsType =
typename std::underlying_type<ENUM_TYPE>::type;
818 SerializeAsType tmp = Characters::String2Int<SerializeAsType> (fBuf_.str ());
819 if (Common::ToInt (ENUM_TYPE::eSTART) <= tmp and tmp < Common::ToInt (ENUM_TYPE::eEND)) [[likely]] {
820 *fValue_ = Common::ToEnum<ENUM_TYPE> (tmp);
823 DbgTrace (
"Enumeration ('{}') value '{}' out of range"_f, type_index{
typeid (ENUM_TYPE)}, fBuf_);
824 static const auto kException_ = BadFormatException{
"Enumeration value out of range"sv};
825 Execution::Throw (kException_);
829 return cvtFactory_<ENUM_TYPE> ([] (ENUM_TYPE* o) -> shared_ptr<IElementConsumer> {
return make_shared<myReader_> (o); });
831 template <
typename ENUM_TYPE>
834 Add<ENUM_TYPE> (MakeCommonReader_EnumAsInt<ENUM_TYPE> ());
836 template <
typename T>
839 using namespace Characters;
840 struct myReader_ :
public IElementConsumer {
841 function<T (String)> fString2TMapper_;
842 myReader_ (
const function<T (String)>& converterFromString2T, T* intoVal)
843 : fString2TMapper_{converterFromString2T}
848 Characters::StringBuilder<> fBuf_{};
850 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override
852 ThrowUnRecognizedStartElt (name);
854 virtual void HandleTextInside (
const String& text)
override
858 virtual void Deactivating ()
override
860 *fValue_ = fString2TMapper_ (fBuf_.str ());
863 return cvtFactory_<T> (
864 [converterFromString2T] (T* o) -> shared_ptr<IElementConsumer> {
return make_shared<myReader_> (converterFromString2T, o); });
866 template <
typename T>
869 Add<T> (MakeCommonReader_Simple<T> (converterFromString2T));
873 return MakeCommonReader_SimpleReader_<String> ();
877 return MakeCommonReader_SimpleReader_<IO::Network::URI> ();
879 template <
typename T>
881 requires (is_enum_v<T>)
883 return MakeCommonReader_NamedEnumerations<T> ();
885 template <
typename T>
887 requires (is_trivially_copyable_v<T> and is_standard_layout_v<T> and not is_enum_v<T>)
889 return MakeCommonReader_SimpleReader_<T> ();
893 return MakeCommonReader_SimpleReader_<Time::DateTime> ();
897 return MakeCommonReader_SimpleReader_<Time::Duration> ();
899 template <
typename T>
904 template <
typename T>
907 return ListOfObjectsReader<vector<T>>::AsFactory ();
909 template <
typename T>
912 return ListOfObjectsReader<vector<T>>::AsFactory (name);
914 template <
typename T>
917 return ListOfObjectsReader<Collection<T>>::AsFactory ();
919 template <
typename T>
922 return ListOfObjectsReader<Collection<T>>::AsFactory (name);
924 template <
typename T>
927 return ListOfObjectsReader<Sequence<T>>::AsFactory ();
929 template <
typename T>
932 return ListOfObjectsReader<Sequence<T>>::AsFactory (name);
935 struct OptionalTypesReader_DateTime_DefaultTraits_ {
936 static inline const Time::DateTime kDefaultValue = Time::DateTime::kMin;
944 template <
typename T,
typename... ARGS>
947 const T* n =
nullptr;
948 DISABLE_COMPILER_MSC_WARNING_START (6011)
949 return MakeCommonReader_ (n, forward<ARGS> (args)...);
950 DISABLE_COMPILER_MSC_WARNING_END (6011)
#define RequireNotReached()
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)
#define AssertNotReached()
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Bijection allows for the bijective (1-1) association of two elements.
nonvirtual optional< DomainType > InverseLookup(ArgByValueType< RangeType > key) const
nonvirtual bool Add(ArgByValueType< key_type > key, ArgByValueType< mapped_type > newElt, AddReplaceMode addReplaceMode=AddReplaceMode::eAddReplaces)
nonvirtual bool ContainsKey(ArgByValueType< key_type > key) const
nonvirtual optional< mapped_type > Lookup(ArgByValueType< key_type > key) const
static ReaderFromVoidStarFactory AsFactory(ARGS &&... args)
static ReaderFromVoidStarFactory AsFactory()
virtual void Deactivating() override
virtual void Activated(Context &r) override
static ReaderFromVoidStarFactory AsFactory()
Reader for optional<X> types - typically just use AddCommonType<optional<T>> () - but use this if you...
virtual void HandleTextInside(const String &text) override
virtual void Activated(Context &r) override
static ReaderFromVoidStarFactory AsFactory()
virtual void Deactivating() override
static ReaderFromVoidStarFactory AsFactory(const pair< Name, Name > &pairNames=kDefaultBoundsNames)
virtual void HandleTextInside(const String &text) override
virtual void Deactivating() override
virtual void Activated(Context &r) override
static ReaderFromVoidStarFactory AsFactory(const ReaderFromVoidStarFactory &theUseReader)
nonvirtual void AddCommonReader_NamedEnumerations(const Containers::Bijection< ENUM_TYPE, String > &nameMap)
Add reader for any type that is stringish: provide convert function from string to T; Simple wrapper ...
static ReaderFromVoidStarFactory MakeClassReader(const Traversal::Iterable< StructFieldInfo > &fieldDescriptions)
nonvirtual void AddCommonReader_Class(const Traversal::Iterable< StructFieldInfo > &fieldDescriptions)
static ReaderFromVoidStarFactory MakeCommonReader_EnumAsInt()
nonvirtual void AddCommonType(ARGS &&... args)
static ReaderFromVoidStarFactory MakeCommonReader(ARGS &&... args)
static ReaderFromVoidStarFactory MakeCommonReader_Simple(const function< T(String)> &converterFromString2T)
nonvirtual void AddCommonReader_Simple(const function< T(String)> &converterFromString2T)
Add reader for any type that is stringish: provide convert function from string to T; Simple wrapper ...
static auto ConvertReaderToFactory(ARGS &&... args) -> ReaderFromVoidStarFactory
nonvirtual void AddCommonReader_EnumAsInt()
Add reader for any type that is stringish: provide convert function from string to T; Simple wrapper ...
nonvirtual shared_ptr< IElementConsumer > MakeContextReader(type_index ti, void *destinationObject) const
static ReaderFromVoidStarFactory MakeCommonReader_NamedEnumerations(const Containers::Bijection< ENUM_TYPE, String > &nameMap)
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
ReaderFromTStarFactory< void > ReaderFromVoidStarFactory