Stroika Library 3.0d23x
 
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 _SharedPtrIRep Clone () const override
34 {
35 return MakeSharedPtr<Rep_> (fOptions_); // no instance data
36 }
37 virtual optional<filesystem::path> GetDefaultFileSuffix () const override
38 {
39 return ".txt"sv;
40 }
41 virtual void Write (const VariantValue& v, const OutputStream::Ptr<byte>& out) const override
42 {
43 Write (v, TextToBinary::Writer::New (out, UnicodeExternalEncodings::eUTF8, ByteOrderMark::eDontInclude));
44 }
45 virtual void Write (const VariantValue& v, const OutputStream::Ptr<Character>& out) const override
46 {
47#if USE_NOISY_TRACE_IN_THIS_MODULE_
48 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::Write"};
49#endif
50 for (VariantValue line : v.As<Sequence<VariantValue>> ()) {
51 Write (line.As<Sequence<VariantValue>> ().Map<Iterable<String>> ([] (const VariantValue& i) { return i.As<String> (); }), out);
52 }
53 }
54 nonvirtual void Write (const Iterable<Sequence<String>>& m, const OutputStream::Ptr<Characters::Character>& out) const
55 {
56#if USE_NOISY_TRACE_IN_THIS_MODULE_
57 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::Write"};
58#endif
59 for (const Sequence<String>& seq : m) {
60 Write (seq, out);
61 }
62 }
63 nonvirtual void Write (const Iterable<String>& line, const OutputStream::Ptr<Characters::Character>& out) const
64 {
65#if USE_NOISY_TRACE_IN_THIS_MODULE_
66 Debug::TraceContextBumper ctx{"DataExchange::Variant::CharacterDelimitedLines::Reader::Rep_::Write"};
67#endif
69 for (Iterator<String> i = line.begin (); i != line.end (); ++i) {
70 sb << *i;
71 if (i + 1 != line.end ()) {
72 sb << fOptions_.fSeparator;
73 if (fOptions_.fSpaceSeparate) {
74 sb << " "sv;
75 }
76 }
77 }
78 out.WriteLn (sb);
79 }
80
81private:
82 Options fOptions_;
83};
84
85CharacterDelimitedLines::Writer::Writer (const Options& options)
86 : inherited{MakeSharedPtr<Rep_> (options)}
87{
88}
89
90void CharacterDelimitedLines::Writer::Write (const Iterable<Sequence<String>>& m, const OutputStream::Ptr<byte>& out)
91{
92 return Write (m, Streams::TextToBinary::Writer::New (out));
93}
94
95void CharacterDelimitedLines::Writer::Write (const Iterable<Sequence<String>>& m, const OutputStream::Ptr<Characters::Character>& out)
96{
97 Debug::UncheckedDynamicCast<Rep_&> (_GetRep ()).Write (m, out);
98}
99
100Memory::BLOB CharacterDelimitedLines::Writer::WriteAsBLOB (const Iterable<Sequence<String>>& m)
101{
102 return _WriteAsBLOBHelper ([&m, this] (const OutputStream::Ptr<byte>& out) { Write (m, out); });
103}
104
105String CharacterDelimitedLines::Writer::WriteAsString (const Iterable<Sequence<String>>& m)
106{
107 return _WriteAsStringHelper ([&m, this] (const OutputStream::Ptr<Characters::Character>& out) { Write (m, out); });
108}
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: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
Ptr New(const Streams::OutputStream::Ptr< byte > &src, const Characters::CodeCvt<> &char2OutputConverter)