# File lib/inline_acceleration.rb, line 217
    def link_type(c_type, reallocate_pointers=false, &block)
      is_simple_type = @@type_map.has_key?(c_type)
      is_pointer = c_type[-1..-1] == '*'
      return nil if is_simple_type
      return Value if !is_pointer
      
      c_inner_type = c_type[0..-2].strip
      class_name = c_inner_type.gsub(' ', '_').capitalize
      klass = "#{@mod.name}::#{class_name}".to_class
      if !klass
        inner_type = Type.new(c_inner_type, nil)
        is_simple_type = @@type_map.has_key?(c_inner_type)
        
        klass = Class.new()
        @mod.const_set(class_name.to_sym, klass)

        line = __LINE__; ruby_code = "include Inline::C::Pointer\n\ndef dereference\n\#{link_type('void *').name}.new(Inline::C.internal_c_functions_module.C_Pointer_dereference_to_pointer(memory_address))\nend\n\nalias_method :throw_method_missing, :method_missing\ndef method_missing(name, *args, &block)\nif name.to_s[0..2] == 'to_'\ntype = name.to_s[3..-1]\nklass = (\"\#{@mod.name}::\" + type.capitalize).to_class\nreturn klass.new(memory_address, ruby_managed)\nend\nthrow_method_missing(name, *args, &block)\nend\n"
        klass.class_eval ruby_code, __FILE__, line + 1
        
        if !inner_type.void?
          create_pointer_from_data_function_name = "#{class_name}_create_pointer_from_data"
          create_pointer_from_pointer_function_name = "#{class_name}_create_pointer_from_pointer"
          get_array_entry_function_name = "#{class_name}_get_array_entry"
        
          #create pointer from data
          c_code = "\#{TRANSFER_TYPE} \#{create_pointer_from_data_function_name}(\#{is_simple_type ? c_inner_type : TRANSFER_TYPE} source) {\n\#{c_type} pointer = (\#{c_type}) malloc(sizeof(\#{c_inner_type}));\nmemcpy(pointer, &source, sizeof(\#{c_inner_type}));\nreturn (\#{TRANSFER_TYPE}) pointer;\n}\n"
          self.c_singleton c_code
          
          #create pointer from pointer
          c_code = "\#{TRANSFER_TYPE} \#{create_pointer_from_pointer_function_name}(\#{TRANSFER_TYPE} source) {\n\#{c_type} pointer = (\#{c_type}) malloc(sizeof(\#{c_inner_type}));\n*pointer = *((\#{c_type}) source);\nreturn (\#{TRANSFER_TYPE}) pointer;\n}\n"
          self.c_singleton c_code
          
          #array delegate
          c_code = "\#{TRANSFER_TYPE} \#{get_array_entry_function_name}(\#{TRANSFER_TYPE} source, long index) {\nreturn (\#{TRANSFER_TYPE}) &((\#{c_type}) source)[index];\n}\n"
          self.c_singleton c_code
          
          line = __LINE__; ruby_code = "@@reallocate_pointers = \#{reallocate_pointers}\ndef self.reallocate_pointers?\n@@reallocate_pointers\nend\n\ndef self.create(source=0)\nif source.is_a? Inline::C::Pointer\nif !@@reallocate_pointers\nsource\nelse\nself.new(\#{@mod.name}.\#{create_pointer_from_pointer_function_name}(source.memory_address), true)\nend\nelse\nself.new(\#{@mod.name}.\#{create_pointer_from_data_function_name}(Inline::C::Value.get_data(source)), true)\nend\nend\n\ndef [](index)\nself.class.new(\#{@mod.name}.\#{get_array_entry_function_name}(self.memory_address, index), self.ruby_managed)\nend\n"
          klass.class_eval ruby_code, __FILE__, line + 1
        end
      end
      
      klass.class_eval(&block) if block
      klass
    end