From a450e9ddeb9d3458f37fad7c3d4243da582299de Mon Sep 17 00:00:00 2001 From: jj Date: Thu, 19 Apr 2012 19:35:55 +0200 Subject: [PATCH] ruby: fix vectors, add bitvector --- plugins/ruby/ruby-memstruct.rb | 58 ++++++++++++++++-------- plugins/ruby/ruby.cpp | 80 +++++++++++++++++++++------------- plugins/ruby/ruby.rb | 5 +++ 3 files changed, 94 insertions(+), 49 deletions(-) diff --git a/plugins/ruby/ruby-memstruct.rb b/plugins/ruby/ruby-memstruct.rb index 71d9f333e..465e9975e 100644 --- a/plugins/ruby/ruby-memstruct.rb +++ b/plugins/ruby/ruby-memstruct.rb @@ -39,7 +39,6 @@ class Compound < MemStruct def stl_vector(tglen=nil) tg = yield if tglen - tg = tg._tg if tg.kind_of?(Pointer) # Vector.at(4) already dereferences case tglen when 1; StlVector8.new(tg) when 2; StlVector16.new(tg) @@ -230,9 +229,9 @@ class StlVector32 < MemStruct def length DFHack.memory_vector32_length(@_memaddr) end - alias size length - def value_at(idx) - DFHack.memory_vector32_at(@_memaddr, idx) + def size ; length ; end # alias wouldnt work for subclasses + def valueptr_at(idx) + DFHack.memory_vector32_ptrat(@_memaddr, idx) end def insert_at(idx, val) DFHack.memory_vector32_insert(@_memaddr, idx, val) @@ -251,22 +250,22 @@ class StlVector32 < MemStruct end def [](idx) idx += length if idx < 0 - @_tg._at(value_at(idx)) if idx >= 0 and idx < length + @_tg._at(valueptr_at(idx))._get if idx >= 0 and idx < length end def []=(idx, v) idx += length if idx < 0 if idx >= length - insert_at(idx, v) + insert_at(idx, 0) elsif idx < 0 raise 'invalid idx' - else - set_value_at(idx, v) end + @_tg._at(valueptr_at(idx))._set(v) end - def <<(v) - insert_at(length, v) + def push(v) + self[length] = v self end + def <<(v) ; push(v) ; end def pop l = length if l > 0 @@ -282,9 +281,8 @@ class StlVector16 < StlVector32 def length DFHack.memory_vector16_length(@_memaddr) end - alias size length - def value_at(idx) - DFHack.memory_vector16_at(@_memaddr, idx) + def valueptr_at(idx) + DFHack.memory_vector16_ptrat(@_memaddr, idx) end def insert_at(idx, val) DFHack.memory_vector16_insert(@_memaddr, idx, val) @@ -297,9 +295,8 @@ class StlVector8 < StlVector32 def length DFHack.memory_vector8_length(@_memaddr) end - alias size length - def value_at(idx) - DFHack.memory_vector8_at(@_memaddr, idx) + def valueptr_at(idx) + DFHack.memory_vector8_ptrat(@_memaddr, idx) end def insert_at(idx, val) DFHack.memory_vector8_insert(@_memaddr, idx, val) @@ -308,6 +305,32 @@ class StlVector8 < StlVector32 DFHack.memory_vector8_delete(@_memaddr, idx) end end +class StlBitVector < StlVector32 + def initialize ; end + def length + DFHack.memory_vectorbool_length(@_memaddr) + end + def insert_at(idx, val) + DFHack.memory_vectorbool_insert(@_memaddr, idx, val) + end + def delete_at(idx) + DFHack.memory_vectorbool_delete(@_memaddr, idx) + end + def [](idx) + idx += length if idx < 0 + DFHack.memory_vectorbool_at(@_memaddr, idx) if idx >= 0 and idx < length + end + def []=(idx, v) + idx += length if idx < 0 + if idx >= length + insert_at(idx, v) + elsif idx < 0 + raise 'invalid idx' + else + DFHack.memory_vectorbool_setat(@_memaddr, idx, v) + end + end +end class StlString < MemStruct def _get DFHack.memory_read_stlstring(@_memaddr) @@ -317,9 +340,6 @@ class StlString < MemStruct DFHack.memory_write_stlstring(@_memaddr, v) end end -class StlBitVector < MemStruct - # TODO -end class StlDeque < MemStruct attr_accessor :_tglen, :_tg def initialize(tglen, tg) diff --git a/plugins/ruby/ruby.cpp b/plugins/ruby/ruby.cpp index 1e51c1102..0e28087de 100644 --- a/plugins/ruby/ruby.cpp +++ b/plugins/ruby/ruby.cpp @@ -504,16 +504,10 @@ static VALUE rb_dfmemory_vec8_length(VALUE self, VALUE addr) std::vector *v = (std::vector*)rb_num2ulong(addr); return rb_uint2inum(v->size()); } -static VALUE rb_dfmemory_vec8_at(VALUE self, VALUE addr, VALUE idx) +static VALUE rb_dfmemory_vec8_ptrat(VALUE self, VALUE addr, VALUE idx) { std::vector *v = (std::vector*)rb_num2ulong(addr); - return rb_uint2inum(v->at(FIX2INT(idx))); -} -static VALUE rb_dfmemory_vec8_set(VALUE self, VALUE addr, VALUE idx, VALUE val) -{ - std::vector *v = (std::vector*)rb_num2ulong(addr); - v->at(FIX2INT(idx)) = rb_num2ulong(val); - return Qtrue; + return rb_uint2inum((uint32_t)&v->at(FIX2INT(idx))); } static VALUE rb_dfmemory_vec8_insert(VALUE self, VALUE addr, VALUE idx, VALUE val) { @@ -534,16 +528,10 @@ static VALUE rb_dfmemory_vec16_length(VALUE self, VALUE addr) std::vector *v = (std::vector*)rb_num2ulong(addr); return rb_uint2inum(v->size()); } -static VALUE rb_dfmemory_vec16_at(VALUE self, VALUE addr, VALUE idx) +static VALUE rb_dfmemory_vec16_ptrat(VALUE self, VALUE addr, VALUE idx) { std::vector *v = (std::vector*)rb_num2ulong(addr); - return rb_uint2inum(v->at(FIX2INT(idx))); -} -static VALUE rb_dfmemory_vec16_set(VALUE self, VALUE addr, VALUE idx, VALUE val) -{ - std::vector *v = (std::vector*)rb_num2ulong(addr); - v->at(FIX2INT(idx)) = rb_num2ulong(val); - return Qtrue; + return rb_uint2inum((uint32_t)&v->at(FIX2INT(idx))); } static VALUE rb_dfmemory_vec16_insert(VALUE self, VALUE addr, VALUE idx, VALUE val) { @@ -564,16 +552,10 @@ static VALUE rb_dfmemory_vec32_length(VALUE self, VALUE addr) std::vector *v = (std::vector*)rb_num2ulong(addr); return rb_uint2inum(v->size()); } -static VALUE rb_dfmemory_vec32_at(VALUE self, VALUE addr, VALUE idx) +static VALUE rb_dfmemory_vec32_ptrat(VALUE self, VALUE addr, VALUE idx) { std::vector *v = (std::vector*)rb_num2ulong(addr); - return rb_uint2inum(v->at(FIX2INT(idx))); -} -static VALUE rb_dfmemory_vec32_set(VALUE self, VALUE addr, VALUE idx, VALUE val) -{ - std::vector *v = (std::vector*)rb_num2ulong(addr); - v->at(FIX2INT(idx)) = rb_num2ulong(val); - return Qtrue; + return rb_uint2inum((uint32_t)&v->at(FIX2INT(idx))); } static VALUE rb_dfmemory_vec32_insert(VALUE self, VALUE addr, VALUE idx, VALUE val) { @@ -588,6 +570,42 @@ static VALUE rb_dfmemory_vec32_delete(VALUE self, VALUE addr, VALUE idx) return Qtrue; } +// vector +static VALUE rb_dfmemory_vecbool_length(VALUE self, VALUE addr) +{ + std::vector *v = (std::vector*)rb_num2ulong(addr); + return rb_uint2inum(v->size()); +} +static VALUE rb_dfmemory_vecbool_at(VALUE self, VALUE addr, VALUE idx) +{ + std::vector *v = (std::vector*)rb_num2ulong(addr); + return v->at(FIX2INT(idx)) ? Qtrue : Qfalse; +} +static VALUE rb_dfmemory_vecbool_setat(VALUE self, VALUE addr, VALUE idx, VALUE val) +{ + std::vector *v = (std::vector*)rb_num2ulong(addr); + if (val == Qnil || val == Qfalse || val == FIX2INT(0)) + v->at(FIX2INT(idx)) = 0; + else + v->at(FIX2INT(idx)) = 1; + return Qtrue; +} +static VALUE rb_dfmemory_vecbool_insert(VALUE self, VALUE addr, VALUE idx, VALUE val) +{ + std::vector *v = (std::vector*)rb_num2ulong(addr); + if (val == Qnil || val == Qfalse || val == FIX2INT(0)) + v->insert(v->begin()+FIX2INT(idx), 0); + else + v->insert(v->begin()+FIX2INT(idx), 1); + return Qtrue; +} +static VALUE rb_dfmemory_vecbool_delete(VALUE self, VALUE addr, VALUE idx) +{ + std::vector *v = (std::vector*)rb_num2ulong(addr); + v->erase(v->begin()+FIX2INT(idx)); + return Qtrue; +} + // define module DFHack and its methods @@ -625,20 +643,22 @@ static void ruby_bind_dfhack(void) { rb_define_singleton_method(rb_cDFHack, "memory_write_float", RUBY_METHOD_FUNC(rb_dfmemory_write_float), 2); rb_define_singleton_method(rb_cDFHack, "memory_vector8_length", RUBY_METHOD_FUNC(rb_dfmemory_vec8_length), 1); - rb_define_singleton_method(rb_cDFHack, "memory_vector8_at", RUBY_METHOD_FUNC(rb_dfmemory_vec8_at), 2); - rb_define_singleton_method(rb_cDFHack, "memory_vector8_set", RUBY_METHOD_FUNC(rb_dfmemory_vec8_set), 3); + rb_define_singleton_method(rb_cDFHack, "memory_vector8_ptrat", RUBY_METHOD_FUNC(rb_dfmemory_vec8_ptrat), 2); rb_define_singleton_method(rb_cDFHack, "memory_vector8_insert", RUBY_METHOD_FUNC(rb_dfmemory_vec8_insert), 3); rb_define_singleton_method(rb_cDFHack, "memory_vector8_delete", RUBY_METHOD_FUNC(rb_dfmemory_vec8_delete), 2); rb_define_singleton_method(rb_cDFHack, "memory_vector16_length", RUBY_METHOD_FUNC(rb_dfmemory_vec16_length), 1); - rb_define_singleton_method(rb_cDFHack, "memory_vector16_at", RUBY_METHOD_FUNC(rb_dfmemory_vec16_at), 2); - rb_define_singleton_method(rb_cDFHack, "memory_vector16_set", RUBY_METHOD_FUNC(rb_dfmemory_vec16_set), 3); + rb_define_singleton_method(rb_cDFHack, "memory_vector16_ptrat", RUBY_METHOD_FUNC(rb_dfmemory_vec16_ptrat), 2); rb_define_singleton_method(rb_cDFHack, "memory_vector16_insert", RUBY_METHOD_FUNC(rb_dfmemory_vec16_insert), 3); rb_define_singleton_method(rb_cDFHack, "memory_vector16_delete", RUBY_METHOD_FUNC(rb_dfmemory_vec16_delete), 2); rb_define_singleton_method(rb_cDFHack, "memory_vector32_length", RUBY_METHOD_FUNC(rb_dfmemory_vec32_length), 1); - rb_define_singleton_method(rb_cDFHack, "memory_vector32_at", RUBY_METHOD_FUNC(rb_dfmemory_vec32_at), 2); - rb_define_singleton_method(rb_cDFHack, "memory_vector32_set", RUBY_METHOD_FUNC(rb_dfmemory_vec32_set), 3); + rb_define_singleton_method(rb_cDFHack, "memory_vector32_ptrat", RUBY_METHOD_FUNC(rb_dfmemory_vec32_ptrat), 2); rb_define_singleton_method(rb_cDFHack, "memory_vector32_insert", RUBY_METHOD_FUNC(rb_dfmemory_vec32_insert), 3); rb_define_singleton_method(rb_cDFHack, "memory_vector32_delete", RUBY_METHOD_FUNC(rb_dfmemory_vec32_delete), 2); + rb_define_singleton_method(rb_cDFHack, "memory_vectorbool_length", RUBY_METHOD_FUNC(rb_dfmemory_vecbool_length), 1); + rb_define_singleton_method(rb_cDFHack, "memory_vectorbool_at", RUBY_METHOD_FUNC(rb_dfmemory_vecbool_at), 2); + rb_define_singleton_method(rb_cDFHack, "memory_vectorbool_setat", RUBY_METHOD_FUNC(rb_dfmemory_vecbool_setat), 3); + rb_define_singleton_method(rb_cDFHack, "memory_vectorbool_insert", RUBY_METHOD_FUNC(rb_dfmemory_vecbool_insert), 3); + rb_define_singleton_method(rb_cDFHack, "memory_vectorbool_delete", RUBY_METHOD_FUNC(rb_dfmemory_vecbool_delete), 2); // load the default ruby-level definitions int state=0; diff --git a/plugins/ruby/ruby.rb b/plugins/ruby/ruby.rb index a75404365..380158a42 100644 --- a/plugins/ruby/ruby.rb +++ b/plugins/ruby/ruby.rb @@ -107,5 +107,10 @@ module DFHack end end +# alias, so we can write 'df.world.units.all[0]' +def df + DFHack +end + # load user-specified startup file load 'ruby_custom.rb' if File.exist?('ruby_custom.rb')