3 #ifndef INCLUDE_NN_NLIB_MSGPACK_MPWRITER_H_
4 #define INCLUDE_NN_NLIB_MSGPACK_MPWRITER_H_
17 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS)
18 #undef NLIB_VIS_PUBLIC
19 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT
28 bool MpWrite(MpWriter* obj,
const T& v);
36 if (!m_Writer.Flush()) {
40 return this->GetErrorValue() == 0;
44 if (!m_Writer.Close()) {
47 return this->GetErrorValue() == 0;
50 if (m_ErrorValue == 0) m_ErrorValue = e;
62 template <
class T,
size_t n>
63 bool Write(
const T (&vec)[n]);
65 bool Write(
const T& tp);
71 bool WriteRawBody(
const void* p, uint32_t n) NLIB_NOEXCEPT
NLIB_NONNULL;
85 bool Write_(uint8_t v) NLIB_NOEXCEPT {
return this->WriteU8(v); }
86 bool Write_(uint16_t v) NLIB_NOEXCEPT {
return this->WriteU16(v); }
87 bool Write_(uint32_t v) NLIB_NOEXCEPT {
return this->WriteU32(v); }
88 bool Write_(uint64_t v) NLIB_NOEXCEPT {
return this->WriteU64(v); }
89 bool Write_(int8_t v) NLIB_NOEXCEPT {
return this->WriteI8(v); }
90 bool Write_(int16_t v) NLIB_NOEXCEPT {
return this->WriteI16(v); }
91 bool Write_(int32_t v) NLIB_NOEXCEPT {
return this->WriteI32(v); }
92 bool Write_(int64_t v) NLIB_NOEXCEPT {
return this->WriteI64(v); }
95 bool Write_(
bool v) NLIB_NOEXCEPT {
96 return m_Writer.Write<uint8_t>(v ? 0xC3 : 0xC2);
98 bool Write_(nil v) NLIB_NOEXCEPT {
100 return m_Writer.Write<uint8_t>(0xC0);
102 bool Write_(
const std::string& str) NLIB_NOEXCEPT {
return this->
Write(&str[0], str.size()); }
104 bool Write_(
const T& v);
107 BinaryWriter m_Writer;
112 #define NLIB_MPWRITER_CHK_NSTREAM \
117 #define NLIB_MPWRITER_SET_ERROR \
121 template <
class T,
size_t n>
123 if (!this->WriteArrayCount(static_cast<uint32_t>(n)))
return false;
124 for (
size_t i = 0; i < n; ++i) {
125 if (!this->
Write(vec[i])) {
126 NLIB_MPWRITER_SET_ERROR;
134 if (this->Write_(tp)) {
137 NLIB_MPWRITER_SET_ERROR;
140 #undef NLIB_MPWRITER_SET_ERROR
141 #undef NLIB_MPWRITER_CHK_NSTREAM
143 #define NLIB_MPWRITE(tp, coerce) \
144 template<> inline bool MpWrite(MpWriter* obj, const tp& v) { \
145 return obj->Write(static_cast<coerce>(v)); \
148 NLIB_MPWRITE(
char, int32_t)
149 NLIB_MPWRITE(
unsigned char, uint32_t)
150 NLIB_MPWRITE(
int, int32_t)
151 NLIB_MPWRITE(
unsigned int, uint32_t)
152 NLIB_MPWRITE(
short, int32_t)
153 NLIB_MPWRITE(
unsigned short, uint32_t)
154 NLIB_MPWRITE(
long long, int64_t)
155 NLIB_MPWRITE(
unsigned long long, uint64_t)
161 template <
class T1,
class T2>
167 uint32_t n =
static_cast<uint32_t
>(
StrLen(str));
171 template <
class T,
class Alloc>
173 size_t n = vec.size();
175 typename std::vector<T, Alloc>::const_iterator it = vec.begin();
176 typename std::vector<T, Alloc>::const_iterator it_end = vec.end();
177 for (; it != it_end; ++it) {
178 if (!w->
Write(*it))
return false;
183 template <
class T,
class Alloc>
185 size_t n = vec.
size();
189 for (; it != it_end; ++it) {
190 if (!w->
Write(*it))
return false;
195 template <
class K,
class V,
class Pr,
class Alloc>
198 if (!w->
WriteMapCount(static_cast<uint32_t>(n)))
return false;
199 typename std::map<K, V, Pr, Alloc>::const_iterator it = m.begin();
200 typename std::map<K, V, Pr, Alloc>::const_iterator end = m.end();
201 for (; it != end; ++it) {
202 if (!w->
Write(it->first))
return false;
203 if (!w->
Write(it->second))
return false;
209 bool MpWriter::Write_(
const T& v) {
217 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS)
218 #undef NLIB_VIS_PUBLIC
219 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT
222 #endif // INCLUDE_NN_NLIB_MSGPACK_MPWRITER_H_
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
bool Write(const char(&str)[n]) noexcept
Write(const T (&vec)[n]) を御覧ください。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
~MpWriter() noexcept
デストラクタです。
OutputStream * GetStream() noexcept
Init()で設定したベースストリームを取得します。
MessagePack形式のデータをストリームに書き込みます。
iterator begin() noexcept
コンテナの先頭を指す反復子を返します。
bool WriteMapCount(uint32_t n) noexcept
連想配列のヘッダ情報を書き込みます。
BaseType::const_iterator const_iterator
読み取り専用フォワードイテレータ
MessagePack又はJSONを読み込むことで作成されるオブジェクトです。
bool Close() noexcept
MpWriterをクローズします。
bool Write(BinaryWriter *w, T x)
この関数テンプレートを特殊化することで、ユーザー定義クラスを書きこむことができます。 ...
bool WriteArrayCount(uint32_t n) noexcept
配列のヘッダ情報を書き込みます。
std::vectorに似ていますが、コピーできないオブジェクトを格納可能なクラスが定義されています。 ...
bool WriteRawCount(uint32_t n) noexcept
バイト列データのヘッダ情報を書き込みます。
size_type size() const noexcept
格納されている要素の個数を返します。
MpWriter() noexcept
デフォルトコンストラクタです。
MessagePack, JSON及びCSVを読み込むと作成されるオブジェクトです。
bool WriteRawBody(const void *p, uint32_t n) noexcept
バイト列データの本体を書き込みます。
ストリームにバイナリファイルを書き込むクラスを定義しています。
bool Write(const char *str) noexcept
文字列を書き込みます。
void SetError(errno_t e) noexcept
エラーを設定します。
std::vectorに似た、コピーコンストラクタを持たないオブジェクトを格納可能なコンテナ類似クラスです。 ...
strlen, strcpy等を安全に使えるようにラップしています。
bool Flush() noexcept
内部ストリームへの書き込みをフラッシュします。
bool MpWrite(MpWriter *w, const std::map< K, V, Pr, Alloc > &m)
m をMpWriter経由で書き込みます。
size_t StrLen(const char *str) noexcept
nlib_strlen()をラップします。
出力ストリームの基底クラスです。このクラスを実体化することはできません。
iterator end() noexcept
コンテナの末尾を指す反復子を返します。
errno_t GetErrorValue() const noexcept
エラー値を取得します。