lib/gogyou.rb in gogyou-0.2.2 vs lib/gogyou.rb in gogyou-0.2.3
- old
+ new
@@ -22,53 +22,48 @@
#
# gogyou は構造体や共用体、多次元配列 (もどき) を扱うためのライブラリです。
#
# 原始的な型情報は Gogyou::Primitives で定義してあり、struct や union メソッド内で利用できる型を次の表に示します:
#
-# 符号あり 符号なし
-# ---- ----
-# 8ビット整数型 char uchar
-# unsigned_char
-# 16ビット整数型 short ushort
-# unsigned_short
-# 32ビット整数型 int uint
-# unsigned_int
-# 環境依存32/64ビット整数型 long ulong
-# unsigned_long
-# 64ビット整数型 longlong ulonglong
-# long_long unsigned_long_long
-# 32ビット浮動少数型 float
-# 64ビット浮動少数型 double
-# sizeof 表現型 ssize_t size_t
-# ポインタ整数型 intptr_t uintptr_t
+# ==== C 標準型
+# 符号あり 符号なし
+# ---- ----
+# char 型 char uchar
+# unsigned_char
+# short 型 short ushort
+# unsigned_short
+# int 型 int uint
+# unsigned_int
+# long 型 long ulong
+# unsigned_long
+# long long 型 longlong ulonglong
+# long_long unsigned_long_long
+# sizeof 型 ssize_t size_t
+# ポインタ整数型 intptr_t uintptr_t
#
-# *** ビット数環境非依存 ***
+# バイトオーダー環境依存 バイトオーダー反転
+# 符号あり 符号なし 符号あり 符号なし
+# ---- ---- ---- ----
+# 8ビット整数型 int8_t uint8_t N/A N/A
+# 16ビット整数型 int16_t uint16_t int16_swap uint16_swap
+# 32ビット整数型 int32_t uint32_t int32_swap uint32_swap
+# 64ビット整数型 int64_t uint64_t int64_swap uint64_swap
+# 32ビット浮動小数点数型 float N/A float_swap N/A
+# 64ビット浮動小数点数型 double N/A double_swap N/A
#
-# バイトオーダー環境依存 バイトオーダー反転
-# 符号あり 符号なし 符号あり 符号なし
-# ---- ---- ---- ----
-# 8ビット整数型 int8_t uint8_t // //
-# 16ビット整数型 int16_t uint16_t int16_swap uint16_swap
-# 24ビット整数型 int24_t uint24_t int24_swap uint24_swap
-# 32ビット整数型 int32_t uint32_t int32_swap uint32_swap
-# 48ビット整数型 int48_t uint48_t int48_swap uint48_swap
-# 64ビット整数型 int64_t uint64_t int64_swap uint64_swap
+# ビッグエンディアン リトルエンディアン
+# 符号あり 符号なし 符号あり 符号なし
+# ---- ---- ---- ----
+# 16ビット整数型 int16_be uint16_be int16_le uint16_le
+# 24ビット整数型 int24_be uint24_be int24_le uint24_le
+# 32ビット整数型 int32_be uint32_be int32_le uint32_le
+# 48ビット整数型 int48_be uint48_be int48_le uint48_le
+# 64ビット整数型 int64_be uint64_be int64_le uint64_le
+# 32ビット浮動小数点数型 float_be N/A float_le N/A
+# 64ビット浮動小数点数型 double_be N/A double_le N/A
#
-# ビッグエンディアン リトルエンディアン
-# 符号あり 符号なし 符号あり 符号なし
-# ---- ---- ---- ----
-# 16ビット整数型 int16_be uint16_be int16_le uint16_le
-# 24ビット整数型 int24_be uint24_be int24_le uint24_le
-# 32ビット整数型 int32_be uint32_be int32_le uint32_le
-# 48ビット整数型 int48_be uint48_be int48_le uint48_le
-# 64ビット整数型 int64_be uint64_be int64_le uint64_le
#
-# ビッグエンディアン リトルエンディアン バイトオーダー反転
-# 32ビット浮動少数型 float_be float_le float_swap
-# 64ビット浮動少数型 double_be double_le double_swap
-#
-#
# ==== 利用者定義の型情報
#
# 型情報を利用者が定義して利用することが出来ます。
#
# 型情報オブジェクトは、次のメソッドを必要とします:
@@ -139,16 +134,69 @@
# * #\<field> / #\<field>= - 構造体・共用体のフィールドへの参照・代入メソッド。配列の場合は定義されない。
# * #[] / []= - 配列の要素への参照・代入メソッド。構造体・共用体の場合は定義されない。
#
module Gogyou
Gogyou = self
- VERSION = Gem::Version.new("0.2.2")
+ require_relative "gogyou/version"
require_relative "gogyou/typespec"
require_relative "gogyou/mixin"
require_relative "gogyou/model"
require_relative "gogyou/primitives"
require_relative "gogyou/accessor"
+
+ class Model
+ TYPEMAP = {}
+
+ Gogyou::Primitives.constants.each do |n|
+ prim = Gogyou::Primitives.const_get(n)
+ next unless prim.kind_of?(Gogyou::Primitives::Primitive)
+ TYPEMAP[prim.name.to_sym] = prim
+ end
+
+ TYPEMAP[:unsigned_char] = TYPEMAP[:uchar]
+ TYPEMAP[:unsigned_short] = TYPEMAP[:ushort]
+ TYPEMAP[:unsigned_int] = TYPEMAP[:uint]
+ TYPEMAP[:unsigned_long] = TYPEMAP[:ulong]
+ TYPEMAP[:unsigned_long_long] = TYPEMAP[:ulonglong]
+ TYPEMAP[:long_long] = TYPEMAP[:longlong]
+ end
+
+ class Struct < Accessor::Struct
+ def self.struct(&block)
+ raise TypeError, "already defined struct" if const_defined?(:MODEL)
+
+ # TODO: Accessor.define からコピペ。統一するべき。
+ model = Model.struct(Model::TYPEMAP.dup, &block)
+ const_set(:MODEL, model)
+ const_set(:BYTESIZE, model.bytesize)
+ const_set(:BYTEALIGN, model.bytealign)
+ const_set(:EXTENSIBLE, model.extensible?)
+ define_accessors(self, model)
+
+ nil
+ end
+
+ private_class_method :struct
+ end
+
+ class Union < Accessor::Union
+ def self.union(&block)
+ raise TypeError, "already defined union" if const_defined?(:MODEL)
+
+ # TODO: Accessor.define からコピペ。統一するべき。
+ model = Model.union(Model::TYPEMAP.dup, &block)
+ const_set(:MODEL, model)
+ const_set(:BYTESIZE, model.bytesize)
+ const_set(:BYTEALIGN, model.bytealign)
+ const_set(:EXTENSIBLE, model.extensible?)
+ define_accessors(self, model)
+
+ nil
+ end
+
+ private_class_method :union
+ end
#
# call-seq:
# struct { ... } -> accessor class
#