nlib
JsonStreamGenerator.h
1 
2 /*---------------------------------------------------------------------------*
3 
4  Project: CrossRoad
5  Copyright (C)2012-2016 Nintendo. All rights reserved.
6 
7  These coded instructions, statements, and computer programs contain
8  proprietary information of Nintendo of America Inc. and/or Nintendo
9  Company Ltd., and are protected by Federal copyright law. They may
10  not be disclosed to third parties or copied or duplicated in any form,
11  in whole or in part, without the prior written consent of Nintendo.
12 
13  *---------------------------------------------------------------------------*/
14 
15 #pragma once
16 #ifndef INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMGENERATOR_H_
17 #define INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMGENERATOR_H_
18 
20 
21 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS)
22 #undef NLIB_VIS_PUBLIC
23 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT
24 #endif
25 NLIB_NAMESPACE_BEGIN
26 class OutputStream;
27 namespace msgpack {
28 
30  bool msgpack;
33  bool strict;
35  : msgpack(false), pretty_print(false),
36  omit_utf8_checking(false), strict(false) {}
37 };
38 
40  public:
41  enum Error {
42  ERROR_OK = 0,
43  ERROR_KEY_REQUIRED,
44  ERROR_KEY_FORBIDDEN,
45  ERROR_ENDARRAY_REQUIRED,
46  ERROR_ENDARRAY_FORBIDDEN,
47  ERROR_ENDMAP_REQUIRED,
48  ERROR_ENDMAP_FORBIDDEN,
49  ERROR_STRING_UTF8,
50  ERROR_STREAM,
51  ERROR_ENOMEM,
52  ERROR_ARRAY_OR_MAP_REQUIRED,
53  ERROR_DOCUMENT_END,
54  ERROR_BINARY_NOT_AVAILABLE,
55  ERROR_EXT_NOT_AVAILABLE,
56  ERROR_EINVAL
57  };
58 
59  public:
60  static errno_t Generate(size_t* written, char* str, size_t n, const MpObject& obj,
61  const JsonStreamGeneratorSettings& settings)
63  static errno_t Generate(size_t* written, char* str, size_t n, const MpObject& obj)
66  return Generate(written, str, n, obj, settings);
67  }
68  template<size_t N>
69  static errno_t Generate(size_t* written, char(&str)[N], const MpObject& obj,
71  return Generate(written, str, N, obj, settings);
72  }
73  template<size_t N>
74  static errno_t Generate(size_t* written, char (&str)[N], const MpObject& obj) NLIB_NOEXCEPT {
76  return Generate(written, str, N, obj, settings);
77  }
78 
79  JsonStreamGenerator() NLIB_NOEXCEPT : prv_(NULL), error_(ERROR_OK) {}
82  errno_t Init() NLIB_NOEXCEPT {
84  return Init(settings);
85  }
86  errno_t Open(OutputStream* stream) NLIB_NOEXCEPT NLIB_NONNULL;
87  bool Flush() NLIB_NOEXCEPT;
88  errno_t Close() NLIB_NOEXCEPT;
89 
90  JsonStreamGenerator& StartArray(size_t count) NLIB_NOEXCEPT;
91  JsonStreamGenerator& StartMap(size_t count) NLIB_NOEXCEPT;
92  JsonStreamGenerator& Key(const char* key) NLIB_NOEXCEPT NLIB_NONNULL;
96  JsonStreamGenerator& Boolean(bool value) NLIB_NOEXCEPT;
97  JsonStreamGenerator& Int8(int8_t num) NLIB_NOEXCEPT;
98  JsonStreamGenerator& Uint8(uint8_t num) NLIB_NOEXCEPT;
99  JsonStreamGenerator& Int16(int16_t num) NLIB_NOEXCEPT;
100  JsonStreamGenerator& Uint16(uint16_t num) NLIB_NOEXCEPT;
101  JsonStreamGenerator& Int32(int32_t num) NLIB_NOEXCEPT;
102  JsonStreamGenerator& Uint32(uint32_t num) NLIB_NOEXCEPT;
103  JsonStreamGenerator& Int64(int64_t num) NLIB_NOEXCEPT;
104  JsonStreamGenerator& Uint64(uint64_t num) NLIB_NOEXCEPT;
105  JsonStreamGenerator& Float(float num) NLIB_NOEXCEPT;
106  JsonStreamGenerator& Double(double num) NLIB_NOEXCEPT;
107  JsonStreamGenerator& String(const char* str) NLIB_NOEXCEPT NLIB_NONNULL;
108  JsonStreamGenerator& Binary(const void* bin, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
109  JsonStreamGenerator& Ext(int8_t tp, const void* bin, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
110  JsonStreamGenerator& Object(const MpObject& obj) NLIB_NOEXCEPT;
111 
112  template<class STDSTRING>
113  JsonStreamGenerator& String(const STDSTRING& str) NLIB_NOEXCEPT {
114  return String(str.c_str());
115  }
116  JsonStreamGenerator& EmptyArray() NLIB_NOEXCEPT { return StartArray(0).EndArray(); }
117  JsonStreamGenerator& EmptyMap() NLIB_NOEXCEPT { return StartMap(0).EndMap(); }
118  JsonStreamGenerator& Int8Array(const int8_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
119  JsonStreamGenerator& Uint8Array(const uint8_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
120  JsonStreamGenerator& Int16Array(const int16_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
121  JsonStreamGenerator& Uint16Array(const uint16_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
122  JsonStreamGenerator& Int32Array(const int32_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
123  JsonStreamGenerator& Uint32Array(const uint32_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
124  JsonStreamGenerator& Int64Array(const int64_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
125  JsonStreamGenerator& Uint64Array(const uint64_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
126  JsonStreamGenerator& FloatArray(const float* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
127  JsonStreamGenerator& DoubleArray(const double* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
128  Error GetError() const NLIB_NOEXCEPT { return error_; }
129  NLIB_SAFE_BOOL(JsonStreamGenerator, error_ == ERROR_OK);
130 
131  private:
132  struct State;
133  NLIB_VIS_HIDDEN State* WriteStartSeq_(size_t count) NLIB_NOEXCEPT;
134  NLIB_VIS_HIDDEN bool JsonIndent_(size_t level) NLIB_NOEXCEPT;
135  NLIB_VIS_HIDDEN bool CheckAndStateChange_() NLIB_NOEXCEPT;
136  NLIB_VIS_HIDDEN bool WriteJsonString_(const char* str, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
137  NLIB_VIS_HIDDEN bool WriteMsgpackString_(const char* str, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
138  NLIB_VIS_HIDDEN void String_(const char* str, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
139  NLIB_VIS_HIDDEN void Key_(const char* key, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
140 
141  struct JsonStreamGeneratorPrivate;
142  JsonStreamGeneratorPrivate* prv_;
143  Error error_;
144 };
145 
146 } // namespace msgpack
147 NLIB_NAMESPACE_END
148 
149 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS)
150 #undef NLIB_VIS_PUBLIC
151 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT
152 #endif
153 
154 #endif // INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMGENERATOR_H_
static errno_t Generate(size_t *written, char(&str)[N], const MpObject &obj) noexcept
Runs Generate(written, str, N, obj, settings) with the default JsonStreamGeneratorSettings settings s...
errno_t Init() noexcept
Initializes the parser using the default settings.
bool strict
If true, generates an error if the first output is not an array or map.
JsonStreamGenerator & EmptyArray() noexcept
Outputs an empty array.
#define NLIB_SAFE_BOOL(class_name, exp)
Defines a safe operator bool function in the class. Uses the C++11 explicit bool if it is available f...
Definition: Config.h:173
JsonStreamGenerator & EndArray() noexcept
Finishes the array.
Error GetError() const noexcept
Gets an error.
JsonStreamGenerator() noexcept
Instantiates the object with default parameters (default constructor).
#define NLIB_VIS_HIDDEN
Symbols for functions and classes are not made available outside of the library.
Definition: Platform_unix.h:86
#define NLIB_VIS_PUBLIC
Symbols for functions and classes are made available outside of the library.
Definition: Platform_unix.h:87
bool omit_utf8_checking
If true, checking if the string is UTF-8 is skipped when outputting the string.
Object created when MessagePack or JSON is read.
Definition: MpObject.h:95
static errno_t Generate(size_t *written, char(&str)[N], const MpObject &obj, const JsonStreamGeneratorSettings &settings) noexcept
Runs Generate(written, str, N, obj, settings).
static errno_t Generate(size_t *written, char *str, size_t n, const MpObject &obj) noexcept
Runs Generate(written, str, n, obj, settings) with the default JsonStreamGeneratorSettings settings s...
#define NLIB_NONNULL_2
Indicates that you cannot specify NULL for the second argument.
JsonStreamGenerator & String(const STDSTRING &str) noexcept
Outputs a string.
bool msgpack
If true, JsonStreamGenerator outputs JSON; if false, it outputs msgpack.
Object created when MessagePack, JSON, or CSV is read.
constexpr JsonStreamGeneratorSettings() noexcept
Instantiates the object with default parameters (default constructor). Sets each data member to the d...
#define NLIB_NOEXCEPT
Defines noexcept geared to the environment, or the equivalent.
Definition: Config.h:99
#define NLIB_CEXPR
Defines constexpr if it is available for use. If not, holds an empty string.
Definition: Config.h:93
bool pretty_print
If true, outputs formatted JSON when outputting JSON.
#define NLIB_FINAL
Defines final if it is available for use. If not, holds an empty string.
Definition: Config.h:224
Data structure used to store the JsonStreamGenerator settings parameters.
JsonStreamGenerator & EndMap() noexcept
Finishes the map.
JsonStreamGenerator & EmptyMap() noexcept
Outputs an empty map.
Class for outputting JSON or msgpack.
#define NLIB_NONNULL
Indicates that you cannot specify NULL for all arguments.
The base class for output streams. This class cannot be instantiated.
Definition: OutputStream.h:30
int errno_t
Indicates with an int-type typedef that a POSIX error value is returned as the return value...
Definition: NMalloc.h:37