Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
JSONWriter.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* JSONWriter.cc (C) 2000-2023 */
9/* */
10/* Ecrivain au format JSON. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15#include "arcane/utils/JSONWriter.h"
16#include "arcane/utils/ArrayView.h"
17#include "arcane/utils/String.h"
18#include "arcane/utils/FatalErrorException.h"
19
20// Les deux lignes suivantes permettent d'utiliser des indices sur 64 bits
21// au lieu de 32 par défaut.
22#define RAPIDJSON_NO_SIZETYPEDEFINE
23namespace rapidjson { typedef ::std::size_t SizeType; }
24
25#define RAPIDJSON_HAS_STDSTRING 1
26#include "arcane/utils/internal/json/rapidjson/writer.h"
27#include "arcane/utils/internal/json/rapidjson/prettywriter.h"
28#include "arcane/utils/internal/json/rapidjson/document.h"
29#include "arcane/utils/internal/json/rapidjson/stringbuffer.h"
30
31#include <sstream>
32#include <iomanip>
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37namespace Arcane
38{
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
44{
45 public:
46 Impl(bool use_hex_float)
47 : m_writer(m_buffer),
48 m_use_hex_float(use_hex_float)
49 {
50 m_writer.SetIndent(' ',1);
51 m_writer.SetFormatOptions(rapidjson::kFormatSingleLineArray);
52 m_real_ostr.precision(FloatInfo<Real>::maxDigit());
53 }
54 public:
55 void writeKey(StringView key)
56 {
57 Span<const Byte> bytes = key.bytes();
58 Int64 size = bytes.size();
59 if (size==0)
60 ARCANE_FATAL("null size");
61 // TODO: regarder s'il faut toujours mettre 'true' et donc faire une copie.
62 m_writer.Key((const char*)bytes.data(),size,true);
63 }
64 void writeStringValue(StringView value)
65 {
66 Span<const Byte> bytes = value.bytes();
67 Int64 size = bytes.size();
68 if (size==0){
69 m_writer.Null();
70 return;
71 }
72 // TODO: regarder s'il faut toujours mettre 'true' et donc faire une copie.
73 m_writer.String((const char*)bytes.data(),size,true);
74 }
75 void writeStringValue(const std::string& value)
76 {
77 m_writer.String(value);
78 }
79 void write(StringView key,const char* v);
80 void write(StringView key,Real v)
81 {
82 writeKey(key);
83 if (m_use_hex_float){
84 char buf[32];
85 sprintf(buf,"%a",v);
86 m_writer.String(buf);
87 }
88 else
89 m_writer.Double(v);
90 }
91 void write(StringView key,Span<const Real> view)
92 {
93 writeKey(key);
94 {
95 m_real_ostr.str(std::string());
96 // NOTE: avec le C++11, on peut utiliser std::hexfloat comme modificateur
97 // pour écrire directement en hexadécimal flottant. Cependant ne fonctionne
98 // qu'à partir de GCC 5.0 ou visual studio 2015.
99 // ostr << std::hexfloat;
100 char buf[32];
101 for( Int64 i=0, n=view.size(); i<n; ++i ){
102 if (i!=0)
103 m_real_ostr << ' ';
104 if (m_use_hex_float){
105 sprintf(buf,"%a",view[i]);
106 m_real_ostr << buf;
107 }
108 else
109 m_real_ostr << view[i];
110 }
111 writeStringValue(m_real_ostr.str());
112 }
113 }
114 public:
115 rapidjson::StringBuffer m_buffer;
116 rapidjson::PrettyWriter<rapidjson::StringBuffer> m_writer;
117 bool m_use_hex_float;
118 std::ostringstream m_real_ostr;
119};
120
121/*---------------------------------------------------------------------------*/
122/*---------------------------------------------------------------------------*/
123
124JSONWriter::
125JSONWriter(FormatFlags format_flags)
126: m_p(nullptr)
127{
128 bool use_hex_float = (int)format_flags & (int)FormatFlags::HexFloat;
129 m_p = new Impl(use_hex_float);
130}
131
132JSONWriter::
133~JSONWriter()
134{
135 delete m_p;
136}
137
138void JSONWriter::
139beginObject()
140{
141 m_p->m_writer.StartObject();
142}
143void JSONWriter::
144endObject()
145{
146 m_p->m_writer.EndObject();
147}
148void JSONWriter::
149writeKey(StringView key)
150{
151 m_p->writeKey(key);
152}
153void JSONWriter::
154beginArray()
155{
156 m_p->m_writer.StartArray();
157}
158void JSONWriter::
159endArray()
160{
161 m_p->m_writer.EndArray();
162}
163
164void JSONWriter::
165writeValue(StringView str)
166{
167 m_p->writeStringValue(str);
168}
169void JSONWriter::
170write(StringView key,bool v)
171{
172 m_p->writeKey(key);
173 m_p->m_writer.Bool(v);
174}
175void JSONWriter::
176_writeInt64(StringView key,Int64 v)
177{
178 m_p->writeKey(key);
179 m_p->m_writer.Int64(v);
180}
181void JSONWriter::
182_writeUInt64(StringView key,UInt64 v)
183{
184 m_p->writeKey(key);
185 m_p->m_writer.Uint64(v);
186}
187void JSONWriter::
188write(StringView key,Real v)
189{
190 m_p->write(key,v);
191}
192void JSONWriter::
193write(StringView key,StringView str)
194{
195 m_p->writeKey(key);
196 m_p->writeStringValue(str);
197}
198void JSONWriter::
199write(StringView key,const char* v)
200{
201 m_p->writeKey(key);
202 m_p->writeStringValue(StringView(v));
203}
204void JSONWriter::
205write(StringView key,std::string_view v)
206{
207 m_p->writeKey(key);
208 m_p->writeStringValue(v);
209}
210void JSONWriter::
211writeIfNotNull(StringView key,const String& str)
212{
213 if (str.null())
214 return;
215 m_p->writeKey(key);
216 m_p->writeStringValue(str);
217}
218
219void JSONWriter::
220write(StringView key,Span<const Int32> view)
221{
222 m_p->writeKey(key);
223 m_p->m_writer.StartArray();
224 for( Int64 i=0, n=view.size(); i<n; ++i )
225 m_p->m_writer.Int(view[i]);
226 m_p->m_writer.EndArray();
227}
228
229void JSONWriter::
230write(StringView key,Span<const Int64> view)
231{
232 m_p->writeKey(key);
233 m_p->m_writer.StartArray();
234 for( Int64 i=0, n=view.size(); i<n; ++i )
235 m_p->m_writer.Int64(view[i]);
236 m_p->m_writer.EndArray();
237}
238
239void JSONWriter::
240write(StringView key,Span<const Real> view)
241{
242 m_p->write(key,view);
243}
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
248StringView JSONWriter::
249getBuffer() const
250{
251 const Byte* buf_chars = reinterpret_cast<const Byte*>(m_p->m_buffer.GetString());
252 Span<const Byte> bytes(buf_chars,m_p->m_buffer.GetSize());
253 return StringView(bytes);
254}
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
259} // End namespace Arcane
260
261/*---------------------------------------------------------------------------*/
262/*---------------------------------------------------------------------------*/
263
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Informations sur le type flottant.
Definition Limits.h:48
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:209
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:419
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
Vue sur une chaîne de caractères UTF-8.
Definition StringView.h:47
constexpr Span< const Byte > bytes() const ARCCORE_NOEXCEPT
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition StringView.h:96
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
unsigned char Byte
Type d'un octet.
Definition UtilsTypes.h:142