class CAS::CLib
Public Class Methods
create(name, &blk)
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 13 def self.create(name, &blk) a = CLib.new(name) a.instance_eval(&blk) return a end
new(name)
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 19 def initialize(name) raise ArgumentError, "Name for the library undefined" unless name.is_a? String @name = name @define = {} @include = {} @include[:std] = [] @include[:local] = [] @type = "double" # Default definitions # self.define "M_PI", Math::PI # self.define "M_INFINITY","HUGE_VAL" # self.define "M_E", Math::E # self.define "M_EPSILON", 1E-16 # Default inclusions self.include "math.h" end
Public Instance Methods
as_double()
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 38 def as_double; @type = "double"; end
as_float()
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 39 def as_float; @type = "float"; end
as_int()
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 40 def as_int; @type = "int"; end
as_long_int()
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 41 def as_long_int; @type = "long int"; end
define(k, v)
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 43 def define(k, v) raise ArgumentError, "k must be a String, received a #{k.class}" unless k.is_a? String @define[k] = v.to_s @define end
header()
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 64 def header <<-TO_HEADER // Header file for library: #{@name}.c #ifndef #{@name}_H #define #{@name}_H // Standard Libraries #{ @include[:std].map { |e| "#include <#{e}>" }.join("\n") } // Local Libraries #{ @include[:local].map { |e| "#include \"#{e}\"" }.join("\n") } // Definitions #{ @define.map { |k, v| "#define #{k} #{v}" }.join("\n") } // Functions #{ self.keys.map do |fname| "#{@type} #{fname}(#{ self[fname].args.map { |x| "#{@type} #{x.name}" }.join(", ")});" end.join("\n") } #endif // #{@name}_H TO_HEADER end
implements_as(name, op)
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 62 def implements_as(name, op); self[name] = op; end
include(lib)
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 59 def include(lib); self.include_type(:std, lib); end
include_local(lib)
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 60 def include_local(lib); self.include_type(:local, lib); end
include_type(type, lib)
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 54 def include_type(type, lib) raise ArgumentError, "type must be a Symbol (:std, :local), received #{type}" unless [:std, :local].include? type raise ArgumentError, "lib must be a String, received a #{lib.class}" unless lib.is_a? String @include[type] << lib unless @include[type].include? lib end
source()
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 91 def source functions = [] self.each do |fname, op| c_op = op.to_c.sort_by { |_k, c| c[:id] } nf = <<-NEWFUNCTION #{@type} #{fname}(#{ op.args.map { |x| "#{@type} #{x.name}" }.join(", ")}) { #{c_op.map { |e| " double #{e[1][:var]} = #{e[1][:def]};"}.join("\n")} return #{c_op[-1][1][:var]}; } NEWFUNCTION functions << nf end <<-TO_SOURCE // Source file for library: #{@name}.c #include "#{@name}.h" #{functions.join("\n")} // end of #{@name}.c TO_SOURCE end
undefine(k)
click to toggle source
# File lib/Mr.CAS/c-opt.rb, line 49 def undefine(k) @define.delete k return @define end