こんにちは、高木です。
今回でTcl_Obj型についてはいったん終わりにしようと思います。Tcl_Obj型が導入されたのはバイナリーデータを扱うためと書いたのに、一番最後になってしまいました。
実際には、ほかにもリストやディクショナリーといった型が使えるのですが、ちょっとややこしくなるので、必要になるまで後回しにしようと思います。
あと、これまで忘れていたのですが、Tcl_Obj*からobjクラスを構築するためのコンストラクターが必要ですね。これも今回あわせて作ることにします。
それではコードを見ていきましょう。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
obj(Tcl_Obj* ptr) : obj_(ptr) { Tcl_IncrRefCount(this->obj_); } obj(const std::byte* data, std::size_t n) : obj_(Tcl_NewByteArrayObj(reinterpret_cast<const unsigned char*>(data), static_cast<int>(n))) { Tcl_IncrRefCount(this->obj_); } obj(std::span<const std::byte> data) : obj(data.data(), data.size()) { } std::span<const std::byte> get_byte_array() const { int n; if (auto r = reinterpret_cast<const std::byte*>(Tcl_GetByteArrayFromObj(this->obj_, &n))) { return { r, r + n }; } return {}; } |
今回追加するコンストラクターは3つです。最初は先ほどお話ししたTcl_Obj*からの変換コンストラクターです。次の2つがバイナリーデータを扱うためのコンストラクターです。2番目はstd::byte型の配列から、3番目はstd::byte型のspanからobjクラスのオブジェクトを構築します。
あとは、objクラスのオブジェクトからバイナリーデータを取り出すget_byte_arrayメンバー関数です。
前述したように、Tcl_Obj型はほかにもリストやディクショナリーを扱うこともできます。これについては、必要になった時点であらためてお話しすることにします。
次回はTcl_Interp型のラッパークラスについて考えていきたいと思います。