nlib
BinaryWriter.h
[詳解]
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_BINARYWRITER_H_
4 #define INCLUDE_NN_NLIB_BINARYWRITER_H_
5 
6 #include "nn/nlib/Config.h"
7 #include "nn/nlib/Swap.h"
8 #include "nn/nlib/OutputStream.h"
9 
10 NLIB_NAMESPACE_BEGIN
11 NLIB_EXPIMP_TEMPLATE(detail::MiniBufOut<512>);
12 
14  public:
15  enum EndianSetting { DEFAULT = 0, ENDIAN_LITTLE, ENDIAN_BIG };
16 
17  public:
18  BinaryWriter() NLIB_NOEXCEPT : stream_(NULL),
19  errno_(-1),
20  swap_endian_(false) {}
21  ~BinaryWriter() NLIB_NOEXCEPT { this->Close(); }
22  errno_t Init(EndianSetting endian) NLIB_NOEXCEPT;
23  errno_t Init() NLIB_NOEXCEPT { return Init(DEFAULT); }
24  errno_t Open(OutputStream* stream) NLIB_NOEXCEPT;
25 
26 #define NLIB_BINW(tp) return this->Write_(static_cast<tp>(x))
27  bool Write(char x) NLIB_NOEXCEPT { NLIB_BINW(uint8_t); }
28  bool Write(signed char x) NLIB_NOEXCEPT { NLIB_BINW(uint8_t); }
29  bool Write(unsigned char x) NLIB_NOEXCEPT { NLIB_BINW(uint8_t); }
30  bool Write(short x) NLIB_NOEXCEPT { NLIB_BINW(uint16_t); } // NOLINT
31  bool Write(unsigned short x) NLIB_NOEXCEPT { NLIB_BINW(uint16_t); } // NOLINT
32  bool Write(int x) NLIB_NOEXCEPT { NLIB_BINW(uint32_t); }
33  bool Write(unsigned int x) NLIB_NOEXCEPT { NLIB_BINW(uint32_t); }
34  bool Write(long x) NLIB_NOEXCEPT { NLIB_BINW(nlib_ulong_compatible_t); } // NOLINT
35  bool Write(unsigned long x) NLIB_NOEXCEPT { NLIB_BINW(nlib_ulong_compatible_t); } // NOLINT
36  bool Write(long long x) NLIB_NOEXCEPT { NLIB_BINW(uint64_t); } // NOLINT
37  bool Write(unsigned long long x) NLIB_NOEXCEPT { NLIB_BINW(uint64_t); } // NOLINT
38  bool Write(float x) NLIB_NOEXCEPT { NLIB_BINW(float); } // NOLINT
39  bool Write(double x) NLIB_NOEXCEPT { NLIB_BINW(double); } // NOLINT
40 #undef NLIB_BW
41 
42  template <class T>
43  bool Write(T x) NLIB_NOEXCEPT;
44 
45  bool WriteArray(const unsigned char* x, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
46  bool WriteArray(const unsigned short* x, size_t n) NLIB_NOEXCEPT NLIB_NONNULL; // NOLINT
47  bool WriteArray(const unsigned int* x, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
48  bool WriteArray(const unsigned long long* x, size_t n) NLIB_NOEXCEPT NLIB_NONNULL; // NOLINT
49  bool WriteArray(const unsigned long* x, size_t n) NLIB_NOEXCEPT { // NOLINT
50 #ifdef NLIB_LP64
51  return this->WriteArray(reinterpret_cast<const unsigned long long*>(x), n); // NOLINT
52 #else
53  return this->WriteArray(reinterpret_cast<const unsigned int*>(x), n);
54 #endif
55  }
56 
57  bool WriteArray(const float* x, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
58  bool WriteArray(const double* x, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
59  bool WriteArray(const signed char* x, size_t n) NLIB_NOEXCEPT {
60  return this->WriteArray(reinterpret_cast<const unsigned char*>(x), n);
61  }
62  bool WriteArray(const char* x, size_t n) NLIB_NOEXCEPT {
63  return this->WriteArray(reinterpret_cast<const unsigned char*>(x), n);
64  }
65  bool WriteArray(const short* x, size_t n) NLIB_NOEXCEPT { // NOLINT
66  return this->WriteArray(reinterpret_cast<const unsigned short*>(x), n); // NOLINT
67  }
68  bool WriteArray(const int* x, size_t n) NLIB_NOEXCEPT {
69  return this->WriteArray(reinterpret_cast<const unsigned int*>(x), n);
70  }
71  bool WriteArray(const long* x, size_t n) NLIB_NOEXCEPT { // NOLINT
72 #ifdef NLIB_LP64
73  return this->WriteArray(reinterpret_cast<const unsigned long long*>(x), n); // NOLINT
74 #else
75  return this->WriteArray(reinterpret_cast<const unsigned int*>(x), n);
76 #endif
77  }
78  bool WriteArray(const long long* x, size_t n) NLIB_NOEXCEPT { // NOLINT
79  return this->WriteArray(reinterpret_cast<const unsigned long long*>(x), n); // NOLINT
80  }
81  template <class T>
82  bool WriteArray(const T* x, size_t n) NLIB_NOEXCEPT;
83  template <class T, size_t N>
84  bool WriteArray(const T(&a)[N]) NLIB_NOEXCEPT;
85  bool Flush() NLIB_NOEXCEPT;
86  bool Close() NLIB_NOEXCEPT;
87  void SetError(errno_t e) NLIB_NOEXCEPT {
88  if (errno_ == 0) errno_ = e;
89  }
90  errno_t GetErrorValue() const NLIB_NOEXCEPT { return errno_; }
91  OutputStream* GetStream() NLIB_NOEXCEPT { return stream_; }
92 
93  NLIB_SAFE_BOOL(BinaryWriter, GetErrorValue() == 0)
94 
95  private:
96  bool Write_(uint8_t x) NLIB_NOEXCEPT;
97  bool Write_(uint16_t x) NLIB_NOEXCEPT;
98  bool Write_(uint32_t x) NLIB_NOEXCEPT;
99  bool Write_(uint64_t x) NLIB_NOEXCEPT;
100  bool Write_(float x) NLIB_NOEXCEPT;
101  bool Write_(double x) NLIB_NOEXCEPT;
102  NLIB_VIS_HIDDEN bool WriteStream() NLIB_NOEXCEPT;
103 
104  private:
105  OutputStream* stream_;
106  ErrnoT errno_;
107  bool swap_endian_;
108  detail::MiniBufOut<512> mini_buf_;
109 
111 };
112 
113 namespace binary_writer {
114 
115 template<class T>
116 NLIB_ALWAYS_INLINE bool Write(BinaryWriter* w, T x) { return w->Write(x); }
117 
118 template <class T>
119 NLIB_ALWAYS_INLINE bool WriteArray(BinaryWriter* w, const T* x, size_t n) {
120  return w->WriteArray(x, n);
121 }
122 }
123 
124 template <class T>
126  return binary_writer::Write(this, x);
127 }
128 
129 template <class T>
131  return binary_writer::WriteArray(this, x, n);
132 }
133 
134 template <class T, size_t N>
136  return this->WriteArray(&a[0], N);
137 }
138 
139 NLIB_NAMESPACE_END
140 
141 #endif // INCLUDE_NN_NLIB_BINARYWRITER_H_
bool Write(unsigned long x) noexcept
ストリームにバイナリでunsigned long型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:35
OutputStream * GetStream() noexcept
テキストライタが書き込みを行うストリームを取得します。
Definition: BinaryWriter.h:91
#define NLIB_ALWAYS_INLINE
コンパイラに関数をインライン展開するように強く示します。
Definition: Platform_unix.h:69
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:145
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
Definition: Config.h:160
bool WriteArray(const unsigned char *x, size_t n) noexcept
ストリームにバイナリでunsigned char型の配列を書き込みます。成功した場合はtrueを返します。nが0の場合も...
bool Write(float x) noexcept
ストリームにバイナリでfloat型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:38
errno_t GetErrorValue() const noexcept
書き込み等が失敗した際に、エラーの原因を取得できます。
Definition: BinaryWriter.h:90
bool Write(unsigned short x) noexcept
ストリームにバイナリでunsigned short型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:31
uint32_t nlib_ulong_compatible_t
unsigned longと互換性のある整数型がtypedefされています。
Definition: Platform.h:617
errno_t Init() noexcept
プログラムが動作しているマシンと同じエンディアンでバイナリライタを初期化します。
Definition: BinaryWriter.h:23
#define NLIB_VIS_HIDDEN
関数やクラス等のシンボルをライブラリの外部に公開しません。
Definition: Platform_unix.h:60
~BinaryWriter() noexcept
デストラクタです。ストリームをクローズしません。
Definition: BinaryWriter.h:21
#define NLIB_VIS_PUBLIC
関数やクラス等のシンボルをライブラリの外部に公開します。
Definition: Platform_unix.h:61
bool Write(char x) noexcept
ストリームにバイナリでchar型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:27
bool Write(BinaryWriter *w, T x)
この関数テンプレートを特殊化することで、ユーザー定義クラスを書きこむことができます。 ...
Definition: BinaryWriter.h:116
bool Write(unsigned int x) noexcept
ストリームにバイナリでunsigned int型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:33
bool Write(long long x) noexcept
ストリームにバイナリでlong long型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:36
bool Write(unsigned char x) noexcept
ストリームにバイナリでunsigned char型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:29
bool WriteArray(BinaryWriter *w, const T *x, size_t n)
この関数テンプレートを特殊化することで、ユーザー定義クラスを書きこむことができます。 ...
Definition: BinaryWriter.h:119
void SetError(errno_t e) noexcept
エラーを設定します。既にエラーが設定されている場合にはエラーは設定されません。
Definition: BinaryWriter.h:87
bool WriteArray(const long long *x, size_t n) noexcept
ストリームにバイナリでlong long型の配列を書き込みます。成功した場合はtrueを返します。nが0の場合も成功...
Definition: BinaryWriter.h:78
bool WriteArray(const long *x, size_t n) noexcept
ストリームにバイナリでlong型の配列を書き込みます。成功した場合はtrueを返します。nが0の場合も成功しま...
Definition: BinaryWriter.h:71
errno_tをラップするクラスです。Visual Studioのデバッガ上での表示を改善します。
Definition: Config.h:474
bool Write(long x) noexcept
ストリームにバイナリでlong型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:34
bool Write(int x) noexcept
ストリームにバイナリでint型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:32
bool Write(short x) noexcept
ストリームにバイナリでshort型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:30
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Config.h:86
開発環境別の設定が書かれるファイルです。
EndianSetting
エンディアンを指定します。
Definition: BinaryWriter.h:15
bool WriteArray(const unsigned long *x, size_t n) noexcept
ストリームにバイナリでunsigned long型の配列を書き込みます。成功した場合はtrueを返します。nが0の場合も...
Definition: BinaryWriter.h:49
bool WriteArray(const int *x, size_t n) noexcept
ストリームにバイナリでint型の配列を書き込みます。成功した場合はtrueを返します。nが0の場合も成功します...
Definition: BinaryWriter.h:68
ストリーム(OutputStream)にバイナリを書き込むクラスです。
Definition: BinaryWriter.h:13
bool Write(signed char x) noexcept
ストリームにバイナリでsigned char型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:28
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
Definition: Config.h:211
bool WriteArray(const signed char *x, size_t n) noexcept
ストリームにバイナリでsigned char型の配列を書き込みます。成功した場合はtrueを返します。nが0の場合も成...
Definition: BinaryWriter.h:59
出力ストリームの基底クラスを定義しています。
bool WriteArray(const char *x, size_t n) noexcept
ストリームにバイナリでchar型の配列を書き込みます。成功した場合はtrueを返します。nが0の場合も成功しま...
Definition: BinaryWriter.h:62
BinaryWriter() noexcept
デフォルトコンストラクタです。
Definition: BinaryWriter.h:18
#define NLIB_NONNULL
全ての引数にNULLを指定することができないことを示します。
Definition: Platform_unix.h:76
bool Write(double x) noexcept
ストリームにバイナリでdouble型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:39
出力ストリームの基底クラスです。このクラスを実体化することはできません。
Definition: OutputStream.h:17
bool Write(unsigned long long x) noexcept
ストリームにバイナリでunsigned long long型のデータを書き込みます。成功した場合はtrueを返します。 ...
Definition: BinaryWriter.h:37
bool WriteArray(const short *x, size_t n) noexcept
ストリームにバイナリでshort型の配列を書き込みます。成功した場合はtrueを返します。nが0の場合も成功しま...
Definition: BinaryWriter.h:65
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:24