4#include "Stroika/Foundation/StroikaPreComp.h"
6#include "Stroika/Foundation/DataExchange/XML/WriterUtils.h"
7#include "Stroika/Foundation/Streams/TextToBinary.h"
16using namespace Stroika::Foundation::DataExchange::XML;
17using namespace Stroika::Foundation::Streams;
22 for (
int i = 0; i < indentLevel; ++i) {
28 static const String kTrueLbl_ =
"true"sv;
29 static const String kFalseLbl_ =
"false"sv;
34 out.
Write (kTrueLbl_);
37 out.
Write (kFalseLbl_);
43 ::swprintf (buf, Memory::NEltsOf (buf), L
"%lld", v);
49 ::swprintf (buf, Memory::NEltsOf (buf), L
"%llu", v);
55 ::swprintf (buf, Memory::NEltsOf (buf), L
"%Lf", v);
56 Assert (::wcslen (buf) >= 1);
58 for (
size_t i = ::wcslen (buf) - 1; buf[i] ==
'0'; --i) {
59 if (i != 0 and buf[i - 1] !=
'.') {
75 for (
auto i = v.begin (); i != v.end (); ++i) {
76 PrettyPrint_ (*i, out, indentLevel + 1);
79 Indent_ (out, indentLevel);
85 for (
auto i = v.begin (); i != v.end ();) {
86 Indent_ (out, indentLevel);
88 out.
Write (i->first.c_str ());
90 PrettyPrint_ (i->second, out, indentLevel + 1);
92 out.
Write (i->first.c_str ());
100 switch (v.GetType ()) {
101 case VariantValue::eNull:
103 case VariantValue::eBoolean:
104 PrettyPrint_ (v.
As<
bool> (), out);
106 case VariantValue::eDate:
107 PrettyPrint_ (v.
As<
String> (), out);
109 case VariantValue::eDateTime:
110 PrettyPrint_ (v.
As<
String> (), out);
112 case VariantValue::eInteger:
113 PrettyPrint_ (v.
As<
long long int> (), out);
115 case VariantValue::eUnsignedInteger:
116 PrettyPrint_ (v.
As<
unsigned long long int> (), out);
118 case VariantValue::eFloat:
119 PrettyPrint_ (v.
As<
long double> (), out);
121 case VariantValue::eString:
122 PrettyPrint_ (v.
As<
String> (), out);
124 case VariantValue::eMap:
125 PrettyPrint_ (v.
As<map<wstring, VariantValue>> (), out, indentLevel);
127 case VariantValue::eArray:
128 PrettyPrint_ (v.
As<vector<VariantValue>> (), out, indentLevel);
144 : fSerializationConfiguration_{config}
145 , fDocumentElementName_{config.GetDocumentElementName ().value_or (
String{})}
148 virtual _SharedPtrIRep Clone ()
const override
150 return make_shared<Rep_> (fSerializationConfiguration_);
152 virtual optional<filesystem::path> GetDefaultFileSuffix ()
const override
158 if (fDocumentElementName_.empty ()) {
159 Require (v.GetType () == VariantValue::eMap);
160 PrettyPrint_ (v, TextToBinary::Writer::New (out, UnicodeExternalEncodings::eUTF8, ByteOrderMark::eDontInclude), 0);
164 v2.
Add (fDocumentElementName_, v);
165 PrettyPrint_ (
VariantValue{v2}, TextToBinary::Writer::New (out, UnicodeExternalEncodings::eUTF8, ByteOrderMark::eDontInclude), 0);
170 if (fDocumentElementName_.empty ()) {
171 Require (v.GetType () == VariantValue::eMap);
172 PrettyPrint_ (v, out, 0);
176 v2.
Add (fDocumentElementName_, v);
182 return fSerializationConfiguration_;
186 fSerializationConfiguration_ = config;
187 fDocumentElementName_ = config.GetDocumentElementName ().value_or (
String{});
192 String fDocumentElementName_;
196 : inherited{make_shared<Rep_> (config)}
200Variant::XML::Writer::Rep_& Variant::XML::Writer::GetRep_ ()
203 return reinterpret_cast<Rep_&
> (inherited::_GetRep ());
206const Variant::XML::Writer::Rep_& Variant::XML::Writer::GetRep_ ()
const
209 return reinterpret_cast<const Rep_&
> (inherited::_GetRep ());
214 return GetRep_ ().GetConfiguration ();
219 GetRep_ ().SetConfiguration (config);
#define RequireNotReached()
#define EnsureMember(p, c)
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.
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual bool Add(ArgByValueType< key_type > key, ArgByValueType< mapped_type > newElt, AddReplaceMode addReplaceMode=AddReplaceMode::eAddReplaces)
Simple variant-value (case variant union) object, with (variant) basic types analogous to a value in ...
nonvirtual RETURNTYPE As() const
OutputStream<>::Ptr is Smart pointer to a stream-based sink of data.
nonvirtual void Write(span< ELEMENT_TYPE2, EXTENT_2 > elts) const