sgc-ruby-cuda 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.yardopts +2 -0
- data/COPYING +674 -0
- data/README.rdoc +106 -0
- data/Rakefile +76 -0
- data/doc/devel.rdoc +77 -0
- data/doc/features.rdoc +55 -0
- data/lib/cuda/driver/context.rb +236 -0
- data/lib/cuda/driver/cu.rb +60 -0
- data/lib/cuda/driver/device.rb +155 -0
- data/lib/cuda/driver/deviceptr.rb +69 -0
- data/lib/cuda/driver/error.rb +182 -0
- data/lib/cuda/driver/event.rb +124 -0
- data/lib/cuda/driver/ffi-cu.rb +620 -0
- data/lib/cuda/driver/function.rb +293 -0
- data/lib/cuda/driver/init.rb +45 -0
- data/lib/cuda/driver/memory.rb +134 -0
- data/lib/cuda/driver/module.rb +142 -0
- data/lib/cuda/driver/rubycu.rb +37 -0
- data/lib/cuda/driver/stream.rb +128 -0
- data/lib/cuda/driver/version.rb +42 -0
- data/lib/cuda/runtime/cuda.rb +65 -0
- data/lib/cuda/runtime/device.rb +175 -0
- data/lib/cuda/runtime/error.rb +197 -0
- data/lib/cuda/runtime/event.rb +117 -0
- data/lib/cuda/runtime/ffi-cuda.rb +588 -0
- data/lib/cuda/runtime/function.rb +161 -0
- data/lib/cuda/runtime/memory.rb +110 -0
- data/lib/cuda/runtime/rubycuda.rb +34 -0
- data/lib/cuda/runtime/stream.rb +126 -0
- data/lib/cuda/runtime/thread.rb +81 -0
- data/lib/cuda/runtime/version.rb +51 -0
- data/lib/ffi/prettystruct.rb +32 -0
- data/lib/helpers/flags.rb +82 -0
- data/lib/helpers/interface/ienum.rb +45 -0
- data/lib/helpers/klass.rb +45 -0
- data/lib/memory/buffer.rb +125 -0
- data/lib/memory/interface/ibuffer.rb +63 -0
- data/lib/memory/pointer.rb +72 -0
- data/lib/rubycu.rb +1 -0
- data/lib/rubycuda.rb +1 -0
- data/test/bad.ptx +0 -0
- data/test/memory/test_buffer.rb +93 -0
- data/test/rubycu/test_cucontext.rb +148 -0
- data/test/rubycu/test_cudevice.rb +69 -0
- data/test/rubycu/test_cudeviceptr.rb +43 -0
- data/test/rubycu/test_cuevent.rb +81 -0
- data/test/rubycu/test_cufunction.rb +165 -0
- data/test/rubycu/test_cumemory.rb +113 -0
- data/test/rubycu/test_cumodule.rb +114 -0
- data/test/rubycu/test_custream.rb +77 -0
- data/test/rubycu/test_cuversion.rb +39 -0
- data/test/rubycu/testbase.rb +107 -0
- data/test/rubycuda/test_cudadevice.rb +125 -0
- data/test/rubycuda/test_cudaerror.rb +48 -0
- data/test/rubycuda/test_cudaevent.rb +78 -0
- data/test/rubycuda/test_cudafunction.rb +106 -0
- data/test/rubycuda/test_cudamemory.rb +90 -0
- data/test/rubycuda/test_cudastream.rb +72 -0
- data/test/rubycuda/test_cudathread.rb +69 -0
- data/test/rubycuda/test_cudaversion.rb +41 -0
- data/test/rubycuda/testbase.rb +67 -0
- data/test/vadd.cu +21 -0
- data/version.rb +1 -0
- metadata +180 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2010-2011 Chung Shin Yee
|
3
|
+
#
|
4
|
+
# shinyee@speedgocomputing.com
|
5
|
+
# http://www.speedgocomputing.com
|
6
|
+
# http://github.com/xman/sgc-ruby-cuda
|
7
|
+
# http://rubyforge.org/projects/rubycuda
|
8
|
+
#
|
9
|
+
# This file is part of SGC-Ruby-CUDA.
|
10
|
+
#
|
11
|
+
# SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
|
12
|
+
# it under the terms of the GNU General Public License as published by
|
13
|
+
# the Free Software Foundation, either version 3 of the License, or
|
14
|
+
# (at your option) any later version.
|
15
|
+
#
|
16
|
+
# SGC-Ruby-CUDA is distributed in the hope that it will be useful,
|
17
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
+
# GNU General Public License for more details.
|
20
|
+
#
|
21
|
+
# You should have received a copy of the GNU General Public License
|
22
|
+
# along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
|
23
|
+
#
|
24
|
+
|
25
|
+
require 'cuda/runtime/ffi-cuda'
|
26
|
+
|
27
|
+
|
28
|
+
module SGC
|
29
|
+
module Cuda
|
30
|
+
|
31
|
+
# @return [Integer] The CUDA driver version.
|
32
|
+
def driver_version
|
33
|
+
p = FFI::MemoryPointer.new(:int)
|
34
|
+
status = API::cudaDriverGetVersion(p)
|
35
|
+
Pvt::handle_error(status, "Failed to query the CUDA driver version.")
|
36
|
+
p.read_int
|
37
|
+
end
|
38
|
+
module_function :driver_version
|
39
|
+
|
40
|
+
|
41
|
+
# @return [Integer] The CUDA Runtime version.
|
42
|
+
def runtime_version
|
43
|
+
p = FFI::MemoryPointer.new(:int)
|
44
|
+
status = API::cudaRuntimeGetVersion(p)
|
45
|
+
Pvt::handle_error(status, "Failed to query the CUDA Runtime version.")
|
46
|
+
p.read_int
|
47
|
+
end
|
48
|
+
module_function :runtime_version
|
49
|
+
|
50
|
+
end # module
|
51
|
+
end # module
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
|
4
|
+
module FFI
|
5
|
+
|
6
|
+
# This class is obtained from ffi-tk (https://github.com/Tass/ffi-tk).
|
7
|
+
class PrettyStruct < FFI::Struct
|
8
|
+
ACCESSOR_CODE = <<-CODE
|
9
|
+
def {name}; self[{sym}]; end
|
10
|
+
def {name}=(value) self[{sym}] = value; end
|
11
|
+
CODE
|
12
|
+
|
13
|
+
def self.layout(*kvs)
|
14
|
+
kvs.each_slice(2) do |key, value|
|
15
|
+
eval ACCESSOR_CODE.gsub(/\{(.*?)\}/, '{name}' => key, '{sym}' => ":#{key}")
|
16
|
+
end
|
17
|
+
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def members
|
22
|
+
layout.members
|
23
|
+
end
|
24
|
+
|
25
|
+
def inspect
|
26
|
+
kvs = members.zip(values)
|
27
|
+
kvs.map!{|key, value| "%s=%s" % [key, value.inspect] }
|
28
|
+
"<%s %s>" % [self.class, kvs.join(' ')]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end # module
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2011 Chung Shin Yee
|
3
|
+
#
|
4
|
+
# shinyee@speedgocomputing.com
|
5
|
+
# http://www.speedgocomputing.com
|
6
|
+
# http://github.com/xman/sgc-ruby-cuda
|
7
|
+
# http://rubyforge.org/projects/rubycuda
|
8
|
+
#
|
9
|
+
# This file is part of SGC-Ruby-CUDA.
|
10
|
+
#
|
11
|
+
# SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
|
12
|
+
# it under the terms of the GNU General Public License as published by
|
13
|
+
# the Free Software Foundation, either version 3 of the License, or
|
14
|
+
# (at your option) any later version.
|
15
|
+
#
|
16
|
+
# SGC-Ruby-CUDA is distributed in the hope that it will be useful,
|
17
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
+
# GNU General Public License for more details.
|
20
|
+
#
|
21
|
+
# You should have received a copy of the GNU General Public License
|
22
|
+
# along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
|
23
|
+
#
|
24
|
+
|
25
|
+
module SGC
|
26
|
+
module Helper
|
27
|
+
|
28
|
+
# Provide methods for evaluating the composite value of flags.
|
29
|
+
# _self_ which _include/extend_ this module should implement {IEnum} interface.
|
30
|
+
module FlagsValue
|
31
|
+
|
32
|
+
# @param [Symbol, Integer, Array<Symbol, Integer>] *flags The list of flags to include in the returning value.
|
33
|
+
# @raise [ArgumentError] Invalid symbol or value.
|
34
|
+
# @return [Integer] The composite value of the _flags_ with respect to _self_.
|
35
|
+
#
|
36
|
+
# @example Compute the composite value of flags with multiple symbols and integers.
|
37
|
+
# CUEventFlags.symbols #=> [:DEFAULT, :BLOCKING_SYNC, :DISABLE_TIMING]
|
38
|
+
# CUEventFlags[:DEFAULT] #=> 0
|
39
|
+
# CUEventFlags[0] #=> :DEFAULT
|
40
|
+
# CUEventFlags[:BLOCKING_SYNC] #=> 1
|
41
|
+
# CUEventFlags[1] #=> :BLOCKING_SYNC
|
42
|
+
# CUEventFlags.value(:DISABLE_TIMING) #=> 2
|
43
|
+
# CUEventFlags.value(:BLOCKING_SYNC, :DISABLE_TIMING) #=> 3
|
44
|
+
# CUEventFlags.value([:BLOCKING_SYNC, :DISABLE_TIMING]) #=> 3
|
45
|
+
# CUEventFlags.value([1, :DISABLE_TIMING]) #=> 3
|
46
|
+
def value(*flags)
|
47
|
+
flags.empty? == false or raise ArgumentError, "No flags is provided. Expect Array<Symbol, Integer>, Symbol or Integer."
|
48
|
+
|
49
|
+
f = 0
|
50
|
+
flags.flatten.each do |x|
|
51
|
+
case x
|
52
|
+
when Symbol
|
53
|
+
v = self[x] or Pvt::raise_invalid_symbol(x)
|
54
|
+
f |= v
|
55
|
+
when Integer
|
56
|
+
self[x] or Pvt::raise_invalid_value(x)
|
57
|
+
f |= x
|
58
|
+
else
|
59
|
+
raise ArgumentError, "Invalid flags: #{x.to_s}. Expect Symbol or Integer in the flags array."
|
60
|
+
end
|
61
|
+
end
|
62
|
+
f
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
module Pvt
|
67
|
+
|
68
|
+
def raise_invalid_symbol(symbol)
|
69
|
+
raise ArgumentError, "Invalid flags symbol: #{symbol.to_s}. Expect symbol in #{self.symbols.to_s}."
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def raise_invalid_value(value)
|
74
|
+
raise ArgumentError, "Invalid flags value: #{value.to_s}."
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end # module
|
82
|
+
end # module
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2011 Chung Shin Yee
|
3
|
+
#
|
4
|
+
# shinyee@speedgocomputing.com
|
5
|
+
# http://www.speedgocomputing.com
|
6
|
+
# http://github.com/xman/sgc-ruby-cuda
|
7
|
+
# http://rubyforge.org/projects/rubycuda
|
8
|
+
#
|
9
|
+
# This file is part of SGC-Ruby-CUDA.
|
10
|
+
#
|
11
|
+
# SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
|
12
|
+
# it under the terms of the GNU General Public License as published by
|
13
|
+
# the Free Software Foundation, either version 3 of the License, or
|
14
|
+
# (at your option) any later version.
|
15
|
+
#
|
16
|
+
# SGC-Ruby-CUDA is distributed in the hope that it will be useful,
|
17
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
+
# GNU General Public License for more details.
|
20
|
+
#
|
21
|
+
# You should have received a copy of the GNU General Public License
|
22
|
+
# along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
|
23
|
+
#
|
24
|
+
|
25
|
+
module SGC
|
26
|
+
module Helper
|
27
|
+
|
28
|
+
# @abstract An Enum interface.
|
29
|
+
# An enum maps a symbol to a value, and a value to a symbol.
|
30
|
+
module IEnum
|
31
|
+
|
32
|
+
# @return [Array] The list of valid symbols of this enum.
|
33
|
+
def symbols; raise NotImplementedError; end
|
34
|
+
|
35
|
+
# @param [Symbol, Object] key A symbol or value to use as a key to map.
|
36
|
+
# @return [Symbol, Object] The symbol or value that the _key_ maps to.
|
37
|
+
# * If the _key_ is a symbol, return the corresponding value.
|
38
|
+
# * If the _key_ is a value, return the corresponding symbol.
|
39
|
+
# * Return nil if the _key_ is invalid.
|
40
|
+
def [](key); raise NotImplementedError; end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end # module
|
45
|
+
end # module
|
@@ -0,0 +1,45 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2011 Chung Shin Yee
|
3
|
+
#
|
4
|
+
# shinyee@speedgocomputing.com
|
5
|
+
# http://www.speedgocomputing.com
|
6
|
+
# http://github.com/xman/sgc-ruby-cuda
|
7
|
+
# http://rubyforge.org/projects/rubycuda
|
8
|
+
#
|
9
|
+
# This file is part of SGC-Ruby-CUDA.
|
10
|
+
#
|
11
|
+
# SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
|
12
|
+
# it under the terms of the GNU General Public License as published by
|
13
|
+
# the Free Software Foundation, either version 3 of the License, or
|
14
|
+
# (at your option) any later version.
|
15
|
+
#
|
16
|
+
# SGC-Ruby-CUDA is distributed in the hope that it will be useful,
|
17
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
+
# GNU General Public License for more details.
|
20
|
+
#
|
21
|
+
# You should have received a copy of the GNU General Public License
|
22
|
+
# along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
|
23
|
+
#
|
24
|
+
|
25
|
+
module SGC
|
26
|
+
module Helper
|
27
|
+
|
28
|
+
# @param [Class] klass The name of the class to obtain.
|
29
|
+
# @return [String] The class name of the class without module string.
|
30
|
+
#
|
31
|
+
# @example Obtain the class name of the class.
|
32
|
+
# module A
|
33
|
+
# module B
|
34
|
+
# class C
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
# classname(A::B::C) #=> "C"
|
39
|
+
def classname(klass)
|
40
|
+
klass.name.gsub(/.*\:\:/, "")
|
41
|
+
end
|
42
|
+
module_function :classname
|
43
|
+
|
44
|
+
end # module
|
45
|
+
end # module
|
@@ -0,0 +1,125 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2010-2011 Chung Shin Yee
|
3
|
+
#
|
4
|
+
# shinyee@speedgocomputing.com
|
5
|
+
# http://www.speedgocomputing.com
|
6
|
+
# http://github.com/xman/sgc-ruby-cuda
|
7
|
+
# http://rubyforge.org/projects/rubycuda
|
8
|
+
#
|
9
|
+
# This file is part of SGC-Ruby-CUDA.
|
10
|
+
#
|
11
|
+
# SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
|
12
|
+
# it under the terms of the GNU General Public License as published by
|
13
|
+
# the Free Software Foundation, either version 3 of the License, or
|
14
|
+
# (at your option) any later version.
|
15
|
+
#
|
16
|
+
# SGC-Ruby-CUDA is distributed in the hope that it will be useful,
|
17
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
+
# GNU General Public License for more details.
|
20
|
+
#
|
21
|
+
# You should have received a copy of the GNU General Public License
|
22
|
+
# along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
|
23
|
+
#
|
24
|
+
|
25
|
+
require 'ffi'
|
26
|
+
|
27
|
+
require 'memory/interface/ibuffer'
|
28
|
+
require 'memory/pointer'
|
29
|
+
|
30
|
+
|
31
|
+
module SGC
|
32
|
+
module Memory
|
33
|
+
|
34
|
+
# A memory buffer class which implements {IBuffer} interface.
|
35
|
+
# @see IBuffer
|
36
|
+
# @see IBuffer::ClassMethods
|
37
|
+
class Buffer
|
38
|
+
|
39
|
+
include IBuffer
|
40
|
+
|
41
|
+
|
42
|
+
# @param [Symbol] type A symbol corresponds to a supported C data type, e.g. :int, :long, :float.
|
43
|
+
# @param [Integer] size The number of elements.
|
44
|
+
# @return A buffer with _size_ elements of _type_.
|
45
|
+
def initialize(type, size)
|
46
|
+
@@reads[type] && @@writes[type] or raise "Invalid buffer element type."
|
47
|
+
|
48
|
+
@reader = @@reads[type]
|
49
|
+
@writer = @@writes[type]
|
50
|
+
@ptr = FFI::MemoryPointer.new(type, size)
|
51
|
+
@size = size
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
# @param [Integer] index The index (0..size-1) of the element to return.
|
56
|
+
# @return The element at _index_ of this buffer.
|
57
|
+
def [](index)
|
58
|
+
assert_index(index)
|
59
|
+
@ptr[index].send(@reader)
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
# Set the element at _index_ of this buffer to _value_.
|
64
|
+
# @param [Integer] index The index (0..size-1) of the element to set.
|
65
|
+
# @param [Object] value The value to set to.
|
66
|
+
# @return _value_.
|
67
|
+
def []=(index, value)
|
68
|
+
assert_index(index)
|
69
|
+
@ptr[index].send(@writer, value)
|
70
|
+
value
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# @return [Integer] The number of elements in this buffer.
|
75
|
+
def size
|
76
|
+
@size
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
# @return [Integer] The size of an element in this buffer in bytes.
|
81
|
+
def element_size
|
82
|
+
@ptr.type_size
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
# @private
|
87
|
+
def ptr
|
88
|
+
@ptr
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
# @private
|
93
|
+
def to_api
|
94
|
+
@ptr
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
# @param [Integer] index The index to an element in this buffer.
|
99
|
+
# @return [MemoryPointer] A memory pointer pointing to the _index_ element.
|
100
|
+
def offset(index)
|
101
|
+
assert_index(index)
|
102
|
+
MemoryPointer.new(@ptr[index])
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
# @param [Symbol] type A symbol corresponds to a supported C data type, e.g. :int, :long, :float.
|
107
|
+
# @return [Integer] The size of an element of _type_.
|
108
|
+
def self.element_size(type)
|
109
|
+
@@sizes[type]
|
110
|
+
end
|
111
|
+
|
112
|
+
protected
|
113
|
+
|
114
|
+
def assert_index(i)
|
115
|
+
i >= 0 && i < @size or raise IndexError, "Invalid index to buffer: index = #{i}. Expect index in 0..#{@size-1}"
|
116
|
+
end
|
117
|
+
|
118
|
+
@@reads = { int: :read_int, long: :read_long, float: :read_float } # @private
|
119
|
+
@@writes = { int: :write_int, long: :write_long, float: :write_float } # @private
|
120
|
+
@@sizes = { int: 4, long: FFI::TypeDefs[:long].size, float: 4 } # @private
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
end # module
|
125
|
+
end # module
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2010-2011 Chung Shin Yee
|
3
|
+
#
|
4
|
+
# shinyee@speedgocomputing.com
|
5
|
+
# http://www.speedgocomputing.com
|
6
|
+
# http://github.com/xman/sgc-ruby-cuda
|
7
|
+
# http://rubyforge.org/projects/rubycuda
|
8
|
+
#
|
9
|
+
# This file is part of SGC-Ruby-CUDA.
|
10
|
+
#
|
11
|
+
# SGC-Ruby-CUDA is free software: you can redistribute it and/or modify
|
12
|
+
# it under the terms of the GNU General Public License as published by
|
13
|
+
# the Free Software Foundation, either version 3 of the License, or
|
14
|
+
# (at your option) any later version.
|
15
|
+
#
|
16
|
+
# SGC-Ruby-CUDA is distributed in the hope that it will be useful,
|
17
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
+
# GNU General Public License for more details.
|
20
|
+
#
|
21
|
+
# You should have received a copy of the GNU General Public License
|
22
|
+
# along with SGC-Ruby-CUDA. If not, see <http://www.gnu.org/licenses/>.
|
23
|
+
#
|
24
|
+
|
25
|
+
module SGC
|
26
|
+
module Memory
|
27
|
+
|
28
|
+
# @abstract A memory buffer interface.
|
29
|
+
# A buffer stores elements of the same C data type.
|
30
|
+
module IBuffer
|
31
|
+
|
32
|
+
# @param [Integer] index The index (0..size-1) of the element to return.
|
33
|
+
# @return The element at _index_ of this buffer.
|
34
|
+
def [](index); raise NotImplementedError; end
|
35
|
+
|
36
|
+
# Set the element at _index_ of this buffer to _value_.
|
37
|
+
# @param [Integer] index The index (0..size-1) of the element to set.
|
38
|
+
# @param [Object] value The value to set to.
|
39
|
+
# @return _value_.
|
40
|
+
def []=(index, value); raise NotImplementedError; end
|
41
|
+
|
42
|
+
# @return [Integer] The number of elements in this buffer.
|
43
|
+
def size; raise NotImplementedError; end
|
44
|
+
|
45
|
+
# @return [Integer] The size of an element in this buffer in bytes.
|
46
|
+
def element_size; raise NotImplementedError; end
|
47
|
+
|
48
|
+
# A set of methods automatically extended by the classes which _include_ _IBuffer_.
|
49
|
+
module ClassMethods
|
50
|
+
# @param [Symbol] type A symbol corresponds to a supported C data type, e.g. :int, :long, :float.
|
51
|
+
# @return [Integer] The size of an element of _type_.
|
52
|
+
def element_size(type); raise NotImplementedError; end
|
53
|
+
end
|
54
|
+
|
55
|
+
# @private
|
56
|
+
def self.included(base)
|
57
|
+
base.extend(ClassMethods)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end # module
|
63
|
+
end # module
|