Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
Variant/CharacterDelimitedLines/Reader.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
6#include "Stroika/Foundation/Characters/FloatConversion.h"
8#include "Stroika/Foundation/Characters/String2Int.h"
9#include "Stroika/Foundation/DataExchange/BadFormatException.h"
11
12#include "Reader.h"
13
14using namespace Stroika::Foundation;
16using namespace Stroika::Foundation::DataExchange::Variant;
17using namespace Stroika::Foundation::DataExchange::Variant::CharacterDelimitedLines;
18using namespace Stroika::Foundation::Streams;
19
23using Containers::Set;
25
26// Comment this in to turn on aggressive noisy DbgTrace in this module
27//#define USE_NOISY_TRACE_IN_THIS_MODULE_ 1
28
29/*
30 ********************************************************************************
31 ************** DataExchange::::CharacterDelimitedLines::Reader *****************
32 ********************************************************************************
33 */
34class CharacterDelimitedLines::Reader::Rep_ : public Variant::Reader::_IRep {
35public:
36 Set<Character> fDelimiters_;
37 bool fTrimTokens_{false};
38 Rep_ (const Set<Character>& columnDelimiters, bool trimTokens)
39 : fDelimiters_{columnDelimiters}
40 , fTrimTokens_{trimTokens}
41 {
42 }
43 virtual _SharedPtrIRep Clone () const override
44 {
45 return make_shared<Rep_> (fDelimiters_, fTrimTokens_);
46 }
47 virtual optional<filesystem::path> GetDefaultFileSuffix () const override
48 {
49 return ".txt"sv;
50 }
51 virtual VariantValue Read (const InputStream::Ptr<byte>& in) override
52 {
53 return Read (Streams::BinaryToText::Reader::New (in));
54 }
55 virtual VariantValue Read (const InputStream::Ptr<Character>& in) override
56 {
57 // @todo consider if this functional style is more clear than a nested for-loop. Was harder for me to
58 // write this way, but that could be my inexperience... --LGP 2022-12-04
59 return VariantValue{ReadMatrix (in).Map<Sequence<VariantValue>> ([] (const Sequence<String>& line) -> VariantValue {
60 return VariantValue{line.Map<Iterable<VariantValue>> ([] (const String& i) { return VariantValue{i}; })};
61 })};
62 }
63 nonvirtual Iterable<Sequence<String>> ReadMatrix (const InputStream::Ptr<Character>& in) const
64 {
65#if USE_NOISY_TRACE_IN_THIS_MODULE_
66 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::ReadMatrix"};
67#endif
69 for (const String& line : in.ReadLines ()) {
70 Sequence<String> tokens{line.Tokenize (fDelimiters_)};
71 if (fTrimTokens_) {
72 tokens = tokens.Map<Sequence<String>> ([] (auto i) { return i.Trim (); });
73 }
74#if USE_NOISY_TRACE_IN_THIS_MODULE_
75 DbgTrace ("DataExchange::Variant::CharacterDelimitedLines::Reader::ReadMatrix: line={}, tokenCount={}"_f, line, tokens.size ());
76 for ([[maybe_unused]] const auto& i : tokens) {
77 DbgTrace ("token='{}'"_f, i);
78 }
79#endif
80 result.Append (tokens);
81 }
82 return result;
83 }
84};
85CharacterDelimitedLines::Reader::Reader (const Set<Character>& columnDelimiters, bool trimTokens)
86 : inherited{make_shared<Rep_> (columnDelimiters, trimTokens)}
87{
88}
89
94
96{
97 return Debug::UncheckedDynamicCast<const Rep_&> (_GetRep ()).ReadMatrix (in);
98}
#define DbgTrace
Definition Trace.h:309
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
A generalization of a vector: a container whose elements are keyed by the natural numbers.
Definition Sequence.h:187
nonvirtual RESULT_CONTAINER Map(ELEMENT_MAPPER &&elementMapper) const
'override' Iterable<>::Map () function so RESULT_CONTAINER defaults to Sequence, and improve that cas...
Definition Sequence.inl:174
nonvirtual void Append(ArgByValueType< value_type > item)
Definition Sequence.inl:330
Set<T> is a container of T, where once an item is added, additionally adds () do nothing.
Definition Set.h:105
nonvirtual Iterable< Sequence< String > > ReadMatrix(const Streams::InputStream::Ptr< byte > &in) const
Simple variant-value (case variant union) object, with (variant) basic types analogous to a value in ...
InputStream<>::Ptr is Smart pointer (with abstract Rep) class defining the interface to reading from ...
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
Definition Iterable.h:237
Ptr New(const InputStream::Ptr< byte > &src, optional< AutomaticCodeCvtFlags > codeCvtFlags={}, optional< SeekableFlag > seekable={}, ReadAhead readAhead=eReadAheadAllowed)
Create an InputStream::Ptr<Character> from the arguments (usually binary source) - which can be used ...