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