Class: AutoC::Function

Inherits:
Object
  • Object
show all
Includes:
Entity
Defined in:
lib/autoc/function.rb

Overview

Standalone C side function The generated function is meant to be the C89-compliant NOTE: This function does not track parameter and result types as its dependencies This can be done manually by appending to #dependencies property with <<

Direct Known Subclasses

Composite::Method

Defined Under Namespace

Classes: Parameters

Constant Summary

Constants included from Entity

Entity::ReferenceSet

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Entity

#<=>, #complexity, #dependencies, #forward_declarations, #implementation, #interface, #position, #references, #total_dependencies, #total_references

Constructor Details

#initialize(result, name, parameters, inline: false, visibility: :public, constraint: true, variadic: false, abstract: false) ⇒ Function

Returns a new instance of Function.



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/autoc/function.rb', line 92

def initialize(result, name, parameters, inline: false, visibility: :public, constraint: true, variadic: false, abstract: false)
  @name = name.to_s
  @result = result
  @inline = inline
  @visibility = visibility
  @constraint = constraint
  @abstract = abstract
  @variadic = variadic
  @parameters = Parameters.new(self)
  if parameters.is_a?(Hash)
    parameters.each do |name, descriptor|
      x = Parameter.new(descriptor, name)
      @parameters[x.name] = x
    end
  else
    i = -1
    parameters.each do |descriptor|
      x = Parameter.new(descriptor, "_#{i+=1}")
      @parameters[x.name] = x
    end
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args) ⇒ Object

This allows to call other functions with this function’s individual parameters as arguments A call to unknown method results in the method’s name being emitted



169
# File 'lib/autoc/function.rb', line 169

def method_missing(meth, *args) = parameters.has_key?(meth) ? parameters[meth] : meth

Instance Attribute Details

#inline=(value) ⇒ Object (writeonly)

Sets the attribute inline

Parameters:

  • value

    the value to set the attribute inline to.



90
91
92
# File 'lib/autoc/function.rb', line 90

def inline=(value)
  @inline = value
end

#nameObject (readonly)

Returns the value of attribute name.



82
83
84
# File 'lib/autoc/function.rb', line 82

def name
  @name
end

#parametersObject (readonly)

Returns the value of attribute parameters.



86
87
88
# File 'lib/autoc/function.rb', line 86

def parameters
  @parameters
end

#resultObject (readonly)

Returns the value of attribute result.



84
85
86
# File 'lib/autoc/function.rb', line 84

def result
  @result
end

#visibilityObject (readonly)

Returns the value of attribute visibility.



88
89
90
# File 'lib/autoc/function.rb', line 88

def visibility
  @visibility
end

Instance Method Details

#abstract?Boolean

Returns:

  • (Boolean)


137
# File 'lib/autoc/function.rb', line 137

def abstract? = @abstract == true

#call(*arguments) ⇒ Object



151
152
153
154
155
156
157
158
159
160
# File 'lib/autoc/function.rb', line 151

def call(*arguments)
  xs = []
  ps = parameters.to_a
  (0...arguments.size).each do |i|
    a = arguments[i]
    v = a.is_a?(Parameter) ? a.to_value_argument : a
    xs << (i < ps.size ? ps[i].value.(v) : v)
  end
  '%s(%s)' % [name, xs.join(',')]
end

#code(code) ⇒ Object



129
# File 'lib/autoc/function.rb', line 129

def code(code) = @code = code

#configure(&block) ⇒ Object



162
163
164
165
# File 'lib/autoc/function.rb', line 162

def configure(&block)
  instance_eval(&block)
  self
end

#definitionObject



147
# File 'lib/autoc/function.rb', line 147

def definition = '%s {%s}' % [prototype, @code]

#external_code(code) ⇒ Object



120
121
122
123
# File 'lib/autoc/function.rb', line 120

def external_code(code)
  @inline = false
  code(code)
end

#header(header) ⇒ Object



127
# File 'lib/autoc/function.rb', line 127

def header(header) = @header = header

#inline?Boolean

Returns:

  • (Boolean)


133
# File 'lib/autoc/function.rb', line 133

def inline? = @inline == true

#inline_code(code) ⇒ Object



115
116
117
118
# File 'lib/autoc/function.rb', line 115

def inline_code(code)
  @inline = true
  code(code)
end

#inspectObject



131
# File 'lib/autoc/function.rb', line 131

def inspect = "#{prototype} <#{self.class}>"

#live?Boolean

Returns:

  • (Boolean)


141
# File 'lib/autoc/function.rb', line 141

def live? = (@constraint.is_a?(Proc) ? @constraint.() : @constraint) == true

#parameter(name) ⇒ Object



149
# File 'lib/autoc/function.rb', line 149

def parameter(name) = @values[name]

#prototypeObject



145
# File 'lib/autoc/function.rb', line 145

def prototype = '%s %s(%s)' % [result.signature, name, (parameters.to_a.collect(&:declaration) << (variadic? ? '...' : nil)).compact.join(',')]

#public?Boolean

Returns:

  • (Boolean)


135
# File 'lib/autoc/function.rb', line 135

def public? = @visibility == :public

#signatureObject



143
# File 'lib/autoc/function.rb', line 143

def signature = '%s(%s)' % [result.signature, (parameters.to_a.collect(&:signature) << (variadic? ? '...' : nil)).compact.join(',')]

#to_sObject



125
# File 'lib/autoc/function.rb', line 125

def to_s = name

#variadic?Boolean

Returns:

  • (Boolean)


139
# File 'lib/autoc/function.rb', line 139

def variadic? = @variadic == true