Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
CharacterDelimitedLines/Writer.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/Streams/TextToBinary.h"
7
8#include "Writer.h"
9
10using namespace Stroika::Foundation;
13using namespace Stroika::Foundation::Streams;
14
18using namespace DataExchange::Variant;
19
20/*
21 ********************************************************************************
22 *********** DataExchange::Variant::CharacterDelimitedLines::Writer *************
23 ********************************************************************************
24 */
25class CharacterDelimitedLines::Writer::Rep_ : public Variant::Writer::_IRep, public Memory::UseBlockAllocationIfAppropriate<Rep_> {
26public:
27 Rep_ (const Options& options)
28 : fOptions_{options}
29 {
30 }
31 virtual _SharedPtrIRep Clone () const override
32 {
33 return make_shared<Rep_> (fOptions_); // no instance data
34 }
35 virtual optional<filesystem::path> GetDefaultFileSuffix () const override
36 {
37 return ".txt"sv;
38 }
39 virtual void Write (const VariantValue& v, const OutputStream::Ptr<byte>& out) const override
40 {
41 Write (v, TextToBinary::Writer::New (out, UnicodeExternalEncodings::eUTF8, ByteOrderMark::eDontInclude));
42 }
43 virtual void Write (const VariantValue& v, const OutputStream::Ptr<Character>& out) const override
44 {
45#if USE_NOISY_TRACE_IN_THIS_MODULE_
46 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::Write"};
47#endif
48 for (VariantValue line : v.As<Sequence<VariantValue>> ()) {
49 Write (line.As<Sequence<VariantValue>> ().Map<Iterable<String>> ([] (const VariantValue& i) { return i.As<String> (); }), out);
50 }
51 }
52 nonvirtual void Write (const Iterable<Sequence<String>>& m, const OutputStream::Ptr<Characters::Character>& out) const
53 {
54#if USE_NOISY_TRACE_IN_THIS_MODULE_
55 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::Write"};
56#endif
57 for (const Sequence<String>& seq : m) {
58 Write (seq, out);
59 }
60 }
61 nonvirtual void Write (const Iterable<String>& line, const OutputStream::Ptr<Characters::Character>& out) const
62 {
63#if USE_NOISY_TRACE_IN_THIS_MODULE_
64 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::Write"};
65#endif
67 for (Iterator<String> i = line.begin (); i != line.end (); ++i) {
68 sb << *i;
69 if (i + 1 != line.end ()) {
70 sb << fOptions_.fSeparator;
71 if (fOptions_.fSpaceSeparate) {
72 sb << " "sv;
73 }
74 }
75 }
76 out.WriteLn (sb);
77 }
78
79private:
80 Options fOptions_;
81};
82
83CharacterDelimitedLines::Writer::Writer (const Options& options)
84 : inherited{make_shared<Rep_> (options)}
85{
86}
87
88void CharacterDelimitedLines::Writer::Write (const Iterable<Sequence<String>>& m, const OutputStream::Ptr<byte>& out)
89{
90 return Write (m, Streams::TextToBinary::Writer::New (out));
91}
92
93void CharacterDelimitedLines::Writer::Write (const Iterable<Sequence<String>>& m, const OutputStream::Ptr<Characters::Character>& out)
94{
95 Debug::UncheckedDynamicCast<Rep_&> (_GetRep ()).Write (m, out);
96}
97
98Memory::BLOB CharacterDelimitedLines::Writer::WriteAsBLOB (const Iterable<Sequence<String>>& m)
99{
100 return _WriteAsBLOBHelper ([&m, this] (const OutputStream::Ptr<byte>& out) { Write (m, out); });
101}
102
103String CharacterDelimitedLines::Writer::WriteAsString (const Iterable<Sequence<String>>& m)
104{
105 return _WriteAsStringHelper ([&m, this] (const OutputStream::Ptr<Characters::Character>& out) { Write (m, out); });
106}
conditional_t< qStroika_Foundation_Memory_PreferBlockAllocation and andTrueCheck, BlockAllocationUseHelper< T >, Common::Empty > UseBlockAllocationIfAppropriate
Use this to enable block allocation for a particular class. Beware of subclassing.
Similar to String, but intended to more efficiently construct a String. Mutable type (String is large...
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
Simple variant-value (case variant union) object, with (variant) basic types analogous to a value in ...
OutputStream<>::Ptr is Smart pointer to a stream-based sink of data.
nonvirtual void WriteLn(ELT_2_WRITE &&arg) const
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
Definition Iterable.h:237
nonvirtual Iterator< T > begin() const
Support for ranged for, and STL syntax in general.
static constexpr default_sentinel_t end() noexcept
Support for ranged for, and STL syntax in general.
An Iterator<T> is a copyable object which allows traversing the contents of some container....
Definition Iterator.h:225