4#include "Stroika/Foundation/Characters/String2Int.h"
7#include "Stroika/Foundation/Containers/Support/ReserveTweaks.h"
8#include "Stroika/Foundation/DataExchange/BadFormatException.h"
21 class Registry::SimpleReader_ :
public IElementConsumer {
23 SimpleReader_ (T* intoVal)
30 virtual void Activated ([[maybe_unused]] Context& r)
override
34 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override
36 ThrowUnRecognizedStartElt (name);
38 virtual void HandleTextInside (
const String& text)
override
42 virtual void Deactivating ()
override;
50 return IElementConsumer::AsFactory<T, SimpleReader_> ();
54 Characters::StringBuilder<> fBuf_{};
58 void Registry::SimpleReader_<String>::Deactivating ();
60 void Registry::SimpleReader_<char>::Deactivating ();
62 void Registry::SimpleReader_<unsigned char>::Deactivating ();
64 void Registry::SimpleReader_<short>::Deactivating ();
66 void Registry::SimpleReader_<unsigned short>::Deactivating ();
68 void Registry::SimpleReader_<int>::Deactivating ();
70 void Registry::SimpleReader_<unsigned int>::Deactivating ();
72 void Registry::SimpleReader_<long int>::Deactivating ();
74 void Registry::SimpleReader_<unsigned long int>::Deactivating ();
76 void Registry::SimpleReader_<long long int>::Deactivating ();
78 void Registry::SimpleReader_<unsigned long long int>::Deactivating ();
80 void Registry::SimpleReader_<bool>::Deactivating ();
82 void Registry::SimpleReader_<float>::Deactivating ();
84 void Registry::SimpleReader_<double>::Deactivating ();
86 void Registry::SimpleReader_<long double>::Deactivating ();
88 void Registry::SimpleReader_<Time::DateTime>::Deactivating ();
90 void Registry::SimpleReader_<Time::Duration>::Deactivating ();
97 template <
typename TARGET_TYPE,
typename READER,
typename... ARGS>
100 return Registry::ConvertReaderToFactory<TARGET_TYPE, READER> (forward<ARGS> (args)...);
108 inline Context::Context (
const Registry& registry)
109 : fObjectReaderRegistry_{registry}
112 inline Context::Context (Context&& from) noexcept
113 : fObjectReaderRegistry_{from.fObjectReaderRegistry_}
114 , fStack_{move (from.fStack_)}
117 inline void Context::Push (
const shared_ptr<IElementConsumer>& elt)
119 using namespace Characters::Literals;
121#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
122 if (fTraceThisReader) {
123 DISABLE_COMPILER_CLANG_WARNING_START (
"clang diagnostic ignored \"-Wpotentially-evaluated-expression\"");
124 DbgTrace (
"{}Context::Push [{}]"_f, TraceLeader_ (), type_index{
typeid (*elt.get ())});
125 DISABLE_COMPILER_CLANG_WARNING_END (
"clang diagnostic ignored \"-Wpotentially-evaluated-expression\"");
128 Containers::Support::ReserveTweaks::Reserve4Add1 (fStack_);
129 fStack_.push_back (elt);
130 elt->Activated (*
this);
132 inline void Context::Pop ()
134 using namespace Characters::Literals;
135 fStack_.back ()->Deactivating ();
137#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
138 if (fTraceThisReader) {
139 if (fStack_.empty ()) {
140 DbgTrace (
"{}Context::Popped [empty stack]"_f, TraceLeader_ ());
143 DISABLE_COMPILER_CLANG_WARNING_START (
"clang diagnostic ignored \"-Wpotentially-evaluated-expression\"");
144 DbgTrace (L
"{}Context::Popped [back to: {}]"_f, TraceLeader_ (), type_index{
typeid (*GetTop ().get ())});
145 DISABLE_COMPILER_CLANG_WARNING_END (
"clang diagnostic ignored \"-Wpotentially-evaluated-expression\"");
150 inline shared_ptr<IElementConsumer> Context::GetTop ()
const
152 Require (not fStack_.empty ());
153 return fStack_.back ();
155 inline const Registry& Context::GetObjectReaderRegistry ()
const
157 return fObjectReaderRegistry_;
159 inline bool Context::empty ()
const
161 return fStack_.empty ();
169 inline IConsumerDelegateToContext::IConsumerDelegateToContext (Context&& r)
173 inline IConsumerDelegateToContext::IConsumerDelegateToContext (
const Registry& registry)
177 inline IConsumerDelegateToContext::IConsumerDelegateToContext (
const Registry& registry,
const shared_ptr<IElementConsumer>& initialTop)
178 : fContext{registry, initialTop}
187 inline StructFieldInfo::StructFieldInfo (
const Name& serializedFieldName,
const StructFieldMetaInfo& fieldMetaInfo,
188 const optional<ReaderFromVoidStarFactory>& typeMapper)
189 : fSerializedFieldName{serializedFieldName}
190 , fFieldMetaInfo{fieldMetaInfo}
191 , fOverrideTypeMapper{typeMapper}
200 template <
typename T>
201 ClassReader<T>::ClassReader (
const Traversal::Iterable<StructFieldInfo>& fieldDescriptions, T* vp)
202 : fFieldDescriptions_{fieldDescriptions}
206 for (
const StructFieldInfo& i : fieldDescriptions) {
207 if (i.fSerializedFieldName.fType == Name::eValue) {
208 fValueFieldMetaInfo_ = i.fFieldMetaInfo;
211 fFieldNameToTypeMap_.Add (i.fSerializedFieldName, i.fFieldMetaInfo);
215 template <
typename T>
216 void ClassReader<T>::Activated (Context& r)
218 Require (fActiveContext_ ==
nullptr);
219 fActiveContext_ = &r;
221 template <
typename T>
222 shared_ptr<IElementConsumer> ClassReader<T>::HandleChildStart (
const Name& name)
225 optional<StructFieldMetaInfo> ti = fFieldNameToTypeMap_.Lookup (name);
227 byte* operatingOnObjField = ti->GetAddressOfMember (this->fValuePtr_);
229 return factory (operatingOnObjField);
231 else if (fThrowOnUnrecongizedelts_) {
232 ThrowUnRecognizedStartElt (name);
235 return Memory::MakeSharedPtr<IgnoreNodeReader> ();
238 template <
typename T>
239 void ClassReader<T>::HandleTextInside (
const String& text)
242 if (fValueFieldMetaInfo_) {
243 Assert (fValueFieldConsumer_ ==
nullptr);
244 byte* operatingOnObjField = fValueFieldMetaInfo_->GetAddressOfMember (this->fValuePtr_);
246 fValueFieldConsumer_ = (factory)(operatingOnObjField);
247 fValueFieldConsumer_->Activated (*fActiveContext_);
248 fValueFieldMetaInfo_ = nullopt;
250 if (fValueFieldConsumer_) {
251 fValueFieldConsumer_->HandleTextInside (text);
254 template <
typename T>
255 void ClassReader<T>::Deactivating ()
258 if (fValueFieldConsumer_) {
259 fValueFieldConsumer_->Deactivating ();
261 fActiveContext_ =
nullptr;
263 template <
typename T>
266 return IElementConsumer::AsFactory<T, ClassReader> ();
268 template <
typename T>
271 using namespace Characters::Literals;
273 for (
const StructFieldInfo& i : fFieldDescriptions_) {
274 if (i.fSerializedFieldName == name) {
275 if (i.fOverrideTypeMapper) {
276 return *i.fOverrideTypeMapper;
279 optional<ReaderFromVoidStarFactory> o = fActiveContext_->GetObjectReaderRegistry ().Lookup (i.fFieldMetaInfo.GetTypeInfo ());
281 if (not o.has_value ()) {
282 DbgTrace (
"(forTypeInfo = {}) - UnRegistered Type!"_f, i.fFieldMetaInfo);
299 template <
typename CONTAINER_OF_T>
300 inline ListOfObjectsReader<CONTAINER_OF_T>::ListOfObjectsReader (CONTAINER_OF_T* v)
305 template <
typename CONTAINER_OF_T>
306 inline ListOfObjectsReader<CONTAINER_OF_T>::ListOfObjectsReader (CONTAINER_OF_T* v,
const Name& memberElementName)
308 , fMemberElementName_ (memberElementName)
312 template <
typename CONTAINER_OF_T>
315 Require (fActiveContext_ ==
nullptr);
316 fActiveContext_ = &r;
318 template <
typename CONTAINER_OF_T>
322 if (not fMemberElementName_.has_value () or name == *fMemberElementName_) {
323 return Memory::MakeSharedPtr<RepeatedElementReader<CONTAINER_OF_T>> (fValuePtr_);
325 else if (fThrowOnUnrecongizedelts_) {
326 ThrowUnRecognizedStartElt (name);
329 return Memory::MakeSharedPtr<IgnoreNodeReader> ();
332 template <
typename CONTAINER_OF_T>
336 fActiveContext_ =
nullptr;
338 template <
typename CONTAINER_OF_T>
341 return IElementConsumer::AsFactory<CONTAINER_OF_T, ListOfObjectsReader> ();
343 template <
typename CONTAINER_OF_T>
346 return IElementConsumer::AsFactory<CONTAINER_OF_T, ListOfObjectsReader> (memberElementName);
354 template <
typename T,
typename TRAITS>
355 OptionalTypesReader<T, TRAITS>::OptionalTypesReader (optional<T>* intoVal)
360 template <
typename T,
typename TRAITS>
363 Assert (fActualReader_ ==
nullptr);
365 fActualReader_->Activated (r);
367 template <
typename T,
typename TRAITS>
371 return fActualReader_->HandleChildStart (name);
373 template <
typename T,
typename TRAITS>
377 fActualReader_->HandleTextInside (text);
379 template <
typename T,
typename TRAITS>
383 fActualReader_->Deactivating ();
384 fActualReader_.reset ();
385 *fValue_ = fProxyValue_;
387 template <
typename T,
typename TRAITS>
398 template <
typename T>
399 const function<
byte*(T*)> MixinReader<T>::MixinEltTraits::kDefaultAddressOfSubElementFetcher =
400 [] (T* b) {
return reinterpret_cast<byte*
> (b); };
401 template <
typename T>
402 inline MixinReader<T>::MixinEltTraits::MixinEltTraits (
const ReaderFromVoidStarFactory& readerFactory,
const function<
byte*(T*)>& addressOfSubEltFetcher)
403 : fReaderFactory{readerFactory}
404 , fAddressOfSubElementFetcher{addressOfSubEltFetcher}
407 template <
typename T>
409 const function<
bool (
const Name& name)>& readsName,
const function<
byte*(T*)>& addressOfSubEltFetcher)
410 : fReaderFactory{readerFactory}
411 , fReadsName{readsName}
412 , fAddressOfSubElementFetcher{addressOfSubEltFetcher}
415 template <
typename T>
416 inline MixinReader<T>::MixinEltTraits::MixinEltTraits (
const ReaderFromVoidStarFactory& readerFactory,
const function<
bool ()>& readsText,
417 const function<
byte*(T*)>& addressOfSubEltFetcher)
418 : fReaderFactory{readerFactory}
419 , fReadsText{readsText}
420 , fAddressOfSubElementFetcher{addressOfSubEltFetcher}
423 template <
typename T>
425 const function<
bool (
const Name& name)>& readsName,
426 const function<
bool ()>& readsText,
const function<
byte*(T*)>& addressOfSubEltFetcher)
427 : fReaderFactory{readerFactory}
428 , fReadsName{readsName}
429 , fReadsText{readsText}
430 , fAddressOfSubElementFetcher{addressOfSubEltFetcher}
434 template <
typename T>
435 MixinReader<T>::MixinReader (T* vp,
const Traversal::Iterable<MixinEltTraits>& mixins)
440 for (
const MixinEltTraits& m : mixins) {
441 fMixinReaders_ += m.fReaderFactory (m.fAddressOfSubElementFetcher (vp));
444 template <
typename T>
445 void MixinReader<T>::Activated (Context& r)
447 Require (fActiveContext_ ==
nullptr);
448 fActiveContext_ = &r;
450 template <
typename T>
451 shared_ptr<IElementConsumer> MixinReader<T>::HandleChildStart (
const Name& name)
455 for (
const MixinEltTraits& m : fMixins_) {
456 if (m.fReadsName (name)) {
457 shared_ptr<IElementConsumer> reader = fMixinReaders_[idx];
458 if (not fActivatedReaders_.Contains (reader)) {
459 reader->Activated (*fActiveContext_);
460 fActivatedReaders_.Add (reader);
462 return reader->HandleChildStart (name);
466 return Memory::MakeSharedPtr<IgnoreNodeReader> ();
468 template <
typename T>
469 void MixinReader<T>::HandleTextInside (
const String& text)
473 for (
const MixinEltTraits& m : fMixins_) {
474 if (m.fReadsText ()) {
475 shared_ptr<IElementConsumer> reader = fMixinReaders_[idx];
476 if (not fActivatedReaders_.Contains (reader)) {
477 reader->Activated (*fActiveContext_);
478 fActivatedReaders_.Add (reader);
480 fMixinReaders_[idx]->HandleTextInside (text);
485 template <
typename T>
486 void MixinReader<T>::Deactivating ()
489 for (shared_ptr<IElementConsumer> reader : fActivatedReaders_) {
490 reader->Deactivating ();
492 fActiveContext_ =
nullptr;
494 template <
typename T>
497 return IElementConsumer::AsFactory<T, MixinReader> (mixins);
505 template <
typename T>
506 RangeReader<T>::RangeReader (T* intoVal,
const pair<Name, Name>& pairNames)
507 : fPairNames{pairNames}
512 template <
typename T>
515 Assert (fActualReader_ ==
nullptr);
516 fActualReader_ = Registry::MakeClassReader<RangeData_> ({
517 {fPairNames.first, &RangeData_::fLowerBound},
518 {fPairNames.second, &RangeData_::fUpperBound},
520 fActualReader_->Activated (r);
522 template <
typename T>
526 return fActualReader_->HandleChildStart (name);
528 template <
typename T>
532 fActualReader_->HandleTextInside (text);
534 template <
typename T>
538 fActualReader_->Deactivating ();
539 fActualReader_.reset ();
540 *fValue_ = T{fProxyValue_.fLowerBound, fProxyValue_.fUpperBound};
542 template <
typename T>
545 return Registry::ConvertReaderToFactory<T, RangeReader> (pairNames);
555 return [] (
void*) -> shared_ptr<IElementConsumer> {
return Memory::MakeSharedPtr<IgnoreNodeReader> (); };
566 [theUseReader] (
void* p) -> shared_ptr<IElementConsumer> {
return Memory::MakeSharedPtr<ReadDownToReader> (theUseReader (p)); };
570 return [theUseReader, tagToHandOff] (
void* p) -> shared_ptr<IElementConsumer> {
571 return Memory::MakeSharedPtr<ReadDownToReader> (theUseReader (p), tagToHandOff);
580 template <
typename T,
typename TRAITS>
581 inline RepeatedElementReader<T, TRAITS>::RepeatedElementReader (ContainerType* v)
585 template <
typename T,
typename TRAITS>
586 inline RepeatedElementReader<T, TRAITS>::RepeatedElementReader (ContainerType* pv,
const ReaderFromVoidStarFactory& actualElementFactory)
588 , fReaderRactory_{actualElementFactory}
591 template <
typename T,
typename TRAITS>
592 inline RepeatedElementReader<T, TRAITS>::RepeatedElementReader (ContainerType* v,
const Name& readonlyThisName,
595 , fReaderRactory_{actualElementFactory}
596 , fReadThisName_{[readonlyThisName] (const Name& n) {
return n == readonlyThisName; }}
599 template <
typename T,
typename TRAITS>
600 inline RepeatedElementReader<T, TRAITS>::RepeatedElementReader (ContainerType* v,
const Name& readonlyThisName)
602 , fReadThisName_{[readonlyThisName] (const Name& n) {
return n == readonlyThisName; }}
605 template <
typename T,
typename TRAITS>
606 void RepeatedElementReader<T, TRAITS>::Activated (Context& r)
608 Assert (fActiveSubReader_ ==
nullptr);
609 fActiveSubReader_ = fReaderRactory_ ? (*fReaderRactory_) (&fProxyValue_) : r.GetObjectReaderRegistry ().MakeContextReader (&fProxyValue_);
610 fActiveSubReader_->Activated (r);
612 template <
typename T,
typename TRAITS>
613 shared_ptr<IElementConsumer> RepeatedElementReader<T, TRAITS>::HandleChildStart (
const Name& name)
616 if (fReadThisName_ (name)) {
617 return fActiveSubReader_->HandleChildStart (name);
621 else if (fThrowOnUnrecongizedelts_) {
622 ThrowUnRecognizedStartElt (name);
626 return Memory::MakeSharedPtr<IgnoreNodeReader> ();
629 template <
typename T,
typename TRAITS>
630 void RepeatedElementReader<T, TRAITS>::HandleTextInside (
const String& text)
633 fActiveSubReader_->HandleTextInside (text);
635 template <
typename T,
typename TRAITS>
636 void RepeatedElementReader<T, TRAITS>::Deactivating ()
639 fActiveSubReader_->Deactivating ();
640 fActiveSubReader_.reset ();
641 TRAITS::ContainerAdapterAdder::Add (fValuePtr_, fProxyValue_);
643 template <
typename T,
typename TRAITS>
646 return IElementConsumer::AsFactory<T, RepeatedElementReader> ();
648 template <
typename T,
typename TRAITS>
652 return IElementConsumer::AsFactory<T, RepeatedElementReader> (readonlyThisName, actualElementFactory);
654 template <
typename T,
typename TRAITS>
657 return IElementConsumer::AsFactory<T, RepeatedElementReader> (actualElementFactory);
659 template <
typename T,
typename TRAITS>
662 return IElementConsumer::AsFactory<T, RepeatedElementReader> (readonlyThisName);
672 fFactories_.
Add (forType, readerFactory);
674 template <
typename T>
675 void Registry::Add (
const ReaderFromTStarFactory<T>& readerFactory)
677 Add (
typeid (T), [readerFactory] (
void* data) {
return readerFactory (
reinterpret_cast<T*
> (data)); });
683 using namespace Characters;
685 "FAILED TO FIND READER! (forTypeInfo = {}) - Use of UnRegistered Type!"_f, ti};
689 return factory (destinationObject);
691 template <
typename T>
696 template <
typename T,
typename... ARGS>
699 Add<T> (MakeCommonReader<T> (forward<ARGS> (args)...));
701 inline optional<ReaderFromVoidStarFactory> Registry::Lookup (type_index t)
const
703 return fFactories_.
Lookup (t);
705 template <
typename CLASS>
709 for (
const auto& kv : fieldDescriptions) {
710 if (not kv.fOverrideTypeMapper.has_value () and not fFactories_.
ContainsKey (kv.fFieldMetaInfo.GetTypeInfo ())) {
711 using namespace Characters;
713 "CLASS={} field-TypeInfo-not-found = {}, for field named '{}' - UnRegistered Type!"_f,
714 type_index{
typeid (CLASS)}, kv.fFieldMetaInfo.GetTypeInfo (), kv.fSerializedFieldName};
719 Add<CLASS> (MakeClassReader<CLASS> (fieldDescriptions));
721 template <
typename CLASS>
724 return [fieldDescriptions] (
void* data) -> shared_ptr<IElementConsumer> {
725 return Memory::MakeSharedPtr<ClassReader<CLASS>> (fieldDescriptions,
reinterpret_cast<CLASS*
> (data));
728 template <
typename T,
typename READER,
typename... ARGS>
731 ReaderFromTStarFactory<T> tmpFactory{
732 [args...] (T* o) -> shared_ptr<IElementConsumer> {
return Memory::MakeSharedPtr<READER> (o, forward<ARGS> (args)...); }};
733 return [tmpFactory] (
void* data) {
return tmpFactory (
reinterpret_cast<T*
> (data)); };
735 template <
typename T>
738 return [tf] (
void* data) {
return tf (
reinterpret_cast<T*
> (data)); };
740 template <
typename T>
743 return cvtFactory_<T> ([] (T* o) -> shared_ptr<IElementConsumer> {
return Memory::MakeSharedPtr<SimpleReader_<T>> (o); });
745 template <
typename ENUM_TYPE>
748 using namespace Characters::Literals;
749 struct myReader_ :
public IElementConsumer {
757 Characters::StringBuilder<> fBuf_{};
758 ENUM_TYPE* fValue_{};
759 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override
761 ThrowUnRecognizedStartElt (name);
763 virtual void HandleTextInside (
const String& text)
override
767 virtual void Deactivating ()
override
769 if (
auto optVal = fNameMap.
InverseLookup (fBuf_.str ())) [[likely]] {
773 DbgTrace (
"Enumeration ('{}') value '{}' out of range"_f, type_index{
typeid (ENUM_TYPE)}, fBuf_.str ());
774 static const auto kException_ = BadFormatException{
"Enumeration value out of range"sv};
775 Execution::Throw (kException_);
779 return cvtFactory_<ENUM_TYPE> (
780 [nameMap] (ENUM_TYPE* o) -> shared_ptr<IElementConsumer> {
return Memory::MakeSharedPtr<myReader_> (nameMap, o); });
782 template <
typename ENUM_TYPE>
785 return MakeCommonReader_NamedEnumerations (Containers::Bijection<ENUM_TYPE, String> (nameMap));
787 template <
typename ENUM_TYPE>
790 Add<ENUM_TYPE> (MakeCommonReader_NamedEnumerations<ENUM_TYPE> (nameMap));
792 template <
typename ENUM_TYPE>
795 Add<ENUM_TYPE> (MakeCommonReader_NamedEnumerations<ENUM_TYPE> (nameMap));
797 template <
typename ENUM_TYPE>
800 using namespace Characters;
801 struct myReader_ :
public IElementConsumer {
802 myReader_ (ENUM_TYPE* intoVal)
807 Characters::StringBuilder<> fBuf_{};
808 ENUM_TYPE* fValue_{};
809 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override
811 ThrowUnRecognizedStartElt (name);
813 virtual void HandleTextInside (
const String& text)
override
817 virtual void Deactivating ()
override
819 using SerializeAsType =
typename std::underlying_type<ENUM_TYPE>::type;
820 SerializeAsType tmp = Characters::String2Int<SerializeAsType> (fBuf_.str ());
821 if (Common::ToInt (ENUM_TYPE::eSTART) <= tmp and tmp < Common::ToInt (ENUM_TYPE::eEND)) [[likely]] {
822 *fValue_ = Common::ToEnum<ENUM_TYPE> (tmp);
825 DbgTrace (
"Enumeration ('{}') value '{}' out of range"_f, type_index{
typeid (ENUM_TYPE)}, fBuf_);
826 static const auto kException_ = BadFormatException{
"Enumeration value out of range"sv};
827 Execution::Throw (kException_);
831 return cvtFactory_<ENUM_TYPE> ([] (ENUM_TYPE* o) -> shared_ptr<IElementConsumer> {
return Memory::MakeSharedPtr<myReader_> (o); });
833 template <
typename ENUM_TYPE>
836 Add<ENUM_TYPE> (MakeCommonReader_EnumAsInt<ENUM_TYPE> ());
838 template <
typename T>
841 using namespace Characters;
842 struct myReader_ :
public IElementConsumer {
843 function<T (String)> fString2TMapper_;
844 myReader_ (
const function<T (String)>& converterFromString2T, T* intoVal)
845 : fString2TMapper_{converterFromString2T}
850 Characters::StringBuilder<> fBuf_{};
852 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override
854 ThrowUnRecognizedStartElt (name);
856 virtual void HandleTextInside (
const String& text)
override
860 virtual void Deactivating ()
override
862 *fValue_ = fString2TMapper_ (fBuf_.str ());
865 return cvtFactory_<T> ([converterFromString2T] (T* o) -> shared_ptr<IElementConsumer> {
866 return Memory::MakeSharedPtr<myReader_> (converterFromString2T, o);
869 template <
typename T>
872 Add<T> (MakeCommonReader_Simple<T> (converterFromString2T));
876 return MakeCommonReader_SimpleReader_<String> ();
880 return MakeCommonReader_SimpleReader_<IO::Network::URI> ();
882 template <
typename T>
884 requires (is_enum_v<T>)
886 return MakeCommonReader_NamedEnumerations<T> ();
888 template <
typename T>
890 requires (is_trivially_copyable_v<T> and is_standard_layout_v<T> and not is_enum_v<T>)
892 return MakeCommonReader_SimpleReader_<T> ();
896 return MakeCommonReader_SimpleReader_<Time::DateTime> ();
900 return MakeCommonReader_SimpleReader_<Time::Duration> ();
902 template <
typename T>
907 template <
typename T>
910 return ListOfObjectsReader<vector<T>>::AsFactory ();
912 template <
typename T>
915 return ListOfObjectsReader<vector<T>>::AsFactory (name);
917 template <
typename T>
920 return ListOfObjectsReader<Collection<T>>::AsFactory ();
922 template <
typename T>
925 return ListOfObjectsReader<Collection<T>>::AsFactory (name);
927 template <
typename T>
930 return ListOfObjectsReader<Sequence<T>>::AsFactory ();
932 template <
typename T>
935 return ListOfObjectsReader<Sequence<T>>::AsFactory (name);
938 struct OptionalTypesReader_DateTime_DefaultTraits_ {
939 static inline const Time::DateTime kDefaultValue = Time::DateTime::kMin;
947 template <
typename T,
typename... ARGS>
950 const T* n =
nullptr;
951 DISABLE_COMPILER_MSC_WARNING_START (6011)
952 return MakeCommonReader_ (n, forward<ARGS> (args)...);
953 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