ext/extconf.rb in google_hash-0.1.1 vs ext/extconf.rb in google_hash-0.2.0

- old
+ new

@@ -1,10 +1,10 @@ require 'mkmf' require 'erb' require 'rubygems' require 'sane' - +puts 'got', xsystem("ls") # build google's lib locally... dir = Dir.pwd Dir.chdir 'sparsehash-1.5.2' do dir = dir + '/local_installed' @@ -21,13 +21,70 @@ $LDFLAGS += " -lstdc++ " end # create our files... # currently we're int only...hmm... -# ltodo 64 bit compat... +# ltodo if I am using longs, this 31 needs to be a 63 on 64 bit machines... +# if I ever use longs :) -for type, setup_code in {'sparse' => nil, 'dense' => 'set_empty_key(1<<31);' } do - template = ERB.new(File.read('template/go.cpp')) - File.write(type.to_s + '.cpp', template.result(binding)) +# my goal is...ruby friendly hashers + +if OS.bits == 32 + unreachable_int = 31 +else + unreachable_int = 63 end + +ruby_key = {:convert_keys_from_ruby => "", :convert_keys_to_ruby => "", :key_type => "VALUE", :unreachable_key => "current_instance"} # TODO NULL is false here? +long_key = {:assert_key_type => 'T_FIXNUM', :convert_keys_from_ruby => "FIX2LONG", + :convert_keys_to_ruby => "LONG2FIX", :key_type => "long", :unreachable_key => "1<<#{unreachable_int}"} +int_key = {:assert_key_type => 'T_FIXNUM', :convert_keys_from_ruby => "FIX2INT", + :convert_keys_to_ruby => "INT2FIX", :key_type => "int", :unreachable_key => "1<<#{unreachable_int}"} + + +ruby_value = {:value_type => "VALUE"} +long_value = {:assert_value_type => 'T_FIXNUM', :convert_values_from_ruby => "FIX2LONG", + :convert_values_to_ruby => "LONG2FIX", :value_type => "long"} + + + +int_to_ruby = long_key.merge(ruby_value) +ruby_to_ruby = ruby_key.merge(ruby_value) + +init_funcs = [] + +for options in [int_to_ruby, ruby_to_ruby] do + for type in ['sparse', 'dense'] do + raise unless options[:value_type] && options[:key_type] + + # create local variables so that the template can look cleaner + unreachable_key = options[:unreachable_key] + convert_keys_from_ruby = options[:convert_keys_from_ruby] + convert_keys_to_ruby = options[:convert_keys_to_ruby] + key_type = options[:key_type] + value_type = options[:value_type] + english_key_type = options[:key_type] == 'VALUE' ? 'ruby' : options[:key_type] + english_value_type = options[:value_type] == 'VALUE' ? 'ruby' : options[:value_type] + + assert_key_type = options[:assert_key_type] + convert_values_from_ruby = options[:convert_values_from_ruby] + convert_values_to_ruby = options[:convert_values_to_ruby] + + + if options[:key_type] == 'VALUE' + extra_hash_params = ", hashrb, eqrb" # use these methods for comparison + # ltodo is that the right hash -- is is type_t + end + + template = ERB.new(File.read('template/google_hash.cpp.erb')) + descriptor = type + '_' + english_key_type + '_to_' + english_value_type; + File.write(descriptor + '.cpp', template.result(binding)) + init_funcs << "init_" + descriptor + end +end + +# write our Init method + +template = ERB.new(File.read('template/main.cpp.erb')) +File.write 'main.cpp', template.result(binding) create_makefile('google_hash')