Stroika Library 3.0d25
 
Loading...
Searching...
No Matches
Variant/CharacterDelimitedLines/Writer.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
7#include "Stroika/Foundation/Streams/TextToBinary.h"
8
9#include "Writer.h"
10
11using namespace Stroika::Foundation;
14using namespace Stroika::Foundation::DataExchange::Variant;
15using namespace Stroika::Foundation::Streams;
16
18using Memory::MakeSharedPtr;
21
22/*
23 ********************************************************************************
24 *********** DataExchange::Variant::CharacterDelimitedLines::Writer *************
25 ********************************************************************************
26 */
27class CharacterDelimitedLines::Writer::Rep_ final : public Variant::Writer::_IRep, public Memory::UseBlockAllocationIfAppropriate<Rep_> {
28public:
29 Rep_ (const Options& options)
30 : fOptions_{options}
31 {
32 }
33 virtual optional<filesystem::path> GetDefaultFileSuffix () const override
34 {
35 return ".txt"sv;
36 }
37 virtual void Write (const VariantValue& v, const OutputStream::Ptr<byte>& out) const override
38 {
39 Write (v, TextToBinary::Writer::New (out, UnicodeExternalEncodings::eUTF8, ByteOrderMark::eDontInclude));
40 }
41 virtual void Write (const VariantValue& v, const OutputStream::Ptr<Character>& out) const override
42 {
43#if USE_NOISY_TRACE_IN_THIS_MODULE_
44 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::Write"};
45#endif
46 for (VariantValue line : v.As<Sequence<VariantValue>> ()) {
47 Write (line.As<Sequence<VariantValue>> ().Map<Iterable<String>> ([] (const VariantValue& i) { return i.As<String> (); }), out);
48 }
49 }
50 nonvirtual void Write (const Iterable<Sequence<String>>& m, const OutputStream::Ptr<Characters::Character>& out) const
51 {
52#if USE_NOISY_TRACE_IN_THIS_MODULE_
53 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::Write"};
54#endif
55 for (const Sequence<String>& seq : m) {
56 Write (seq, out);
57 }
58 }
59 nonvirtual void Write (const Iterable<String>& line, const OutputStream::Ptr<Characters::Character>& out) const
60 {
61#if USE_NOISY_TRACE_IN_THIS_MODULE_
62 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::Write"};
63#endif
65 for (Iterator<String> i = line.begin (); i != line.end (); ++i) {
66 sb << *i;
67 if (i + 1 != line.end ()) {
68 sb << fOptions_.fSeparator;
69 if (fOptions_.fSpaceSeparate) {
70 sb << " "sv;
71 }
72 }
73 }
74 out.WriteLn (sb);
75 }
76
77private:
78 Options fOptions_;
79};
80
81CharacterDelimitedLines::Writer::Writer (const Options& options)
82 : inherited{MakeSharedPtr<Rep_> (options)}
83{
84}
85
86void CharacterDelimitedLines::Writer::Write (const Iterable<Sequence<String>>& m, const OutputStream::Ptr<byte>& out) const
87{
88 return Write (m, Streams::TextToBinary::Writer::New (out));
89}
90
91void CharacterDelimitedLines::Writer::Write (const Iterable<Sequence<String>>& m, const OutputStream::Ptr<Characters::Character>& out) const
92{
93 Debug::UncheckedDynamicCast<const Rep_&> (_ConstGetRep ()).Write (m, out);
94}
95
96Memory::BLOB CharacterDelimitedLines::Writer::WriteAsBLOB (const Iterable<Sequence<String>>& m) const
97{
98 return _WriteAsBLOBHelper ([&m, this] (const OutputStream::Ptr<byte>& out) { Write (m, out); });
99}
100
101String CharacterDelimitedLines::Writer::WriteAsString (const Iterable<Sequence<String>>& m) const
102{
103 return _WriteAsStringHelper ([&m, this] (const OutputStream::Ptr<Characters::Character>& out) { Write (m, out); });
104}
auto MakeSharedPtr(ARGS_TYPE &&... args) -> shared_ptr< T >
same as make_shared, but if type T has block allocation, then use block allocation for the 'shared pa...
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.
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:296
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:234
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:253
Ptr New(const Streams::OutputStream::Ptr< byte > &src, const Characters::CodeCvt<> &char2OutputConverter)