nlib
JsonStreamGenerator.h
1 
2 /*--------------------------------------------------------------------------------*
3  Project: CrossRoad
4  Copyright (C)Nintendo All rights reserved.
5 
6  These coded instructions, statements, and computer programs contain proprietary
7  information of Nintendo and/or its licensed developers and are protected by
8  national and international copyright laws. They may not be disclosed to third
9  parties or copied or duplicated in any form, in whole or in part, without the
10  prior written consent of Nintendo.
11 
12  The content herein is highly confidential and should be handled accordingly.
13  *--------------------------------------------------------------------------------*/
14 
15 #pragma once
16 #ifndef INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMGENERATOR_H_
17 #define INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMGENERATOR_H_
18 
19 #include "nn/nlib/Swap.h"
21 
22 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS)
23 #undef NLIB_VIS_PUBLIC
24 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT
25 #endif
26 NLIB_NAMESPACE_BEGIN
27 class OutputStream;
28 namespace msgpack {
29 
31  bool msgpack;
34  bool strict;
36  : msgpack(false), pretty_print(false),
37  omit_utf8_checking(false), strict(false) {}
38 };
39 
41  public:
42  enum Error {
43  kOk = 0,
44  kErrorKeyRequired,
45  kErrorKeyForbidden,
46  kErrorEndArrayRequired,
47  kErrorEndArrayForbidden,
48  kErrorEndMapRequired,
49  kErrorEndMapForbidden,
50  kErrorStringUtf8,
51  kErrorStream,
52  kErrorOutOfMemory,
53  kErrorArrayOrMapRequired,
54  kErrorDocumentEnd,
55  kErrorBinaryNotAvailable,
56  kErrorExtNotAvailable,
57  kErrorInvalidParam,
58  ERROR_OK = kOk,
59  ERROR_KEY_REQUIRED = kErrorKeyRequired,
60  ERROR_KEY_FORBIDDEN = kErrorKeyForbidden,
61  ERROR_ENDARRAY_REQUIRED = kErrorEndArrayRequired,
62  ERROR_ENDARRAY_FORBIDDEN = kErrorEndArrayForbidden,
63  ERROR_ENDMAP_REQUIRED = kErrorEndMapRequired,
64  ERROR_ENDMAP_FORBIDDEN = kErrorEndMapForbidden,
65  ERROR_STRING_UTF8 = kErrorStringUtf8,
66  ERROR_STREAM = kErrorStream,
67  ERROR_ENOMEM = kErrorOutOfMemory,
68  ERROR_ARRAY_OR_MAP_REQUIRED = kErrorArrayOrMapRequired,
69  ERROR_DOCUMENT_END = kErrorDocumentEnd,
70  ERROR_BINARY_NOT_AVAILABLE = kErrorBinaryNotAvailable,
71  ERROR_EXT_NOT_AVAILABLE = kErrorExtNotAvailable,
72  ERROR_EINVAL = kErrorInvalidParam
73  };
74 
75  public:
76  static errno_t Generate(size_t* written, nlib_utf8_t* str, size_t n, const MpObject& obj,
77  const JsonStreamGeneratorSettings& settings)
79  static errno_t Generate(size_t* written, nlib_utf8_t* str, size_t n, const MpObject& obj)
82  return Generate(written, str, n, obj, settings);
83  }
84  template<size_t N>
85  static errno_t Generate(size_t* written, nlib_utf8_t (&str)[N], const MpObject& obj,
87  return Generate(written, str, N, obj, settings);
88  }
89  template<size_t N>
90  static errno_t Generate(size_t* written, nlib_utf8_t (&str)[N],
91  const MpObject& obj) NLIB_NOEXCEPT {
93  return Generate(written, str, N, obj, settings);
94  }
95 
96  JsonStreamGenerator() NLIB_NOEXCEPT : prv_(NULL), error_(kOk) {}
98  NLIB_MOVE_MEMBER_HELPER_1(JsonStreamGenerator, prv_);
100  errno_t Init() NLIB_NOEXCEPT {
102  return Init(settings);
103  }
104  errno_t Open(OutputStream* stream) NLIB_NOEXCEPT NLIB_NONNULL;
105  bool Flush() NLIB_NOEXCEPT;
106  errno_t Close() NLIB_NOEXCEPT;
107 
108  JsonStreamGenerator& StartArray(size_t count) NLIB_NOEXCEPT;
109  JsonStreamGenerator& StartMap(size_t count) NLIB_NOEXCEPT;
110  JsonStreamGenerator& Key(const nlib_utf8_t* key) NLIB_NOEXCEPT NLIB_NONNULL;
114  JsonStreamGenerator& Boolean(bool value) NLIB_NOEXCEPT;
115  JsonStreamGenerator& Int8(int8_t num) NLIB_NOEXCEPT;
116  JsonStreamGenerator& Uint8(uint8_t num) NLIB_NOEXCEPT;
117  JsonStreamGenerator& Int16(int16_t num) NLIB_NOEXCEPT;
118  JsonStreamGenerator& Uint16(uint16_t num) NLIB_NOEXCEPT;
119  JsonStreamGenerator& Int32(int32_t num) NLIB_NOEXCEPT;
120  JsonStreamGenerator& Uint32(uint32_t num) NLIB_NOEXCEPT;
121  JsonStreamGenerator& Int64(int64_t num) NLIB_NOEXCEPT;
122  JsonStreamGenerator& Uint64(uint64_t num) NLIB_NOEXCEPT;
123  JsonStreamGenerator& Float(float num) NLIB_NOEXCEPT;
124  JsonStreamGenerator& Double(double num) NLIB_NOEXCEPT;
125  JsonStreamGenerator& String(const nlib_utf8_t* str) NLIB_NOEXCEPT NLIB_NONNULL;
126  JsonStreamGenerator& Binary(const void* bin, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
127  JsonStreamGenerator& Ext(int8_t tp, const void* bin, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
128  JsonStreamGenerator& Object(const MpObject& obj) NLIB_NOEXCEPT;
129 
130  template<class STDSTRING>
131  JsonStreamGenerator& String(const STDSTRING& str) NLIB_NOEXCEPT {
132  return String(str.c_str());
133  }
134  JsonStreamGenerator& EmptyArray() NLIB_NOEXCEPT { return StartArray(0).EndArray(); }
135  JsonStreamGenerator& EmptyMap() NLIB_NOEXCEPT { return StartMap(0).EndMap(); }
136  JsonStreamGenerator& Int8Array(const int8_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
137  JsonStreamGenerator& Uint8Array(const uint8_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
138  JsonStreamGenerator& Int16Array(const int16_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
139  JsonStreamGenerator& Uint16Array(const uint16_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
140  JsonStreamGenerator& Int32Array(const int32_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
141  JsonStreamGenerator& Uint32Array(const uint32_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
142  JsonStreamGenerator& Int64Array(const int64_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
143  JsonStreamGenerator& Uint64Array(const uint64_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
144  JsonStreamGenerator& FloatArray(const float* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
145  JsonStreamGenerator& DoubleArray(const double* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
146  Error GetError() const NLIB_NOEXCEPT { return error_; }
147  NLIB_SAFE_BOOL(JsonStreamGenerator, error_ == kOk);
148  void swap(JsonStreamGenerator& rhs) NLIB_NOEXCEPT {
149  using std::swap;
150  swap(prv_, rhs.prv_);
151  swap(error_, rhs.error_);
152  }
153 
154  private:
155  struct State;
156  NLIB_VIS_HIDDEN State* WriteStartSeq_(size_t count) NLIB_NOEXCEPT;
157  NLIB_VIS_HIDDEN bool JsonIndent_(size_t level) NLIB_NOEXCEPT;
158  NLIB_VIS_HIDDEN bool CheckAndStateChange_() NLIB_NOEXCEPT;
159  NLIB_VIS_HIDDEN bool WriteJsonString_(const nlib_utf8_t* str,
160  size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
161  NLIB_VIS_HIDDEN bool WriteMsgpackString_(const nlib_utf8_t* str,
162  size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
163  NLIB_VIS_HIDDEN void String_(const nlib_utf8_t* str, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
164  NLIB_VIS_HIDDEN void Key_(const nlib_utf8_t* key, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
165 
166  struct JsonStreamGeneratorPrivate;
167  JsonStreamGeneratorPrivate* prv_;
168  Error error_;
170 };
171 
172 } // namespace msgpack
173 NLIB_NAMESPACE_END
174 NLIB_DEFINE_STD_SWAP(::nlib_ns::msgpack::JsonStreamGenerator)
175 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS)
176 #undef NLIB_VIS_PUBLIC
177 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT
178 #endif
179 
180 #endif // INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMGENERATOR_H_
errno_t Init() noexcept
デフォルト設定でパーサーの初期化を行います。
static errno_t Generate(size_t *written, nlib_utf8_t(&str)[N], const MpObject &obj, const JsonStreamGeneratorSettings &settings) noexcept
Generate(written, str, N, obj, settings)を実行します。
bool strict
trueの場合は最初の出力が、配列かマップでない場合にエラーを発生させます。
static errno_t Generate(size_t *written, nlib_utf8_t(&str)[N], const MpObject &obj) noexcept
JsonStreamGeneratorSettingsのデフォルト設定でGenerate(written, str, N, obj, settings)を実行します。 ...
JsonStreamGenerator & EmptyArray() noexcept
空の配列を出力します。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:163
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
Definition: Config.h:178
JsonStreamGenerator & EndArray() noexcept
配列を終了します。
Error GetError() const noexcept
エラーを取得します。
JsonStreamGenerator() noexcept
デフォルトコンストラクタです。
#define NLIB_VIS_HIDDEN
関数やクラス等のシンボルをライブラリの外部に公開しません。
Definition: Platform_unix.h:88
#define NLIB_VIS_PUBLIC
関数やクラス等のシンボルをライブラリの外部に公開します。
Definition: Platform_unix.h:89
bool omit_utf8_checking
trueの場合は文字列の出力時にUTF-8であるかどうかのチェックを省略します。
MessagePack又はJSONを読み込むことで作成されるオブジェクトです。
Definition: MpObject.h:95
#define NLIB_NONNULL_2
2番目の引数にNULLを指定することができないことを示します。
JsonStreamGenerator & String(const STDSTRING &str) noexcept
文字列を出力します。
bool msgpack
falseの場合はJsonStreamGeneratorはJSONを出力し、trueの場合はmsgpackを出力します。 ...
MessagePack, JSON及びCSVを読み込むと作成されるオブジェクトです。
constexpr JsonStreamGeneratorSettings() noexcept
デフォルトコンストラクタです。各データメンバにデフォルト値を設定します。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Config.h:99
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
Definition: Config.h:93
static errno_t Generate(size_t *written, nlib_utf8_t *str, size_t n, const MpObject &obj) noexcept
JsonStreamGeneratorSettingsのデフォルト設定でGenerate(written, str, n, obj, settings)を実行します。 ...
bool pretty_print
trueの場合はJSON出力時に整形されたJSONを出力します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
Definition: Config.h:229
JsonStreamGeneratorの設定パラメータ群を格納する構造体です。
JsonStreamGenerator & EndMap() noexcept
マップを終了します。
JsonStreamGenerator & EmptyMap() noexcept
空のマップを出力します。
JSON又はmsgpackを出力するためのクラスです。
#define NLIB_NONNULL
全ての引数にNULLを指定することができないことを示します。
出力ストリームの基底クラスです。このクラスを実体化することはできません。
Definition: OutputStream.h:30
char nlib_utf8_t
charのtypedefです。文字列がUTF-8であることを示します。
Definition: Platform.h:300
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:37