4#ifndef _Stroika_Foundation_DataExchange_StructuredStreamEvents_ObjectReader_h_
5#define _Stroika_Foundation_DataExchange_StructuredStreamEvents_ObjectReader_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
16#include "Stroika/Foundation/Containers/Adapters/Adder.h"
17#include "Stroika/Foundation/Containers/Bijection.h"
18#include "Stroika/Foundation/Containers/Collection.h"
19#include "Stroika/Foundation/Containers/Mapping.h"
20#include "Stroika/Foundation/Containers/Sequence.h"
21#include "Stroika/Foundation/Containers/Set.h"
23#include "Stroika/Foundation/Containers/SortedMapping.h"
24#include "Stroika/Foundation/Containers/SortedSet.h"
25#include "Stroika/Foundation/DataExchange/StructFieldMetaInfo.h"
27#include "Stroika/Foundation/Memory/Common.h"
141#ifndef qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
142#define qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing qStroika_Foundation_Debug_AssertionsChecked
147 enum class UnknownSubElementDisposition {
157 template <
typename T>
158 using ReaderFromTStarFactory = function<shared_ptr<IElementConsumer> (T* destinationObject)>;
171 Name fSerializedFieldName;
173 optional<ReaderFromVoidStarFactory> fOverrideTypeMapper;
178 const optional<ReaderFromVoidStarFactory>& typeMapper = nullopt);
240 template <
typename T>
241 nonvirtual
void Add (
const ReaderFromTStarFactory<T>& readerFactory);
252 template <
typename T,
typename... ARGS>
256 nonvirtual optional<ReaderFromVoidStarFactory> Lookup (type_index t)
const;
284 template <
typename T,
typename... ARGS>
294 template <
typename CLASS>
304 template <
typename CLASS>
312 template <
typename ENUM_TYPE>
314 template <
typename ENUM_TYPE>
338 template <
typename ENUM_TYPE>
340 template <
typename ENUM_TYPE>
348 template <
typename ENUM_TYPE>
368 template <
typename ENUM_TYPE>
396 template <
typename T>
416 template <
typename T>
427 template <
typename T,
typename READER,
typename... ARGS>
434 nonvirtual shared_ptr<IElementConsumer>
MakeContextReader (type_index ti,
void* destinationObject)
const;
435 template <
typename T>
436 nonvirtual shared_ptr<IElementConsumer>
MakeContextReader (T* destinationObject)
const;
439 template <
typename T>
441 template <
typename T>
442 class OldOptionalTypesReader_;
445 template <
typename T>
449 template <
typename T>
457 template <
typename T>
459 requires (is_enum_v<T>);
460 template <
typename T>
462 requires (is_trivially_copyable_v<T> and is_standard_layout_v<T> and not is_enum_v<T>);
463 template <
typename T>
465 template <
typename T>
467 template <
typename T>
469 template <
typename T>
471 template <
typename T>
473 template <
typename T>
475 template <
typename T>
516 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name);
542 template <
typename TARGET_TYPE,
typename READER,
typename... ARGS>
569#if qStroika_Foundation_DataExchange_StructuredStreamEvents_SupportTracing
571 bool fTraceThisReader{
false};
572 nonvirtual
String TraceLeader_ ()
const;
579 Context (
const Registry& registry,
const shared_ptr<IElementConsumer>& initialTop);
585 nonvirtual
const Registry& GetObjectReaderRegistry ()
const;
588 nonvirtual
void Push (
const shared_ptr<IElementConsumer>& elt);
591 nonvirtual
void Pop ();
594 nonvirtual shared_ptr<IElementConsumer> GetTop ()
const;
597 nonvirtual
bool empty ()
const;
600 const Registry& fObjectReaderRegistry_;
601 vector<shared_ptr<IElementConsumer>> fStack_;
604 friend class ObjectReader;
641 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override;
652 template <
typename T>
658 virtual void Activated (
Context& r)
override;
659 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override;
660 virtual void HandleTextInside (
const String& text)
override;
661 virtual void Deactivating ()
override;
677 optional<StructFieldMetaInfo> fValueFieldMetaInfo_;
678 shared_ptr<IElementConsumer> fValueFieldConsumer_;
679 bool fThrowOnUnrecongizedelts_{
false};
695 ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader,
const Name& contextTag,
const Name& tagToHandOff);
696 ReadDownToReader (
const shared_ptr<IElementConsumer>& theUseReader,
const Name& contextTag1,
const Name& contextTag2,
const Name& tagToHandOff);
699 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override;
709 shared_ptr<IElementConsumer> fReader2Delegate2_;
710 optional<Name> fTagToHandOff_;
732 template <
typename CONTAINER_OF_T>
735 using ElementType =
typename CONTAINER_OF_T::value_type;
743 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override;
754 CONTAINER_OF_T* fValuePtr_{};
756 optional<Name> fMemberElementName_;
757 bool fThrowOnUnrecongizedelts_{
false};
762 template <
typename T>
763 struct OptionalTypesReader_DefaultTraits {
764 static inline const T kDefaultValue = T{};
777 template <
typename T,
typename TRAITS = OptionalTypesReader_DefaultTraits<T>>
784 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override;
795 optional<T>* fValue_{};
796 T fProxyValue_{TRAITS::kDefaultValue};
797 shared_ptr<IElementConsumer> fActualReader_{};
802 template <
typename T>
805 struct MixinEltTraits {
807 function<bool (
const Name& name)> fReadsName = [] (
const Name& name) {
return true; };
808 function<bool ()> fReadsText = [] () {
return true; };
809 function<
byte*(T*)> fAddressOfSubElementFetcher;
811 static const function<
byte*(T*)> kDefaultAddressOfSubElementFetcher;
814 const function<
byte*(T*)>& addressOfSubEltFetcher = kDefaultAddressOfSubElementFetcher);
816 const function<
byte*(T*)>& addressOfSubEltFetcher = kDefaultAddressOfSubElementFetcher);
818 const function<
byte*(T*)>& addressOfSubEltFetcher = kDefaultAddressOfSubElementFetcher);
820 const function<
bool ()>& readsText,
const function<
byte*(T*)>& addressOfSubEltFetcher = kDefaultAddressOfSubElementFetcher);
829 virtual void Activated (Context& r)
override;
830 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override;
831 virtual void HandleTextInside (
const String& text)
override;
832 virtual void Deactivating ()
override;
841 Context* fActiveContext_{};
843 Sequence<MixinEltTraits> fMixins_;
844 Sequence<shared_ptr<IElementConsumer>> fMixinReaders_;
845 Set<shared_ptr<IElementConsumer>> fActivatedReaders_;
853 template <
typename T>
856 static const inline pair<Name, Name> kDefaultBoundsNames{
Name{
"LowerBound"sv, Name::eAttribute},
Name{
"UpperBound"sv, Name::eAttribute}};
861 RangeReader (T* intoVal,
const pair<Name, Name>& pairNames = kDefaultBoundsNames);
865 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override;
876 using range_value_type_ =
typename T::value_type;
878 range_value_type_ fLowerBound{};
879 range_value_type_ fUpperBound{};
881 pair<Name, Name> fPairNames;
883 RangeData_ fProxyValue_{};
884 shared_ptr<IElementConsumer> fActualReader_{};
958 template <
typename CONTAINER_OF_T,
typename CONTAINER_ADAPTER_ADDER = Containers::Adapters::Adder<CONTAINER_OF_T>>
960 using ContainerAdapterAdder = CONTAINER_ADAPTER_ADDER;
961 using TValueType =
typename CONTAINER_OF_T::value_type;
962 static inline const TValueType kDefaultValue = TValueType{};
964 template <
typename T,
typename TRAITS = RepeatedElementReader_DefaultTraits<T>>
967 using ContainerType = T;
968 using ElementType =
typename ContainerType::value_type;
977 RepeatedElementReader (ContainerType* v);
980 RepeatedElementReader (ContainerType* v,
const Name& readonlyThisName);
983 virtual void Activated (
Context& r)
override;
984 virtual shared_ptr<IElementConsumer> HandleChildStart (
const Name& name)
override;
985 virtual void HandleTextInside (
const String& text)
override;
986 virtual void Deactivating ()
override;
998 ContainerType* fValuePtr_{};
999 optional<ReaderFromVoidStarFactory> fReaderRactory_{};
1000 function<bool (Name)> fReadThisName_{[] ([[maybe_unused]]
const Name& n) {
return true; }};
1001 ElementType fProxyValue_{TRAITS::kDefaultValue};
1002 shared_ptr<IElementConsumer> fActiveSubReader_{};
1007 [[noreturn]]
void ThrowUnRecognizedStartElt (
const Name& name);
1016#include "ObjectReader.inl"
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.
A Collection<T> is a container to manage an un-ordered collection of items, without equality defined ...
A generalization of a vector: a container whose elements are keyed by the natural numbers.
Set<T> is a container of T, where once an item is added, additionally adds () do nothing.
virtual void Activated(Context &r)
virtual void HandleTextInside(const String &text)
virtual void Deactivating()
static ReaderFromVoidStarFactory AsFactory(ARGS &&... args)
static ReaderFromVoidStarFactory AsFactory()
IgnoreNodeReader()=default
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)
virtual void EndElement(const Name &name) override
virtual void StartElement(const Name &name, const Mapping< Name, String > &attributes) override
virtual void TextInsideElement(const String &text) override
Duration is a chrono::duration<double> (=.
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
ReaderFromTStarFactory< void > ReaderFromVoidStarFactory